diff --git a/README.md b/README.md index ceeb3a06f067..4c960294fbf8 100644 --- a/README.md +++ b/README.md @@ -48,6 +48,8 @@ Today, the repository contains the following components: * **System.Diagnostics.Process**. Provides access to local and remote processes, and enables the starting and stopping of local system processes. +* **System.Globalization.Extensions**. Provides classes for performing unicode string normalization, culture-specific string comparisons and support the use of non-ASCII characters for Internet domain names. + * **System.IO.FileSystem**. Provides access to the file system, including support for enumerating and manipulating file system objects and for reading and writing files via streams. diff --git a/dir.props b/dir.props index e58acde1d27e..368ab9fa3723 100644 --- a/dir.props +++ b/dir.props @@ -10,7 +10,7 @@ $(ProjectDir)src\ $(ProjectDir)bin\ $(BinDir)tests\ - $(SourceDir)packages\ + $(ProjectDir)packages\ $(PackagesDir)Microsoft.DotNet.BuildTools.$(BuildToolsVersion)\lib\ diff --git a/src/Common/src/Interop/Interop.Globalization.Extensions.manual.cs b/src/Common/src/Interop/Interop.Globalization.Extensions.manual.cs new file mode 100644 index 000000000000..33a553d4a78e --- /dev/null +++ b/src/Common/src/Interop/Interop.Globalization.Extensions.manual.cs @@ -0,0 +1,65 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Runtime.InteropServices; + +internal partial class Interop +{ + // These are error codes we get back from the Normalization DLL + internal const int ERROR_SUCCESS = 0; + internal const int ERROR_NOT_ENOUGH_MEMORY = 8; + internal const int ERROR_INVALID_PARAMETER = 87; + internal const int ERROR_INSUFFICIENT_BUFFER = 122; + internal const int ERROR_NO_UNICODE_TRANSLATION = 1113; + + // The VM can override the last error code with this value in debug builds + // so this value for us is equivalent to ERROR_SUCCESS + internal const int LAST_ERROR_TRASH_VALUE = 42424; + + internal partial class mincore + { + // + // Idn APIs + // + + [DllImport("api-ms-win-core-localization-l1-2-0.dll", CharSet = CharSet.Unicode, SetLastError = true)] + internal static extern int IdnToAscii( + uint dwFlags, + string lpUnicodeCharStr, + int cchUnicodeChar, + [System.Runtime.InteropServices.OutAttribute()] + + char[] lpASCIICharStr, + int cchASCIIChar); + + [DllImport("api-ms-win-core-localization-l1-2-0.dll", CharSet = CharSet.Unicode, SetLastError = true)] + internal static extern int IdnToUnicode( + uint dwFlags, + string lpASCIICharStr, + int cchASCIIChar, + [System.Runtime.InteropServices.OutAttribute()] + + char[] lpUnicodeCharStr, + int cchUnicodeChar); + // + // Normalization APIs + // + + [DllImport("api-ms-win-core-normalization-l1-1-0.dll", CharSet = CharSet.Unicode, SetLastError = true)] + internal static extern bool IsNormalizedString(int normForm, string source, int length); + + [DllImport("api-ms-win-core-normalization-l1-1-0.dll", CharSet = CharSet.Unicode, SetLastError = true)] + internal static extern int NormalizeString( + int normForm, + string source, + int sourceLength, + [System.Runtime.InteropServices.OutAttribute()] + char[] destenation, + int destenationLength); + } +} + + + + diff --git a/src/Common/src/System/Globalization/IdnMapping.cs b/src/Common/src/System/Globalization/IdnMapping.cs new file mode 100644 index 000000000000..11405477b56d --- /dev/null +++ b/src/Common/src/System/Globalization/IdnMapping.cs @@ -0,0 +1,245 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +// +// This file contains the IDN functions and implementation. +// +// This allows encoding of non-ASCII domain names in a "punycode" form, +// for example: +// +// \u5B89\u5BA4\u5948\u7F8E\u6075-with-SUPER-MONKEYS +// +// is encoded as: +// +// xn---with-SUPER-MONKEYS-pc58ag80a8qai00g7n9n +// +// Additional options are provided to allow unassigned IDN characters and +// to validate according to the Std3ASCII Rules (like DNS names). +// +// There are also rules regarding bidirectionality of text and the length +// of segments. +// +// For additional rules see also: +// RFC 3490 - Internationalizing Domain Names in Applications (IDNA) +// RFC 3491 - Nameprep: A Stringprep Profile for Internationalized Domain Names (IDN) +// RFC 3492 - Punycode: A Bootstring encoding of Unicode for Internationalized Domain Names in Applications (IDNA) +// + +using System.Runtime.InteropServices; +using System.Diagnostics.Contracts; + +namespace System.Globalization +{ + // IdnMapping class used to map names to Punycode +#if INTERNAL_GLOBALIZATION_EXTENSIONS + internal +#else + public +#endif + sealed class IdnMapping + { + bool m_bAllowUnassigned; + bool m_bUseStd3AsciiRules; + + public IdnMapping() + { + } + + public bool AllowUnassigned + { + get + { + return this.m_bAllowUnassigned; + } + + set + { + this.m_bAllowUnassigned = value; + } + } + + public bool UseStd3AsciiRules + { + get + { + return this.m_bUseStd3AsciiRules; + } + + set + { + this.m_bUseStd3AsciiRules = value; + } + } + + // Gets ASCII (Punycode) version of the string + public String GetAscii(String unicode) + { + return GetAscii(unicode, 0); + } + + public String GetAscii(String unicode, int index) + { + if (unicode == null) throw new ArgumentNullException("unicode"); + Contract.EndContractBlock(); + return GetAscii(unicode, index, unicode.Length - index); + } + + public String GetAscii(String unicode, int index, int count) + { + if (unicode == null) throw new ArgumentNullException("unicode"); + if (index < 0 || count < 0) + throw new ArgumentOutOfRangeException((index < 0) ? "index" : "count", SR.ArgumentOutOfRange_NeedNonNegNum); + if (index > unicode.Length) + throw new ArgumentOutOfRangeException("byteIndex", SR.ArgumentOutOfRange_Index); + if (index > unicode.Length - count) + throw new ArgumentOutOfRangeException("unicode", SR.ArgumentOutOfRange_IndexCountBuffer); + Contract.EndContractBlock(); + + // We're only using part of the string + unicode = unicode.Substring(index, count); + + return GetAsciiUsingOS(unicode); + } + + [System.Security.SecuritySafeCritical] + private String GetAsciiUsingOS(String unicode) + { + if (unicode.Length == 0) + { + throw new ArgumentException(SR.Argument_IdnBadLabelSize, "unicode"); + } + + if (unicode[unicode.Length - 1] == 0) + { + throw new ArgumentException(SR.Format(SR.Argument_InvalidCharSequence, unicode.Length - 1), "unicode"); + } + + uint flags = (uint)((AllowUnassigned ? IDN_ALLOW_UNASSIGNED : 0) | (UseStd3AsciiRules ? IDN_USE_STD3_ASCII_RULES : 0)); + int length = Interop.mincore.IdnToAscii(flags, unicode, unicode.Length, null, 0); + + int lastError; + + if (length == 0) + { + lastError = Marshal.GetLastWin32Error(); + if (lastError == ERROR_INVALID_NAME) + { + throw new ArgumentException(SR.Argument_IdnIllegalName, "unicode"); + } + + throw new ArgumentException(SR.Argument_InvalidCharSequenceNoIndex, "unicode"); + } + + char[] output = new char[length]; + + length = Interop.mincore.IdnToAscii(flags, unicode, unicode.Length, output, length); + if (length == 0) + { + lastError = Marshal.GetLastWin32Error(); + if (lastError == ERROR_INVALID_NAME) + { + throw new ArgumentException(SR.Argument_IdnIllegalName, "unicode"); + } + + throw new ArgumentException(SR.Argument_InvalidCharSequenceNoIndex, "unicode"); + } + + return new String(output, 0, length); + } + + // Gets Unicode version of the string. Normalized and limited to IDNA characters. + public String GetUnicode(String ascii) + { + return GetUnicode(ascii, 0); + } + + public String GetUnicode(String ascii, int index) + { + if (ascii == null) throw new ArgumentNullException("ascii"); + Contract.EndContractBlock(); + return GetUnicode(ascii, index, ascii.Length - index); + } + + public String GetUnicode(String ascii, int index, int count) + { + if (ascii == null) throw new ArgumentNullException("ascii"); + if (index < 0 || count < 0) + throw new ArgumentOutOfRangeException((index < 0) ? "index" : "count", SR.ArgumentOutOfRange_NeedNonNegNum); + if (index > ascii.Length) + throw new ArgumentOutOfRangeException("byteIndex", SR.ArgumentOutOfRange_Index); + if (index > ascii.Length - count) + throw new ArgumentOutOfRangeException("ascii", SR.ArgumentOutOfRange_IndexCountBuffer); + + // This is a case (i.e. explicitly null-terminated input) where behavior in .NET and Win32 intentionally differ. + // The .NET APIs should (and did in v4.0 and earlier) throw an ArgumentException on input that includes a terminating null. + // The Win32 APIs fail on an embedded null, but not on a terminating null. + if (count > 0 && ascii[index + count - 1] == (char)0) + throw new ArgumentException("ascii", SR.Argument_IdnBadPunycode); + Contract.EndContractBlock(); + + // We're only using part of the string + ascii = ascii.Substring(index, count); + + return GetUnicodeUsingOS(ascii); + } + + + [System.Security.SecuritySafeCritical] + private string GetUnicodeUsingOS(string ascii) + { + uint flags = (uint)((AllowUnassigned ? IDN_ALLOW_UNASSIGNED : 0) | (UseStd3AsciiRules ? IDN_USE_STD3_ASCII_RULES : 0)); + int length = Interop.mincore.IdnToUnicode(flags, ascii, ascii.Length, null, 0); + int lastError; + + if (length == 0) + { + lastError = Marshal.GetLastWin32Error(); + if (lastError == ERROR_INVALID_NAME) + { + throw new ArgumentException(SR.Argument_IdnIllegalName, "ascii"); + } + + throw new ArgumentException(SR.Argument_IdnBadPunycode, "ascii"); + } + + char[] output = new char[length]; + + length = Interop.mincore.IdnToUnicode(flags, ascii, ascii.Length, output, length); + if (length == 0) + { + lastError = Marshal.GetLastWin32Error(); + if (lastError == ERROR_INVALID_NAME) + { + throw new ArgumentException(SR.Argument_IdnIllegalName, "ascii"); + } + + throw new ArgumentException(SR.Argument_IdnBadPunycode, "ascii"); + } + + return new String(output, 0, length); + } + + public override bool Equals(Object obj) + { + IdnMapping that = obj as IdnMapping; + + if (that != null) + { + return this.m_bAllowUnassigned == that.m_bAllowUnassigned && + this.m_bUseStd3AsciiRules == that.m_bUseStd3AsciiRules; + } + + return (false); + } + + public override int GetHashCode() + { + return (this.m_bAllowUnassigned ? 100 : 200) + (this.m_bUseStd3AsciiRules ? 1000 : 2000); + } + + private const int IDN_ALLOW_UNASSIGNED = 0x1; + private const int IDN_USE_STD3_ASCII_RULES = 0x2; + private const int ERROR_INVALID_NAME = 123; + } +} + diff --git a/src/Common/src/System/StringNormalizationExtensions.cs b/src/Common/src/System/StringNormalizationExtensions.cs new file mode 100644 index 000000000000..b8a7fb36bd94 --- /dev/null +++ b/src/Common/src/System/StringNormalizationExtensions.cs @@ -0,0 +1,145 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System.Text; +using System.Diagnostics.Contracts; +using System.Runtime.InteropServices; + +namespace System +{ + +#if INTERNAL_GLOBALIZATION_EXTENSIONS + internal +#else + public +#endif + static class StringNormalizationExtensions + { + public static bool IsNormalized(this string value) + { + return IsNormalized(value, NormalizationForm.FormC); + } + + [System.Security.SecurityCritical] + public static bool IsNormalized(this string value, NormalizationForm normalizationForm) + { + Contract.Requires(value != null); + + if (value == null) + { + throw new ArgumentNullException("value"); + } + + // The only way to know if IsNormalizedString failed is through checking the Win32 last error + Interop.mincore.SetLastError(Interop.ERROR_SUCCESS); + bool result = Interop.mincore.IsNormalizedString((int)normalizationForm, value, value.Length); + + int lastError = Marshal.GetLastWin32Error(); + switch (lastError) + { + case Interop.ERROR_SUCCESS: + case Interop.LAST_ERROR_TRASH_VALUE: + break; + + case Interop.ERROR_INVALID_PARAMETER: + case Interop.ERROR_NO_UNICODE_TRANSLATION: + throw new ArgumentException(SR.Argument_InvalidCharSequenceNoIndex, "value"); + + case Interop.ERROR_NOT_ENOUGH_MEMORY: + throw new OutOfMemoryException(SR.Arg_OutOfMemoryException); + + default: + throw new InvalidOperationException(SR.Format(SR.UnknownError_Num, lastError)); + } + + return result; + } + + public static String Normalize(this string value) + { + // Default to Form C + return Normalize(value, NormalizationForm.FormC); + } + + [System.Security.SecurityCritical] + public static String Normalize(this string value, NormalizationForm normalizationForm) + { + Contract.Requires(value != null); + + if (value == null) + { + throw new ArgumentNullException("value"); + } + + // we depend on Win32 last error when calling NormalizeString + Interop.mincore.SetLastError(Interop.ERROR_SUCCESS); + + // Guess our buffer size first + int iLength = Interop.mincore.NormalizeString((int)normalizationForm, value, value.Length, null, 0); + + int lastError = Marshal.GetLastWin32Error(); + // Could have an error (actually it'd be quite hard to have an error here) + if ((lastError != Interop.ERROR_SUCCESS && lastError != Interop.LAST_ERROR_TRASH_VALUE) || + iLength < 0) + { + if (lastError == Interop.ERROR_INVALID_PARAMETER) + throw new ArgumentException(SR.Argument_InvalidCharSequenceNoIndex, "value"); + + // We shouldn't really be able to get here..., guessing length is + // a trivial math function... + // Can't really be Out of Memory, but just in case: + if (lastError == Interop.ERROR_NOT_ENOUGH_MEMORY) + throw new OutOfMemoryException(SR.Arg_OutOfMemoryException); + + // Who knows what happened? Not us! + throw new InvalidOperationException(SR.Format(SR.UnknownError_Num, lastError)); + } + + // Don't break for empty strings (only possible for D & KD and not really possible at that) + if (iLength == 0) return String.Empty; + + // Someplace to stick our buffer + char[] cBuffer = null; + + for (; ;) + { + // (re)allocation buffer and normalize string + cBuffer = new char[iLength]; + + // Reset last error + Interop.mincore.SetLastError(Interop.ERROR_SUCCESS); + iLength = Interop.mincore.NormalizeString((int)normalizationForm, value, value.Length, cBuffer, cBuffer.Length); + lastError = Marshal.GetLastWin32Error(); + + if (lastError == Interop.ERROR_SUCCESS || lastError == Interop.LAST_ERROR_TRASH_VALUE) + break; + + // Could have an error (actually it'd be quite hard to have an error here) + switch (lastError) + { + // Do appropriate stuff for the individual errors: + case Interop.ERROR_INSUFFICIENT_BUFFER: + iLength = Math.Abs(iLength); + Contract.Assert(iLength > cBuffer.Length, "Buffer overflow should have iLength > cBuffer.Length"); + continue; + + case Interop.ERROR_INVALID_PARAMETER: + case Interop.ERROR_NO_UNICODE_TRANSLATION: + // Illegal code point or order found. Ie: FFFE or D800 D800, etc. + throw new ArgumentException(SR.Argument_InvalidCharSequenceNoIndex, "value"); + + case Interop.ERROR_NOT_ENOUGH_MEMORY: + throw new OutOfMemoryException(SR.Arg_OutOfMemoryException); + + default: + // We shouldn't get here... + throw new InvalidOperationException(SR.Format(SR.UnknownError_Num, lastError)); + } + } + + // Copy our buffer into our new string, which will be the appropriate size + return new String(cBuffer, 0, iLength); + } + } +} + diff --git a/src/Common/src/System/Text/NormalizationForm.cs b/src/Common/src/System/Text/NormalizationForm.cs new file mode 100644 index 000000000000..1651201c00d0 --- /dev/null +++ b/src/Common/src/System/Text/NormalizationForm.cs @@ -0,0 +1,20 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace System.Text +{ + // This is the enumeration for Normalization Forms +#if INTERNAL_GLOBALIZATION_EXTENSIONS + internal +#else + [System.Runtime.InteropServices.ComVisible(true)] + public +#endif + enum NormalizationForm + { + FormC = 1, + FormD = 2, + FormKC = 5, + FormKD = 6 + } +} diff --git a/src/NuGet.Config b/src/NuGet.Config index a9acfbcc30af..52845f5d9f17 100644 --- a/src/NuGet.Config +++ b/src/NuGet.Config @@ -11,4 +11,7 @@ + + + \ No newline at end of file diff --git a/src/System.Collections.NonGeneric/src/System/Collections/KeyValuePairs.cs b/src/System.Collections.NonGeneric/src/System/Collections/KeyValuePairs.cs index 76f2010917c1..dd5aafd11109 100644 --- a/src/System.Collections.NonGeneric/src/System/Collections/KeyValuePairs.cs +++ b/src/System.Collections.NonGeneric/src/System/Collections/KeyValuePairs.cs @@ -14,7 +14,7 @@ namespace System.Collections { - [DebuggerDisplay("{value}", Name = "[{key}]", Type = "")] + [DebuggerDisplay("{_value}", Name = "[{_key}]", Type = "")] internal class KeyValuePairs { [DebuggerBrowsable(DebuggerBrowsableState.Never)] diff --git a/src/System.ComponentModel.Primitives.sln b/src/System.ComponentModel.Primitives.sln new file mode 100644 index 000000000000..e15d7ad60f92 --- /dev/null +++ b/src/System.ComponentModel.Primitives.sln @@ -0,0 +1,39 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2013 +VisualStudioVersion = 12.0.31101.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".nuget", ".nuget", "{47919FF5-DA40-4D99-AF2D-F560282AA913}" + ProjectSection(SolutionItems) = preProject + .nuget\packages.config = .nuget\packages.config + EndProjectSection +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "System.ComponentModel.Primitives", "System.ComponentModel.Primitives\src\System.ComponentModel.Primitives.csproj", "{F620F382-30D1-451E-B125-2A612F92068B}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "System.ComponentModel.Primitives.Tests", "System.ComponentModel.Primitives\tests\System.ComponentModel.Primitives.Tests.csproj", "{C9534425-93FB-494F-8DD8-1E4E3E626FDE}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "XunitTraitsDiscoverers", "Common\tests\XunitTraitsDiscoverers\XunitTraitsDiscoverers.csproj", "{BE8ED8C1-C314-4C4E-A929-64C9C8B3552A}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {F620F382-30D1-451E-B125-2A612F92068B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F620F382-30D1-451E-B125-2A612F92068B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F620F382-30D1-451E-B125-2A612F92068B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F620F382-30D1-451E-B125-2A612F92068B}.Release|Any CPU.Build.0 = Release|Any CPU + {C9534425-93FB-494F-8DD8-1E4E3E626FDE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C9534425-93FB-494F-8DD8-1E4E3E626FDE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C9534425-93FB-494F-8DD8-1E4E3E626FDE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C9534425-93FB-494F-8DD8-1E4E3E626FDE}.Release|Any CPU.Build.0 = Release|Any CPU + {BE8ED8C1-C314-4C4E-A929-64C9C8B3552A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BE8ED8C1-C314-4C4E-A929-64C9C8B3552A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BE8ED8C1-C314-4C4E-A929-64C9C8B3552A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BE8ED8C1-C314-4C4E-A929-64C9C8B3552A}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/src/System.ComponentModel.Primitives/src/Properties/AssemblyInfo.cs b/src/System.ComponentModel.Primitives/src/Properties/AssemblyInfo.cs new file mode 100644 index 000000000000..64ef1d952b42 --- /dev/null +++ b/src/System.ComponentModel.Primitives/src/Properties/AssemblyInfo.cs @@ -0,0 +1,30 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Reflection; +using System.Resources; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyCopyright("\x00a9 Microsoft Corporation. All rights reserved.")] +[assembly: AssemblyCompany("Microsoft Corporation")] +[assembly: AssemblyFileVersion("999.999.999.0")] +[assembly: AssemblyInformationalVersion("999.999.999.0")] +[assembly: AssemblyVersion("999.999.999.0")] +[assembly: AssemblyTitle("System.ComponentModel.Primitives")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyProduct("System.ComponentModel.Primitives")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] +[assembly: NeutralResourcesLanguageAttribute("en-US")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] +[assembly: CLSCompliant(true)] + diff --git a/src/System.ComponentModel.Primitives/src/System.ComponentModel.Primitives.csproj b/src/System.ComponentModel.Primitives/src/System.ComponentModel.Primitives.csproj new file mode 100644 index 000000000000..33202d28ccfc --- /dev/null +++ b/src/System.ComponentModel.Primitives/src/System.ComponentModel.Primitives.csproj @@ -0,0 +1,28 @@ + + + + + Debug + AnyCPU + {F620F382-30D1-451E-B125-2A612F92068B} + Library + System.ComponentModel.Primitives + System.ComponentModel.Primitives + + + + + + + + + + + + + + + + + + diff --git a/src/System.ComponentModel.Primitives/src/System/ComponentModel/ComponentCollection.cs b/src/System.ComponentModel.Primitives/src/System/ComponentModel/ComponentCollection.cs new file mode 100644 index 000000000000..dbaeb8e702ad --- /dev/null +++ b/src/System.ComponentModel.Primitives/src/System/ComponentModel/ComponentCollection.cs @@ -0,0 +1,16 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + + +// Placeholder stub without functionality, here only to support existence of +// TypeConverter. +// Dependency chain: TypeConverter -> ITypeDescriptorContext -> IContainer -> ComponentCollection + +namespace System.ComponentModel +{ + public class ComponentCollection + { + private ComponentCollection() { } + } +} + diff --git a/src/System.ComponentModel.Primitives/src/System/ComponentModel/IComponent.cs b/src/System.ComponentModel.Primitives/src/System/ComponentModel/IComponent.cs new file mode 100644 index 000000000000..0f69ffa17c6f --- /dev/null +++ b/src/System.ComponentModel.Primitives/src/System/ComponentModel/IComponent.cs @@ -0,0 +1,45 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System.Runtime.InteropServices; + +namespace System.ComponentModel +{ + /* + * A "component" is an object that can be placed in a container. + * + * In this context, "containment" refers to logical containment, not visual + * containment. Components and containers can be used in a variety of + * scenarios, including both visual and non-visual scenarios. + * + * To be a component, a class implements the IComponent interface, and provides + * a parameter-less constructor. + * + * A component interacts with its container primarily through a container- + * provided "site". + */ + + /// + /// Provides functionality required by all components. + /// + [ComVisible(true)] + public interface IComponent : IDisposable + { + // The site of the component. + /// + /// When implemented by a class, gets or sets + /// the associated + /// with the . + /// + ISite Site + { + get; + set; + } + + /// + /// Adds a event handler to listen to the Disposed event on the component. + /// + event EventHandler Disposed; + } +} diff --git a/src/System.ComponentModel.Primitives/src/System/ComponentModel/IContainer.cs b/src/System.ComponentModel.Primitives/src/System/ComponentModel/IContainer.cs new file mode 100644 index 000000000000..377877d9d78c --- /dev/null +++ b/src/System.ComponentModel.Primitives/src/System/ComponentModel/IContainer.cs @@ -0,0 +1,50 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System.Runtime.InteropServices; + +namespace System.ComponentModel +{ + /* + * A "container" is an object that logically contains zero or more child + * components. + * + * In this context, "containment" refers to logical containment, not visual + * containment. Components and containers can be used in a variety of + * scenarios, including both visual and non-visual scenarios. + */ + + /// + /// Provides + /// functionality for containers. Containers are objects that logically contain zero or more components. + /// + [ComVisible(true)] + public interface IContainer : IDisposable + { + // Adds a component to the container. + /// + /// Adds the specified to the + /// at the end of the list. + /// + void Add(IComponent component); + + // Adds a component to the container. + /// + /// Adds the specified to the + /// at the end of the list, and assigns a name to the component. + /// + void Add(IComponent component, String name); + + // The components in the container. + /// + /// Gets all the components in the . + /// + ComponentCollection Components { get; } + + // Removes a component from the container. + /// + /// Removes a component from the . + /// + void Remove(IComponent component); + } +} diff --git a/src/System.ComponentModel.Primitives/src/System/ComponentModel/ISite.cs b/src/System.ComponentModel.Primitives/src/System/ComponentModel/ISite.cs new file mode 100644 index 000000000000..100c5401307c --- /dev/null +++ b/src/System.ComponentModel.Primitives/src/System/ComponentModel/ISite.cs @@ -0,0 +1,53 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System.Runtime.InteropServices; + +namespace System.ComponentModel +{ + /* + * Containers use sites to manage and communicate their child components. + * + * A site is a convenient place for a container to store container-specific + * per-component information. The canonical example of such a piece of + * information is the name of the component. + * + * To be a site, a class implements the ISite interface. + */ + + /// + /// Provides functionality required by sites. Sites bind + /// a to a + /// and enable communication between them, as well as provide a way + /// for the container to manage its components. + /// + [ComVisible(true)] + public interface ISite : IServiceProvider + { + // The component sited by this component site. + /// + /// When implemented by a class, gets the component associated with the . + /// + IComponent Component { get; } + + // The container in which the component is sited. + /// + /// When implemented by a class, gets the container associated with the . + /// + IContainer Container { get; } + + // Indicates whether the component is in design mode. + /// + /// When implemented by a class, determines whether the component is in design mode. + /// + bool DesignMode { get; } + + // The name of the component. + // + /// + /// When implemented by a class, gets or sets the name of + /// the component associated with the . + /// + String Name { get; set; } + } +} diff --git a/src/System.ComponentModel.Primitives/src/packages.config b/src/System.ComponentModel.Primitives/src/packages.config new file mode 100644 index 000000000000..97030129e50f --- /dev/null +++ b/src/System.ComponentModel.Primitives/src/packages.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/System.ComponentModel.Primitives/tests/ComponentModelPrimitivesBasicTests.cs b/src/System.ComponentModel.Primitives/tests/ComponentModelPrimitivesBasicTests.cs new file mode 100644 index 000000000000..b67c17d4e224 --- /dev/null +++ b/src/System.ComponentModel.Primitives/tests/ComponentModelPrimitivesBasicTests.cs @@ -0,0 +1,32 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.ComponentModel; +using Xunit; + +namespace Test +{ + public class ComponentModelPrimitivesTests + { + [Fact] + public static void TestComponentPrimitivesModelBasic() + { + // dummy tests to make sure the System.ComponentModel.Primitives library loaded successfully +#pragma warning disable 0219 + IComponent iComponent = null; + Assert.Null(iComponent); + + IContainer iContainer = null; + Assert.Null(iContainer); + + ISite iSite = null; + IServiceProvider iServiceProvider = iSite; + Assert.Null(iServiceProvider); + + ComponentCollection componentCollection = null; + Assert.Null(componentCollection); +#pragma warning restore 0219 + } + } +} diff --git a/src/System.ComponentModel.Primitives/tests/System.ComponentModel.Primitives.Tests.csproj b/src/System.ComponentModel.Primitives/tests/System.ComponentModel.Primitives.Tests.csproj new file mode 100644 index 000000000000..1529926f58fe --- /dev/null +++ b/src/System.ComponentModel.Primitives/tests/System.ComponentModel.Primitives.Tests.csproj @@ -0,0 +1,35 @@ + + + + + Debug + AnyCPU + Library + {C9534425-93FB-494F-8DD8-1E4E3E626FDE} + System.ComponentModel.Primitives.Tests + System.ComponentModel.Primitives.Tests + + + + + + + + + + + + + {be8ed8c1-c314-4c4e-a929-64c9c8b3552a} + XunitTraitsDiscoverers + + + {F620F382-30D1-451E-B125-2A612F92068B} + System.ComponentModel.Primitives + + + + + + + \ No newline at end of file diff --git a/src/System.ComponentModel.Primitives/tests/packages.config b/src/System.ComponentModel.Primitives/tests/packages.config new file mode 100644 index 000000000000..09f726b9aa72 --- /dev/null +++ b/src/System.ComponentModel.Primitives/tests/packages.config @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/src/System.Diagnostics.FileVersionInfo/tests/Assembly1.csproj b/src/System.Diagnostics.FileVersionInfo/tests/Assembly1.csproj index bd931736e9a8..e940b65a31e7 100644 --- a/src/System.Diagnostics.FileVersionInfo/tests/Assembly1.csproj +++ b/src/System.Diagnostics.FileVersionInfo/tests/Assembly1.csproj @@ -29,7 +29,7 @@ - ..\..\packages\System.Runtime.4.0.20-beta-22412\lib\portable-wpa80+win80+net45+aspnetcore50\System.Runtime.dll + $(PackagesDir)\System.Runtime.4.0.20-beta-22412\lib\portable-wpa80+win80+net45+aspnetcore50\System.Runtime.dll diff --git a/src/System.Globalization.Extensions.sln b/src/System.Globalization.Extensions.sln new file mode 100644 index 000000000000..c7c27463c9ef --- /dev/null +++ b/src/System.Globalization.Extensions.sln @@ -0,0 +1,33 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2013 +VisualStudioVersion = 12.0.30723.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "System.Globalization.Extensions", "System.Globalization.Extensions\src\System.Globalization.Extensions.csproj", "{2B96AA10-84C0-4927-8611-8D2474B990E8}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".nuget", ".nuget", "{9618597D-FDAE-42CB-B368-80DB80EA1E37}" + ProjectSection(SolutionItems) = preProject + .nuget\packages.config = .nuget\packages.config + EndProjectSection +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "System.Globalization.Extensions.Tests", "System.Globalization.Extensions\tests\System.Globalization.Extensions.Tests.csproj", "{BC439554-4AB4-4C94-8E28-C00EDE4FD1C7}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {2B96AA10-84C0-4927-8611-8D2474B990E8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2B96AA10-84C0-4927-8611-8D2474B990E8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2B96AA10-84C0-4927-8611-8D2474B990E8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2B96AA10-84C0-4927-8611-8D2474B990E8}.Release|Any CPU.Build.0 = Release|Any CPU + {BC439554-4AB4-4C94-8E28-C00EDE4FD1C7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BC439554-4AB4-4C94-8E28-C00EDE4FD1C7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BC439554-4AB4-4C94-8E28-C00EDE4FD1C7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BC439554-4AB4-4C94-8E28-C00EDE4FD1C7}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/src/System.Globalization.Extensions/src/Interop/Interop.Manual.cs b/src/System.Globalization.Extensions/src/Interop/Interop.Manual.cs new file mode 100644 index 000000000000..89d6a9850027 --- /dev/null +++ b/src/System.Globalization.Extensions/src/Interop/Interop.Manual.cs @@ -0,0 +1,14 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Runtime.InteropServices; + +internal static partial class Interop +{ + internal static partial class mincore + { + [DllImport("api-ms-win-core-errorhandling-l1-1-0.dll")] + internal extern static void SetLastError(uint dwErrCode); + } +} diff --git a/src/System.Globalization.Extensions/src/Resources/Strings.Designer.cs b/src/System.Globalization.Extensions/src/Resources/Strings.Designer.cs new file mode 100644 index 000000000000..ffea82cd99c2 --- /dev/null +++ b/src/System.Globalization.Extensions/src/Resources/Strings.Designer.cs @@ -0,0 +1,163 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.34014 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Resources { + using System; + using System.Reflection; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Strings { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Strings() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("System.Globalization.Extensions.Resources.Strings", typeof(Strings).GetTypeInfo().Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized string similar to Insufficient memory to continue the execution of the program.. + /// + internal static string Arg_OutOfMemoryException { + get { + return ResourceManager.GetString("Arg_OutOfMemoryException", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to IDN labels must be between 1 and 63 characters long.. + /// + internal static string Argument_IdnBadLabelSize { + get { + return ResourceManager.GetString("Argument_IdnBadLabelSize", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Invalid IDN encoded string.. + /// + internal static string Argument_IdnBadPunycode { + get { + return ResourceManager.GetString("Argument_IdnBadPunycode", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Decoded string is not a valid IDN name.. + /// + internal static string Argument_IdnIllegalName { + get { + return ResourceManager.GetString("Argument_IdnIllegalName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Invalid Unicode code point found at index {0}.. + /// + internal static string Argument_InvalidCharSequence { + get { + return ResourceManager.GetString("Argument_InvalidCharSequence", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to String contains invalid Unicode code points.. + /// + internal static string Argument_InvalidCharSequenceNoIndex { + get { + return ResourceManager.GetString("Argument_InvalidCharSequenceNoIndex", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Value of flags is invalid.. + /// + internal static string Argument_InvalidFlag { + get { + return ResourceManager.GetString("Argument_InvalidFlag", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Index was out of range. Must be non-negative and less than the size of the collection.. + /// + internal static string ArgumentOutOfRange_Index { + get { + return ResourceManager.GetString("ArgumentOutOfRange_Index", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Index and count must refer to a location within the buffer.. + /// + internal static string ArgumentOutOfRange_IndexCountBuffer { + get { + return ResourceManager.GetString("ArgumentOutOfRange_IndexCountBuffer", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Non-negative number required.. + /// + internal static string ArgumentOutOfRange_NeedNonNegNum { + get { + return ResourceManager.GetString("ArgumentOutOfRange_NeedNonNegNum", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unknown error '{0}'.. + /// + internal static string UnknownError_Num { + get { + return ResourceManager.GetString("UnknownError_Num", resourceCulture); + } + } + } +} diff --git a/src/System.Globalization.Extensions/src/Resources/Strings.resx b/src/System.Globalization.Extensions/src/Resources/Strings.resx new file mode 100644 index 000000000000..cc4359bb2e86 --- /dev/null +++ b/src/System.Globalization.Extensions/src/Resources/Strings.resx @@ -0,0 +1,48 @@ + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Insufficient memory to continue the execution of the program. + + + IDN labels must be between 1 and 63 characters long. + + + Invalid IDN encoded string. + + + Decoded string is not a valid IDN name. + + + Invalid Unicode code point found at index {0}. + + + String contains invalid Unicode code points. + + + Value of flags is invalid. + + + Index was out of range. Must be non-negative and less than the size of the collection. + + + Index and count must refer to a location within the buffer. + + + Non-negative number required. + + + Unknown error '{0}'. + + \ No newline at end of file diff --git a/src/System.Globalization.Extensions/src/System.Globalization.Extensions.csproj b/src/System.Globalization.Extensions/src/System.Globalization.Extensions.csproj new file mode 100644 index 000000000000..21a3676d7c64 --- /dev/null +++ b/src/System.Globalization.Extensions/src/System.Globalization.Extensions.csproj @@ -0,0 +1,54 @@ + + + + + Debug + AnyCPU + Library + System.Globalization.Extensions + System.Globalization.Extensions + {2B96AA10-84C0-4927-8611-8D2474B990E8} + + + + + + + + + + Common\System\SR.cs + + + True + True + Strings.resx + + + Common\Interop\Interop.Globalization.Extensions.manual.cs + + + Common\System\StringNormalizationExtensions.cs + + + Common\System\Globalization\IdnMapping.cs + + + Common\System\Text\NormalizationForm.cs + + + + + + + ResXFileCodeGenerator + Strings.Designer.cs + Resources + Designer + + + + + + + \ No newline at end of file diff --git a/src/System.Globalization.Extensions/src/System/Globalization/Extensions.cs b/src/System.Globalization.Extensions/src/System/Globalization/Extensions.cs new file mode 100644 index 000000000000..2de0e47c1668 --- /dev/null +++ b/src/System.Globalization.Extensions/src/System/Globalization/Extensions.cs @@ -0,0 +1,98 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Diagnostics.Contracts; + +namespace System.Globalization +{ + public static class GlobalizationExtensions + { + public static StringComparer GetStringComparer(this CompareInfo compareInfo, CompareOptions options) + { + if (compareInfo == null) + { + throw new ArgumentNullException("compareInfo"); + } + + if (options == CompareOptions.Ordinal) + { + return StringComparer.Ordinal; + } + + if (options == CompareOptions.OrdinalIgnoreCase) + { + return StringComparer.OrdinalIgnoreCase; + } + + if ((options & CultureAwareComparer.ValidCompareMaskOffFlags) != 0) + { + throw new ArgumentException(SR.Argument_InvalidFlag, "options"); + } + + return new CultureAwareComparer(compareInfo, options); + } + } + + internal sealed class CultureAwareComparer : StringComparer + { + internal const CompareOptions ValidCompareMaskOffFlags = + ~(CompareOptions.IgnoreCase | CompareOptions.IgnoreSymbols | CompareOptions.IgnoreNonSpace | + CompareOptions.IgnoreWidth | CompareOptions.IgnoreKanaType | CompareOptions.StringSort); + + private CompareInfo _compareInfo; + private CompareOptions _options; + + internal CultureAwareComparer(CompareInfo compareInfo, CompareOptions options) + { + Contract.Assert((options & ValidCompareMaskOffFlags) == 0); + _compareInfo = compareInfo; + _options = options; + } + + public override int Compare(string x, string y) + { + if (Object.ReferenceEquals(x, y)) return 0; + if (x == null) return -1; + if (y == null) return 1; + return _compareInfo.Compare(x, y, _options); + } + + public override bool Equals(string x, string y) + { + if (Object.ReferenceEquals(x, y)) return true; + if (x == null || y == null) return false; + + return (_compareInfo.Compare(x, y, _options) == 0); + } + + public override int GetHashCode(string obj) + { + if (obj == null) + { + throw new ArgumentNullException("obj"); + } + Contract.EndContractBlock(); + + // StringSort used in compare operation and not with the hashing + return _compareInfo.GetHashCode(obj, _options & (~CompareOptions.StringSort)); + } + + // Equals method for the comparer itself. + public override bool Equals(Object obj) + { + CultureAwareComparer comparer = obj as CultureAwareComparer; + if (comparer == null) + { + return false; + } + return (_options == comparer._options) && (_compareInfo.Equals(comparer._compareInfo)); + } + + public override int GetHashCode() + { + return _compareInfo.GetHashCode() ^ ((int)_options & 0x7FFFFFFF); + } + } +} + diff --git a/src/System.Globalization.Extensions/src/packages.config b/src/System.Globalization.Extensions/src/packages.config new file mode 100644 index 000000000000..764a516bfa1e --- /dev/null +++ b/src/System.Globalization.Extensions/src/packages.config @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/System.Globalization.Extensions/tests/IdnMapping/Data/ConformanceIdnaTestResult.cs b/src/System.Globalization.Extensions/tests/IdnMapping/Data/ConformanceIdnaTestResult.cs new file mode 100644 index 000000000000..ed39feeec101 --- /dev/null +++ b/src/System.Globalization.Extensions/tests/IdnMapping/Data/ConformanceIdnaTestResult.cs @@ -0,0 +1,50 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Collections.Generic; + +namespace System.Globalization.Extensions.Tests +{ + public class ConformanceIdnaTestResult + { + /// + /// Determines if the intended result is a success or failure + /// + public bool Success { get; private set; } + + /// + /// If Success is true, then the value shows the expected value of the test + /// If Success is false, then the value shows the conversion steps that have issues + /// + /// For details, see the explanation in IdnaTest.txt for the Unicode version being tested + /// + public string Value { get; private set; } + + public ConformanceIdnaTestResult(string entry) + : this(entry, null) + { } + + public ConformanceIdnaTestResult(string entry, string fallbackValue) + { + if (string.IsNullOrWhiteSpace(entry)) + SetValues(fallbackValue); + else + SetValues(entry); + } + + private void SetValues(string entry) + { + if (entry.Trim().StartsWith("[", StringComparison.Ordinal)) + { + Success = false; + Value = entry.Trim(); + } + else + { + Success = true; + Value = entry.Trim(); + } + } + } +} diff --git a/src/System.Globalization.Extensions/tests/IdnMapping/Data/Factory.cs b/src/System.Globalization.Extensions/tests/IdnMapping/Data/Factory.cs new file mode 100644 index 000000000000..cf450d4aa0fa --- /dev/null +++ b/src/System.Globalization.Extensions/tests/IdnMapping/Data/Factory.cs @@ -0,0 +1,80 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using Xunit; +using System; +using System.Collections.Generic; +using System.IO; +using System.Reflection; +using System.Text; + +namespace System.Globalization.Extensions.Tests +{ + public static class Factory + { + /// + /// Removes comments from the end of a line + /// + private static string RemoveComment(string line) + { + var idx = line.IndexOf("#", StringComparison.Ordinal); + + return idx < 0 ? line : line.Substring(0, idx); + } + + /// + /// Retrieves the IdnaTest.txt included in assembly as an embedded resource. + /// + private static Stream GetIdnaTestTxt() + { + foreach (var name in typeof(Factory).GetTypeInfo().Assembly.GetManifestResourceNames()) + { + if (name.EndsWith("IdnaTest.txt", StringComparison.Ordinal)) + { + return typeof(Factory).GetTypeInfo().Assembly.GetManifestResourceStream(name); + } + } + + Assert.False(true, "Verify test file 'IdnaTest.txt' is included as an embedded resource"); + return null; + } + + private static IEnumerable ParseFile(Stream stream, Func f) + { + using (var reader = new StreamReader(stream)) + { + int lineCount = 0; + while (!reader.EndOfStream) + { + lineCount++; + + var noComment = RemoveComment(reader.ReadLine()); + + if (!String.IsNullOrWhiteSpace(noComment)) + yield return f(noComment, lineCount); + } + } + } + + /// + /// Abstracts retrieving the dataset so this can be changed depending on platform support, such as + /// when the IDNA implementation is updated to a newer version of Unicode. Windows currently supports + /// and uses 6.0 in IDNA processing but 6.3 is the latest version available and may be used at + /// some point. + /// + /// This method retrieves the dataset to be used by the test. Windows implementation uses transitional + /// mappings, which only affect 4 characters, known as deviations. See the description at + /// http://www.unicode.org/reports/tr46/#Deviations for more information. Windows also throws an error + /// when an empty string is given, so we want to filter that from the IDNA test set + /// + /// + public static IEnumerable GetDataset() + { + foreach (var entry in ParseFile(GetIdnaTestTxt(), (line, lineCount) => new Unicode_6_0_IdnaTest(line, lineCount))) + { + if (entry.Type != IdnType.Nontransitional && entry.Source != String.Empty) + yield return entry; + } + } + } +} diff --git a/src/System.Globalization.Extensions/tests/IdnMapping/Data/IConformanceIdnaTest.cs b/src/System.Globalization.Extensions/tests/IdnMapping/Data/IConformanceIdnaTest.cs new file mode 100644 index 000000000000..4601b1945dac --- /dev/null +++ b/src/System.Globalization.Extensions/tests/IdnMapping/Data/IConformanceIdnaTest.cs @@ -0,0 +1,16 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace System.Globalization.Extensions.Tests +{ + public enum IdnType { Transitional, Nontransitional, Both }; + + public interface IConformanceIdnaTest + { + IdnType Type { get; } + string Source { get; } + ConformanceIdnaTestResult GetUnicodeResult { get; } + ConformanceIdnaTestResult GetASCIIResult { get; } + int LineNumber { get; } + } +} diff --git a/src/System.Globalization.Extensions/tests/IdnMapping/Data/Unicode_6_0/IdnaTest.txt b/src/System.Globalization.Extensions/tests/IdnMapping/Data/Unicode_6_0/IdnaTest.txt new file mode 100644 index 000000000000..45f6ff06e21b --- /dev/null +++ b/src/System.Globalization.Extensions/tests/IdnMapping/Data/Unicode_6_0/IdnaTest.txt @@ -0,0 +1,850 @@ +# IdnaTest.txt +# Date: 2010-05-12 MD +# +# Copyright (c) 1991-2010 Unicode, Inc. +# For terms of use, see http://www.unicode.org/terms_of_use.html +# +# Idna Test Suite +# +# Contains test cases for verifying UTS46 conformance. For more information, +# see http://www.unicode.org/reports/tr46/ +# +# FORMAT: +# +# This file is UTF8, with certain characters escaped using the \uXXXX convention for readability +# Columns (c1, c2,...) are separated by semicolons. +# Leading and trailing spaces and tabs in each column are ignored. +# Comments are indicated with hash marks. +# +# Column 1: type - T for transitional, N for nontransitional, B for both +# Column 2: source - the source string to be tested +# Column 3: toUnicode - the result of applying toUnicode to the source, using the specified type +# Column 4: toASCII - the result of applying toASCII to the source, using nontransitional +# +# If the value of toUnicode or toASCII is the same as source, the column will be blank. +# +# An error in toUnicode or toASCII is indicated by a value of the form [...]. +# In such a case, the contents is a list of error codes based on the step numbers in UTS46 and IDNA2008: +# Pn for Section 4 Processing step n +# Vn for 4.1 Validity Criteria step n +# An for 4.2 ToASCII step n +# Bn for Bidi (in IDNA2008) +# Cn for ContextJ (in IDNA2008) +# +# However, these particular error codes are only informative; +# the important feature is whether or not there is an error. +# +# CONFORMANCE: +# +# To test for conformance to UTS46, on each line, perform the toASCII and to Unicode operations +# on the source string, with the indicated type. +# The results must match what is given in the toUnicode and toASCII columns, except that for errors, +# an implementation only needs to record that there is an error; +# it need not reproduce the results in [...]. +# ==================================================================================================== +B; fass.de; ; +B; FASS.DE; fass.de; +B; Fass.de; fass.de; +T; faß.de; ; fass.de +N; faß.de; ; xn--fa-hia.de +T; Faß.de; faß.de; fass.de +N; Faß.de; faß.de; xn--fa-hia.de +#B; xn--fa-hia.de; faß.de; xn--fa-hia.de # GETUNICODE FAILS ON WINDOWS 8.1 +#B; XN--FA-HIA.DE; faß.de; xn--fa-hia.de # GETUNICODE FAILS ON WINDOWS 8.1 +#B; Xn--Fa-Hia.de; faß.de; xn--fa-hia.de # GETUNICODE FAILS ON WINDOWS 8.1 +#B; à\u05D0; [B5 B6]; [B5 B6] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +#B; À\u05D0; [B5 B6]; [B5 B6] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +#B; 0à.\u05D0; [B1]; [B1] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +#B; 0À.\u05D0; [B1]; [B1] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +B; à.\u05D0\u0308; ; xn--0ca.xn--ssa73l +B; À.\u05D0\u0308; à.\u05D0\u0308; xn--0ca.xn--ssa73l +B; xn--0ca.xn--ssa73l; à.\u05D0\u0308; xn--0ca.xn--ssa73l +B; XN--0CA.XN--SSA73L; à.\u05D0\u0308; xn--0ca.xn--ssa73l +B; Xn--0Ca.xn--Ssa73l; à.\u05D0\u0308; xn--0ca.xn--ssa73l +#B; à.\u05D00\u0660\u05D0; [B4]; [B4] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +#B; À.\u05D00\u0660\u05D0; [B4]; [B4] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +#B; \u0308.\u05D0; [V5 B1 B3 B6]; [V5 B1 B3 B6] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +#B; à.\u05D00\u0660; [B4]; [B4] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +#B; À.\u05D00\u0660; [B4]; [B4] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +#B; àˇ.\u05D0; [B6]; [B6] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +#B; Àˇ.\u05D0; [B6]; [B6] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +B; à\u0308.\u05D0; ; xn--0ca81i.xn--4db +B; À\u0308.\u05D0; à\u0308.\u05D0; xn--0ca81i.xn--4db +B; xn--0ca81i.xn--4db; à\u0308.\u05D0; xn--0ca81i.xn--4db +B; XN--0CA81I.XN--4DB; à\u0308.\u05D0; xn--0ca81i.xn--4db +B; Xn--0Ca81i.xn--4Db; à\u0308.\u05D0; xn--0ca81i.xn--4db +T; a\u200Cb; [C1]; ab +N; a\u200Cb; [C1]; [C1] +T; A\u200CB; [C1]; ab +N; A\u200CB; [C1]; [C1] +T; A\u200Cb; [C1]; ab +N; A\u200Cb; [C1]; [C1] +B; ab; ; +B; AB; ab; +B; Ab; ab; +T; a\u094D\u200Cb; ; xn--ab-fsf +N; a\u094D\u200Cb; ; xn--ab-fsf604u +T; A\u094D\u200CB; a\u094D\u200Cb; xn--ab-fsf +N; A\u094D\u200CB; a\u094D\u200Cb; xn--ab-fsf604u +T; A\u094D\u200Cb; a\u094D\u200Cb; xn--ab-fsf +N; A\u094D\u200Cb; a\u094D\u200Cb; xn--ab-fsf604u +B; xn--ab-fsf; a\u094Db; xn--ab-fsf +B; XN--AB-FSF; a\u094Db; xn--ab-fsf +B; Xn--Ab-Fsf; a\u094Db; xn--ab-fsf +B; a\u094Db; ; xn--ab-fsf +B; A\u094DB; a\u094Db; xn--ab-fsf +B; A\u094Db; a\u094Db; xn--ab-fsf +#B; xn--ab-fsf604u; a\u094D\u200Cb; xn--ab-fsf604u # GETUNICODE FAILS ON WINDOWS 8.1 +#B; XN--AB-FSF604U; a\u094D\u200Cb; xn--ab-fsf604u # GETUNICODE FAILS ON WINDOWS 8.1 +#B; Xn--Ab-Fsf604u; a\u094D\u200Cb; xn--ab-fsf604u # GETUNICODE FAILS ON WINDOWS 8.1 +#T; \u0308\u200C\u0308\u0628b; [V5 B1 C1]; [V5 B1] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +N; \u0308\u200C\u0308\u0628b; [V5 B1 C1]; [V5 B1 C1] +#T; \u0308\u200C\u0308\u0628B; [V5 B1 C1]; [V5 B1] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +N; \u0308\u200C\u0308\u0628B; [V5 B1 C1]; [V5 B1 C1] +#T; a\u0628\u0308\u200C\u0308; [B5 B6 C1]; [B5 B6] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +N; a\u0628\u0308\u200C\u0308; [B5 B6 C1]; [B5 B6 C1] +#T; A\u0628\u0308\u200C\u0308; [B5 B6 C1]; [B5 B6] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +N; A\u0628\u0308\u200C\u0308; [B5 B6 C1]; [B5 B6 C1] +#T; a\u0628\u0308\u200C\u0308\u0628b; [B5]; [B5] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +N; a\u0628\u0308\u200C\u0308\u0628b; [B5]; [B5] +#T; A\u0628\u0308\u200C\u0308\u0628B; [B5]; [B5] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +N; A\u0628\u0308\u200C\u0308\u0628B; [B5]; [B5] +#T; A\u0628\u0308\u200C\u0308\u0628b; [B5]; [B5] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +N; A\u0628\u0308\u200C\u0308\u0628b; [B5]; [B5] +T; a\u200Db; [C2]; ab +N; a\u200Db; [C2]; [C2] +T; A\u200DB; [C2]; ab +N; A\u200DB; [C2]; [C2] +T; A\u200Db; [C2]; ab +N; A\u200Db; [C2]; [C2] +T; a\u094D\u200Db; ; xn--ab-fsf +N; a\u094D\u200Db; ; xn--ab-fsf014u +T; A\u094D\u200DB; a\u094D\u200Db; xn--ab-fsf +N; A\u094D\u200DB; a\u094D\u200Db; xn--ab-fsf014u +T; A\u094D\u200Db; a\u094D\u200Db; xn--ab-fsf +N; A\u094D\u200Db; a\u094D\u200Db; xn--ab-fsf014u +#B; xn--ab-fsf014u; a\u094D\u200Db; xn--ab-fsf014u # GETUNICODE FAILS ON WINDOWS 8.1 +#B; XN--AB-FSF014U; a\u094D\u200Db; xn--ab-fsf014u # GETUNICODE FAILS ON WINDOWS 8.1 +#B; Xn--Ab-Fsf014u; a\u094D\u200Db; xn--ab-fsf014u # GETUNICODE FAILS ON WINDOWS 8.1 +#T; \u0308\u200D\u0308\u0628b; [V5 B1 C2]; [V5 B1] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +N; \u0308\u200D\u0308\u0628b; [V5 B1 C2]; [V5 B1 C2] +#T; \u0308\u200D\u0308\u0628B; [V5 B1 C2]; [V5 B1] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +N; \u0308\u200D\u0308\u0628B; [V5 B1 C2]; [V5 B1 C2] +#T; a\u0628\u0308\u200D\u0308; [B5 B6 C2]; [B5 B6] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +N; a\u0628\u0308\u200D\u0308; [B5 B6 C2]; [B5 B6 C2] +#T; A\u0628\u0308\u200D\u0308; [B5 B6 C2]; [B5 B6] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +N; A\u0628\u0308\u200D\u0308; [B5 B6 C2]; [B5 B6 C2] +#T; a\u0628\u0308\u200D\u0308\u0628b; [B5 C2]; [B5] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +N; a\u0628\u0308\u200D\u0308\u0628b; [B5 C2]; [B5 C2] +#T; A\u0628\u0308\u200D\u0308\u0628B; [B5 C2]; [B5] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +N; A\u0628\u0308\u200D\u0308\u0628B; [B5 C2]; [B5 C2] +#T; A\u0628\u0308\u200D\u0308\u0628b; [B5 C2]; [B5] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +N; A\u0628\u0308\u200D\u0308\u0628b; [B5 C2]; [B5 C2] +B; 1234567890ä1234567890123456789012345678901234567890123456; ; [A4_2] +B; 1234567890Ä1234567890123456789012345678901234567890123456; 1234567890ä1234567890123456789012345678901234567890123456; [A4_2] +B; www.eXample.cOm; www.example.com; +B; www.example.com; ; +B; WWW.EXAMPLE.COM; www.example.com; +B; Www.example.com; www.example.com; +B; Bücher.de; bücher.de; xn--bcher-kva.de +B; bücher.de; ; xn--bcher-kva.de +B; BÜCHER.DE; bücher.de; xn--bcher-kva.de +B; xn--bcher-kva.de; bücher.de; xn--bcher-kva.de +B; XN--BCHER-KVA.DE; bücher.de; xn--bcher-kva.de +B; Xn--Bcher-Kva.de; bücher.de; xn--bcher-kva.de +B; ÖBB; öbb; xn--bb-eka +B; öbb; ; xn--bb-eka +B; Öbb; öbb; xn--bb-eka +B; xn--bb-eka; öbb; xn--bb-eka +B; XN--BB-EKA; öbb; xn--bb-eka +B; Xn--Bb-Eka; öbb; xn--bb-eka +#B; XN--fA-hia.dE; faß.de; xn--fa-hia.de # GETUNICODE FAILS ON WINDOWS 8.1 +T; βόλος.com; ; xn--nxasmq6b.com +N; βόλος.com; ; xn--nxasmm1c.com +B; ΒΌΛΟΣ.COM; βόλοσ.com; xn--nxasmq6b.com +B; βόλοσ.com; ; xn--nxasmq6b.com +B; Βόλοσ.com; βόλοσ.com; xn--nxasmq6b.com +B; xn--nxasmq6b.com; βόλοσ.com; xn--nxasmq6b.com +B; XN--NXASMQ6B.COM; βόλοσ.com; xn--nxasmq6b.com +B; Xn--Nxasmq6b.com; βόλοσ.com; xn--nxasmq6b.com +T; Βόλος.com; βόλος.com; xn--nxasmq6b.com +N; Βόλος.com; βόλος.com; xn--nxasmm1c.com +#B; xn--nxasmm1c.com; βόλος.com; xn--nxasmm1c.com # GETUNICODE FAILS ON WINDOWS 8.1 +#B; XN--NXASMM1C.COM; βόλος.com; xn--nxasmm1c.com # GETUNICODE FAILS ON WINDOWS 8.1 +#B; Xn--Nxasmm1c.com; βόλος.com; xn--nxasmm1c.com # GETUNICODE FAILS ON WINDOWS 8.1 +#B; xn--nxasmm1c; βόλος; xn--nxasmm1c # GETUNICODE FAILS ON WINDOWS 8.1 +#B; XN--NXASMM1C; βόλος; xn--nxasmm1c # GETUNICODE FAILS ON WINDOWS 8.1 +#B; Xn--Nxasmm1c; βόλος; xn--nxasmm1c # GETUNICODE FAILS ON WINDOWS 8.1 +T; βόλος; ; xn--nxasmq6b +N; βόλος; ; xn--nxasmm1c +B; ΒΌΛΟΣ; βόλοσ; xn--nxasmq6b +B; βόλοσ; ; xn--nxasmq6b +B; Βόλοσ; βόλοσ; xn--nxasmq6b +B; xn--nxasmq6b; βόλοσ; xn--nxasmq6b +B; XN--NXASMQ6B; βόλοσ; xn--nxasmq6b +B; Xn--Nxasmq6b; βόλοσ; xn--nxasmq6b +T; Βόλος; βόλος; xn--nxasmq6b +N; Βόλος; βόλος; xn--nxasmm1c +T; www.ශ\u0DCA\u200Dර\u0DD3.com; ; www.xn--10cl1a0b.com +N; www.ශ\u0DCA\u200Dර\u0DD3.com; ; www.xn--10cl1a0b660p.com +T; WWW.ශ\u0DCA\u200Dර\u0DD3.COM; www.ශ\u0DCA\u200Dර\u0DD3.com; www.xn--10cl1a0b.com +N; WWW.ශ\u0DCA\u200Dර\u0DD3.COM; www.ශ\u0DCA\u200Dර\u0DD3.com; www.xn--10cl1a0b660p.com +T; Www.ශ\u0DCA\u200Dර\u0DD3.com; www.ශ\u0DCA\u200Dර\u0DD3.com; www.xn--10cl1a0b.com +N; Www.ශ\u0DCA\u200Dර\u0DD3.com; www.ශ\u0DCA\u200Dර\u0DD3.com; www.xn--10cl1a0b660p.com +B; www.xn--10cl1a0b.com; www.ශ\u0DCAර\u0DD3.com; www.xn--10cl1a0b.com +B; WWW.XN--10CL1A0B.COM; www.ශ\u0DCAර\u0DD3.com; www.xn--10cl1a0b.com +B; Www.xn--10Cl1a0b.com; www.ශ\u0DCAර\u0DD3.com; www.xn--10cl1a0b.com +B; www.ශ\u0DCAර\u0DD3.com; ; www.xn--10cl1a0b.com +B; WWW.ශ\u0DCAර\u0DD3.COM; www.ශ\u0DCAර\u0DD3.com; www.xn--10cl1a0b.com +B; Www.ශ\u0DCAර\u0DD3.com; www.ශ\u0DCAර\u0DD3.com; www.xn--10cl1a0b.com +#B; www.xn--10cl1a0b660p.com; www.ශ\u0DCA\u200Dර\u0DD3.com; www.xn--10cl1a0b660p.com # GETUNICODE FAILS ON WINDOWS 8.1 +#B; WWW.XN--10CL1A0B660P.COM; www.ශ\u0DCA\u200Dර\u0DD3.com; www.xn--10cl1a0b660p.com # GETUNICODE FAILS ON WINDOWS 8.1 +#B; Www.xn--10Cl1a0b660p.com; www.ශ\u0DCA\u200Dර\u0DD3.com; www.xn--10cl1a0b660p.com # GETUNICODE FAILS ON WINDOWS 8.1 +T; \u0646\u0627\u0645\u0647\u200C\u0627\u06CC; ; xn--mgba3gch31f +N; \u0646\u0627\u0645\u0647\u200C\u0627\u06CC; ; xn--mgba3gch31f060k +B; xn--mgba3gch31f; \u0646\u0627\u0645\u0647\u0627\u06CC; xn--mgba3gch31f +B; XN--MGBA3GCH31F; \u0646\u0627\u0645\u0647\u0627\u06CC; xn--mgba3gch31f +B; Xn--Mgba3gch31f; \u0646\u0627\u0645\u0647\u0627\u06CC; xn--mgba3gch31f +B; \u0646\u0627\u0645\u0647\u0627\u06CC; ; xn--mgba3gch31f +#B; xn--mgba3gch31f060k; \u0646\u0627\u0645\u0647\u200C\u0627\u06CC; xn--mgba3gch31f060k # GETUNICODE FAILS ON WINDOWS 8.1 +#B; XN--MGBA3GCH31F060K; \u0646\u0627\u0645\u0647\u200C\u0627\u06CC; xn--mgba3gch31f060k # GETUNICODE FAILS ON WINDOWS 8.1 +#B; Xn--Mgba3gch31f060k; \u0646\u0627\u0645\u0647\u200C\u0627\u06CC; xn--mgba3gch31f060k # GETUNICODE FAILS ON WINDOWS 8.1 +#B; xn--mgba3gch31f060k.com; \u0646\u0627\u0645\u0647\u200C\u0627\u06CC.com; xn--mgba3gch31f060k.com # GETUNICODE FAILS ON WINDOWS 8.1 +#B; XN--MGBA3GCH31F060K.COM; \u0646\u0627\u0645\u0647\u200C\u0627\u06CC.com; xn--mgba3gch31f060k.com # GETUNICODE FAILS ON WINDOWS 8.1 +#B; Xn--Mgba3gch31f060k.com; \u0646\u0627\u0645\u0647\u200C\u0627\u06CC.com; xn--mgba3gch31f060k.com # GETUNICODE FAILS ON WINDOWS 8.1 +T; \u0646\u0627\u0645\u0647\u200C\u0627\u06CC.com; ; xn--mgba3gch31f.com +N; \u0646\u0627\u0645\u0647\u200C\u0627\u06CC.com; ; xn--mgba3gch31f060k.com +T; \u0646\u0627\u0645\u0647\u200C\u0627\u06CC.COM; \u0646\u0627\u0645\u0647\u200C\u0627\u06CC.com; xn--mgba3gch31f.com +N; \u0646\u0627\u0645\u0647\u200C\u0627\u06CC.COM; \u0646\u0627\u0645\u0647\u200C\u0627\u06CC.com; xn--mgba3gch31f060k.com +T; \u0646\u0627\u0645\u0647\u200C\u0627\u06CC.Com; \u0646\u0627\u0645\u0647\u200C\u0627\u06CC.com; xn--mgba3gch31f.com +N; \u0646\u0627\u0645\u0647\u200C\u0627\u06CC.Com; \u0646\u0627\u0645\u0647\u200C\u0627\u06CC.com; xn--mgba3gch31f060k.com +B; xn--mgba3gch31f.com; \u0646\u0627\u0645\u0647\u0627\u06CC.com; xn--mgba3gch31f.com +B; XN--MGBA3GCH31F.COM; \u0646\u0627\u0645\u0647\u0627\u06CC.com; xn--mgba3gch31f.com +B; Xn--Mgba3gch31f.com; \u0646\u0627\u0645\u0647\u0627\u06CC.com; xn--mgba3gch31f.com +B; \u0646\u0627\u0645\u0647\u0627\u06CC.com; ; xn--mgba3gch31f.com +B; \u0646\u0627\u0645\u0647\u0627\u06CC.COM; \u0646\u0627\u0645\u0647\u0627\u06CC.com; xn--mgba3gch31f.com +B; \u0646\u0627\u0645\u0647\u0627\u06CC.Com; \u0646\u0627\u0645\u0647\u0627\u06CC.com; xn--mgba3gch31f.com +#B; a.b.c。d。; a.b.c.d.; # GETUNICODE FAILS ON WINDOWS 8.1 +#B; A.B.C。D。; a.b.c.d.; # GETUNICODE FAILS ON WINDOWS 8.1 +#B; A.b.c。D。; a.b.c.d.; # GETUNICODE FAILS ON WINDOWS 8.1 +B; a.b.c.d.; ; +B; A.B.C.D.; a.b.c.d.; +B; A.b.c.d.; a.b.c.d.; +#B; U\u0308.xn--tda; ü.ü; xn--tda.xn--tda # GETUNICODE FAILS ON WINDOWS 8.1 +#B; Ü.xn--tda; ü.ü; xn--tda.xn--tda # GETUNICODE FAILS ON WINDOWS 8.1 +#B; ü.xn--tda; ü.ü; xn--tda.xn--tda # GETUNICODE FAILS ON WINDOWS 8.1 +#B; Ü.XN--TDA; ü.ü; xn--tda.xn--tda # GETUNICODE FAILS ON WINDOWS 8.1 +#B; Ü.xn--Tda; ü.ü; xn--tda.xn--tda # GETUNICODE FAILS ON WINDOWS 8.1 +B; xn--tda.xn--tda; ü.ü; xn--tda.xn--tda +B; XN--TDA.XN--TDA; ü.ü; xn--tda.xn--tda +B; Xn--Tda.xn--Tda; ü.ü; xn--tda.xn--tda +B; ü.ü; ; xn--tda.xn--tda +B; Ü.Ü; ü.ü; xn--tda.xn--tda +B; Ü.ü; ü.ü; xn--tda.xn--tda +#B; u\u0308.xn--tda; ü.ü; xn--tda.xn--tda # GETUNICODE FAILS ON WINDOWS 8.1 +#B; U\u0308.XN--TDA; ü.ü; xn--tda.xn--tda # GETUNICODE FAILS ON WINDOWS 8.1 +#B; U\u0308.xn--Tda; ü.ü; xn--tda.xn--tda # GETUNICODE FAILS ON WINDOWS 8.1 +#B; xn--u-ccb; [V1]; [V1] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +#B; XN--U-CCB; [V1]; [V1] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +#B; Xn--U-Ccb; [V1]; [V1] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +B; a⒈com; [P1 V6]; [P1 V6] +B; A⒈COM; [P1 V6]; [P1 V6] +B; A⒈Com; [P1 V6]; [P1 V6] +#B; xn--a-ecp.ru; [V6]; [V6] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +#B; XN--A-ECP.RU; [V6]; [V6] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +#B; Xn--A-Ecp.ru; [V6]; [V6] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +#B; xn--0.pt; [A3]; [A3] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +#B; XN--0.PT; [A3]; [A3] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +#B; Xn--0.Pt; [A3]; [A3] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +#B; xn--a.pt; [V6]; [V6] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +#B; XN--A.PT; [V6]; [V6] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +#B; Xn--A.pt; [V6]; [V6] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +B; xn--a-Ä.pt; [A3]; [A3] +B; xn--a-ä.pt; [A3]; [A3] +B; XN--A-Ä.PT; [A3]; [A3] +B; Xn--A-Ä.pt; [A3]; [A3] +#B; 日本語。JP; 日本語.jp; xn--wgv71a119e.jp # GETUNICODE FAILS ON WINDOWS 8.1 +#B; 日本語。jp; 日本語.jp; xn--wgv71a119e.jp # GETUNICODE FAILS ON WINDOWS 8.1 +#B; 日本語。Jp; 日本語.jp; xn--wgv71a119e.jp # GETUNICODE FAILS ON WINDOWS 8.1 +B; xn--wgv71a119e.jp; 日本語.jp; xn--wgv71a119e.jp +B; XN--WGV71A119E.JP; 日本語.jp; xn--wgv71a119e.jp +B; Xn--Wgv71a119e.jp; 日本語.jp; xn--wgv71a119e.jp +B; 日本語.jp; ; xn--wgv71a119e.jp +B; 日本語.JP; 日本語.jp; xn--wgv71a119e.jp +B; 日本語.Jp; 日本語.jp; xn--wgv71a119e.jp +B; ☕; ; xn--53h +B; xn--53h; ☕; xn--53h +B; XN--53H; ☕; xn--53h +B; Xn--53H; ☕; xn--53h +T; 1.aß\u200C\u200Db\u200C\u200Dcßßßßdςσßßßßßßßßeßßßßßßßßßßxßßßßßßßßßßyßßßßßßßß\u0302ßz; [C1 C2]; [A4_2] +N; 1.aß\u200C\u200Db\u200C\u200Dcßßßßdςσßßßßßßßßeßßßßßßßßßßxßßßßßßßßßßyßßßßßßßß\u0302ßz; [C1 C2]; [C1 C2 A4_2] +T; 1.ASS\u200C\u200DB\u200C\u200DCSSSSSSSSDΣΣSSSSSSSSSSSSSSSSESSSSSSSSSSSSSSSSSSSSXSSSSSSSSSSSSSSSSSSSSYSSSSSSSSSSSSSSSS\u0302SSZ; [C1 C2]; [A4_2] +N; 1.ASS\u200C\u200DB\u200C\u200DCSSSSSSSSDΣΣSSSSSSSSSSSSSSSSESSSSSSSSSSSSSSSSSSSSXSSSSSSSSSSSSSSSSSSSSYSSSSSSSSSSSSSSSS\u0302SSZ; [C1 C2]; [C1 C2 A4_2] +T; 1.ASS\u200C\u200DB\u200C\u200DCSSSSSSSSDΣΣSSSSSSSSSSSSSSSSESSSSSSSSSSSSSSSSSSSSXSSSSSSSSSSSSSSSSSSSSYSSSSSSSSSSSSSSSŜSSZ; [C1 C2]; [A4_2] +N; 1.ASS\u200C\u200DB\u200C\u200DCSSSSSSSSDΣΣSSSSSSSSSSSSSSSSESSSSSSSSSSSSSSSSSSSSXSSSSSSSSSSSSSSSSSSSSYSSSSSSSSSSSSSSSŜSSZ; [C1 C2]; [C1 C2 A4_2] +T; 1.ass\u200C\u200Db\u200C\u200Dcssssssssdσσssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssŝssz; [C1 C2]; [A4_2] +N; 1.ass\u200C\u200Db\u200C\u200Dcssssssssdσσssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssŝssz; [C1 C2]; [C1 C2 A4_2] +T; 1.Ass\u200C\u200Db\u200C\u200Dcssssssssdσσssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssŝssz; [C1 C2]; [A4_2] +N; 1.Ass\u200C\u200Db\u200C\u200Dcssssssssdσσssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssŝssz; [C1 C2]; [C1 C2 A4_2] +T; 1.ass\u200C\u200Db\u200C\u200Dcssssssssdσσssssssssssssssssessssssssssssssssssssxssssssssssssssssssssyssssssssssssssss\u0302ssz; [C1 C2]; [A4_2] +N; 1.ass\u200C\u200Db\u200C\u200Dcssssssssdσσssssssssssssssssessssssssssssssssssssxssssssssssssssssssssyssssssssssssssss\u0302ssz; [C1 C2]; [C1 C2 A4_2] +T; 1.Ass\u200C\u200Db\u200C\u200Dcssssssssdσσssssssssssssssssessssssssssssssssssssxssssssssssssssssssssyssssssssssssssss\u0302ssz; [C1 C2]; [A4_2] +N; 1.Ass\u200C\u200Db\u200C\u200Dcssssssssdσσssssssssssssssssessssssssssssssssssssxssssssssssssssssssssyssssssssssssssss\u0302ssz; [C1 C2]; [C1 C2 A4_2] +T; 1.Aß\u200C\u200Db\u200C\u200Dcßßßßdςσßßßßßßßßeßßßßßßßßßßxßßßßßßßßßßyßßßßßßßß\u0302ßz; [C1 C2]; [A4_2] +N; 1.Aß\u200C\u200Db\u200C\u200Dcßßßßdςσßßßßßßßßeßßßßßßßßßßxßßßßßßßßßßyßßßßßßßß\u0302ßz; [C1 C2]; [C1 C2 A4_2] +T; \u200Cx\u200Dn\u200C-\u200D-bß; [C1 C2]; xn--bss +N; \u200Cx\u200Dn\u200C-\u200D-bß; [C1 C2]; [C1 C2] +T; \u200CX\u200DN\u200C-\u200D-BSS; [C1 C2]; xn--bss +N; \u200CX\u200DN\u200C-\u200D-BSS; [C1 C2]; [C1 C2] +T; \u200Cx\u200Dn\u200C-\u200D-bss; [C1 C2]; xn--bss +N; \u200Cx\u200Dn\u200C-\u200D-bss; [C1 C2]; [C1 C2] +T; \u200CX\u200Dn\u200C-\u200D-Bss; [C1 C2]; xn--bss +N; \u200CX\u200Dn\u200C-\u200D-Bss; [C1 C2]; [C1 C2] +B; xn--bss; 夙; xn--bss +B; XN--BSS; 夙; xn--bss +B; Xn--Bss; 夙; xn--bss +B; 夙; ; xn--bss +T; \u200CX\u200Dn\u200C-\u200D-Bß; [C1 C2]; xn--bss +N; \u200CX\u200Dn\u200C-\u200D-Bß; [C1 C2]; [C1 C2] +#B; ˣ\u034Fℕ\u200B﹣\u00AD-\u180Cℬ\uFE00ſ\u2064𝔰\uDB40\uDDEFffl; 夡夞夜夙; xn--bssffl # GETUNICODE FAILS ON WINDOWS 8.1 +#B; ˣ\u034Fℕ\u200B﹣\u00AD-\u180Cℬ\uFE00S\u2064𝔰\uDB40\uDDEFFFL; 夡夞夜夙; xn--bssffl # GETUNICODE FAILS ON WINDOWS 8.1 +#B; ˣ\u034Fℕ\u200B﹣\u00AD-\u180Cℬ\uFE00s\u2064𝔰\uDB40\uDDEFffl; 夡夞夜夙; xn--bssffl # GETUNICODE FAILS ON WINDOWS 8.1 +B; xn--bssffl; 夡夞夜夙; xn--bssffl +B; XN--BSSFFL; 夡夞夜夙; xn--bssffl +B; Xn--Bssffl; 夡夞夜夙; xn--bssffl +B; 夡夞夜夙; ; xn--bssffl +B; 123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901; ; +B; 123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901.; ; +#B; 123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890123.12345678901234567890123456789012345678901234567890123456789012; ; [A4_1] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +B; 123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901234.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890; ; [A4_2] +B; 123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901234.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890.; ; [A4_2] +B; 123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901234.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901; ; [A4_2 A4_1] +B; ä1234567890123456789012345678901234567890123456789012345; ; xn--1234567890123456789012345678901234567890123456789012345-9te +B; Ä1234567890123456789012345678901234567890123456789012345; ä1234567890123456789012345678901234567890123456789012345; xn--1234567890123456789012345678901234567890123456789012345-9te +B; xn--1234567890123456789012345678901234567890123456789012345-9te; ä1234567890123456789012345678901234567890123456789012345; xn--1234567890123456789012345678901234567890123456789012345-9te +B; XN--1234567890123456789012345678901234567890123456789012345-9TE; ä1234567890123456789012345678901234567890123456789012345; xn--1234567890123456789012345678901234567890123456789012345-9te +B; Xn--1234567890123456789012345678901234567890123456789012345-9Te; ä1234567890123456789012345678901234567890123456789012345; xn--1234567890123456789012345678901234567890123456789012345-9te +B; 123456789012345678901234567890123456789012345678901234567890123.1234567890ä123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901; ; 123456789012345678901234567890123456789012345678901234567890123.xn--1234567890123456789012345678901234567890123456789012345-kue.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901 +B; 123456789012345678901234567890123456789012345678901234567890123.1234567890Ä123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901; 123456789012345678901234567890123456789012345678901234567890123.1234567890ä123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901; 123456789012345678901234567890123456789012345678901234567890123.xn--1234567890123456789012345678901234567890123456789012345-kue.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901 +B; 123456789012345678901234567890123456789012345678901234567890123.xn--1234567890123456789012345678901234567890123456789012345-kue.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901; 123456789012345678901234567890123456789012345678901234567890123.1234567890ä123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901; 123456789012345678901234567890123456789012345678901234567890123.xn--1234567890123456789012345678901234567890123456789012345-kue.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901 +B; 123456789012345678901234567890123456789012345678901234567890123.XN--1234567890123456789012345678901234567890123456789012345-KUE.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901; 123456789012345678901234567890123456789012345678901234567890123.1234567890ä123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901; 123456789012345678901234567890123456789012345678901234567890123.xn--1234567890123456789012345678901234567890123456789012345-kue.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901 +B; 123456789012345678901234567890123456789012345678901234567890123.Xn--1234567890123456789012345678901234567890123456789012345-Kue.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901; 123456789012345678901234567890123456789012345678901234567890123.1234567890ä123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901; 123456789012345678901234567890123456789012345678901234567890123.xn--1234567890123456789012345678901234567890123456789012345-kue.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901 +B; 123456789012345678901234567890123456789012345678901234567890123.1234567890ä123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901.; ; 123456789012345678901234567890123456789012345678901234567890123.xn--1234567890123456789012345678901234567890123456789012345-kue.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901. +B; 123456789012345678901234567890123456789012345678901234567890123.1234567890Ä123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901.; 123456789012345678901234567890123456789012345678901234567890123.1234567890ä123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901.; 123456789012345678901234567890123456789012345678901234567890123.xn--1234567890123456789012345678901234567890123456789012345-kue.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901. +B; 123456789012345678901234567890123456789012345678901234567890123.xn--1234567890123456789012345678901234567890123456789012345-kue.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901.; 123456789012345678901234567890123456789012345678901234567890123.1234567890ä123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901.; 123456789012345678901234567890123456789012345678901234567890123.xn--1234567890123456789012345678901234567890123456789012345-kue.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901. +B; 123456789012345678901234567890123456789012345678901234567890123.XN--1234567890123456789012345678901234567890123456789012345-KUE.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901.; 123456789012345678901234567890123456789012345678901234567890123.1234567890ä123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901.; 123456789012345678901234567890123456789012345678901234567890123.xn--1234567890123456789012345678901234567890123456789012345-kue.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901. +B; 123456789012345678901234567890123456789012345678901234567890123.Xn--1234567890123456789012345678901234567890123456789012345-Kue.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901.; 123456789012345678901234567890123456789012345678901234567890123.1234567890ä123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901.; 123456789012345678901234567890123456789012345678901234567890123.xn--1234567890123456789012345678901234567890123456789012345-kue.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901. +#B; 123456789012345678901234567890123456789012345678901234567890123.1234567890ä123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.12345678901234567890123456789012345678901234567890123456789012; ; [A4_1] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +#B; 123456789012345678901234567890123456789012345678901234567890123.1234567890Ä123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.12345678901234567890123456789012345678901234567890123456789012; 123456789012345678901234567890123456789012345678901234567890123.1234567890ä123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.12345678901234567890123456789012345678901234567890123456789012; [A4_1] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +B; 123456789012345678901234567890123456789012345678901234567890123.1234567890ä1234567890123456789012345678901234567890123456.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890; ; [A4_2] +B; 123456789012345678901234567890123456789012345678901234567890123.1234567890Ä1234567890123456789012345678901234567890123456.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890; 123456789012345678901234567890123456789012345678901234567890123.1234567890ä1234567890123456789012345678901234567890123456.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890; [A4_2] +B; 123456789012345678901234567890123456789012345678901234567890123.1234567890ä1234567890123456789012345678901234567890123456.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890.; ; [A4_2] +B; 123456789012345678901234567890123456789012345678901234567890123.1234567890Ä1234567890123456789012345678901234567890123456.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890.; 123456789012345678901234567890123456789012345678901234567890123.1234567890ä1234567890123456789012345678901234567890123456.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890.; [A4_2] +B; 123456789012345678901234567890123456789012345678901234567890123.1234567890ä1234567890123456789012345678901234567890123456.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901; ; [A4_2 A4_1] +B; 123456789012345678901234567890123456789012345678901234567890123.1234567890Ä1234567890123456789012345678901234567890123456.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901; 123456789012345678901234567890123456789012345678901234567890123.1234567890ä1234567890123456789012345678901234567890123456.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901; [A4_2 A4_1] +B; a.b..-q--a-.e; [V2 V3]; [V2 V3 A4_2] +B; A.B..-Q--A-.E; [V2 V3]; [V2 V3 A4_2] +B; A.b..-Q--A-.E; [V2 V3]; [V2 V3 A4_2] +B; a.b..-q--ä-.e; [V2 V3]; [V2 V3 A4_2] +B; A.B..-Q--Ä-.E; [V2 V3]; [V2 V3 A4_2] +B; A.b..-Q--Ä-.E; [V2 V3]; [V2 V3 A4_2] +B; a.b..xn---q----jra.e; [V2 V3]; [V2 V3 A4_2] +B; A.B..XN---Q----JRA.E; [V2 V3]; [V2 V3 A4_2] +B; A.b..Xn---Q----Jra.e; [V2 V3]; [V2 V3 A4_2] +B; a..c; ; [A4_2] +B; A..C; a..c; [A4_2] +#B; a.-b.; [V3]; [V3] # GETUNICODE DOES NOT FAIL ON WINDOWS 8.1 +#B; A.-B.; [V3]; [V3] # GETUNICODE DOES NOT FAIL ON WINDOWS 8.1 +#B; a.b-.c; [V3]; [V3] # GETUNICODE DOES NOT FAIL ON WINDOWS 8.1 +#B; A.B-.C; [V3]; [V3] # GETUNICODE DOES NOT FAIL ON WINDOWS 8.1 +#B; A.b-.C; [V3]; [V3] # GETUNICODE DOES NOT FAIL ON WINDOWS 8.1 +#B; a.-.c; [V3]; [V3] # GETUNICODE DOES NOT FAIL ON WINDOWS 8.1 +#B; A.-.C; [V3]; [V3] # GETUNICODE DOES NOT FAIL ON WINDOWS 8.1 +#B; a.bc--de.f; [V2]; [V2] # GETUNICODE DOES NOT FAIL ON WINDOWS 8.1 +#B; A.BC--DE.F; [V2]; [V2] # GETUNICODE DOES NOT FAIL ON WINDOWS 8.1 +#B; A.bc--De.f; [V2]; [V2] # GETUNICODE DOES NOT FAIL ON WINDOWS 8.1 +#B; ä.\u00AD.c; ä..c; [A4_2] # GETUNICODE FAILS ON WINDOWS 8.1 +#B; Ä.\u00AD.C; ä..c; [A4_2] # GETUNICODE FAILS ON WINDOWS 8.1 +B; ä..c; ; [A4_2] +B; Ä..C; ä..c; [A4_2] +#B; ä.-b.; [V3]; [V3] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +#B; Ä.-B.; [V3]; [V3] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +#B; ä.b-.c; [V3]; [V3] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +#B; Ä.B-.C; [V3]; [V3] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +#B; Ä.b-.C; [V3]; [V3] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +#B; ä.-.c; [V3]; [V3] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +#B; Ä.-.C; [V3]; [V3] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +#B; ä.bc--de.f; [V2]; [V2] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +#B; Ä.BC--DE.F; [V2]; [V2] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +#B; Ä.bc--De.f; [V2]; [V2] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +#B; a.b.\u0308c.d; [V5]; [V5] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +#B; A.B.\u0308C.D; [V5]; [V5] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +#B; A.b.\u0308c.d; [V5]; [V5] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +#B; a.b.xn--c-bcb.d; [V5]; [V5] # GETUNICODE DOES NOT FAIL ON WINDOWS 8.1 +#B; A.B.XN--C-BCB.D; [V5]; [V5] # GETUNICODE DOES NOT FAIL ON WINDOWS 8.1 +#B; A.b.xn--C-Bcb.d; [V5]; [V5] # GETUNICODE DOES NOT FAIL ON WINDOWS 8.1 +B; A0; a0; +B; a0; ; +B; 0A; 0a; +B; 0a; ; +#B; 0A.\u05D0; [B1]; [B1] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +#B; 0a.\u05D0; [B1]; [B1] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +#B; c.xn--0-eha.xn--4db; [B1]; [B1] # GETUNICODE DOES NOT FAIL ON WINDOWS 8.1 +#B; C.XN--0-EHA.XN--4DB; [B1]; [B1] # GETUNICODE DOES NOT FAIL ON WINDOWS 8.1 +#B; C.xn--0-Eha.xn--4Db; [B1]; [B1] # GETUNICODE DOES NOT FAIL ON WINDOWS 8.1 +#B; b-.\u05D0; [V3 B6]; [V3 B6] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +#B; B-.\u05D0; [V3 B6]; [V3 B6] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +#B; d.xn----dha.xn--4db; [V3 B6]; [V3 B6] # GETUNICODE DOES NOT FAIL ON WINDOWS 8.1 +#B; D.XN----DHA.XN--4DB; [V3 B6]; [V3 B6] # GETUNICODE DOES NOT FAIL ON WINDOWS 8.1 +#B; D.xn----Dha.xn--4Db; [V3 B6]; [V3 B6] # GETUNICODE DOES NOT FAIL ON WINDOWS 8.1 +#B; a\u05D0; [B5 B6]; [B5 B6] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +#B; A\u05D0; [B5 B6]; [B5 B6] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +B; \u05D0\u05C7; ; xn--vdbr +B; xn--vdbr; \u05D0\u05C7; xn--vdbr +B; XN--VDBR; \u05D0\u05C7; xn--vdbr +B; Xn--Vdbr; \u05D0\u05C7; xn--vdbr +B; \u05D09\u05C7; ; xn--9-ihcz +B; xn--9-ihcz; \u05D09\u05C7; xn--9-ihcz +B; XN--9-IHCZ; \u05D09\u05C7; xn--9-ihcz +B; Xn--9-Ihcz; \u05D09\u05C7; xn--9-ihcz +#B; \u05D0a\u05C7; [B2 B3]; [B2 B3] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +#B; \u05D0A\u05C7; [B2 B3]; [B2 B3] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +B; \u05D0\u05EA; ; xn--4db6c +B; xn--4db6c; \u05D0\u05EA; xn--4db6c +B; XN--4DB6C; \u05D0\u05EA; xn--4db6c +B; Xn--4Db6c; \u05D0\u05EA; xn--4db6c +B; \u05D0\u05F3\u05EA; ; xn--4db6c0a +B; xn--4db6c0a; \u05D0\u05F3\u05EA; xn--4db6c0a +B; XN--4DB6C0A; \u05D0\u05F3\u05EA; xn--4db6c0a +B; Xn--4Db6c0a; \u05D0\u05F3\u05EA; xn--4db6c0a +#B; a\u05D0Tz; [B5]; [B5] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +#B; a\u05D0tz; [B5]; [B5] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +#B; A\u05D0TZ; [B5]; [B5] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +#B; A\u05D0tz; [B5]; [B5] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +#B; \u05D0T\u05EA; [B2]; [B2] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +#B; \u05D0t\u05EA; [B2]; [B2] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +B; \u05D07\u05EA; ; xn--7-zhc3f +B; xn--7-zhc3f; \u05D07\u05EA; xn--7-zhc3f +B; XN--7-ZHC3F; \u05D07\u05EA; xn--7-zhc3f +B; Xn--7-Zhc3f; \u05D07\u05EA; xn--7-zhc3f +B; \u05D0\u0667\u05EA; ; xn--4db6c6t +B; xn--4db6c6t; \u05D0\u0667\u05EA; xn--4db6c6t +B; XN--4DB6C6T; \u05D0\u0667\u05EA; xn--4db6c6t +B; Xn--4Db6c6t; \u05D0\u0667\u05EA; xn--4db6c6t +#B; a7\u0667z; [B5]; [B5] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +#B; A7\u0667Z; [B5]; [B5] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +#B; A7\u0667z; [B5]; [B5] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +#B; \u05D07\u0667\u05EA; [B4]; [B4] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +T; ஹ\u0BCD\u200D; ; xn--dmc4b +N; ஹ\u0BCD\u200D; ; xn--dmc4b194h +B; xn--dmc4b; ஹ\u0BCD; xn--dmc4b +B; XN--DMC4B; ஹ\u0BCD; xn--dmc4b +B; Xn--Dmc4b; ஹ\u0BCD; xn--dmc4b +B; ஹ\u0BCD; ; xn--dmc4b +#B; xn--dmc4b194h; ஹ\u0BCD\u200D; xn--dmc4b194h # GETUNICODE FAILS ON WINDOWS 8.1 +#B; XN--DMC4B194H; ஹ\u0BCD\u200D; xn--dmc4b194h # GETUNICODE FAILS ON WINDOWS 8.1 +#B; Xn--Dmc4b194h; ஹ\u0BCD\u200D; xn--dmc4b194h # GETUNICODE FAILS ON WINDOWS 8.1 +T; ஹ\u200D; [C2]; xn--dmc +N; ஹ\u200D; [C2]; [C2] +B; xn--dmc; ஹ; xn--dmc +B; XN--DMC; ஹ; xn--dmc +B; Xn--Dmc; ஹ; xn--dmc +B; ஹ; ; xn--dmc +T; \u200D; [C2]; +N; \u200D; [C2]; [C2] +B; ; ; +T; ஹ\u0BCD\u200C; ; xn--dmc4b +N; ஹ\u0BCD\u200C; ; xn--dmc4by94h +#B; xn--dmc4by94h; ஹ\u0BCD\u200C; xn--dmc4by94h # GETUNICODE FAILS ON WINDOWS 8.1 +#B; XN--DMC4BY94H; ஹ\u0BCD\u200C; xn--dmc4by94h # GETUNICODE FAILS ON WINDOWS 8.1 +#B; Xn--Dmc4by94h; ஹ\u0BCD\u200C; xn--dmc4by94h # GETUNICODE FAILS ON WINDOWS 8.1 +T; ஹ\u200C; [C1]; xn--dmc +N; ஹ\u200C; [C1]; [C1] +T; \u200C; [C1]; +N; \u200C; [C1]; [C1] +T; \u0644\u0670\u200C\u06ED\u06EF; ; xn--ghb2gxqia +N; \u0644\u0670\u200C\u06ED\u06EF; ; xn--ghb2gxqia7523a +B; xn--ghb2gxqia; \u0644\u0670\u06ED\u06EF; xn--ghb2gxqia +B; XN--GHB2GXQIA; \u0644\u0670\u06ED\u06EF; xn--ghb2gxqia +B; Xn--Ghb2gxqia; \u0644\u0670\u06ED\u06EF; xn--ghb2gxqia +B; \u0644\u0670\u06ED\u06EF; ; xn--ghb2gxqia +#B; xn--ghb2gxqia7523a; \u0644\u0670\u200C\u06ED\u06EF; xn--ghb2gxqia7523a # GETUNICODE FAILS ON WINDOWS 8.1 +#B; XN--GHB2GXQIA7523A; \u0644\u0670\u200C\u06ED\u06EF; xn--ghb2gxqia7523a # GETUNICODE FAILS ON WINDOWS 8.1 +#B; Xn--Ghb2gxqia7523a; \u0644\u0670\u200C\u06ED\u06EF; xn--ghb2gxqia7523a # GETUNICODE FAILS ON WINDOWS 8.1 +T; \u0644\u0670\u200C\u06EF; ; xn--ghb2g3q +N; \u0644\u0670\u200C\u06EF; ; xn--ghb2g3qq34f +B; xn--ghb2g3q; \u0644\u0670\u06EF; xn--ghb2g3q +B; XN--GHB2G3Q; \u0644\u0670\u06EF; xn--ghb2g3q +B; Xn--Ghb2g3q; \u0644\u0670\u06EF; xn--ghb2g3q +B; \u0644\u0670\u06EF; ; xn--ghb2g3q +#B; xn--ghb2g3qq34f; \u0644\u0670\u200C\u06EF; xn--ghb2g3qq34f # GETUNICODE FAILS ON WINDOWS 8.1 +#B; XN--GHB2G3QQ34F; \u0644\u0670\u200C\u06EF; xn--ghb2g3qq34f # GETUNICODE FAILS ON WINDOWS 8.1 +#B; Xn--Ghb2g3qq34f; \u0644\u0670\u200C\u06EF; xn--ghb2g3qq34f # GETUNICODE FAILS ON WINDOWS 8.1 +T; \u0644\u200C\u06ED\u06EF; ; xn--ghb25aga +N; \u0644\u200C\u06ED\u06EF; ; xn--ghb25aga828w +B; xn--ghb25aga; \u0644\u06ED\u06EF; xn--ghb25aga +B; XN--GHB25AGA; \u0644\u06ED\u06EF; xn--ghb25aga +B; Xn--Ghb25aga; \u0644\u06ED\u06EF; xn--ghb25aga +B; \u0644\u06ED\u06EF; ; xn--ghb25aga +#B; xn--ghb25aga828w; \u0644\u200C\u06ED\u06EF; xn--ghb25aga828w # GETUNICODE FAILS ON WINDOWS 8.1 +#B; XN--GHB25AGA828W; \u0644\u200C\u06ED\u06EF; xn--ghb25aga828w # GETUNICODE FAILS ON WINDOWS 8.1 +#B; Xn--Ghb25aga828w; \u0644\u200C\u06ED\u06EF; xn--ghb25aga828w # GETUNICODE FAILS ON WINDOWS 8.1 +T; \u0644\u200C\u06EF; ; xn--ghb65a +N; \u0644\u200C\u06EF; ; xn--ghb65a953d +B; xn--ghb65a; \u0644\u06EF; xn--ghb65a +B; XN--GHB65A; \u0644\u06EF; xn--ghb65a +B; Xn--Ghb65a; \u0644\u06EF; xn--ghb65a +B; \u0644\u06EF; ; xn--ghb65a +#B; xn--ghb65a953d; \u0644\u200C\u06EF; xn--ghb65a953d # GETUNICODE FAILS ON WINDOWS 8.1 +#B; XN--GHB65A953D; \u0644\u200C\u06EF; xn--ghb65a953d # GETUNICODE FAILS ON WINDOWS 8.1 +#B; Xn--Ghb65a953d; \u0644\u200C\u06EF; xn--ghb65a953d # GETUNICODE FAILS ON WINDOWS 8.1 +T; \u0644\u0670\u200C\u06ED; [B3 C1]; xn--ghb2gxq +N; \u0644\u0670\u200C\u06ED; [B3 C1]; [B3 C1] +B; xn--ghb2gxq; \u0644\u0670\u06ED; xn--ghb2gxq +B; XN--GHB2GXQ; \u0644\u0670\u06ED; xn--ghb2gxq +B; Xn--Ghb2gxq; \u0644\u0670\u06ED; xn--ghb2gxq +B; \u0644\u0670\u06ED; ; xn--ghb2gxq +T; \u06EF\u200C\u06EF; [C1]; xn--cmba +N; \u06EF\u200C\u06EF; [C1]; [C1] +B; xn--cmba; \u06EF\u06EF; xn--cmba +B; XN--CMBA; \u06EF\u06EF; xn--cmba +B; Xn--Cmba; \u06EF\u06EF; xn--cmba +B; \u06EF\u06EF; ; xn--cmba +T; \u0644\u200C; [B3 C1]; xn--ghb +N; \u0644\u200C; [B3 C1]; [B3 C1] +B; xn--ghb; \u0644; xn--ghb +B; XN--GHB; \u0644; xn--ghb +B; Xn--Ghb; \u0644; xn--ghb +B; \u0644; ; xn--ghb +B; \u063D\uD803\uDDD6\u1039; [P1 V6]; [P1 V6] +#B; 𝟽\u1A56\uD803\uDE7B; [B1]; [B1] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +T; \uDB40\uDDC8.\u0684\u200C\uD83B\uDD62\u06EE; [P1 V6 C1]; [P1 V6] +N; \uDB40\uDDC8.\u0684\u200C\uD83B\uDD62\u06EE; [P1 V6 C1]; [P1 V6 C1] +T; ς\u069C\u0772\u05BC。𝟎-\uD802\uDE3F\u200C\u1BA3\uFD24。〓-\uD939\uDC84\u0321; [P1 V6 B5 B6 B1]; [P1 V6 B5 B6 B1] +N; ς\u069C\u0772\u05BC。𝟎-\uD802\uDE3F\u200C\u1BA3\uFD24。〓-\uD939\uDC84\u0321; [P1 V6 B5 B6 B1]; [P1 V6 B5 B6 B1] +T; Σ\u069C\u0772\u05BC。𝟎-\uD802\uDE3F\u200C\u1BA3\uFD24。〓-\uD939\uDC84\u0321; [P1 V6 B5 B6 B1]; [P1 V6 B5 B6 B1] +N; Σ\u069C\u0772\u05BC。𝟎-\uD802\uDE3F\u200C\u1BA3\uFD24。〓-\uD939\uDC84\u0321; [P1 V6 B5 B6 B1]; [P1 V6 B5 B6 B1] +T; σ\u069C\u0772\u05BC。𝟎-\uD802\uDE3F\u200C\u1BA3\uFD24。〓-\uD939\uDC84\u0321; [P1 V6 B5 B6 B1]; [P1 V6 B5 B6 B1] +N; σ\u069C\u0772\u05BC。𝟎-\uD802\uDE3F\u200C\u1BA3\uFD24。〓-\uD939\uDC84\u0321; [P1 V6 B5 B6 B1]; [P1 V6 B5 B6 B1] +B; \uFD55\uDA68\uDF38-\uD803\uDE66\uD802\uDC37\uDB41\uDCD8\uDB40\uDD94; [P1 V6 B2 B3]; [P1 V6 B2 B3] +T; \uA953\u0636\uD802\uDE3F\u06C1\u17D2\u200Cς。\uD803\uDD1F\uD807\uDC05\u067A\u062D; [P1 V5 V6 B5 B2]; [P1 V5 V6 B5 B2] +N; \uA953\u0636\uD802\uDE3F\u06C1\u17D2\u200Cς。\uD803\uDD1F\uD807\uDC05\u067A\u062D; [P1 V5 V6 B5 B2]; [P1 V5 V6 B5 B2] +T; \uA953\u0636\uD802\uDE3F\u06C1\u17D2\u200CΣ。\uD803\uDD1F\uD807\uDC05\u067A\u062D; [P1 V5 V6 B5 B2]; [P1 V5 V6 B5 B2] +N; \uA953\u0636\uD802\uDE3F\u06C1\u17D2\u200CΣ。\uD803\uDD1F\uD807\uDC05\u067A\u062D; [P1 V5 V6 B5 B2]; [P1 V5 V6 B5 B2] +T; \uA953\u0636\uD802\uDE3F\u06C1\u17D2\u200Cσ。\uD803\uDD1F\uD807\uDC05\u067A\u062D; [P1 V5 V6 B5 B2]; [P1 V5 V6 B5 B2] +N; \uA953\u0636\uD802\uDE3F\u06C1\u17D2\u200Cσ。\uD803\uDD1F\uD807\uDC05\u067A\u062D; [P1 V5 V6 B5 B2]; [P1 V5 V6 B5 B2] +B; \uDA4C\uDF36\u0340\u0721\u07DC\uD870\uDC1B; [P1 V6 B5]; [P1 V6 B5] +B; \uDA4C\uDF36\u0300\u0721\u07DC\uD870\uDC1B; [P1 V6 B5]; [P1 V6 B5] +B; \u067B; ; xn--0ib +B; xn--0ib; \u067B; xn--0ib +B; XN--0IB; \u067B; xn--0ib +B; Xn--0Ib; \u067B; xn--0ib +T; \uDB47\uDFA9-6\uDB43\uDF69。𝟪\u200C\u200C-.-; [P1 V6 V3 C1]; [P1 V6 V3] +N; \uDB47\uDFA9-6\uDB43\uDF69。𝟪\u200C\u200C-.-; [P1 V6 V3 C1]; [P1 V6 V3 C1] +T; \u0661\u200C\uD83B\uDCD1; [P1 V6 B1 C1]; [P1 V6 B1] +N; \u0661\u200C\uD83B\uDCD1; [P1 V6 B1 C1]; [P1 V6 B1 C1] +B; \uD82A\uDCF4.\u069F\u0639.-\u06E2⒎; [P1 V6 V3 B1]; [P1 V6 V3 B1] +B; \u067F\uD803\uDE6E。-\u063D\uD925\uDF0E。⫍\u06AA\uFD9F-; [P1 V3 V6 B1]; [P1 V3 V6 B1] +B; \uDB40\uDD40\uA806.🄅\u0643.\uFEE6\uDB40\uDC82\u069E; [P1 V5 V6 B1 B3 B6]; [P1 V5 V6 B1 B3 B6] +T; ß-⒏\uA802; [P1 V6]; [P1 V6] +N; ß-⒏\uA802; [P1 V6]; [P1 V6] +B; SS-⒏\uA802; [P1 V6]; [P1 V6] +B; ss-⒏\uA802; [P1 V6]; [P1 V6] +B; Ss-⒏\uA802; [P1 V6]; [P1 V6] +T; \u066B\uDB40\uDDDFς\uD803\uDE78\uD803\uDE67\u0733。\uFFF4\u075E\uD803\uDE78; [P1 V6 B1]; [P1 V6 B1] +N; \u066B\uDB40\uDDDFς\uD803\uDE78\uD803\uDE67\u0733。\uFFF4\u075E\uD803\uDE78; [P1 V6 B1]; [P1 V6 B1] +B; \u066B\uDB40\uDDDFΣ\uD803\uDE78\uD803\uDE67\u0733。\uFFF4\u075E\uD803\uDE78; [P1 V6 B1]; [P1 V6 B1] +B; \u066B\uDB40\uDDDFσ\uD803\uDE78\uD803\uDE67\u0733。\uFFF4\u075E\uD803\uDE78; [P1 V6 B1]; [P1 V6 B1] +T; 𝟾\uDB93\uDFAE。\uDB40\uDDA3\u0662\u074F\uD802\uDFDD\uD97C\uDD8C。ς\u1714\u0F84\u07D6-; [P1 V6 V3 B1 B5 B6]; [P1 V6 V3 B1 B5 B6] +N; 𝟾\uDB93\uDFAE。\uDB40\uDDA3\u0662\u074F\uD802\uDFDD\uD97C\uDD8C。ς\u1714\u0F84\u07D6-; [P1 V6 V3 B1 B5 B6]; [P1 V6 V3 B1 B5 B6] +B; 𝟾\uDB93\uDFAE。\uDB40\uDDA3\u0662\u074F\uD802\uDFDD\uD97C\uDD8C。Σ\u1714\u0F84\u07D6-; [P1 V6 V3 B1 B5 B6]; [P1 V6 V3 B1 B5 B6] +B; 𝟾\uDB93\uDFAE。\uDB40\uDDA3\u0662\u074F\uD802\uDFDD\uD97C\uDD8C。σ\u1714\u0F84\u07D6-; [P1 V6 V3 B1 B5 B6]; [P1 V6 V3 B1 B5 B6] +#B; \uD803\uDE6D; [B1]; [B1] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +T; \u0660\u072B⒊\uD9F3\uDD67\u0626\u0678。\uD803\uDE71\u0662\u200D\u0770\u0E3A\uDB40\uDD9F; [P1 V6 B1 C2]; [P1 V6 B1] +N; \u0660\u072B⒊\uD9F3\uDD67\u0626\u0678。\uD803\uDE71\u0662\u200D\u0770\u0E3A\uDB40\uDD9F; [P1 V6 B1 C2]; [P1 V6 B1 C2] +B; \uDB40\uDD12𝟭۵-\uDB43\uDE3F-\uDB40\uDD0E; [P1 V3 V6]; [P1 V3 V6] +#B; \u031C; [V5]; [V5] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +T; \u0F79⒏\u0647\uA92C\u07D2\uD803\uDED8\u059A。\u200C\u069E; [P1 V5 V6 B1 C1]; [P1 V5 V6 B1] +N; \u0F79⒏\u0647\uA92C\u07D2\uD803\uDED8\u059A。\u200C\u069E; [P1 V5 V6 B1 C1]; [P1 V5 V6 B1 C1] +T; \u200D\u17D2\uD9A9\uDD48\u0683℈\u20D9; [P1 V6 B1 C2]; [P1 V5 V6 B1] +N; \u200D\u17D2\uD9A9\uDD48\u0683℈\u20D9; [P1 V6 B1 C2]; [P1 V6 B1 C2] +T; \uDB40\uDF21\u200C-; [P1 V3 V6 C1]; [P1 V3 V6] +N; \uDB40\uDF21\u200C-; [P1 V3 V6 C1]; [P1 V3 V6 C1] +T; \u17B5\uDA37\uDF60-。\uDB41\uDD97\u200C\u200D; [P1 V3 V6 C1 C2]; [P1 V3 V6] +N; \u17B5\uDA37\uDF60-。\uDB41\uDD97\u200C\u200D; [P1 V3 V6 C1 C2]; [P1 V3 V6 C1 C2] +B; 𐅫; ; xn--gy7c +B; xn--gy7c; 𐅫; xn--gy7c +B; XN--GY7C; 𐅫; xn--gy7c +B; Xn--Gy7c; 𐅫; xn--gy7c +T; \u064A\u0BCD-⁹\uD837\uDEFD\u06C5\uDB40\uDD63.\uD803\uDE77\u200D\u0AC3\uDB40\uDD3B-.\uDB41\uDCAD\u07ED\uDB42\uDC17\u0626𝟕; [P1 V6 V3 B2 B1 C2]; [P1 V6 V3 B2 B1] +N; \u064A\u0BCD-⁹\uD837\uDEFD\u06C5\uDB40\uDD63.\uD803\uDE77\u200D\u0AC3\uDB40\uDD3B-.\uDB41\uDCAD\u07ED\uDB42\uDC17\u0626𝟕; [P1 V6 V3 B2 B1 C2]; [P1 V6 V3 B2 B1 C2] +T; \uD803\uDE69\u06AD\u200C\u0309。🄂\uDB40\uDC7A\uA806\uD8DF\uDF43--.\uDB90\uDE73⩆⫝; [P1 V3 V6 B1 B6 C1]; [P1 V3 V6 B1 B6] +N; \uD803\uDE69\u06AD\u200C\u0309。🄂\uDB40\uDC7A\uA806\uD8DF\uDF43--.\uDB90\uDE73⩆⫝; [P1 V3 V6 B1 B6 C1]; [P1 V3 V6 B1 B6 C1] +T; \u06B7\u200D\u06FA\u0646\u066F.\u0771\uDB41\uDE7C\uD83A\uDD73\u066C\u0B4D.\u0649\u0714\uD802\uDE01\uDB42\uDFC1\uD803\uDE7E; [P1 V6 C2]; [P1 V6] +N; \u06B7\u200D\u06FA\u0646\u066F.\u0771\uDB41\uDE7C\uD83A\uDD73\u066C\u0B4D.\u0649\u0714\uD802\uDE01\uDB42\uDFC1\uD803\uDE7E; [P1 V6 C2]; [P1 V6 C2] +T; \uDB43\uDC53\u06B7⒕ς\u1A7F₆\uDB42\uDE0E。\u094D\u1714\uDB1C\uDE41\u0765\uDA22\uDDA0。\uDB40\uDC6C\u200D\u06BC; [P1 V6 V5 B1 C2]; [P1 V6 V5 B1] +N; \uDB43\uDC53\u06B7⒕ς\u1A7F₆\uDB42\uDE0E。\u094D\u1714\uDB1C\uDE41\u0765\uDA22\uDDA0。\uDB40\uDC6C\u200D\u06BC; [P1 V6 V5 B1 C2]; [P1 V6 V5 B1 C2] +T; \uDB43\uDC53\u06B7⒕Σ\u1A7F₆\uDB42\uDE0E。\u094D\u1714\uDB1C\uDE41\u0765\uDA22\uDDA0。\uDB40\uDC6C\u200D\u06BC; [P1 V6 V5 B1 C2]; [P1 V6 V5 B1] +N; \uDB43\uDC53\u06B7⒕Σ\u1A7F₆\uDB42\uDE0E。\u094D\u1714\uDB1C\uDE41\u0765\uDA22\uDDA0。\uDB40\uDC6C\u200D\u06BC; [P1 V6 V5 B1 C2]; [P1 V6 V5 B1 C2] +T; \uDB43\uDC53\u06B7⒕σ\u1A7F₆\uDB42\uDE0E。\u094D\u1714\uDB1C\uDE41\u0765\uDA22\uDDA0。\uDB40\uDC6C\u200D\u06BC; [P1 V6 V5 B1 C2]; [P1 V6 V5 B1] +N; \uDB43\uDC53\u06B7⒕σ\u1A7F₆\uDB42\uDE0E。\u094D\u1714\uDB1C\uDE41\u0765\uDA22\uDDA0。\uDB40\uDC6C\u200D\u06BC; [P1 V6 V5 B1 C2]; [P1 V6 V5 B1 C2] +#T; 𦜲\uABE8\u200D\u0760。\u0F84.ß; [V5 B5 B6 B1 B3 C2]; [V5 B5 B6 B1 B3] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +N; 𦜲\uABE8\u200D\u0760。\u0F84.ß; [V5 B5 B6 B1 B3 C2]; [V5 B5 B6 B1 B3 C2] +#T; 𦜲\uABE8\u200D\u0760。\u0F84.SS; [V5 B5 B6 B1 B3 C2]; [V5 B5 B6 B1 B3] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +N; 𦜲\uABE8\u200D\u0760。\u0F84.SS; [V5 B5 B6 B1 B3 C2]; [V5 B5 B6 B1 B3 C2] +#T; 𦜲\uABE8\u200D\u0760。\u0F84.ss; [V5 B5 B6 B1 B3 C2]; [V5 B5 B6 B1 B3] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +N; 𦜲\uABE8\u200D\u0760。\u0F84.ss; [V5 B5 B6 B1 B3 C2]; [V5 B5 B6 B1 B3 C2] +#T; 𦜲\uABE8\u200D\u0760。\u0F84.Ss; [V5 B5 B6 B1 B3 C2]; [V5 B5 B6 B1 B3] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +N; 𦜲\uABE8\u200D\u0760。\u0F84.Ss; [V5 B5 B6 B1 B3 C2]; [V5 B5 B6 B1 B3 C2] +T; \u0FBC\u2DF5\uDB42\uDF68.\u102D\u200C; [P1 V5 V6 C1]; [P1 V5 V6] +N; \u0FBC\u2DF5\uDB42\uDF68.\u102D\u200C; [P1 V5 V6 C1]; [P1 V5 V6 C1] +T; ß\u0778\uDB41\uDD31\u0F19\u0649; [P1 V6 B5 B6]; [P1 V6 B5 B6] +N; ß\u0778\uDB41\uDD31\u0F19\u0649; [P1 V6 B5 B6]; [P1 V6 B5 B6] +B; SS\u0778\uDB41\uDD31\u0F19\u0649; [P1 V6 B5 B6]; [P1 V6 B5 B6] +B; ss\u0778\uDB41\uDD31\u0F19\u0649; [P1 V6 B5 B6]; [P1 V6 B5 B6] +B; Ss\u0778\uDB41\uDD31\u0F19\u0649; [P1 V6 B5 B6]; [P1 V6 B5 B6] +T; \uDB40\uDD2E.\u0C4D\u077F\uFBE1\u200D\u200D\u05C4\u200C。\u0F35\u200C\u0BCD\u06AB\u0666; [V5 B1 C2 C1]; [V5 B1] +N; \uDB40\uDD2E.\u0C4D\u077F\uFBE1\u200D\u200D\u05C4\u200C。\u0F35\u200C\u0BCD\u06AB\u0666; [V5 B1 C2 C1]; [V5 B1 C2 C1] +T; 𝟣.\uDB41\uDF61\uD98F\uDF52\uDB9D\uDC35\uDB40\uDD6F6-\u0943。\uD90F\uDC57ς\u072D\u1CD4𝟟\uDB40\uDD26; [P1 V6 B1 B5]; [P1 V6 B1 B5] +N; 𝟣.\uDB41\uDF61\uD98F\uDF52\uDB9D\uDC35\uDB40\uDD6F6-\u0943。\uD90F\uDC57ς\u072D\u1CD4𝟟\uDB40\uDD26; [P1 V6 B1 B5]; [P1 V6 B1 B5] +B; 𝟣.\uDB41\uDF61\uD98F\uDF52\uDB9D\uDC35\uDB40\uDD6F6-\u0943。\uD90F\uDC57Σ\u072D\u1CD4𝟟\uDB40\uDD26; [P1 V6 B1 B5]; [P1 V6 B1 B5] +B; 𝟣.\uDB41\uDF61\uD98F\uDF52\uDB9D\uDC35\uDB40\uDD6F6-\u0943。\uD90F\uDC57σ\u072D\u1CD4𝟟\uDB40\uDD26; [P1 V6 B1 B5]; [P1 V6 B1 B5] +T; \uD83B\uDE79\u200Cς\uDB42\uDD34\u1DD6.\uD83B\uDCB2ς\uD803\uDE79\uDB7A\uDFF8\u06A4\u200D\uD803\uDE7A。\uA806\uD802\uDEF3\u06C1\uD83A\uDEAA; [P1 V6 V5 B2 B3 B1 C1 C2]; [P1 V6 V5 B2 B3 B1] +N; \uD83B\uDE79\u200Cς\uDB42\uDD34\u1DD6.\uD83B\uDCB2ς\uD803\uDE79\uDB7A\uDFF8\u06A4\u200D\uD803\uDE7A。\uA806\uD802\uDEF3\u06C1\uD83A\uDEAA; [P1 V6 V5 B2 B3 B1 C1 C2]; [P1 V6 V5 B2 B3 B1 C1 C2] +T; \uD83B\uDE79\u200CΣ\uDB42\uDD34\u1DD6.\uD83B\uDCB2Σ\uD803\uDE79\uDB7A\uDFF8\u06A4\u200D\uD803\uDE7A。\uA806\uD802\uDEF3\u06C1\uD83A\uDEAA; [P1 V6 V5 B2 B3 B1 C1 C2]; [P1 V6 V5 B2 B3 B1] +N; \uD83B\uDE79\u200CΣ\uDB42\uDD34\u1DD6.\uD83B\uDCB2Σ\uD803\uDE79\uDB7A\uDFF8\u06A4\u200D\uD803\uDE7A。\uA806\uD802\uDEF3\u06C1\uD83A\uDEAA; [P1 V6 V5 B2 B3 B1 C1 C2]; [P1 V6 V5 B2 B3 B1 C1 C2] +T; \uD83B\uDE79\u200Cσ\uDB42\uDD34\u1DD6.\uD83B\uDCB2σ\uD803\uDE79\uDB7A\uDFF8\u06A4\u200D\uD803\uDE7A。\uA806\uD802\uDEF3\u06C1\uD83A\uDEAA; [P1 V6 V5 B2 B3 B1 C1 C2]; [P1 V6 V5 B2 B3 B1] +N; \uD83B\uDE79\u200Cσ\uDB42\uDD34\u1DD6.\uD83B\uDCB2σ\uD803\uDE79\uDB7A\uDFF8\u06A4\u200D\uD803\uDE7A。\uA806\uD802\uDEF3\u06C1\uD83A\uDEAA; [P1 V6 V5 B2 B3 B1 C1 C2]; [P1 V6 V5 B2 B3 B1 C1 C2] +T; \u06CA\uA8C4\u066B。\uDB40\uDD77\uD830\uDD80\u200C\u200D\u06E7\uD803\uDE79; [P1 V6 B5 B6 C1 C2]; [P1 V6 B5 B6] +N; \u06CA\uA8C4\u066B。\uDB40\uDD77\uD830\uDD80\u200C\u200D\u06E7\uD803\uDE79; [P1 V6 B5 B6 C1 C2]; [P1 V6 B5 B6 C1 C2] +T; -𝟴。\uDBD5\uDF18\uD834\uDD86₆\uDA26\uDEEBς\uD950\uDCA2-.\u200C\u0750ς; [P1 V3 V6 B1 B6 C1]; [P1 V3 V6 B1 B6 B2 B3] +N; -𝟴。\uDBD5\uDF18\uD834\uDD86₆\uDA26\uDEEBς\uD950\uDCA2-.\u200C\u0750ς; [P1 V3 V6 B1 B6 C1]; [P1 V3 V6 B1 B6 C1] +T; -𝟴。\uDBD5\uDF18\uD834\uDD86₆\uDA26\uDEEBΣ\uD950\uDCA2-.\u200C\u0750Σ; [P1 V3 V6 B1 B6 C1]; [P1 V3 V6 B1 B6 B2 B3] +N; -𝟴。\uDBD5\uDF18\uD834\uDD86₆\uDA26\uDEEBΣ\uD950\uDCA2-.\u200C\u0750Σ; [P1 V3 V6 B1 B6 C1]; [P1 V3 V6 B1 B6 C1] +T; -𝟴。\uDBD5\uDF18\uD834\uDD86₆\uDA26\uDEEBσ\uD950\uDCA2-.\u200C\u0750σ; [P1 V3 V6 B1 B6 C1]; [P1 V3 V6 B1 B6 B2 B3] +N; -𝟴。\uDBD5\uDF18\uD834\uDD86₆\uDA26\uDEEBσ\uD950\uDCA2-.\u200C\u0750σ; [P1 V3 V6 B1 B6 C1]; [P1 V3 V6 B1 B6 C1] +T; \uDB40\uDDC5\u0DCAß\u07DB-\uDB40\uDE46; [P1 V5 V6 B1]; [P1 V5 V6 B1] +N; \uDB40\uDDC5\u0DCAß\u07DB-\uDB40\uDE46; [P1 V5 V6 B1]; [P1 V5 V6 B1] +B; \uDB40\uDDC5\u0DCASS\u07DB-\uDB40\uDE46; [P1 V5 V6 B1]; [P1 V5 V6 B1] +B; \uDB40\uDDC5\u0DCAss\u07DB-\uDB40\uDE46; [P1 V5 V6 B1]; [P1 V5 V6 B1] +B; \uDB40\uDDC5\u0DCASs\u07DB-\uDB40\uDE46; [P1 V5 V6 B1]; [P1 V5 V6 B1] +#T; \u0767\uA825。ß-\u200C\u2DF2; [B6 C1]; [B6] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +N; \u0767\uA825。ß-\u200C\u2DF2; [B6 C1]; [B6 C1] +#T; \u0767\uA825。SS-\u200C\u2DF2; [B6 C1]; [B6] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +N; \u0767\uA825。SS-\u200C\u2DF2; [B6 C1]; [B6 C1] +#T; \u0767\uA825。ss-\u200C\u2DF2; [B6 C1]; [B6] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +N; \u0767\uA825。ss-\u200C\u2DF2; [B6 C1]; [B6 C1] +#T; \u0767\uA825。Ss-\u200C\u2DF2; [B6 C1]; [B6] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +N; \u0767\uA825。Ss-\u200C\u2DF2; [B6 C1]; [B6 C1] +T; -\u0758-\u200D꒸。\u07AB.\uD802\uDC9D\uDB40\uDF17\uABED\u1036; [P1 V3 V5 V6 B1 B3 B6 C2]; [P1 V3 V5 V6 B1 B3 B6] +N; -\u0758-\u200D꒸。\u07AB.\uD802\uDC9D\uDB40\uDF17\uABED\u1036; [P1 V3 V5 V6 B1 B3 B6 C2]; [P1 V3 V5 V6 B1 B3 B6 C2] +#T; \u200C𝟒\u0625\u200C\u0667.\uD803\uDE6C\u200C\u0F9E; [B1 C1]; [B1] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +N; \u200C𝟒\u0625\u200C\u0667.\uD803\uDE6C\u200C\u0F9E; [B1 C1]; [B1 C1] +#T; \u0671𝟎。\uA8C4\u200D\uD834\uDD81\u17C9; [V5 B1]; [V5 B1 B3 B6] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +N; \u0671𝟎。\uA8C4\u200D\uD834\uDD81\u17C9; [V5 B1]; [V5 B1] +B; \u062D\uD890\uDFB8; [P1 V6 B2 B3]; [P1 V6 B2 B3] +B; \uDAAC\uDE2C; [P1 V6]; [P1 V6] +T; 𝟥\uD83A\uDE8D\u0F84\uD8D5\uDE30⁰。\u06C8ß\uD834\uDD69; [P1 V6 B1 B2 B3]; [P1 V6 B1 B2 B3] +N; 𝟥\uD83A\uDE8D\u0F84\uD8D5\uDE30⁰。\u06C8ß\uD834\uDD69; [P1 V6 B1 B2 B3]; [P1 V6 B1 B2 B3] +B; 𝟥\uD83A\uDE8D\u0F84\uD8D5\uDE30⁰。\u06C8SS\uD834\uDD69; [P1 V6 B1 B2 B3]; [P1 V6 B1 B2 B3] +B; 𝟥\uD83A\uDE8D\u0F84\uD8D5\uDE30⁰。\u06C8ss\uD834\uDD69; [P1 V6 B1 B2 B3]; [P1 V6 B1 B2 B3] +B; 𝟥\uD83A\uDE8D\u0F84\uD8D5\uDE30⁰。\u06C8Ss\uD834\uDD69; [P1 V6 B1 B2 B3]; [P1 V6 B1 B2 B3] +T; \u0661ß。\u1A60\uDB2A\uDE74\uD803\uDE7B; [P1 V5 V6 B1]; [P1 V5 V6 B1] +N; \u0661ß。\u1A60\uDB2A\uDE74\uD803\uDE7B; [P1 V5 V6 B1]; [P1 V5 V6 B1] +B; \u0661SS。\u1A60\uDB2A\uDE74\uD803\uDE7B; [P1 V5 V6 B1]; [P1 V5 V6 B1] +B; \u0661ss。\u1A60\uDB2A\uDE74\uD803\uDE7B; [P1 V5 V6 B1]; [P1 V5 V6 B1] +B; \u0661Ss。\u1A60\uDB2A\uDE74\uD803\uDE7B; [P1 V5 V6 B1]; [P1 V5 V6 B1] +T; ς\uD803\uDE73\u0635⒓; [P1 V6 B5]; [P1 V6 B5] +N; ς\uD803\uDE73\u0635⒓; [P1 V6 B5]; [P1 V6 B5] +B; Σ\uD803\uDE73\u0635⒓; [P1 V6 B5]; [P1 V6 B5] +B; σ\uD803\uDE73\u0635⒓; [P1 V6 B5]; [P1 V6 B5] +T; \uD825\uDF85㊲\uDBEF\uDE82\u200D。\uDB40\uDD36\u2062¹; [P1 V6 C2]; [P1 V6] +N; \uD825\uDF85㊲\uDBEF\uDE82\u200D。\uDB40\uDD36\u2062¹; [P1 V6 C2]; [P1 V6 C2] +#T; \u200D\uA953.\uFB2A.-𝟨\u200C-; [V3 B1 C2 C1]; [V5 V3 B1] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +N; \u200D\uA953.\uFB2A.-𝟨\u200C-; [V3 B1 C2 C1]; [V3 B1 C2 C1] +#T; \u200D\uA953.\u05E9\u05C1.-𝟨\u200C-; [V3 B1 C2 C1]; [V5 V3 B1] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +N; \u200D\uA953.\u05E9\u05C1.-𝟨\u200C-; [V3 B1 C2 C1]; [V3 B1 C2 C1] +T; \u06B2\u200C-.\u0D4D。🄇-\uDB42\uDED8\u1DC9\uDBA9\uDE29\uDB42\uDFC5\u20E7; [P1 V3 V5 V6 B3 B1 B6 C1]; [P1 V3 V5 V6 B3 B1 B6] +N; \u06B2\u200C-.\u0D4D。🄇-\uDB42\uDED8\u1DC9\uDBA9\uDE29\uDB42\uDFC5\u20E7; [P1 V3 V5 V6 B3 B1 B6 C1]; [P1 V3 V5 V6 B3 B1 B6 C1] +#B; -; [V3]; [V3] # GETUNICODE DOES NOT FAIL ON WINDOWS 8.1 +B; \u0680\u0DCA\u1A60\u0616\uDB42\uDE69。\u1039; [P1 V6 V5 B3 B1 B6]; [P1 V6 V5 B3 B1 B6] +T; -\u0683\u1BAA\u062B𝟦.\uFE25\u200D\uD802\uDC99\u0777𝟣.\uDA4A\uDE06\u0760; [P1 V3 V5 V6 B1 B5 B6 C2]; [P1 V3 V5 V6 B1 B5 B6] +N; -\u0683\u1BAA\u062B𝟦.\uFE25\u200D\uD802\uDC99\u0777𝟣.\uDA4A\uDE06\u0760; [P1 V3 V5 V6 B1 B5 B6 C2]; [P1 V3 V5 V6 B1 B5 B6 C2] +B; \uD8A8\uDD31; [P1 V6]; [P1 V6] +T; \u0837。\u0680\u031E\u0601ß⁸; [P1 V6 B2 B4]; [P1 V6 B2 B4] +N; \u0837。\u0680\u031E\u0601ß⁸; [P1 V6 B2 B4]; [P1 V6 B2 B4] +B; \u0837。\u0680\u031E\u0601SS⁸; [P1 V6 B2 B4]; [P1 V6 B2 B4] +B; \u0837。\u0680\u031E\u0601ss⁸; [P1 V6 B2 B4]; [P1 V6 B2 B4] +B; \u0837。\u0680\u031E\u0601Ss⁸; [P1 V6 B2 B4]; [P1 V6 B2 B4] +#B; -。\u06A97; [V3 B1]; [V3 B1] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +T; \u200D\uDAC9\uDFF8\u07D7𝟼\uDB40\uDDE8; [P1 V6 B1 C2]; [P1 V6 B5] +N; \u200D\uDAC9\uDFF8\u07D7𝟼\uDB40\uDDE8; [P1 V6 B1 C2]; [P1 V6 B1 C2] +B; \u1CED\uD803\uDE61\u0DCA\uD802\uDC15\u0CC6.𝟙\u0DCA。\uA67D\u0AC3\uD83A\uDF53; [P1 V5 V6 B1]; [P1 V5 V6 B1] +T; \u077B\u0D43-\u200D.\uD802\uDC25\uDB43\uDFAC\u06BC\u200C\uD803\uDE68.𝟶\u071B𝟲; [P1 V6 B3 B1 C2 C1]; [P1 V3 V6 B3 B1] +N; \u077B\u0D43-\u200D.\uD802\uDC25\uDB43\uDFAC\u06BC\u200C\uD803\uDE68.𝟶\u071B𝟲; [P1 V6 B3 B1 C2 C1]; [P1 V6 B3 B1 C2 C1] +T; \u200D\uD803\uDE6B囓\u06A8。\u0F39\u0723\uA8EF\u0C4D\u200Dς\u0BCD.\uDB40\uDCA1\u200D\uD802\uDCB2䷠\u0718; [P1 V5 V6 B1 C2]; [P1 V5 V6 B1] +N; \u200D\uD803\uDE6B囓\u06A8。\u0F39\u0723\uA8EF\u0C4D\u200Dς\u0BCD.\uDB40\uDCA1\u200D\uD802\uDCB2䷠\u0718; [P1 V5 V6 B1 C2]; [P1 V5 V6 B1 C2] +T; \u200D\uD803\uDE6B囓\u06A8。\u0F39\u0723\u0C4D\uA8EF\u200Dς\u0BCD.\uDB40\uDCA1\u200D\uD802\uDCB2䷠\u0718; [P1 V5 V6 B1 C2]; [P1 V5 V6 B1] +N; \u200D\uD803\uDE6B囓\u06A8。\u0F39\u0723\u0C4D\uA8EF\u200Dς\u0BCD.\uDB40\uDCA1\u200D\uD802\uDCB2䷠\u0718; [P1 V5 V6 B1 C2]; [P1 V5 V6 B1 C2] +T; \u200D\uD803\uDE6B囓\u06A8。\u0F39\u0723\u0C4D\uA8EF\u200DΣ\u0BCD.\uDB40\uDCA1\u200D\uD802\uDCB2䷠\u0718; [P1 V5 V6 B1 C2]; [P1 V5 V6 B1] +N; \u200D\uD803\uDE6B囓\u06A8。\u0F39\u0723\u0C4D\uA8EF\u200DΣ\u0BCD.\uDB40\uDCA1\u200D\uD802\uDCB2䷠\u0718; [P1 V5 V6 B1 C2]; [P1 V5 V6 B1 C2] +T; \u200D\uD803\uDE6B囓\u06A8。\u0F39\u0723\u0C4D\uA8EF\u200Dσ\u0BCD.\uDB40\uDCA1\u200D\uD802\uDCB2䷠\u0718; [P1 V5 V6 B1 C2]; [P1 V5 V6 B1] +N; \u200D\uD803\uDE6B囓\u06A8。\u0F39\u0723\u0C4D\uA8EF\u200Dσ\u0BCD.\uDB40\uDCA1\u200D\uD802\uDCB2䷠\u0718; [P1 V5 V6 B1 C2]; [P1 V5 V6 B1 C2] +T; \u200D\uD803\uDE6B囓\u06A8。\u0F39\u0723\uA8EF\u0C4D\u200DΣ\u0BCD.\uDB40\uDCA1\u200D\uD802\uDCB2䷠\u0718; [P1 V5 V6 B1 C2]; [P1 V5 V6 B1] +N; \u200D\uD803\uDE6B囓\u06A8。\u0F39\u0723\uA8EF\u0C4D\u200DΣ\u0BCD.\uDB40\uDCA1\u200D\uD802\uDCB2䷠\u0718; [P1 V5 V6 B1 C2]; [P1 V5 V6 B1 C2] +T; \u200D\uD803\uDE6B囓\u06A8。\u0F39\u0723\uA8EF\u0C4D\u200Dσ\u0BCD.\uDB40\uDCA1\u200D\uD802\uDCB2䷠\u0718; [P1 V5 V6 B1 C2]; [P1 V5 V6 B1] +N; \u200D\uD803\uDE6B囓\u06A8。\u0F39\u0723\uA8EF\u0C4D\u200Dσ\u0BCD.\uDB40\uDCA1\u200D\uD802\uDCB2䷠\u0718; [P1 V5 V6 B1 C2]; [P1 V5 V6 B1 C2] +T; 𝟚ß\u200D\u0332; [C2]; xn--2ss-7ic +N; 𝟚ß\u200D\u0332; [C2]; [C2] +T; 𝟚SS\u200D\u0332; [C2]; xn--2ss-7ic +N; 𝟚SS\u200D\u0332; [C2]; [C2] +T; 𝟚ss\u200D\u0332; [C2]; xn--2ss-7ic +N; 𝟚ss\u200D\u0332; [C2]; [C2] +T; 𝟚Ss\u200D\u0332; [C2]; xn--2ss-7ic +N; 𝟚Ss\u200D\u0332; [C2]; [C2] +B; xn--2ss-7ic; 2ss\u0332; xn--2ss-7ic +B; XN--2SS-7IC; 2ss\u0332; xn--2ss-7ic +B; Xn--2Ss-7Ic; 2ss\u0332; xn--2ss-7ic +B; 2ss\u0332; ; xn--2ss-7ic +B; 2SS\u0332; 2ss\u0332; xn--2ss-7ic +B; 2Ss\u0332; 2ss\u0332; xn--2ss-7ic +T; -\u200D.\u200D; [V3 C2]; [V3] +N; -\u200D.\u200D; [V3 C2]; [V3 C2] +T; \u2DEC\uD83A\uDFCD\uD803\uDE66.\u200Cß⒕-; [P1 V5 V6 V3 B1 C1]; [P1 V5 V6 V3 B1 B6] +N; \u2DEC\uD83A\uDFCD\uD803\uDE66.\u200Cß⒕-; [P1 V5 V6 V3 B1 C1]; [P1 V5 V6 V3 B1 C1] +T; \u2DEC\uD83A\uDFCD\uD803\uDE66.\u200CSS⒕-; [P1 V5 V6 V3 B1 C1]; [P1 V5 V6 V3 B1 B6] +N; \u2DEC\uD83A\uDFCD\uD803\uDE66.\u200CSS⒕-; [P1 V5 V6 V3 B1 C1]; [P1 V5 V6 V3 B1 C1] +T; \u2DEC\uD83A\uDFCD\uD803\uDE66.\u200Css⒕-; [P1 V5 V6 V3 B1 C1]; [P1 V5 V6 V3 B1 B6] +N; \u2DEC\uD83A\uDFCD\uD803\uDE66.\u200Css⒕-; [P1 V5 V6 V3 B1 C1]; [P1 V5 V6 V3 B1 C1] +T; \u2DEC\uD83A\uDFCD\uD803\uDE66.\u200CSs⒕-; [P1 V5 V6 V3 B1 C1]; [P1 V5 V6 V3 B1 B6] +N; \u2DEC\uD83A\uDFCD\uD803\uDE66.\u200CSs⒕-; [P1 V5 V6 V3 B1 C1]; [P1 V5 V6 V3 B1 C1] +T; ⒌\u033A--.8\u09CD\u200D𝟴\u1BA5.\uD803\uDE7B\u077A\u0626\u0644𝟪\u0729; [P1 V2 V3 V6 B1]; [P1 V2 V3 V6 B1] +N; ⒌\u033A--.8\u09CD\u200D𝟴\u1BA5.\uD803\uDE7B\u077A\u0626\u0644𝟪\u0729; [P1 V2 V3 V6 B1]; [P1 V2 V3 V6 B1] +T; \uDABF\uDD9A𝟝\uD83B\uDEBA。𝟑\uD803\uDD2D\u200C\u077F.₧\uD8ED\uDC31\u200C\u0663│\u06A6\uD83B\uDC45; [P1 V6 B5 B6 B1 C1]; [P1 V6 B5 B6 B1] +N; \uDABF\uDD9A𝟝\uD83B\uDEBA。𝟑\uD803\uDD2D\u200C\u077F.₧\uD8ED\uDC31\u200C\u0663│\u06A6\uD83B\uDC45; [P1 V6 B5 B6 B1 C1]; [P1 V6 B5 B6 B1 C1] +B; \u0726\u0757\uDB42\uDC87\uDB43\uDF9A\uDA7B\uDCF4\u0639; [P1 V6 B2]; [P1 V6 B2] +T; \uDB40\uDD0D\u200C。-; [V3 C1]; [V3] +N; \uDB40\uDD0D\u200C。-; [V3 C1]; [V3 C1] +#T; \u200D\u06C7.\uD803\uDE72\u2CEF; [B1 C2]; [B1] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +N; \u200D\u06C7.\uD803\uDE72\u2CEF; [B1 C2]; [B1 C2] +T; \uD9F5\uDDEC\u1A6A\u077F\u200Cß\u07D6𝟔; [P1 V6 B5 C1]; [P1 V6 B5] +N; \uD9F5\uDDEC\u1A6A\u077F\u200Cß\u07D6𝟔; [P1 V6 B5 C1]; [P1 V6 B5 C1] +T; \uD9F5\uDDEC\u1A6A\u077F\u200CSS\u07D6𝟔; [P1 V6 B5 C1]; [P1 V6 B5] +N; \uD9F5\uDDEC\u1A6A\u077F\u200CSS\u07D6𝟔; [P1 V6 B5 C1]; [P1 V6 B5 C1] +T; \uD9F5\uDDEC\u1A6A\u077F\u200Css\u07D6𝟔; [P1 V6 B5 C1]; [P1 V6 B5] +N; \uD9F5\uDDEC\u1A6A\u077F\u200Css\u07D6𝟔; [P1 V6 B5 C1]; [P1 V6 B5 C1] +T; \uD9F5\uDDEC\u1A6A\u077F\u200CSs\u07D6𝟔; [P1 V6 B5 C1]; [P1 V6 B5] +N; \uD9F5\uDDEC\u1A6A\u077F\u200CSs\u07D6𝟔; [P1 V6 B5 C1]; [P1 V6 B5 C1] +T; ß\uD802\uDE0D-\u200D\uD83B\uDC71\u05AA\u200C。\uD802\uDE3F\uDB40\uDD17\u0768; [P1 V6 V5 B5 B6 B1 C2 C1]; [P1 V6 V5 B5 B6 B1] +N; ß\uD802\uDE0D-\u200D\uD83B\uDC71\u05AA\u200C。\uD802\uDE3F\uDB40\uDD17\u0768; [P1 V6 V5 B5 B6 B1 C2 C1]; [P1 V6 V5 B5 B6 B1 C2 C1] +T; SS\uD802\uDE0D-\u200D\uD83B\uDC71\u05AA\u200C。\uD802\uDE3F\uDB40\uDD17\u0768; [P1 V6 V5 B5 B6 B1 C2 C1]; [P1 V6 V5 B5 B6 B1] +N; SS\uD802\uDE0D-\u200D\uD83B\uDC71\u05AA\u200C。\uD802\uDE3F\uDB40\uDD17\u0768; [P1 V6 V5 B5 B6 B1 C2 C1]; [P1 V6 V5 B5 B6 B1 C2 C1] +T; ss\uD802\uDE0D-\u200D\uD83B\uDC71\u05AA\u200C。\uD802\uDE3F\uDB40\uDD17\u0768; [P1 V6 V5 B5 B6 B1 C2 C1]; [P1 V6 V5 B5 B6 B1] +N; ss\uD802\uDE0D-\u200D\uD83B\uDC71\u05AA\u200C。\uD802\uDE3F\uDB40\uDD17\u0768; [P1 V6 V5 B5 B6 B1 C2 C1]; [P1 V6 V5 B5 B6 B1 C2 C1] +T; Ss\uD802\uDE0D-\u200D\uD83B\uDC71\u05AA\u200C。\uD802\uDE3F\uDB40\uDD17\u0768; [P1 V6 V5 B5 B6 B1 C2 C1]; [P1 V6 V5 B5 B6 B1] +N; Ss\uD802\uDE0D-\u200D\uD83B\uDC71\u05AA\u200C。\uD802\uDE3F\uDB40\uDD17\u0768; [P1 V6 V5 B5 B6 B1 C2 C1]; [P1 V6 V5 B5 B6 B1 C2 C1] +T; \uDB40\uDD3F\u067D\u0615\uA80B\u200C\u0886。\uD89E\uDF43𝟿\uD803\uDE61\uD898\uDD46-。\u062D\u200C\uA8ED\uDB41\uDCD4\u200C\u1732; [P1 V6 V3 B5 B6 B3 C1]; [P1 V6 V3 B5 B6 B3] +N; \uDB40\uDD3F\u067D\u0615\uA80B\u200C\u0886。\uD89E\uDF43𝟿\uD803\uDE61\uD898\uDD46-。\u062D\u200C\uA8ED\uDB41\uDCD4\u200C\u1732; [P1 V6 V3 B5 B6 B3 C1]; [P1 V6 V3 B5 B6 B3 C1] +T; \u068Eß\u06DC.\u200D\uDB41\uDFD9\u068E\u07E7\uFB43.\u06AB\uFE05-\u200D\u200D; [P1 V6 B2 B3 B1 C2]; [P1 V6 V3 B2 B3 B1] +N; \u068Eß\u06DC.\u200D\uDB41\uDFD9\u068E\u07E7\uFB43.\u06AB\uFE05-\u200D\u200D; [P1 V6 B2 B3 B1 C2]; [P1 V6 B2 B3 B1 C2] +T; \u068Eß\u06DC.\u200D\uDB41\uDFD9\u068E\u07E7\u05E3\u05BC.\u06AB\uFE05-\u200D\u200D; [P1 V6 B2 B3 B1 C2]; [P1 V6 V3 B2 B3 B1] +N; \u068Eß\u06DC.\u200D\uDB41\uDFD9\u068E\u07E7\u05E3\u05BC.\u06AB\uFE05-\u200D\u200D; [P1 V6 B2 B3 B1 C2]; [P1 V6 B2 B3 B1 C2] +T; \u068ESS\u06DC.\u200D\uDB41\uDFD9\u068E\u07E7\u05E3\u05BC.\u06AB\uFE05-\u200D\u200D; [P1 V6 B2 B3 B1 C2]; [P1 V6 V3 B2 B3 B1] +N; \u068ESS\u06DC.\u200D\uDB41\uDFD9\u068E\u07E7\u05E3\u05BC.\u06AB\uFE05-\u200D\u200D; [P1 V6 B2 B3 B1 C2]; [P1 V6 B2 B3 B1 C2] +T; \u068Ess\u06DC.\u200D\uDB41\uDFD9\u068E\u07E7\u05E3\u05BC.\u06AB\uFE05-\u200D\u200D; [P1 V6 B2 B3 B1 C2]; [P1 V6 V3 B2 B3 B1] +N; \u068Ess\u06DC.\u200D\uDB41\uDFD9\u068E\u07E7\u05E3\u05BC.\u06AB\uFE05-\u200D\u200D; [P1 V6 B2 B3 B1 C2]; [P1 V6 B2 B3 B1 C2] +T; \u068ESs\u06DC.\u200D\uDB41\uDFD9\u068E\u07E7\u05E3\u05BC.\u06AB\uFE05-\u200D\u200D; [P1 V6 B2 B3 B1 C2]; [P1 V6 V3 B2 B3 B1] +N; \u068ESs\u06DC.\u200D\uDB41\uDFD9\u068E\u07E7\u05E3\u05BC.\u06AB\uFE05-\u200D\u200D; [P1 V6 B2 B3 B1 C2]; [P1 V6 B2 B3 B1 C2] +T; \u068ESS\u06DC.\u200D\uDB41\uDFD9\u068E\u07E7\uFB43.\u06AB\uFE05-\u200D\u200D; [P1 V6 B2 B3 B1 C2]; [P1 V6 V3 B2 B3 B1] +N; \u068ESS\u06DC.\u200D\uDB41\uDFD9\u068E\u07E7\uFB43.\u06AB\uFE05-\u200D\u200D; [P1 V6 B2 B3 B1 C2]; [P1 V6 B2 B3 B1 C2] +T; \u068Ess\u06DC.\u200D\uDB41\uDFD9\u068E\u07E7\uFB43.\u06AB\uFE05-\u200D\u200D; [P1 V6 B2 B3 B1 C2]; [P1 V6 V3 B2 B3 B1] +N; \u068Ess\u06DC.\u200D\uDB41\uDFD9\u068E\u07E7\uFB43.\u06AB\uFE05-\u200D\u200D; [P1 V6 B2 B3 B1 C2]; [P1 V6 B2 B3 B1 C2] +T; \u068ESs\u06DC.\u200D\uDB41\uDFD9\u068E\u07E7\uFB43.\u06AB\uFE05-\u200D\u200D; [P1 V6 B2 B3 B1 C2]; [P1 V6 V3 B2 B3 B1] +N; \u068ESs\u06DC.\u200D\uDB41\uDFD9\u068E\u07E7\uFB43.\u06AB\uFE05-\u200D\u200D; [P1 V6 B2 B3 B1 C2]; [P1 V6 B2 B3 B1 C2] +T; \uD809\uDF88\uD802\uDE0E\uD83B\uDE51\uD802\uDD7A\u200D; [P1 V6 B5 B6 C2]; [P1 V6 B5 B6] +N; \uD809\uDF88\uD802\uDE0E\uD83B\uDE51\uD802\uDD7A\u200D; [P1 V6 B5 B6 C2]; [P1 V6 B5 B6 C2] +T; \uDB25\uDFCD1\u0FA9\u200D\uD803\uDE7E₁。\u200C\u200D; [P1 V6 B5 B1 C2 C1]; [P1 V6 B5] +N; \uDB25\uDFCD1\u0FA9\u200D\uD803\uDE7E₁。\u200C\u200D; [P1 V6 B5 B1 C2 C1]; [P1 V6 B5 B1 C2 C1] +B; \u07E9\uD802\uDCC4\u06D1\uDB41\uDE16\u068E; [P1 V6]; [P1 V6] +B; \uD802\uDDF2.---\u06A5\u07D2; [P1 V6 V3 B1]; [P1 V6 V3 B1] +T; \u0682\u0B4D-\uD803\uDE73\uD803\uDE64⛛.\uD803\uDE62\uAA2D\u0723\u200C\u0758\uD823\uDF9A; [P1 V6 B3 B1]; [P1 V6 B3 B1] +N; \u0682\u0B4D-\uD803\uDE73\uD803\uDE64⛛.\uD803\uDE62\uAA2D\u0723\u200C\u0758\uD823\uDF9A; [P1 V6 B3 B1]; [P1 V6 B3 B1] +#T; -❵\u200C\u0649; [V3 B1 C1]; [V3 B1] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +N; -❵\u200C\u0649; [V3 B1 C1]; [V3 B1 C1] +#T; 🄈\u200C\u0665-。\u1DD9⬚\u06A9; [P1 V3 V6 V5 B1 C1]; [P1 V3 V6 V5 B1] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +N; 🄈\u200C\u0665-。\u1DD9⬚\u06A9; [P1 V3 V6 V5 B1 C1]; [P1 V3 V6 V5 B1 C1] +T; ß\u0CBF\u200D\u0603\u0727; [P1 V6 B5 B6 C2]; [P1 V6 B5 B6] +N; ß\u0CBF\u200D\u0603\u0727; [P1 V6 B5 B6 C2]; [P1 V6 B5 B6 C2] +T; SS\u0CBF\u200D\u0603\u0727; [P1 V6 B5 B6 C2]; [P1 V6 B5 B6] +N; SS\u0CBF\u200D\u0603\u0727; [P1 V6 B5 B6 C2]; [P1 V6 B5 B6 C2] +T; ss\u0CBF\u200D\u0603\u0727; [P1 V6 B5 B6 C2]; [P1 V6 B5 B6] +N; ss\u0CBF\u200D\u0603\u0727; [P1 V6 B5 B6 C2]; [P1 V6 B5 B6 C2] +T; Ss\u0CBF\u200D\u0603\u0727; [P1 V6 B5 B6 C2]; [P1 V6 B5 B6] +N; Ss\u0CBF\u200D\u0603\u0727; [P1 V6 B5 B6 C2]; [P1 V6 B5 B6 C2] +B; -\uAAB7\uDB43\uDDE2\uD803\uDDEC\uA806; [P1 V3 V6 B1]; [P1 V3 V6 B1] +#T; \u0C4Dς\u0DCA\u06B0; [V5 B1]; [V5 B1] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +N; \u0C4Dς\u0DCA\u06B0; [V5 B1]; [V5 B1] +#B; \u0C4DΣ\u0DCA\u06B0; [V5 B1]; [V5 B1] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +#B; \u0C4Dσ\u0DCA\u06B0; [V5 B1]; [V5 B1] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +B; 3\uD83A\uDE3B\u0623\u0DD6\uD803\uDE7B-。\uD803\uDE78\uD803\uDE7C\u094D۶-\uD802\uDD90; [P1 V3 V6 B1]; [P1 V3 V6 B1] +T; \u0770\uD803\uDE78\u200C\u200C\u200C; [B3 C1]; xn--0pb6875k +N; \u0770\uD803\uDE78\u200C\u200C\u200C; [B3 C1]; [B3 C1] +B; xn--0pb6875k; \u0770\uD803\uDE78; xn--0pb6875k +B; XN--0PB6875K; \u0770\uD803\uDE78; xn--0pb6875k +B; Xn--0Pb6875k; \u0770\uD803\uDE78; xn--0pb6875k +B; \u0770\uD803\uDE78; ; xn--0pb6875k +B; \u0717\uD802\uDE0C.\uD803\uDE7D\u067C\u0311\uA9B8.\uDB42\uDEDD\u06C5\uD803\uDED7; [P1 V6 B1]; [P1 V6 B1] +B; \uD803\uDE78。\uD803\uDEA9\u094D; [P1 V6 B1]; [P1 V6 B1] +T; \uDBF5\uDEF5\uA806\uD90E\uDC87ς\u200D\uDB40\uDDA7; [P1 V6 C2]; [P1 V6] +N; \uDBF5\uDEF5\uA806\uD90E\uDC87ς\u200D\uDB40\uDDA7; [P1 V6 C2]; [P1 V6 C2] +T; \uDBF5\uDEF5\uA806\uD90E\uDC87Σ\u200D\uDB40\uDDA7; [P1 V6 C2]; [P1 V6] +N; \uDBF5\uDEF5\uA806\uD90E\uDC87Σ\u200D\uDB40\uDDA7; [P1 V6 C2]; [P1 V6 C2] +T; \uDBF5\uDEF5\uA806\uD90E\uDC87σ\u200D\uDB40\uDDA7; [P1 V6 C2]; [P1 V6] +N; \uDBF5\uDEF5\uA806\uD90E\uDC87σ\u200D\uDB40\uDDA7; [P1 V6 C2]; [P1 V6 C2] +T; ß\u0687\u07DE\u06A2.\uD802\uDDF1\u06AC-\u200Cß\uDAFA\uDFAE𝟺; [P1 V6 B5 B6 B2 C1]; [P1 V6 B5 B6 B2] +N; ß\u0687\u07DE\u06A2.\uD802\uDDF1\u06AC-\u200Cß\uDAFA\uDFAE𝟺; [P1 V6 B5 B6 B2 C1]; [P1 V6 B5 B6 B2 C1] +T; SS\u0687\u07DE\u06A2.\uD802\uDDF1\u06AC-\u200CSS\uDAFA\uDFAE𝟺; [P1 V6 B5 B6 B2 C1]; [P1 V6 B5 B6 B2] +N; SS\u0687\u07DE\u06A2.\uD802\uDDF1\u06AC-\u200CSS\uDAFA\uDFAE𝟺; [P1 V6 B5 B6 B2 C1]; [P1 V6 B5 B6 B2 C1] +T; ss\u0687\u07DE\u06A2.\uD802\uDDF1\u06AC-\u200Css\uDAFA\uDFAE𝟺; [P1 V6 B5 B6 B2 C1]; [P1 V6 B5 B6 B2] +N; ss\u0687\u07DE\u06A2.\uD802\uDDF1\u06AC-\u200Css\uDAFA\uDFAE𝟺; [P1 V6 B5 B6 B2 C1]; [P1 V6 B5 B6 B2 C1] +T; Ss\u0687\u07DE\u06A2.\uD802\uDDF1\u06AC-\u200CSs\uDAFA\uDFAE𝟺; [P1 V6 B5 B6 B2 C1]; [P1 V6 B5 B6 B2] +N; Ss\u0687\u07DE\u06A2.\uD802\uDDF1\u06AC-\u200CSs\uDAFA\uDFAE𝟺; [P1 V6 B5 B6 B2 C1]; [P1 V6 B5 B6 B2 C1] +T; \uD803\uDE7A\u0F84\uD8AE\uDCCA\u200D∤\u200C-; [P1 V3 V6 B1 C2 C1]; [P1 V3 V6 B1] +N; \uD803\uDE7A\u0F84\uD8AE\uDCCA\u200D∤\u200C-; [P1 V3 V6 B1 C2 C1]; [P1 V3 V6 B1 C2 C1] +T; ß\uDB40\uDC5B\uD83A\uDEC7\u063A; [P1 V6 B5 B6]; [P1 V6 B5 B6] +N; ß\uDB40\uDC5B\uD83A\uDEC7\u063A; [P1 V6 B5 B6]; [P1 V6 B5 B6] +B; SS\uDB40\uDC5B\uD83A\uDEC7\u063A; [P1 V6 B5 B6]; [P1 V6 B5 B6] +B; ss\uDB40\uDC5B\uD83A\uDEC7\u063A; [P1 V6 B5 B6]; [P1 V6 B5 B6] +B; Ss\uDB40\uDC5B\uD83A\uDEC7\u063A; [P1 V6 B5 B6]; [P1 V6 B5 B6] +B; \uDB40\uDC64\u1039\u0B4D-; [P1 V3 V6]; [P1 V3 V6] +#B; \u0954\uD803\uDE68☞; [V5 B1]; [V5 B1] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +T; \u17B5ς; [P1 V6]; [P1 V6] +N; \u17B5ς; [P1 V6]; [P1 V6] +B; \u17B5Σ; [P1 V6]; [P1 V6] +B; \u17B5σ; [P1 V6]; [P1 V6] +T; \uD803\uDCC8\u07BE.ς\u200D\u032F.\u0E48\uD9B5\uDFCBς-; [P1 V6 V3 V5 B6 B1 C2]; [P1 V6 V3 V5 B1] +N; \uD803\uDCC8\u07BE.ς\u200D\u032F.\u0E48\uD9B5\uDFCBς-; [P1 V6 V3 V5 B6 B1 C2]; [P1 V6 V3 V5 B6 B1 C2] +T; \uD803\uDCC8\u07BE.Σ\u200D\u032F.\u0E48\uD9B5\uDFCBΣ-; [P1 V6 V3 V5 B6 B1 C2]; [P1 V6 V3 V5 B1] +N; \uD803\uDCC8\u07BE.Σ\u200D\u032F.\u0E48\uD9B5\uDFCBΣ-; [P1 V6 V3 V5 B6 B1 C2]; [P1 V6 V3 V5 B6 B1 C2] +T; \uD803\uDCC8\u07BE.σ\u200D\u032F.\u0E48\uD9B5\uDFCBσ-; [P1 V6 V3 V5 B6 B1 C2]; [P1 V6 V3 V5 B1] +N; \uD803\uDCC8\u07BE.σ\u200D\u032F.\u0E48\uD9B5\uDFCBσ-; [P1 V6 V3 V5 B6 B1 C2]; [P1 V6 V3 V5 B6 B1 C2] +T; \uD83A\uDD46\u0315ß\u200C⓽-\uD83B\uDF9E; [P1 V6 B2 C1]; [P1 V6 B2] +N; \uD83A\uDD46\u0315ß\u200C⓽-\uD83B\uDF9E; [P1 V6 B2 C1]; [P1 V6 B2 C1] +T; \uD83A\uDD46\u0315SS\u200C⓽-\uD83B\uDF9E; [P1 V6 B2 C1]; [P1 V6 B2] +N; \uD83A\uDD46\u0315SS\u200C⓽-\uD83B\uDF9E; [P1 V6 B2 C1]; [P1 V6 B2 C1] +T; \uD83A\uDD46\u0315ss\u200C⓽-\uD83B\uDF9E; [P1 V6 B2 C1]; [P1 V6 B2] +N; \uD83A\uDD46\u0315ss\u200C⓽-\uD83B\uDF9E; [P1 V6 B2 C1]; [P1 V6 B2 C1] +T; \uD83A\uDD46\u0315Ss\u200C⓽-\uD83B\uDF9E; [P1 V6 B2 C1]; [P1 V6 B2] +N; \uD83A\uDD46\u0315Ss\u200C⓽-\uD83B\uDF9E; [P1 V6 B2 C1]; [P1 V6 B2 C1] +#B; \u0666; [B1]; [B1] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +#T; \u06A3ς\u07E4。۹\uD803\uDE73\uD804\uDCB91\u200D; [B2 B1 C2]; [B2 B1] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +N; \u06A3ς\u07E4。۹\uD803\uDE73\uD804\uDCB91\u200D; [B2 B1 C2]; [B2 B1 C2] +#T; \u06A3Σ\u07E4。۹\uD803\uDE73\uD804\uDCB91\u200D; [B2 B1 C2]; [B2 B1] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +N; \u06A3Σ\u07E4。۹\uD803\uDE73\uD804\uDCB91\u200D; [B2 B1 C2]; [B2 B1 C2] +#T; \u06A3σ\u07E4。۹\uD803\uDE73\uD804\uDCB91\u200D; [B2 B1 C2]; [B2 B1] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +N; \u06A3σ\u07E4。۹\uD803\uDE73\uD804\uDCB91\u200D; [B2 B1 C2]; [B2 B1 C2] +#B; \u0342.\u0663; [V5 B1 B3 B6]; [V5 B1 B3 B6] # GETASCII DOES NOT FAIL ON WINDOWS 8.1 +T; \u0D4D\u200C\u200D\uD8A8\uDF73.\uDB40\uDD44\u0764\uD803\uDE66\uD8AD\uDC4A\uD83A\uDFAE𥐿.-🄇\uD803\uDE62\u200D; [P1 V5 V6 V3 B1 B2 B3 C2]; [P1 V5 V6 V3 B1 B2 B3] +N; \u0D4D\u200C\u200D\uD8A8\uDF73.\uDB40\uDD44\u0764\uD803\uDE66\uD8AD\uDC4A\uD83A\uDFAE𥐿.-🄇\uD803\uDE62\u200D; [P1 V5 V6 V3 B1 B2 B3 C2]; [P1 V5 V6 V3 B1 B2 B3 C2] +T; \u200C\uD803\uDE7A。\u0660²\uD834\uDD74\uDAD0\uDE5E\uD803\uDE79。\u200D\u06619; [P1 V6 B1 C1 C2]; [P1 V6 B1] +N; \u200C\uD803\uDE7A。\u0660²\uD834\uDD74\uDAD0\uDE5E\uD803\uDE79。\u200D\u06619; [P1 V6 B1 C1 C2]; [P1 V6 B1 C1 C2] diff --git a/src/System.Globalization.Extensions/tests/IdnMapping/Data/Unicode_6_0/ReadMe.txt b/src/System.Globalization.Extensions/tests/IdnMapping/Data/Unicode_6_0/ReadMe.txt new file mode 100644 index 000000000000..b3efb0659f88 --- /dev/null +++ b/src/System.Globalization.Extensions/tests/IdnMapping/Data/Unicode_6_0/ReadMe.txt @@ -0,0 +1,5 @@ +This directory contains data files for version 6.0 of +UTS #46: Unicode IDNA Compatibility Processing, +http://www.unicode.org/reports/tr46/tr46-5.html . + +Retrieved from http://www.unicode.org/Public/idna/6.3.0/ on 4 March 2014 \ No newline at end of file diff --git a/src/System.Globalization.Extensions/tests/IdnMapping/Data/Unicode_6_0/Unicode_6_0_IdnaTest.cs b/src/System.Globalization.Extensions/tests/IdnMapping/Data/Unicode_6_0/Unicode_6_0_IdnaTest.cs new file mode 100644 index 000000000000..3332661020ab --- /dev/null +++ b/src/System.Globalization.Extensions/tests/IdnMapping/Data/Unicode_6_0/Unicode_6_0_IdnaTest.cs @@ -0,0 +1,88 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using Xunit; +using System; +using System.Text; + +namespace System.Globalization.Extensions.Tests +{ + /// + /// Class to read data obtained from http://www.unicode.org/Public/idna. For more information read the information + /// contained in Data\6.0\IdnaTest.txt + /// + /// The structure of the data set is a semicolon deliminated list with the following columns: + /// + /// Column 1: type - T for transitional, N for nontransitional, B for both + /// Column 2: source - the source string to be tested + /// Column 3: toUnicode - the result of applying toUnicode to the source, using the specified type + /// Column 4: toASCII - the result of applying toASCII to the source, using nontransitional + /// + /// If the value of toUnicode or toASCII is the same as source, the column will be blank. + /// + public class Unicode_6_0_IdnaTest : IConformanceIdnaTest + { + public IdnType Type { get; set; } + public string Source { get; set; } + public ConformanceIdnaTestResult GetUnicodeResult { get; set; } + public ConformanceIdnaTestResult GetASCIIResult { get; set; } + public int LineNumber { get; set; } + + public Unicode_6_0_IdnaTest(string line, int lineNumber) + { + var split = line.Split(';'); + + Type = ConvertStringToType(split[0].Trim()); + Source = EscapedToLiteralString(split[1], lineNumber); + GetUnicodeResult = new ConformanceIdnaTestResult(EscapedToLiteralString(split[2], lineNumber), Source); + GetASCIIResult = new ConformanceIdnaTestResult(EscapedToLiteralString(split[3], lineNumber), GetUnicodeResult.Value); + LineNumber = lineNumber; + } + + private static IdnType ConvertStringToType(string idnType) + { + switch (idnType) + { + case "T": + return IdnType.Transitional; + case "N": + return IdnType.Nontransitional; + case "B": + return IdnType.Both; + default: + throw new ArgumentOutOfRangeException("idnType", "Unknown idnType"); + } + } + + /// + /// This will convert strings with escaped sequences to literal characters. The input string is + /// expected to have escaped sequences in the form of '\uXXXX'. + /// + /// Example: "a\u0020b" will be converted to 'a b'. + /// + private static string EscapedToLiteralString(string escaped, int lineNumber) + { + var sb = new StringBuilder(); + + for (int i = 0; i < escaped.Length; i++) + { + if (i + 1 < escaped.Length && escaped[i] == '\\' && escaped[i + 1] == 'u') + { + // Verify that the escaped sequence is not malformed + if (i + 5 >= escaped.Length) + Assert.False(true, "There was a problem converting to literal string on Line " + lineNumber); + + var codepoint = Convert.ToInt32(escaped.Substring(i + 2, 4), 16); + sb.Append((char)codepoint); + i += 5; + } + else + { + sb.Append(escaped[i]); + } + } + + return sb.ToString().Trim(); + } + } +} diff --git a/src/System.Globalization.Extensions/tests/IdnMapping/GetAsciiTests.cs b/src/System.Globalization.Extensions/tests/IdnMapping/GetAsciiTests.cs new file mode 100644 index 000000000000..1764673dc7d1 --- /dev/null +++ b/src/System.Globalization.Extensions/tests/IdnMapping/GetAsciiTests.cs @@ -0,0 +1,126 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using Xunit; +using System; +using System.Globalization; + +namespace System.Globalization.Extensions.Tests +{ + public class GetAsciiTests + { + [Fact] + public void SimpleValidationTests() + { + var idn = new IdnMapping(); + + Assert.Equal("xn--yda", idn.GetAscii("\u0101")); + Assert.Equal("xn--yda", idn.GetAscii("\u0101", 0)); + Assert.Equal("xn--yda", idn.GetAscii("\u0101", 0, 1)); + + Assert.Equal("xn--aa-cla", idn.GetAscii("\u0101\u0061\u0041")); + Assert.Equal("xn--ab-dla", idn.GetAscii("\u0061\u0101\u0062")); + Assert.Equal("xn--ab-ela", idn.GetAscii("\u0061\u0062\u0101")); + } + + [Fact] + public void SurrogatePairsConsecutive() + { + var idn = new IdnMapping(); + + Assert.Equal("xn--097ccd", idn.GetAscii("\uD800\uDF00\uD800\uDF01\uD800\uDF02")); + } + + [Fact] + public void SurrogatePairsSeparatedByAscii() + { + var idn = new IdnMapping(); + + Assert.Equal("xn--ab-ic6nfag", idn.GetAscii("\uD800\uDF00\u0061\uD800\uDF01\u0042\uD800\uDF02")); + } + + [Fact] + public void SurrogatePairsSeparatedByNonAscii() + { + var idn = new IdnMapping(); + + Assert.Equal("xn--yda263v6b6kfag", idn.GetAscii("\uD800\uDF00\u0101\uD800\uDF01\u305D\uD800\uDF02")); + } + + [Fact] + public void SurrogatePairsSeparatedByAsciiAndNonAscii() + { + var idn = new IdnMapping(); + + Assert.Equal("xn--a-nha4529qfag", idn.GetAscii("\uD800\uDF00\u0101\uD800\uDF01\u0061\uD800\uDF02")); + } + + [Fact] + public void FullyQualifiedDomainNameVsIndividualLabels() + { + var idn = new IdnMapping(); + + // ASCII only code points + Assert.Equal("\u0061\u0062\u0063", idn.GetAscii("\u0061\u0062\u0063")); + // non-ASCII only code points + Assert.Equal("xn--d9juau41awczczp", idn.GetAscii("\u305D\u306E\u30B9\u30D4\u30FC\u30C9\u3067")); + // ASCII and non-ASCII code points + Assert.Equal("xn--de-jg4avhby1noc0d", idn.GetAscii("\u30D1\u30D5\u30A3\u30FC\u0064\u0065\u30EB\u30F3\u30D0")); + // Fully Qualified Domain Name + Assert.Equal("abc.xn--d9juau41awczczp.xn--de-jg4avhby1noc0d", idn.GetAscii("\u0061\u0062\u0063.\u305D\u306E\u30B9\u30D4\u30FC\u30C9\u3067.\u30D1\u30D5\u30A3\u30FC\u0064\u0065\u30EB\u30F3\u30D0")); + } + + [Fact] + public void EmbeddedNulls() + { + var idn = new IdnMapping(); + + Assert.Throws(() => idn.GetAscii("\u0101\u0000")); + Assert.Throws(() => idn.GetAscii("\u0101\u0000", 0)); + Assert.Throws(() => idn.GetAscii("\u0101\u0000", 0, 2)); + Assert.Throws(() => idn.GetAscii("\u0101\u0000\u0101")); + Assert.Throws(() => idn.GetAscii("\u0101\u0000\u0101", 0)); + Assert.Throws(() => idn.GetAscii("\u0101\u0000\u0101", 0, 3)); + Assert.Throws(() => idn.GetAscii("\u0101\u0000\u0101\u0000")); + Assert.Throws(() => idn.GetAscii("\u0101\u0000\u0101\u0000", 0)); + Assert.Throws(() => idn.GetAscii("\u0101\u0000\u0101\u0000", 0, 4)); + } + + /// + /// Embedded domain name conversion (NLS+ only) (Priority 1) + /// + /// Per the spec [7], “The index and count parameters (when provided) allow the + /// conversion to be done on a larger string where the domain name is embedded + /// (such as a URI or IRI). The output string is only the converted FQDN or + /// label, not the whole input string (if the input string contains more + /// character than the substring to convert).” + /// + /// Fully Qualified Domain Name (Label1.Label2.Label3) + /// + /// + /// An FQDN/label can NOT begin with a label separator, but may end + /// with one. This will cause an ArgumentException. + /// + [Fact] + public void EmbeddedDomainNameConversion() + { + var idn = new IdnMapping(); + + Assert.Equal("abc.xn--d9juau41awczczp.xn--de-jg4avhby1noc0d", idn.GetAscii("\u0061\u0062\u0063.\u305D\u306E\u30B9\u30D4\u30FC\u30C9\u3067.\u30D1\u30D5\u30A3\u30FC\u0064\u0065\u30EB\u30F3\u30D0", 0)); + Assert.Equal("abc.xn--d9juau41awczczp", idn.GetAscii("\u0061\u0062\u0063.\u305D\u306E\u30B9\u30D4\u30FC\u30C9\u3067.\u30D1\u30D5\u30A3\u30FC\u0064\u0065\u30EB\u30F3\u30D0", 0, 11)); + Assert.Equal("abc.xn--d9juau41awczczp.", idn.GetAscii("\u0061\u0062\u0063.\u305D\u306E\u30B9\u30D4\u30FC\u30C9\u3067.\u30D1\u30D5\u30A3\u30FC\u0064\u0065\u30EB\u30F3\u30D0", 0, 12)); + Assert.Equal("abc.xn--d9juau41awczczp.xn--de-jg4avhby1noc0d", idn.GetAscii("\u0061\u0062\u0063.\u305D\u306E\u30B9\u30D4\u30FC\u30C9\u3067.\u30D1\u30D5\u30A3\u30FC\u0064\u0065\u30EB\u30F3\u30D0", 0, 21)); + Assert.Throws(() => idn.GetAscii("\u0061\u0062\u0063.\u305D\u306E\u30B9\u30D4\u30FC\u30C9\u3067.\u30D1\u30D5\u30A3\u30FC\u0064\u0065\u30EB\u30F3\u30D0", 3)); + Assert.Throws(() => idn.GetAscii("\u0061\u0062\u0063.\u305D\u306E\u30B9\u30D4\u30FC\u30C9\u3067.\u30D1\u30D5\u30A3\u30FC\u0064\u0065\u30EB\u30F3\u30D0", 3, 8)); + Assert.Throws(() => idn.GetAscii("\u0061\u0062\u0063.\u305D\u306E\u30B9\u30D4\u30FC\u30C9\u3067.\u30D1\u30D5\u30A3\u30FC\u0064\u0065\u30EB\u30F3\u30D0", 3, 9)); + Assert.Equal("xn--d9juau41awczczp.xn--de-jg4avhby1noc0d", idn.GetAscii("\u0061\u0062\u0063.\u305D\u306E\u30B9\u30D4\u30FC\u30C9\u3067.\u30D1\u30D5\u30A3\u30FC\u0064\u0065\u30EB\u30F3\u30D0", 4)); + Assert.Equal("xn--d9juau41awczczp", idn.GetAscii("\u0061\u0062\u0063.\u305D\u306E\u30B9\u30D4\u30FC\u30C9\u3067.\u30D1\u30D5\u30A3\u30FC\u0064\u0065\u30EB\u30F3\u30D0", 4, 7)); + Assert.Equal("xn--d9juau41awczczp.", idn.GetAscii("\u0061\u0062\u0063.\u305D\u306E\u30B9\u30D4\u30FC\u30C9\u3067.\u30D1\u30D5\u30A3\u30FC\u0064\u0065\u30EB\u30F3\u30D0", 4, 8)); + Assert.Equal("xn--d9juau41awczczp.xn--de-jg4avhby1noc0d", idn.GetAscii("\u0061\u0062\u0063.\u305D\u306E\u30B9\u30D4\u30FC\u30C9\u3067.\u30D1\u30D5\u30A3\u30FC\u0064\u0065\u30EB\u30F3\u30D0", 4, 17)); + Assert.Throws(() => idn.GetAscii("\u0061\u0062\u0063.\u305D\u306E\u30B9\u30D4\u30FC\u30C9\u3067.\u30D1\u30D5\u30A3\u30FC\u0064\u0065\u30EB\u30F3\u30D0", 11)); + Assert.Throws(() => idn.GetAscii("\u0061\u0062\u0063.\u305D\u306E\u30B9\u30D4\u30FC\u30C9\u3067.\u30D1\u30D5\u30A3\u30FC\u0064\u0065\u30EB\u30F3\u30D0", 11, 10)); + Assert.Equal("xn--de-jg4avhby1noc0d", idn.GetAscii("\u0061\u0062\u0063.\u305D\u306E\u30B9\u30D4\u30FC\u30C9\u3067.\u30D1\u30D5\u30A3\u30FC\u0064\u0065\u30EB\u30F3\u30D0", 12)); + Assert.Equal("xn--de-jg4avhby1noc0d", idn.GetAscii("\u0061\u0062\u0063.\u305D\u306E\u30B9\u30D4\u30FC\u30C9\u3067.\u30D1\u30D5\u30A3\u30FC\u0064\u0065\u30EB\u30F3\u30D0", 12, 9)); + } + } +} diff --git a/src/System.Globalization.Extensions/tests/IdnMapping/IdnaConformanceTests.cs b/src/System.Globalization.Extensions/tests/IdnMapping/IdnaConformanceTests.cs new file mode 100644 index 000000000000..bf36ef3829a6 --- /dev/null +++ b/src/System.Globalization.Extensions/tests/IdnMapping/IdnaConformanceTests.cs @@ -0,0 +1,119 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using Xunit; +using System; +using System.Collections.Generic; + +namespace System.Globalization.Extensions.Tests +{ + /// + /// This suite of tests enumerate a set of input and outputs provided by the Unicode consortium. + /// For more information, see the files within Data\[Unicode version]. This tests positive + /// and negative test cases for both GetASCII and GetUnicode methods. + /// + public class IdnaConformanceTests + { + /// + /// Tests whether the expected object is equal to the actual object as determined by + /// the supplied comparer and throws an exception if it is not. + /// + /// Expected object. + /// Actual object. + /// Comparer to be used to determine equality of objects. + /// Message to display upon failure. + public static void CompareResult(T expected, T actual, IComparer comparer, string message) + { + if (comparer.Compare(expected, actual) != 0) + { + Assert.False(true, string.Format(@"Expected: <{1}>. Actual:<{2}>. {0}", message, expected, actual)); + } + } + + /// + /// Tests positive cases for GetAscii. + /// + [Fact] + public void TestAsciiPositive() + { + foreach (var entry in Factory.GetDataset()) + { + if (entry.GetASCIIResult.Success) + { + var map = new System.Globalization.IdnMapping(); + var asciiResult = map.GetAscii(entry.Source); + + CompareResult(entry.GetASCIIResult.Value, asciiResult, StringComparer.OrdinalIgnoreCase, "Error on line number " + entry.LineNumber); + } + } + } + + /// + /// Tests positive cases for GetUnicode. Windows fails by design on some entries that should pass. The recommendation is to take the source input + /// for this if needed. + /// + /// There are some others that failed which have been commented out and marked in the dataset as "GETUNICODE DOES FAILS ON WINDOWS 8.1" + /// + [Fact] + public void TestUnicodePositive() + { + foreach (var entry in Factory.GetDataset()) + { + if (entry.GetUnicodeResult.Success) + { + try + { + var map = new System.Globalization.IdnMapping { UseStd3AsciiRules = true, AllowUnassigned = true }; + var unicodeResult = map.GetUnicode(entry.Source); + + CompareResult(entry.GetUnicodeResult.Value, unicodeResult, StringComparer.OrdinalIgnoreCase, "Error on line number " + entry.LineNumber); + } + catch (ArgumentException) + { + CompareResult(entry.GetUnicodeResult.Value, entry.Source, StringComparer.OrdinalIgnoreCase, "Error on line number " + entry.LineNumber); + } + } + } + } + + /// + /// Tests negative cases for GetAscii. + /// + /// + /// There are some failures on Windows 8.1 that have been commented out + /// from the 6.0\IdnaTest.txt. To find them, search for "GETASCII DOES NOT FAIL ON WINDOWS 8.1" + /// + [Fact] + public void TestAsciiNegative() + { + foreach (var entry in Factory.GetDataset()) + { + if (!entry.GetASCIIResult.Success) + { + var map = new System.Globalization.IdnMapping(); + Assert.Throws(() => map.GetAscii(entry.Source)); + } + } + } + + /// + /// Tests negative cases for GetUnicode. + /// + /// + /// There are some failures on Windows 8.1 that have been commented out + /// from the 6.0\IdnaTest.txt. To find them, search for "GETUNICODE DOES NOT FAIL ON WINDOWS 8.1" + /// + [Fact] + public void TestUnicodeNegative() + { + foreach (var entry in Factory.GetDataset()) + { + if (!entry.GetUnicodeResult.Success) + { + var map = new System.Globalization.IdnMapping(); + Assert.Throws(() => map.GetUnicode(entry.Source)); + } + } + } + } +} \ No newline at end of file diff --git a/src/System.Globalization.Extensions/tests/IdnMapping/UseStd3AsciiRules.cs b/src/System.Globalization.Extensions/tests/IdnMapping/UseStd3AsciiRules.cs new file mode 100644 index 000000000000..95c45e062aca --- /dev/null +++ b/src/System.Globalization.Extensions/tests/IdnMapping/UseStd3AsciiRules.cs @@ -0,0 +1,104 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using Xunit; +using System; +using System.Globalization; + +namespace System.Globalization.Extensions.Tests +{ + /// + /// According to the ToASCII algorithm, if the UseSTD3ASCIIRules flag is set, + /// then perform these checks: + /// + /// (a) Verify the absence of non-LDH ASCII code points; that is, the absence + /// of 0..2C, 2E..2F, 3A..40, 5B..60, and 7B..7F. + /// + /// (b) Verify the absence of leading and trailing hyphen-minus; that is, the + /// absence of U+002D at the beginning and end of the sequence. + /// + /// By default this flag should not be set. + /// + public class UseStd3AsciiRules + { + private void VerifyStd3AsciiRules(string unicode) + { + var idnStd3False = new IdnMapping { UseStd3AsciiRules = false }; + var idnStd3True = new IdnMapping { UseStd3AsciiRules = true }; + + Assert.Equal(unicode, idnStd3False.GetAscii(unicode)); + Assert.Throws(() => idnStd3True.GetAscii(unicode)); + } + + [Fact] + public void DefaultIsFalse() + { + Assert.False(new IdnMapping().UseStd3AsciiRules); + } + + [Fact] + public void SanityCheck() + { + VerifyStd3AsciiRules("\u0020\u0061\u0062"); + VerifyStd3AsciiRules("\u0061\u002F\u0062"); + VerifyStd3AsciiRules("\u0061\u0062\u003D"); + VerifyStd3AsciiRules("\u0061\u0062\u005D"); + VerifyStd3AsciiRules("\u007E\u0061\u0062"); + VerifyStd3AsciiRules("\u0020\u002E\u003D\u005D\u007E"); + VerifyStd3AsciiRules("\u007E\u002E\u0061"); + VerifyStd3AsciiRules("\u0061\u002E\u007E"); + } + + [Fact] + public void LeadingHyphenMinus() + { + VerifyStd3AsciiRules("\u002D\u0061\u0062"); + } + + [Fact] + public void LeadingHyphenMinusInFirstLabel() + { + VerifyStd3AsciiRules("\u002D\u0061\u0062\u002E\u0063\u0064"); + } + + [Fact] + public void LeadingHyphenMinusInSecondLabel() + { + VerifyStd3AsciiRules("\u0061\u0062\u002E\u002D\u0063\u0064"); + } + + [Fact] + public void TrailingHyphenMinus() + { + VerifyStd3AsciiRules("\u0061\u0062\u002D"); + } + + [Fact] + public void TrailingHyphenMinusInFirstLabel() + { + VerifyStd3AsciiRules("\u0061\u0062\u002D\u002E\u0063\u0064"); + } + + [Fact] + public void TrailingHyphenMinusInSecondLabel() + { + VerifyStd3AsciiRules("\u0061\u0062\u002E\u0063\u0064\u002D"); + } + + [Fact] + public void LeadingAndTrailingHyphenMinus() + { + VerifyStd3AsciiRules("\u002D"); + VerifyStd3AsciiRules("\u002D\u0062\u002D"); + } + + [Fact] + public void NonLDH_ASCII_Codepoint() + { + var idnStd3False = new IdnMapping { UseStd3AsciiRules = false }; + var unicode = "\u0030\u002D\u0045\u007A"; + + Assert.Equal(unicode, idnStd3False.GetAscii(unicode)); + } + } +} diff --git a/src/System.Globalization.Extensions/tests/Normalization/Normalization.cs b/src/System.Globalization.Extensions/tests/Normalization/Normalization.cs new file mode 100644 index 000000000000..84b7be73bc1e --- /dev/null +++ b/src/System.Globalization.Extensions/tests/Normalization/Normalization.cs @@ -0,0 +1,72 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using Xunit; +using System; +using System.Text; +using System.Globalization; + +namespace System.Globalization.Extensions.Tests +{ + public class StringNormalization + { + [Fact] + public void NormalizeTest() + { + string composed = "\u00C4\u00C7"; // "ÄÇ" + string decomposed = "A\u0308C\u0327"; + + Assert.True(composed.IsNormalized()); + Assert.True(composed.IsNormalized(NormalizationForm.FormC)); + Assert.False(composed.IsNormalized(NormalizationForm.FormD)); + + Assert.True(decomposed.IsNormalized(NormalizationForm.FormD)); + Assert.False(decomposed.IsNormalized(NormalizationForm.FormC)); + + Assert.True("".Normalize(NormalizationForm.FormC).Length == 0); + + Assert.True(composed.Normalize(NormalizationForm.FormD).Equals(decomposed)); + Assert.True(decomposed.Normalize().Equals(composed)); + Assert.True(decomposed.Normalize(NormalizationForm.FormC).Equals(composed)); + + string fi = "\uFB01"; + string decomposedFi = "fi"; + + Assert.True(fi.Normalize(NormalizationForm.FormC).Equals(fi)); + Assert.True(fi.Normalize(NormalizationForm.FormD).Equals(fi)); + Assert.True(fi.Normalize(NormalizationForm.FormKD).Equals(decomposedFi)); + Assert.True(fi.Normalize(NormalizationForm.FormKC).Equals(decomposedFi)); + + string fwith2dots = "\u1E9b\u0323"; + string decomposedFwith2dots = "\u017f\u0323\u0307"; + string decomposedCompatFwith2dots = "\u0073\u0323\u0307"; + string composedCompatFwith2dots = "\u1E69"; + + Assert.True(fwith2dots.Normalize(NormalizationForm.FormC).Equals(fwith2dots)); + Assert.True(fwith2dots.Normalize(NormalizationForm.FormD).Equals(decomposedFwith2dots)); + Assert.True(fwith2dots.Normalize(NormalizationForm.FormKC).Equals(composedCompatFwith2dots)); + Assert.True(fwith2dots.Normalize(NormalizationForm.FormKD).Equals(decomposedCompatFwith2dots)); + } + + [Fact] + public void ExceptionsTest() + { + string fi = "\uFB01"; + // "Expected to throw with invalid Normalization" + Assert.Throws(() => fi.IsNormalized((NormalizationForm)10)); + // "Expected to throw with invalid Normalization" + Assert.Throws(() => fi.Normalize((NormalizationForm)7)); + + string invalidCodepoint = "\uFFFE"; + string invalidSurrogate = "\uD800\uD800"; + + // "Expected to throw with invalid codepoint" + Assert.Throws(() => invalidCodepoint.Normalize()); + // "Expected to throw with invalid surrogate pair" + Assert.Throws(() => invalidSurrogate.Normalize()); + + // "Expected ArgumentNullException when passing null string" + Assert.Throws(() => StringNormalizationExtensions.Normalize(null)); + } + } +} diff --git a/src/System.Globalization.Extensions/tests/Normalization/NormalizationAll.cs b/src/System.Globalization.Extensions/tests/Normalization/NormalizationAll.cs new file mode 100644 index 000000000000..59271238f640 --- /dev/null +++ b/src/System.Globalization.Extensions/tests/Normalization/NormalizationAll.cs @@ -0,0 +1,18354 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using Xunit; +using System; +using System.Text; +using System.Globalization; + +namespace System.Globalization.Extensions.Tests +{ + public class NormalizationAll + { + [Fact] + public void NormalizeTest() + { + bool failed = false; + + for (int i = 0; i < s_normalizationData.Length; i++) + { + NormalizationForm form = NormalizationForm.FormC; + try + { + form = NormalizationForm.FormC; + // Form C + failed |= VerifyConformanceInvariant(NormalizationForm.FormC, s_normalizationData[i][0], s_normalizationData[i][1], s_normalizationData[i][2], s_normalizationData[i][3], s_normalizationData[i][4]); + + form = NormalizationForm.FormD; + // Form D + failed |= VerifyConformanceInvariant(NormalizationForm.FormD, s_normalizationData[i][0], s_normalizationData[i][1], s_normalizationData[i][2], s_normalizationData[i][3], s_normalizationData[i][4]); + + form = NormalizationForm.FormKC; + + // Form KC + failed |= VerifyConformanceInvariant(NormalizationForm.FormKC, s_normalizationData[i][0], s_normalizationData[i][1], s_normalizationData[i][2], s_normalizationData[i][3], s_normalizationData[i][4]); + + form = NormalizationForm.FormKD; + // Form KD + failed |= VerifyConformanceInvariant(NormalizationForm.FormKD, s_normalizationData[i][0], s_normalizationData[i][1], s_normalizationData[i][2], s_normalizationData[i][3], s_normalizationData[i][4]); + } + catch + { + Console.WriteLine("Wrong index: {0} length = {1} form = {2}", i, s_normalizationData[i].Length, form); + for (int j = 0; j < s_normalizationData[i].Length; j++ ) + { + Console.WriteLine("'{0}'", DumpStringAsCodepoints(s_normalizationData[i][j])); + } + throw; + } + } + + Assert.False(failed); + } + + // ------------------------------------------------------------------------ + // VerifyConformanceInvariant() + // + // Verifies the first normalization conformance invariant for the + // specified normalization form, where the rule as defined for all + // Unicode normalization forms is as follows: + // + // 1. The following invariants must be true for all conformant + // implementations: + // + // NFC + // c2 == NFC(c1) == NFC(c2) == NFC(c3) + // c4 == NFC(c4) == NFC(c5) + // + // NFD + // c3 == NFD(c1) == NFD(c2) == NFD(c3) + // c5 == NFD(c4) == NFD(c5) + // + // NFKC + // c4 == NFKC(c1) == NFKC(c2) == NFKC(c3) == NFKC(c4) == NFKC(c5) + // + // NFKD + // c5 == NFKD(c1) == NFKD(c2) == NFKD(c3) == NFKD(c4) == NFKD(c5) + // + // NOTE: The argument defines whether the results should + // be taken from NLS (via NLS_PLATFORM) or NLS+ (via NLS_PLUS_PLATFORM) + // ------------------------------------------------------------------------ + + private static bool VerifyConformanceInvariant( + NormalizationForm normForm, + string c1, + string c2, + string c3, + string c4, + string c5 + ) + { + bool failed = false; + // Initialize variables according to + string strNFc1 = c1.Normalize(normForm); + bool bNFc1 = c1.IsNormalized(normForm); + string strNFc2 = c2.Normalize(normForm); + bool bNFc2 = c2.IsNormalized(normForm); + string strNFc3 = c3.Normalize(normForm); + bool bNFc3 = c3.IsNormalized(normForm); + string strNFc4 = c4.Normalize(normForm); + bool bNFc4 = c4.IsNormalized(normForm); + string strNFc5 = c5.Normalize(normForm); + bool bNFc5 = c5.IsNormalized(normForm); + + // Verify conformance invariants particular to + switch (normForm) + { + case NormalizationForm.FormC: + // c2 == NFC(c1) == NFC(c2) == NFC(c3) + failed |= CheckFailue(normForm, c2, strNFc1); + failed |= CheckFailue(normForm, c2, strNFc2); + failed |= CheckFailue(normForm, c2, strNFc3); + + // c4 == NFC(c4) == NFC(c5) + failed |= CheckFailue(normForm, c4, strNFc4); + failed |= CheckFailue(normForm, c4, strNFc5); + + // c2 is normalized to Form C + if (!bNFc2) + { + Console.WriteLine("'{0}' is marked as not normalized with form {1}", c2, normForm); + failed = true; + } + + // c4 is normalized to Form C + if (!bNFc4) + { + Console.WriteLine("'{0}' is marked as not normalized with form {1}", c4, normForm); + failed = true; + } + break; + + case NormalizationForm.FormD: + // c3 == NFD(c1) == NFD(c2) == NFD(c3) + failed |= CheckFailue(normForm, c3, strNFc1); + failed |= CheckFailue(normForm, c3, strNFc2); + failed |= CheckFailue(normForm, c3, strNFc3); + + // c5 == NFD(c4) == NFD(c5) + failed |= CheckFailue(normForm, c5, strNFc4); + failed |= CheckFailue(normForm, c5, strNFc5); + + // c3 is normalized to Form D + if (!bNFc3) + { + Console.WriteLine("'{0}' is marked as not normalized with form {1}", c3, normForm); + failed = true; + } + // c5 is normalized to Form D + if (!bNFc5) + { + Console.WriteLine("'{0}' is marked as not normalized with form {1}", c5, normForm); + failed = true; + } + break; + + case NormalizationForm.FormKC: + // c4 == NFKC(c1) == NFKC(c2) == NFKC(c3) == NFKC(c4) + // == NFKC(c5) + failed |= CheckFailue(normForm, c4, strNFc1); + failed |= CheckFailue(normForm, c4, strNFc2); + failed |= CheckFailue(normForm, c4, strNFc3); + failed |= CheckFailue(normForm, c4, strNFc4); + failed |= CheckFailue(normForm, c4, strNFc5); + + // c4 is normalized to Form KC + if (!bNFc4) + { + Console.WriteLine("'{0}' is marked as not normalized with form {1}", c4, normForm); + failed = true; + } + break; + + case NormalizationForm.FormKD: + // c5 == NFKD(c1) == NFKD(c2) == NFKD(c3) == NFKD(c4) + // == NFKD(c5) + failed |= CheckFailue(normForm, c5, strNFc1); + failed |= CheckFailue(normForm, c5, strNFc2); + failed |= CheckFailue(normForm, c5, strNFc3); + failed |= CheckFailue(normForm, c5, strNFc4); + failed |= CheckFailue(normForm, c5, strNFc5); + + // c5 is normalized to Form KD + if (!bNFc5) + { + Console.WriteLine("'{0}' is marked as not normalized with form {1}", c5, normForm); + failed = true; + } + break; + } + return failed; + } + + private static bool CheckFailue(NormalizationForm normForm, string c, string cForm) + { + if (!c.Equals(cForm)) + { + Console.WriteLine("'{0}' is not matched with the normalized form '{1} with {2} normalization", DumpStringAsCodepoints(c), DumpStringAsCodepoints(cForm), cForm); + return true; + } + + return false; + } + + private static string DumpStringAsCodepoints(string s) + { + StringBuilder sb = new StringBuilder(); + for (int i=0; i + + + + Debug + AnyCPU + Library + System.Globalization.Extensions.Tests + System.Globalization.Extensions.Tests + {BC439554-4AB4-4C94-8E28-C00EDE4FD1C7} + + + + + + + + + + + + + + + + + + + + + + + + + + + {2b96aa10-84c0-4927-8611-8d2474b990e8} + System.Globalization.Extensions + + + + \ No newline at end of file diff --git a/src/System.Globalization.Extensions/tests/packages.config b/src/System.Globalization.Extensions/tests/packages.config new file mode 100644 index 000000000000..1c60b38169f2 --- /dev/null +++ b/src/System.Globalization.Extensions/tests/packages.config @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/System.IO.Pipes/tests/System.IO.Pipes.BasicTests.csproj b/src/System.IO.Pipes/tests/System.IO.Pipes.BasicTests.csproj index 9a0fbaad0b7d..77e1b2822baf 100644 --- a/src/System.IO.Pipes/tests/System.IO.Pipes.BasicTests.csproj +++ b/src/System.IO.Pipes/tests/System.IO.Pipes.BasicTests.csproj @@ -1,7 +1,6 @@  - 11.0 Debug diff --git a/src/System.Reflection.Metadata/src/System.Reflection.Metadata.csproj b/src/System.Reflection.Metadata/src/System.Reflection.Metadata.csproj index bdd3a7acd92a..473914823f13 100644 --- a/src/System.Reflection.Metadata/src/System.Reflection.Metadata.csproj +++ b/src/System.Reflection.Metadata/src/System.Reflection.Metadata.csproj @@ -178,7 +178,7 @@ - ..\..\packages\System.Collections.Immutable.1.1.32-beta\lib\portable-net45+win8+wp8+wpa81\System.Collections.Immutable.dll + $(PackagesDir)\System.Collections.Immutable.1.1.32-beta\lib\portable-net45+win8+wp8+wpa81\System.Collections.Immutable.dll