#!/usr/bin/env python3
"""Tests for Story 3.03 (Track B): OutputValidator"""
import sys
sys.path.insert(0, '/mnt/e/genesis-system')


def test_output_validator():
    from core.mvfl.output_validator import OutputValidator, ValidationResult, DEFAULT_SWARM_OUTPUT_SCHEMA

    validator = OutputValidator()

    # BB1: Missing required field
    result = validator.validate({"status": "ok"})
    assert result.valid == False
    assert any("task_id" in e for e in result.errors), f"Expected task_id error, got: {result.errors}"

    # BB2: Wrong type
    schema = {"count": {"type": "int", "required": True}}
    result = validator.validate({"count": "not_an_int"}, schema)
    assert result.valid == False
    assert any("expected int" in e and "got str" in e for e in result.errors), \
        f"Expected type mismatch error, got: {result.errors}"

    # BB3: Valid output
    result = validator.validate({"task_id": "abc", "status": "completed"})
    assert result.valid == True
    assert result.errors == []

    # BB4: Empty string for required string field
    schema = {"name": {"type": "str", "required": True}}
    result = validator.validate({"name": "  "}, schema)
    assert result.valid == False
    assert any("Empty string" in e for e in result.errors), \
        f"Expected empty string error, got: {result.errors}"

    # WB1: All errors collected (not fail-fast)
    schema = {
        "field1": {"type": "str", "required": True},
        "field2": {"type": "int", "required": True},
        "field3": {"type": "str", "required": True},
    }
    result = validator.validate({}, schema)
    assert len(result.errors) == 3, f"Expected 3 errors, got {len(result.errors)}: {result.errors}"

    # WB2: DEFAULT_SWARM_OUTPUT_SCHEMA has task_id and status
    assert "task_id" in DEFAULT_SWARM_OUTPUT_SCHEMA
    assert "status" in DEFAULT_SWARM_OUTPUT_SCHEMA
    assert DEFAULT_SWARM_OUTPUT_SCHEMA["task_id"]["required"] == True
    assert DEFAULT_SWARM_OUTPUT_SCHEMA["status"]["required"] == True

    # WB3: Optional field missing is OK
    schema = {"optional": {"type": "str", "required": False}}
    result = validator.validate({}, schema)
    assert result.valid == True

    # WB4: int accepted as float
    schema = {"value": {"type": "float", "required": True}}
    result = validator.validate({"value": 42}, schema)
    assert result.valid == True

    print("ALL TESTS PASSED — Story 3.03 (Track B)")


if __name__ == "__main__":
    test_output_validator()
