'api.example.test','utm'=>['theme'=>['default'=>'dark','weights'=>['dark'=>3]],'chb'=>['default'=>'a','weights'=>['a'=>1]]]]; $normalized = prelandNormalizeConsConfig($fixture); $expect(!isset($normalized['utm']['chb']), 'Старый chb должен быть удалён из runtime-копии конфига.'); $expect($normalized['host'] === $fixture['host'] && $normalized['utm']['theme'] === $fixture['utm']['theme'], 'Соседние поля должны сохраняться.'); $expect($fixture['utm']['chb']['default'] === 'a', 'Нормализация не должна менять исходный массив.'); $settings = $normalized['utm']['cons']; $expect(prelandResolveCons(null, $settings) === '2', 'Отсутствующее значение должно получить default2.'); foreach (['1','2','3','99'] as $value) $expect(prelandResolveCons($value, $settings) === $value, 'Concrete cons должен приниматься независимо от весов: '.$value); foreach (['0','-1','a','1x','',[],['1']] as $value) $expect(prelandResolveCons($value, $settings) === '2', 'Неверное значение должно получить default2.'); for ($i=0; $i<1000; $i++) $expect(prelandResolveCons('rnd', $settings) === '1', 'rnd обязан выбрать только группу1.'); $settings = ['default'=>'2','weights'=>['2'=>0,'1'=>100]]; for ($i=0; $i<1000; $i++) $expect(prelandResolveCons('rnd', $settings) === '1', 'Нулевой вес не должен случайно попасть в выборку.'); $query = prelandNormalizeConsQuery(['chb'=>'a','cons'=>'3','utm_source'=>'ad','subid'=>'42'], $settings); $expect($query === ['cons'=>'3','utm_source'=>'ad','subid'=>'42'], 'Query должен удалить только chb и нормализовать cons.'); $query = prelandNormalizeConsQuery(['chb'=>['b'],'utm_source'=>'ad'], $settings); $expect(!isset($query['chb']) && $query['cons'] === '2' && $query['utm_source'] === 'ad', 'Array legacy chb не должен влиять на fallback.'); echo "PASS: cons resolver {$checks} checks\n";