#!/usr/bin/perl -w # test.pl - Don Yang (uguu.org) # # Compare script output with reference image. # # ./test.pl # # 12/30/09 use strict; use Time::HiRes qw{time}; my $REFERENCE_SOURCE = "kazari1.ml"; my $REFERENCE_OUTPUT = "reference.ppm"; my $TEMPORARY_SOURCE = "test_tmp.ml"; my $TEMPORARY_BINARY = "./test_tmp.exe"; die "$0 \n" unless $#ARGV == 0; # Run program to generate image with fixed seed sub create_image($) { my ($script) = @_; # Load input my ($file); open $file, "< $script" or die $!; my $data = join '', <$file>; close $file; # Make program deterministic $data =~ s/([A-Z]\w*)\.self_init\(\)/$1.init 999983/g or die "Can not replace random seed\n"; # Compile output open $file, "> $TEMPORARY_SOURCE" or die $!; print $file $data; close $file; system "ocamlopt -w A -o $TEMPORARY_BINARY $TEMPORARY_SOURCE"; die "Failed to compile $TEMPORARY_SOURCE: $?\n" if $?; # Capture output my $start_time = time; $data = join '', `$TEMPORARY_BINARY`; die "Error running $TEMPORARY_BINARY: $?\n" if $?; print "Running time = ", (time - $start_time), " seconds\n"; return $data; } # Load reference image, or create new reference image sub load_reference() { if( -s $REFERENCE_OUTPUT ) { my $file; open $file, "< $REFERENCE_OUTPUT" or die $!; my $image = join '', <$file>; close $file; return $image; } else { print "Creating new $REFERENCE_OUTPUT\n"; my $image = create_image($REFERENCE_SOURCE); my $file; open $file, "> $REFERENCE_OUTPUT" or die $!; print $file $image; close $file; return $image; } } # Compare script output with reference image my $expected = load_reference(); my $actual = create_image($ARGV[0]); if( $expected ne $actual ) { die "Output mismatched\n"; } print "All ok\n";