test(01-05): add failing tests for TranslationSource singleton
- Instance singleton test - EN string lookup test - FR culture fallback test - Missing key returns bracketed key - PropertyChanged fires with empty string on culture switch - Same culture does not fire PropertyChanged
This commit is contained in:
@@ -1,7 +1,83 @@
|
|||||||
|
using SharepointToolbox.Localization;
|
||||||
|
using System.ComponentModel;
|
||||||
|
using System.Globalization;
|
||||||
|
|
||||||
namespace SharepointToolbox.Tests.Localization;
|
namespace SharepointToolbox.Tests.Localization;
|
||||||
|
|
||||||
public class TranslationSourceTests
|
[Trait("Category", "Unit")]
|
||||||
|
public class TranslationSourceTests : IDisposable
|
||||||
{
|
{
|
||||||
[Fact(Skip = "Wave 0 stub — implemented in plan 01-05")]
|
private readonly CultureInfo _originalCulture;
|
||||||
public void ChangeLanguage_Updates_Bound_Strings() { }
|
|
||||||
|
public TranslationSourceTests()
|
||||||
|
{
|
||||||
|
_originalCulture = TranslationSource.Instance.CurrentCulture;
|
||||||
|
// Reset to EN before each test
|
||||||
|
TranslationSource.Instance.CurrentCulture = new CultureInfo("en-US");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Dispose()
|
||||||
|
{
|
||||||
|
// Restore original culture after each test to prevent test pollution
|
||||||
|
TranslationSource.Instance.CurrentCulture = _originalCulture;
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void Instance_IsSameInstance_OnMultipleAccesses()
|
||||||
|
{
|
||||||
|
var instance1 = TranslationSource.Instance;
|
||||||
|
var instance2 = TranslationSource.Instance;
|
||||||
|
Assert.Same(instance1, instance2);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void Indexer_ReturnsEnString_ForEnCulture()
|
||||||
|
{
|
||||||
|
TranslationSource.Instance.CurrentCulture = new CultureInfo("en-US");
|
||||||
|
var result = TranslationSource.Instance["app.title"];
|
||||||
|
Assert.Equal("SharePoint Toolbox", result);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void Indexer_ReturnsFrOrFallback_AfterSwitchToFrFR()
|
||||||
|
{
|
||||||
|
TranslationSource.Instance.CurrentCulture = new CultureInfo("fr-FR");
|
||||||
|
var result = TranslationSource.Instance["app.title"];
|
||||||
|
// FR stub uses EN text — at minimum should not be null or empty
|
||||||
|
Assert.NotNull(result);
|
||||||
|
Assert.NotEmpty(result);
|
||||||
|
Assert.DoesNotContain("[", result); // Should not be missing-key placeholder
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void Indexer_ReturnsBracketedKey_ForMissingKey()
|
||||||
|
{
|
||||||
|
var result = TranslationSource.Instance["key.does.not.exist"];
|
||||||
|
Assert.Equal("[key.does.not.exist]", result);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void ChangingCurrentCulture_FiresPropertyChanged_WithEmptyPropertyName()
|
||||||
|
{
|
||||||
|
string? capturedPropertyName = null;
|
||||||
|
TranslationSource.Instance.PropertyChanged += (sender, args) =>
|
||||||
|
capturedPropertyName = args.PropertyName;
|
||||||
|
|
||||||
|
TranslationSource.Instance.CurrentCulture = new CultureInfo("fr-FR");
|
||||||
|
|
||||||
|
Assert.Equal(string.Empty, capturedPropertyName);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void SettingSameCulture_DoesNotFirePropertyChanged()
|
||||||
|
{
|
||||||
|
TranslationSource.Instance.CurrentCulture = new CultureInfo("en-US");
|
||||||
|
int fireCount = 0;
|
||||||
|
TranslationSource.Instance.PropertyChanged += (sender, args) => fireCount++;
|
||||||
|
|
||||||
|
// Set the exact same culture
|
||||||
|
TranslationSource.Instance.CurrentCulture = new CultureInfo("en-US");
|
||||||
|
|
||||||
|
Assert.Equal(0, fireCount);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user