summaryrefslogtreecommitdiff
path: root/cpp/test/IceUtil/unicode/Client.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/test/IceUtil/unicode/Client.cpp')
-rw-r--r--cpp/test/IceUtil/unicode/Client.cpp256
1 files changed, 256 insertions, 0 deletions
diff --git a/cpp/test/IceUtil/unicode/Client.cpp b/cpp/test/IceUtil/unicode/Client.cpp
new file mode 100644
index 00000000000..6370c9e7333
--- /dev/null
+++ b/cpp/test/IceUtil/unicode/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/FileUtil.h>
+#include <TestCommon.h>
+
+#ifdef _WIN32
+# include <io.h>
+#endif
+
+using namespace IceUtil;
+using namespace std;
+
+//
+// Note that each file starts with a BOM; stringToWstring and wstringToString
+// converts these BOMs back and forth.
+//
+
+//COMPILERFIX: Borland C++ 2010 doesn't support wmain for console applications.
+#if defined(_WIN32) && !defined(__BCPLUSPLUS__)
+
+int
+wmain(int argc, wchar_t* argv[])
+
+#else
+
+int
+main(int argc, char* argv[])
+
+#endif
+{
+ string dir = "";
+
+ if(argc > 1)
+ {
+#ifdef _WIN32
+
+#ifdef __BCPLUSPLUS__
+ dir = argv[1];
+#else
+ dir = IceUtil::wstringToString(argv[1]);
+#endif
+ dir += "\\";
+#else
+ dir = argv[1];
+ dir += "/";
+#endif
+ }
+
+
+ ostringstream os;
+ os << "utf" << sizeof(wchar_t) * 8;
+#ifdef ICE_LITTLE_ENDIAN
+ os << "le";
+#else
+ os << "be";
+#endif
+ string wstringEncoding = os.str();
+ string wcoeurFile = string("coeur.") + wstringEncoding;
+
+ {
+ cout << "testing UTF-8 to wstring (" << wstringEncoding << ") conversion... ";
+ IceUtilInternal::ifstream is((dir + "coeur.utf8"));
+ test(is.good());
+ IceUtilInternal::ifstream bis((dir + wcoeurFile), ios_base::binary);
+ test(bis.good());
+
+ int lineNumber = 0;
+
+ do
+ {
+ string line;
+ getline(is, line, '\n');
+ test(isLegalUTF8Sequence(reinterpret_cast<const Byte*>(line.data()),
+ reinterpret_cast<const Byte*>(line.data() + line.size())));
+ lineNumber++;
+ wstring wline = stringToWstring(line);
+
+ for(size_t i = 0; i < wline.length(); ++i)
+ {
+ wchar_t wc = wline[i];
+ const char* buffer = reinterpret_cast<char*>(&wc);
+ for(size_t j = 0; j < sizeof(wchar_t); ++j)
+ {
+ test(bis.good());
+ char c;
+ bis.get(c);
+ if(buffer[j] != c)
+ {
+ cerr << "Error at line " << lineNumber << " column " << i << endl;
+ cerr << "buffer[j] == " << hex << (int)static_cast<unsigned char>(buffer[j]) << endl;
+ cerr << "c == " << hex << (int)static_cast<unsigned char>(c) << endl;
+ }
+ test(buffer[j] == c);
+ }
+ }
+ //
+ // Skip newline character (Unix-style newline)
+ //
+ if(is.good())
+ {
+ for(size_t j = 0; j < sizeof(wchar_t); ++j)
+ {
+ test(bis.good());
+ char c;
+ bis.get(c);
+ }
+ }
+ else
+ {
+ char c;
+ bis.get(c);
+ test(bis.eof());
+ }
+ } while(is.good());
+
+ cout << "ok" << endl;
+ }
+
+ {
+ cout << "wstring (" << wstringEncoding << ") to UTF-8 conversion... ";
+
+ IceUtilInternal::ifstream bis((dir + wcoeurFile), ios_base::binary);
+ test(bis.good());
+
+ wstring ws;
+ char c;
+
+ do
+ {
+ wchar_t wc;
+ char* buffer = reinterpret_cast<char*>(&wc);
+
+ for(size_t j = 0; j < sizeof(wchar_t); ++j)
+ {
+ if(!bis.good())
+ {
+ break;
+ }
+ bis.get(c);
+ buffer[j] = c;
+ }
+
+ if(bis.good())
+ {
+ ws.push_back(wc);
+ }
+ } while(bis.good());
+
+ string s = wstringToString(ws);
+
+ IceUtilInternal::ifstream nbis((dir + "coeur.utf8"), ios_base::binary);
+ test(nbis.good());
+
+ for(size_t i = 0; i < s.size(); ++i)
+ {
+ test(nbis.good());
+ nbis.get(c);
+ char ci = s[i];
+
+ if(c != ci)
+ {
+ cerr << "i == " << i << endl;
+ cerr << "ci == " << hex << (int)static_cast<unsigned char>(ci) << endl;
+ cerr << "c == " << hex << (int)static_cast<unsigned char>(c) << endl;
+ }
+ test(c == s[i]);
+ }
+ test(!nbis.eof());
+ nbis.get(c);
+ test(nbis.eof());
+
+ cout << "ok" << endl;
+ }
+#ifndef __BCPLUSPLUS__
+ {
+ cout << "testing UTF-8 filename... ";
+ IceUtilInternal::ifstream fn(dir + "filename.txt");
+ string filename;
+ getline(fn, filename);
+ fn.close();
+
+ string filepath = dir + filename;
+
+ {
+ IceUtilInternal::ofstream os(filepath);
+ test(os.is_open());
+ os << "dummy";
+ os.close();
+ }
+
+ IceUtilInternal::isAbsolutePath(filepath);
+ IceUtilInternal::structstat st;
+ test(IceUtilInternal::stat(filepath, &st) == 0);
+
+ test(IceUtilInternal::mkdir(filepath + ".directory", 0777) == 0);
+ test(IceUtilInternal::directoryExists(filepath + ".directory"));
+ test(IceUtilInternal::rmdir(filepath + ".directory") == 0);
+
+ int fd = IceUtilInternal::open(filepath, O_RDONLY);
+ test(fd > 0);
+#if defined(_MSC_VER) && (_MSC_VER >= 1400)
+ test(_close(fd) == 0);
+#else
+ test(close(fd) == 0);
+#endif
+
+ FILE* f = IceUtilInternal::fopen(filepath, "r");
+ test(f != 0);
+ test(::fclose(f) == 0);
+
+ IceUtilInternal::ifstream is(filepath);
+ string str;
+ getline(is, str);
+ test(str == "dummy");
+ is.close();
+
+ IceUtilInternal::ifstream is2;
+ is2.open(filepath);
+ getline(is2, str);
+ test(str == "dummy");
+ is2.close();
+
+ IceUtilInternal::ofstream os(filepath + ".out");
+ os << "dummy" << endl;
+ os.close();
+
+ IceUtilInternal::ofstream os2;
+ os2.open(filepath + ".out", ios_base::app);
+ os2 << "dummy2" << endl;
+ os2.close();
+
+ IceUtilInternal::ifstream is3;
+ is3.open(filepath + ".out");
+ getline(is3, str);
+ test(str == "dummy");
+ getline(is3, str);
+ test(str == "dummy2");
+ is3.close();
+
+ test(IceUtilInternal::unlink(filepath + ".out") == 0);
+
+ IceUtilInternal::unlink(filepath);
+
+ cout << "ok" << endl;
+ }
+#endif
+ return EXIT_SUCCESS;
+}