#!/usr/bin/perl -w
# Last update: 04.01.2003 (Jacek.Kobus@phys.uni.torun.pl)

# This script prints a list of available tests of the x2dhf program
# and performs a selected test or performs all the tests. It can also
# be used to stops the running test.

# In order to enlarge a list of available test add an entry to the
# hash table %tests and a corresponding procedure (its name consists
# of run_ and a keyword of the entry)

$tests{"Be"} = "-1";
$tests{"BF_a"} = "-1";
$tests{"BF_b"} = "-1";
$tests{"BF_c"} = "-1";
$tests{"BeF"} = "-1";
$tests{"BO"} = "-1";
$tests{"C"} = "-1";
$tests{"Cplus"} = "-1";
$tests{"C2"} = "-1";
$tests{"F2"} = "-1";
$tests{"H2"} = "-1";
$tests{"FH_finite_field"} = "-1";
$tests{"Li2"} = "-1";
$tests{"N2"} = "-1";
$tests{"Th89_1s"} = "-1";
$tests{"Th89_2s"} = "-1";
$tests{"GaF"} = "-1";

$debug="no";
$bg="&";

$i=0;
print ("\n Choose a test to be performed: \n");
foreach $k (sort keys %tests) {
    $i++;
    $tests{$k}=$i;
    printf "%10.lu % s %s \n",$tests{$k}," - ", $k;
}
$tests{"stop"} = "0";

printf  " %s \n", "      all  -  perform the tests excluding FH and GaF";
printf  " %s \n", "      ALL  -  perform ALL the tests";
$zero=0;
printf  "\n%10s %s \n\n", $zero, " -  stop a running program";



print "  ? "; 


while(<>) {
    chop;

    if ( $_ eq "ALL" ) {
	$bg="";
	print ("\n\n Running ALL the tests in the foreground: \n\n");
	foreach $k (sort keys %tests) {
	    if ($k ne "stop") {
		$subname="run_" . $k . "()"; 
		print ($k,":\n");
		eval $subname;
		print ("\n\n");
	    };
	};
	exit;
    };

    if ( $_ eq "all" ) {
	$bg="";
	print ("\n\n Running selected tests in the foreground: \n\n");
	foreach $k (sort keys %tests) {
	    if ($k ne "stop" && $k ne "FH_finite_field" && $k ne "GaF") {
		$subname="run_" . $k . "()"; 
		print ($k,":\n");
		eval $subname;
		print ("\n\n");
	    };
	};
	exit;
    };


    if ( $_ eq "0" ) {
	print  ("   touch ./bin/stop_x2dhf \n");
	system ("   touch ./bin/stop_x2dhf \n");
	exit;
    };
    foreach $k (sort keys %tests) {
	if ($tests{$k} eq $_) {
	    $subname="run_" . $k . "()"; 
	    print ("Running the test in the background: \n");
	    eval $subname;
	    exit;
	};
    };
    print "  ? "; 
    next;
};

sub run_Be {
    print ("   cp ./examples/be/be.data ./bin/ \n");
    print ("   cd ./bin; ./xhf be be-1 > be-test.output  $bg \n\n");
    
    if ($debug eq "no") {
	system ("cp ./examples/be/be.data ./bin/");
	system ("cd ./bin; ./xhf be be-1 > be-test.output $bg ");
    };

    print ("   The test is underway. When it complets compare \n");
    print ("   ./examples/be/be.output and  ./bin/be-test.output \n");
};

sub run_BeF {
    print ("   cp ./examples/be/bef.data ./bin/ \n");
    print ("   cd ./bin; ./xhf bef bef-1 > bef-test.output  $bg \n\n");
    
    if ($debug eq "no") {
	system ("cp ./examples/bef/bef.data ./bin/");
	system ("cd ./bin; ./xhf bef bef-1 > bef-test.output $bg ");
    };
    
    print ("   The test is underway. When it complets compare \n");
    print ("   ./examples/be/bef.output and  ./bin/bef-test.output \n");
};

