import unittest
from observe import aligned_reuse, fixtures, parse_stats, SIZE

class Controls(unittest.TestCase):
    def test_fixture_edits(self):
        basis, cases = fixtures()
        self.assertEqual(len(basis), SIZE)
        self.assertEqual(cases["prefix-insert"][1:], basis)
        self.assertEqual(len(cases), 6)
        self.assertEqual(len(cases["middle-delete"]), SIZE - 1)
        self.assertEqual(sum(a != b for a, b in zip(basis, cases["middle-replace"])), 1)

    def test_alignment_control(self):
        self.assertEqual(aligned_reuse(b"ABCDEFGHIJKL", b"xABCDEFGHIJKL", 4), 0)
        self.assertEqual(aligned_reuse(b"ABCDEFGHIJKL", b"xxxxABCDEFGHIJKL", 4), 12)
        self.assertEqual(aligned_reuse(b"AAAA", b"AAAAA", 2), 4)

    def test_parser_requires_all_fields(self):
        with self.assertRaises(ValueError):
            parse_stats("Literal data: 1 bytes\n")
        lines = ["Literal data: 1 bytes", "Matched data: 1,024 bytes",
                 "Total transferred file size: 1,025 bytes", "Total bytes sent: 150",
                 "Total bytes received: 51"]
        self.assertEqual(parse_stats("\n".join(lines))["matchedBytes"], 1024)

if __name__ == "__main__":
    unittest.main()
