Ho un metodo che accetta un argomento StringComparison e richiede un test unitario per dimostrare che sta eseguendo il giusto tipo di confronto.C#: Test unitario per differenziare CurrentCulture da InvariantCulture
Questo è fondamentalmente quello che ho finora. Distingue Ordinal dal resto confrontando "oe" e "œ" (vedi System.String). Tuttavia, non ho trovato un modo per differenziare CurrentCulture da 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;
}
}
}
}
ho pensato di utilizzare il problema turco confrontando "i" e "I", ma funziona solo per i confronti case-insensitive.
Mi sono guardato intorno e non sono riuscito a trovare un caso in cui InvariantCulture si differenzia da altre culture in un test di uguaglianza delle stringhe (solo ordinamento e parsing/serializzazione). Ad esempio, a seconda della cultura, "ô" e "o" si ordinano in modo diverso, ma tutte le culture restituiscono lo stesso risultato nei test di uguaglianza.
Esiste un test di uguaglianza per differenziare InvariantCulture da qualsiasi altra cultura?
MODIFICA: Il tedesco "ß" e "ss" danno lo stesso risultato per tutte le culture in modo che non funzionino.
MODIFICA: In realtà, tutto ciò che è necessario è due stringhe considerate uguali in una cultura e non uguali in un'altra.
e ed o tipo diverso a seconda della cultura, ma non sembrano influenzare i test di uguaglianza, che è quello che mi serve. Ho aggiornato la domanda per cercare di essere più chiara. Grazie – drifter
@drifter: hai esaminato l'esempio nella documentazione di String.IndexOf: http://msdn.microsoft.com/en-us/library/ms224425.aspx. Confronta le stringhe con \ u00c5 e \ u0061 \ u30a. Forse ti darà quello che stai cercando. – Joe
Questo esempio ha gli stessi risultati per CurrentCulture e InvariantCulture. Ho provato varianti di esso in altre culture, ma senza fortuna. – drifter