#!/usr/bin/perl

use strict;
use warnings;
use diagnostics;

#use FileHandle;
#use IPC::Open2;

# colours for output
our $norm   = "";
#our $bold   = "";
our $green  = "";
our $red    = "";
#our $yellow = "";


our $tests = 0;

our $test_input;
our $expected_result;

sub read_input() {
  my $text = "";
  while (<>) {
    last if /^RESULT:/;
    $text .= $_;
  }
  return $text;
}

sub read_expected() {
  my $expected_result = <>;
  # strip begining whitespace
  $expected_result =~ s/^\s+//;
  # strip trailing whitespace
  $expected_result =~ s/\s+$//;
  return $expected_result;
}

our $basic_prog = "../type_check_test";
our $prog = $basic_prog;

while (<>) {

  if (/^OPTIONS:(.*)/) {
    $prog = "$basic_prog $1";
  }

  if (/^TEST:/) {
    $test_input = read_input;
    $expected_result = read_expected;

    if ($expected_result eq "success") {
      open (TYPECHECK, "| $prog");
      print TYPECHECK $test_input;

    } elsif ($expected_result eq "undefined") {
      open (TYPECHECK, "| $prog -u");
      print TYPECHECK $test_input;

    } elsif ($expected_result eq "redefinition") {
      open (TYPECHECK, "| $prog -r");
      print TYPECHECK $test_input;

    } elsif ($expected_result eq "wrong") {
      open (TYPECHECK, "| $prog -t");
      print TYPECHECK $test_input;

    } elsif ($expected_result eq "builtin") {
      open (TYPECHECK, "| $prog -b");
      print TYPECHECK $test_input;

    } else {
      print "Unknown expected result: \"$expected_result\"\n";
      next;
    }

    my $result = close (TYPECHECK);
    if (! $result) {
      print "\t[${red}FAILURE${norm}] in test $tests :\n$test_input\n";
      exit(1);
    }

    $tests++;
  }
}

print "\t\t\t\t[${green}SUCCESS${norm}]\n";




syntax highlighted by Code2HTML, v. 0.9.1