# file: runme.py
# Test various properties of classes defined in separate modules
import sys

print("Testing the %import directive")

import base
import foo
import bar
import spam

def write_flush(s):
    # Python 2/3 compatible write and flush
    sys.stdout.write(s)
    sys.stdout.flush()

# Create some objects

print("Creating some objects")

a = base.Base()
b = foo.Foo()
c = bar.Bar()
d = spam.Spam()

# Try calling some methods
print("Testing some methods")

write_flush("  Should see 'Base::A' ---> ")
a.A()
write_flush("  Should see 'Base::B' ---> ")
a.B()

write_flush("  Should see 'Foo::A' ---> ")
b.A()
write_flush("  Should see 'Foo::B' ---> ")
b.B()

write_flush("  Should see 'Bar::A' ---> ")
c.A()
write_flush("  Should see 'Bar::B' ---> ")
c.B()

write_flush("  Should see 'Spam::A' ---> ")
d.A()
write_flush("  Should see 'Spam::B' ---> ")
d.B()

# Try some casts

print("\nTesting some casts\n")

x = a.toBase()
write_flush("  Should see 'Base::A' ---> ")
x.A()
write_flush("  Should see 'Base::B' ---> ")
x.B()

x = b.toBase()
write_flush("  Should see 'Foo::A' ---> ")
x.A()

write_flush("  Should see 'Base::B' ---> ")
x.B()

x = c.toBase()
write_flush("  Should see 'Bar::A' ---> ")
x.A()

write_flush("  Should see 'Base::B' ---> ")
x.B()

x = d.toBase()
write_flush("  Should see 'Spam::A' ---> ")
x.A()

write_flush("  Should see 'Base::B' ---> ")
x.B()

x = d.toBar()
write_flush("  Should see 'Bar::B' ---> ")
x.B()

print("\nTesting some dynamic casts\n")
x = d.toBase()

y = foo.Foo.fromBase(x)
print("  Spam -> Base -> Foo : {} swig".format("bad" if y else "good"))

y = bar.Bar.fromBase(x)
print("  Spam -> Base -> Bar : {} swig".format("good" if y else "bad"))

y = spam.Spam.fromBase(x)
print("  Spam -> Base -> Spam : {} swig".format("good" if y else "bad"))

y = spam.Spam.fromBase(b)
print("  Foo -> Spam : {} swig".format("bad" if y else "good"))
