diff --git a/src/SIL.LCModel/DomainServices/AnalysisGuessServices.cs b/src/SIL.LCModel/DomainServices/AnalysisGuessServices.cs
index 87aee45f..cd36c481 100644
--- a/src/SIL.LCModel/DomainServices/AnalysisGuessServices.cs
+++ b/src/SIL.LCModel/DomainServices/AnalysisGuessServices.cs
@@ -29,11 +29,21 @@ public class AnalysisGuessServices
///
///
///
- public AnalysisGuessServices(LcmCache cache)
+ public AnalysisGuessServices(LcmCache cache) : this(cache, false)
+ {
+ }
+
+ ///
+ ///
+ ///
+ ///
+ /// whether parser approval should be prioritized over human approval
+ public AnalysisGuessServices(LcmCache cache, bool prioritizeParser)
{
Cache = cache;
m_emptyWAG = new EmptyWAG();
m_nullWAG = new NullWAG();
+ PrioritizeParser = prioritizeParser;
}
///
@@ -57,6 +67,8 @@ public enum OpinionAgent
public AnalysisOccurrence IgnoreOccurrence { get; set; }
+ public bool PrioritizeParser { get; set; }
+
LcmCache Cache { get; set; }
// PriorityCount provides a count of the number of times an analysis
@@ -644,6 +656,21 @@ private void AddAnalysisCount(IAnalysis context, IAnalysis analysis, int priorit
///
private int ComparePriorityCounts(IAnalysis a1, IAnalysis a2, AnalysisOccurrence occurrence, ContextCount contextCount)
{
+ if (PrioritizeParser)
+ {
+ // Sort by parser approval.
+ IWfiAnalysis wfi1 = a1 as IWfiAnalysis;
+ IWfiAnalysis wfi2 = a2 as IWfiAnalysis;
+ if (wfi1 != null && wfi2 != null)
+ {
+ int p1 = IsParserApproved(wfi1) ? 3 : IsParserDisapproved(wfi1) ? 1 : 2;
+ int p2 = IsParserApproved(wfi2) ? 3 : IsParserDisapproved(wfi2) ? 1 : 2;
+ if (p1 < p2)
+ return 1;
+ if (p1 > p2)
+ return -1;
+ }
+ }
// Compare contexted counts.
if (occurrence != null)
{
diff --git a/tests/SIL.LCModel.Tests/DomainServices/AnalysisGuessServicesTests.cs b/tests/SIL.LCModel.Tests/DomainServices/AnalysisGuessServicesTests.cs
index 4f253e6d..38c058fe 100644
--- a/tests/SIL.LCModel.Tests/DomainServices/AnalysisGuessServicesTests.cs
+++ b/tests/SIL.LCModel.Tests/DomainServices/AnalysisGuessServicesTests.cs
@@ -61,12 +61,12 @@ internal enum Flags
LcmCache Cache { get; set; }
- internal AnalysisGuessBaseSetup(LcmCache cache) : this()
+ internal AnalysisGuessBaseSetup(LcmCache cache, bool prioritizeParser = false) : this()
{
Cache = cache;
UserAgent = Cache.LanguageProject.DefaultUserAgent;
ParserAgent = Cache.LangProject.DefaultParserAgent;
- GuessServices = new AnalysisGuessServices(Cache);
+ GuessServices = new AnalysisGuessServices(Cache, prioritizeParser);
EntryFactory = Cache.ServiceLocator.GetInstance();
DoDataSetup();
}
@@ -1251,6 +1251,22 @@ public void ExpectedGuess_PreferUserApprovedAnalysisOverParserApprovedAnalysis()
}
}
+ ///
+ ///
+ [Test]
+ public void ExpectedGuess_PreferParserApprovedAnalysisOverUserApprovedAnalysis()
+ {
+ using (var setup = new AnalysisGuessBaseSetup(Cache, true))
+ {
+ var newWagParserApproves = WordAnalysisOrGlossServices.CreateNewAnalysisWAG(setup.Words_para0[1]);
+ var newWagHumanApproves = WordAnalysisOrGlossServices.CreateNewAnalysisWAG(setup.Words_para0[1]);
+ setup.ParserAgent.SetEvaluation(newWagParserApproves.Analysis, Opinions.approves);
+ setup.UserAgent.SetEvaluation(newWagHumanApproves.Analysis, Opinions.approves);
+ var guessActual = setup.GuessServices.GetBestGuess(setup.Words_para0[1]);
+ Assert.AreEqual(newWagParserApproves.Analysis, guessActual);
+ }
+ }
+
///
/// Prefer analyses that are in the right context over analyses that are not.
///