diff --git a/include/CppUTest/CommandLineTestRunner.h b/include/CppUTest/CommandLineTestRunner.h index 2a5477999..2ca3d7c67 100644 --- a/include/CppUTest/CommandLineTestRunner.h +++ b/include/CppUTest/CommandLineTestRunner.h @@ -32,6 +32,7 @@ #include "TestOutput.h" #include "CommandLineArguments.h" #include "TestFilter.h" +#include class JUnitTestOutput; class TestRegistry; @@ -49,8 +50,12 @@ class CommandLineTestRunner static int RunAllTests(int ac, const char** av); static int RunAllTests(int ac, char** av); + static int RunAllTests(int ac, const wchar_t** av); + static int RunAllTests( int ac, wchar_t** av ); CommandLineTestRunner(int ac, const char** av, TestOutput*, TestRegistry* registry); + static char** ConvertWideArgumentsToNormal( int ac, const wchar_t** av ); + virtual ~CommandLineTestRunner(); int runAllTestsMain(); diff --git a/src/CppUTest/CommandLineTestRunner.cpp b/src/CppUTest/CommandLineTestRunner.cpp index 36d83d371..37dfa0a1e 100644 --- a/src/CppUTest/CommandLineTestRunner.cpp +++ b/src/CppUTest/CommandLineTestRunner.cpp @@ -69,6 +69,34 @@ int CommandLineTestRunner::RunAllTests(int ac, const char** av) return result; } +int CommandLineTestRunner::RunAllTests( int ac, wchar_t** av ) { + return RunAllTests( ac, const_cast ( av ) ); +} + +int CommandLineTestRunner::RunAllTests( int ac, const wchar_t** av ) +{ + char** avc = ConvertWideArgumentsToNormal( ac, av ); + + int result = RunAllTests( ac, avc ); + + for ( int i = 0; i < ac; i++ ) { + delete[] avc[i]; + } + delete[] avc; + + return result; +} + +char** CommandLineTestRunner::ConvertWideArgumentsToNormal( int ac, const wchar_t** av ) { + char** avc = new char*[ac]; + for( int i = 0; i < ac; i++ ) { + size_t len = wcslen( av[i] ) + 1; + avc[i] = new char[len]; + wcstombs( avc[i], av[i], len ); + } + return avc; +} + int CommandLineTestRunner::runAllTestsMain() { int testResult = 0; diff --git a/tests/CommandLineTestRunnerTest.cpp b/tests/CommandLineTestRunnerTest.cpp index 8acd3fc56..47a08f976 100644 --- a/tests/CommandLineTestRunnerTest.cpp +++ b/tests/CommandLineTestRunnerTest.cpp @@ -96,6 +96,22 @@ TEST(CommandLineTestRunner, NoPluginsAreInstalledAtTheEndOfARunWhenTheArgumentsA LONGS_EQUAL(0, registry.countPlugins()); } +TEST( CommandLineTestRunner, VerifyWideToNormalConversions ) { + const wchar_t* argv[] = { L"dummy.exe", L"-fdskjnfkds" }; + int ac = 2; + + char** avc = CommandLineTestRunner::ConvertWideArgumentsToNormal( ac, argv ); + + STRCMP_EQUAL( "dummy.exe", avc[0] ); + STRCMP_EQUAL( "-fdskjnfkds", avc[1] ); + + for( int i = 0; i < ac; i++ ) { + delete[] avc[i]; + } + delete[] avc; +} + + struct TestOutputCheckingCommandLineTestRunner : public CommandLineTestRunner { TestOutputCheckingCommandLineTestRunner(int ac, const char** av, TestOutput* output, TestRegistry* registry) :