sub run_BF_a {
    print ("   cp ./examples/bf/bf_g94.data ./bin/ \n");
    print ("   cp ./examples/bf/bf_g94.out ./bin/gauss94.out \n");
    print ("   cp ./examples/bf/bf_g94.pun ./bin/gauss94.pun \n");
    print ("   cd ./bin; ./xhf bf_g94 bf_g94-1 > bf_g94-test.output  $bg \n\n");
    
    if ($debug eq "no") {
	system ("cp ./examples/bf/bf_g94.data ./bin/ \n");
	system ("cp ./examples/bf/bf_g94.out ./bin/gauss94.out \n");
	system ("cp ./examples/bf/bf_g94.pun ./bin/gauss94.pun \n");
	system ("cd ./bin; ./xhf bf_g94 bf_g94-1 > bf_g94-test.output $bg \n");
    };
    
    print ("   The test is underway. When it complets compare \n");
    print ("   ./examples/bf/bf_g94.output and  ./bin/bf_g94-test.output \n");
};

sub run_BF_b {
    print ("   cp ./examples/bf/bf_g94l.data ./bin/ \n");
    print ("   cp ./examples/bf/bf_g94la.out ./bin/gauss94l.out \n");
    print ("   cd ./bin; ./xhf bf_g94l bf_g94l-1 > bf_g94la-test.output  $bg \n\n");
    
    if ($debug eq "no") {
	system ("cp ./examples/bf/bf_g94l.data ./bin/ \n");
	system ("cp ./examples/bf/bf_g94la.out ./bin/gauss94l.out \n");
	system ("cd ./bin; ./xhf bf_g94l bf_g94l-1 > bf_g94la-test.output $bg  \n");
    };
    
    print ("   The test is underway. When it complets compare \n");
    print ("   ./examples/bf/bf_g94la.output and  ./bin/bf_g94la-test.output \n");
};

sub run_BF_c {
    print ("   cp ./examples/bf/bf_g94l.data ./bin/ \n");
    print ("   cp ./examples/bf/bf_g94lb.out ./bin/gauss94l.out \n");
    print ("   cd ./bin; ./xhf bf_g94l bf_g94l-1 > bf_g94lb-test.output  $bg \n\n");
    
    if ($debug eq "no") {
	system ("cp ./examples/bf/bf_g94l.data ./bin/ \n");
	system ("cp ./examples/bf/bf_g94lb.out ./bin/gauss94l.out \n");
	system ("cd ./bin; ./xhf bf_g94l bf_g94l-1 > bf_g94lb-test.output $bg  \n");
    };

    print ("   The test is underway. When it complets compare \n");
    print ("   ./examples/bf/bf_g94lb.output and  ./bin/bf_g94lb-test.output \n");
};

sub run_BO {
    print ("   cp ./examples/bo/bo.data ./bin/ \n");
    print ("   cp ./examples/bo/bo.out ./bin/gauss94.out \n");
    print ("   cp ./examples/bo/bo.pun ./bin/gauss94.pun \n");
    print ("   cd ./bin; ./xhf bo bo-1 > bo-test.output  $bg \n\n");
    
    if ($debug eq "no") {
        system ("cp ./examples/bo/bo.data ./bin/ \n");
        system ("cp ./examples/bo/bo.out ./bin/gauss94.out \n");
        system ("cp ./examples/bo/bo.pun ./bin/gauss94.pun \n");
        system ("cd ./bin; ./xhf bo bo-1 > bo-test.output $bg  \n");
    };
    print ("   The test is underway. When it complets compare \n");
    print ("   ./examples/bo/bo.output and  ./bin/bo-test.output \n");
};

