diff --git a/tests/test_quant_selector.py b/tests/test_quant_selector.py index 5447d14..b976252 100644 --- a/tests/test_quant_selector.py +++ b/tests/test_quant_selector.py @@ -20,9 +20,35 @@ from evolution.quant_selector import ( class TestQuantLevels: def test_levels_ordered_by_quality(self): - """Levels should be ordered from best quality to most aggressive.""" - for i in range(len(QUANT_LEVELS) - 1): - assert QUANT_LEVELS[i].bits_per_channel > QUANT_LEVELS[i + 1].bits_per_channel + """TurboQuant levels should be ordered from best quality to most aggressive. + + The quality ordering invariant for TurboQuant levels is monotonically + increasing compression_ratio (more aggressive = more compression). + Non-TurboQuant fallbacks (e.g. q4_0) are placed after all TurboQuant + levels and may have any compression ratio — they exist as safe defaults, + not as part of the quality progression. + """ + turbo_quant_names = {"turbo4", "turbo3", "turbo2"} + turbo_levels = [l for l in QUANT_LEVELS if l.name in turbo_quant_names] + for i in range(len(turbo_levels) - 1): + assert turbo_levels[i].compression_ratio <= turbo_levels[i + 1].compression_ratio, ( + f"TurboQuant {turbo_levels[i].name} (compression={turbo_levels[i].compression_ratio}x) " + f"should have <= compression than {turbo_levels[i+1].name} " + f"(compression={turbo_levels[i+1].compression_ratio}x)" + ) + + def test_fallback_quant_is_last(self): + """Non-TurboQuant fallbacks (e.g. q4_0) should be at the end of the list.""" + turbo_quant_names = {"turbo4", "turbo3", "turbo2"} + found_fallback = False + for level in QUANT_LEVELS: + if level.name not in turbo_quant_names: + found_fallback = True + elif found_fallback: + pytest.fail( + f"TurboQuant level '{level.name}' appears after a fallback level. " + f"All TurboQuant levels must precede fallbacks." + ) def test_all_levels_have_required_fields(self): for level in QUANT_LEVELS: