okami.mom/albedo
git clone https://git.nkp.pet/okami.mom/albedo
4ad84fd
main
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 ): 16return {x for a ,b in intervals for x in range (a ,b )} 17 18 19def canonical (values ): 20out = [] 21for value in sorted (values ): 22if out and out [- 1 ][1 ]== value : 23out [- 1 ]= (out [- 1 ][0 ],value + 1 ) 24else : 25out .append ((value ,value + 1 )) 26return out 27 28 29class IndependentTests (unittest .TestCase ): 30def test_boundaries (self ): 31self .assertEqual ( 32m .normalize ([(5 ,5 ), (2 ,4 ), (0 ,2 ), (1 ,3 ), (0 ,2 )]), [(0 ,4 )] 33 ) 34self .assertEqual (m .intersection ([(0 ,2 )], [(2 ,4 )]), []) 35self .assertEqual ( 36m .difference ([(0 ,10 )], [(2 ,4 ), (6 ,8 )]), [(0 ,2 ), (4 ,6 ), (8 ,10 )] 37 ) 38self .assertEqual (m .difference ([(0 ,10 )], [(- 1 ,11 )]), []) 39self .assertEqual (m .union ([], []), []) 40 41def test_huge_endpoints (self ): 42h = 10 ** 100 43self .assertEqual (m .union ([(- h ,0 )], [(0 ,h )]), [(- h ,h )]) 44self .assertEqual (m .difference ([(- h ,h )], [(- 1 ,1 )]), [(- h ,- 1 ), (1 ,h )]) 45self .assertEqual (m .intersection ([(- h ,h )], [(h - 1 ,h + 1 )]), [(h - 1 ,h )]) 46 47def test_reversed_rejected (self ): 48with self .assertRaises (ValueError ): 49m .normalize ([(2 ,1 )]) 50for fn in (m .union ,m .intersection ,m .difference ): 51with self .assertRaises (ValueError ): 52fn ([], [(2 ,1 )]) 53with self .assertRaises (ValueError ): 54fn ([(2 ,1 )], []) 55 56def test_inputs_not_mutated (self ): 57a = [(3 ,5 ), (0 ,2 ), (1 ,4 )] 58b = [(2 ,3 ), (7 ,8 )] 59for fn in (m .union ,m .intersection ,m .difference ): 60fn (a ,b ) 61self .assertEqual (a , [(3 ,5 ), (0 ,2 ), (1 ,4 )]) 62self .assertEqual (b , [(2 ,3 ), (7 ,8 )]) 63m .normalize (a ) 64self .assertEqual (a , [(3 ,5 ), (0 ,2 ), (1 ,4 )]) 65 66def test_2000_random_pairs_and_generators (self ): 67rng = random .Random (947120 ) 68for _ in range (2000 ): 69a = [ 70tuple (sorted ((rng .randrange (- 20 ,21 ),rng .randrange (- 20 ,21 )))) 71for _ in range (rng .randrange (15 )) 72 ] 73b = [ 74tuple (sorted ((rng .randrange (- 20 ,21 ),rng .randrange (- 20 ,21 )))) 75for _ in range (rng .randrange (15 )) 76 ] 77pa ,pb = points (a ),points (b ) 78self .assertEqual (m .normalize (iter (a )),canonical (pa )) 79for fn ,expected in [ 80 (m .union ,pa | pb ), 81 (m .intersection ,pa & pb ), 82 (m .difference ,pa - pb ), 83 ]: 84self .assertEqual (fn (iter (a ),iter (b )),canonical (expected )) 85 86 87unittest .main (verbosity = 2 )