Skip to content

Commit dc83a2c

Browse files
committed
Add basic unit tests for random-sized lists
Test feature in basic fashion.
1 parent 9088f77 commit dc83a2c

File tree

1 file changed

+85
-0
lines changed

1 file changed

+85
-0
lines changed

tests/features/rand_list.py

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -322,3 +322,88 @@ def check(self, results):
322322
self.assertEqual(sum, 0, "Sum must be zero but wasn't.")
323323
self.assertEqual(product % 3, 1, "Product mod 3 wasn't 1.")
324324
self.assertTrue(nonzero_seen, "Should not always solve this problem with a list full of zeroes.")
325+
326+
327+
class RandSizeList(testutils.RandObjTestBase):
328+
'''
329+
Test a randomized list, with a random size.
330+
'''
331+
332+
ITERATIONS = 1000
333+
334+
def get_randobj(self, *args):
335+
r = RandObj(*args)
336+
r.add_rand_var('length', bits=4)
337+
def not_7(x):
338+
return x != 7
339+
r.add_rand_var('listvar', bits=5, constraints=[not_7], rand_length='length')
340+
return r
341+
342+
def check(self, results):
343+
nonzero_seen = False
344+
for result in results:
345+
length = result['length']
346+
listvar = result['listvar']
347+
self.assertIn(length, range(16), "Length was incorrectly randomized")
348+
self.assertIsInstance(listvar, list, "Var with length > 0 wasn't a list")
349+
self.assertEqual(len(listvar), length, "Length incorrect")
350+
for x in listvar:
351+
self.assertIn(x, range(32), "Value was wrongly randomized")
352+
self.assertNotEqual(x, 7, "Scalar constraint not respected")
353+
if x != 0:
354+
nonzero_seen = True
355+
self.assertTrue(nonzero_seen, "All values were zero")
356+
357+
358+
class RandSizeListConstrained(RandSizeList):
359+
'''
360+
Test a randomized list, with a random size.
361+
Add constriants between the length and another variable.
362+
'''
363+
364+
ITERATIONS = 1000
365+
366+
def get_randobj(self, *args):
367+
r = super().get_randobj(*args)
368+
r.add_rand_var('length_even', bits=1)
369+
def length_ok(length, length_even):
370+
if length_even:
371+
return length % 2 == 0
372+
else:
373+
return length % 2 == 1
374+
r.add_constraint(length_ok, ('length', 'length_even'))
375+
return r
376+
377+
def check(self, results):
378+
super().check(results)
379+
for result in results:
380+
length = result['length']
381+
length_even = result['length_even']
382+
if length_even:
383+
self.assertEqual(length % 2, 0, "Length was odd, should be even")
384+
else:
385+
self.assertEqual(length % 2, 1, "Length was even, should be odd")
386+
387+
388+
class RandSizeListConstrainedMore(RandSizeListConstrained):
389+
'''
390+
Test a randomized list, with a random size.
391+
Add constriants between the length and other variables,
392+
and the length and the list.
393+
'''
394+
395+
ITERATIONS = 500
396+
397+
def get_randobj(self, *args):
398+
r = super().get_randobj(*args)
399+
def not_in_list(x, listvar):
400+
return x not in listvar
401+
r.add_constraint(not_in_list, ('length', 'listvar'))
402+
return r
403+
404+
def check(self, results):
405+
super().check(results)
406+
for result in results:
407+
length = result['length']
408+
listvar = result['listvar']
409+
self.assertNotIn(length, listvar, "Length should not appear in list")

0 commit comments

Comments
 (0)