!% ! CZECH: Comprehensive Z-machine Emulation CHecker
!%
!! Tests that don't require user interaction
!! (OK, choosing input/output filenames once might be required.)
!! It allows you to test most of the Z-machine functionality without
!! lots of typing.
!! The point here is to give users a quick test they can run over & over
!! again after making small changes to a growing interpreter.
!!
!! Amir Karger
!! See README.txt for license. (Basically, use/copy/modify, but be nice.)

Include "test_harness.h";
Include "no_inter.h";

! Name of input file to (tell user to) use
Constant INFILE "big_test.in";

! ----------------------------------------------------------------------
! MAIN calls a bunch of subs. Each one runs a set of related tests.
!---------------------- MAIN

[ Main use_input_file use_output_streams;

   start_test();
   Testnum++; Print_Tests++; ! Perl wants first test to be 1
   @print "1..476^";
   @print "Testing only non-interactive functionality.^";

   pt();
   @print "^print works or you wouldn't be seeing this.^^";

!   Standard = 0->50;
!   if(0->50 || 0->51)
!      print "Standard ", 0->50, ".", 0->51, " ";
!   print "interpreter ", 0->30, (char) 0->31;

   ! Now test sets of functionality.
   ! Argument of 1 means do tests, 0 means DON'T do the tests
   ! Note that there may be stack ops,e.g., in the arithmetic test, and
   ! those won't get skipped just because you call test_stack with '0'.
   ! MOST tests in earlier subs won't
   ! depend on functionality tested in later subs, but simple
   ! jump, stack, call, print functionality is needed for almost all tests.
   test_jumps(1); @print "^";
   test_variables(1); @print "^";
   test_arithmetic(1); @print "^";
   test_logical(1); @print "^";
   test_memory(1); @print "^";
   test_subroutines(1); @print "^";
   test_objects(1); @print "^";
   test_indirect(1); @print "^";
   test_misc(1); @print "^";

   ! Set to zero to require user to type (e.g., if input_stream doesn't work).
   ! Usually interactive typing should happen in interact.inf, though.
   use_input_file = 1;
   @jz use_input_file ?no_i_f1;
   print "^Opening input stream ";
   print "(Use input file ";
   @print_paddr INFILE;
   print ")";
   @input_stream 1;
   .no_i_f1;

   ! Set to zero to not use output streams 2 & 4
   use_output_streams = 0;
   test_open_output_streams(use_output_streams); @print "^";
   test_non_interactive_read(1); @print "^";
   test_close_output_streams(use_output_streams); @print "^";

   ! Close the input file if you opened it
   @jz use_input_file ?no_i_f2;
   @input_stream 0;
   .no_i_f2;

   ! Print statistics
   Testnum--; Print_Tests--; ! Fix munging above: Perl wants first test to be 1
   end_test();

   print "Didn't crash: hooray!^";
   print "Last test: quit!^";
   @quit;
   .bad_quit;
   print "Quit didn't work!^";
   rtrue;
];

! vim: tw=78 sw=3