diff options
Diffstat (limited to 'Examples/test-suite/csharp/li_std_wstring_runme.cs')
-rw-r--r-- | Examples/test-suite/csharp/li_std_wstring_runme.cs | 104 |
1 files changed, 90 insertions, 14 deletions
diff --git a/Examples/test-suite/csharp/li_std_wstring_runme.cs b/Examples/test-suite/csharp/li_std_wstring_runme.cs index 8b7ba1b30..97dfedbf0 100644 --- a/Examples/test-suite/csharp/li_std_wstring_runme.cs +++ b/Examples/test-suite/csharp/li_std_wstring_runme.cs @@ -1,3 +1,6 @@ +// This file has a BOM for UTF-8 +// Notes for displaying UTF-8 properly in Windows: https://stackoverflow.com/questions/49476326/displaying-unicode-in-powershell + using System; using li_std_wstringNamespace; @@ -5,17 +8,38 @@ public class runme { static private void check_equal(char a, char b) { - if (a != b) - throw new Exception("char failed '" + a + "' != '" + b + "'"); + if (a != b) + throw new Exception("char failed '" + a + "' != '" + b + "'"); + } + + static private void display_bytes(string s) + { + Console.Write("["); + if (s != null) + { + foreach (char x in s) + { + int n = Convert.ToInt32(x); + Console.Write(n.ToString("X") + " "); + } + } + else + Console.Write("null"); + Console.WriteLine("]"); } static private void check_equal(string a, string b) { - if (a != b) - throw new Exception("string failed '" + a + "' != '" + b + "'"); + if (li_std_wstring.trace) { + Console.WriteLine("check_equal {0} {1}", a, b); + display_bytes(a); + display_bytes(b); + } + if (a != b) + throw new Exception("string failed '" + a + "' != '" + b + "'"); } - static void Main() + static void Main() { char h = 'h'; check_equal(li_std_wstring.test_wcvalue(h), h); @@ -30,6 +54,8 @@ public class runme li_std_wstring.test_pointer(null); li_std_wstring.test_const_pointer(null); + check_equal(li_std_wstring.test_ccvalue(null), null); + try { li_std_wstring.test_value(null); throw new Exception("NULL check failed"); @@ -37,10 +63,10 @@ public class runme } try { - li_std_wstring.test_reference(null); - throw new Exception("NULL check failed"); + li_std_wstring.test_reference(null); + throw new Exception("NULL check failed"); } catch (ArgumentNullException e) { - if (!e.Message.Contains("type is null")) + if (!e.Message.Contains("is null")) throw new Exception("Missing text " + e); } try { @@ -54,13 +80,24 @@ public class runme x = "hello"; check_equal(li_std_wstring.test_const_reference(x), x); - /* Postpone, tricky, std::wstring portability problem. + /* Tricky, std::wstring portability problem. * std::wstring is 2 bytes on Windows, 4 bytes on Linux, LPWSTR is 2 bytes. - * .NET marshalling should work on Windows but not Linux. - string s = "abc"; - if (!li_std_wstring.test_equal_abc(s)) - throw new Exception("Not equal " + s); - */ + */ + string ss = "abc"; + if (!li_std_wstring.test_equal_abc(ss)) + throw new Exception("Not equal " + ss); + + ss = "JP: 日本語"; + if (!li_std_wstring.test_equal_jp(ss)) + throw new Exception("Not equal " + ss); + + ss = "DE: Kröpeliner Straße"; + if (!li_std_wstring.test_equal_de(ss)) + throw new Exception("Not equal " + ss); + + ss = "RU: Война и мир"; + if (!li_std_wstring.test_equal_ru(ss)) + throw new Exception("Not equal " + ss); try { li_std_wstring.test_throw(); @@ -68,6 +105,24 @@ public class runme check_equal(e.Message, "throwing test_throw"); } + try { + li_std_wstring.test_throw_jp(); + } catch (Exception e) { + check_equal(e.Message, "JP: 日本語"); + } + + try { + li_std_wstring.test_throw_ref_jp(); + } catch (Exception e) { + check_equal(e.Message, "JP: 日本語"); + } + + try { + li_std_wstring.test_throw_wchar_t_ptr(); + } catch (Exception e) { + check_equal(e.Message, "JP: 日本語"); + } + x = "abc\0def"; // Unlike other languages, embedded NULL in std::string not supported // check_equal(li_std_wstring.test_value(x), x); @@ -75,14 +130,28 @@ public class runme check_equal(li_std_wstring.test_ccvalue(x), "abc"); check_equal(li_std_wstring.test_wchar_overload(x), "abc"); + // Member variables + var s = new wchar_test_struct(); + s.wchar_t_member = h; + check_equal(s.wchar_t_member, h); + s.wchar_t_ptr_member = x; + check_equal(s.wchar_t_ptr_member, "abc"); + s.wchar_t_ptr_member = ss; + check_equal(s.wchar_t_ptr_member, ss); + { // Unicode strings + // Strings below are UTF8 in this file, but .NET holds them internally as UTF16 + // DE: https://www.utf8-chartable.de/ + // RU: https://www.utf8-chartable.de/unicode-utf8-table.pl?start=1024 string[] test_strings = { "JP: 日本語", "DE: Kröpeliner Straße" , "RU: Война и мир", "EN: War and Peace" }; foreach (string expected in test_strings) { + if (li_std_wstring.trace) + Console.WriteLine("expected (C#): " + expected); string received = li_std_wstring.test_value(expected); check_equal(received, expected); } @@ -99,6 +168,13 @@ public class runme check_equal(received, expected); } + foreach (string expected in test_strings) + { + s.wchar_t_ptr_member = expected; + string received = s.wchar_t_ptr_member; + check_equal(received, expected); + } + /* Not working for Japanese and Russian characters on Windows, okay on Linux * Is fixed by adding CharSet=CharSet.Unicode to the DllImport, so change to: * [global::System.Runtime.InteropServices.DllImport("li_std_wstring", CharSet=global::System.Runtime.InteropServices.CharSet.Unicode, EntryPoint="CSharp_li_std_wstringNamespace_test_wcvalue")] |