module free_tests.
  accumulate test_helpers, classicjava_free.
  import set_equals.

  local testcase int -> expression -> (list string) -> o.

  %% adapters from test_helpers.
  check_exists 1 J :- testcase J _ _.
  check 1 J :- testcase J E L, free E L', set_equals L L'.

  %          expression     expected answer
  testcase 1 (var "y")      ("y" :: nil).
  testcase 2 (new "Object") nil.
  testcase 3 this           nil.
  testcase 4 null           nil.
  testcase 5 (mcall (var "o") "m" ((var "y")::nil)) % expression
             ("o" :: "y" :: nil).            % answer
  testcase 6 (dot (mcall (var "o") "m" ((mcall this "h" ((var "y")::nil))::nil)) "f")
             ("o" :: "y" :: nil).
  testcase 7 (fassign this "f" (mcall (dot (var "o") "g")
                                      "p" ((dot (var "x") "h")::nil)))
             ("o" :: "x" :: nil).
  testcase 8 (cast (cn "Foo")
               (semi (fassign (var "y") "f" (var "z")) (dot (var "y") "f")))
             ("z" :: "y" :: nil).
  testcase 9 (semi (fassign (var "y") "f" (var "z")) (dot (var "y") "f"))
             ("z" :: "y" :: nil).
end
