summaryrefslogtreecommitdiff
path: root/elixir/ast_test.exs
diff options
context:
space:
mode:
Diffstat (limited to 'elixir/ast_test.exs')
-rw-r--r--elixir/ast_test.exs70
1 files changed, 70 insertions, 0 deletions
diff --git a/elixir/ast_test.exs b/elixir/ast_test.exs
new file mode 100644
index 0000000..b10c959
--- /dev/null
+++ b/elixir/ast_test.exs
@@ -0,0 +1,70 @@
+defmodule AstTest do
+ use ExUnit.Case
+
+ test "pprint/1" do
+ assert Ast.pprint(Ast.var("x")) == "x"
+ assert Ast.pprint(Ast.abs("x", Ast.var("x"))) == "(λ x . x)"
+ assert Ast.pprint(Ast.app(Ast.var("x"), Ast.var("y"))) == "x y"
+ end
+
+ test "pprint with if expression lambda calculus" do
+ assert Ast.pprint(Ast.abs("f", Ast.abs("y", Ast.app(Ast.var("f"), Ast.var("x"))))) ==
+ "(λ f . (λ y . f x))"
+ end
+
+ test "free_vars-1" do
+ program = Ast.var("x")
+ expected = MapSet.new(["x"])
+ repr_expected = "x"
+ repr_subs_expected = "y"
+
+ assert MapSet.equal?(Ast.free_vars(program), expected)
+ assert Ast.pprint(program) == repr_expected
+
+ assert Ast.pprint(Ast.subst(program, "x", Ast.var("y"))) == repr_subs_expected
+ end
+
+ test "free_vars-2" do
+ program = Ast.abs("x", Ast.var("x"))
+ expected = MapSet.new([])
+ repr_expected = "(λ x . x)"
+ repr_subs_expected = "(λ x . x)"
+
+ assert MapSet.equal?(Ast.free_vars(program), expected)
+ assert Ast.pprint(program) == repr_expected
+
+ assert Ast.pprint(Ast.subst(program, "x", Ast.var("y"))) == repr_subs_expected
+ end
+
+ test "free_vars-3" do
+ program = Ast.app(Ast.var("f"), Ast.var("x"))
+ expected = MapSet.new(["f", "x"])
+ repr_expected = "f x"
+
+ assert MapSet.equal?(Ast.free_vars(program), expected)
+ assert Ast.pprint(program) == repr_expected
+ end
+
+ test "free_vars-4" do
+ program =
+ Ast.abs(
+ "f",
+ Ast.app(Ast.var("x"), Ast.abs("x", Ast.app(Ast.var("f"), Ast.var("x"))))
+ )
+
+ expected = MapSet.new(["x"])
+ repr_expected = "(λ f . x (λ x . f x))"
+
+ assert MapSet.equal?(Ast.free_vars(program), expected)
+ assert Ast.pprint(program) == repr_expected
+ end
+
+ test "free_vars-5" do
+ program = Ast.abs("f", Ast.abs("y", Ast.app(Ast.var("f"), Ast.var("x"))))
+ expected = MapSet.new(["x"])
+ repr_expected = "(λ f . (λ y . f x))"
+
+ assert MapSet.equal?(Ast.free_vars(program), expected)
+ assert Ast.pprint(program) == repr_expected
+ end
+end