summaryrefslogtreecommitdiff
path: root/Examples/test-suite/d/director_classic_runme.2.d
diff options
context:
space:
mode:
Diffstat (limited to 'Examples/test-suite/d/director_classic_runme.2.d')
-rw-r--r--Examples/test-suite/d/director_classic_runme.2.d202
1 files changed, 202 insertions, 0 deletions
diff --git a/Examples/test-suite/d/director_classic_runme.2.d b/Examples/test-suite/d/director_classic_runme.2.d
new file mode 100644
index 000000000..c50781b07
--- /dev/null
+++ b/Examples/test-suite/d/director_classic_runme.2.d
@@ -0,0 +1,202 @@
+module director_classic_runme;
+
+import std.exception;
+import std.stdio;
+import director_classic.Caller;
+import director_classic.Person;
+import director_classic.Child;
+import director_classic.GrandChild;
+import director_classic.OrphanPerson;
+import director_classic.OrphanChild;
+
+enum TRACE = false;
+
+void main() {
+ {
+ scope person = new Person();
+ check(person, "Person");
+ }
+ {
+ scope person = new Child();
+ check(person, "Child");
+ }
+ {
+ scope person = new GrandChild();
+ check(person, "GrandChild");
+ }
+ {
+ scope person = new TargetLangPerson();
+ check(person, "TargetLangPerson");
+ }
+ {
+ scope person = new TargetLangChild();
+ check(person, "TargetLangChild");
+ }
+ {
+ scope person = new TargetLangGrandChild();
+ check(person, "TargetLangGrandChild");
+ }
+
+ // Semis - don't override id() in target language
+ {
+ scope person = new TargetLangSemiPerson();
+ check(person, "Person");
+ }
+ {
+ scope person = new TargetLangSemiChild();
+ check(person, "Child");
+ }
+ {
+ scope person = new TargetLangSemiGrandChild();
+ check(person, "GrandChild");
+ }
+
+ // Orphans - don't override id() in C++
+ {
+ scope person = new OrphanPerson();
+ check(person, "Person");
+ }
+ {
+ scope person = new OrphanChild();
+ check(person, "Child");
+ }
+ {
+ scope person = new TargetLangOrphanPerson();
+ check(person, "TargetLangOrphanPerson");
+ }
+ {
+ scope person = new TargetLangOrphanChild();
+ check(person, "TargetLangOrphanChild");
+ }
+
+ // Duals - id() makes an upcall to the base id()
+ {
+ scope person = new TargetLangDualPerson();
+ check(person, "TargetLangDualPerson + Person");
+ }
+ {
+ scope person = new TargetLangDualChild();
+ check(person, "TargetLangDualChild + Child");
+ }
+ {
+ scope person = new TargetLangDualGrandChild();
+ check(person, "TargetLangDualGrandChild + GrandChild");
+ }
+
+ // Mix Orphans and Duals
+ {
+ scope person = new TargetLangDualOrphanPerson();
+ check(person, "TargetLangDualOrphanPerson + Person");
+ }
+ {
+ scope person = new TargetLangDualOrphanChild();
+ check(person, "TargetLangDualOrphanChild + Child");
+ }
+}
+
+void check(Person person, string expected) {
+ string ret;
+ // Normal D polymorphic call.
+ ret = person.id();
+ if (TRACE) writeln(ret);
+ enforce(ret == expected, "Failed. Received: " ~ ret ~ " Expected: " ~ expected);
+
+ // Polymorphic call from C++.
+ auto caller = new Caller();
+ caller.setCallback(person);
+ ret = caller.call();
+ if (TRACE) writeln(ret);
+ enforce(ret == expected, "Failed. Received: " ~ ret ~ " Expected: " ~ expected);
+
+ // Polymorphic call of object created in D and passed to C++ and back again.
+ Person baseclass = caller.baseClass();
+ ret = baseclass.id();
+ if (TRACE) writeln(ret);
+ enforce(ret == expected, "Failed. Received: " ~ ret ~ " Expected: " ~ expected);
+
+ caller.resetCallback();
+ if (TRACE)
+ writeln("----------------------------------------");
+}
+
+
+// »Full« target language persons.
+class TargetLangPerson : Person {
+ public override string id() {
+ return "TargetLangPerson";
+ }
+}
+
+class TargetLangChild : Child {
+ public override string id() {
+ return "TargetLangChild";
+ }
+}
+
+class TargetLangGrandChild : GrandChild {
+ public override string id() {
+ return "TargetLangGrandChild";
+ }
+}
+
+
+// Semis - don't override id() in target language
+class TargetLangSemiPerson : Person {
+ // No id() override
+}
+
+class TargetLangSemiChild : Child {
+ // No id() override
+}
+
+class TargetLangSemiGrandChild : GrandChild {
+ // No id() override
+}
+
+
+// Orphans - don't override id() in C++
+class TargetLangOrphanPerson : OrphanPerson {
+ public override string id() {
+ return "TargetLangOrphanPerson";
+ }
+}
+
+class TargetLangOrphanChild : OrphanChild {
+ public override string id() {
+ return "TargetLangOrphanChild";
+ }
+}
+
+
+// Duals - id() makes an upcall to the base id()
+class TargetLangDualPerson : Person {
+ public override string id() {
+ return "TargetLangDualPerson + " ~ super.id();
+ }
+}
+
+class TargetLangDualChild : Child {
+ public override string id() {
+ return "TargetLangDualChild + " ~ super.id();
+ }
+}
+
+class TargetLangDualGrandChild : GrandChild {
+ public override string id() {
+ return "TargetLangDualGrandChild + " ~ super.id();
+ }
+}
+
+
+// Mix Orphans and Duals
+class TargetLangDualOrphanPerson : OrphanPerson {
+ public override string id() {
+ return "TargetLangDualOrphanPerson + " ~ super.id();
+ }
+}
+
+class TargetLangDualOrphanChild : OrphanChild {
+ public override string id() {
+ return "TargetLangDualOrphanChild + " ~ super.id();
+ }
+}