From 24c0fab9bf37e77e1fdad2122783dee332c9a9ef Mon Sep 17 00:00:00 2001 From: Joshua Warner Date: Sun, 17 Feb 2013 12:10:18 -0700 Subject: [PATCH] add unit tests for arg parser --- makefile | 3 +- src/util/arg-parser.cpp | 4 ++ test/test.sh | 1 + unittest/test-harness.h | 10 +++++ unittest/util/arg-parser-test.cpp | 69 +++++++++++++++++++++++++++++++ 5 files changed, 86 insertions(+), 1 deletion(-) create mode 100644 unittest/util/arg-parser-test.cpp diff --git a/makefile b/makefile index 9cbd83b65a..5d1178f77f 100755 --- a/makefile +++ b/makefile @@ -1214,6 +1214,7 @@ test-extra-dep = $(test-build)-extra.dep unittest-sources = \ $(wildcard $(unittest)/*.cpp) \ + $(wildcard $(unittest)/util/*.cpp) \ $(wildcard $(unittest)/codegen/*.cpp) unittest-depends = \ @@ -1583,7 +1584,7 @@ executable-objects = $(vm-objects) $(classpath-objects) $(driver-object) \ $(vm-heapwalk-objects) $(boot-object) $(vm-classpath-objects) \ $(javahome-object) $(boot-javahome-object) $(lzma-decode-objects) -unittest-executable-objects = $(unittest-objects) $(vm-objects) +unittest-executable-objects = $(unittest-objects) $(vm-objects) $(build)/util/arg-parser.o ifeq ($(process),interpret) unittest-executable-objects += $(all-codegen-target-objects) diff --git a/src/util/arg-parser.cpp b/src/util/arg-parser.cpp index 697bfd4fef..30e50cadfb 100644 --- a/src/util/arg-parser.cpp +++ b/src/util/arg-parser.cpp @@ -27,6 +27,10 @@ Arg::Arg(ArgParser& parser, bool required, const char* name, const char* desc): parser.last = &next; } +ArgParser::ArgParser(): + first(0), + last(&first) {} + bool ArgParser::parse(int ac, const char** av) { Arg* state = 0; diff --git a/test/test.sh b/test/test.sh index e30e90c1cb..f5de5ff81c 100644 --- a/test/test.sh +++ b/test/test.sh @@ -20,6 +20,7 @@ printf "%12s------- Unit tests -------\n" "" ${unit_tester} 2>>${log} if [ "${?}" != "0" ]; then trouble=1 + echo "unit tests failed!" fi echo diff --git a/unittest/test-harness.h b/unittest/test-harness.h index 717cfc317f..d9a5ed81a7 100644 --- a/unittest/test-harness.h +++ b/unittest/test-harness.h @@ -11,6 +11,8 @@ #ifndef TEST_HARNESS_H #define TEST_HARNESS_H +#include + class Test { private: Test* next; @@ -53,6 +55,14 @@ protected: } runs++; } + + void assertEqual(const char* expected, const char* actual) { + if((expected == 0 && actual != 0) || (expected != 0 && actual == 0) || strcmp(expected, actual) != 0) { + fprintf(stderr, "assertion failure, expected: \"%s\", actual: \"%s\"\n", expected, actual); + failures++; + } + runs++; + } template void assertNotEqual(T expected, T actual) { diff --git a/unittest/util/arg-parser-test.cpp b/unittest/util/arg-parser-test.cpp new file mode 100644 index 0000000000..bd93a04c99 --- /dev/null +++ b/unittest/util/arg-parser-test.cpp @@ -0,0 +1,69 @@ +/* Copyright (c) 2008-2011, Avian Contributors + + Permission to use, copy, modify, and/or distribute this software + for any purpose with or without fee is hereby granted, provided + that the above copyright notice and this permission notice appear + in all copies. + + There is NO WARRANTY for this software. See license.txt for + details. */ + + +#include + +#include "common.h" + +#include "util/arg-parser.h" + +#include "test-harness.h" + +using namespace avian::util; + +class ArgParserTest : public Test { +public: + ArgParserTest(): + Test("ArgParser") + {} + + virtual void run() { + { + ArgParser parser; + Arg arg1(parser, false, "arg1", ""); + Arg required2(parser, true, "required2", ""); + const char* args[] = { + "myExecutable", + "-arg1", "myValue1", + "-required2", "myRequired2", + 0 + }; + assertTrue(parser.parse(sizeof(args) / sizeof(char*) - 1, args)); + assertEqual("myValue1", arg1.value); + assertEqual("myRequired2", required2.value); + } + + { + ArgParser parser; + Arg arg1(parser, false, "arg1", ""); + Arg required2(parser, true, "required2", ""); + const char* args[] = { + "myExecutable", + "-arg1", "myValue1", + "-required2", + 0 + }; + assertFalse(parser.parse(sizeof(args) / sizeof(char*) - 1, args)); + } + + { + ArgParser parser; + Arg arg1(parser, false, "arg1", ""); + Arg required2(parser, true, "required2", ""); + const char* args[] = { + "myExecutable", + "-arg1", "myValue1", + 0 + }; + assertFalse(parser.parse(sizeof(args) / sizeof(char*) - 1, args)); + } + } +} argParserTest; \ No newline at end of file