#!/usr/bin/perl -w ############################################################################## # W3C Test Suite Generator # ############################################################################## package main; use strict; use diagnostics; use XML::Parser; # DEPENDENCY use lib '.'; use utils::parser; use utils::helpers; use utils::generators; # check arguments # if argument 1 is '-v' then print out the value of second argument, which will be one of: # - DESTINATION_TYPES # - SHELL_TYPES # - TEST_TYPES if (scalar(@ARGV) == 1 and ($ARGV[0] eq '-h' or $ARGV[0] eq '--help')) { print "Syntax: generateTests.pl -v VARIABLE_NAME or generateTests.pl test1.xml test2,xml ...\n"; return 0; } elsif (scalar(@ARGV) > 0 and $ARGV[0] eq '-v') { if (scalar(@ARGV) == 2) { print $utils::helpers::types{$ARGV[1]}; exit 0; } else { my @vars = keys(%utils::helpers::types); local $" = '\', \''; print "You must specify which variable to display in the form '-v VARIABLE_NAME',\nwhere VARIABLE_NAME is one of '@vars'.\n"; exit 1; } } # otherwise, process arguments as filenames: my %cache = %{&utils::helpers::readCache()}; while (scalar(@ARGV)) { # read file local $/ = undef; my $file = <>; close(ARGV); # print status my $filename = $ARGV; $filename =~ s/\.[a-z]+$//o; # remove extension print "parsing $filename...\n"; # process file $cache{$filename} = XML::Parser->new(Style => 'utils::parser', Namespaces => 1, ErrorContext => 1)->parse($file); die "$filename: modulename/number attributes wrong ('$cache{$filename}->{modulename}-$cache{$filename}->{number}')\n" if $filename ne "$cache{$filename}->{modulename}-$cache{$filename}->{number}"; } &utils::helpers::writeCache(\%cache); print "generating tests...\n"; # ...and generate the tests &utils::generators::generateTopIndex(\%cache); # points to mini test index and all test type indexes foreach my $destinationType (split ' ', $utils::helpers::types{'DESTINATION_TYPES'}) { my @destinationTests = &utils::helpers::shortlistTestsForDestination($destinationType, [ sort { my $na = $cache{$a}->{'number'}; my $nb = $cache{$b}->{'number'}; for my $n ($na, $nb) { $n =~ m/^([0-9]*(?:\.[0-9]+)?)/o; $n = $1; } if (($na ne '') and ($nb ne '')) { return (($na <=> $nb) or ($cache{$a}->{'number'} cmp $cache{$b}->{'number'}) or ($a cmp $b)); } else { return (($cache{$a}->{'number'} cmp $cache{$b}->{'number'}) or ($a cmp $b)); } } keys(%cache) ], \%cache); # generate primary index &utils::generators::generateSubIndex($destinationType, \@destinationTests, \%cache); # points to mini test index and all test type indexes # generate complete mini test index &utils::generators::generateMiniTestIndex($destinationType, \@destinationTests, \%cache); # points to all mini tests # generate mini tests foreach my $testIndex (0..$#destinationTests) { # generate mini test and CSS if needed &utils::generators::generateMiniTest($destinationType, \@destinationTests, \%cache, $testIndex); } # generate flat tests and shells foreach my $testType (split ' ', $utils::helpers::types{'TEST_TYPES'}) { my @finalTestList = &utils::helpers::shortlistTestsForTypes($testType, \@destinationTests, \%cache); # generate test type index &utils::generators::generateTestTypeIndex($destinationType, $testType, \@finalTestList, \%cache); # points to flat test index and each shell index # generate flat test index &utils::generators::generateFlatTestIndex($destinationType, $testType, \@finalTestList, \%cache); # points to flat tests foreach my $shell (split ' ', $utils::helpers::types{'SHELL_TYPES'}) { # generate shell index &utils::generators::generateShellTestIndex($destinationType, $testType, $shell, \@finalTestList, \%cache); # points to shell tests } foreach my $testIndex (0..$#finalTestList) { # generate flat test &utils::generators::generateFlatTest($destinationType, $testType, \@finalTestList, \%cache, $testIndex); foreach my $shell (split ' ', $utils::helpers::types{'SHELL_TYPES'}) { # generate shell &utils::generators::generateShell($destinationType, $testType, $shell, \@finalTestList, \%cache, $testIndex); } } } } # generate latest changes log foreach my $test (sort { $a->{date} cmp $b->{date} } values %cache) { print "$test->{date} ($test->{rev}): $test->{modulename}-$test->{number} - $test->{def}\n"; } print "done\n"; ##############################################################################