test/chimaera.sod: Attach some driver code to test it.
authorMark Wooding <mdw@distorted.org.uk>
Sat, 15 Aug 2015 22:46:31 +0000 (23:46 +0100)
committerMark Wooding <mdw@distorted.org.uk>
Sat, 15 Aug 2015 22:46:31 +0000 (23:46 +0100)
Surprisingly, this actually works.

test/chimaera.sod

index 014df3e..63602d8 100644 (file)
@@ -45,3 +45,70 @@ class Serpent : Animal {
 class Chimaera : Lion, Goat, Serpent {
 }
 
+code c : user [classes end, user, epilogue] {
+/*----- Main driver code --------------------------------------------------*/
+
+static void tickle_animal(Animal *a)
+{
+  int i;
+
+  for (i = 0; i < 3; i++) {
+    printf("tickle %s #%d...\n", a->_vt->_class->cls.name, i);
+    a->_vt->nml.tickle(a);
+  }
+}
+
+static void provoke_lion(Lion *l)
+{
+  printf("provoking %s as a lion\n", l->_vt->_class->cls.name);
+  l->_vt->lion.bite(l);
+}
+
+static void provoke_goat(Goat *g)
+{
+  printf("provoking %s as a goat\n", g->_vt->_class->cls.name);
+  g->_vt->goat.butt(g);
+}
+
+static void provoke_serpent(Serpent *s)
+{
+  printf("provoking %s as a serpent\n", s->_vt->_class->cls.name);
+  s->_vt->serpent.bite(s);
+}
+
+int main(void)
+{
+  {
+    struct Lion__ilayout ll;
+    Lion *l = Lion__class->cls.init(&ll);
+    provoke_lion(l);
+    tickle_animal(LION__CONV_NML(l));
+  }
+
+  {
+    struct Goat__ilayout gg;
+    Goat *g = Goat__class->cls.init(&gg);
+    provoke_goat(g);
+    tickle_animal(GOAT__CONV_NML(g));
+  }
+
+  {
+    struct Serpent__ilayout ss;
+    Serpent *s = Serpent__class->cls.init(&ss);
+    provoke_serpent(s);
+    tickle_animal(SERPENT__CONV_NML(s));
+  }
+
+  {
+    struct Chimaera__ilayout cc;
+    Chimaera *c = Chimaera__class->cls.init(&cc);
+    provoke_lion(CHIMAERA__CONV_LION(c));
+    provoke_goat(CHIMAERA__CONV_GOAT(c));
+    provoke_serpent(CHIMAERA__CONV_SERPENT(c));
+    tickle_animal(CHIMAERA__CONV_NML(c));
+  }
+
+  return (0);
+}
+
+}