
import default_args.*;

public class default_args_runme {
  static {
    try {
        System.loadLibrary("default_args");
    } 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 (default_args.anonymous() != 7771)
      throw new RuntimeException("anonymous (1) failed");
    if (default_args.anonymous(1234) != 1234)
      throw new RuntimeException("anonymous (2) failed");

    if (default_args.booltest() != true)
      throw new RuntimeException("booltest (1) failed");
    if (default_args.booltest(true) != true)
      throw new RuntimeException("booltest (2) failed");
    if (default_args.booltest(false) != false)
      throw new RuntimeException("booltest (3) failed");

    EnumClass ec = new EnumClass();
    if (ec.blah() != true)
      throw new RuntimeException("EnumClass failed");

    if (default_args.casts1() != null)
      throw new RuntimeException("casts1 failed");

    if (!default_args.casts2().equals("Hello"))
      throw new RuntimeException("casts2 failed");

    if (!default_args.casts1("Ciao").equals("Ciao"))
      throw new RuntimeException("casts1 not default failed");

    if (default_args.chartest1() != 'x')
      throw new RuntimeException("chartest1 failed");

    if (default_args.chartest2() != '\0')
      throw new RuntimeException("chartest2 failed");

    if (default_args.chartest1('y') != 'y')
      throw new RuntimeException("chartest1 not default failed");

    if (default_args.chartest1('y') != 'y')
      throw new RuntimeException("chartest1 not default failed");

    if (default_args.reftest1() != 42)
      throw new RuntimeException("reftest1 failed");

    if (default_args.reftest1(400) != 400)
      throw new RuntimeException("reftest1 not default failed");

    if (!default_args.reftest2().equals("hello"))
      throw new RuntimeException("reftest2 failed");

    // rename
    Foo foo = new Foo();
    foo.newname(); 
    foo.newname(10); 
    foo.renamed3arg(10, 10.0); 
    foo.renamed2arg(10); 
    foo.renamed1arg(); 
     
    // exception specifications
    try {
      default_args.exceptionspec();
      throw new RuntimeException("exceptionspec 1 failed");
    } catch (RuntimeException e) {
    }
    try {
      default_args.exceptionspec(-1);
      throw new RuntimeException("exceptionspec 2 failed");
    } catch (RuntimeException e) {
    }
    try {
      default_args.exceptionspec(100);
      throw new RuntimeException("exceptionspec 3 failed");
    } catch (RuntimeException e) {
    }
    Except ex = new Except(false);
    try {
      ex.exspec();
      throw new RuntimeException("exspec 1 failed");
    } catch (RuntimeException e) {
    }
    try {
      ex.exspec(-1);
      throw new RuntimeException("exspec 2 failed");
    } catch (RuntimeException e) {
    }
    try {
      ex.exspec(100);
      throw new RuntimeException("exspec 3 failed");
    } catch (RuntimeException e) {
    }
    try {
      ex = new Except(true);
      throw new RuntimeException("Except constructor 1 failed");
    } catch (RuntimeException e) {
    }
    try {
      ex = new Except(true, -2);
      throw new RuntimeException("Except constructor 2 failed");
    } catch (RuntimeException e) {
    }

    // Default parameters in static class methods
    if (Statics.staticmethod() != 10+20+30)
      throw new RuntimeException("staticmethod 1 failed");
    if (Statics.staticmethod(100) != 100+20+30)
      throw new RuntimeException("staticmethod 2 failed");
    if (Statics.staticmethod(100,200,300) != 100+200+300)
      throw new RuntimeException("staticmethod 3 failed");


    Tricky tricky = new Tricky();
    if (tricky.privatedefault() != 200)
      throw new RuntimeException("privatedefault failed");
    if (tricky.protectedint() != 2000)
      throw new RuntimeException("protectedint failed");
    if (tricky.protecteddouble() != 987.654)
      throw new RuntimeException("protecteddouble failed");
    if (tricky.functiondefault() != 500)
      throw new RuntimeException("functiondefault failed");
    if (tricky.contrived() != 'X')
      throw new RuntimeException("contrived failed");

    if (default_args.constructorcall().getVal() != -1)
      throw new RuntimeException("constructorcall test 1 failed");

    if (default_args.constructorcall(new Klass(2222)).getVal() != 2222)
      throw new RuntimeException("constructorcall test 2 failed");

    if (default_args.constructorcall(new Klass()).getVal() != -1)
      throw new RuntimeException("constructorcall test 3 failed");

    // const methods 
    ConstMethods cm = new ConstMethods();
    if (cm.coo() != 20)
      throw new RuntimeException("coo test 1 failed");
    if (cm.coo(1.0) != 20)
      throw new RuntimeException("coo test 2 failed");

    if (default_args.sizeof_subscript_default_arg() != 5)
      throw new RuntimeException("sizeof_subscript_default_arg failed");
    if (default_args.getSizeof_subscript_count() != 5)
      throw new RuntimeException("sizeof_subscript_count failed");
    if (default_args.number_subscript_default_arg() != 3)
      throw new RuntimeException("number_subscript_default_arg failed");

    // sizeof applied to a member access of a parenthesised operand
    long size = default_args.sizeof_member_size();
    if (default_args.getSizeof_member_constant() != 2 * size)
      throw new RuntimeException("sizeof_member_constant failed");
    if (default_args.sizeof_member_default() != 2 * size)
      throw new RuntimeException("sizeof_member_default test 1 failed");
    if (default_args.sizeof_member_default(1) != 1 + size)
      throw new RuntimeException("sizeof_member_default test 2 failed");
    if (!default_args.sizeof_member_chain())
      throw new RuntimeException("sizeof_member_chain test 1 failed");
    if (default_args.sizeof_member_chain(0))
      throw new RuntimeException("sizeof_member_chain test 2 failed");
  }
}
