!! Test lots of Language::Zcode functionality
!! Stolen from CZECH: Comprehensive Z-machine Emulation CHecker

Include "test.h";
Include "interact.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 i;

   ! Set to zero to not use output streams 2 & 4
   use_output_streams = 1;

   i = input_char("Type 1 to use input file, 0 to input from keyboard.^");
   use_input_file = 0;
   @je i '1' ?~no_i_f0;
   use_input_file = 1;
   .no_i_f0;

   ! Setup testing, print header, zero counters, etc.
   start_test();

   ! Open output streams 2 & 4 if so requested so all tests print there
   test_open_output_streams(use_output_streams); @print "^";

   ! Now test sets of functionality.
   ! Argument of 1 means do tests, 0 means DON'T do the 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 "^";

   @jz use_input_file ?no_i_f1;
   print "^Opening input stream. Use input file ";
   @print_paddr INFILE;
   @input_stream 1;
   .no_i_f1;

   test_non_interactive_read(1); @print "^";

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

   ! Separate non-I/O tests from print stuff
   @print "^^";
   test_header(1); @print "^";
   test_print(1); @print "^";

   ! Close output file(s) if necessary
   test_close_output_streams(use_output_streams); @print "^";

   ! Print statistics
   end_test();

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

! TODO this should be in test.h
[ input_char str j;
   @check_arg_count 1 ?~no_str;
   @print_paddr str;
   .no_str;
   print "^>";
   ! Get user input
   ! v1-4, byte 0 has max letters to be typed MINUS 1
   ! In 5+, byte 0 has max letters typed
   @storeb mytable 0 100; ! number of characters allowed
   @storeb mysecond 0 20; ! number of tokens allowed
   ! Use 'read' instead of '@read' so it works in Inform for v3 AND v5
   ! Should really use read_char but it's not working yet in Plotz
   read mytable mysecond;
#Ifdef V5PLUS;
   @loadb mytable 2 -> j;
#Ifnot;
   @loadb mytable 1 -> j;
#Endif;

   return j;
];
! vim: tw=78 sw=3