sub run_C {
    print ("   cp ./examples/c/c.data ./bin/ \n");
    print ("   cd ./bin; ./xhf c c-1 > c-test.output  $bg \n\n");
    
    if ($debug eq "no") {
        system ("cp ./examples/c/c.data ./bin/ \n");
        system ("cd ./bin; ./xhf c c-1 > c-test.output $bg  \n");
    };
    print ("   The test is underway. When it complets compare \n");
    print ("   ./examples/c/c.output and  ./bin/c-test.output \n");
};

sub run_Cplus {
    print ("   cp ./examples/c/cplus.data ./bin/ \n");
    print ("   cd ./bin; ./xhf cplus cplus-1 > cplus-test.output  $bg \n\n");
    
    if ($debug eq "no") {
	system ("cp ./examples/c/cplus.data ./bin/ \n");
        system ("cd ./bin; ./xhf cplus cplus-1 > cplus-test.output $bg  \n");
    };
      
    print ("   The test is underway. When it complets compare \n");
    print ("   ./examples/c/cplus.output and  ./bin/cplus-test.output \n");
};

sub run_C2 {
    print ("   cp ./examples/c2/c2a.data ./bin/ \n");
    print ("   cd ./bin; ./xhf c2a c2a-1 > c2a-test.output  $bg \n\n");
    print ("   cp ./examples/c2/c2.out ./bin/gauss94.out \n");
    print ("   cp ./examples/c2/c2.pun ./bin/gauss94.pun \n");

    if ($debug eq "no") {
        system ("cp ./examples/c2/c2a.data ./bin/ \n");
        system ("cd ./bin; ./xhf c2a c2a-1 > c2a-test.output $bg  \n");
        system ("   cp ./examples/c2/c2.out ./bin/gauss94.out \n");
        system ("   cp ./examples/c2/c2.pun ./bin/gauss94.pun \n");
    };
    print ("   The test is underway. When it complets compare \n");
    print ("   ./examples/c2/c2a.output and  ./bin/c2a-test.output \n");
    print ("and run the rest of the tests (see c2b.data and c2c.data) \n");
};

sub run_F2 {
    print ("   cp ./examples/f2/f2.data ./bin/ \n");
    print ("   cp ./examples/f2/f2.out ./bin/gauss94.out \n");
    print ("   cp ./examples/f2/f2.pun ./bin/gauss94.pun \n");
    print ("   cd ./bin; ./xhf f2 f2-1 > f2-test.output  $bg \n\n");
    
    if ($debug eq "no") {
	system ("cp ./examples/f2/f2.data ./bin/ \n");
        system ("cp ./examples/f2/f2.out ./bin/gauss94.out \n");
        system ("cp ./examples/f2/f2.pun ./bin/gauss94.pun \n");
        system ("cd ./bin; ./xhf f2 f2-1 > f2-test.output $bg  \n");
    };
    
    print ("   The test is underway. When it complets compare \n");
    print ("   ./examples/f2/f2.output and  ./bin/f2-test.output \n");
};

sub run_H2 {
    print ("   cp ./examples/h2/h2.data ./bin/ \n");
    print ("   cd ./bin; ./xhf h2 h2-1 > h2-test.output  $bg \n\n");

    if ($debug eq "no") {
        system ("cp ./examples/h2/h2.data ./bin/ \n");
        system ("cd ./bin; ./xhf h2 h2-1 > h2-test.output $bg  \n");
    };
    print ("   The test is underway. When it complets compare \n");
    print ("   ./examples/h2/h2.output and  ./bin/h2-test.output \n");
};

