srctools/distillsrc/test/test.pl
changeset 602 3145852acc89
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srctools/distillsrc/test/test.pl	Fri Jun 25 18:37:20 2010 +0800
@@ -0,0 +1,226 @@
+#!\bin\perl -w
+# Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# distillsrc.pl test script
+# 
+#
+
+use FindBin;
+use Cwd ('chdir','abs_path');
+
+my $cwd = abs_path($FindBin::Bin."\\..");
+chdir($cwd) or die "Couldn't change directory to $cwd\n";
+
+# Test cases
+#
+# Entry format: [parameters, [[pass regexps],[fail regexps]]]
+# 
+# [pass regexps] and [fail regexps] are lists of regular expressions, each
+# as a string. All pass regexps must match. No fail regexps may match.
+# If a line matches both, it is said to have passed (hence a generic failure
+# rule can be written to match any output which wasn't expected)
+my @testcases =
+	(
+	['-r fred -l beech' ,
+		[
+			['^ERROR: RealTimeBuild:.*srcpath must be given'],
+			['^ERROR: RealTimeBuild:']
+		]
+	],
+	['-s fred -l beech' ,
+		[
+			['^ERROR: RealTimeBuild:.*srcroot must be given'],
+			['^ERROR: RealTimeBuild:']
+		]
+	],
+	['-r fred -s src' ,
+		[
+			['^ERROR: RealTimeBuild:.*platform'],
+			['^ERROR: RealTimeBuild:']
+		]
+	],
+	['-d -r test -s source -p prefix -l fred -c test\options.txt -N' ,
+		[
+			[
+			'= spacey$',
+			'= whole$',
+			'^DUMMY: File test\\\\source\\\\fixer.mrp',
+			'^DUMMY: File test\\\\source\\\\DISTRIBUTION\\.POLICY',
+			'^DUMMY: File test\\\\source\\\\missing\\\\unowned'
+			],
+			[
+			'^DUMMY:.*is not specified in any \\.mrp file',
+			'does not include itself'
+			]
+		]
+	],
+	['-d -r test -s source -p prefix -l fred -c test\options.txt -m test\source\fixer.mrp' ,
+		[
+			[
+			'= spacey$',
+			'= whole$',
+			'= fixer$',
+			'WARNING: \[fixer\] Case of .test\\\\soUrce\\\\DIStribuTION.poliCY. does not match.* Should be test\\\\source\\\\DISTRIBUTION.POLICY$',
+			'WARNING: \[fixer\] Case of .test\\\\soUrce\\\\missing.* does not match.* Should be test\\\\source\\\\missing',
+			'source\\\\spacey\\\\spa cey.txt = spacey$',
+			],
+			[
+			'^DUMMY:.*is not specified in any \\.mrp file',
+			'does not include itself'
+			]
+		]
+	],
+	['-d -r test -s source -p prefix -l fred -f test\base.txt' ,
+		[
+			[
+			'= whole$',
+			'^DUMMY: File test\\\\source\\\\fixer\\.mrp',
+			'^DUMMY: File test\\\\source\\\\DISTRIBUTION\\.POLICY',
+			'^DUMMY: Directory test\\\\source\\\\missing',
+			'^DUMMY: File test\\\\source\\\\shared\\\\missing',
+			'^DUMMY: Directory test\\\\source\\\\spacey'
+			],
+			[
+			'^DUMMY:.*is not specified in any \\.mrp file',
+			'does not include itself'
+			]
+		]
+	],
+	['-d -r test -s nowt -l fred -m test\naughty.mrp' ,
+		[
+			[
+			'nothing_important.* doesn\'t exist',
+			'No \.mrp files claim any source',
+			'naughty\.mrp.*does not include itself'
+			],
+			['^DUMMY:.*is not specified in any \\.mrp file']
+		]
+	],
+	['-r test -s source -l fred -m test\not_present.mrp' ,
+		[
+			['^ERROR: RealTimeBuild:.*not_present\\.mrp.*does not exist'],
+			[]
+		]
+	],
+	['-r test -s source -l fred -m test\duffer.mrp',
+		[
+			['^ERROR: RealTimeBuild:.*not a valid command.*test\\\\duffer\\.mrp'],
+			['= duffer$']
+		]
+	],
+	['-d -r test -s source -p prefix -l fred -f test\base.txt',
+		[
+			[
+			'^WARNING:.*Case of \'.*complete.mrp\' does not match.* Should be.*source.*$',
+			'^WARNING:.*Case of \'.*whole.mrp\' does not match.* Should be.*whole.whole.*$',
+			],
+			['^WARNING:.*Case of .* does not match.* Should be.*$']
+		]
+	],
+	['-d -r test -s source -p prefix -l fred -m test\bincase.mrp',
+		[
+			[
+			'^REMARK:.*\\\\epoc32\\\\thisOneIsnt should be lower case',
+			'^REMARK:.*\\\\epoc32\\\\andNorIs\/thisone should be lower case',
+			'^REMARK:.*\\\\epoc32\\\\thisonesNot should be lower case',
+			'^REMARK:.*\\\\epoc32\\\\norThis\\\\one should be lower case'
+			],
+			['^REMARK:.*should be lower case.*$']
+		]
+	]
+	);
+
+my $passes = 0;
+my $tests = 0;
+
+foreach my $testcase (@testcases)
+	{
+	my $cmd = "distillsrc.pl ".$testcase->[0];
+	print "\nRunning $cmd\n";
+	my @output = `perl $cmd 2>&1`;
+	my @passregexps = @{$testcase->[1]->[0]};
+	my @failregexps = @{$testcase->[1]->[1]};
+
+	my $testpass = -1; # (unset)
+
+	foreach my $line (@output)
+		{
+		chomp ($line);
+		my $pass = 0;
+		my $fail = 0;
+		
+		foreach my $passregexp (@passregexps)
+			{
+			if ($line =~ /$passregexp/)
+				{
+				$pass = 1;
+
+				# Remove rule from list
+				@passregexps = grep($_ ne $passregexp, @passregexps);
+				}
+			}
+
+		if (!$pass)
+			{
+			foreach my $failregexp (@failregexps)
+				{
+				if ($line =~ /$failregexp/)
+					{
+					$fail = 1;
+					}
+				}
+			}
+
+		if ($pass)
+			{
+			print "GOOD:$line\n";
+			if ($testpass == -1)
+				{
+				$testpass = 1; # Passed (so far)
+				}
+			}
+		elsif ($fail)
+			{
+			print "BAD:$line\n";
+			$testpass = 0; # Failed
+			}
+		else { print "OKEH:$line\n"; }
+		}
+	
+	if ($testpass == 1)
+		{
+		if ((scalar @passregexps) == 0)
+			{
+			print "*** PASS\n";
+			$passes ++;
+			}
+		else
+			{
+			print "*** FAIL - tests not matched:\n> ";
+			print join("\n> ", @passregexps)."\n";
+			}
+		}
+	elsif ($testpass == 0)
+		{
+		print "*** FAIL - hard fail\n";
+		}
+	else
+		{
+		print "*** FAIL - no tests matched\n";
+		}
+
+	$tests ++;
+	}
+
+print "*** Out of $tests tests, $passes passed\n";