Merge pull request #5714 from alexischr/update_bockbuild
[mono.git] / mono / tests / marshal2.cs
index a4d02ab1431b7cf04c9fa9ef8aacc2532ea461f6..05550ac2277e360581cabe68284d821f3fd55787 100644 (file)
@@ -3,6 +3,7 @@
 //
 
 using System;
+using System.Text;
 using System.Runtime.InteropServices;
 
 public class Tests {
@@ -37,6 +38,12 @@ public class Tests {
                [MarshalAs (UnmanagedType.ByValArray, SizeConst=2)] public char[] a2;
        }
 
+       [StructLayout (LayoutKind.Sequential, CharSet=CharSet.Ansi)]
+       public struct ByValTStrStruct {
+               [MarshalAs (UnmanagedType.ByValTStr, SizeConst=4)] public string s1;
+               public int i;
+       }
+
        [StructLayout (LayoutKind.Sequential, CharSet=CharSet.Unicode)]
        public struct ByValWStrStruct {
                [MarshalAs (UnmanagedType.ByValTStr, SizeConst=4)] public string s1;
@@ -184,6 +191,44 @@ public class Tests {
         public string Field3;
        }
 
+       public static int test_0_byvaltstr () {
+               ByValTStrStruct s = new ByValTStrStruct ();
+
+               IntPtr p2 = Marshal.AllocHGlobal (Marshal.SizeOf (typeof (ByValTStrStruct)));
+               Marshal.StructureToPtr(s, p2, false);
+
+               /* Check that the ByValTStr is initialized correctly */
+               for (int i = 0; i < 4; ++i)
+                       if (Marshal.ReadByte (p2, i) != 0)
+                               return 31;
+
+               s.s1 = "ABCD";
+               s.i = 55;
+
+               Marshal.StructureToPtr(s, p2, false);
+
+               ByValTStrStruct s2 = (ByValTStrStruct)Marshal.PtrToStructure (p2, typeof (ByValTStrStruct));
+
+               /* The fourth char is lost because of null-termination */
+               if (s2.s1 != "ABC")
+                       return 32;
+
+               if (s2.i != 55)
+                       return 33;
+
+               // Check that decoding also respects the size, even when there is no null terminator
+               byte[] data = Encoding.ASCII.GetBytes ("ABCDXXXX");
+               int size = Marshal.SizeOf (typeof (ByValTStrStruct));
+               IntPtr buffer = Marshal.AllocHGlobal (size);
+               Marshal.Copy (data, 0, buffer, size);
+
+               s2 = (ByValTStrStruct)Marshal.PtrToStructure (buffer, typeof (ByValTStrStruct));
+               if (s2.s1 != "ABC")
+                       return 34;
+
+               return 0;
+       }
+
        public static int test_0_byvaltstr_unicode () {
                ByValWStrStruct s = new ByValWStrStruct ();
 
@@ -232,4 +277,20 @@ public class Tests {
                        return 1;
                return 0;
        }
+
+       public static int test_0_generic_ptr_to_struct () {
+               int size = Marshal.SizeOf (typeof (SimpleStruct2));
+               IntPtr p = Marshal.AllocHGlobal (size);
+
+               Marshal.WriteInt32 (p, 0, 1); //a
+               Marshal.WriteInt32 (p, 4, 2); //a
+
+               var s = Marshal.PtrToStructure<SimpleStruct2> (p);
+
+               if (s.a != 1)
+                       return 1;
+               if (s.b != 2)
+                       return 2;
+               return 0;
+       }
 }