Merge pull request #3528 from BrzVlad/fix-sgen-check-before-collections
[mono.git] / mcs / class / corlib / Test / System.Text / ASCIIEncodingTest.cs
index 0d135f9168b78c882b2140d43adc897782032b1b..f35a9d3883062cb04a0eaeeeff65f3ef43dc9116 100644 (file)
@@ -4,19 +4,26 @@
 //
 // <c> 2002 Mike Kestner
 
-using NUnit.Framework;
-using System.Text;
 using System;
+using System.Text;
 
+using NUnit.Framework;
+using NUnit.Framework.Constraints;
 
-namespace MonoTests.System.Text {
-
-       public class ASCIIEncodingTest : TestCase {
+#if !MOBILE
+using NUnit.Framework.SyntaxHelpers;
+#endif
 
+namespace MonoTests.System.Text
+{
+       [TestFixture]
+       public class ASCIIEncodingTest
+       {
                private char[] testchars;
                private byte[] testbytes;
 
-               protected override void SetUp ()
+               [SetUp]
+               public void SetUp ()
                {
                        testchars = new char[4];
                        testchars[0] = 'T';
@@ -30,161 +37,224 @@ namespace MonoTests.System.Text {
                        testbytes[3] = (byte) 't';
                }
 
-               // Test GetBytes(char[])
+               [Test]
+               public void IsBrowserDisplay ()
+               {
+                       Assert.IsFalse (Encoding.ASCII.IsBrowserDisplay);
+               }
+
+               [Test]
+               public void IsBrowserSave ()
+               {
+                       Assert.IsFalse (Encoding.ASCII.IsBrowserSave);
+               }
+
+               [Test]
+               public void IsMailNewsDisplay ()
+               {
+                       Assert.IsTrue (Encoding.ASCII.IsMailNewsDisplay);
+               }
+
+               [Test]
+               public void IsMailNewsSave ()
+               {
+                       Assert.IsTrue (Encoding.ASCII.IsMailNewsSave);
+               }
+
+               [Test] // Test GetBytes(char[])
                public void TestGetBytes1 () 
                {
-                       Encoding ascii_encoding = Encoding.ASCII;
+                       Encoding ascii_encoding = Encoding.ASCII;
                        byte[] bytes = ascii_encoding.GetBytes(testchars);
                        for (int i = 0; i < testchars.Length; i++)
-                               AssertEquals (testchars[i], (char) bytes[i]);
-               }
+                               Assert.AreEqual (testchars[i], (char) bytes[i]);
+               }
 
-               // Test GetBytes(char[], int, int)
+               [Test] // Test GetBytes(char[], int, int)
                public void TestGetBytes2 () 
                {
-                       Encoding ascii_encoding = Encoding.ASCII;
+                       Encoding ascii_encoding = Encoding.ASCII;
                        byte[] bytes = ascii_encoding.GetBytes(testchars, 1, 1);
-                       AssertEquals (1, bytes.Length);
-                       AssertEquals (testchars[1], (char) bytes[0]);
-               }
+                       Assert.AreEqual (1, bytes.Length, "#1");
+                       Assert.AreEqual (testchars [1], (char) bytes [0], "#2");
+               }
 
-               // Test non-ASCII char in char[]
+               [Test] // Test non-ASCII char in char[]
                public void TestGetBytes3 () 
                {
-                       Encoding ascii_encoding = Encoding.ASCII;
+                       Encoding ascii_encoding = Encoding.ASCII;
                        testchars[2] = (char) 0x80;
                        byte[] bytes = ascii_encoding.GetBytes(testchars);
-                       AssertEquals ('T', (char) bytes[0]);
-                       AssertEquals ('e', (char) bytes[1]);
-                       AssertEquals ('?', (char) bytes[2]);
-                       AssertEquals ('t', (char) bytes[3]);
-               }
+                       Assert.AreEqual ('T', (char) bytes [0], "#1");
+                       Assert.AreEqual ('e', (char) bytes [1], "#2");
+                       Assert.AreEqual ('?', (char) bytes [2], "#3");
+                       Assert.AreEqual ('t', (char) bytes [3], "#4");
+               }
 
-               // Test GetBytes(char[], int, int, byte[], int)
+               [Test] // Test GetBytes(char[], int, int, byte[], int)
                public void TestGetBytes4 () 
                {
-                       Encoding ascii_encoding = Encoding.ASCII;
+                       Encoding ascii_encoding = Encoding.ASCII;
                        byte[] bytes = new Byte[1];
                        int cnt = ascii_encoding.GetBytes(testchars, 1, 1, bytes, 0);
-                       AssertEquals (1, cnt);
-                       AssertEquals (testchars[1], (char) bytes[0]);
-               }
+                       Assert.AreEqual (1, cnt, "#1");
+                       Assert.AreEqual (testchars [1], (char) bytes [0], "#2");
+               }
 
-               // Test GetBytes(string, int, int, byte[], int)
+               [Test] // Test GetBytes(string, int, int, byte[], int)
                public void TestGetBytes5 () 
                {
-                       Encoding ascii_encoding = Encoding.ASCII;
+                       Encoding ascii_encoding = Encoding.ASCII;
                        byte[] bytes = new Byte[1];
                        int cnt = ascii_encoding.GetBytes("Test", 1, 1, bytes, 0);
-                       AssertEquals ('e', (char) bytes[0]);
-               }
+                       Assert.AreEqual ('e', (char) bytes [0], "#1");
+               }
 
