!759

p {
  O engine = run_overBot("#1002751");
  
  Lisp testCode = snlToTree(loadSnippet("#1002754"));
  L<Lisp> ops = snlSplitOps(testCode);
  int score = 0, total = 0;
  new L<Lisp> memory;
  for (int i = 0; i < l(ops); i += 2) {
    Lisp on = ops.get(i);
    Lisp say = ops.get(i+1);
    assertEquals("on *", on.head);
    assertEquals("say *", say.head);
    
    S sOn = snlFromTree(on.get(0));
    print("> " + sOn);
    Lisp out = cast restructure(call(engine, "quickrun", memory, sOn));
    S sOut = snlFromTree(out);
    S sSay = snlFromTree(say.get(0));
    print("< " + sOut);
    if (testOut(say.get(0), out)) {
      print("Hmm!");
      print("! " + sSay);
      print("# " + out);
      print("# " + say.get(0));
    } else {
      print("OK");
      ++score;
    }
    ++total;
  }
  
  print("Score: " + score + "/" + total);
}

static boolean testOut(Lisp say, Lisp out) {
  if (say.isA("* or *"))
    ret eq(say.get(0), out) || eq(say.get(1), out);
  else
    ret eq(say, out);
}