From d1be7348aed158d64a466430e4a065e5e01c6621 Mon Sep 17 00:00:00 2001 From: Hasso Date: Thu, 16 May 2019 09:59:05 -0500 Subject: [PATCH] LT-19718: Replace Default WS in New Project Wizard - When selecting a new Default WS, relpace the existing one - Test that English is an Analysis WS in every new project, even if the user has removed it. Change-Id: I82c732cc40d9cd3d259002275b7eabcc55eff981 --- .../FwNewLangProjectModelTests.cs | 193 +++++++++++++++--- Src/FwCoreDlgs/FwNewLangProjectModel.cs | 48 ++--- 2 files changed, 180 insertions(+), 61 deletions(-) diff --git a/Src/FwCoreDlgs/FwCoreDlgsTests/FwNewLangProjectModelTests.cs b/Src/FwCoreDlgs/FwCoreDlgsTests/FwNewLangProjectModelTests.cs index 50137dfa89..b655885bd7 100644 --- a/Src/FwCoreDlgs/FwCoreDlgsTests/FwNewLangProjectModelTests.cs +++ b/Src/FwCoreDlgs/FwCoreDlgsTests/FwNewLangProjectModelTests.cs @@ -3,6 +3,7 @@ // (http://www.gnu.org/licenses/lgpl-2.1.html) using System; +using System.Collections; using System.Diagnostics; using System.IO; using System.Linq; @@ -10,29 +11,37 @@ using SIL.FieldWorks.Common.FwUtils; using SIL.LCModel; using SIL.LCModel.Core.WritingSystems; -using SIL.LCModel.Utils; using SIL.WritingSystems; +// ReSharper disable StringIndexOfIsCultureSpecific.1 +// ReSharper disable InconsistentNaming + namespace SIL.FieldWorks.FwCoreDlgs -{/// ---------------------------------------------------------------------------------------- - /// - /// Summary description for TestFwNewLangProject. - /// - /// ---------------------------------------------------------------------------------------- +{ + /// [TestFixture] public class FwNewLangProjectModelTests { + private const string DbName = "Maileingwidj2025"; + + /// + [SetUp] + public void TestSetup() + { + // A number of tests rely on this project not existing (most because duplicate names are not valid). + if (DbExists(DbName)) + { + DestroyDb(DbName, true); + } + } + /// /// Make sure a new DB gets created /// [Test] public void FwNewLangProjectModel_VerifyCreateNewLangProject() { - const string dbName = "Maileingwij2025"; - LcmCache cache = null; - if (DbExists(dbName)) - DestroyDb(dbName, true); var testProject = new FwNewLangProjectModel(true) { @@ -43,28 +52,32 @@ public void FwNewLangProjectModel_VerifyCreateNewLangProject() }; try { - testProject.ProjectName = dbName; + testProject.ProjectName = DbName; testProject.Next(); testProject.SetDefaultWs(new LanguageInfo { LanguageTag = "fr" }); testProject.Next(); + testProject.SetDefaultWs(new LanguageInfo { LanguageTag = "de" }); using (var threadHelper = new ThreadHelper()) { testProject.CreateNewLangProj(new DummyProgressDlg(), threadHelper); } - Assert.IsTrue(DbExists(dbName)); + Assert.IsTrue(DbExists(DbName)); // despite of the name is DummyProgressDlg no real dialog (doesn't derive from Control), so // we don't need a 'using' cache = LcmCache.CreateCacheFromExistingData( - new TestProjectId(BackendProviderType.kXMLWithMemoryOnlyWsMgr, DbFilename(dbName)), "en", new DummyLcmUI(), + new TestProjectId(BackendProviderType.kXMLWithMemoryOnlyWsMgr, DbFilename(DbName)), "en", new DummyLcmUI(), FwDirectoryFinder.LcmDirectories, new LcmSettings(), new DummyProgressDlg()); CheckInitialSetOfPartsOfSpeech(cache); - Assert.AreEqual(1, cache.ServiceLocator.WritingSystems.AnalysisWritingSystems.Count); - Assert.AreEqual("English", cache.ServiceLocator.WritingSystems.AnalysisWritingSystems.First().LanguageName); - Assert.AreEqual(1, cache.ServiceLocator.WritingSystems.CurrentAnalysisWritingSystems.Count); - Assert.AreEqual("English", cache.ServiceLocator.WritingSystems.DefaultAnalysisWritingSystem.LanguageName); + Assert.AreEqual(2, cache.ServiceLocator.WritingSystems.AnalysisWritingSystems.Count); + Assert.AreEqual("German", cache.ServiceLocator.WritingSystems.AnalysisWritingSystems.First().LanguageName); + Assert.AreEqual("English", cache.ServiceLocator.WritingSystems.AnalysisWritingSystems.Last().LanguageName); + Assert.AreEqual(2, cache.ServiceLocator.WritingSystems.CurrentAnalysisWritingSystems.Count); + Assert.AreEqual("German", cache.ServiceLocator.WritingSystems.DefaultAnalysisWritingSystem.LanguageName); + Assert.AreEqual("English", cache.ServiceLocator.WritingSystems.CurrentAnalysisWritingSystems.Last().LanguageName, + "English should be selected as an analysis writing system even if the user tried to remove it"); Assert.AreEqual(1, cache.ServiceLocator.WritingSystems.VernacularWritingSystems.Count); Assert.AreEqual("French", cache.ServiceLocator.WritingSystems.VernacularWritingSystems.First().LanguageName); Assert.AreEqual(1, cache.ServiceLocator.WritingSystems.CurrentVernacularWritingSystems.Count); @@ -75,7 +88,7 @@ public void FwNewLangProjectModel_VerifyCreateNewLangProject() // Blow away the database to clean things up if (cache != null) cache.Dispose(); - DestroyDb(dbName, false); + DestroyDb(DbName, false); } } @@ -108,14 +121,12 @@ public void FwNewLangProjectModel_ProjectNameIsValid(string projName, bool expec [Test] public void FwNewLangProjectModel_ProjectNameIsUnique() { - const string extantDbName = "Maileingwidj2025"; - try { - CreateDb(extantDbName); + CreateDb(DbName); string errorMessage; Assert.True(FwNewLangProjectModel.CheckForUniqueProjectName("something else"), "unique name should be unique"); - Assert.False(FwNewLangProjectModel.CheckForUniqueProjectName(extantDbName), "duplicate name should not be unique"); + Assert.False(FwNewLangProjectModel.CheckForUniqueProjectName(DbName), "duplicate name should not be unique"); // Creating a new project is expensive (several seconds), so test this property that also checks uniqueness here: var testModel = new FwNewLangProjectModel @@ -124,13 +135,13 @@ public void FwNewLangProjectModel_ProjectNameIsUnique() ProjectName = "something new" }; Assert.True(testModel.IsProjectNameValid, "unique name should be valid"); - testModel.ProjectName = extantDbName; + testModel.ProjectName = DbName; Assert.False(testModel.IsProjectNameValid, "duplicate name should not be valid"); } finally { // Blow away the database to clean things up - DestroyDb(extantDbName, false); + DestroyDb(DbName, false); } } @@ -248,7 +259,7 @@ public void FwNewLangProjectModel_CanGoBack() var model = new FwNewLangProjectModel(); model.LoadProjectNameSetup = () => { }; model.LoadVernacularSetup = () => { }; - model.ProjectName = "a"; + model.ProjectName = DbName; Assert.False(model.CanGoBack()); model.Next(); Assert.True(model.CanGoBack()); @@ -266,7 +277,7 @@ public void FwNewLangProjectModel_VernacularAndAnalysisSame_WarningIssued() model.LoadVernacularSetup = () => { }; model.LoadAnalysisSetup = () => { }; model.LoadAnalysisSameAsVernacularWarning = () => { warningIssued = true; }; - model.ProjectName = "a"; + model.ProjectName = DbName; var fakeTestWs = new CoreWritingSystemDefinition("fr"); model.WritingSystemContainer.CurrentVernacularWritingSystems.Add(fakeTestWs); model.WritingSystemContainer.VernacularWritingSystems.Add(fakeTestWs); @@ -291,7 +302,7 @@ public void FwNewLangProjectModel_CanGoNext() model.LoadAnalysisSetup = () => { }; model.LoadAdvancedWsSetup = () => { }; model.LoadAnthropologySetup = () => { }; - model.ProjectName = "a"; + model.ProjectName = DbName; var fakeTestWs = new CoreWritingSystemDefinition("fr"); model.WritingSystemContainer.CurrentVernacularWritingSystems.Add(fakeTestWs); model.WritingSystemContainer.VernacularWritingSystems.Add(fakeTestWs); @@ -318,7 +329,7 @@ public void FwNewLangProjectModel_CannotClickFinishWithBlankProjectName() model.LoadAnalysisSetup = () => { }; model.LoadAdvancedWsSetup = () => { }; model.LoadAnthropologySetup = () => { }; - model.ProjectName = "a"; + model.ProjectName = DbName; var fakeTestWs = new CoreWritingSystemDefinition("fr"); model.WritingSystemContainer.CurrentVernacularWritingSystems.Add(fakeTestWs); model.WritingSystemContainer.VernacularWritingSystems.Add(fakeTestWs); @@ -334,7 +345,124 @@ public void FwNewLangProjectModel_CannotClickFinishWithBlankProjectName() Assert.False(model.CanFinish()); } - private void CheckInitialSetOfPartsOfSpeech(LcmCache cache) + /// + [Test] + public void SetDefaultWs_ReplacesExistingDefault() + { + var model = new FwNewLangProjectModel(true) + { + LoadProjectNameSetup = () => { }, + LoadVernacularSetup = () => { }, + ProjectName = DbName + }; + model.Next(); + model.WritingSystemContainer.AddToCurrentVernacularWritingSystems(new CoreWritingSystemDefinition("fr")); + model.WritingSystemContainer.AddToCurrentVernacularWritingSystems(new CoreWritingSystemDefinition("en")); + model.SetDefaultWs(new LanguageInfo{LanguageTag = "de"}); + Assert.That(model.WritingSystemContainer.VernacularWritingSystems.Count, Is.EqualTo(2), "all"); + Assert.That(model.WritingSystemContainer.VernacularWritingSystems.First().LanguageTag, Is.EqualTo("de"), "first should be German"); + Assert.That(model.WritingSystemContainer.CurrentVernacularWritingSystems.Count, Is.EqualTo(2), "current"); + Assert.That(model.WritingSystemContainer.CurrentVernacularWritingSystems.First().LanguageTag, Is.EqualTo("de"), + "default should be German"); + } + + /// + [Test] + public void SetDefaultWs_ManyExist_OthersArePreservedInOrder() + { + var model = new FwNewLangProjectModel(true) + { + LoadProjectNameSetup = () => { }, + LoadVernacularSetup = () => { }, + ProjectName = DbName + }; + model.Next(); + model.WritingSystemContainer.AddToCurrentVernacularWritingSystems(new CoreWritingSystemDefinition("en")); + model.WritingSystemContainer.AddToCurrentVernacularWritingSystems(new CoreWritingSystemDefinition("de")); + model.WritingSystemContainer.AddToCurrentVernacularWritingSystems(new CoreWritingSystemDefinition("fr")); + model.SetDefaultWs(new LanguageInfo{LanguageTag = "de"}); + Assert.That(model.WritingSystemContainer.VernacularWritingSystems.Count, Is.EqualTo(3), "all"); + Assert.That(model.WritingSystemContainer.VernacularWritingSystems.First().LanguageTag, Is.EqualTo("de"), "first should be German"); + Assert.That(model.WritingSystemContainer.CurrentVernacularWritingSystems.Count, Is.EqualTo(3), "current"); + Assert.That(model.WritingSystemContainer.CurrentVernacularWritingSystems[0].LanguageTag, Is.EqualTo("de"), "default should be German"); + Assert.That(model.WritingSystemContainer.CurrentVernacularWritingSystems[1].LanguageTag, Is.EqualTo("en"), "econd should be English"); + Assert.That(model.WritingSystemContainer.CurrentVernacularWritingSystems[2].LanguageTag, Is.EqualTo("fr"), "third should be French"); + } + + /// + [Test] + public void SetDefaultWs_DoesNotDuplicate() + { + var model = new FwNewLangProjectModel(true) + { + LoadProjectNameSetup = () => { }, + LoadVernacularSetup = () => { }, + ProjectName = DbName + }; + model.Next(); + model.WritingSystemContainer.AddToCurrentVernacularWritingSystems(new CoreWritingSystemDefinition("de")); + model.SetDefaultWs(new LanguageInfo{LanguageTag = "de"}); + Assert.That(model.WritingSystemContainer.VernacularWritingSystems.Count, Is.EqualTo(1), "should be only one WS"); + Assert.That(model.WritingSystemContainer.VernacularWritingSystems.First().LanguageTag, Is.EqualTo("de"), "should be German"); + Assert.That(model.WritingSystemContainer.CurrentVernacularWritingSystems.Count, Is.EqualTo(1), "should be only one current"); + Assert.That(model.WritingSystemContainer.CurrentVernacularWritingSystems.First().LanguageTag, Is.EqualTo("de"), + "default should be German"); + } + + /// + [Test] + public void SetDefaultWs_PreservesCheckState() + { + var model = new FwNewLangProjectModel(true) + { + LoadProjectNameSetup = () => { }, + LoadVernacularSetup = () => { }, + ProjectName = DbName + }; + model.Next(); + var french = new CoreWritingSystemDefinition("fr"); + var esperanto = new CoreWritingSystemDefinition("eo"); + var english = new CoreWritingSystemDefinition("en"); + model.WritingSystemContainer.AddToCurrentVernacularWritingSystems(french); // selected + model.WritingSystemContainer.AddToCurrentVernacularWritingSystems(esperanto); // selected + model.WritingSystemContainer.VernacularWritingSystems.Add(english); // deselected + model.SetDefaultWs(new LanguageInfo{LanguageTag = "de"}); + Assert.That(model.WritingSystemContainer.VernacularWritingSystems.Count, Is.EqualTo(3), "should be three total"); + Assert.That(model.WritingSystemContainer.VernacularWritingSystems.First().LanguageTag, Is.EqualTo("de"), "first should be German"); + Assert.That(model.WritingSystemContainer.VernacularWritingSystems.Contains(esperanto), "should contain Esperanto"); + Assert.That(model.WritingSystemContainer.VernacularWritingSystems.Contains(english), "should contain English"); + Assert.That(model.WritingSystemContainer.CurrentVernacularWritingSystems.Count, Is.EqualTo(2), "should be two selected"); + Assert.That(model.WritingSystemContainer.CurrentVernacularWritingSystems[0].LanguageTag, Is.EqualTo("de"), "default should be German"); + Assert.Contains(esperanto, (ICollection)model.WritingSystemContainer.CurrentVernacularWritingSystems, "Esperanto should be selected"); + } + + /// + [Test] + public void SetDefaultWs_Analysis() + { + var model = new FwNewLangProjectModel(true) + { + LoadProjectNameSetup = () => { }, + LoadVernacularSetup = () => { }, + LoadAnalysisSetup = () => { }, + ProjectName = DbName + }; + model.Next(); + model.WritingSystemContainer.AddToCurrentVernacularWritingSystems(new CoreWritingSystemDefinition("fr")); + model.Next(); + // English is the default Analysis WS, so we do not need to set it here. + Assert.That(model.WritingSystemContainer.AnalysisWritingSystems.Count, Is.EqualTo(1), "Test setup problem"); + Assert.That(model.WritingSystemContainer.AnalysisWritingSystems.First().LanguageTag, Is.EqualTo("en"), "Test setup problem"); + Assert.That(model.WritingSystemContainer.CurrentAnalysisWritingSystems.Count, Is.EqualTo(1), "Test setup problem"); + Assert.That(model.WritingSystemContainer.CurrentAnalysisWritingSystems.First().LanguageTag, Is.EqualTo("en"), "Test setup problem"); + model.SetDefaultWs(new LanguageInfo{LanguageTag = "de"}); + Assert.That(model.WritingSystemContainer.AnalysisWritingSystems.Count, Is.EqualTo(1), "all"); + Assert.That(model.WritingSystemContainer.AnalysisWritingSystems.First().LanguageTag, Is.EqualTo("de"), "should be German"); + Assert.That(model.WritingSystemContainer.CurrentAnalysisWritingSystems.Count, Is.EqualTo(1), "current"); + Assert.That(model.WritingSystemContainer.CurrentAnalysisWritingSystems[0].LanguageTag, Is.EqualTo("de"), "default should be German"); + } + + private static void CheckInitialSetOfPartsOfSpeech(LcmCache cache) { ILangProject lp = cache.LanguageProject; int iCount = 0; @@ -373,11 +501,8 @@ private void CheckInitialSetOfPartsOfSpeech(LcmCache cache) Assert.IsTrue(fVerbFound, "Did not find Verb CatalogSourceId"); } - private void CreateDb(string dbName, string vernWs = "fr") + private static void CreateDb(string dbName, string vernWs = "fr") { - if (DbExists(dbName)) - DestroyDb(dbName, true); - var testProject = new FwNewLangProjectModel(true) { LoadProjectNameSetup = () => { }, @@ -387,7 +512,7 @@ private void CreateDb(string dbName, string vernWs = "fr") AnthroModel = new FwChooseAnthroListModel { CurrentList = FwChooseAnthroListModel.ListChoice.UserDef } }; testProject.Next(); - testProject.SetDefaultWs(new LanguageInfo { LanguageTag = "fr" }); + testProject.SetDefaultWs(new LanguageInfo { LanguageTag = vernWs }); testProject.Next(); using (var threadHelper = new ThreadHelper()) { diff --git a/Src/FwCoreDlgs/FwNewLangProjectModel.cs b/Src/FwCoreDlgs/FwNewLangProjectModel.cs index 1d8a505ff0..aee4df0d15 100644 --- a/Src/FwCoreDlgs/FwNewLangProjectModel.cs +++ b/Src/FwCoreDlgs/FwNewLangProjectModel.cs @@ -398,7 +398,7 @@ public void SetDefaultWs(LanguageInfo selectedLanguage) { currentList = WritingSystemContainer.CurrentVernacularWritingSystems; allList = WritingSystemContainer.VernacularWritingSystems; - SetDefaultWsInCurrentList(selectedLanguage, currentList, allList); + SetDefaultWsInLists(selectedLanguage, currentList, allList); LoadVernacularSetup(); break; } @@ -406,7 +406,7 @@ public void SetDefaultWs(LanguageInfo selectedLanguage) { currentList = WritingSystemContainer.CurrentAnalysisWritingSystems; allList = WritingSystemContainer.AnalysisWritingSystems; - SetDefaultWsInCurrentList(selectedLanguage, currentList, allList); + SetDefaultWsInLists(selectedLanguage, currentList, allList); if (currentList.First().Equals(WritingSystemContainer.CurrentVernacularWritingSystems.First())) { LoadAnalysisSameAsVernacularWarning(); @@ -419,42 +419,36 @@ public void SetDefaultWs(LanguageInfo selectedLanguage) } } - private static void AddDefaultWsInAllList(CoreWritingSystemDefinition defaultWs, ICollection allList) + private void SetDefaultWsInLists(LanguageInfo selectedLanguage, IList currentList, + ICollection allList) { - var itemInList = allList.FirstOrDefault(ws => ws.LanguageTag == defaultWs.LanguageTag); - if (itemInList == null) - { - var newList = new List(allList); - newList.Insert(0, defaultWs); - allList.Clear(); - allList.AddRange(newList); - } - else - { - var newList = new List(allList); - newList.Remove(itemInList); - newList.Insert(0, defaultWs); - allList.Clear(); - allList.AddRange(newList); - } + SetDefaultWsInList(selectedLanguage, currentList); + + var newAllList = new List(allList); + SetDefaultWsInList(selectedLanguage, newAllList); + allList.Clear(); + allList.AddRange(newAllList); } - private void SetDefaultWsInCurrentList(LanguageInfo selectedLanguage, IList currentList, - ICollection allList) + private void SetDefaultWsInList(LanguageInfo selectedLanguage, IList list) { - var itemInList = currentList.FirstOrDefault(ws => ws.LanguageTag == selectedLanguage.LanguageTag); + var itemInList = list.FirstOrDefault(ws => ws.LanguageTag == selectedLanguage.LanguageTag); if (itemInList == null) { WritingSystemManager.GetOrSet(selectedLanguage.LanguageTag, out itemInList); - currentList.Insert(0, itemInList); + if (list.Any()) + { + // If the user changes the Default in either Default WS step in the New Project Wizard, + // don't keep an ever-growing list of old WS's (LT-19718) + list.RemoveAt(0); + } } else { - currentList.Remove(itemInList); - currentList.Insert(0, itemInList); + // WS exists; simply promote it. + list.Remove(itemInList); } - - AddDefaultWsInAllList(itemInList, allList); + list.Insert(0, itemInList); } }