summaryrefslogtreecommitdiff
path: root/test/app/ProgramOptionTest.c
diff options
context:
space:
mode:
Diffstat (limited to 'test/app/ProgramOptionTest.c')
-rw-r--r--test/app/ProgramOptionTest.c505
1 files changed, 505 insertions, 0 deletions
diff --git a/test/app/ProgramOptionTest.c b/test/app/ProgramOptionTest.c
new file mode 100644
index 0000000..1361349
--- /dev/null
+++ b/test/app/ProgramOptionTest.c
@@ -0,0 +1,505 @@
+#include "unit/TestRunner.h"
+#include "app/ProgramOption.h"
+#include "base/File.h"
+
+#if UNIX
+#define TEST_CONFIG_FILE "/tmp/mrswatsontest-config.txt"
+#elif WINDOWS
+#define TEST_CONFIG_FILE "C:\\Temp\\mrswatsontest-config.txt"
+#else
+#define TEST_CONFIG_FILE "mrswatsontest-config.txt"
+#endif
+
+static void _programOptionTeardown(void)
+{
+ CharString configFilePath = newCharStringWithCString(TEST_CONFIG_FILE);
+ File configFile = newFileWithPath(configFilePath);
+
+ if (fileExists(configFile)) {
+ fileRemove(configFile);
+ }
+
+ freeCharString(configFilePath);
+ freeFile(configFile);
+}
+
+static ProgramOption _getTestOption(void)
+{
+ return newProgramOptionWithName(0, "test", "test help", true,
+ kProgramOptionTypeNumber, kProgramOptionArgumentTypeOptional);
+}
+
+static int _testNewProgramOptions(void)
+{
+ ProgramOptions p = newProgramOptions(4);
+ assertIntEquals(4, p->numOptions);
+ freeProgramOptions(p);
+ return 0;
+}
+
+static int _testAddNewProgramOption(void)
+{
+ ProgramOptions p = newProgramOptions(1);
+ ProgramOption o;
+ assert(programOptionsAdd(p, _getTestOption()));
+ assertIntEquals(1, p->numOptions);
+ o = p->options[0];
+ assertNotNull(o);
+ assertCharStringEquals("test", o->name);
+ freeProgramOptions(p);
+ return 0;
+}
+
+static int _testAddNullProgramOption(void)
+{
+ ProgramOptions p = newProgramOptions(1);
+ assertFalse(programOptionsAdd(p, NULL));
+ freeProgramOptions(p);
+ return 0;
+}
+
+static int _testAddNewProgramOptionOutsideRange(void)
+{
+ ProgramOptions p = newProgramOptions(1);
+ ProgramOption o = _getTestOption();
+ o->index++;
+ assertFalse(programOptionsAdd(p, o));
+ assertIntEquals(1, p->numOptions);
+ freeProgramOption(o);
+ freeProgramOptions(p);
+ return 0;
+}
+
+static int _testParseCommandLineShortOption(void)
+{
+ ProgramOptions p = newProgramOptions(1);
+ char *argv[2];
+ argv[0] = "exe";
+ argv[1] = "-t";
+ assert(programOptionsAdd(p, _getTestOption()));
+ assertFalse(p->options[0]->enabled);
+ assert(programOptionsParseArgs(p, 2, argv));
+ assert(p->options[0]->enabled);
+ freeProgramOptions(p);
+ return 0;
+}
+
+static int _testParseCommandLineLongOption(void)
+{
+ ProgramOptions p = newProgramOptions(1);
+ char *argv[2];
+ argv[0] = "exe";
+ argv[1] = "--test";
+ assert(programOptionsAdd(p, _getTestOption()));
+ assertFalse(p->options[0]->enabled);
+ assert(programOptionsParseArgs(p, 2, argv));
+ assert(p->options[0]->enabled);
+ freeProgramOptions(p);
+ return 0;
+}
+
+static int _testParseCommandLineInvalidOption(void)
+{
+ ProgramOptions p = newProgramOptions(1);
+ char *argv[2];
+ argv[0] = "exe";
+ argv[1] = "invalid";
+ assert(programOptionsAdd(p, _getTestOption()));
+ assertFalse(p->options[0]->enabled);
+ assertFalse(programOptionsParseArgs(p, 2, argv));
+ assertFalse(p->options[0]->enabled);
+ freeProgramOptions(p);
+ return 0;
+}
+
+static int _testParseCommandLineRequiredOption(void)
+{
+ ProgramOptions p = newProgramOptions(1);
+ ProgramOption o = _getTestOption();
+ char *argv[3];
+ argv[0] = "exe";
+ argv[1] = "--test";
+ argv[2] = "1.23";
+ o->argumentType = kProgramOptionArgumentTypeRequired;
+ assert(programOptionsAdd(p, o));
+
+ assertFalse(p->options[0]->enabled);
+ assertDoubleEquals(0.0, programOptionsGetNumber(p, 0), 0.0f);
+ assert(programOptionsParseArgs(p, 3, argv));
+ assertDoubleEquals(1.23, programOptionsGetNumber(p, 0), TEST_DEFAULT_TOLERANCE);
+ assert(p->options[0]->enabled);
+
+ freeProgramOptions(p);
+ return 0;
+}
+
+static int _testParseCommandLineRequiredOptionMissing(void)
+{
+ ProgramOptions p = newProgramOptions(1);
+ ProgramOption o = _getTestOption();
+ char *argv[2];
+ argv[0] = "exe";
+ argv[1] = "--test";
+ o->argumentType = kProgramOptionArgumentTypeRequired;
+ assert(programOptionsAdd(p, o));
+
+ assertFalse(p->options[0]->enabled);
+ assertDoubleEquals(0.0, programOptionsGetNumber(p, 0), TEST_EXACT_TOLERANCE);
+ assertFalse(programOptionsParseArgs(p, 2, argv));
+ assertFalse(p->options[0]->enabled);
+
+ freeProgramOptions(p);
+ return 0;
+}
+
+static ProgramOptions _getTestProgramOptionsForConfigFile(void)
+{
+ ProgramOptions p = newProgramOptions(2);
+ ProgramOption o1, o2;
+ o1 = newProgramOptionWithName(0, "test", "test help", true, kProgramOptionTypeString, kProgramOptionArgumentTypeNone);
+ programOptionsAdd(p, o1);
+ o2 = newProgramOptionWithName(1, "other", "test help", true, kProgramOptionTypeString, kProgramOptionArgumentTypeRequired);
+ programOptionsAdd(p, o2);
+ return p;
+}
+
+static FILE *_openTestProgramConfigFile(void)
+{
+ FILE *fp = fopen(TEST_CONFIG_FILE, "w");
+ return fp;
+}
+
+static int _testParseConfigFile(void)
+{
+ ProgramOptions p = _getTestProgramOptionsForConfigFile();
+ CharString filename = newCharStringWithCString(TEST_CONFIG_FILE);
+ FILE *fp = _openTestProgramConfigFile();
+ fprintf(fp, "--test\n-o\nfoo\n");
+ fclose(fp);
+ assert(programOptionsParseConfigFile(p, filename));
+ assert(p->options[0]->enabled);
+ assert(p->options[1]->enabled);
+ assertCharStringEquals("foo", programOptionsGetString(p, 1));
+
+ unlink(TEST_CONFIG_FILE);
+ freeProgramOptions(p);
+ freeCharString(filename);
+ return 0;
+}
+
+static int _testParseInvalidConfigFile(void)
+{
+ ProgramOptions p = newProgramOptions(1);
+ CharString filename = newCharStringWithCString("invalid");
+ assertFalse(programOptionsParseConfigFile(p, filename));
+ freeProgramOptions(p);
+ freeCharString(filename);
+ return 0;
+}
+
+static int _testParseNullConfigFile(void)
+{
+ ProgramOptions p = newProgramOptions(1);
+ assertFalse(programOptionsParseConfigFile(p, NULL));
+ freeProgramOptions(p);
+ return 0;
+}
+
+static int _testParseConfigFileWithInvalidOptions(void)
+{
+ ProgramOptions p = _getTestProgramOptionsForConfigFile();
+ CharString filename = newCharStringWithCString(TEST_CONFIG_FILE);
+ FILE *fp = _openTestProgramConfigFile();
+
+ fprintf(fp, "--test\n-s\n");
+ fclose(fp);
+ assertFalse(programOptionsParseConfigFile(p, filename));
+ assert(p->options[0]->enabled);
+ assertFalse(p->options[1]->enabled);
+
+ unlink(TEST_CONFIG_FILE);
+ freeProgramOptions(p);
+ freeCharString(filename);
+ return 0;
+}
+
+static int _testFindProgramOptionFromString(void)
+{
+ ProgramOptions p = newProgramOptions(1);
+ CharString c = newCharStringWithCString("test");
+ ProgramOption o;
+
+ assert(programOptionsAdd(p, _getTestOption()));
+ assertIntEquals(p->numOptions, 1);
+ o = programOptionsFind(p, c);
+ assertNotNull(o);
+ assertCharStringEquals("test", o->name);
+
+ freeProgramOptions(p);
+ freeCharString(c);
+ return 0;
+}
+
+static int _testFindProgramOptionFromStringInvalid(void)
+{
+ ProgramOptions p = newProgramOptions(1);
+ CharString c = newCharStringWithCString("invalid");
+ ProgramOption o;
+
+ assert(programOptionsAdd(p, _getTestOption()));
+ assertIntEquals(1, p->numOptions);
+ o = programOptionsFind(p, c);
+ assertIsNull(o);
+
+ freeProgramOptions(p);
+ freeCharString(c);
+ return 0;
+}
+
+static ProgramOptions _getTestOptionMultipleTypes(void)
+{
+ ProgramOptions p = newProgramOptions(3);
+ programOptionsAdd(p, newProgramOptionWithName(0, "string", "help", true,
+ kProgramOptionTypeString, kProgramOptionArgumentTypeRequired));
+ programOptionsAdd(p, newProgramOptionWithName(1, "numeric", "help", true,
+ kProgramOptionTypeNumber, kProgramOptionArgumentTypeRequired));
+ programOptionsAdd(p, newProgramOptionWithName(2, "list", "help", true,
+ kProgramOptionTypeList, kProgramOptionArgumentTypeRequired));
+ return p;
+}
+
+static int _testGetString(void)
+{
+ ProgramOptions p = _getTestOptionMultipleTypes();
+ CharString s = programOptionsGetString(p, 0);
+ assertCharStringEquals("", s);
+ freeProgramOptions(p);
+ return 0;
+}
+
+static int _testGetStringForWrongType(void)
+{
+ ProgramOptions p = _getTestOptionMultipleTypes();
+ CharString s = programOptionsGetString(p, 1);
+ assertIsNull(s);
+ freeProgramOptions(p);
+ return 0;
+}
+
+static int _testGetStringForInvalidOption(void)
+{
+ ProgramOptions p = _getTestOptionMultipleTypes();
+ CharString s = programOptionsGetString(p, 4);
+ assertIsNull(s);
+ freeProgramOptions(p);
+ return 0;
+}
+
+static int _testGetNumeric(void)
+{
+ ProgramOptions p = _getTestOptionMultipleTypes();
+ float f = programOptionsGetNumber(p, 1);
+ assertDoubleEquals(0.0, f, TEST_DEFAULT_TOLERANCE);
+ freeProgramOptions(p);
+ return 0;
+}
+
+static int _testGetNumericForWrongType(void)
+{
+ ProgramOptions p = _getTestOptionMultipleTypes();
+ float f = programOptionsGetNumber(p, 0);
+ assertDoubleEquals(-1.0, f, TEST_DEFAULT_TOLERANCE);
+ freeProgramOptions(p);
+ return 0;
+}
+
+static int _testGetNumericForInvalidOption(void)
+{
+ ProgramOptions p = _getTestOptionMultipleTypes();
+ float f = programOptionsGetNumber(p, 4);
+ assertDoubleEquals(-1.0, f, TEST_DEFAULT_TOLERANCE);
+ freeProgramOptions(p);
+ return 0;
+}
+
+static int _testGetList(void)
+{
+ ProgramOptions p = _getTestOptionMultipleTypes();
+ LinkedList l = programOptionsGetList(p, 2);
+ assertIntEquals(0, l->_numItems);
+ freeProgramOptions(p);
+ return 0;
+}
+
+static int _testGetListForWrongType(void)
+{
+ ProgramOptions p = _getTestOptionMultipleTypes();
+ LinkedList l = programOptionsGetList(p, 0);
+ assertIsNull(l);
+ freeProgramOptions(p);
+ return 0;
+}
+
+static int _testGetListForInvalidOption(void)
+{
+ ProgramOptions p = _getTestOptionMultipleTypes();
+ LinkedList l = programOptionsGetList(p, 4);
+ assertIsNull(l);
+ freeProgramOptions(p);
+ return 0;
+}
+
+static int _testSetString(void)
+{
+ ProgramOptions p = _getTestOptionMultipleTypes();
+ CharString s;
+ programOptionsSetCString(p, 0, "test");
+ s = programOptionsGetString(p, 0);
+ assertNotNull(s);
+ assertCharStringEquals("test", s);
+ freeProgramOptions(p);
+ return 0;
+}
+
+static int _testSetStringForWrongType(void)
+{
+ ProgramOptions p = _getTestOptionMultipleTypes();
+ programOptionsSetCString(p, 1, "test");
+ freeProgramOptions(p);
+ return 0;
+}
+
+static int _testSetStringForInvalidOption(void)
+{
+ ProgramOptions p = _getTestOptionMultipleTypes();
+ CharString s;
+ programOptionsSetCString(p, 4, "test");
+ s = programOptionsGetString(p, 0);
+ assertNotNull(s);
+ assertCharStringEquals("", s);
+ freeProgramOptions(p);
+ return 0;
+}
+
+static int _testSetStringWithNull(void)
+{
+ ProgramOptions p = _getTestOptionMultipleTypes();
+ CharString s;
+ programOptionsSetCString(p, 0, NULL);
+ s = programOptionsGetString(p, 0);
+ assertNotNull(s);
+ assertCharStringEquals("", s);
+ freeProgramOptions(p);
+ return 0;
+}
+
+static int _testSetNumeric(void)
+{
+ ProgramOptions p = _getTestOptionMultipleTypes();
+ float f;
+ programOptionsSetNumber(p, 1, 1.23f);
+ f = programOptionsGetNumber(p, 1);
+ assertDoubleEquals(1.23, f, TEST_DEFAULT_TOLERANCE);
+ freeProgramOptions(p);
+ return 0;
+}
+
+static int _testSetNumericForWrongType(void)
+{
+ ProgramOptions p = _getTestOptionMultipleTypes();
+ programOptionsSetNumber(p, 0, 1.23f);
+ freeProgramOptions(p);
+ return 0;
+}
+
+static int _testSetNumericForInvalidOption(void)
+{
+ ProgramOptions p = _getTestOptionMultipleTypes();
+ programOptionsSetNumber(p, 4, 1.23f);
+ freeProgramOptions(p);
+ return 0;
+}
+
+static int _testSetListItem(void)
+{
+ ProgramOptions p = _getTestOptionMultipleTypes();
+ CharString s;
+ LinkedList l;
+ CharString r;
+
+ s = newCharStringWithCString("test");
+ programOptionsSetListItem(p, 2, s);
+ l = programOptionsGetList(p, 2);
+ assertIntEquals(1, linkedListLength(l));
+ r = l->item;
+ assertCharStringEquals("test", r);
+ freeCharString(s);
+ freeProgramOptions(p);
+ return 0;
+}
+
+static int _testSetListItemForWrongType(void)
+{
+ ProgramOptions p = _getTestOptionMultipleTypes();
+ CharString s = newCharStringWithCString("test");
+ programOptionsSetListItem(p, 1, s);
+ freeCharString(s);
+ freeProgramOptions(p);
+ return 0;
+}
+
+static int _testSetListItemForInvalidOption(void)
+{
+ ProgramOptions p = _getTestOptionMultipleTypes();
+ CharString s = newCharStringWithCString("test");
+ programOptionsSetListItem(p, 4, s);
+ freeCharString(s);
+ freeProgramOptions(p);
+ return 0;
+}
+
+TestSuite addProgramOptionTests(void);
+TestSuite addProgramOptionTests(void)
+{
+ TestSuite testSuite = newTestSuite("ProgramOption", NULL, _programOptionTeardown);
+ addTest(testSuite, "NewObject", _testNewProgramOptions);
+ addTest(testSuite, "AddNewProgramOption", _testAddNewProgramOption);
+ addTest(testSuite, "AddNullProgramOption", _testAddNullProgramOption);
+ addTest(testSuite, "AddNewProgramOptionOutsideRange", _testAddNewProgramOptionOutsideRange);
+
+ addTest(testSuite, "ParseCommandLineShortOption", _testParseCommandLineShortOption);
+ addTest(testSuite, "ParseCommandLineLongOption", _testParseCommandLineLongOption);
+ addTest(testSuite, "ParseCommandLineInvalidOption", _testParseCommandLineInvalidOption);
+ addTest(testSuite, "ParseCommandLineRequiredOption", _testParseCommandLineRequiredOption);
+ addTest(testSuite, "ParseCommandLineRequiredOptionMissing", _testParseCommandLineRequiredOptionMissing);
+
+ addTest(testSuite, "ParseConfigFile", _testParseConfigFile);
+ addTest(testSuite, "ParseInvalidConfigFile", _testParseInvalidConfigFile);
+ addTest(testSuite, "ParseNullConfigFile", _testParseNullConfigFile);
+ addTest(testSuite, "ParseConfigFileWithInvalidOptions", _testParseConfigFileWithInvalidOptions);
+
+ addTest(testSuite, "FindProgramOptionFromString", _testFindProgramOptionFromString);
+ addTest(testSuite, "FindProgramOptionFromStringInvalid", _testFindProgramOptionFromStringInvalid);
+
+ addTest(testSuite, "GetString", _testGetString);
+ addTest(testSuite, "GetStringForWrongType", _testGetStringForWrongType);
+ addTest(testSuite, "GetStringForInvalidOption", _testGetStringForInvalidOption);
+ addTest(testSuite, "GetNumeric", _testGetNumeric);
+ addTest(testSuite, "GetNumericForWrongType", _testGetNumericForWrongType);
+ addTest(testSuite, "GetNumericForInvalidOption", _testGetNumericForInvalidOption);
+ addTest(testSuite, "GetList", _testGetList);
+ addTest(testSuite, "GetListForWrongType", _testGetListForWrongType);
+ addTest(testSuite, "GetListForInvalidOption", _testGetListForInvalidOption);
+ addTest(testSuite, "SetString", _testSetString);
+ addTest(testSuite, "SetStringForWrongType", _testSetStringForWrongType);
+ addTest(testSuite, "SetStringForInvalidOption", _testSetStringForInvalidOption);
+ addTest(testSuite, "SetStringWithNull", _testSetStringWithNull);
+ addTest(testSuite, "SetNumeric", _testSetNumeric);
+ addTest(testSuite, "SetNumericForWrongType", _testSetNumericForWrongType);
+ addTest(testSuite, "SetNumericForInvalidOption", _testSetNumericForInvalidOption);
+ addTest(testSuite, "SetListItem", _testSetListItem);
+ addTest(testSuite, "SetListItemForWrongType", _testSetListItemForWrongType);
+ addTest(testSuite, "SetListItemForInvalidOption", _testSetListItemForInvalidOption);
+
+ return testSuite;
+}