]> git.saurik.com Git - wxWidgets.git/blobdiff - tests/mbconv/convautotest.cpp
Fixed wxRichTextCtrl caret test case
[wxWidgets.git] / tests / mbconv / convautotest.cpp
index fbd70420121c38f12669052bd8387d5fe2a1048b..85eac6a5bc248c76876259ea14600b48d364261a 100644 (file)
     #pragma hdrstop
 #endif
 
-#if wxUSE_WCHAR_T
-
-#ifndef WX_PRECOMP
-#endif // WX_PRECOMP
+#if wxUSE_UNICODE
 
 #include "wx/convauto.h"
 
+#include "wx/mstream.h"
+#include "wx/txtstrm.h"
+
 // ----------------------------------------------------------------------------
 // test class
 // ----------------------------------------------------------------------------
@@ -43,11 +43,20 @@ private:
         CPPUNIT_TEST( UTF16LE );
         CPPUNIT_TEST( UTF16BE );
         CPPUNIT_TEST( UTF8 );
+        CPPUNIT_TEST( StreamUTF8NoBOM );
+        CPPUNIT_TEST( StreamUTF8 );
+        CPPUNIT_TEST( StreamUTF16LE );
+        CPPUNIT_TEST( StreamUTF16BE );
+        CPPUNIT_TEST( StreamUTF32LE );
+        CPPUNIT_TEST( StreamUTF32BE );
     CPPUNIT_TEST_SUITE_END();
 
     // real test function: check that converting the src multibyte string to
     // wide char using wxConvAuto yields wch as the first result
-    void TestFirstChar(const char *src, wchar_t wch);
+    //
+    // the length of the string may need to be passed explicitly if it has
+    // embedded NULs, otherwise it's not necessary
+    void TestFirstChar(const char *src, wchar_t wch, size_t len = wxNO_LEN);
 
     void Empty();
     void Short();
@@ -57,28 +66,41 @@ private:
     void UTF16LE();
     void UTF16BE();
     void UTF8();
+
+    // test whether two lines of text are converted properly from a stream
+    void TestTextStream(const char *src,
+                        size_t srclength,
+                        const wxString& line1,
+                        const wxString& line2);
+
+    void StreamUTF8NoBOM();
+    void StreamUTF8();
+    void StreamUTF16LE();
+    void StreamUTF16BE();
+    void StreamUTF32LE();
+    void StreamUTF32BE();
 };
 
 // register in the unnamed registry so that these tests are run by default
 CPPUNIT_TEST_SUITE_REGISTRATION(ConvAutoTestCase);
 
-// also include in it's own registry so that these tests can be run alone
+// also include in its own registry so that these tests can be run alone
 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(ConvAutoTestCase, "ConvAutoTestCase");
 
 // ----------------------------------------------------------------------------
 // tests
 // ----------------------------------------------------------------------------
 
-void ConvAutoTestCase::TestFirstChar(const char *src, wchar_t wch)
+void ConvAutoTestCase::TestFirstChar(const char *src, wchar_t wch, size_t len)
 {
-    wxWCharBuffer wbuf = wxConvAuto().cMB2WC(src);
+    wxWCharBuffer wbuf = wxConvAuto().cMB2WC(src, len, NULL);
     CPPUNIT_ASSERT( wbuf );
     CPPUNIT_ASSERT_EQUAL( wch, *wbuf );
 }
 
 void ConvAutoTestCase::Empty()
 {
-    TestFirstChar("", wxT('\0'));
+    CPPUNIT_ASSERT( !wxConvAuto().cMB2WC("") );
 }
 
 void ConvAutoTestCase::Short()
@@ -93,22 +115,22 @@ void ConvAutoTestCase::None()
 
 void ConvAutoTestCase::UTF32LE()
 {
-    TestFirstChar("\xff\xfe\0\0A\0\0\0", wxT('A'));
+    TestFirstChar("\xff\xfe\0\0A\0\0\0", wxT('A'), 8);
 }
 
 void ConvAutoTestCase::UTF32BE()
 {
-    TestFirstChar("\0\0\xfe\xff\0\0\0B", wxT('B'));
+    TestFirstChar("\0\0\xfe\xff\0\0\0B", wxT('B'), 8);
 }
 
 void ConvAutoTestCase::UTF16LE()
 {
-    TestFirstChar("\xff\xfeZ\0", wxT('Z'));
+    TestFirstChar("\xff\xfeZ\0", wxT('Z'), 4);
 }
 
 void ConvAutoTestCase::UTF16BE()
 {
-    TestFirstChar("\xfe\xff\0Y", wxT('Y'));
+    TestFirstChar("\xfe\xff\0Y", wxT('Y'), 4);
 }
 
 void ConvAutoTestCase::UTF8()
@@ -118,5 +140,75 @@ void ConvAutoTestCase::UTF8()
 #endif
 }
 
-#endif // wxUSE_WCHAR_T
+void ConvAutoTestCase::TestTextStream(const char *src,
+                                      size_t srclength,
+                                      const wxString& line1,
+                                      const wxString& line2)
+{
+    wxMemoryInputStream instream(src, srclength);
+    wxTextInputStream text(instream);
+
+    CPPUNIT_ASSERT_EQUAL( line1, text.ReadLine() );
+    CPPUNIT_ASSERT_EQUAL( line2, text.ReadLine() );
+}
+
+// the first line of the teststring used in the following functions is an
+// 'a' followed by a Japanese hiragana A (u+3042).
+// The second line is a single Greek beta (u+03B2). There is no blank line
+// at the end.
+
+namespace
+{
+
+const wxString line1 = wxString::FromUTF8("a\xe3\x81\x82");
+const wxString line2 = wxString::FromUTF8("\xce\xb2");
+
+} // anonymous namespace
+
+void ConvAutoTestCase::StreamUTF8NoBOM()
+{
+    // currently this test doesn't work because without the BOM wxConvAuto
+    // decides that the string is in Latin-1 after finding the first (but not
+    // the two subsequent ones which are part of the same UTF-8 sequence!)
+    // 8-bit character
+    //
+    // FIXME: we need to fix this at wxTextInputStream level, see #11570
+#if 0
+    TestTextStream("\x61\xE3\x81\x82\x0A\xCE\xB2",
+                   7, line1, line2);
+#endif
+}
+
+void ConvAutoTestCase::StreamUTF8()
+{
+    TestTextStream("\xEF\xBB\xBF\x61\xE3\x81\x82\x0A\xCE\xB2",
+                   10, line1, line2);
+}
+
+void ConvAutoTestCase::StreamUTF16LE()
+{
+    TestTextStream("\xFF\xFE\x61\x00\x42\x30\x0A\x00\xB2\x03",
+                   10, line1, line2);
+}
+
+void ConvAutoTestCase::StreamUTF16BE()
+{
+    TestTextStream("\xFE\xFF\x00\x61\x30\x42\x00\x0A\x03\xB2",
+                   10, line1, line2);
+}
+
+void ConvAutoTestCase::StreamUTF32LE()
+{
+    TestTextStream("\xFF\xFE\0\0\x61\x00\0\0\x42\x30\0\0\x0A"
+                   "\x00\0\0\xB2\x03\0\0",
+                   20, line1, line2);
+}
+
+void ConvAutoTestCase::StreamUTF32BE()
+{
+    TestTextStream("\0\0\xFE\xFF\0\0\x00\x61\0\0\x30\x42\0\0\x00\x0A"
+                   "\0\0\x03\xB2",
+                   20, line1, line2);
+}
 
+#endif // wxUSE_UNICODE