#!/usr/bin/env perl -Tw use strict; use lib 't'; use Parse; use Test::Simple tests => 0+keys(%Parse::Tests); use Text::Shellwords::Cursor; my $parser = new Text::Shellwords::Cursor; die "No parser" unless $parser; 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; my($toks, $tokno, $tokoff) = $parser->parse_line($test, messages=>0, cursorpos=>$cpos); my $result = [$toks, $tokno, $tokoff]; ok(0 == cmp_deep($result, $Parse::Tests{$input}), "Test $index"); } # Tries to return a valid comparison # If the data types don't match, claims a>b. ' sub cmp_deep { my($a,$b) = @_; my $refa = ref $a; my $refb = ref $b; return 1 if $refa ne $refb; if(not $refa) { return $a cmp $b if defined($a) && defined($b); return 1 if !defined($a) && defined($b); return -1 if defined($a) && !defined($b); return 0; } elsif($refa eq 'SCALAR') { return cmp_deep($$a, $$b); } elsif($refa eq 'ARRAY') { return @$a <=> @$b if @$a <=> @$b; for(my $i=0; $i < @$a; $i++) { my $res = cmp_deep($a->[$i], $b->[$i]); return $res if $res; } } else { die "Can't compare a: $a '$refa'\n"; } return 0; }