sub run_FH_finite_field {
    print ("   cp ./examples/hf/fh*.data ./bin/ \n");
    print ("   cp ./examples/fh/Run_FH ./bin/ \n");
    print ("   cp ./perl_scripts/fh/Run_elprop ./bin/ \n");
    print ("   cp ./perl_scripts/fh/elprop.pl ./bin/ \n");
    print ("   cd ./bin; ./Run_FH   $bg \n\n");

    if ($debug eq "no") {
        system ("   cp ./examples/fh/fh*.data ./bin/ \n");
        system ("   cp ./examples/fh/Run_FH ./bin/ \n");
        system ("   cp ./perl_scripts/fh/Run_elprop ./bin/ \n");
        system ("   cp ./perl_scripts/fh/elprop.pl ./bin/ \n");
        system ("   cd ./bin; ./Run_FH  $bg  \n");
    };

    print ("   The test is underway. When it complets compare \n");
    print ("   ./examples/fh/fh.output and  ./bin/fh-test.output \n");
};


sub run_GaF {
    print ("   cp ./examples/gaf/gaf.data ./bin/ \n");
    print ("   cd ./bin; ./xhf gaf gaf-1 > gaf-test.output  $bg \n\n");
    
    if ($debug eq "no") {
	system ("cp ./examples/gaf/gaf.data ./bin/ \n");
	system ("cd ./bin; ./xhf gaf gaf-1 > gaf-test.output $bg  \n");
    };
    
    print ("   The test is underway. When it complets compare \n");
    print ("   ./examples/gaf/gaf.output and  ./bin/gaf-test.output \n");
};

sub run_Li2 {
    print ("   cp ./examples/li2/li2.data ./bin/ \n");
    print ("   cp ./examples/li2/li2.out ./bin/gauss94.out \n");
    print ("   cp ./examples/li2/li2.pun ./bin/gauss94.pun \n");
    print ("   cd ./bin; ./xhf li2 li2-1 > li2-test.output  $bg \n\n");

    if ($debug eq "no") {
	system ("cp ./examples/li2/li2.data ./bin/ \n");
	system ("cp ./examples/li2/li2.out ./bin/gauss94.out \n");
        system ("cp ./examples/li2/li2.pun ./bin/gauss94.pun \n");
        system ("cd ./bin; ./xhf li2 li2-1 > li2-test.output $bg  \n");
    };

    print ("   The test is underway. When it complets compare \n");
    print ("   ./examples/li2/li2.output and  ./bin/li2-test.output \n");
};

sub run_N2 {
    print ("   cp ./examples/n2/n2.data ./bin/ \n");
    print ("   cd ./bin; ./xhf n2 n2-1 > n2-test.output  $bg \n\n");
    
    if ($debug eq "no") {
        system ("cp ./examples/n2/n2.data ./bin/ \n");
        system ("cd ./bin; ./xhf n2 n2-1 > n2-test.output $bg  \n");
    };
      
    print ("   The test is underway. When it complets compare \n");
    print ("   ./examples/n2/n2.output and  ./bin/n2-test.output \n");
};

sub run_Th89_1s {
    print ("   cp ./examples/th89/th89_1s.data ./bin/ \n");
    print ("   cd ./bin; ./xhf/th89_1s th89_1s th89_1s-1 > th89_1s-test.output  $bg \n\n");
    
    if ($debug eq "no") {
        system ("cp ./examples/th89/th89_1s.data ./bin/ \n");
        system ("cd ./bin; ./xhf th89_1s th89_1s-1 > th89_1s-test.output $bg  \n");
    };
    print ("   The test is underway. When it complets compare \n");
    print ("   ./examples/th89/th89_1s.output and  ./bin/th89_1s-test.output \n");
};

sub run_Th89_2s {
    print ("   cp ./examples/th89/th89_2s.data ./bin/ \n");
    print ("   cd ./bin; ./xhf th89_2s th89_2s-1 > th89_2s-test.output $bg \n\n");

    
    if ($debug eq "no") {
	system ("cp ./examples/th89/th89_2s.data ./bin/ \n");
        system ("cd ./bin; ./xhf th89_2s th89_1s-1 th89_2s > th89_2s-test.output $bg");
    };

    print ("   The test is underway. When it complets compare \n");
    print ("   ./examples/th89/th89_2s.output and  ./bin/th89_2s-test.output \n");
};



