#!/usr/bin/perl -w

# Tests the Term::ShellUI tokenizer/parser.
# Pass the indexes of the tests you want to run as arguments.
# If no arguments supplied, runs all tests.
# If arguments supplied, verbosely displays results.

use strict;

use lib '.';
use Parse;
use lib '../lib';
use Text::Shellwords::Cursor;

use FreezeThaw qw(freeze cmpStr);
use YAML qw(Dump);

my $parser = Text::Shellwords::Cursor->new();
die "No parser" unless $parser;

# Parse cmdline args
my %seltest;
for(@ARGV) { $seltest{$_} = 1; }
my $verbose = 1, $parser->{debug} = 1 if @ARGV;

print "\nTest Result\n---------------------------------\n" unless $verbose;

my($ntests, $nfail) = (0,0);
for my $input (sort keys %Parse::Tests) {
    my($index,$cpos,$test) = $input =~ /^(\d+):(\d*):(.*)$/;
    die "No test in item $index:    $input\n" unless defined $test;
    next if %seltest && !exists($seltest{0+$index});

    my($toks, $tokno, $tokoff) = $parser->parse_line($test, messages=>$verbose, cursorpos=>$cpos);
    my $result = [$toks, $tokno, $tokoff];
    my $eq = 0 == cmpStr($result, $Parse::Tests{$input});
    
    if($verbose) {
        print "\nTest $index: $test cursor=$cpos\n";
        print "Expected output: " . freeze($Parse::Tests{$input}) . "\n";
        print Dump($Parse::Tests{$input});
        print "Received output: " . freeze($result) . "\n";
        print Dump($result);
    } else {
        printf("%2d: %s    $test\n", $index, ($eq ? 'OK  ' : 'FAIL'));
    }

    $ntests++;
    $nfail++ unless $eq;
}

print "\n\n$ntests test" . ($ntests == 1 ? "" : "s") ." run, ";
print "$nfail failure" . ($nfail == 1 ? "" : "s") . ".\n\n";

