a perl script automatic make a cppunit test case file
还比较粗糙,最近不用cpp,暂时不改进了。
#! /usr/bin/env perl
use warnings;
use strict;
my $DEBUG = 1;
my @methods;
my $fileName = shift;
unless ($fileName)
{
&Usage;
exit;
}
open F, $fileName or die "can not open file: $fileName: $!\n";
my $className = $fileName;
$className =~ s/\.\w+//;
warn "class name is $className" if $DEBUG;
&getMethods;
if (-e "T$className.H")
{
print "T$className.H exists\n";
exit;
}
open T, ">T$className.H" or die "can not create T$className:$!\n";
select T;
my $ucClassName = uc($className);
print "#ifndef T$ {ucClassName}_H\n";
print "#define T$ {ucClassName}_H\n";
print "\n";
print "\n";
print "#include \"$className.H\"\n";
print "#include \n";
print "#include \n";
print "#include \n";
print "#include \n";
print "#include \n";
print "\n";
print "class T$className : public CppUnit::TestFixture { \n";
print "private:\n";
print " //TODO: Define test target here:\n";
print "public: \n";
print "\n";
print " void setUp(){\n";
print "//TODO: initialize test target here: \n";
print " }\n";
print " \n";
print " void tearDown(){\n";
print "//TODO: release test resource here:\n";
print " }\n";
print "\n";
foreach (@methods)
{
print " void test_$_(){\n";
print " // TODO: implement test here:\n";
print " }\n";
}
print " static CppUnit::Test *suite(){\n";
print " CppUnit::TestSuite *suiteOfTests = new CppUnit::TestSuite(\"T${className}\");\n";
foreach (@methods)
{
print " suiteOfTests->addTest(new CppUnit::TestCaller\n";
print " (\"test_$_\",
&T$ {className}::test_$_));\n";
}
print " return suiteOfTests;\n";
print " }\n";
print "};\n";
print "#endif\n";
close T;
open MAIN, ">Main.C" or die "can not create Main.C:$!\n";
select MAIN;
print "#include \n";
print "#include \"T$ {className}.H\"\n";
print "int main()\n";
print "{\n";
print " CppUnit::TextUi::TestRunner runner;\n";
print " runner.addTest(T$ {className}::suite());\n";
print " runner.run();\n";
print " return 0;\n";
print "}\n";
close MAIN;
open MAKEFILE, ">Makefile" or die "can not create Makefile:$!\n";
select MAKEFILE;
print "SUFFIXES= .C .o\n";
print "\n";
print ".SUFFIXES:\n";
print ".SUFFIXES: .C .o\n";
print "\n";
print "LIB=-L/home/tiw/lib -lcppunit -ldl\n";
print "INCLUDE=-I/home/tiw/include\n";
print "CC=g++\n";
print "OBJECTS= Main.o T$ {className}.o $ {className}.o\n";
print "\n";
print "all: Main\n";
print "\n";
print ".C.o:\n";
print " \$(CC) -c \$(INCLUDE) \$<\n";
print "\n";
print "Main: \$(OBJECTS)\n";
print " \$(CC) -o Main \$(LIB) \$(OBJECTS)\n";
print "\n";
print "clean:\n";
print " rm -f Main *.o\n";
print "\n";
close MAKEFILE;
sub getMethods
{
print "class name : $className\n";
while ()
{
my $line = $_;
if ($line =~ m/$className\:\:(\w+)\(/)
{
push @methods, $1;
}
}
} # end getMethods
sub Usage{
print "Usage:\n";
print " makeTest.pl ClassName\n";
print " in the file ClassName target methods are defined\n";
print " test file is saved into TclassName.H\n";
print "Example:\n";
print " makeTest.pl ModellAgent.C\n";
print " test file is saved into TModellAgent.C\n";
}