
/*
 * This tests a trivial class. In SystemVerilong, classes are garbage
 * collected dynamic objects, so this tests the creation of class objects,
 * some simple manipulations, copying (by reference) and cleanup.
 */

// Trivial example of a class

program main;

   class base_t;
      int x;
      int y;
   endclass : base_t

   class foo_t;
      int a;
      int b;
      base_t base = new ( );
   endclass : foo_t

   foo_t obj, copy;

   initial begin
      obj = new;

      if (obj == null) begin
	 $display("FAILED -- After allocation, object is NOT null.");
	 $finish;
      end

      // This is the most trivial assignment of class properties.
      obj.a = 10;
      obj.b = 11;
      obj.base.x = 12;
      obj.base.y = 13;

      if (obj.a != 10 || obj.b != 11) begin
	 $display("FAILED -- assign to object: obj.a=%0d, obj.b=%0d", obj.a, obj.b);
	 $finish;
      end

      // This actually makes a shared link to the same object. This
      // will make a link to the object.
      copy = obj;

      if (copy.a != 10 || copy.b != 11) begin
	 $display("FAILED -- copy object: copy.a=%0d, copy.b=%0d", copy.a, copy.b);
	 $finish;
      end

      copy.a = 7;
      copy.b = 8;

      if (obj.a != 7 || obj.b != 8) begin
	 $display("FAILED -- check shared-ness: obj.a=%0d, obj.b=%0d", obj.a, obj.b);
	 $finish;
      end

      // Clear the copy pointer. obj still exists, though.
      copy = null;
      if (obj.a != 7 || obj.b != 8) begin
	 $display("FAILED -- clear copy preserved link: obj.a=%0d, obj.b=%0d", obj.a, obj.b);
	 $finish;
      end

      // This is the last reference to the class, so it should cause
      // the object to be destroyed. How to test that?
      obj = null;

      $display("PASSED");
      $finish;
   end
endprogram // main
