// 
// File:        EnumTest.java
// Copyright:   (c) 2001 The Regents of the University of California
// Revision:    @(#) $Revision: 4434 $
// Date:        $Date: 2005-03-17 09:05:29 -0800 (Thu, 17 Mar 2005) $
// Description: enum regression test case for Java calling other languages
// 

/**
 * The following class runs the enum regression test cases for Java.
 */
public class EnumTest {
  private final static String[] s_results = {
    "FAIL",
    "XFAIL",
    "synch.ResultType.PASS",
    "Xsynch.ResultType.PASS",
    "UNSUPPORTED"
  };

  private static int s_part = 0;
  private static int s_result = synch.ResultType.PASS;

  private static synch.RegOut tracker; 
  /**
   * Check the results of the test case.
   */
  //Comments should really be passed in here.
  private static void startTest(String test) {
    tracker.startPart(++s_part);
    if(test != null)
      tracker.writeComment(test);
  }

  private static void check(int expected, boolean pass, String test ) {
    if (test != null)
      tracker.writeComment(test);

    if(expected == synch.ResultType.PASS)
      if(pass)
        tracker.endPart(s_part, synch.ResultType.PASS);
      else
        tracker.endPart(s_part, synch.ResultType.FAIL);
    else if (expected == synch.ResultType.XFAIL)
      if(pass)
        tracker.endPart(s_part, synch.ResultType.XPASS);
      else
        tracker.endPart(s_part, synch.ResultType.XFAIL);
    else
      tracker.endPart(s_part, synch.ResultType.FAIL);
  }


