defmodule AprsmeWeb.Live.Shared.ParamUtilsTest do use ExUnit.Case, async: true use ExUnitProperties alias AprsmeWeb.Live.Shared.ParamUtils describe "parse_float_in_range/4" do test "parses valid float inside range" do assert ParamUtils.parse_float_in_range("30.5", 0.0, -90.0, 90.0) == 30.5 end test "returns default when input is outside range" do assert ParamUtils.parse_float_in_range("200", 0.0, -90.0, 90.0) == 0.0 assert ParamUtils.parse_float_in_range("-200", 0.0, -90.0, 90.0) == 0.0 end test "returns default for unparseable input" do assert ParamUtils.parse_float_in_range("abc", 0.0, -90.0, 90.0) == 0.0 assert ParamUtils.parse_float_in_range("", 0.0, -90.0, 90.0) == 0.0 end test "returns default for non-binary input" do assert ParamUtils.parse_float_in_range(nil, 1.5, -90.0, 90.0) == 1.5 assert ParamUtils.parse_float_in_range(42, 1.5, -90.0, 90.0) == 1.5 end test "accepts negative values in range" do assert ParamUtils.parse_float_in_range("-45.25", 0.0, -90.0, 90.0) == -45.25 end test "accepts values at exact range boundaries" do assert ParamUtils.parse_float_in_range("90.0", 0.0, -90.0, 90.0) == 90.0 assert ParamUtils.parse_float_in_range("-90.0", 0.0, -90.0, 90.0) == -90.0 end test "accepts input with trailing non-numeric characters if still in range" do # This mirrors documented behavior in the implementation. assert ParamUtils.parse_float_in_range("30.5abc", 0.0, -90.0, 90.0) == 30.5 end end describe "parse_int_in_range/4" do test "parses valid integer inside range" do assert ParamUtils.parse_int_in_range("10", 5, 1, 20) == 10 end test "returns default for out-of-range value" do assert ParamUtils.parse_int_in_range("100", 5, 1, 20) == 5 assert ParamUtils.parse_int_in_range("0", 5, 1, 20) == 5 end test "returns default for unparseable value" do assert ParamUtils.parse_int_in_range("foo", 5, 1, 20) == 5 assert ParamUtils.parse_int_in_range(nil, 5, 1, 20) == 5 end test "accepts boundary values" do assert ParamUtils.parse_int_in_range("1", 5, 1, 20) == 1 assert ParamUtils.parse_int_in_range("20", 5, 1, 20) == 20 end end describe "sanitize_numeric_string/1" do test "trims whitespace" do assert ParamUtils.sanitize_numeric_string(" 42 ") == "42" end test "strips non-numeric characters" do assert ParamUtils.sanitize_numeric_string("1