2007-07-18 Jb Evain <jbevain@novell.com>
[mono.git] / mcs / tools / scan-tests.pl
index 9a1600bd476d5caf889e5c790ae7b884c3bf5762..5cb0f8625f5a1a55c58b320bd1a79ebb14b8edf1 100755 (executable)
 use strict;
 use Carp;
 
-my @alltests;
-my @allsuites;
-
-my @badtests = qw[System.Collections.HastableTest System.Collections.StackTest System.IO.PathTest];
+my @allfiles;
+
+my @badsuites = qw[System\.Collections/HashtableTest System\.Collections/StackTest System\.Collections\.Specialized\.BasicOperationsTest];
+my @badtests = qw[PathTest:TestGetTempFileName XmlTextReaderTests:TestIsNameChar XmlTextReaderTests:TestIsFirstNameChar ByteTest:TestParse];
+my @mapfiles = ('s,^MonoTests\.(.*)/,$1/,',
+               's,^Ximian\.Mono\.Tests(.*)/,,',
+               's,^System\.Net/,,',
+               's,^Collections\.Specialized\.,,',
+               's,^Text\.RegularExpressions\.,,'
+               );
+my @maptests = ();
+my @mapnamespace = ();
 
 die "Usage: $0 input output" unless $#ARGV == 1;
 
