SIL.FieldWorks.IText.SandboxBaseTests.GetBestGloss C# (CSharp) Method

GetBestGloss() private method

private GetBestGloss ( ) : void
return void
		public void GetBestGloss()
		{
			var wf = Cache.ServiceLocator.GetInstance<IWfiWordformFactory>().Create();
			var wa = Cache.ServiceLocator.GetInstance<IWfiAnalysisFactory>().Create();
			wf.AnalysesOC.Add(wa);
			var sda = VwCacheDaClass.Create();
			var wsIds = new List<int>();
			wsIds.Add(Cache.DefaultAnalWs);
			int hvoAbc = 123456;

			// Basic check: no glosses, we don't find any.
			Assert.That(SandboxBase.GetRealAnalysisMethod.GetBestGloss(wa, wsIds, sda, hvoAbc), Is.Null);

			// Only possibility, everything blank, we want it.
			var wgAbc = Cache.ServiceLocator.GetInstance<IWfiGlossFactory>().Create();
			wa.MeaningsOC.Add(wgAbc);
			Assert.That(SandboxBase.GetRealAnalysisMethod.GetBestGloss(wa, wsIds, sda, hvoAbc), Is.EqualTo(wgAbc));

			// Looking for a particular string and not finding one that has it, we fail
			sda.CacheStringAlt(hvoAbc, SandboxBase.ktagSbWordGloss, Cache.DefaultAnalWs, MakeAnalysisString("abc"));
			Assert.That(SandboxBase.GetRealAnalysisMethod.GetBestGloss(wa, wsIds, sda, hvoAbc), Is.Null);

			// Likewise, we won't return a gloss that has relevant alternatives, even if all the desired strings are empty.
			// (An easy way to have all the SDA strings be empty is to use a different HVO.)
			sda.CacheStringAlt(hvoAbc, SandboxBase.ktagSbWordGloss, Cache.DefaultAnalWs, MakeAnalysisString("abc"));
			wgAbc.Form.AnalysisDefaultWritingSystem = MakeAnalysisString("abc");
			Assert.That(SandboxBase.GetRealAnalysisMethod.GetBestGloss(wa, wsIds, sda, 27), Is.Null);

			// Simple success: the one and only WS matches.
			Assert.That(SandboxBase.GetRealAnalysisMethod.GetBestGloss(wa, wsIds, sda, hvoAbc), Is.EqualTo(wgAbc));

			// It matches even if there is another, empty one.
			var wgDef = Cache.ServiceLocator.GetInstance<IWfiGlossFactory>().Create();
			wa.MeaningsOC.Add(wgDef);
			Assert.That(SandboxBase.GetRealAnalysisMethod.GetBestGloss(wa, wsIds, sda, hvoAbc), Is.EqualTo(wgAbc));

			// Also if there is another one with a different value for the form
			wgDef.Form.AnalysisDefaultWritingSystem = MakeAnalysisString("def");
			Assert.That(SandboxBase.GetRealAnalysisMethod.GetBestGloss(wa, wsIds, sda, hvoAbc), Is.EqualTo(wgAbc));

			// We can also find the def one.
			int hvoDef = 123457;
			sda.CacheStringAlt(hvoDef, SandboxBase.ktagSbWordGloss, Cache.DefaultAnalWs, MakeAnalysisString("def"));
			Assert.That(SandboxBase.GetRealAnalysisMethod.GetBestGloss(wa, wsIds, sda, hvoDef), Is.EqualTo(wgDef));

			// Now trying to match two writing systems. One with both correct should beat one with only one correct.
			var wgAbc3 = Cache.ServiceLocator.GetInstance<IWfiGlossFactory>().Create();
			wa.MeaningsOC.Add(wgAbc3);
			wgAbc3.Form.AnalysisDefaultWritingSystem = MakeAnalysisString("abc");
			var wsSpn = Cache.WritingSystemFactory.get_Engine("es").Handle;
			var wsFrn = Cache.WritingSystemFactory.get_Engine("fr").Handle;
			wgAbc3.Form.set_String(wsSpn, Cache.TsStrFactory.MakeString("abcS", wsSpn));
			wgAbc3.Form.set_String(wsFrn, Cache.TsStrFactory.MakeString("abcF", wsFrn));
			wsIds.Add(wsSpn);
			sda.CacheStringAlt(hvoAbc, SandboxBase.ktagSbWordGloss, wsSpn, Cache.TsStrFactory.MakeString("abcS", wsSpn));
			Assert.That(SandboxBase.GetRealAnalysisMethod.GetBestGloss(wa, wsIds, sda, hvoAbc), Is.EqualTo(wgAbc3));

			// Of two partial matches, prefer the one where other alternatives are empty.
			// wgAbc2, wgAbc3 both match on English and Spanish. Neither matches on French, but wgAbc2 has no French
			// at all and is thus a better match.
			var wgAbc2 = Cache.ServiceLocator.GetInstance<IWfiGlossFactory>().Create();
			wa.MeaningsOC.Add(wgAbc2);
			wgAbc2.Form.AnalysisDefaultWritingSystem = MakeAnalysisString("abc");
			wgAbc2.Form.set_String(wsSpn, Cache.TsStrFactory.MakeString("abcS", wsSpn));
			wsIds.Add(wsFrn);
			sda.CacheStringAlt(hvoAbc, SandboxBase.ktagSbWordGloss, wsFrn, Cache.TsStrFactory.MakeString("abcOther", wsFrn));
			Assert.That(SandboxBase.GetRealAnalysisMethod.GetBestGloss(wa, wsIds, sda, hvoAbc), Is.EqualTo(wgAbc2));

			// Of two perfect matches, we prefer the one that has no other information.
			wsIds.Remove(wsFrn);
			Assert.That(SandboxBase.GetRealAnalysisMethod.GetBestGloss(wa, wsIds, sda, hvoAbc), Is.EqualTo(wgAbc2));

			// We will not return one where the WfiGloss has a relevant non-empty alternative, even if the corresponding target is empty.
			sda.CacheStringAlt(hvoAbc, SandboxBase.ktagSbWordGloss, wsSpn, Cache.TsStrFactory.MakeString("", wsSpn));
			wa.MeaningsOC.Remove(wgAbc);
			Assert.That(SandboxBase.GetRealAnalysisMethod.GetBestGloss(wa, wsIds, sda, hvoAbc), Is.Null);
		}