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