06983f1996-09-22Fredrik Hübinette (Hubbe) #!/usr/local/bin/pike #include <simulate.h>
e9361f1995-11-06Fredrik Hübinette (Hubbe) 
c7dbb61996-06-09Fredrik Hübinette (Hubbe) #if !efun(_verify_internals) #define _verify_internals() #endif
a9679f1995-11-13David Hedbor  int main(int argc, string *argv) {
c7dbb61996-06-09Fredrik Hübinette (Hubbe)  int e, verbose, successes, errors, t, check;
a9679f1995-11-13David Hedbor  string *tests; program testprogram; int start, fail; for(e=1;e<argc;e++) {
a67f2f1996-05-16Fredrik Hübinette (Hubbe)  string opt; int arg; arg=1; if(sscanf(argv[e],"--%s=%d",opt,arg)==2) opt="--"+opt; else if(sscanf(argv[e],"-%s%d",opt,arg)==2) opt="-"+opt; else opt=argv[e]; switch(opt)
a9679f1995-11-13David Hedbor  { case "-h": case "--help": perror("Usage: "+argv[e]+" [-v | --verbose] [-h | --help] [-t <testno>] <testfile>\n"); return 0; case "-v": case "--verbose":
a67f2f1996-05-16Fredrik Hübinette (Hubbe)  verbose+=arg;
a9679f1995-11-13David Hedbor  break; case "-s": case "--start-test":
a67f2f1996-05-16Fredrik Hübinette (Hubbe)  start=arg;
a9679f1995-11-13David Hedbor  start--; break; case "-f": case "--fail":
a67f2f1996-05-16Fredrik Hübinette (Hubbe)  fail+=arg;
a9679f1995-11-13David Hedbor  break; case "-t": case "--trace":
a67f2f1996-05-16Fredrik Hübinette (Hubbe)  t+=arg;
e9361f1995-11-06Fredrik Hübinette (Hubbe)  break;
c7dbb61996-06-09Fredrik Hübinette (Hubbe)  case "-c": case "--check": check++;
a9679f1995-11-13David Hedbor  break; default: if(tests) {
03764e1996-11-12Fredrik Hübinette (Hubbe)  perror("Unknown argument: "+opt+".\n");
a9679f1995-11-13David Hedbor  exit(1); } tests=(read_bytes(argv[e])||"")/"\n....\n"; } }
06983f1996-09-22Fredrik Hübinette (Hubbe)  if(!tests) { tests=(clone((program)"/precompiled/file","stdin")->read(0x7fffffff)||"")/"\n....\n"; }
2625671996-09-23Fredrik Hübinette (Hubbe)  if(!tests)
06983f1996-09-22Fredrik Hübinette (Hubbe)  { perror("Failed to read test file!\n"); exit(1); } tests=tests[0..sizeof(tests)-2];
a9679f1995-11-13David Hedbor  for(e=start;e<sizeof(tests);e++) {
a67f2f1996-05-16Fredrik Hübinette (Hubbe)  string test,condition;
a9679f1995-11-13David Hedbor  int type; object o; mixed a,b;
c7dbb61996-06-09Fredrik Hübinette (Hubbe)  if(check) _verify_internals();
a67f2f1996-05-16Fredrik Hübinette (Hubbe)  test=tests[e]; if(sscanf(test,"COND %s\n%s",condition,test)==2) { if(!clone(compile_string("mixed c() { return "+condition+"; }","Cond "+(e+1)))->c()) { if(verbose) perror("Not doing test "+(e+1)+"\n"); successes++; continue; } } sscanf(test,"%s\n%s",type,test);
a9679f1995-11-13David Hedbor  sscanf(type,"%*s expected result: %s",type); if(verbose) { perror("Doing test "+(e+1)+"\n"); if(verbose>1) perror(test+"\n"); }
c7dbb61996-06-09Fredrik Hübinette (Hubbe)  if(check > 1) _verify_internals();
a9679f1995-11-13David Hedbor  switch(type) { case "COMPILE_ERROR": master()->set_inhibit_compile_errors(1); if(catch(compile_string(test,"Test "+(e+1)))) { successes++; }else{ perror("Test "+(e+1)+" failed.\n"); perror(test+"\n"); errors++; } master()->set_inhibit_compile_errors(0); break; case "EVAL_ERROR": master()->set_inhibit_compile_errors(1); if(catch(clone(compile_string(test,"Test "+(e+1)))->a())) { successes++; }else{ perror("Test "+(e+1)+" failed.\n"); perror(test+"\n"); errors++; } master()->set_inhibit_compile_errors(0); break; default: o=clone(compile_string(test,"Test "+(e+1)));
c7dbb61996-06-09Fredrik Hübinette (Hubbe)  if(check > 1) _verify_internals();
a9679f1995-11-13David Hedbor  a=b=0; if(t) trace(t); if(functionp(o->a)) a=o->a(); if(functionp(o->b)) b=o->b(); if(t) trace(0);
c7dbb61996-06-09Fredrik Hübinette (Hubbe)  if(check > 1) _verify_internals();
a9679f1995-11-13David Hedbor  switch(type) { case "FALSE": a=!a; case "TRUE": if(!a) { perror("Test "+(e+1)+" failed.\n"); perror(test+"\n"); errors++; }else{ successes++; } break; case "RUN": successes++; break; case "EQ": if(a!=b) { perror("Test "+(e+1)+" failed.\n"); perror(test+"\n"); perror(sprintf("o->a(): %O\n",a)); perror(sprintf("o->b(): %O\n",b)); errors++; }else{ successes++; } break; case "EQUAL": if(!equal(a,b)) { perror("Test "+(e+1)+" failed.\n"); perror(test+"\n"); perror(sprintf("o->a(): %O\n",a)); perror(sprintf("o->b(): %O\n",b)); errors++; }else{ successes++; } break; default: perror(sprintf("Unknown test type (%O).\n",type)); errors++; } }
c7dbb61996-06-09Fredrik Hübinette (Hubbe)  if(check > 2) _verify_internals();
a9679f1995-11-13David Hedbor  if(fail && errors) exit(1); } if(errors + successes != sizeof(tests)) { perror("Errors + Successes != number of tests!\n"); errors++; }
c7dbb61996-06-09Fredrik Hübinette (Hubbe) 
a9679f1995-11-13David Hedbor  if(errors || verbose) { perror("Failed tests: "+errors+".\n"); } return errors; }