| using System; |
| |
| namespace director_classicNamespace { |
| |
| public class runme |
| { |
| static void Main() |
| { |
| { |
| Person person = new Person(); |
| check(person, "Person"); |
| person.Dispose(); |
| } |
| { |
| Person person = new Child(); |
| check(person, "Child"); |
| person.Dispose(); |
| } |
| { |
| Person person = new GrandChild(); |
| check(person, "GrandChild"); |
| person.Dispose(); |
| } |
| { |
| Person person = new TargetLangPerson(); |
| check(person, "TargetLangPerson"); |
| person.Dispose(); |
| } |
| { |
| Person person = new TargetLangChild(); |
| check(person, "TargetLangChild"); |
| person.Dispose(); |
| } |
| { |
| Person person = new TargetLangGrandChild(); |
| check(person, "TargetLangGrandChild"); |
| person.Dispose(); |
| } |
| |
| // Semis - don't override id() in target language |
| { |
| Person person = new TargetLangSemiPerson(); |
| check(person, "Person"); |
| person.Dispose(); |
| } |
| { |
| Person person = new TargetLangSemiChild(); |
| check(person, "Child"); |
| person.Dispose(); |
| } |
| { |
| Person person = new TargetLangSemiGrandChild(); |
| check(person, "GrandChild"); |
| person.Dispose(); |
| } |
| |
| // Orphans - don't override id() in C++ |
| { |
| Person person = new OrphanPerson(); |
| check(person, "Person"); |
| person.Dispose(); |
| } |
| { |
| Person person = new OrphanChild(); |
| check(person, "Child"); |
| person.Dispose(); |
| } |
| { |
| Person person = new TargetLangOrphanPerson(); |
| check(person, "TargetLangOrphanPerson"); |
| person.Dispose(); |
| } |
| { |
| Person person = new TargetLangOrphanChild(); |
| check(person, "TargetLangOrphanChild"); |
| person.Dispose(); |
| } |
| |
| // Duals - id() makes an upcall to the base id() |
| { |
| Person person = new TargetLangDualPerson(); |
| check(person, "TargetLangDualPerson + Person"); |
| person.Dispose(); |
| } |
| { |
| Person person = new TargetLangDualChild(); |
| check(person, "TargetLangDualChild + Child"); |
| person.Dispose(); |
| } |
| { |
| Person person = new TargetLangDualGrandChild(); |
| check(person, "TargetLangDualGrandChild + GrandChild"); |
| person.Dispose(); |
| } |
| |
| // Mix Orphans and Duals |
| { |
| Person person = new TargetLangDualOrphanPerson(); |
| check(person, "TargetLangDualOrphanPerson + Person"); |
| person.Dispose(); |
| } |
| { |
| Person person = new TargetLangDualOrphanChild(); |
| check(person, "TargetLangDualOrphanChild + Child"); |
| person.Dispose(); |
| } |
| } |
| |
| static void check(Person person, String expected) { |
| String ret; |
| // Normal target language polymorphic call |
| ret = person.id(); |
| if (debug) |
| Console.WriteLine(ret); |
| if (ret != expected) |
| throw new Exception("Failed. Received: " + ret + " Expected: " + expected); |
| |
| // Polymorphic call from C++ |
| Caller caller = new Caller(); |
| caller.setCallback(person); |
| ret = caller.call(); |
| if (debug) |
| Console.WriteLine(ret); |
| if (ret != expected) |
| throw new Exception("Failed. Received: " + ret + " Expected: " + expected); |
| |
| // Polymorphic call of object created in target language and passed to C++ and back again |
| Person baseclass = caller.baseClass(); |
| ret = baseclass.id(); |
| if (debug) |
| Console.WriteLine(ret); |
| if (ret != expected) |
| throw new Exception("Failed. Received: " + ret + " Expected: " + expected); |
| |
| caller.resetCallback(); |
| if (debug) |
| Console.WriteLine("----------------------------------------"); |
| } |
| static bool debug = false; |
| } |
| |
| public class TargetLangPerson : Person |
| { |
| public TargetLangPerson() |
| : base() |
| { |
| } |
| |
| public override String id() |
| { |
| String identifier = "TargetLangPerson"; |
| return identifier; |
| } |
| } |
| |
| public class TargetLangChild : Child |
| { |
| public TargetLangChild() |
| : base() |
| { |
| } |
| |
| public override String id() |
| { |
| String identifier = "TargetLangChild"; |
| return identifier; |
| } |
| } |
| |
| public class TargetLangGrandChild : GrandChild |
| { |
| public TargetLangGrandChild() |
| : base() |
| { |
| } |
| |
| public override String id() |
| { |
| String identifier = "TargetLangGrandChild"; |
| return identifier; |
| } |
| } |
| |
| // Semis - don't override id() in target language |
| public class TargetLangSemiPerson : Person |
| { |
| public TargetLangSemiPerson() |
| : base() |
| { |
| } |
| // No id() override |
| } |
| |
| public class TargetLangSemiChild : Child |
| { |
| public TargetLangSemiChild() |
| : base() |
| { |
| } |
| // No id() override |
| } |
| |
| public class TargetLangSemiGrandChild : GrandChild |
| { |
| public TargetLangSemiGrandChild() |
| : base() |
| { |
| } |
| // No id() override |
| } |
| |
| // Orphans - don't override id() in C++ |
| class TargetLangOrphanPerson : OrphanPerson |
| { |
| public TargetLangOrphanPerson() |
| : base() |
| { |
| } |
| |
| public override String id() |
| { |
| String identifier = "TargetLangOrphanPerson"; |
| return identifier; |
| } |
| } |
| |
| class TargetLangOrphanChild : OrphanChild |
| { |
| public TargetLangOrphanChild() |
| : base() |
| { |
| } |
| |
| public override String id() |
| { |
| String identifier = "TargetLangOrphanChild"; |
| return identifier; |
| } |
| } |
| |
| |
| // Duals - id() makes an upcall to the base id() |
| class TargetLangDualPerson : Person |
| { |
| public TargetLangDualPerson() |
| : base() |
| { |
| } |
| |
| public override String id() |
| { |
| String identifier = "TargetLangDualPerson + " + base.id(); |
| return identifier; |
| } |
| } |
| |
| class TargetLangDualChild : Child |
| { |
| public TargetLangDualChild() |
| : base() |
| { |
| } |
| |
| public override String id() |
| { |
| String identifier = "TargetLangDualChild + " + base.id(); |
| return identifier; |
| } |
| } |
| |
| class TargetLangDualGrandChild : GrandChild |
| { |
| public TargetLangDualGrandChild() |
| : base() |
| { |
| } |
| |
| public override String id() |
| { |
| String identifier = "TargetLangDualGrandChild + " + base.id(); |
| return identifier; |
| } |
| } |
| |
| // Mix Orphans and Duals |
| class TargetLangDualOrphanPerson : OrphanPerson |
| { |
| public TargetLangDualOrphanPerson() |
| : base() |
| { |
| } |
| |
| public override String id() |
| { |
| String identifier = "TargetLangDualOrphanPerson + " + base.id(); |
| return identifier; |
| } |
| } |
| |
| class TargetLangDualOrphanChild : OrphanChild |
| { |
| public TargetLangDualOrphanChild() |
| : base() |
| { |
| } |
| |
| public override String id() |
| { |
| String identifier = "TargetLangDualOrphanChild + " + base.id(); |
| return identifier; |
| } |
| } |
| |
| } |