module classicjava_testct.
  accumulate classicjava_syntax.

  % example declarations for use in testing
  example (
    (class "Void" "Object" nil 
          ((meth (cn "Void") "nothing" (nil) this) ::
          nil)
    ) ::
    (class "Closure" "Object" nil
          ((meth (cn "Object") "run" (nil) null) ::
          nil)
    ) ::
    (class "Boolean" "Object" nil
          ((meth (cn "Object") "ifTrue" ((formal (cn "Closure") "t") ::
                                         (formal (cn "Closure") "f") :: nil)
                null) ::
           (meth (cn "Boolean") "not" (nil)
                null) ::
           (meth (cn "Boolean") "and" ((formal (cn "Boolean") "b")::nil)
                null) ::
           (meth (cn "Boolean") "or" ((formal (cn "Boolean") "b")::nil)
                null) ::
           nil)
    ) ::
    (class "True" "Boolean" nil
          ((meth (cn "Object") "ifTrue" ((formal (cn "Closure") "t") ::
                                         (formal (cn "Closure") "f") :: nil)
                (mcall (var "t") "run" nil)) ::
           (meth (cn "Boolean") "not" (nil)
                (new "False")) ::
           (meth (cn "Boolean") "and" ((formal (cn "Boolean") "b")::nil)
                (var "b")) ::
           (meth (cn "Boolean") "or" ((formal (cn "Boolean") "b")::nil)
                this) ::
           nil)
    ) ::
    (class "False" "Boolean" nil
          ((meth (cn "Object") "ifTrue" ((formal (cn "Closure") "t") ::
                                         (formal (cn "Closure") "f") :: nil)
                (mcall (var "f") "run" nil)) ::
           (meth (cn "Boolean") "not" (nil)
                (new "True")) ::
           (meth (cn "Boolean") "and" ((formal (cn "Boolean") "b")::nil)
                this) ::
           (meth (cn "Boolean") "or" ((formal (cn "Boolean") "b")::nil)
                (var "b")) ::
           nil)
    ) ::
    (class "List" "Object" nil
          ((meth (cn "Boolean") "isEmpty" nil
                null) ::
           (meth (cn "Object") "head" nil
                null) ::
           (meth (cn "List") "tail" nil
                null) ::
           nil)
    ) ::
    (class "Nil" "List" nil
          ((meth (cn "Boolean") "isEmpty" nil
                (new "True")) ::
           nil)
    ) ::
    (class "Cons" "List" ((field (cn "Object") "car") ::
                          (field (cn "List") "cdr") :: nil)
          ((meth (cn "Cons") "init" ((formal (cn "Object") "hd") ::
                                     (formal (cn "List") "tl") :: nil)
                (semi (semi (fassign this "car" (var "hd"))
                            (fassign this "cdr" (var "tl")))
                      this)) ::
           (meth (cn "Boolean") "isEmpty" nil
                (new "False")) ::
           (meth (cn "Object") "head" nil
                (dot this "car")) ::
           (meth (cn "List") "tail" nil
                (dot this "cdr")) ::
           (meth (cn "Cons") "setHead" ((formal (cn "Object") "o")::nil)
                (semi (fassign this "car" (var "o")) this)) ::
           (meth (cn "Cons") "setTail" ((formal (cn "Object") "l")::nil)
                (semi (fassign this "cdr" (var "l")) this)) ::
           nil)
    ) ::
    (class "Color" "Object" nil nil
    ) ::
    (class "Blue" "Color" nil nil
    ) ::
    (class "ColoredStack" "Stack" ((field (cn "Color") "color") :: nil)
          ((meth (cn "ColoredStack") "init" nil
                (semi (semi (fassign this "elems" (new "Nil"))
                            (fassign this "color" (new "Blue")))
                      this)) ::
           (meth (cn "ColoredStack") "setColor" 
                                       ((formal (cn "Color") "nv")::nil)
                (semi (fassign this "color" (var "nv"))
                      this)) ::
           (meth (cn "Color") "getColor" (nil) (dot this "color")) ::
          nil)
    ) ::
    (class "Stack" "Object" ((field (cn "List") "elems") :: nil)
          ((meth (cn "Stack") "init" nil
                (semi (fassign this "elems" (new "Nil"))
                      this)) ::
           (meth (cn "Boolean") "isEmpty" nil
                (mcall (dot this "elems") "isEmpty" nil)) ::
           (meth (cn "Stack") "push" ((formal (cn "Object") "o")::nil)
                (semi
                  (fassign this "elems" 
                     (mcall 
                        (mcall (new "Cons") "setHead" ((var "o")::nil))
                        "setTail" ((dot this "elems")::nil)))
                  this)) ::
           (meth (cn "Stack") "pop" nil
                (semi
                  (fassign this "elems" 
                     (mcall (dot this "elems") "tail" nil))
                  this)) ::
           (meth (cn "Object") "top" nil
                (mcall (dot this "elems") "head" nil)) ::
           nil)
    ) ::
    nil).

end
