Every concrete subclass of Tombola should pass these tests.
Create and load instance from iterable:
>>> balls = list(range(3)) >>> globe = ConcreteTombola(balls) >>> globe.loaded() True >>> sorted(globe.inspect()) [0, 1, 2]
Pick and collect balls:
>>> picks = [] >>> picks.append(globe.pick()) >>> picks.append(globe.pick()) >>> picks.append(globe.pick())
Check state and results:
>>> globe.loaded() False >>> sorted(picks) == balls True
Reload:
>>> globe.load(balls) >>> globe.loaded() True >>> picks = [globe.pick() for i in balls] >>> globe.loaded() False
Check that LookupError (or a subclass) is the exception thrown when the device is empty:
>>> globe = ConcreteTombola([]) >>> try: ... globe.pick() ... except LookupError as exc: ... print('OK') OK
Load and pick 100 balls to verify that they all come out:
>>> balls = list(range(100)) >>> globe = ConcreteTombola(balls) >>> picks = [] >>> while globe.inspect(): ... picks.append(globe.pick()) >>> len(picks) == len(balls) True >>> set(picks) == set(balls) True
Check that the order has changed and is not simply reversed:
>>> picks != balls True >>> picks[::-1] != balls True
Note: the previous 2 tests have a very small chance of failing even if the implementation is OK. The probability of the 100 balls coming out, by chance, in the order they were inspect is 1/100!, or approximately 1.07e-158. It's much easier to win the Lotto or to become a billionaire working as a programmer.
THE END