Public tests for part 2:

defined_class: 
  when run on defined_class_1.ru should return true if
    -- "Truck" is given as the class name
    -- "Car" is given as the class name
    -- Primitive objects are given as class name (Integer, ..)

lca_class:
  when run on lca_test_1.ru:
    -- lca_class p "Truck" "Sedan" --> "Car"
    -- lca_class p "Truck" "Truck" --> "Truck"
  when run on lca_test_2.ru:
    -- lca_class p "WhiteSedan" "Sedan" --> "Sedan"

castable:
  when run on lca_test_2.ru:
    -- castable p (TClass "Object") (TClass "Sedan") --> true
    -- castable p (TClass "Integer") (TClass "Truck") --> false

no_builtin_redef:
  when run on any of the previous examples should return true.
  when run on builtin_redef.ru, should parse correctly, but 
  return false.

lookup_meth:
  when run on lca_test_2.ru:
    -- lookup_meth p "Car" "wheels_plus_n" -->
        TMeth ([TClass "Integer"], (TClass "Integer"))
    -- lookup_meth p "Truck" "wheels_plus_n" -->
        TMeth ([TClass "Integer"], (TClass "Integer"))
    -- lookup_meth p "Truck" "set_num_axles" -->
        TMeth ([TClass "Integer"], (TBot))
    -- lookup_meth p "WhiteSedan" "set_num_axles" -->
        Exception: Not_found
    -- lookup_meth p "WhiteSedan" "+" -->
        Exception: Not_found

lookup_field:
  when run on lca_test_2.ru:
    -- lookup_field p "Car" "@color" --> TClass "Integer"
    -- lookup_field p "Sedan" "@axles" --> Exception: Not_found
