| from director_classic import * |
| |
| |
| class TargetLangPerson(Person): |
| |
| def __init__(self): |
| Person.__init__(self) |
| |
| def id(self): |
| identifier = "TargetLangPerson" |
| return identifier |
| |
| |
| class TargetLangChild(Child): |
| |
| def __init__(self): |
| Child.__init__(self) |
| |
| def id(self): |
| identifier = "TargetLangChild" |
| return identifier |
| |
| |
| class TargetLangGrandChild(GrandChild): |
| |
| def __init__(self): |
| GrandChild.__init__(self) |
| |
| def id(self): |
| identifier = "TargetLangGrandChild" |
| return identifier |
| |
| # Semis - don't override id() in target language |
| |
| |
| class TargetLangSemiPerson(Person): |
| |
| def __init__(self): |
| Person.__init__(self) |
| # No id() override |
| |
| |
| class TargetLangSemiChild(Child): |
| |
| def __init__(self): |
| Child.__init__(self) |
| # No id() override |
| |
| |
| class TargetLangSemiGrandChild(GrandChild): |
| |
| def __init__(self): |
| GrandChild.__init__(self) |
| # No id() override |
| |
| # Orphans - don't override id() in C++ |
| |
| |
| class TargetLangOrphanPerson(OrphanPerson): |
| |
| def __init__(self): |
| OrphanPerson.__init__(self) |
| |
| def id(self): |
| identifier = "TargetLangOrphanPerson" |
| return identifier |
| |
| |
| class TargetLangOrphanChild(OrphanChild): |
| |
| def __init__(self): |
| OrphanChild.__init__(self) |
| |
| def id(self): |
| identifier = "TargetLangOrphanChild" |
| return identifier |
| |
| |
| def check(person, expected): |
| |
| debug = 0 |
| # Normal target language polymorphic call |
| ret = person.id() |
| if (debug): |
| print(ret) |
| if (ret != expected): |
| raise RuntimeError( |
| "Failed. Received: " + str(ret) + " Expected: " + expected) |
| |
| # Polymorphic call from C++ |
| caller = Caller() |
| caller.setCallback(person) |
| ret = caller.call() |
| if (debug): |
| print(ret) |
| if (ret != expected): |
| raise RuntimeError( |
| "Failed. Received: " + str(ret) + " Expected: " + expected) |
| |
| # Polymorphic call of object created in target language and passed to C++ |
| # and back again |
| baseclass = caller.baseClass() |
| ret = baseclass.id() |
| if (debug): |
| print(ret) |
| if (ret != expected): |
| raise RuntimeError( |
| "Failed. Received: " + str(ret) + " Expected: " + expected) |
| |
| caller.resetCallback() |
| if (debug): |
| print("----------------------------------------") |
| |
| |
| person = Person() |
| check(person, "Person") |
| del person |
| |
| person = Child() |
| check(person, "Child") |
| del person |
| |
| person = GrandChild() |
| check(person, "GrandChild") |
| del person |
| |
| person = TargetLangPerson() |
| check(person, "TargetLangPerson") |
| del person |
| |
| person = TargetLangChild() |
| check(person, "TargetLangChild") |
| del person |
| |
| person = TargetLangGrandChild() |
| check(person, "TargetLangGrandChild") |
| del person |
| |
| # Semis - don't override id() in target language |
| person = TargetLangSemiPerson() |
| check(person, "Person") |
| del person |
| |
| person = TargetLangSemiChild() |
| check(person, "Child") |
| del person |
| |
| person = TargetLangSemiGrandChild() |
| check(person, "GrandChild") |
| del person |
| |
| # Orphans - don't override id() in C++ |
| person = OrphanPerson() |
| check(person, "Person") |
| del person |
| |
| person = OrphanChild() |
| check(person, "Child") |
| del person |
| |
| person = TargetLangOrphanPerson() |
| check(person, "TargetLangOrphanPerson") |
| del person |
| |
| person = TargetLangOrphanChild() |
| check(person, "TargetLangOrphanChild") |
| del person |