@@ -101,7 +101,14 @@ def test_eval_hash_matches_free_function(self):
101101class TestCompositeEvaluationOrder :
102102 @pytest .mark .parametrize (
103103 "aggregator" ,
104- [TrueFalseScoreAggregator .OR , TrueFalseScoreAggregator .AND , TrueFalseScoreAggregator .MAJORITY ],
104+ [
105+ TrueFalseScoreAggregator .OR ,
106+ TrueFalseScoreAggregator .AND ,
107+ TrueFalseScoreAggregator .MAJORITY ,
108+ TrueFalseScoreAggregator .OR_RAISE_ON_EMPTY ,
109+ TrueFalseScoreAggregator .AND_RAISE_ON_EMPTY ,
110+ TrueFalseScoreAggregator .MAJORITY_RAISE_ON_EMPTY ,
111+ ],
105112 )
106113 def test_permutations_preserve_eval_identity_and_content_order (self , aggregator : TrueFalseAggregatorFunc ) -> None :
107114 children = [SubStringScorer (substring = value ) for value in ("a" , "b" , "c" )]
@@ -120,15 +127,25 @@ def test_permutations_preserve_eval_identity_and_content_order(self, aggregator:
120127 assert restored .hash == identifier .hash
121128 assert ScorerEvaluationIdentifier (restored ).eval_hash == identifier .eval_hash
122129
123- def test_nested_permutations_preserve_eval_identity (self ) -> None :
130+ @pytest .mark .parametrize (
131+ "outer_aggregator, inner_aggregator" ,
132+ [
133+ (TrueFalseScoreAggregator .OR , TrueFalseScoreAggregator .AND ),
134+ (TrueFalseScoreAggregator .OR_RAISE_ON_EMPTY , TrueFalseScoreAggregator .AND_RAISE_ON_EMPTY ),
135+ (TrueFalseScoreAggregator .MAJORITY_RAISE_ON_EMPTY , TrueFalseScoreAggregator .OR_RAISE_ON_EMPTY ),
136+ ],
137+ )
138+ def test_nested_permutations_preserve_eval_identity (
139+ self , * , outer_aggregator : TrueFalseAggregatorFunc , inner_aggregator : TrueFalseAggregatorFunc
140+ ) -> None :
124141 a , b , c = [SubStringScorer (substring = value ) for value in ("a" , "b" , "c" )]
125142 first = TrueFalseCompositeScorer (
126- aggregator = TrueFalseScoreAggregator . OR ,
127- scorers = [TrueFalseCompositeScorer (aggregator = TrueFalseScoreAggregator . AND , scorers = [a , b ]), c ],
143+ aggregator = outer_aggregator ,
144+ scorers = [TrueFalseCompositeScorer (aggregator = inner_aggregator , scorers = [a , b ]), c ],
128145 )
129146 second = TrueFalseCompositeScorer (
130- aggregator = TrueFalseScoreAggregator . OR ,
131- scorers = [c , TrueFalseCompositeScorer (aggregator = TrueFalseScoreAggregator . AND , scorers = [b , a ])],
147+ aggregator = outer_aggregator ,
148+ scorers = [c , TrueFalseCompositeScorer (aggregator = inner_aggregator , scorers = [b , a ])],
132149 )
133150 assert first .get_identifier ().eval_hash == second .get_identifier ().eval_hash
134151 assert first .get_identifier ().hash != second .get_identifier ().hash
@@ -142,22 +159,39 @@ def test_configuration_aggregator_and_multiplicity_remain_distinct(self) -> None
142159 (TrueFalseScoreAggregator .MAJORITY , [a , b ]),
143160 (TrueFalseScoreAggregator .MAJORITY , [a , a , b ]),
144161 (TrueFalseScoreAggregator .MAJORITY , [a , b , b ]),
162+ (TrueFalseScoreAggregator .OR_RAISE_ON_EMPTY , [a , b ]),
163+ (TrueFalseScoreAggregator .OR_RAISE_ON_EMPTY , [a , c ]),
164+ (TrueFalseScoreAggregator .AND_RAISE_ON_EMPTY , [a , b ]),
165+ (TrueFalseScoreAggregator .MAJORITY_RAISE_ON_EMPTY , [a , b ]),
166+ (TrueFalseScoreAggregator .MAJORITY_RAISE_ON_EMPTY , [a , a , b ]),
167+ (TrueFalseScoreAggregator .MAJORITY_RAISE_ON_EMPTY , [a , b , b ]),
145168 ]
146169 hashes = {
147170 TrueFalseCompositeScorer (aggregator = aggregator , scorers = scorers ).get_identifier ().eval_hash
148171 for aggregator , scorers in configurations
149172 }
150173 assert len (hashes ) == len (configurations )
151174
152- def test_custom_aggregator_with_builtin_name_remains_ordered (self ) -> None :
175+ @pytest .mark .parametrize (
176+ "aggregator" ,
177+ [
178+ TrueFalseScoreAggregator .OR ,
179+ TrueFalseScoreAggregator .AND ,
180+ TrueFalseScoreAggregator .MAJORITY ,
181+ TrueFalseScoreAggregator .OR_RAISE_ON_EMPTY ,
182+ TrueFalseScoreAggregator .AND_RAISE_ON_EMPTY ,
183+ TrueFalseScoreAggregator .MAJORITY_RAISE_ON_EMPTY ,
184+ ],
185+ )
186+ def test_custom_aggregator_with_builtin_name_remains_ordered (self , aggregator : TrueFalseAggregatorFunc ) -> None :
153187 def first_score (scores : Iterable [Score ]) -> ScoreAggregatorResult :
154188 return TrueFalseScoreAggregator .OR ([next (iter (scores ))])
155189
156- first_score .__name__ = TrueFalseScoreAggregator . OR .__name__
190+ first_score .__name__ = aggregator .__name__
157191 a , b = [SubStringScorer (substring = value ) for value in ("a" , "b" )]
158192 first = TrueFalseCompositeScorer (aggregator = first_score , scorers = [a , b ]).get_identifier ()
159193 second = TrueFalseCompositeScorer (aggregator = first_score , scorers = [b , a ]).get_identifier ()
160- builtin = TrueFalseCompositeScorer (aggregator = TrueFalseScoreAggregator . OR , scorers = [a , b ]).get_identifier ()
194+ builtin = TrueFalseCompositeScorer (aggregator = aggregator , scorers = [a , b ]).get_identifier ()
161195
162196 assert "sub_scorers_order_independent" not in first .params
163197 assert first .eval_hash != second .eval_hash
0 commit comments