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];
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];