-               // Test GetBytes(string)
+               [Test] // Test GetBytes(string)
                public void TestGetBytes6 () 
                {
-                       Encoding ascii_encoding = Encoding.ASCII;
+                       Encoding ascii_encoding = Encoding.ASCII;
                        byte[] bytes = ascii_encoding.GetBytes("Test");
                        for (int i = 0; i < testchars.Length; i++)
-                               AssertEquals (testchars[i], (char) bytes[i]);
-               }
+                               Assert.AreEqual (testchars [i], (char) bytes [i]);
+               }
+
+               [Test] // Test GetBytes(string)
+               public void TestGetBytes7 ()
+               {
+                       var latin1_encoding = Encoding.GetEncoding ("latin1");
+
+                       var expected = new byte [] { 0x3F, 0x20, 0x3F, 0x20, 0x3F };
+                       var actual = latin1_encoding.GetBytes("\u24c8 \u2075 \u221e"); // normal replacement
+                       Assert.AreEqual (expected, actual, "#1");
 
-               // Test GetChars(byte[])
+                       expected = new byte [] { 0x3F, 0x3F };
+                       actual = latin1_encoding.GetBytes("\ud83d\ude0a"); // surrogate pair replacement
+                       Assert.AreEqual (expected, actual, "#2");
+
+                       expected = new byte [] { 0x3F, 0x3F, 0x20 };
+                       actual = latin1_encoding.GetBytes("\ud83d\ude0a "); // surrogate pair replacement
+                       Assert.AreEqual (expected, actual, "#3");
+
+                       expected = new byte [] { 0x20, 0x20, 0x3F, 0x3F, 0x20, 0x20 };
+                       actual = latin1_encoding.GetBytes("  \ud83d\ude0a  "); // surrogate pair replacement
+                       Assert.AreEqual (expected, actual, "#4");
+
+                       expected = new byte [] { 0x20, 0x20, 0x3F, 0x3F, 0x20, 0x20 };
+                       actual = latin1_encoding.GetBytes("  \ud834\udd1e  "); // surrogate pair replacement
+                       Assert.AreEqual (expected, actual, "#5");
+
+                       expected = new byte [] { 0x41, 0x42, 0x43, 0x00, 0x41, 0x42, 0x43 };
+                       actual = latin1_encoding.GetBytes("ABC\0ABC"); // embedded zero byte not replaced
+                       Assert.AreEqual (expected, actual, "#6");
+
+                       expected = new byte [] { 0x20, 0x20, 0x3F, 0x20, 0x20 };
+                       actual = latin1_encoding.GetBytes("  \ud834  "); // invalid surrogate pair replacement
+                       Assert.AreEqual (expected, actual, "#7");
+               }
+
+               [Test] // Test GetChars(byte[])
                public void TestGetChars1 () 
                {
-                       Encoding ascii_encoding = Encoding.ASCII;
+                       Encoding ascii_encoding = Encoding.ASCII;
                        char[] chars = ascii_encoding.GetChars(testbytes);
                        for (int i = 0; i < testbytes.Length; i++)
-                               AssertEquals (testbytes[i], (byte) chars[i]);
-               }
+                               Assert.AreEqual (testbytes[i], (byte) chars[i]);
+               }
 
