public void NonContiguousProxyTest() { // now it is like HRM var manager = new DynamicResourceManager("KGySoft.CoreLibraries.Resources.TestCompiledResource", GetType().Assembly, resXBaseName) { AutoSave = AutoSaveOptions.None, AutoAppend = AutoAppendOptions.None }; string key = "unknown"; Dictionary <string, ResourceSet> resourceSets; string proxyName = "ProxyResourceSet"; if (huRunic != null) { // preparing the chain: inv (loaded), hu (proxy), hu-Runic (created), hu-Runic-HU (proxy), hu-Runic-HU-Lowland (created) manager.GetExpandoResourceSet(huRunic, ResourceSetRetrieval.CreateIfNotExists); manager.GetExpandoResourceSet(huRunicHULowland, ResourceSetRetrieval.CreateIfNotExists); Assert.AreSame(manager.GetResourceSet(hu, true, true), manager.GetResourceSet(inv, false, false)); // now hu is proxy, inv is loaded Assert.AreSame(manager.GetResourceSet(huRunicHU, true, true), manager.GetResourceSet(huRunic, true, true)); // now huRunicHU is proxy, huRunic is already loaded resourceSets = (Dictionary <string, ResourceSet>)Reflector.GetField(manager, "resourceSets"); Assert.AreEqual(5, resourceSets.Count); Assert.AreEqual(2, resourceSets.Count(kv => kv.Value.GetType().Name == proxyName)); // through HRM: does not change anything Assert.IsNull(manager.GetString(key, huRunicHULowland)); Assert.AreEqual(5, resourceSets.Count); Assert.AreEqual(2, resourceSets.Count(kv => kv.Value.GetType().Name == proxyName)); // through DRM but without merging (adding to invariant only): does not change anything, proxies remain intact manager.AutoAppend = AutoAppendOptions.AddUnknownToInvariantCulture; Assert.IsTrue(manager.GetString(key, huRunicHULowland).StartsWith(LanguageSettings.UnknownResourcePrefix, StringComparison.Ordinal)); Assert.AreEqual(5, resourceSets.Count); Assert.AreEqual(2, resourceSets.Count(kv => kv.Value.GetType().Name == proxyName)); // huRunic is about to be merged, this already existed so proxies remain intact manager.AutoAppend = AutoAppendOptions.AppendFirstNeutralCulture; Assert.IsTrue(manager.GetString(key, huRunicHULowland).StartsWith(LanguageSettings.UntranslatedResourcePrefix + LanguageSettings.UnknownResourcePrefix, StringComparison.Ordinal)); Assert.AreEqual(5, resourceSets.Count); Assert.AreEqual(2, resourceSets.Count(kv => kv.Value.GetType().Name == proxyName)); // specifics are merged so result comes from huRunic, hu proxy remains, huRunicHU is replaced manager.AutoAppend = AutoAppendOptions.AppendSpecificCultures; Assert.IsTrue(manager.GetString(key, huRunicHULowland).StartsWith(LanguageSettings.UntranslatedResourcePrefix + LanguageSettings.UnknownResourcePrefix, StringComparison.Ordinal)); Assert.AreEqual(5, resourceSets.Count); Assert.AreEqual(1, resourceSets.Count(kv => kv.Value.GetType().Name == proxyName)); // result is coming from the completely merged huRunicHULowland so nothing changes in the base manager.AutoAppend = AutoAppendOptions.AppendNeutralCultures; Assert.IsTrue(manager.GetString(key, huRunicHULowland).StartsWith(LanguageSettings.UntranslatedResourcePrefix + LanguageSettings.UnknownResourcePrefix, StringComparison.Ordinal)); Assert.AreEqual(5, resourceSets.Count); Assert.AreEqual(1, resourceSets.Count(kv => kv.Value.GetType().Name == proxyName)); // even if the rs of the proxied hu is retrieved manager.GetResourceSet(hu, true, true); Assert.AreEqual(5, resourceSets.Count); Assert.AreEqual(1, resourceSets.Count(kv => kv.Value.GetType().Name == proxyName)); // result is coming from the cached merged huRunicHULowland so nothing changes in the base even if AppendOnLoad is requested manager.AutoAppend |= AutoAppendOptions.AppendOnLoad; Assert.IsTrue(manager.GetString(key, huRunicHULowland).StartsWith(LanguageSettings.UntranslatedResourcePrefix + LanguageSettings.UnknownResourcePrefix, StringComparison.Ordinal)); Assert.AreEqual(5, resourceSets.Count); Assert.AreEqual(1, resourceSets.Count(kv => kv.Value.GetType().Name == proxyName)); // even if the rs of the proxied hu is retrieved with Load only (EnsureMerged is executed but no create occurs so the proxied inv will be returned) var rsinv = manager.GetResourceSet(hu, true, true); Assert.AreEqual(5, resourceSets.Count); Assert.AreEqual(1, resourceSets.Count(kv => kv.Value.GetType().Name == proxyName)); Assert.AreSame(manager.GetResourceSet(inv, false, false), rsinv); // but for Create it is loaded and immediately merged, too var rshu = manager.GetExpandoResourceSet(hu, ResourceSetRetrieval.CreateIfNotExists, true); Assert.AreEqual(5, resourceSets.Count); Assert.AreEqual(0, resourceSets.Count(kv => kv.Value.GetType().Name == proxyName)); Assert.AreNotSame(rsinv, rshu); Assert.IsTrue(rshu.ContainsResource(key)); return; } // ---basic tests: no admin rights or not .NET Framework--- // preparing the chain: inv (loaded), hu (proxy), hu-HU (created) manager.GetExpandoResourceSet(huHU, ResourceSetRetrieval.CreateIfNotExists); Assert.AreSame(manager.GetResourceSet(hu, true, true), manager.GetResourceSet(inv, false, false)); // now hu is proxy, inv is loaded resourceSets = (Dictionary <string, ResourceSet>)Reflector.GetField(manager, "resourceSets"); Assert.AreEqual(3, resourceSets.Count); Assert.AreEqual(1, resourceSets.Count(kv => kv.Value.GetType().Name == proxyName)); // through HRM: does not change anything Assert.IsNull(manager.GetString(key, huHU)); Assert.AreEqual(3, resourceSets.Count); Assert.AreEqual(1, resourceSets.Count(kv => kv.Value.GetType().Name == proxyName)); // through DRM but without merging (adding to invariant only): does not change anything, the proxy remains intact manager.AutoAppend = AutoAppendOptions.AddUnknownToInvariantCulture; Assert.IsTrue(manager.GetString(key, huHU).StartsWith(LanguageSettings.UnknownResourcePrefix, StringComparison.Ordinal)); Assert.AreEqual(3, resourceSets.Count); Assert.AreEqual(1, resourceSets.Count(kv => kv.Value.GetType().Name == proxyName)); // specific is merged again, so nothing changes manager.RemoveObject(key, huHU); manager.AutoAppend = AutoAppendOptions.AppendSpecificCultures; Assert.IsTrue(manager.GetString(key, huHU).StartsWith(LanguageSettings.UntranslatedResourcePrefix + LanguageSettings.UnknownResourcePrefix, StringComparison.Ordinal)); Assert.AreEqual(3, resourceSets.Count); Assert.AreEqual(1, resourceSets.Count(kv => kv.Value.GetType().Name == proxyName)); // neutral is merged so it will be replaced now manager.RemoveObject(key, huHU); manager.AutoAppend = AutoAppendOptions.AppendNeutralCultures; Assert.IsTrue(manager.GetString(key, hu).StartsWith(LanguageSettings.UntranslatedResourcePrefix + LanguageSettings.UnknownResourcePrefix, StringComparison.Ordinal)); Assert.AreEqual(3, resourceSets.Count); Assert.AreEqual(0, resourceSets.Count(kv => kv.Value.GetType().Name == proxyName)); #if NETFRAMEWORK Assert.Inconclusive("To run the tests in this class with full functionality, administrator rights are required"); #endif }
public void AutoSaveTest() { LanguageSettings.DynamicResourceManagersAutoAppend = AutoAppendOptions.None; string key = "testKey"; string value = "test value"; var manager = new DynamicResourceManager("KGySoft.CoreLibraries.Resources.TestCompiledResource", GetType().Assembly, resXBaseName) { AutoAppend = AutoAppendOptions.None, }; CultureInfo testCulture = hu; void Cleanup() { //foreach (CultureInfo culture in cultures) File.Delete(Path.Combine(Path.Combine(Files.GetExecutingPath(), manager.ResXResourcesDir), $"{resXBaseName}.{testCulture.Name}.resx")); } try { // SourceChange, individual Cleanup(); manager.Source = ResourceManagerSources.CompiledAndResX; manager.UseLanguageSettings = false; manager.AutoSave = AutoSaveOptions.SourceChange; manager.SetObject(key, value, testCulture); manager.Source = ResourceManagerSources.ResXOnly; // save occurs manager.ReleaseAllResources(); Assert.IsNull(manager.GetResourceSet(testCulture, false, false)); // not loaded after release Assert.IsNotNull(manager.GetResourceSet(testCulture, true, false)); // but can be loaded from saved // SourceChange, central Cleanup(); manager.ReleaseAllResources(); LanguageSettings.DynamicResourceManagersSource = ResourceManagerSources.CompiledAndResX; manager.UseLanguageSettings = true; LanguageSettings.DynamicResourceManagersAutoSave = AutoSaveOptions.SourceChange; manager.SetObject(key, value, testCulture); LanguageSettings.DynamicResourceManagersSource = ResourceManagerSources.ResXOnly; // save occurs manager.ReleaseAllResources(); Assert.IsNull(manager.GetResourceSet(testCulture, false, false)); // not loaded after release Assert.IsNotNull(manager.GetResourceSet(testCulture, true, false)); // but can be loaded from saved // LanguageChange, individual Cleanup(); manager.ReleaseAllResources(); manager.UseLanguageSettings = false; LanguageSettings.DisplayLanguage = testCulture; manager.AutoSave = AutoSaveOptions.LanguageChange; manager.SetObject(key, value); // null: uses DisplayLanguage, which is the same as CurrentUICulture LanguageSettings.DisplayLanguage = inv; // save occurs manager.ReleaseAllResources(); Assert.IsNull(manager.GetResourceSet(testCulture, false, false)); // not loaded after release Assert.IsNotNull(manager.GetResourceSet(testCulture, true, false)); // but can be loaded from saved // LanguageChange, central Cleanup(); manager.ReleaseAllResources(); manager.UseLanguageSettings = true; LanguageSettings.DisplayLanguage = testCulture; LanguageSettings.DynamicResourceManagersAutoSave = AutoSaveOptions.LanguageChange; manager.SetObject(key, value); // null: uses DisplayLanguage, which is the same as CurrentUICulture LanguageSettings.DisplayLanguage = inv; // save occurs manager.ReleaseAllResources(); Assert.IsNull(manager.GetResourceSet(testCulture, false, false)); // not loaded after release Assert.IsNotNull(manager.GetResourceSet(testCulture, true, false)); // but can be loaded from saved #if !(NETCOREAPP2_0 || NETCOREAPP3_0) // DomainUnload, individual Cleanup(); manager.ReleaseAllResources(); Evidence evidence = new Evidence(AppDomain.CurrentDomain.Evidence); AppDomain sandboxDomain = AppDomain.CreateDomain("SandboxDomain", evidence, AppDomain.CurrentDomain.BaseDirectory, null, false); AssemblyName selfName = Assembly.GetExecutingAssembly().GetName(); sandboxDomain.Load(selfName); RemoteDrmConsumer remote = (RemoteDrmConsumer)sandboxDomain.CreateInstanceAndUnwrap(selfName.FullName, typeof(RemoteDrmConsumer).FullName); remote.UseDrmRemotely(false, testCulture); AppDomain.Unload(sandboxDomain); Assert.IsNotNull(manager.GetResourceSet(testCulture, true, false)); // can be loaded that has been saved in another domain // DomainUnload, central Cleanup(); manager.ReleaseAllResources(); evidence = new Evidence(AppDomain.CurrentDomain.Evidence); sandboxDomain = AppDomain.CreateDomain("SandboxDomain", evidence, AppDomain.CurrentDomain.BaseDirectory, null, false); selfName = Assembly.GetExecutingAssembly().GetName(); sandboxDomain.Load(selfName); remote = (RemoteDrmConsumer)sandboxDomain.CreateInstanceAndUnwrap(selfName.FullName, typeof(RemoteDrmConsumer).FullName); remote.UseDrmRemotely(true, testCulture); AppDomain.Unload(sandboxDomain); Assert.IsNotNull(manager.GetResourceSet(testCulture, true, false)); // can be loaded that has been saved in another domain #endif // Dispose, individual Cleanup(); manager.UseLanguageSettings = false; manager.Source = ResourceManagerSources.CompiledAndResX; manager.UseLanguageSettings = false; manager.AutoSave = AutoSaveOptions.Dispose; manager.SetObject(key, value, testCulture); manager.Dispose(); // save occurs Throws <ObjectDisposedException>(() => manager.GetResourceSet(testCulture, false, false)); Assert.IsTrue(File.Exists(Path.Combine(Path.Combine(Files.GetExecutingPath(), manager.ResXResourcesDir), $"TestResourceResX.{testCulture.Name}.resx"))); // Dispose, central LanguageSettings.DynamicResourceManagersSource = ResourceManagerSources.CompiledAndResX; LanguageSettings.DynamicResourceManagersAutoSave = AutoSaveOptions.Dispose; manager = new DynamicResourceManager("KGySoft.CoreLibraries.Resources.TestCompiledResource", GetType().Assembly, resXBaseName) { UseLanguageSettings = true }; Cleanup(); manager.SetObject(key, value, testCulture); LanguageSettings.DisplayLanguage = inv; // save occurs manager.Dispose(); // save occurs Throws <ObjectDisposedException>(() => manager.GetResourceSet(testCulture, false, false)); Assert.IsTrue(File.Exists(Path.Combine(Path.Combine(Files.GetExecutingPath(), manager.ResXResourcesDir), $"TestResourceResX.{testCulture.Name}.resx"))); // final cleanup Cleanup(); } finally { Cleanup(); } }
public void GetUnknownTest() { // This is a non-existing resource so MissingManifestResourceException should be thrown by default var manager = new DynamicResourceManager(GetType()) { AutoSave = AutoSaveOptions.None, AutoAppend = AutoAppendOptions.AppendNeutralCultures, ThrowException = true }; string key = "unknown"; // Exception is thrown through base HRM Throws <MissingManifestResourceException>(() => manager.GetString(key, inv)); // Due to possible append options, exception is thrown through derived DRM // For the neutral en culture a resource set is created during the traversal Throws <MissingManifestResourceException>(() => manager.GetString(key, enUS)); Assert.IsNull(manager.GetResourceSet(enUS, false, false)); Assert.IsNotNull(manager.GetResourceSet(en, false, false)); // Exception is not thrown any more. Instead, a new resource is automatically added manager.AutoAppend = AutoAppendOptions.AddUnknownToInvariantCulture; manager.ReleaseAllResources(); Assert.IsTrue(manager.GetString(key, inv).StartsWith(LanguageSettings.UnknownResourcePrefix, StringComparison.Ordinal)); Assert.IsTrue(manager.GetString(key, en).StartsWith(LanguageSettings.UnknownResourcePrefix, StringComparison.Ordinal)); Assert.IsTrue(manager.GetString(key, enUS).StartsWith(LanguageSettings.UnknownResourcePrefix, StringComparison.Ordinal)); manager.ReleaseAllResources(); Assert.IsTrue(manager.GetString(key, enUS).StartsWith(LanguageSettings.UnknownResourcePrefix, StringComparison.Ordinal)); // If requested as derived with append, the new resource is merged into derived resources manager.AutoAppend = AutoAppendOptions.AddUnknownToInvariantCulture | AutoAppendOptions.AppendNeutralCultures; manager.ReleaseAllResources(); Assert.IsTrue(manager.GetString(key, enUS).StartsWith(LanguageSettings.UntranslatedResourcePrefix + LanguageSettings.UnknownResourcePrefix, StringComparison.Ordinal)); IExpandoResourceSet rsEn = manager.GetExpandoResourceSet(en, ResourceSetRetrieval.GetIfAlreadyLoaded, false); Assert.IsTrue(rsEn.ContainsResource(key)); Assert.AreSame(rsEn, manager.GetResourceSet(enUS, false, false), "en should be proxied for en-US"); manager.AutoAppend |= AutoAppendOptions.AppendSpecificCultures; Assert.IsTrue(manager.GetString(key, enUS).StartsWith(LanguageSettings.UntranslatedResourcePrefix + LanguageSettings.UnknownResourcePrefix, StringComparison.Ordinal)); IExpandoResourceSet rsEnUs = manager.GetResourceSet(enUS, false, false) as IExpandoResourceSet; Assert.IsNotNull(rsEnUs); Assert.AreNotSame(rsEn, rsEnUs, "Due to merge a new resource set should have been created for en-US"); Assert.IsTrue(rsEnUs.ContainsResource(key)); // As object: null is added to invariant manager.ReleaseAllResources(); Assert.IsNull(manager.GetObject(key, inv)); manager.GetExpandoResourceSet(inv, ResourceSetRetrieval.GetIfAlreadyLoaded, false).ContainsResource(key); // but null is not merged even if the child resource sets are created Assert.IsNull(manager.GetObject(key, enUS)); Assert.IsNotNull(manager.GetResourceSet(enUS, false, false)); Assert.IsFalse(manager.GetExpandoResourceSet(enUS, ResourceSetRetrieval.GetIfAlreadyLoaded, false).ContainsResource(key)); Assert.IsNotNull(manager.GetResourceSet(en, false, false)); Assert.IsFalse(manager.GetExpandoResourceSet(en, ResourceSetRetrieval.GetIfAlreadyLoaded, false).ContainsResource(key)); Assert.IsNotNull(manager.GetResourceSet(inv, false, false)); Assert.IsTrue(manager.GetExpandoResourceSet(inv, ResourceSetRetrieval.GetIfAlreadyLoaded, false).ContainsResource(key)); // a null object does not turn to string Assert.IsNull(manager.GetString(key, enUS)); // changing back to compiled only sources disables appending invariant so exception will be thrown again manager.Source = ResourceManagerSources.CompiledOnly; Throws <MissingManifestResourceException>(() => manager.GetString(key, enUS)); }