defmodule Towerops.NumericTest do use ExUnit.Case, async: true alias Towerops.Numeric describe "parse_integer/1" do test "returns {:ok, int} for integer" do assert {:ok, 42} = Numeric.parse_integer(42) assert {:ok, 0} = Numeric.parse_integer(0) assert {:ok, -5} = Numeric.parse_integer(-5) end test "returns {:ok, int} for integer string" do assert {:ok, 42} = Numeric.parse_integer("42") assert {:ok, -5} = Numeric.parse_integer("-5") end test "parses integer from string with trailing non-numeric" do assert {:ok, 42} = Numeric.parse_integer("42abc") end test "returns :error for unparseable string" do assert :error = Numeric.parse_integer("abc") end test "returns :error for empty string" do assert :error = Numeric.parse_integer("") end test "returns :error for null string" do assert :error = Numeric.parse_integer("null") end test "returns :error for non-integer types" do assert :error = Numeric.parse_integer(nil) assert :error = Numeric.parse_integer(:atom) assert :error = Numeric.parse_integer([1, 2, 3]) assert :error = Numeric.parse_integer(%{}) assert :error = Numeric.parse_integer(3.14) end end describe "parse_float/1" do test "returns {:ok, float} for float" do assert {:ok, 4.2} = Numeric.parse_float(4.2) assert {:ok, +0.0} = Numeric.parse_float(0.0) end test "returns {:ok, float} for integer (converted)" do assert {:ok, 42.0} = Numeric.parse_float(42) assert {:ok, +0.0} = Numeric.parse_float(0) end test "returns {:ok, float} for float string" do assert {:ok, 4.2} = Numeric.parse_float("4.2") assert {:ok, -3.14} = Numeric.parse_float("-3.14") end test "returns {:ok, float} for integer string" do assert {:ok, 42.0} = Numeric.parse_float("42") end test "returns :error for unparseable string" do assert :error = Numeric.parse_float("abc") end test "returns :error for empty string" do assert :error = Numeric.parse_float("") end test "returns :error for null string" do assert :error = Numeric.parse_float("null") end test "returns :error for non-numeric types" do assert :error = Numeric.parse_float(nil) assert :error = Numeric.parse_float(:atom) assert :error = Numeric.parse_float([1, 2, 3]) end end end