"""Ручные конверсии/диапазоны (ConversionSet) без HA-рантайма.""" from __future__ import annotations from custom_components.fglair.overrides import ConversionSet, LinearOverride from pyfglair import Prop, Template def test_identity_keeps_api_units(): conversions = ConversionSet(Template.A, {}, 5) assert conversions.to_display(Prop.DISPLAY_TEMPERATURE, 200) == 200 assert conversions.to_display(Prop.ADJUST_TEMPERATURE, 220) == 220 assert conversions.from_display(Prop.ADJUST_TEMPERATURE, 220) == 220 assert conversions.temperature_range() == (160, 300) def test_linear_override_roundtrip_and_clamp(): override = LinearOverride( num=1, den=1, offset=5, min_value=170, max_value=280 ) conversions = ConversionSet( Template.A, {Prop.ADJUST_TEMPERATURE: override}, 5 ) assert conversions.to_display(Prop.ADJUST_TEMPERATURE, 220) == 225 assert conversions.from_display(Prop.ADJUST_TEMPERATURE, 225) == 220 assert conversions.clamp(Prop.ADJUST_TEMPERATURE, 100) == 170 assert conversions.clamp(Prop.ADJUST_TEMPERATURE, 999) == 280 assert conversions.temperature_range() == (170, 280) def test_linear_override_scaled(): override = LinearOverride(num=2, den=4, offset=0) conversions = ConversionSet( Template.A, {Prop.ADJUST_TEMPERATURE: override}, 5 ) assert conversions.to_display(Prop.ADJUST_TEMPERATURE, 200) == 100 assert conversions.from_display(Prop.ADJUST_TEMPERATURE, 100) == 200 def test_scaled_override_clamped_to_table(): """display = raw/2: таблица A -100..450 → достижимо -50..225.""" override = LinearOverride( num=1, den=2, offset=0, min_value=160, max_value=300 ) conversions = ConversionSet( Template.A, {Prop.ADJUST_TEMPERATURE: override}, 5 ) assert conversions.temperature_range() == (160, 225) assert conversions.clamp(Prop.ADJUST_TEMPERATURE, 250) == 225 assert conversions.from_display(Prop.ADJUST_TEMPERATURE, 250) == 450 assert conversions.from_display(Prop.ADJUST_TEMPERATURE, 225) == 450 def test_from_entry_parses_spec(): conversions = ConversionSet.from_entry( { "template": "B", "temp_step": 10, "overrides": { "adjust_temperature": { "num": 2, "den": 4, "offset": 5, "min": 170, "max": 280, } }, } ) assert conversions.template == Template.B assert conversions.step_tenths == 10 # display = raw/2 + 5: таблица -100..450 → -45..230, override 170..280 # → достижимо 170..230. assert conversions.temperature_range() == (170, 230) override = conversions.override(Prop.ADJUST_TEMPERATURE) assert (override.num, override.den, override.offset) == (2, 4, 5) assert conversions.override(Prop.FAN_SPEED).identity def test_from_entry_defaults(): conversions = ConversionSet.from_entry({"template": "F"}) assert conversions.step_tenths == 5 assert conversions.temperature_range() == (160, 300)