@@ -574,18 +574,23 @@ def test_value_validation() -> None:
574574 source_param = Parameter ("source" , set_cmd = None , get_cmd = None )
575575 delegate_param = DelegateParameter ("delegate" , source = source_param )
576576
577+ # Test case where source parameter validator is None and delegate parameter validator is
578+ # specified.
577579 delegate_param .vals = vals .Numbers (- 10 , 10 )
578580 source_param .vals = None
579581 delegate_param .validate (1 )
580582 with pytest .raises (ValueError ):
581583 delegate_param .validate (11 )
582584
585+ # Test where delegate parameter validator is None and source parameter validator is
586+ # specified.
583587 delegate_param .vals = None
584588 source_param .vals = vals .Numbers (- 5 , 5 )
585589 delegate_param .validate (1 )
586590 with pytest .raises (ValueError ):
587591 delegate_param .validate (6 )
588592
593+ # Test case where source parameter validator is more restricted than delegate parameter.
589594 delegate_param .vals = vals .Numbers (- 10 , 10 )
590595 source_param .vals = vals .Numbers (- 5 , 5 )
591596 delegate_param .validate (1 )
@@ -594,6 +599,115 @@ def test_value_validation() -> None:
594599 with pytest .raises (ValueError ):
595600 delegate_param .validate (11 )
596601
602+ # Test case that the order of setting validator on source and delegate parameters does not matter.
603+ source_param .vals = vals .Numbers (- 5 , 5 )
604+ delegate_param .vals = vals .Numbers (- 10 , 10 )
605+ delegate_param .validate (1 )
606+ with pytest .raises (ValueError ):
607+ delegate_param .validate (6 )
608+ with pytest .raises (ValueError ):
609+ delegate_param .validate (11 )
610+
611+ # Test case where delegate parameter validator is more restricted than source parameter.
612+ delegate_param .vals = vals .Numbers (- 5 , 5 )
613+ source_param .vals = vals .Numbers (- 10 , 10 )
614+ delegate_param .validate (1 )
615+ with pytest .raises (ValueError ):
616+ delegate_param .validate (6 )
617+ with pytest .raises (ValueError ):
618+ delegate_param .validate (11 )
619+
620+ # Test case that the order of setting validator on source and delegate parameters does not matter.
621+ source_param .vals = vals .Numbers (- 10 , 10 )
622+ delegate_param .vals = vals .Numbers (- 5 , 5 )
623+ delegate_param .validate (1 )
624+ with pytest .raises (ValueError ):
625+ delegate_param .validate (6 )
626+ with pytest .raises (ValueError ):
627+ delegate_param .validate (11 )
628+
629+
630+ def test_validator_delegates_as_expected () -> None :
631+ source_param = Parameter ("source" , set_cmd = None , get_cmd = None )
632+ delegate_param = DelegateParameter ("delegate" , source = source_param )
633+ some_validator = vals .Numbers (- 10 , 10 )
634+ source_param .vals = some_validator
635+ delegate_param .vals = None
636+ delegate_param .validate (1 )
637+ with pytest .raises (ValueError ):
638+ delegate_param .validate (11 )
639+ assert delegate_param .validators == (some_validator ,)
640+ assert delegate_param .vals == some_validator
641+
642+
643+ def test_validator_delegates_and_source () -> None :
644+ source_param = Parameter ("source" , set_cmd = None , get_cmd = None )
645+ delegate_param = DelegateParameter ("delegate" , source = source_param )
646+ some_validator = vals .Numbers (- 10 , 10 )
647+ some_other_validator = vals .Numbers (- 5 , 5 )
648+ source_param .vals = some_validator
649+ delegate_param .vals = some_other_validator
650+ delegate_param .validate (1 )
651+ with pytest .raises (ValueError ):
652+ delegate_param .validate (6 )
653+ assert delegate_param .validators == (some_other_validator , some_validator )
654+ assert delegate_param .vals == some_other_validator
655+
656+ assert delegate_param .source is not None
657+ delegate_param .source .vals = None
658+
659+ assert delegate_param .validators == (some_other_validator ,)
660+ assert delegate_param .vals == some_other_validator
661+
662+
663+ def test_validator_delegates_and_source_chain () -> None :
664+ source_param = Parameter ("source" , set_cmd = None , get_cmd = None )
665+ delegate_inner = DelegateParameter ("delegate_inner" , source = source_param )
666+ delegate_outer = DelegateParameter ("delegate_outer" , source = delegate_inner )
667+ source_validator = vals .Numbers (- 10 , 10 )
668+ delegate_inner_validator = vals .Numbers (- 7 , 7 )
669+ delegate_outer_validator = vals .Numbers (- 5 , 5 )
670+
671+ source_param .vals = source_validator
672+ delegate_inner .vals = delegate_inner_validator
673+ delegate_outer .vals = delegate_outer_validator
674+
675+ delegate_outer .validate (1 )
676+ with pytest .raises (ValueError ):
677+ delegate_outer .validate (6 )
678+
679+ delegate_inner .validate (6 )
680+ source_param .validate (6 )
681+
682+ assert delegate_outer .validators == (
683+ delegate_outer_validator ,
684+ delegate_inner_validator ,
685+ source_validator ,
686+ )
687+ assert delegate_outer .vals == delegate_outer_validator
688+
689+ assert delegate_inner .validators == (
690+ delegate_inner_validator ,
691+ source_validator ,
692+ )
693+ assert delegate_inner .vals == delegate_inner_validator
694+
695+ assert delegate_outer .source is not None
696+ delegate_outer .source .vals = None
697+
698+ assert delegate_outer .validators == (
699+ delegate_outer_validator ,
700+ source_validator ,
701+ )
702+ assert delegate_outer .vals == delegate_outer_validator
703+
704+ assert isinstance (delegate_outer .source , DelegateParameter )
705+ assert delegate_outer .source .source is not None
706+ delegate_outer .source .source .vals = None
707+
708+ assert delegate_outer .validators == (delegate_outer_validator ,)
709+ assert delegate_outer .vals == delegate_outer_validator
710+
597711
598712def test_value_validation_with_offset_and_scale () -> None :
599713 source_param = Parameter (
0 commit comments