diff options
Diffstat (limited to 'cpp/test/IceUtil/inputUtil/Client.cpp')
-rw-r--r-- | cpp/test/IceUtil/inputUtil/Client.cpp | 256 |
1 files changed, 256 insertions, 0 deletions
diff --git a/cpp/test/IceUtil/inputUtil/Client.cpp b/cpp/test/IceUtil/inputUtil/Client.cpp new file mode 100644 index 00000000000..1e94cefae6d --- /dev/null +++ b/cpp/test/IceUtil/inputUtil/Client.cpp @@ -0,0 +1,256 @@ +// ********************************************************************** +// +// Copyright (c) 2003-2011 ZeroC, Inc. All rights reserved. +// +// This copy of Ice is licensed to you under the terms described in the +// ICE_LICENSE file included in this distribution. +// +// ********************************************************************** + +#include <IceUtil/Unicode.h> +#include <IceUtil/InputUtil.h> +#include <IceUtil/StringUtil.h> +#include <IceUtil/Options.h> +#include <TestCommon.h> + +#include <vector> + +using namespace IceUtil; +using namespace IceUtilInternal; +using namespace std; + +#define WS " \f\n\r\t\v" + +#if defined(__BCPLUSPLUS__) +Int64 Int64Min = -9223372036854775808i64; +Int64 Int64Max = 9223372036854775807i64; +#elif defined(_MSC_VER) +const Int64 Int64Min = -9223372036854775808i64; +const Int64 Int64Max = 9223372036854775807i64; +#elif defined(ICE_64) +const Int64 Int64Min = -0x7fffffffffffffffL-1L; +const Int64 Int64Max = 0x7fffffffffffffffL; +#else +const Int64 Int64Min = -0x7fffffffffffffffLL-1LL; +const Int64 Int64Max = 0x7fffffffffffffffLL; +#endif + +int +main(int, char**) +{ + cout << "testing string-to-64-bit integer conversion... " << flush; + + bool b; + Int64 result; + + b = stringToInt64("", result); + test(!b && result == 0); + b = stringToInt64(WS, result); + test(!b && result == 0); + + b = stringToInt64("123", result); + test(b && result == 123); + b = stringToInt64("+123", result); + test(b && result == 123); + b = stringToInt64("-123", result); + test(b && result == -123); + + b = stringToInt64("0123", result); + test(b && result == 83); + b = stringToInt64("+0123", result); + test(b && result == 83); + b = stringToInt64("-0123", result); + test(b && result == -83); + + b = stringToInt64("0x123", result); + test(b && result == 291); + b = stringToInt64("+0x123", result); + test(b && result == 291); + b = stringToInt64("-0x123", result); + test(b && result == -291); + + b = stringToInt64(WS "123", result); + test(b && result == 123); + b = stringToInt64("123" WS, result); + test(b && result == 123); + b = stringToInt64(WS "123" WS, result); + test(b && result == 123); + + b = stringToInt64("123Q", result); + test(b && result == 123); + b = stringToInt64(" 123Q", result); + test(b && result == 123); + b = stringToInt64(" 123Q ", result); + test(b && result == 123); + b = stringToInt64(" 123 Q", result); + test(b && result == 123); + + b = stringToInt64("Q", result); + test(!b && result == 0); + b = stringToInt64(" Q", result); + test(!b && result == 0); + + b = stringToInt64("-9223372036854775807", result); + test(b && result == -ICE_INT64(9223372036854775807)); + b = stringToInt64("-9223372036854775808", result); + test(b && result == Int64Min); + b = stringToInt64("-9223372036854775809", result); + test(!b && result < 0); + + b = stringToInt64("9223372036854775806", result); + test(b && result == ICE_INT64(9223372036854775806)); + b = stringToInt64("9223372036854775807", result); + test(b && result == Int64Max); + b = stringToInt64("9223372036854775808", result); + test(!b && result > 0); + + b = stringToInt64("-9223372036854775807Q", result); + test(b && result == -ICE_INT64(9223372036854775807)); + b = stringToInt64("-9223372036854775808Q", result); + test(b && result == Int64Min); + b = stringToInt64("-9223372036854775809Q", result); + test(!b && result < 0); + + b = stringToInt64("-9223372036854775809999Q", result); + test(!b && result < 0); + + cout << "ok" << endl; + + cout << "testing string to command line arguments... " << flush; + vector<string> args; + + test(IceUtilInternal::Options::split("").empty()); + + args = IceUtilInternal::Options::split("\"\""); + test(args.size() == 1 && args[0] == ""); + args = IceUtilInternal::Options::split("''"); + test(args.size() == 1 && args[0] == ""); + args = IceUtilInternal::Options::split("$''"); + test(args.size() == 1 && args[0] == ""); + + args = IceUtilInternal::Options::split("-a -b -c"); + test(args.size() == 3 && args[0] == "-a" && args[1] == "-b" && args[2] == "-c"); + args = IceUtilInternal::Options::split("\"-a\" '-b' $'-c'"); + test(args.size() == 3 && args[0] == "-a" && args[1] == "-b" && args[2] == "-c"); + args = IceUtilInternal::Options::split(" '-b' \"-a\" $'-c' "); + test(args.size() == 3 && args[0] == "-b" && args[1] == "-a" && args[2] == "-c"); + args = IceUtilInternal::Options::split(" $'-c' '-b' \"-a\" "); + test(args.size() == 3 && args[0] == "-c" && args[1] == "-b" && args[2] == "-a"); + + // Testing single quote + args = IceUtilInternal::Options::split("-Dir='C:\\\\test\\\\file'"); // -Dir='C:\\test\\file' + test(args.size() == 1 && args[0] == "-Dir=C:\\\\test\\\\file"); // -Dir=C:\\test\\file + args = IceUtilInternal::Options::split("-Dir='C:\\test\\file'"); // -Dir='C:\test\file' + test(args.size() == 1 && args[0] == "-Dir=C:\\test\\file"); // -Dir=C:\test\file + args = IceUtilInternal::Options::split("-Dir='C:\\test\\filewith\"quote'"); // -Dir='C:\test\filewith"quote' + test(args.size() == 1 && args[0] == "-Dir=C:\\test\\filewith\"quote"); // -Dir=C:\test\filewith"quote + + // Testing double quote + args = IceUtilInternal::Options::split("-Dir=\"C:\\\\test\\\\file\""); // -Dir="C:\\test\\file" + test(args.size() == 1 && args[0] == "-Dir=C:\\test\\file"); // -Dir=C:\test\file + args = IceUtilInternal::Options::split("-Dir=\"C:\\test\\file\""); // -Dir="C:\test\file" + test(args.size() == 1 && args[0] == "-Dir=C:\\test\\file"); // -Dir=C:\test\file + args = IceUtilInternal::Options::split("-Dir=\"C:\\test\\filewith\\\"quote\""); // -Dir="C:\test\filewith\"quote" + test(args.size() == 1 && args[0] == "-Dir=C:\\test\\filewith\"quote"); // -Dir=C:\test\filewith"quote + + // Testing ANSI quote + args = IceUtilInternal::Options::split("-Dir=$'C:\\\\test\\\\file'"); // -Dir=$'C:\\test\\file' + test(args.size() == 1 && args[0] == "-Dir=C:\\test\\file"); // -Dir=C:\test\file + args = IceUtilInternal::Options::split("-Dir=$'C:\\oest\\oile'"); // -Dir='C:\oest\oile' + test(args.size() == 1 && args[0] == "-Dir=C:\\oest\\oile"); // -Dir=C:\oest\oile + args = IceUtilInternal::Options::split("-Dir=$'C:\\oest\\oilewith\"quote'"); // -Dir=$'C:\oest\oilewith"quote' + test(args.size() == 1 && args[0] == "-Dir=C:\\oest\\oilewith\"quote"); // -Dir=C:\oest\oilewith"quote + args = IceUtilInternal::Options::split("-Dir=$'\\103\\072\\134\\164\\145\\163\\164\\134\\146\\151\\154\\145'"); + test(args.size() == 1 && args[0] == "-Dir=C:\\test\\file"); // -Dir=C:\test\file + args = IceUtilInternal::Options::split("-Dir=$'\\x43\\x3A\\x5C\\x74\\x65\\x73\\x74\\x5C\\x66\\x69\\x6C\\x65'"); + test(args.size() == 1 && args[0] == "-Dir=C:\\test\\file"); // -Dir=C:\test\file + args = IceUtilInternal::Options::split("-Dir=$'\\cM\\c_'"); // Control characters + test(args.size() == 1 && args[0] == "-Dir=\015\037"); + args = IceUtilInternal::Options::split("-Dir=$'C:\\\\\\146\\x66\\cMi'"); // -Dir=$'C:\\\146\x66i\cMi' + test(args.size() == 1 && args[0] == "-Dir=C:\\ff\015i"); + args = IceUtilInternal::Options::split("-Dir=$'C:\\\\\\cM\\x66\\146i'"); // -Dir=$'C:\\\cM\x66\146i' + test(args.size() == 1 && args[0] == "-Dir=C:\\\015ffi"); + + vector<string> badQuoteCommands; + badQuoteCommands.push_back("\""); + badQuoteCommands.push_back("'"); + badQuoteCommands.push_back("\\$'"); + badQuoteCommands.push_back("-Dir=\"test"); + badQuoteCommands.push_back("-Dir='test"); + badQuoteCommands.push_back("-Dir=$'test"); + for(vector<string>::const_iterator p = badQuoteCommands.begin(); p != badQuoteCommands.end(); ++p) + { + try + { + IceUtilInternal::Options::split(*p); + test(false); + } + catch(const IceUtilInternal::BadOptException&) + { + } + } + cout << "ok" << endl; + + cout << "checking string splitting... " << flush; + { + vector<string> ss; + test(IceUtilInternal::splitString("", "", ss) && ss.empty()); + ss.clear(); + test(IceUtilInternal::splitString("", ":", ss) && ss.empty()); + ss.clear(); + test(IceUtilInternal::splitString("a", "", ss) && ss.size() == 1 && ss[0] == "a"); + ss.clear(); + test(IceUtilInternal::splitString("a", ":", ss) && ss.size() == 1 && ss[0] == "a"); + ss.clear(); + test(IceUtilInternal::splitString("ab", "", ss) && ss.size() == 1 && ss[0] == "ab"); + ss.clear(); + test(IceUtilInternal::splitString("ab:", ":", ss) && ss.size() == 1 && ss[0] == "ab"); + ss.clear(); + test(IceUtilInternal::splitString(":ab", ":", ss) && ss.size() == 1 && ss[0] == "ab"); + ss.clear(); + test(IceUtilInternal::splitString("a:b", ":", ss) && ss.size() == 2 && ss[0] == "a" && ss[1] == "b"); + ss.clear(); + test(IceUtilInternal::splitString(":a:b:", ":", ss) && ss.size() == 2 && ss[0] == "a" && ss[1] == "b"); + ss.clear(); + +#if defined(_MSC_VER) && _MSC_VER >= 1300 // COMPILERBUG: VC++ 6 doesn't like escaped quotes + test(IceUtilInternal::splitString("\"a\"", ":", ss) && ss.size() == 1 && ss[0] == "a"); + ss.clear(); + test(IceUtilInternal::splitString("\"a\":b", ":", ss) && ss.size() == 2 && ss[0] == "a" && ss[1] == "b"); + ss.clear(); + test(IceUtilInternal::splitString("\"a\":\"b\"", ":", ss) && ss.size() == 2 && ss[0] == "a" && ss[1] == "b"); + ss.clear(); + test(IceUtilInternal::splitString("\"a:b\"", ":", ss) && ss.size() == 1 && ss[0] == "a:b"); + ss.clear(); + test(IceUtilInternal::splitString("a=\"a:b\"", ":", ss) && ss.size() == 1 && ss[0] == "a=a:b"); + ss.clear(); +#endif + + test(IceUtilInternal::splitString("'a'", ":", ss) && ss.size() == 1 && ss[0] == "a"); + ss.clear(); + test(IceUtilInternal::splitString("'\"a'", ":", ss) && ss.size() == 1 && ss[0] == "\"a"); + ss.clear(); + test(IceUtilInternal::splitString("\"'a\"", ":", ss) && ss.size() == 1 && ss[0] == "'a"); + ss.clear(); + +#if defined(_MSC_VER) && _MSC_VER >= 1300 // COMPILERBUG: VC++ 6 doesn't like escaped quotes + test(IceUtilInternal::splitString("a\\'b", ":", ss) && ss.size() == 1 && ss[0] == "a'b"); + ss.clear(); + test(IceUtilInternal::splitString("'a:b\\'c'", ":", ss) && ss.size() == 1 && ss[0] == "a:b'c"); + ss.clear(); + test(IceUtilInternal::splitString("a\\\"b", ":", ss) && ss.size() == 1 && ss[0] == "a\"b"); + ss.clear(); + test(IceUtilInternal::splitString("\"a:b\\\"c\"", ":", ss) && ss.size() == 1 && ss[0] == "a:b\"c"); + ss.clear(); + test(IceUtilInternal::splitString("'a:b\"c'", ":", ss) && ss.size() == 1 && ss[0] == "a:b\"c"); + ss.clear(); + test(IceUtilInternal::splitString("\"a:b'c\"", ":", ss) && ss.size() == 1 && ss[0] == "a:b'c"); + ss.clear(); +#endif + + test(!IceUtilInternal::splitString("a\"b", ":", ss)); + } + cout << "ok" << endl; + + return EXIT_SUCCESS; +} |