1 // Licensed to the .NET Foundation under one or more agreements. 2 // The .NET Foundation licenses this file to you under the MIT license. 3 // See the LICENSE file in the project root for more information. 4 5 using System.Collections.Generic; 6 using Xunit; 7 8 namespace System.Text.Tests 9 { 10 public class UnicodeEncodingTests 11 { 12 [Fact] Ctor_Empty()13 public void Ctor_Empty() 14 { 15 UnicodeEncoding encoding = new UnicodeEncoding(); 16 VerifyUnicodeEncoding(encoding, bigEndian: false, byteOrderMark: true, throwOnInvalidBytes: false); 17 } 18 19 [Theory] 20 [InlineData(true, true)] 21 [InlineData(true, false)] 22 [InlineData(false, true)] 23 [InlineData(false, false)] Ctor_Bool_Bool(bool bigEndian, bool byteOrderMark)24 public void Ctor_Bool_Bool(bool bigEndian, bool byteOrderMark) 25 { 26 UnicodeEncoding encoding = new UnicodeEncoding(bigEndian, byteOrderMark); 27 VerifyUnicodeEncoding(encoding, bigEndian, byteOrderMark, throwOnInvalidBytes: false); 28 29 Ctor_Bool_Bool_Bool(bigEndian, byteOrderMark, throwOnInvalidBytes: true); 30 Ctor_Bool_Bool_Bool(bigEndian, byteOrderMark, throwOnInvalidBytes: false); 31 } 32 Ctor_Bool_Bool_Bool(bool bigEndian, bool byteOrderMark, bool throwOnInvalidBytes)33 public void Ctor_Bool_Bool_Bool(bool bigEndian, bool byteOrderMark, bool throwOnInvalidBytes) 34 { 35 UnicodeEncoding encoding = new UnicodeEncoding(bigEndian, byteOrderMark, throwOnInvalidBytes); 36 VerifyUnicodeEncoding(encoding, bigEndian, byteOrderMark, throwOnInvalidBytes); 37 } 38 VerifyUnicodeEncoding(UnicodeEncoding encoding, bool bigEndian, bool byteOrderMark, bool throwOnInvalidBytes)39 public static void VerifyUnicodeEncoding(UnicodeEncoding encoding, bool bigEndian, bool byteOrderMark, bool throwOnInvalidBytes) 40 { 41 if (byteOrderMark) 42 { 43 if (bigEndian) 44 { 45 Assert.Equal(new byte[] { 0xfe, 0xff }, encoding.GetPreamble()); 46 } 47 else 48 { 49 Assert.Equal(new byte[] { 0xff, 0xfe }, encoding.GetPreamble()); 50 } 51 } 52 else 53 { 54 Assert.Empty(encoding.GetPreamble()); 55 } 56 57 if (throwOnInvalidBytes) 58 { 59 Assert.Equal(EncoderFallback.ExceptionFallback, encoding.EncoderFallback); 60 Assert.Equal(DecoderFallback.ExceptionFallback, encoding.DecoderFallback); 61 } 62 else 63 { 64 Assert.Equal(new EncoderReplacementFallback("\uFFFD"), encoding.EncoderFallback); 65 Assert.Equal(new DecoderReplacementFallback("\uFFFD"), encoding.DecoderFallback); 66 } 67 } 68 Encodings_TestData()69 public static IEnumerable<object[]> Encodings_TestData() 70 { 71 yield return new object[] { new UnicodeEncoding(true, true, true), "utf-16BE" }; 72 yield return new object[] { new UnicodeEncoding(true, true, false), "utf-16BE" }; 73 yield return new object[] { new UnicodeEncoding(true, false, true), "utf-16BE" }; 74 yield return new object[] { new UnicodeEncoding(true, false, false), "utf-16BE" }; 75 yield return new object[] { new UnicodeEncoding(false, true, true), "utf-16" }; 76 yield return new object[] { new UnicodeEncoding(false, true, false), "utf-16" }; 77 yield return new object[] { new UnicodeEncoding(false, false, true), "utf-16" }; 78 yield return new object[] { new UnicodeEncoding(false, false, false), "utf-16" }; 79 80 yield return new object[] { Encoding.Unicode, "utf-16" }; 81 yield return new object[] { Encoding.GetEncoding("utf-16"), "utf-16" }; 82 yield return new object[] { Encoding.GetEncoding("utf-16LE"), "utf-16" }; 83 yield return new object[] { Encoding.GetEncoding("utf-16BE"), "utf-16BE" }; 84 } 85 86 [Theory] 87 [MemberData(nameof(Encodings_TestData))] WebName(UnicodeEncoding encoding, string expected)88 public void WebName(UnicodeEncoding encoding, string expected) 89 { 90 Assert.Equal(expected, encoding.WebName); 91 } 92 93 [Theory] 94 [MemberData(nameof(Encodings_TestData))] CodePage(UnicodeEncoding encoding, string webName)95 public void CodePage(UnicodeEncoding encoding, string webName) 96 { 97 Assert.Equal(webName == "utf-16" ? 1200 : 1201, encoding.CodePage); 98 } 99 100 [Theory] 101 [MemberData(nameof(Encodings_TestData))] EncodingName(UnicodeEncoding encoding, string _)102 public void EncodingName(UnicodeEncoding encoding, string _) 103 { 104 Assert.NotEmpty(encoding.EncodingName); // Unicode (UTF-16) in en-US 105 } 106 107 [Theory] 108 [MemberData(nameof(Encodings_TestData))] IsSingleByte(UnicodeEncoding encoding, string _)109 public void IsSingleByte(UnicodeEncoding encoding, string _) 110 { 111 Assert.False(encoding.IsSingleByte); 112 } 113 114 [Theory] 115 [MemberData(nameof(Encodings_TestData))] Clone(UnicodeEncoding encoding, string _)116 public void Clone(UnicodeEncoding encoding, string _) 117 { 118 UnicodeEncoding clone = (UnicodeEncoding)encoding.Clone(); 119 Assert.NotSame(encoding, clone); 120 Assert.Equal(encoding, clone); 121 } 122 Equals_TestData()123 public static IEnumerable<object[]> Equals_TestData() 124 { 125 yield return new object[] { new UnicodeEncoding(), new UnicodeEncoding(), true }; 126 yield return new object[] { new UnicodeEncoding(), new UnicodeEncoding(false, true), true }; 127 yield return new object[] { new UnicodeEncoding(), new UnicodeEncoding(false, false), false }; 128 129 yield return new object[] { Encoding.Unicode, Encoding.Unicode, true }; 130 yield return new object[] { Encoding.Unicode, Encoding.GetEncoding("Unicode"), true }; 131 yield return new object[] { Encoding.Unicode, Encoding.GetEncoding("utf-16"), true }; 132 yield return new object[] { Encoding.Unicode, Encoding.GetEncoding("utf-16LE"), true }; 133 yield return new object[] { Encoding.Unicode, new UnicodeEncoding(false, true), true }; 134 yield return new object[] { Encoding.Unicode, new UnicodeEncoding(true, true), false }; 135 136 yield return new object[] { Encoding.BigEndianUnicode, Encoding.BigEndianUnicode, true }; 137 yield return new object[] { Encoding.BigEndianUnicode, Encoding.GetEncoding("utf-16BE"), true }; 138 yield return new object[] { Encoding.BigEndianUnicode, new UnicodeEncoding(true, true), true }; 139 yield return new object[] { Encoding.BigEndianUnicode, new UnicodeEncoding(false, true), false }; 140 141 yield return new object[] { new UnicodeEncoding(), new TimeSpan(), false }; 142 yield return new object[] { new UnicodeEncoding(), null, false }; 143 } 144 145 [Theory] 146 [MemberData(nameof(Equals_TestData))] Equals(UnicodeEncoding encoding, object value, bool expected)147 public void Equals(UnicodeEncoding encoding, object value, bool expected) 148 { 149 Assert.Equal(expected, encoding.Equals(value)); 150 Assert.Equal(expected, encoding.GetHashCode().Equals(value?.GetHashCode())); 151 } 152 } 153 } 154