|
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