#!/usr/bin/env python

import sys, time
from omniORB import CORBA, PortableServer
import TypeTest, TypeTest__POA


failed = []
output = 1

def tstart(s):
    global current_test, output
    current_test = s
    if output:
        sys.stdout.write(s + ": ")
        sys.stdout.flush()

def tresult(s):
    if output:
        sys.stdout.write(str(s))
        sys.stdout.flush()

def tpass():
    if output:
        sys.stdout.write("  pass\n")
        sys.stdout.flush()

def tfail():
    global failed, current_test
    failed.append(current_test)
    if output:
        sys.stdout.write("  fail\n")
        sys.stdout.flush()

def tdone():
    global failed
    if len(failed) > 0:
        print "\nFailed tests:"
        for fail in failed:
            print "  ", fail
    else:
        if output:
            print "\nAll tests passed."



op_called = 0
j_deleted = 0

class J_i (TypeTest__POA.J):
    def __init__(self):
        global op_called, j_deleted
        op_called = j_deleted = 0

    def op(self):
        global op_called
        op_called = 1

    def __del__(self):
        global j_deleted
        j_deleted = 1


def doTests(orb, poa, io):
    global op_called, failed

    failed = []

    tstart("Void")
    r = io.simple1()
    if r is None: tpass()
    else:         tfail()

    tstart("Oneway")
    r = io.simple2()
    if r is None: tpass()
    else:         tfail()

    tstart("Short")
    r = io.simple3(42)
    if r == 42: tpass()
    else:       tfail()

    tstart("UShort")
    r = io.simple4(42)
    if r == 42: tpass()
    else:       tfail()

    tstart("Long")
    r = io.simple5(42)
    if r == 42: tpass()
    else:       tfail()

    tstart("ULong with long")
    r = io.simple6(42L)
    if r == 42L: tpass()
    else:        tfail()

    tstart("ULong with int")
    r = io.simple6(42)
    if r == 42: tpass()
    else:       tfail()

    tstart("Float with float")
    r = io.simple7(1.234)
    tresult(r)
    tpass()

    tstart("Float with int")
    r = io.simple7(42)
    if r == 42: tpass()
    else:       tfail()

    tstart("Double with float")
    r = io.simple8(1.234)
    if r == 1.234: tpass()
    else:          tfail()

    tstart("Double with int")
    r = io.simple8(42)
    if r == 42: tpass()
    else:       tfail()

    tstart("Boolean")
    r = io.simple9(1)
    if r == 1: tpass()
    else:      tfail()

    tstart("Char")
    r = io.simple10("a")
    if r == "a": tpass()
    else:        tfail()

    tstart("Octet")
    r = io.simple11(123)
    if r == 123: tpass()
    else:        tfail()

    tstart("Invalid arguments")
    ok = 1

    try:
        io.simple1(5)
        ok = 0
        tresult("-")
    except TypeError:
        tresult("+")

    try:
        io.simple3(1.234)
        ok = 0
        tresult("-")
    except CORBA.BAD_PARAM:
        tresult("+")

    try:
        io.simple3("Hello")
        ok = 0
        tresult("-")
    except CORBA.BAD_PARAM:
        tresult("+")

    try:
        io.simple3(0x8123)
        ok = 0
        tresult("-")
    except CORBA.BAD_PARAM:
        tresult("+")

    try:
        io.simple4(-1)
        ok = 0
        tresult("-")
    except CORBA.BAD_PARAM:
        tresult("+")

    try:
        io.simple6(1233456789012345L)
        ok = 0
        tresult("-")
    except CORBA.BAD_PARAM:
        tresult("+")

    try:
        io.simple10("Hello")
        ok = 0
        tresult("-")
    except CORBA.BAD_PARAM:
        tresult("+")

    try:
        io.simple10(65)
        ok = 0
        tresult("-")
    except CORBA.BAD_PARAM:
        tresult("+")

    try:
        io.simple11(1234)
        ok = 0
        tresult("-")
    except CORBA.BAD_PARAM:
        tresult("+")

    try:
        io.simple11(-1)
        ok = 0
        tresult("-")
    except CORBA.BAD_PARAM:
        tresult("+")

    if ok: tpass()
    else:  tfail()

    tstart("Combination 1")
    r = io.combine1(123, 456, 789L)
    if r is None: tpass()
    else:         tfail()

    tstart("Combination 2")
    r = io.combine2(123, 456L)
    tresult(r)
    tpass()

    tstart("Short attr")
    io._set_sattr1(123)
    tresult("+")
    r = io._get_sattr1()
    if r == 123: tpass()
    else:        tfail()

    tstart("UShort attr")
    io._set_sattr2(123)
    tresult("+")
    r = io._get_sattr2()
    if r == 123: tpass()
    else:        tfail()

    tstart("Long attr")
    io._set_sattr3(123)
    tresult("+")
    r = io._get_sattr3()
    if r == 123: tpass()
    else:        tfail()

    tstart("ULong attr")
    io._set_sattr4(123L)
    tresult("+")
    r = io._get_sattr4()
    if r == 123L: tpass()
    else:         tfail()

    tstart("Float attr")
    io._set_sattr5(1.234)
    tresult("+")
    r = io._get_sattr5()
    tresult(r)
    tpass()

    tstart("Double attr")
    io._set_sattr6(1.234)
    tresult("+")
    r = io._get_sattr6()
    if r == 1.234: tpass()
    else:          tfail()

    tstart("Boolean attr")
    io._set_sattr7(0)
    tresult("+")
    r = io._get_sattr7()
    if r == 0: tpass()
    else:      tfail()

    tstart("Char attr")
    io._set_sattr8("a")
    tresult("+")
    r = io._get_sattr8()
    if r == "a": tpass()
    else:        tfail()

    tstart("Octet attr")
    io._set_sattr9(123)
    tresult("+")
    r = io._get_sattr9()
    if r == 123: tpass()
    else:        tfail()


    tstart("Invalid attributes")
    ok = 1
    try:
        io._set_sattr1("hello")
        ok = 0
        tresult("-")
    except CORBA.BAD_PARAM:
        tresult("+")

    try:
        io._set_sattr2(1.234)
        ok = 0
        tresult("-")
    except CORBA.BAD_PARAM:
        tresult("+")

    try:
        io._set_sattr3("hello")
        ok = 0
        tresult("-")
    except CORBA.BAD_PARAM:
        tresult("+")

    try:
        io._set_sattr4("hello")
        ok = 0
        tresult("-")
    except CORBA.BAD_PARAM:
        tresult("+")

    try:
        io._set_sattr5("hello")
        ok = 0
        tresult("-")
    except CORBA.BAD_PARAM:
        tresult("+")

    try:
        io._set_sattr6("hello")
        ok = 0
        tresult("-")
    except CORBA.BAD_PARAM:
        tresult("+")

    try:
        io._set_sattr7("hello")
        ok = 0
        tresult("-")
    except CORBA.BAD_PARAM:
        tresult("+")

    try:
        io._set_sattr8("hello")
        ok = 0
        tresult("-")
    except CORBA.BAD_PARAM:
        tresult("+")

    try:
        io._set_sattr9("hello")
        ok = 0
        tresult("-")
    except CORBA.BAD_PARAM:
        tresult("+")

    if ok: tpass()
    else:  tfail()


    ji = J_i()
    jo = ji._this()

    tstart("Known Object")
    r = io.complex1(jo)
    if r._is_equivalent(jo): tpass()
    else:                    tfail()

    tstart("Unknown Object")
    try:
        ns = orb.resolve_initial_references("NameService")
        r = io.complex1(ns)
        if r._is_equivalent(ns): tpass()
        else:                    tfail()
    except CORBA.NO_RESOURCES:
        tresult("skip")
        tpass()

    tstart("Nil Object")
    r = io.complex1(None)
    if r is None: tpass()
    else:         tfail()

    tstart("Known interface")
    r = io.complex2(jo)
    ok = 1
    if r._is_equivalent(jo):
        tresult("+")
    else:
        ok = 0
        tresult("-")
    if op_called:
        tresult("+")
    else:
        ok = 0
        tresult("-")
    if ok: tpass()
    else:  tfail()

    tstart("Deactivate object")
    id = poa.reference_to_id(jo)
    del ji, jo
    r = None
    poa.deactivate_object(id)
    time.sleep(0.1) # In case a separate thread is doing the deletion
    if j_deleted: tpass()
    else:         tfail()


    tstart("Struct S1")
    s1 = TypeTest.S1(1, 2, 3, 4, 5.6, 7, 1, "a", 9)
    r = io.complex3(s1)
    if r.a == 1 and \
       r.b == 2 and \
       r.c == 3 and \
       r.d == 4 and \
       r.e > 5.0 and r.e < 6.0 and \
       r.f == 7 and \
       r.g == 1 and \
       r.h == "a" and \
       r.i == 9:
        tpass()
    else:
        tfail()

    tstart("Invalid Struct S1")
    s1 = TypeTest.S1(1, 2, 3, 4, 5.6, 7.8, 1, "ab", 9)
    try:
        r = io.complex3(s1)
        tfail()
    except CORBA.BAD_PARAM:
        tpass()

    tstart("Struct S1 in class")
    class mys1:
        a = 1
        b = 2
        c = 3
        d = 4
        e = 5.6
        f = 7.8
        g = 1
        h = "a"
        i = 9

    r = io.complex3(mys1)
    if r.a == 1 and \
       r.b == 2 and \
       r.c == 3 and \
       r.d == 4 and \
       r.e > 5.0 and r.e < 6.0 and \
       r.f == 7.8 and \
       r.g == 1 and \
       r.h == "a" and \
       r.i == 9:
        tpass()
    else:
        tfail()

    tstart("Struct S1 in non-S1 instance")
    r = io.complex3(mys1())
    if r.a == 1 and \
       r.b == 2 and \
       r.c == 3 and \
       r.d == 4 and \
       r.e > 5.0 and r.e < 6.0 and \
       r.f == 7.8 and \
       r.g == 1 and \
       r.h == "a" and \
       r.i == 9:
        tpass()
    else:
        tfail()


    tstart("Union U1")
    ok = 1
    u = TypeTest.U1(a=123)
    r = io.complex4(u)
    if r.a == 123:
        tresult("+")
    else:
        ok = 0
        tresult("-")

    u = TypeTest.U1(b=42)
    r = io.complex4(u)
    if r.b == 42 and u._d == r._d:
        tresult("+" + str(u._d) + str(r._d))
    else:
        ok = 0
        tresult("-" + str(u._d) + str(r._d))

    u = TypeTest.U1(1, 42)
    r = io.complex4(u)
    if r.b == 42 and u._d == r._d:
        tresult("+" + str(u._d) + str(r._d))
    else:
        ok = 0
        tresult("-" + str(u._d) + str(r._d))

    u = TypeTest.U1(c=5)
    r = io.complex4(u)
    if r.c == 5:
        tresult("+")
    else:
        ok = 0
        tresult("-")

    u = TypeTest.U1(42, None)
    r = io.complex4(u)
    if r._d == 42:
        tresult("+" + str(r._v))
    else:
        ok = 0
        tresult("-" + str(r._v))

    u = TypeTest.U1(42, "Hello")
    r = io.complex4(u)
    if r._d == 42:
        tresult("+" + str(r._v))
    else:
        ok = 0
        tresult("-" + str(r._v))

    if ok: tpass()
    else:  tfail()


    tstart("Union U2")
    ok = 1
    u = TypeTest.U2(a=123)
    r = io.complex5(u)
    if r.a == 123:
        tresult("+")
    else:
        ok = 0
        tresult("-")

    u = TypeTest.U2(b=42)
    r = io.complex5(u)
    if r.b == 42 and u._d == r._d:
        tresult("+" + str(u._d) + str(r._d))
    else:
        ok = 0
        tresult("-" + str(u._d) + str(r._d))

    u = TypeTest.U2("b", 42)
    r = io.complex5(u)
    if r.b == 42 and u._d == r._d:
        tresult("+" + str(u._d) + str(r._d))
    else:
        ok = 0
        tresult("-" + str(u._d) + str(r._d))

    u = TypeTest.U2(c=5)
    r = io.complex5(u)
    if r.c == 5:
        tresult("+")
    else:
        ok = 0
        tresult("-")

    if ok: tpass()
    else:  tfail()


    tstart("Invalid Unions")
    s1 = TypeTest.S1(1, 2, 3, 4, 5.6, 7.8, 1, "a", 9)
    ok = 1
    try:
        r = io.complex4(s1)
        ok = 0
        tresult("-")
    except CORBA.BAD_PARAM:
        tresult("+")

    try:
        u = TypeTest.U2(b = 0x81234)
        r = io.complex5(u)
        ok = 0
        tresult("-")
    except CORBA.BAD_PARAM:
        tresult("+")
    
    if ok: tpass()
    else:  tfail()


    tstart("Enum")
    ok = 1
    r = io.complex6(TypeTest.one)
    if r == TypeTest.one:
        tresult("+")
    else:
        tresult("-")
        ok = 0

    r = io.complex6(TypeTest.four)
    if r == TypeTest.four:
        tresult("+")
    else:
        tresult("-")
        ok = 0

    if ok: tpass()
    else:  tfail()

    tstart("Invalid enum")
    ok = 1
    try:
        r = io.complex6(1234)
        ok = 0
        tresult("-")
    except CORBA.BAD_PARAM:
        tresult("+")

    try:
        r = io.complex6(TypeTest.five)
        ok = 0
        tresult("-")
    except CORBA.BAD_PARAM:
        tresult("+")

    try:
        r = io.complex6(TypeTest.nine)
        ok = 0
        tresult("-")
    except CORBA.BAD_PARAM:
        tresult("+")

    if ok: tpass()
    else:  tfail()


    tstart("String")
    ok = 1
    s = "Hello there"
    r = io.complex7(s)
    if r == s:
        tresult("+")
    else:
        tresult("-")
        ok = 0
    
    s = "This is a much longer string with lots of stuff in it. Blah blah blah"
    r = io.complex7(s)
    if r == s:
        tresult("+")
    else:
        tresult("-")
        ok = 0

    s = "This is a string with a \0 in it."
    try:
        r = io.complex7(s)
        tresult("-")
        ok = 0
    except CORBA.BAD_PARAM:
        tresult("+")

    if ok: tpass()
    else:  tfail()

    tstart("Bounded string")
    ok = 1
    s = "Hello"
    r = io.complex8(s)
    if r == s:
        tresult("+")
    else:
        tresult("-")
        ok = 0
    
    s = "This is a much longer string with lots of stuff in it. Blah blah blah"
    try:
        r = io.complex8(s)
        tresult("-")
        ok = 0
    except CORBA.MARSHAL:
        tresult("+")

    s = "str\0ing"
    try:
        r = io.complex8(s)
        tresult("-")
        ok = 0
    except CORBA.BAD_PARAM:
        tresult("+")

    if ok: tpass()
    else:  tfail()


    tstart("Sequences")
    ok = 1

    s = [1, 2, 3, 4, 5]
    r = io.complex9(s)
    if list(r) == list(s):
        tresult("+")
    else:
        ok = 0
        tresult("-")

    s = (-6, 7, -8, 9, 10, 11)
    r = io.complex9(s)
    if list(r) == list(s):
        tresult("+")
    else:
        ok = 0
        tresult("-")

    s = [1, 2, 3, 4, 5]
    r = io.complex10(s)
    if list(r) == list(s):
        tresult("+")
    else:
        ok = 0
        tresult("-")

    s = (1, 2, -3, 4, 5)
    r = io.complex11(s)
    if list(r) == list(s):
        tresult("+")
    else:
        ok = 0
        tresult("-")

    s = [1L, 2, 3L, 4L, 5]
    r = io.complex12(s)
    if list(r) == list(s):
        tresult("+")
    else:
        ok = 0
        tresult("-")

    s = (1.2, 2, -3.4, 4.5, 5.6)
    r = io.complex13(s)
    if len(r) == len(s):
        tresult(r)
    else:
        ok = 0
        tresult("-")

    s = [1.2, 2, -3.4, 4.5, 5.6]
    r = io.complex14(s)
    if len(r) == len(s):
        tresult(r)
    else:
        ok = 0
        tresult("-")

    s = (1, 0, 1, 1, 0, 3, 1, 1, 1)
    r = io.complex15(s)
    if len(r) == len(s):
        tresult(r)
    else:
        ok = 0
        tresult("-")

    s = "This is a sequence of char with a \0 in it"
    r = io.complex16(s)
    if r == s:
        tresult("+")
    else:
        ok = 0
        tresult("-")

    s = "This is a sequence of octet, which is remarkably similar to a sequence of char. It also has a \0 in it."
    r = io.complex17(s)
    if r == s:
        tresult("+")
    else:
        ok = 0
        tresult("-")

    if ok: tpass()
    else:  tfail()


    tstart("Invalid sequences")
    ok = 1

    s = [1, 2, "Hi", 4, 5]
    try:
        r = io.complex9(s)
        ok = 0
        tresult("-")
    except CORBA.BAD_PARAM:
        tresult("+")

    s = (-6, 7, -8, 9, 10, 11)
    try:
        r = io.complex10(s)
        ok = 0
        tresult("-")
    except CORBA.BAD_PARAM:
        tresult("+")

    s = (1, 2, -3.5, 4, 5)
    try:
        r = io.complex11(s)
        ok = 0
        tresult("-")
    except CORBA.BAD_PARAM:
        tresult("+")

    s = [1L, 2, -3L, 4L, 5]
    try:
        r = io.complex12(s)
        ok = 0
        tresult("-")
    except CORBA.BAD_PARAM:
        tresult("+")

    s = (1.2, 2, -3.4, None, 5.6)
    try:
        r = io.complex13(s)
        ok = 0
        tresult("-")
    except CORBA.BAD_PARAM:
        tresult("+")

    s = [1.2, "Hi", -3.4, 4.5, 5.6]
    try:
        r = io.complex14(s)
        ok = 0
        tresult("-")
    except CORBA.BAD_PARAM:
        tresult("+")

    s = (1, 0, 1, 1.2, 0, 3, 1, 1, 1)
    try:
        r = io.complex15(s)
        ok = 0
        tresult("-")
    except CORBA.BAD_PARAM:
        tresult("+")

    s = [1, 2, 3, 4, 5]
    try:
        r = io.complex16(s)
        ok = 0
        tresult("-")
    except CORBA.BAD_PARAM:
        tresult("+")

    s = [1, 2, 3, 4, 5]
    try:
        r = io.complex17(s)
        ok = 0
        tresult("-")
    except CORBA.BAD_PARAM:
        tresult("+")

    if ok: tpass()
    else:  tfail()


    tstart("Bounded Sequences")
    ok = 1

    s = [1, 2, 3, 4, 5]
    r = io.complex18(s)
    if list(r) == list(s):
        tresult("+")
    else:
        ok = 0
        tresult("-")

    s = (-6, 7, -8, 9, 10, 11)
    r = io.complex18(s)
    if list(r) == list(s):
        tresult("+")
    else:
        ok = 0
        tresult("-")

    s = [1, 2, 3, 4, 5]
    r = io.complex19(s)
    if list(r) == list(s):
        tresult("+")
    else:
        ok = 0
        tresult("-")

    s = (1, 2, -3, 4, 5)
    r = io.complex20(s)
    if list(r) == list(s):
        tresult("+")
    else:
        ok = 0
        tresult("-")

    s = [1L, 2, 3L, 4L, 5]
    r = io.complex21(s)
    if list(r) == list(s):
        tresult("+")
    else:
        ok = 0
        tresult("-")

    s = (1.2, 2, -3.4, 4.5, 5.6)
    r = io.complex22(s)
    if len(r) == len(s):
        tresult(r)
    else:
        ok = 0
        tresult("-")

    s = [1.2, 2, -3.4, 4.5, 5.6]
    r = io.complex23(s)
    if len(r) == len(s):
        tresult(r)
    else:
        ok = 0
        tresult("-")

    s = (1, 0, 1, 1, 0, 3, 1, 1, 1, 1)
    r = io.complex24(s)
    if len(r) == len(s):
        tresult(r)
    else:
        ok = 0
        tresult("-")

    s = "This is a "
    r = io.complex25(s)
    if r == s:
        tresult("+")
    else:
        ok = 0
        tresult("-")

    s = "This is a "
    r = io.complex26(s)
    if r == s:
        tresult("+")
    else:
        ok = 0
        tresult("-")

    if ok: tpass()
    else:  tfail()


    tstart("Invalid bounded sequences")
    ok = 1

    s = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
    try:
        r = io.complex18(s)
        ok = 0
        tresult("-")
    except CORBA.MARSHAL:
        tresult("+")

    s = (-6, 7, -8, 9, 10, 11)
    try:
        r = io.complex19(s)
        ok = 0
        tresult("-")
    except CORBA.BAD_PARAM:
        tresult("+")

    s = (1, 2, -3, 4, 5, 6, 7, 8, 9, 10, 12, 134)
    try:
        r = io.complex20(s)
        ok = 0
        tresult("-")
    except CORBA.MARSHAL:
        tresult("+")

    s = [1L, 2, 3L, 4L, 5, 6L, 7L, 8, 9, 10, 11, 12]
    try:
        r = io.complex21(s)
        ok = 0
        tresult("-")
    except CORBA.MARSHAL:
        tresult("+")

    s = (1.2, 2, -3.4, 4.5, 5.6, 8, 9, 10, 11, 12, 14)
    try:
        r = io.complex22(s)
        ok = 0
        tresult("-")
    except CORBA.MARSHAL:
        tresult("+")

    s = [1.2, 2.3, -3.4, 4.5, 5.6, 7, 8, 9, 10, 11, 12, 145]
    try:
        r = io.complex23(s)
        ok = 0
        tresult("-")
    except CORBA.MARSHAL:
        tresult("+")

    s = (1, 0, 1, 1.2, 0, 3, 1, 1, 1)
    try:
        r = io.complex24(s)
        ok = 0
        tresult("-")
    except CORBA.BAD_PARAM:
        tresult("+")

    s = "This is a long sequence<char>"
    try:
        r = io.complex25(s)
        ok = 0
        tresult("-")
    except CORBA.MARSHAL:
        tresult("+")

    s = "This is a long sequence<octet>"
    try:
        r = io.complex26(s)
        ok = 0
        tresult("-")
    except CORBA.MARSHAL:
        tresult("+")

    if ok: tpass()
    else:  tfail()

    
    tstart("Arrays")
    ok = 1

    s = [1, 2, -3, 4, 5]
    r = io.complex27(s)
    if list(r) == list(s):
        tresult("+")
    else:
        ok = 0
        tresult("-")

    s = [1, 2, 3, 4, 5]
    r = io.complex28(s)
    if list(r) == list(s):
        tresult("+")
    else:
        ok = 0
        tresult("-")

    s = (1, 2, -3, 4, 5)
    r = io.complex29(s)
    if list(r) == list(s):
        tresult("+")
    else:
        ok = 0
        tresult("-")

    s = [1L, 2, 3L, 4L, 5]
    r = io.complex30(s)
    if list(r) == list(s):
        tresult("+")
    else:
        ok = 0
        tresult("-")

    s = (1.2, 2, -3.4, 4.5, 5.6)
    r = io.complex31(s)
    if len(r) == len(s):
        tresult(r)
    else:
        ok = 0
        tresult("-")

    s = [1.2, 2, -3.4, 4.5, 5.6]
    r = io.complex32(s)
    if len(r) == len(s):
        tresult(r)
    else:
        ok = 0
        tresult("-")

    s = (1, 0, 1, 3, 0)
    r = io.complex33(s)
    if len(r) == len(s):
        tresult(r)
    else:
        ok = 0
        tresult("-")

    s = "12345"
    r = io.complex34(s)
    if r == s:
        tresult("+")
    else:
        ok = 0
        tresult("-")

    s = "ab\0de"
    r = io.complex35(s)
    if r == s:
        tresult("+")
    else:
        ok = 0
        tresult("-")

    s = ["12345", "hello", "abc", "aa", "This is a long string"]
    r = io.complex36(s)
    if list(r) == list(s):
        tresult("+")
    else:
        ok = 0
        tresult("-")

    if ok: tpass()
    else:  tfail()


    tstart("Invalid arrays")
    ok = 1

    s = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
    try:
        r = io.complex27(s)
        ok = 0
        tresult("-")
    except CORBA.BAD_PARAM:
        tresult("+")

    s = (-6, 7, -8, 9, 10)
    try:
        r = io.complex28(s)
        ok = 0
        tresult("-")
    except CORBA.BAD_PARAM:
        tresult("+")

    s = (1, 2, -3, 4, 5, 6, 7, 8, 9, 10, 12, 134)
    try:
        r = io.complex29(s)
        ok = 0
        tresult("-")
    except CORBA.BAD_PARAM:
        tresult("+")

    s = [1L, 2, 3L, 4L, 5, 6L, 7L, 8, 9, 10, 11, 12]
    try:
        r = io.complex30(s)
        ok = 0
        tresult("-")
    except CORBA.BAD_PARAM:
        tresult("+")

    s = (1.2, 2, -3.4, 4.5, 5.6, 8, 9, 10, 11, 12, 14)
    try:
        r = io.complex31(s)
        ok = 0
        tresult("-")
    except CORBA.BAD_PARAM:
        tresult("+")

    s = [1.2, 2.3, -3.4, 4.5, 5.6, 7, 8, 9, 10, 11, 12, 145]
    try:
        r = io.complex32(s)
        ok = 0
        tresult("-")
    except CORBA.BAD_PARAM:
        tresult("+")

    s = (1, 0, 1, 1.2, 0, 3, 1, 1, 1)
    try:
        r = io.complex33(s)
        ok = 0
        tresult("-")
    except CORBA.BAD_PARAM:
        tresult("+")

    s = "This is a long sequence<char>"
    try:
        r = io.complex34(s)
        ok = 0
        tresult("-")
    except CORBA.BAD_PARAM:
        tresult("+")

    s = "Hi!"
    try:
        r = io.complex35(s)
        ok = 0
        tresult("-")
    except CORBA.BAD_PARAM:
        tresult("+")

    s = ["12345", 12345, "abc", "", "This is a long string"]
    try:
        r = io.complex36(s)
        ok = 0
        tresult("-")
    except CORBA.BAD_PARAM:
        tresult("+")

    if ok: tpass()
    else:  tfail()

    tstart("Short with Long")
    r = io.simple3(42L)
    if r == 42: tpass()
    else:       tfail()

    tstart("UShort with Long")
    r = io.simple4(42L)
    if r == 42: tpass()
    else:       tfail()

    tstart("Long with Long")
    r = io.simple5(42L)
    if r == 42: tpass()
    else:       tfail()

    tstart("Float with Long")
    r = io.simple7(42L)
    if r == 42: tpass()
    else:       tfail()

    tstart("Double with Long")
    r = io.simple8(42L)
    if r == 42: tpass()
    else:       tfail()

    tstart("Octet with Long")
    r = io.simple11(123L)
    if r == 123: tpass()
    else:        tfail()

    tstart("Sequences with Longs")
    ok = 1

    s = [1L, 2L, 3L, 4L, 5L]
    r = io.complex9(s)
    if list(r) == list(s):
        tresult("+")
    else:
        ok = 0
        tresult("-")

    s = (-6L, 7L, -8L, 9L, 10L, 11L)
    r = io.complex9(s)
    if list(r) == list(s):
        tresult("+")
    else:
        ok = 0
        tresult("-")

    s = [1L, 2L, 3L, 4L, 5L]
    r = io.complex10(s)
    if list(r) == list(s):
        tresult("+")
    else:
        ok = 0
        tresult("-")

    s = (1L, 2L, -3L, 4L, 5L)
    r = io.complex11(s)
    if list(r) == list(s):
        tresult("+")
    else:
        ok = 0
        tresult("-")

    s = [1L, 2, 3L, 4L, 5]
    r = io.complex12(s)
    if list(r) == list(s):
        tresult("+")
    else:
        ok = 0
        tresult("-")

    s = (1L, 2L, -3L, 4L, 5L)
    r = io.complex13(s)
    if len(r) == len(s):
        tresult(r)
    else:
        ok = 0
        tresult("-")

    s = [1L, 2L, -3L, 4L, 5L]
    r = io.complex14(s)
    if len(r) == len(s):
        tresult(r)
    else:
        ok = 0
        tresult("-")

    s = (1L, 0L, 1L, 1L, 0L, 3L, 1L, 1L, 1L)
    r = io.complex15(s)
    if len(r) == len(s):
        tresult(r)
    else:
        ok = 0
        tresult("-")

    if ok: tpass()
    else:  tfail()


    tstart("Struct S2")
    ok = 1
    jo = J_i()._this()
    s2 = TypeTest.S2(TypeTest.S1(1, 2, 3, 4, 5.6, 7, 8, "a", 10),
                     TypeTest.U1(a = 5),
                     jo,
                     [1, 2, 3, 4, 5, 6, 7],
                     "octet sequence",
                     "string")
    r = io.complex37(s2)
    if r.c._is_equivalent(jo):
        tresult("+")
    else:
        ok = 0
        tresult("-")
    id = poa.reference_to_id(jo)
    poa.deactivate_object(id)

    s2 = TypeTest.S2(TypeTest.S1(1, 2, 3, 4, 5.6, 7, 8, "a", 10),
                     TypeTest.U1(a = 5),
                     None,
                     [1, 2, 3, 4, 5, 6, 7],
                     "octet sequence",
                     "string")
    r = io.complex37(s2)
    if r.c is None:
        tresult("+")
    else:
        ok = 0
        tresult("-")

    if ok: tpass()
    else:  tfail()


    tstart("Invalid Struct S2")

    s2 = TypeTest.S2(TypeTest.S1(1, 2, 3, 4, 5.6, 7, 8, "a", 10),
                     TypeTest.U1(a = 5),
                     12345,
                     [1, 2, 3, 4, 5, 6, 7],
                     "octet sequence",
                     "string")
    try:
        r = io.complex37(s2)
        tfail()
    except CORBA.BAD_PARAM:
        tpass()


    tstart("Struct S3")

    i1 = TypeTest.S3(42, TypeTest.S3.U(0,None))
    i2 = TypeTest.S3(5,  TypeTest.S3.U(a=[i1]))
    i3 = TypeTest.S3(17, TypeTest.S3.U(a=[i2, i1]))

    r = io.complex38(i3)
    if r.b.a[0].a == 5: tpass()
    else:               tfail()


    tstart("Sequence of struct S1")

    ok = 1
    s  = [TypeTest.S1(1, 2, 3, 4, 5.6, 7, 8, "a", 10),
          TypeTest.S1(-10, 0xffff, -1234567, 42L, 1.234, 5.678, 0, "z", 255)]
    r  = io.complex39(s)

    if r[1].b == 0xffff:
        tresult("+")
    else:
        ok = 0
        tresult("-")

    s = []
    r = io.complex39(s)
    if r == s:
        tresult("+")
    else:
        ok = 0
        tresult("-")

    if ok: tpass()
    else:  tfail()

    tstart("Invalid sequence of struct S1")

    ok = 1
    s  = [TypeTest.S1(1, 2, 3, 4, 5.6, 7, 8, "a", 10),
          TypeTest.S1(-10, 0x10000, -1234567, 42L, 1.234, 5.678, 0, "z", 255)]

    try:
        r  = io.complex39(s)
        ok = 0
        tresult("-")
    except CORBA.BAD_PARAM:
        tresult("+")

    s = [123]
    try:
        r  = io.complex39(s)
        ok = 0
        tresult("-")
    except CORBA.BAD_PARAM:
        tresult("+")

    if ok: tpass()
    else:  tfail()


    tstart("Fixed")

    ok = 1
    f = TypeTest.F1(123456789)
    r = io.complex40(f)
    if r == f:
        tresult("+")
    else:
        ok = 0
        tresult("-")
        
    try:
        f  = CORBA.fixed("123456")
        r  = io.complex40(f)
        ok = 0
        tresult("-")
    except CORBA.DATA_CONVERSION:
        tresult("+")

    if ok: tpass()
    else:  tfail()


    tstart("WString")
    ok = 1
    s = u"Hello there"
    r = io.complex41(s)
    if r == s:
        tresult("+")
    else:
        tresult("-")
        ok = 0
    
    s = u"This is a much longer string with lots of stuff in it. Blah blah blah"
    r = io.complex41(s)
    if r == s:
        tresult("+")
    else:
        tresult("-")
        ok = 0

    s = u"This is a string with a \0 in it."
    try:
        r = io.complex41(s)
        tresult("-")
        ok = 0
    except CORBA.BAD_PARAM:
        tresult("+")

    if ok: tpass()
    else:  tfail()

    tstart("Bounded wstring")
    ok = 1
    s = u"Hello"
    r = io.complex42(s)
    if r == s:
        tresult("+")
    else:
        tresult("-")
        ok = 0
    
    s = u"This is a much longer string with lots of stuff in it. Blah blah blah"
    try:
        r = io.complex42(s)
        tresult("-")
        ok = 0
    except CORBA.MARSHAL:
        tresult("+")

    s = u"str\0ing"
    try:
        r = io.complex42(s)
        tresult("-")
        ok = 0
    except CORBA.BAD_PARAM:
        tresult("+")

    if ok: tpass()
    else:  tfail()



    tstart("Exceptions")

    ok = 1
    try:
        io.except1()
        ok = 0
        tresult("-")
    except TypeTest.X1:
        tresult("+")

    try:
        io.except2(1)
        ok = 0
        tresult("-")
    except TypeTest.X1:
        tresult("+")

    try:
        io.except2(2)
        ok = 0
        tresult("-")
    except TypeTest.X2, ex:
        tresult("+" + ex.b)

    try:
        io.except2(3)
        tresult("+")
    except:
        ok = 0
        tresult("-")

    try:
        io.except3(1)
        ok = 0
        tresult("-")
    except CORBA.UNKNOWN:
        tresult("+")

    try:
        io.except3(2)
        ok = 0
        tresult("-")
    except CORBA.NO_PERMISSION:
        tresult("+")

    try:
        io.except3(3)
        tresult("+")
    except:
        ok = 0
        tresult("-")

    if ok: tpass()
    else:  tfail()


    tstart("TypeCode")
    ok = 1

    io.tc1(CORBA._tc_long);    tresult("+")
    io.tc1(CORBA._tc_short);   tresult("+")
    io.tc1(CORBA._tc_boolean); tresult("+")
    io.tc1(CORBA._tc_string);  tresult("+")

    io.tc1(TypeTest._tc_J);   tresult("+")
    io.tc1(TypeTest._tc_S1);  tresult("+")
    io.tc1(TypeTest._tc_U1);  tresult("+")
    io.tc1(TypeTest._tc_U2);  tresult("+")
    io.tc1(TypeTest._tc_E1);  tresult("+")
    io.tc1(TypeTest._tc_E2);  tresult("+")

    io.tc1(TypeTest._tc_Q1);  tresult("+")
    io.tc1(TypeTest._tc_Q2);  tresult("+")
    io.tc1(TypeTest._tc_Q3);  tresult("+")
    io.tc1(TypeTest._tc_Q4);  tresult("+")
    io.tc1(TypeTest._tc_Q5);  tresult("+")
    io.tc1(TypeTest._tc_Q6);  tresult("+")
    io.tc1(TypeTest._tc_Q7);  tresult("+")
    io.tc1(TypeTest._tc_Q8);  tresult("+")
    io.tc1(TypeTest._tc_Q9);  tresult("+")
    io.tc1(TypeTest._tc_Q10); tresult("+")

    io.tc1(TypeTest._tc_BQ1); tresult("+")
    io.tc1(TypeTest._tc_BQ2); tresult("+")
    io.tc1(TypeTest._tc_BQ3); tresult("+")
    io.tc1(TypeTest._tc_BQ4); tresult("+")
    io.tc1(TypeTest._tc_BQ5); tresult("+")
    io.tc1(TypeTest._tc_BQ6); tresult("+")
    io.tc1(TypeTest._tc_BQ7); tresult("+")
    io.tc1(TypeTest._tc_BQ8); tresult("+")
    io.tc1(TypeTest._tc_BQ9); tresult("+")

    io.tc1(TypeTest._tc_A1);  tresult("+")
    io.tc1(TypeTest._tc_A2);  tresult("+")
    io.tc1(TypeTest._tc_A3);  tresult("+")
    io.tc1(TypeTest._tc_A4);  tresult("+")
    io.tc1(TypeTest._tc_A5);  tresult("+")
    io.tc1(TypeTest._tc_A6);  tresult("+")
    io.tc1(TypeTest._tc_A7);  tresult("+")
    io.tc1(TypeTest._tc_A8);  tresult("+")
    io.tc1(TypeTest._tc_A9);  tresult("+")
    io.tc1(TypeTest._tc_A10); tresult("+")

    io.tc1(TypeTest._tc_S2);  tresult("+")

    r = io.tc1(TypeTest._tc_S3)
    if r.equivalent(TypeTest._tc_S3):
        tresult("+")
    else:
        ok = 0
        tresult("-")

    io.tc1(TypeTest._tc_X1);  tresult("+")
    io.tc1(TypeTest._tc_X2);  tresult("+")
    io.tc1(TypeTest._tc_I);   tresult("+")
    io.tc1(TypeTest._tc_F1);  tresult("+")

    if ok: tpass()
    else:  tfail()


    tstart("Any")
    ok = 1

    a = CORBA.Any(TypeTest._tc_S1,
                  TypeTest.S1(1, 2, 3, 4, 5.6, 7.8, 1, "a", 9))
    r = io.any1(a)
    if r.value().c == 3:
        tresult("+")
    else:
        ok = 0
        tresult("-")

    i1 = TypeTest.S3(42, TypeTest.S3.U(0,None))
    i2 = TypeTest.S3(5,  TypeTest.S3.U(a=[i1]))
    i3 = TypeTest.S3(17, TypeTest.S3.U(a=[i2, i1]))
    a  = CORBA.Any(TypeTest._tc_S3, i3)
    r  = io.any1(a)

    if r.value().b.a[0].a == 5:
        tresult("+")
    else:
        ok = 0
        tresult("-")

    ji = J_i()
    jo = ji._this()
    a  = CORBA.Any(TypeTest._tc_J, jo)
    r  = io.any1(a)
    
    if r.value()._is_equivalent(jo):
        tresult("+")
    else:
        ok = 0
        tresult("-")

    id = poa.reference_to_id(jo)
    del ji, jo
    r = None
    poa.deactivate_object(id)

    a = CORBA.Any(CORBA._tc_IMP_LIMIT,
                  CORBA.IMP_LIMIT(12345,CORBA.COMPLETED_YES))
    r = io.any1(a)
    tresult(str(r.value()))

    if ok: tpass()
    else:  tfail()


    tstart("Invalid Any")
    ok = 1

    a = CORBA.Any(TypeTest._tc_S1,
                  TypeTest.S1(1, 2, "Hi", 4, 5.6, 7.8, 1, "a", 9))
    try:
        r  = io.any1(a)
        ok = 0
        tresult("-")
    except CORBA.BAD_PARAM:
        tresult("+")

    i1 = TypeTest.S3(42, TypeTest.S3.U(a="Hi"))
    i2 = TypeTest.S3(5,  TypeTest.S3.U(a=[i1]))
    i3 = TypeTest.S3(17, TypeTest.S3.U(a=[i2, i1]))
    a  = CORBA.Any(TypeTest._tc_S3, i3)

    try:
        r  = io.any1(a)
        ok = 0
        tresult("-")
    except CORBA.BAD_PARAM:
        tresult("+")

    if ok: tpass()
    else:  tfail()


    tstart("Empty Any")
    a = CORBA.Any(CORBA._tc_null, None)

    try:
        r = io.any1(a)
        tpass()
    except:
        tfail()


    tstart("Context")
    ok = 1
    try:
        ctxt = orb.get_default_context()
        ctxt.set_one_value("test", "hello")
        ctxt.set_one_value("test2", "there")
        ctxt.set_values({"foo": "wib", "foo2": "wob", "foobarbaz": "wuz"})

        r = io.context1(5, ctxt)
        if r == ["test", "hello"]:
            tresult("+")
        else:
            ok = 0
            tresult("-")

        r = io.context2(5, ctxt)
        if len(r) == 10:
            tresult("+")
        else:
            ok = 0
            tresult("-")
    except:
        ok = 0
        tresult("!")

    if ok:
        tpass()
    else:
        tfail()

    tdone()


if __name__ == "__main__":
    orb = CORBA.ORB_init(sys.argv, CORBA.ORB_ID)
    poa = orb.resolve_initial_references("RootPOA")
    poa._get_the_POAManager().activate()

    io = orb.string_to_object(sys.argv[1])

    doTests(orb, poa, io)

    if "-r" in sys.argv:
        print "\nRepeating tests..."
        output = 0
        while 1:
            doTests(orb, poa, io)
