Include test machinery in the new build system.
[sod] / test / chimaera.sod
index 014df3e..ca775bc 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);
+}
+
+#define SOD_DECL(cls_, var_)                                           \
+  struct cls_##__ilayout var_##__layout;                               \
+  cls_ *var_ = cls_##__class->cls.init(&var_##__layout)
+
+int main(void)
+{
+  {
+    SOD_DECL(Lion, l);
+    provoke_lion(l);
+    tickle_animal(LION__CONV_NML(l));
+  }
+
+  {
+    SOD_DECL(Goat, g);
+    provoke_goat(g);
+    tickle_animal(GOAT__CONV_NML(g));
+  }
+
+  {
+    SOD_DECL(Serpent, s);
+    provoke_serpent(s);
+    tickle_animal(SERPENT__CONV_NML(s));
+  }
+
+  {
+    SOD_DECL(Chimaera, c);
+    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);
+}
+
+}