-               // Test GetChars(byte[], int, int)
+               [Test] // Test GetChars(byte[], int, int)
                public void TestGetChars2 () 
                {
-                       Encoding ascii_encoding = Encoding.ASCII;
+                       Encoding ascii_encoding = Encoding.ASCII;
                        char[] chars = ascii_encoding.GetChars(testbytes, 1, 1);
-                       AssertEquals (1, chars.Length);
-                       AssertEquals (testbytes[1], (byte) chars[0]);
-               }
+                       Assert.AreEqual (1, chars.Length, "#1");
+                       Assert.AreEqual (testbytes [1], (byte) chars [0], "#2");
+               }
 
-               // Test non-ASCII char in byte[]
+               [Test] // Test non-ASCII char in byte[]
                public void TestGetChars3 () 
                {
-                       Encoding ascii_encoding = Encoding.ASCII;
+                       Encoding ascii_encoding = Encoding.ASCII;
                        testbytes[2] = 0x80;
                        char[] chars = ascii_encoding.GetChars(testbytes);
-                       AssertEquals ('T', chars[0]);
-                       AssertEquals ('e', chars[1]);
-                       AssertEquals ('?', chars[2]);
-                       AssertEquals ('t', chars[3]);
-               }
+                       Assert.AreEqual ('T', chars [0], "#1");
+                       Assert.AreEqual ('e', chars [1], "#2");
+                       Assert.AreEqual ('?', chars [2], "#3");
+                       Assert.AreEqual ('t', chars [3], "#4");
+               }
 
-               // Test GetChars(byte[], int, int, char[], int)
+               [Test] // Test GetChars(byte[], int, int, char[], int)
                public void TestGetChars4 () 
                {
-                       Encoding ascii_encoding = Encoding.ASCII;
+                       Encoding ascii_encoding = Encoding.ASCII;
                        char[] chars = new char[1];
                        int cnt = ascii_encoding.GetChars(testbytes, 1, 1, chars, 0);
-                       AssertEquals (1, cnt);
-                       AssertEquals (testbytes[1], (byte) chars[0]);
-               }
+                       Assert.AreEqual (1, cnt, "#1");
+                       Assert.AreEqual (testbytes [1], (byte) chars [0], "#2");
+               }
 
-               // Test GetString(char[])
+               [Test] // Test GetString(char[])
                public void TestGetString1 () 
                {
-                       Encoding ascii_encoding = Encoding.ASCII;
+                       Encoding ascii_encoding = Encoding.ASCII;
                        string str = ascii_encoding.GetString(testbytes);
-                       AssertEquals ("Test", str);
-               }
+                       Assert.AreEqual ("Test", str);
+               }
 
-               // Test GetString(char[], int, int)
+               [Test] // Test GetString(char[], int, int)
                public void TestGetString2 () 
                {
-                       Encoding ascii_encoding = Encoding.ASCII;
+                       Encoding ascii_encoding = Encoding.ASCII;
                        string str = ascii_encoding.GetString(testbytes, 1, 2);
-                       AssertEquals ("es", str);
-               }
+                       Assert.AreEqual ("es", str);
+               }
 
-               // Test invalid byte handling
+               [Test] // Test invalid byte handling
                public void TestGetString3 () 
                {
                        Encoding encoding = Encoding.ASCII;
                        byte [] bytes = new byte [] {0x61, 0xE1, 0xE2};
                        string s = encoding.GetString (bytes, 0, 3);
-#if NET_2_0
-                       AssertEquals ("a??", s);
-#else
-                       AssertEquals ("aab", s);
-#endif
+                       Assert.AreEqual ("a??", s);
                }
 
-               // Test Decoder
+               [Test] // Test Decoder
                public void TestDecoder ()
                {
-                       Encoding ascii_encoding = Encoding.ASCII;
+                       Encoding ascii_encoding = Encoding.ASCII;
                        char[] chars = new char[1];
                        int cnt = ascii_encoding.GetDecoder().GetChars(testbytes, 1, 1, chars, 0);
-                       AssertEquals (1, cnt);
-                       AssertEquals (testbytes[1], (byte) chars[0]);
+                       Assert.AreEqual (1, cnt, "#1");
+                       Assert.AreEqual (testbytes [1], (byte) chars [0], "#2");
                }
 
-               // Test Decoder
+               [Test] // Test Decoder
                public void TestEncoder ()
                {
-                       Encoding ascii_encoding = Encoding.ASCII;
+                       Encoding ascii_encoding = Encoding.ASCII;
                        byte[] bytes = new Byte[1];
                        int cnt = ascii_encoding.GetEncoder().GetBytes(testchars, 1, 1, bytes, 0, false);
-                       AssertEquals (1, cnt);
-                       AssertEquals (testchars[1], (char) bytes[0]);
+                       Assert.AreEqual (1, cnt, "#1");
+                       Assert.AreEqual (testchars [1], (char) bytes [0], "#2");
                }
 
