Skip to content

Commit

Permalink
Merge pull request #215 from turnhub/bug/fix-parse-number-function
Browse files Browse the repository at this point in the history
fix(eval): parse_number()
  • Loading branch information
fedme authored Aug 9, 2024
2 parents 53475cd + 9cb0986 commit c84d220
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 10 deletions.
18 changes: 9 additions & 9 deletions lib/expression/eval.ex
Original file line number Diff line number Diff line change
Expand Up @@ -264,15 +264,15 @@ defmodule Expression.Eval do
def parse_number(%{"__value__" => value}), do: parse_number(value)

def parse_number(value) when is_binary(value) do
with {_integer, _rem} <- Integer.parse(value),
{decimal, _rem} <- Decimal.parse(value) do
if Decimal.integer?(decimal) do
Decimal.to_integer(decimal)
else
Decimal.to_float(decimal)
end
else
_error -> value
case Integer.parse(value) do
{integer, ""} ->
integer

_other ->
case Float.parse(value) do
{float, ""} -> float
_error -> value
end
end
end

Expand Down
12 changes: 11 additions & 1 deletion test/expression/eval_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ defmodule Expression.EvalTest do

describe "lambdas" do
test "with map" do
{:ok, ast, "", _, _, _} = Parser.parse("@map(foo, &([&1,'Button']))")
{:ok, ast, "", _, _, _} = Parser.parse("@map(foo, &([&1, 'Button']))")

assert [[1, "Button"], [2, "Button"], [3, "Button"]] ==
Eval.eval!(ast, %{"foo" => [1, 2, 3]})
Expand All @@ -138,6 +138,16 @@ defmodule Expression.EvalTest do
Eval.eval!(ast, %{"foo" => [1, 2, 3]})
end

test "with kernel operators" do
{:ok, ast, "", _, _, _} = Parser.parse("@map(foo, &(&1 == \"1. selected\"))")

assert Eval.eval!(ast, %{"foo" => ["1. selected", "1. selected wrong", "other"]}) == [
true,
false,
false
]
end

test "lambda with joins" do
assert [["one", "Button one"], ["two", "Button two"], ["three", "Button three"]] ==
Expression.evaluate!("@map(choices, &([&1, 'Button ' & &1]))", %{
Expand Down
3 changes: 3 additions & 0 deletions test/expression_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,9 @@ defmodule ExpressionTest do
assert true == Expression.evaluate_as_boolean!("@(\"1\" * 2 == 2)")
assert true == Expression.evaluate_as_boolean!("@(\"0.1\" * 0.2 == 0.020000000000000004)")

assert true == Expression.evaluate_as_boolean!("@(\"1. A\" == x)", %{"x" => "1. A"})
assert false == Expression.evaluate_as_boolean!("@(\"1. A wrong\" == x)", %{"x" => "1. A"})

assert_raise RuntimeError, "expression is not a number: `\"NaN\"`", fn ->
Expression.evaluate_as_boolean!("@(1 * \"NaN\" == 2)")
end
Expand Down

0 comments on commit c84d220

Please sign in to comment.