-open INPUT, $ARGV[0] or croak "open ($ARGV[0]): $!";
-while (defined ($_ = <INPUT>)) {
-    next unless /^\s*suite\.AddTest\s*\((.*)\.(.*?)\.Suite\)/;
+my $namespace = 'MonoTests';
 
-    push @alltests, [$1,$2];
-}
-close INPUT;
+sub parse_test {
+    my ($filename, $namespace, $testname, $suite) = @_;
 
-open OUTPUT, "> $ARGV[1]" or croak "open (> $ARGV[1]): $!";
-select OUTPUT;
+    foreach (@badsuites) {
+       return if $filename =~ /$_/;
+    }
 
-print qq[using NUnit.Framework;\n];
-print qq[using System;\n];
-print qq[using System.Threading;\n];
-print qq[using System.Globalization;\n\n];
+    my $map;
+    foreach $map (@mapfiles) {
+       eval "\$filename =~ $map";
+    }
 
+    foreach (@allfiles) {
+       return if $filename eq $_->[0];
+    }
 
-my $alltest;
-foreach $alltest (@alltests) {
+    # print STDERR "PARSE: |$filename|\n";
 
-    my @suites;
+    push @allfiles, [$filename,$namespace,$testname,$suite,[]];
 
-    my $testname = $alltest->[0];
-    my $filename = $alltest->[0]."/".$alltest->[1].".cs";
+    my $INPUT;
+    open $INPUT, $filename or croak "open ($filename): $!";
+    while (defined ($_ = <$INPUT>)) {
+       if (/^\s*namespace\s*([\w\.]+?)\s*$/) {
+           $namespace = $1;
+           next;
+       }
+       if (/^\s*suite\.AddTest\s*\((.*)\.(.*?)\.Suite\)/) {
+           my $filename = (defined $namespace) ? qq[$namespace.$1/$2.cs] : qq[$1/$2.cs];
+           my $nsprefix = (defined $namespace) ? qq[$namespace.$1] : qq[MonoTests.$1];
+           parse_test ($filename, $nsprefix, $1, $2);
+           next;
+       }
+       if (/^\s*suite\.AddTest\s*\((.*?)\.Suite\)/) {
+           my $filename = (defined $namespace) ? qq[$namespace/$1.cs] : qq[$1.cs];
+           parse_test ($filename, $namespace, '', $1);
+           next;
+       }
+       if (/^\s*suite\.AddTest\s*\(\s*new\s+TestSuite\s*\(\s*typeof\(\s*(.*)\s*\)\s*\)\s*\);/) {
+           my $filename = (defined $namespace) ? qq[$namespace/$1.cs] : qq[$1.cs];
+           parse_test ($filename, $namespace, '', $1);
+           next;
+       }
+    }
+    close $INPUT;
+}
 
-    open ALLTEST, $filename or croak "open ($filename): $!";
-    while (defined ($_ = <ALLTEST>)) {
-       next unless /^\s*suite\.AddTest\s*\((.*)\.Suite\)/;
-       my $name = $1;
+parse_test ($ARGV[0], undef, '', '');
 
-       next if grep $name, @badtests;
+my $file;
+foreach $file (@allfiles) {
+    my ($filename,$namespace,$testname,$suite) = @$file;
 
-       push @suites, $name;
-       push @allsuites, qq[$testname.Run$name];
+    open SUITE, $filename or croak "open ($filename): $!";
+    while (defined ($_ = <SUITE>)) {
+       next unless /^\s*public\s+void\s+(Test.*?)\s*\(\s*\)/;
+       push @{$file->[4]}, $1;
     }
-    close ALLTEST;
-
-    print qq[namespace MonoTests.$testname\n\{\n];
+    close SUITE;
+}
 
-    my $suite;
-    foreach $suite (@suites) {
+open OUTPUT, "> $ARGV[1]" or croak "open (> $ARGV[1]): $!";
+select OUTPUT;
 
-       my @tests;
+print qq[using NUnit.Framework;\n];
+print qq[using System;\n];
+print qq[using System.Threading;\n];
+print qq[using System.Globalization;\n\n];
 
-       open SUITE, qq[$testname/$suite.cs] or
-           croak "open ($testname/$suite.cs): $!";
-       while (defined ($_ = <SUITE>)) {
-           next unless /^\s*public\s+void\s+(Test.*?)\s*\(\s*\)/;
-           push @tests, $1;
-       }
-       close SUITE;
 
-       print qq[\tpublic class Run$suite : $suite\n\t\{\n];
-       print qq[\t\tprotected override void RunTest ()\n\t\t\{\n];
-       foreach (@tests) {
-           print qq[\t\t\t$_ ();\n];
+my $alltest;
+foreach $alltest (@allfiles) {
+
+    my ($filename,$namespace,$testname,$suite,$tests) = @$alltest;
+    my @tests = @$tests;
+
+    next unless defined $namespace;
+    next unless $#tests >= 0;
+
+    # print STDERR "DOING TEST: |$testname|$filename|\n";
+
+    $namespace .= ".$testname" unless $testname eq '';
+
+    print qq[namespace $namespace\n\{\n];
+    print qq[\tpublic class Run$suite : $suite\n\t\{\n];
+    print qq[\t\tprotected override void RunTest ()\n\t\t\{\n];
+#    print qq[\t\t\tbool errorThrown = false;\n\n];
+    my $test;
+  testloop:
+    foreach $test (@tests) {
+       my $badtest;
+       $filename =~ s/\.cs$//;
+       my $fullname = qq[$filename:$test];
+       # print STDERR "TEST: |$fullname|\n";
+       foreach $badtest (@badtests) {
+           next testloop if $fullname =~ /$badtest/;
        }
-       print qq[\t\t\}\n\t\}\n];
+#      print qq[\t\t\ttry \{\n\t\t\t\t$test ();\n\t\t\t\} catch \{\n];
+#      print qq[\t\t\t\tConsole.WriteLine ("$namespace:$suite:$test failed");\n];
+#      print qq[\t\t\t\terrorThrown = true;\n];
+#      print qq[\t\t\t\}\n];
+       print qq[\t\t\t$test ();\n];
+#      print qq[\t\t\tConsole.WriteLine ("$namespace:$suite:$test DONE");\n];
     }
+    print qq[\n];
+#    print qq[\t\t\tif (errorThrown)\n\t\t\t\tthrow new ArgumentException ();\n];
+    print qq[\t\t\}\n\t\}\n];
     print qq[\}\n\n];
 }
 
-print qq[namespace MonoTests\n\{\n];
+print qq[namespace $namespace\n\{\n];
 print qq[\tpublic class RunAllTests\n\t\{\n];
 print qq[\t\tpublic static void AddAllTests (TestSuite suite)\n];
 print qq[\t\t\{\n];
 
-my $suite;
-foreach $suite (@allsuites) {
-    print qq[\t\t\tsuite.AddTest (new MonoTests.$suite ());\n];
+foreach $alltest (@allfiles) {
+    my ($filename,$namespace,$testname,$suite,$tests) = @$alltest;
+    my @tests = @$tests;
+
+    next unless defined $namespace;
+    next unless $#tests >= 0;
+
+    $namespace .= ".$testname" unless $testname eq '';
+
+    print qq[\t\t\tsuite.AddTest (new $namespace.Run$suite ());\n];
 }
 
 print qq[\t\t\}\n\t\}\n\}\n\n];
@@ -89,7 +154,7 @@ print qq[\tpublic static void Main()\n\t\{\n];
 print qq[\t\tThread.CurrentThread.CurrentCulture = new CultureInfo ("en-US");\n\n];
 print qq[\t\tTestResult result = new TestResult ();\n];
 print qq[\t\tTestSuite suite = new TestSuite ();\n];
-print qq[\t\tMonoTests.RunAllTests.AddAllTests (suite);\n];
+print qq[\t\t$namespace.RunAllTests.AddAllTests (suite);\n];
 print qq[\t\tsuite.Run (result);\n];
 print qq[\t\tMonoTests.MyTestRunner.Print (result);\n];
 print qq[\t\}\n\}\n\n];