static void Main(string[] args)
        {
            // open debug output
            var tl = new System.Diagnostics.ConsoleTraceListener();
            System.Diagnostics.Debug.Listeners.Add ( tl );

            Console.WriteLine("begin testing AtomRefManager\n");
            AtomRefManager atom = new AtomRefManager(10);
            int index = atom.allocate(0);
            atom.setElement(index, 1);
            int r = (int)atom.getElement(index);
            Console.WriteLine("end testing ArrayRefManager\n");

            Console.WriteLine("begin testing ArrayRefManager\n");
            ArrayRefManager arr = new ArrayRefManager(10);
            int index2 = arr.allocate(2, 0);
            arr.setElement(index2, 1, 42);
            int r2 = (int)arr.getElement(index2, 1);
            Debug.Assert(r2 == 42, "r2 == 42 failed");


            int index3 = arr.allocate(3, 0);
            arr.setElement(index3, 1, 41);
            int r3 = (int)arr.getElement(index3, 1);
            Debug.Assert(r3 == 41, "r3 == 41 failed");

            Console.WriteLine(arr.ExpressionID);
            Console.WriteLine(arr.ToString());

            Console.WriteLine("end testing ArrayRefManager\n");

            Console.WriteLine("begin testing ViewManager\n");

            ViewManager vm = new ViewManager();

            Maybe opt_rec = vm.get(0, 0, 1, 1);
            Debug.Assert(!Maybe.is_none(opt_rec), "Fail to get lock.");
            vm = (ViewManager)vm.GetClone();
            Console.WriteLine(vm.ExpressionID);
            Console.WriteLine(vm.ToString());

            
            opt_rec = vm.get(0, 0, 1, 1);
            Debug.Assert(Maybe.is_none(opt_rec), "should not get lock.");
            vm = (ViewManager)vm.GetClone();
            Console.WriteLine(vm.ExpressionID);
            Console.WriteLine(vm.ToString());

            opt_rec = vm.get(0, 1, 1, 1);
            Debug.Assert(!Maybe.is_none(opt_rec), "Fail to get lock.");
            vm = (ViewManager)vm.GetClone();
            Console.WriteLine(vm.ExpressionID);
            Console.WriteLine(vm.ToString());
            Console.WriteLine("end testing ViewManager\n");


        }
 /// <summary>
 /// Please implement this method to return a deep clone of the current object
 /// </summary>
 /// <returns></returns>
 public override ExpressionValue GetClone()
 {
     // todo
     // Currently, I assume each element in the array is immutable.
     ArrayList new_array = new ArrayList(m_array);
     AtomRefManager ret = new AtomRefManager(m_index, new_array);
     return ret;
 }