okami.mom/albedo

git clone https://git.nkp.pet/okami.mom/albedo

Aly Raffauffix(python): enforce ruff and ty checks4ad84fd

main
2.9 KiB87 linesraw
1import importlib.util
2import random
3import sys
4import unittest
5from pathlib import Path
6
7spec = importlib.util.spec_from_file_location(
8    "candidate", Path(sys.argv.pop(1)) / "interval_set.py"
9)
10assert spec is not None and spec.loader is not None
11m = importlib.util.module_from_spec(spec)
12spec.loader.exec_module(m)
13
14
15def points(intervals):
16    return {x for a, b in intervals for x in range(a, b)}
17
18
19def canonical(values):
20    out = []
21    for value in sorted(values):
22        if out and out[-1][1] == value:
23            out[-1] = (out[-1][0], value + 1)
24        else:
25            out.append((value, value + 1))
26    return out
27
28
29class IndependentTests(unittest.TestCase):
30    def test_boundaries(self):
31        self.assertEqual(
32            m.normalize([(5, 5), (2, 4), (0, 2), (1, 3), (0, 2)]), [(0, 4)]
33        )
34        self.assertEqual(m.intersection([(0, 2)], [(2, 4)]), [])
35        self.assertEqual(
36            m.difference([(0, 10)], [(2, 4), (6, 8)]), [(0, 2), (4, 6), (8, 10)]
37        )
38        self.assertEqual(m.difference([(0, 10)], [(-1, 11)]), [])
39        self.assertEqual(m.union([], []), [])
40
41    def test_huge_endpoints(self):
42        h = 10**100
43        self.assertEqual(m.union([(-h, 0)], [(0, h)]), [(-h, h)])
44        self.assertEqual(m.difference([(-h, h)], [(-1, 1)]), [(-h, -1), (1, h)])
45        self.assertEqual(m.intersection([(-h, h)], [(h - 1, h + 1)]), [(h - 1, h)])
46
47    def test_reversed_rejected(self):
48        with self.assertRaises(ValueError):
49            m.normalize([(2, 1)])
50        for fn in (m.union, m.intersection, m.difference):
51            with self.assertRaises(ValueError):
52                fn([], [(2, 1)])
53            with self.assertRaises(ValueError):
54                fn([(2, 1)], [])
55
56    def test_inputs_not_mutated(self):
57        a = [(3, 5), (0, 2), (1, 4)]
58        b = [(2, 3), (7, 8)]
59        for fn in (m.union, m.intersection, m.difference):
60            fn(a, b)
61            self.assertEqual(a, [(3, 5), (0, 2), (1, 4)])
62            self.assertEqual(b, [(2, 3), (7, 8)])
63        m.normalize(a)
64        self.assertEqual(a, [(3, 5), (0, 2), (1, 4)])
65
66    def test_2000_random_pairs_and_generators(self):
67        rng = random.Random(947120)
68        for _ in range(2000):
69            a = [
70                tuple(sorted((rng.randrange(-20, 21), rng.randrange(-20, 21))))
71                for _ in range(rng.randrange(15))
72            ]
73            b = [
74                tuple(sorted((rng.randrange(-20, 21), rng.randrange(-20, 21))))
75                for _ in range(rng.randrange(15))
76            ]
77            pa, pb = points(a), points(b)
78            self.assertEqual(m.normalize(iter(a)), canonical(pa))
79            for fn, expected in [
80                (m.union, pa | pb),
81                (m.intersection, pa & pb),
82                (m.difference, pa - pb),
83            ]:
84                self.assertEqual(fn(iter(a), iter(b)), canonical(expected))
85
86
87unittest.main(verbosity=2)