+               [Test]
                public void TestZero ()
                {
                        Encoding encoding = Encoding.ASCII;
-                       AssertEquals ("#01", encoding.GetString (new byte [0]), "");
-                       AssertEquals ("#02", encoding.GetString (new byte [0], 0, 0), "");
+                       Assert.AreEqual (string.Empty, encoding.GetString (new byte [0]), "#1");
+                       Assert.AreEqual (string.Empty, encoding.GetString (new byte [0], 0, 0), "#2");
+               }
+
+               [Test]
+               [ExpectedException (typeof (EncoderFallbackException))]
+               public void EncoderFallback ()
+               {
+                       Encoding e = Encoding.ASCII.Clone () as Encoding;
+                       e.EncoderFallback = new EncoderExceptionFallback ();
+                       e.GetBytes ("\u24c8");
                }
 
-#if NET_2_0
                [Test]
                [ExpectedException (typeof (DecoderFallbackException))]
                public void DecoderFallback ()
@@ -193,7 +263,97 @@ namespace MonoTests.System.Text {
                        e.DecoderFallback = new DecoderExceptionFallback ();
                        e.GetChars (new byte [] {0x80});
                }
-#endif
-       }
 
+               [Test]
+       //      [ExpectedException (typeof (ArgumentException))]
+               public void DecoderFallback2 ()
+               {
+                       var bytes = new byte[] {
+                               0x30, 0xa0, 0x31, 0xa8
+                       };
+                       var enc = (ASCIIEncoding)Encoding.ASCII.Clone ();
+                       enc.DecoderFallback = new TestFallbackDecoder ();
+                       
+                       var chars = new char [7];
+                       var ret = enc.GetChars (bytes, 0, bytes.Length, chars, 0);
+                       Console.WriteLine (ret);
+                       
+                       for (int i = 0; i < chars.Length; i++) {
+                               Console.Write ("{0:x2} ", (int)chars [i]);
+                       }
+                       Console.WriteLine ();
+               }
+               
+               [Test]
+               public void DecoderFallback3 ()
+               {
+                       var bytes = new byte[] {
+                               0x30, 0xa0, 0x31, 0xa8
+                       };
+                       var enc = (ASCIIEncoding)Encoding.ASCII.Clone ();
+                       enc.DecoderFallback = new TestFallbackDecoder ();
+                       
+                       var chars = new char[] { '9', '8', '7', '6', '5' };
+                       var ret = enc.GetChars (bytes, 0, bytes.Length, chars, 0);
+                       
+                       Assert.That (ret, Is.EqualTo (2), "ret");
+                       Assert.That (chars [0], Is.EqualTo ('0'), "chars[0]");
+                       Assert.That (chars [1], Is.EqualTo ('1'), "chars[1]");
+                       Assert.That (chars [2], Is.EqualTo ('7'), "chars[2]");
+                       Assert.That (chars [3], Is.EqualTo ('6'), "chars[3]");
+                       Assert.That (chars [4], Is.EqualTo ('5'), "chars[4]");
+               }
+               
+               class TestFallbackDecoder : DecoderFallback {
+                       const int count = 2;
+                       
+                       public override int MaxCharCount {
+                               get { return count; }
+                       }
+                       
+                       public override DecoderFallbackBuffer CreateFallbackBuffer ()
+                       {
+                               return new Buffer ();
+                       }
+                       
+                       class Buffer : DecoderFallbackBuffer {
+                               char[] queue;
+                               int index;
+                               
+                               public override int Remaining {
+                                       get {
+                                               return queue.Length - index;
+                                       }
+                               }
+                               
+                               public override char GetNextChar ()
+                               {
+                                       return index < queue.Length ? queue [index++] : '\0';
+                               }
+                               
+                               public override bool Fallback (byte[] bytes, int unused)
+                               {
+                                       queue = new char[bytes.Length * count];
+                                       index = 0;
+                                       for (int i = 0; i < bytes.Length; i++) {
+                                               for (int j = 0; j < count; j++)
+                                                       queue [index++] = (char)(bytes [i]+j);
+                                       }
+                                       return true;
+                               }
+                               
+                               public override bool MovePrevious ()
+                               {
+                                       throw new NotImplementedException ();
+                               }
+                               
+                               public override void Reset ()
+                               {
+                                       base.Reset ();
+                               }
+                       }
+               }
+               
+
+       }
 }