1 // UnixMarshalTests.cs - NUnit2 Test Cases for Mono.Unix.UnixMarshal class
4 // Jonathan Pryor (jonpryor@vt.edu)
6 // (c) 2005 Jonathan Pryor
11 using System.Collections.Generic;
13 using System.Runtime.InteropServices;
17 namespace MonoTests.Mono.Unix {
19 class RandomEncoding : UTF8Encoding {
20 public RandomEncoding ()
25 public override int GetMaxByteCount (int value)
31 [TestFixture, Category ("NotOnWindows")]
32 public class UnixMarshalTest {
34 public static void Main ()
36 string s = UnixMarshal.GetErrorDescription (Errno.ERANGE);
37 Console.WriteLine ("ERANGE={0}", s);
38 s = UnixMarshal.GetErrorDescription ((Errno) 999999);
39 Console.WriteLine ("Invalid={0}", s);
44 public void BXC10074 ()
46 var result = UnixMarshal.StringToHeap (null, Encoding.ASCII);
47 Assert.AreEqual (IntPtr.Zero, result, "This used to crash due to a NullReferenceException");
51 public void TestStringToHeap ()
54 "Hello, world!", true, true,
55 "MS Pゴシック", false, true,
58 for (int i = 0; i < data.Length; i += 3) {
59 string s = (string) data [i+0];
60 bool valid_ascii = (bool) data [i+1];
61 bool valid_unicode = (bool) data [i+2];
63 StringToHeap (s, valid_ascii, valid_unicode);
67 private static void StringToHeap (string s, bool validAscii, bool validUnicode)
69 StringToHeap (s, Encoding.ASCII, validAscii);
70 StringToHeap (s, Encoding.UTF7, validUnicode);
71 StringToHeap (s, Encoding.UTF8, validUnicode);
72 StringToHeap (s, Encoding.Unicode, validUnicode);
73 StringToHeap (s, Encoding.BigEndianUnicode, validUnicode);
74 StringToHeap (s, new RandomEncoding (), validUnicode);
77 private static void StringToHeap (string s, Encoding e, bool mustBeEqual)
79 IntPtr p = UnixMarshal.StringToHeap (s, e);
81 string _s = UnixMarshal.PtrToString (p, e);
83 Assert.AreEqual (s, _s, "#TSTA (" + e.GetType() + ")");
86 UnixMarshal.FreeHeap (p);
91 public void TestPtrToString ()
93 IntPtr p = UnixMarshal.AllocHeap (1);
94 Marshal.WriteByte (p, 0);
95 string s = UnixMarshal.PtrToString (p);
96 UnixMarshal.FreeHeap (p);
100 public void TestUtf32PtrToString ()
102 var utf32NativeEndianNoBom = new UTF32Encoding(
103 bigEndian: !BitConverter.IsLittleEndian,
104 byteOrderMark: false,
105 throwOnInvalidCharacters: true
108 // assemble a buffer that contains:
109 // 1. eight garbage bytes
110 // 2. the native-endian UTF-32 string "Hello, World" without BOM
111 // 3. four 0 bytes (as a C wide string terminator)
112 // 4. the native-endian UTF-32 string "broken" without BOM
114 // 6. four garbage bytes
115 var buf = new List<byte>();
116 for (int i = 0; i < 2; ++i) {
123 buf.AddRange(utf32NativeEndianNoBom.GetBytes("Hello, World"));
125 for (int i = 0; i < 4; ++i) {
129 buf.AddRange(utf32NativeEndianNoBom.GetBytes("broken"));
131 for (int i = 0; i < 8; ++i) {
140 // get the array version of this
141 var bufArr = buf.ToArray();
143 // allocate a buffer that will contain this string
144 IntPtr bufPtr = UnixMarshal.AllocHeap(bufArr.Length);
149 Marshal.Copy(bufArr, 0, bufPtr, bufArr.Length);
151 // try getting it back
152 returned = UnixMarshal.PtrToString(bufPtr + 8, utf32NativeEndianNoBom);
156 UnixMarshal.FreeHeap(bufPtr);
159 Assert.AreEqual("Hello, World", returned);