
import java_enums.*;

public class java_enums_runme implements stuff {
  static {
    try {
        System.loadLibrary("java_enums");
    } catch (UnsatisfiedLinkError e) {
      System.err.println("Native code library failed to load. See the chapter on Dynamic Linking Problems in the SWIG Java documentation for help.\n" + e);
      System.exit(1);
    }
  }

  public static void main(String argv[]) 
  {
      if (WithTrailingComma.Second != 1)
          throw new RuntimeException("Incorrect value for Second");

      if (WithTrailingCommaAndIgnoredFirstItem.SecondNonIgnoredOne != 2)
          throw new RuntimeException("Incorrect value for SecondNonIgnoredOne");

      int number = 200;

      // Switch statement will only compile if these enums are initialised 
      // from a constant Java value, that is not from a function call
      switch(number) {
          case stuff.FIDDLE:
              break;
          case stuff.STICKS:
              break;
          case stuff.BONGO:
              break;
          case stuff.DRUMS:
              break;
          default:
              break;
      }
      if (stuff.DRUMS != 15)
          throw new RuntimeException("Incorrect value for DRUMS");

      // check typemaps use short for this enum
      short poppycock = nonsense.POPPYCOCK;
      short tst1 = java_enums.test1(poppycock);
      short tst2 = java_enums.test2(poppycock);

      // Check that stuff is an interface and not a class - we can drop the stuff keyword as this class implements the stuff interface
      switch(number) {
          case FIDDLE:
              break;
          case STICKS:
              break;
          case BONGO:
              break;
          case DRUMS:
              break;
          default:
              break;
      }
  }
}
