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