|
1 | | -using System; |
| 1 | +#define MarshalCharAsManagedSByte // Tests need to behave differently when char is mapped to sbyte |
| 2 | + |
| 3 | +using System; |
2 | 4 | using System.Reflection; |
3 | 5 | using CommonTest; |
4 | 6 | using NUnit.Framework; |
@@ -396,8 +398,13 @@ public void TestNestedAnonymousTypes() |
396 | 398 | Assert.That(testNestedTypes.ToVerifyCorrectLayoutBefore, Is.EqualTo(5)); |
397 | 399 | testNestedTypes.I = 10; |
398 | 400 | Assert.That(testNestedTypes.I, Is.EqualTo(10)); |
| 401 | +#if MarshalCharAsManagedSByte |
| 402 | + testNestedTypes.C = Convert.ToSByte('D'); |
| 403 | + Assert.That(Convert.ToChar(testNestedTypes.C), Is.EqualTo('D')); |
| 404 | +#else |
399 | 405 | testNestedTypes.C = 'D'; |
400 | 406 | Assert.That(testNestedTypes.C, Is.EqualTo('D')); |
| 407 | +#endif |
401 | 408 | testNestedTypes.ToVerifyCorrectLayoutAfter = 15; |
402 | 409 | Assert.That(testNestedTypes.ToVerifyCorrectLayoutAfter, Is.EqualTo(15)); |
403 | 410 | } |
@@ -459,9 +466,19 @@ public void TestCharMarshalling() |
459 | 466 | { |
460 | 467 | using (Foo2 foo2 = new Foo2()) |
461 | 468 | { |
| 469 | +#if MarshalCharAsManagedSByte |
| 470 | + for (Int32 c = sbyte.MinValue; c <= sbyte.MaxValue; c++) |
| 471 | + { |
| 472 | + sbyte cSbyte = Convert.ToSByte(c); |
| 473 | + sbyte charMarshalled = foo2.TestCharMarshalling(cSbyte); |
| 474 | + Int32 charBackConverted = Convert.ToInt32(charMarshalled); |
| 475 | + Assert.That(charBackConverted, Is.EqualTo(c)); |
| 476 | + } |
| 477 | +#else |
462 | 478 | for (char c = char.MinValue; c <= sbyte.MaxValue; c++) |
463 | 479 | Assert.That(foo2.TestCharMarshalling(c), Is.EqualTo(c)); |
464 | 480 | Assert.Catch<OverflowException>(() => foo2.TestCharMarshalling('ж')); |
| 481 | +#endif |
465 | 482 | } |
466 | 483 | } |
467 | 484 |
|
@@ -511,7 +528,11 @@ public void TestOperators() |
511 | 528 | { |
512 | 529 | using (var @class = new ClassWithOverloadedOperators()) |
513 | 530 | { |
| 531 | +#if MarshalCharAsManagedSByte |
| 532 | + sbyte @char = @class; |
| 533 | +#else |
514 | 534 | char @char = @class; |
| 535 | +#endif |
515 | 536 | Assert.That(@char, Is.EqualTo(1)); |
516 | 537 | short @short = @class; |
517 | 538 | Assert.That(@short, Is.EqualTo(3)); |
@@ -573,7 +594,12 @@ public void TestProperties() |
573 | 594 | Assert.That(prop.StartWithVerb, Is.EqualTo(25)); |
574 | 595 | prop.StartWithVerb = 5; |
575 | 596 |
|
| 597 | +#if MarshalCharAsManagedSByte |
| 598 | + sbyte cSByte = Convert.ToSByte('a'); |
| 599 | + Assert.That(prop.Contains(cSByte), Is.EqualTo(prop.Contains("a"))); |
| 600 | +#else |
576 | 601 | Assert.That(prop.Contains('a'), Is.EqualTo(prop.Contains("a"))); |
| 602 | +#endif |
577 | 603 |
|
578 | 604 | Assert.That(prop.conflict, Is.EqualTo(CommonTest.TestProperties.Conflict.Value1)); |
579 | 605 | prop.conflict = CommonTest.TestProperties.Conflict.Value2; |
@@ -849,8 +875,14 @@ public void TestVirtualReturningClassWithCharField() |
849 | 875 | hasProblematicFields.B = true; |
850 | 876 | Assert.That(hasProblematicFields.B, Is.EqualTo(true)); |
851 | 877 | Assert.That(hasProblematicFields.C, Is.EqualTo(char.MinValue)); |
| 878 | +#if MarshalCharAsManagedSByte |
| 879 | + hasProblematicFields.C = Convert.ToSByte('a'); |
| 880 | + Assert.That(Convert.ToChar(hasProblematicFields.C), Is.EqualTo('a')); |
| 881 | +#else |
852 | 882 | hasProblematicFields.C = 'a'; |
853 | 883 | Assert.That(hasProblematicFields.C, Is.EqualTo('a')); |
| 884 | +#endif |
| 885 | + |
854 | 886 | } |
855 | 887 | } |
856 | 888 |
|
@@ -897,10 +929,17 @@ public void TestFixedCharArray() |
897 | 929 | { |
898 | 930 | using (var foo = new Foo()) |
899 | 931 | { |
| 932 | +#if MarshalCharAsManagedSByte |
| 933 | + foo.FixedCharArray = new sbyte[] { Convert.ToSByte('a'), Convert.ToSByte('b'), Convert.ToSByte('c') }; |
| 934 | + Assert.That(foo.FixedCharArray[0], Is.EqualTo('a')); |
| 935 | + Assert.That(foo.FixedCharArray[1], Is.EqualTo('b')); |
| 936 | + Assert.That(foo.FixedCharArray[2], Is.EqualTo('c')); |
| 937 | +#else |
900 | 938 | foo.FixedCharArray = new char[] { 'a', 'b', 'c' }; |
901 | 939 | Assert.That(foo.FixedCharArray[0], Is.EqualTo('a')); |
902 | 940 | Assert.That(foo.FixedCharArray[1], Is.EqualTo('b')); |
903 | 941 | Assert.That(foo.FixedCharArray[2], Is.EqualTo('c')); |
| 942 | +#endif |
904 | 943 | } |
905 | 944 | } |
906 | 945 |
|
@@ -964,6 +1003,39 @@ public void TestNullStdString() |
964 | 1003 | } |
965 | 1004 | } |
966 | 1005 |
|
| 1006 | + [Test] |
| 1007 | + public void TestStdWString() |
| 1008 | + { |
| 1009 | + // when C++ memory is deleted, it's only marked as free but not immediadely freed |
| 1010 | + // this can hide memory bugs while marshalling |
| 1011 | + // so let's use a long string to increase the chance of a crash right away |
| 1012 | + const string t = @"This is a very long string. This is a very long string. This is a very long string. This is a very long string. This is a very long string. This is a very long string. This is a very long string. This is a very long string. |
| 1013 | +This is a very long string. This is a very long string. This is a very long string. This is a very long string. This is a very long string. This is a very long string. This is a very long string. This is a very long string. This is a very long string. |
| 1014 | +This is a very long string. This is a very long string. This is a very long string. This is a very long string. This is a very long string. This is a very long string. This is a very long string. This is a very long string. This is a very long string. |
| 1015 | +This is a very long string. This is a very long string. This is a very long string. This is a very long string. This is a very long string. This is a very long string. This is a very long string. This is a very long string. This is a very long string. |
| 1016 | +This is a very long string. This is a very long string. This is a very long string. This is a very long string. This is a very long string. This is a very long string. This is a very long string. This is a very long string. This is a very long string. |
| 1017 | +This is a very long string. This is a very long string. This is a very long string. This is a very long string. This is a very long string. This is a very long string. This is a very long string. This is a very long string. This is a very long string."; |
| 1018 | + const string unicodeString1 = "你好"; |
| 1019 | + const string unicodeString2 = "Ÿ‰ϰ"; |
| 1020 | + |
| 1021 | + using (var hasStdWString = new HasStdWString()) |
| 1022 | + { |
| 1023 | + Assert.That(hasStdWString.TestStdWString(t), Is.EqualTo(t + "_test")); |
| 1024 | + hasStdWString.S = t; |
| 1025 | + Assert.That(hasStdWString.S, Is.EqualTo(t)); |
| 1026 | + Assert.That(hasStdWString.StdWString, Is.EqualTo(t)); |
| 1027 | + Assert.That(hasStdWString.StdWString, Is.EqualTo(t) |
| 1028 | + Assert.That(hasStdWString.TestStdWString(unicodeString1), Is.EqualTo(unicodeString1 + "_test")); |
| 1029 | + hasStdWString.S = unicodeString1; |
| 1030 | + Assert.That(hasStdWString.S, Is.EqualTo(unicodeString1)); |
| 1031 | + Assert.That(hasStdWString.StdWString, Is.EqualTo(unicodeString1) |
| 1032 | + Assert.That(hasStdWString.TestStdWString(unicodeString2), Is.EqualTo(unicodeString2 + "_test")); |
| 1033 | + hasStdWString.S = unicodeString2; |
| 1034 | + Assert.That(hasStdWString.S, Is.EqualTo(unicodeString2)); |
| 1035 | + Assert.That(hasStdWString.StdWString, Is.EqualTo(unicodeString2)); |
| 1036 | + } |
| 1037 | + } |
| 1038 | + |
967 | 1039 | [Test] |
968 | 1040 | public void TestUTF8() |
969 | 1041 | { |
|
0 commit comments