@@ -504,6 +504,22 @@ def test_repr(self):
504504 assert (("<in_ validator with options [3, 4, 5]>" )) == repr (v )
505505
506506
507+ @pytest .fixture (
508+ name = "member_validator" ,
509+ params = (
510+ instance_of (int ),
511+ [always_pass , instance_of (int )],
512+ (always_pass , instance_of (int )),
513+ ),
514+ scope = "module" ,
515+ )
516+ def _member_validator (request ):
517+ """
518+ Provides sample `member_validator`s for some tests in `TestDeepIterable`
519+ """
520+ return request .param
521+
522+
507523class TestDeepIterable (object ):
508524 """
509525 Tests for `deep_iterable`.
@@ -515,21 +531,19 @@ def test_in_all(self):
515531 """
516532 assert deep_iterable .__name__ in validator_module .__all__
517533
518- def test_success_member_only (self ):
534+ def test_success_member_only (self , member_validator ):
519535 """
520536 If the member validator succeeds and the iterable validator is not set,
521537 nothing happens.
522538 """
523- member_validator = instance_of (int )
524539 v = deep_iterable (member_validator )
525540 a = simple_attr ("test" )
526541 v (None , a , [42 ])
527542
528- def test_success_member_and_iterable (self ):
543+ def test_success_member_and_iterable (self , member_validator ):
529544 """
530545 If both the member and iterable validators succeed, nothing happens.
531546 """
532- member_validator = instance_of (int )
533547 iterable_validator = instance_of (list )
534548 v = deep_iterable (member_validator , iterable_validator )
535549 a = simple_attr ("test" )
@@ -542,6 +556,8 @@ def test_success_member_and_iterable(self):
542556 (42 , instance_of (list )),
543557 (42 , 42 ),
544558 (42 , None ),
559+ ([instance_of (int ), 42 ], 42 ),
560+ ([42 , instance_of (int )], 42 ),
545561 ),
546562 )
547563 def test_noncallable_validators (
@@ -562,17 +578,16 @@ def test_noncallable_validators(
562578 assert message in e .value .msg
563579 assert value == e .value .value
564580
565- def test_fail_invalid_member (self ):
581+ def test_fail_invalid_member (self , member_validator ):
566582 """
567583 Raise member validator error if an invalid member is found.
568584 """
569- member_validator = instance_of (int )
570585 v = deep_iterable (member_validator )
571586 a = simple_attr ("test" )
572587 with pytest .raises (TypeError ):
573588 v (None , a , [42 , "42" ])
574589
575- def test_fail_invalid_iterable (self ):
590+ def test_fail_invalid_iterable (self , member_validator ):
576591 """
577592 Raise iterable validator error if an invalid iterable is found.
578593 """
@@ -583,12 +598,11 @@ def test_fail_invalid_iterable(self):
583598 with pytest .raises (TypeError ):
584599 v (None , a , [42 ])
585600
586- def test_fail_invalid_member_and_iterable (self ):
601+ def test_fail_invalid_member_and_iterable (self , member_validator ):
587602 """
588603 Raise iterable validator error if both the iterable
589604 and a member are invalid.
590605 """
591- member_validator = instance_of (int )
592606 iterable_validator = instance_of (tuple )
593607 v = deep_iterable (member_validator , iterable_validator )
594608 a = simple_attr ("test" )
@@ -608,7 +622,24 @@ def test_repr_member_only(self):
608622 expected_repr = (
609623 "<deep_iterable validator for iterables of {member_repr}>"
610624 ).format (member_repr = member_repr )
611- assert ((expected_repr )) == repr (v )
625+ assert expected_repr == repr (v )
626+
627+ def test_repr_member_only_sequence (self ):
628+ """
629+ Returned validator has a useful `__repr__`
630+ when only member validator is set and the member validator is a list of
631+ validators
632+ """
633+ member_validator = [always_pass , instance_of (int )]
634+ member_repr = (
635+ "_AndValidator(_validators=({func}, "
636+ "<instance_of validator for type <{type} 'int'>>))"
637+ ).format (func = repr (always_pass ), type = TYPE )
638+ v = deep_iterable (member_validator )
639+ expected_repr = (
640+ "<deep_iterable validator for iterables of {member_repr}>"
641+ ).format (member_repr = member_repr )
642+ assert expected_repr == repr (v )
612643
613644 def test_repr_member_and_iterable (self ):
614645 """
@@ -630,6 +661,29 @@ def test_repr_member_and_iterable(self):
630661 ).format (iterable_repr = iterable_repr , member_repr = member_repr )
631662 assert expected_repr == repr (v )
632663
664+ def test_repr_sequence_member_and_iterable (self ):
665+ """
666+ Returned validator has a useful `__repr__` when both member
667+ and iterable validators are set and the member validator is a list of
668+ validators
669+ """
670+ member_validator = [always_pass , instance_of (int )]
671+ member_repr = (
672+ "_AndValidator(_validators=({func}, "
673+ "<instance_of validator for type <{type} 'int'>>))"
674+ ).format (func = repr (always_pass ), type = TYPE )
675+ iterable_validator = instance_of (list )
676+ iterable_repr = (
677+ "<instance_of validator for type <{type} 'list'>>"
678+ ).format (type = TYPE )
679+ v = deep_iterable (member_validator , iterable_validator )
680+ expected_repr = (
681+ "<deep_iterable validator for"
682+ " {iterable_repr} iterables of {member_repr}>"
683+ ).format (iterable_repr = iterable_repr , member_repr = member_repr )
684+
685+ assert expected_repr == repr (v )
686+
633687
634688class TestDeepMapping (object ):
635689 """
@@ -804,7 +858,7 @@ def test_hashability():
804858
805859class TestLtLeGeGt :
806860 """
807- Tests for `max_len `.
861+ Tests for `Lt, Le, Ge, Gt `.
808862 """
809863
810864 BOUND = 4
0 commit comments