  /**
   * The main test driver takes no command-line arguments and runs the
   * regression tests.
   */
  public static void main(String args[]) {
    try {
      /*
       * Begin the test
       */
      tracker = new synch.RegOut();
      tracker.setExpectations(26);


      s_part   = 0;
      s_result = synch.ResultType.PASS;

      /*
       * Look at the pretty colors...
       */
      if (true) {
        sidl.Enum.Holder out   = new sidl.Enum.Holder(0);
        sidl.Enum.Holder inout = new sidl.Enum.Holder(enums.color.green);

        enums.colorwheel obj = new enums.colorwheel();

        startTest(null);
        check(synch.ResultType.PASS,
              (obj.returnback() == enums.color.violet),
              "(obj.returnback() == enums.color.violet)");
        startTest(null);
        check(synch.ResultType.PASS,
              (obj.passin(enums.color.blue) == true),
              "(obj.passin(enums.color.blue) == true)");
        startTest(null);
        check(synch.ResultType.PASS,
              (obj.passout(out) == true && out.get() == enums.color.violet),
              "(obj.passout(out) == true && out.get() == enums.color.violet)");
        startTest(null);
        check(synch.ResultType.PASS,
              (obj.passinout(inout) == true
               && inout.get() == enums.color.red),
              "(obj.passinout(inout) == true "
              + " && inout.get() == enums.color.red)");
        startTest(null);
        check(synch.ResultType.PASS,
              (obj.passeverywhere(enums.color.blue, out, inout) ==
               enums.color.violet 
               && out.get() == enums.color.violet
               && inout.get() == enums.color.green),
              "(obj.passeverywhere(enums.color.blue, out, inout) =="
              +     " enums.color.violet"
              + " && out.get() == enums.color.violet"
              + " && inout.get() == enums.color.green)");
      }

      /*
       * I want a porsche - zoom, zoom...
       */
      if (true) {
        sidl.Enum.Holder out   = new sidl.Enum.Holder(0);
        sidl.Enum.Holder inout = new sidl.Enum.Holder(enums.car.ford);

        enums.cartest obj = new enums.cartest();

        startTest(null);
        check(synch.ResultType.PASS,
              (obj.returnback() == enums.car.porsche),
              "(obj.returnback() == enums.car.porsche)");
        startTest(null);
        check(synch.ResultType.PASS,
              (obj.passin(enums.car.mercedes) == true),
              "(obj.passin(enums.car.mercedes) == true)");
        startTest(null);
        check(synch.ResultType.PASS,
              (obj.passout(out) == true && out.get() == enums.car.ford),
              "(obj.passout(out) == true && out.get() == enums.car.ford)");
        startTest(null);
        check(synch.ResultType.PASS,
              (obj.passinout(inout) == true
               && inout.get() == enums.car.porsche),
              "(obj.passinout(inout) == true "
              + " && inout.get() == enums.car.porsche)");
        startTest(null);
        check(synch.ResultType.PASS,
              (obj.passeverywhere(enums.car.mercedes, out, inout) ==
               enums.car.porsche
               && out.get() == enums.car.ford
               && inout.get() == enums.car.mercedes),
              "(obj.passeverywhere(enums.car.mercedes, out, inout) =="
              +     " enums.car.porsche"
              + " && out.get() == enums.car.ford"
              + " && inout.get() == enums.car.mercedes)");
      }

      /*
       * When I started programming, we only had zeros...
       */
      if (true) {
        sidl.Enum.Holder out   = new sidl.Enum.Holder(0);
        sidl.Enum.Holder inout = new sidl.Enum.Holder(enums.number.zero);

        enums.numbertest obj = new enums.numbertest();

        startTest(null);
        check(synch.ResultType.PASS,
              (obj.returnback() == enums.number.notOne),
              "(obj.returnback() == enums.number.notOne)");
        startTest(null);
        check(synch.ResultType.PASS,
              (obj.passin(enums.number.notZero) == true),
              "(obj.passin(enums.number.notZero) == true)");
        startTest(null);
        check(synch.ResultType.PASS,
              (obj.passout(out) == true && out.get() == enums.number.negOne),
              "(obj.passout(out) == true && out.get() == enums.number.negOne)");
        startTest(null);
        check(synch.ResultType.PASS,
              (obj.passinout(inout) == true
               && inout.get() == enums.number.notZero),
              "(obj.passinout(inout) == true "
              + " && inout.get() == enums.number.notZero)");
        startTest(null);
        check(synch.ResultType.PASS,
              (obj.passeverywhere(enums.number.notZero, out, inout) ==
               enums.number.notOne
               && out.get() == enums.number.negOne
               && inout.get() == enums.number.zero),
              "(obj.passeverywhere(enums.number.notZero, out, inout) =="
              +     " enums.number.notOne"
              + " && out.get() == enums.number.negOne"
              + " && inout.get() == enums.number.zero)");
      }
      
      if (true) {
        int[] numElem = {2};
        int[] stride = {2};
        sidl.Enum.Array1 enumArray = new sidl.Enum.Array1(4, true);
        sidl.Enum.Array1 slicedArray = null;
        sidl.Enum.Array1 cpArray = null;
        startTest(null);
        check(synch.ResultType.PASS, enumArray != null, "enumArray != null"); 
        enumArray.set(0, enums.car.porsche);
        enumArray.set(1, enums.car.ford);
        enumArray.set(2, enums.car.mercedes);
        enumArray.set(3, enums.car.porsche);
        startTest(null);
        check(synch.ResultType.PASS, enumArray.get(0) == enums.car.porsche,
              "Element 0 is a porsche!"); 
        startTest(null);
        check(synch.ResultType.PASS, enumArray.get(1) == enums.car.ford,
              "Element 1 is a ford!");
        startTest(null);
        check(synch.ResultType.PASS, enumArray.get(2) == enums.car.mercedes,
              "Element 2 is a mercedes!");
        startTest(null);
        check(synch.ResultType.PASS, enumArray.get(3) == enums.car.porsche,
              "Element 3 is a porsche!");

        slicedArray = (sidl.Enum.Array1) enumArray._slice(1, numElem, (int[])null, stride, (int[])null)._dcast();
        startTest(null);
        check(synch.ResultType.PASS, slicedArray != null, "Sliced Array is not null");
        startTest(null);
        check(synch.ResultType.PASS, slicedArray.get(0) == enums.car.porsche,
              "Sliced Array Element 0 is a porche!"); 
        startTest(null);
        check(synch.ResultType.PASS, slicedArray.get(1) == enums.car.mercedes,
              "Sliced Array Element 1 is a mercedes!");
        cpArray = slicedArray.smartCopy();
     
        startTest(null);
        check(synch.ResultType.PASS, cpArray != null, "Copied Array is not null");
        startTest(null);
        check(synch.ResultType.PASS, cpArray._get(0) == enums.car.porsche,
              "Copied Array Element 0 is a porche!"); 
        startTest(null);
        check(synch.ResultType.PASS, cpArray._get(1) == enums.car.mercedes,
              "Copied Array Element 1 is a mercedes!");
        cpArray._deallocate();
        slicedArray._deallocate();
        enumArray._deallocate();
      

      }

      /*
       * Output final test results
       */
      tracker.close();
      //System.out.println("TEST_RESULT " + s_results[s_result]);

      Runtime.getRuntime().exit(0); /* workaround for Linux JVM 1.3.1 bug */
      /*
       * Catch any unexpected exceptions and return a test failure
       */
    } catch (Throwable ex) {
      tracker.close();
      //System.out.println("TEST_RESULT FAIL");
      System.out.println(ex.toString());
      System.exit(1);
    }
  }
}
