Tengo un método que toma un argumento StringComparison, y realmente necesita una prueba unitaria para demostrar que está realizando el tipo de comparación correcto.C#: Prueba unitaria para diferenciar CurrentCulture de InvariantCulture
Esto es básicamente lo que tengo hasta ahora. Diferencia a Ordinal del resto al comparar "oe" y "œ" (ver System.String). Sin embargo, no he encontrado una manera de diferenciar CurrentCulture de InvariantCulture.
using System;
using NUnit.Framework;
using System.Threading;
using System.Globalization;
namespace NUnitTests
{
[TestFixture]
public class IndexOfTests
{
[Test]
public void IndexOf_uses_specified_comparison_type()
{
StringComparison comparisonTypePerformed;
result = TestComparisonType(StringComparison.CurrentCulture);
Assert.AreEqual(StringComparison.CurrentCulture, comparisonTypePerformed);
result = TestComparisonType(StringComparison.InvariantCulture);
Assert.AreEqual(StringComparison.CurrentCulture, comparisonTypePerformed);
result = TestComparisonType(StringComparison.Ordinal);
Assert.AreEqual(StringComparison.CurrentCulture, comparisonTypePerformed);
}
bool TestComparisonType(StringComparison comparisonType)
{
int result;
// Ensure the current culture is consistent for test
var prevCulture = Thread.CurrentThread.CurrentCulture;
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US", false);
try
{
result = IndexOf("oe", "œ", comparisonType);
if (result == 0)
{
// The comparison type performed was either CurrentCulture,
// InvariantCulture, or one of the case-insensitive variants.
// TODO: Add test to differentiate between CurrentCulture and InvariantCulture
throw new NotImplementedException();
result = IndexOf("???????", "???????", StringComparison.CurrentCulture);
//...
}
else // result == -1
{
// The comparison type performed was either Ordinal or OrdinalIgnoreCase
result = IndexOf("a", "A", StringComparison.CurrentCulture);
if (result)
Console.WriteLine("Comparison type was OrdinalIgnoreCase");
else
Console.WriteLine("Comparison type was Ordinal");
}
}
finally
{
Thread.CurrentThread.CurrentCulture = prevCulture;
}
}
}
}
Consideré utilizando el problema de Turquía mediante la comparación de "i" e "I", pero sólo funciona para las comparaciones entre mayúsculas y minúsculas.
He mirado alrededor y no he podido encontrar un caso donde InvariantCulture difiera de otras culturas en una prueba de igualdad de cadenas (solo orden y análisis/serialización). Por ejemplo, dependiendo de la cultura, "ô" y "o" se ordenarán de forma diferente, pero todas las culturas devuelven el mismo resultado en las pruebas de igualdad.
¿Existe una prueba de igualdad para diferenciar a InvariantCulture de cualquier otra cultura?
EDIT: El alemán "ß" y "ss" dan el mismo resultado para todas las culturas, por lo que no funcionarán.
EDITAR: Realmente, todo lo que se necesita es dos cadenas consideradas iguales en una cultura y desiguales en otra.
é y ô ordenan de forma diferente dependiendo de la cultura, pero no parecen afectar las pruebas de igualdad, que es lo que necesito. Actualicé la pregunta para intentar ser más claro. Gracias – drifter
@drifter - ¿Has mirado el ejemplo en la documentación de String.IndexOf: http://msdn.microsoft.com/en-us/library/ms224425.aspx. Compara cadenas con \ u00c5 y \ u0061 \ u030a. Tal vez le dará lo que está buscando. – Joe
Ese ejemplo tiene los mismos resultados para CurrentCulture e InvariantCulture. Probé variaciones en otras culturas, pero no tuve suerte. – drifter