@@ -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