@@ -62,12 +62,32 @@ protected LinearRetrieverBuilder createTestInstance() {
6262        List <CompoundRetrieverBuilder .RetrieverSource > innerRetrievers  = new  ArrayList <>();
6363        float [] weights  = new  float [num ];
6464        ScoreNormalizer [] normalizers  = new  ScoreNormalizer [num ];
65-         for  (int  i  = 0 ; i  < num ; i ++) {
66-             innerRetrievers .add (
67-                 new  CompoundRetrieverBuilder .RetrieverSource (TestRetrieverBuilder .createRandomTestRetrieverBuilder (), null )
68-             );
69-             weights [i ] = randomFloat ();
70-             normalizers [i ] = randomScoreNormalizer ();
65+         // Create normalizer combinations that follow the API design rules 
66+         if  (normalizer  != null ) {
67+             // When top-level normalizer is specified, per-retriever normalizers must either: 
68+             // 1. Be null/default (will be propagated), or 
69+             // 2. Exactly match the top-level normalizer 
70+             boolean  useMatchingNormalizers  = randomBoolean ();
71+             for  (int  i  = 0 ; i  < num ; i ++) {
72+                 innerRetrievers .add (
73+                     new  CompoundRetrieverBuilder .RetrieverSource (TestRetrieverBuilder .createRandomTestRetrieverBuilder (), null )
74+                 );
75+                 weights [i ] = randomFloat ();
76+                 if  (useMatchingNormalizers ) {
77+                     normalizers [i ] = normalizer ; // Exactly match top-level 
78+                 } else  {
79+                     normalizers [i ] = randomBoolean () ? null  : IdentityScoreNormalizer .INSTANCE ; // Will be propagated 
80+                 }
81+             }
82+         } else  {
83+             // No top-level normalizer: per-retriever normalizers can be anything 
84+             for  (int  i  = 0 ; i  < num ; i ++) {
85+                 innerRetrievers .add (
86+                     new  CompoundRetrieverBuilder .RetrieverSource (TestRetrieverBuilder .createRandomTestRetrieverBuilder (), null )
87+                 );
88+                 weights [i ] = randomFloat ();
89+                 normalizers [i ] = randomScoreNormalizer ();
90+             }
7191        }
7292
7393        return  new  LinearRetrieverBuilder (innerRetrievers , fields , query , normalizer , rankWindowSize , weights , normalizers );
0 commit comments