I've found that the test results are different on my machine and the build server. I've managed to find the single line that differs. This is a string comparison. The two strings differ in case of the first character.
The test below passes on my local machine and fails on the build machine.
[TestClass]
public class Tests
{
[TestMethod]
public void Strings()
{
Assert.IsFalse(0 == string.Compare("Term’s", "term’s", false, CultureInfo.InvariantCulture));
}
}
I've also tried to change it to string.Equals
:
string.Equals("Term’s", "term’s", StringComparison.InvariantCulture);
string.Equals
returns true on the build server and returns false on my local machine.
Ordinal comparison gives same results on both machines:
string.Compare("Term’s", "term’s", StringComparison.Ordinal))
As I understand, InvariantCulture is supposed to return the same results everywhere. How can a case-sensitive culture-invariant string comparison depend on a machine? What settings should I check to identify the problem?
Update: platform and string
The string is important. These results can be observed for strings with "exotic" punctuation like RIGHT SINGLE QUOTATION MARK or RIGHT DOUBLE QUOTATION MARK
It seems the behavior reproduces on Windows 8 machines. You can see it even on https://dotnetfiddle.net/ if you type the following:
using System;
using System.Globalization;
public class Program
{
public static void Main()
{
Console.WriteLine(0 == string.Compare("Terms", "terms", false, CultureInfo.InvariantCulture));
Console.WriteLine(0 == string.Compare("Term’s", "term’s", false, CultureInfo.InvariantCulture));
Console.WriteLine(0 == string.Compare("Term“s", "term“s", false, CultureInfo.InvariantCulture));
Console.WriteLine(0 == string.Compare("Term”s", "term”s", false, CultureInfo.InvariantCulture));
//outputs
//False
//True
//True
//True
}
}
Environment.OSVersion
(server's): Microsoft Windows NT 6.2.9200.0
Environment.Is64BitOperatingSystem
(server's): True
Environment.Version
(server's) 4.0.30319.18449
Environment.OSVersion
(local): Microsoft Windows NT 6.1.7601 Service Pack 1
Environment.Is64BitOperatingSystem
(local): True
Environment.Version
(local): 4.0.30319.18444
Update: related MSDN forums link
It may be a known bug in Windows 8, which is fixed in Windows 8.1.
InvariantCulture
is supposed to be case-sensitive, so it sounds like a platform bug. – ConeyEnvironment.OSVersion
andEnvironment.Version
. Unfortunately, I have no other access to the server that checking in the code and observing the test results. I will raise a ticket to get the hardware. What exactly should I ask about hardware? – RodrigoStringComparer.InvariantCulture.Compare("Term’s", "term’s")
? – Grogram