public void FindCommand() { DispatcherHelper.Initialize(); var segmentPool = new SegmentPool(); var projectService = Substitute.For <IProjectService>(); var dialogService = Substitute.For <IDialogService>(); var busyService = Substitute.For <IBusyService>(); var exportService = Substitute.For <IExportService>(); var analysisService = new AnalysisService(_spanFactory, segmentPool, projectService, dialogService, busyService); WordPairsViewModel.Factory wordPairsFactory = () => new WordPairsViewModel(busyService); VarietyPairViewModel.Factory varietyPairFactory = (vp, order) => new VarietyPairViewModel(segmentPool, projectService, wordPairsFactory, vp, order); var varietyPairs = new VarietyPairsViewModel(projectService, busyService, dialogService, exportService, analysisService, varietyPairFactory); CogProject project = TestHelpers.GetTestProject(_spanFactory, segmentPool); project.Meanings.AddRange(new[] { new Meaning("gloss1", "cat1"), new Meaning("gloss2", "cat2"), new Meaning("gloss3", "cat3") }); project.Varieties.AddRange(new[] { new Variety("variety1"), new Variety("variety2"), new Variety("variety3") }); project.Varieties[0].Words.AddRange(new[] { new Word("hɛ.loʊ", project.Meanings[0]), new Word("gʊd", project.Meanings[1]), new Word("bæd", project.Meanings[2]) }); project.Varieties[1].Words.AddRange(new[] { new Word("hɛlp", project.Meanings[0]), new Word("gu.gəl", project.Meanings[1]), new Word("gu.fi", project.Meanings[2]) }); project.Varieties[2].Words.AddRange(new[] { new Word("wɜrd", project.Meanings[0]), new Word("kɑr", project.Meanings[1]), new Word("fʊt.bɔl", project.Meanings[2]) }); projectService.Project.Returns(project); analysisService.SegmentAll(); var varietyPairGenerator = new VarietyPairGenerator(); varietyPairGenerator.Process(project); var wordPairGenerator = new SimpleWordPairGenerator(segmentPool, project, 0.3, ComponentIdentifiers.PrimaryWordAligner); foreach (VarietyPair vp in project.VarietyPairs) { wordPairGenerator.Process(vp); vp.SoundChangeFrequencyDistribution = new ConditionalFrequencyDistribution <SoundContext, Ngram <Segment> >(); vp.SoundChangeProbabilityDistribution = new ConditionalProbabilityDistribution <SoundContext, Ngram <Segment> >(vp.SoundChangeFrequencyDistribution, (sc, fd) => new MaxLikelihoodProbabilityDistribution <Ngram <Segment> >(fd)); } int i = 0; foreach (WordPair wp in project.VarietyPairs[0].WordPairs) { wp.PhoneticSimilarityScore = (1.0 / project.VarietyPairs[0].WordPairs.Count) * (project.VarietyPairs[0].WordPairs.Count - i); wp.AreCognatePredicted = wp.Meaning.Gloss.IsOneOf("gloss1", "gloss3"); i++; } i = 0; foreach (WordPair wp in project.VarietyPairs[1].WordPairs) { wp.PhoneticSimilarityScore = (1.0 / project.VarietyPairs[1].WordPairs.Count) * (project.VarietyPairs[1].WordPairs.Count - i); i++; } projectService.ProjectOpened += Raise.Event(); varietyPairs.VarietiesView1 = new ListCollectionView(varietyPairs.Varieties); varietyPairs.VarietiesView2 = new ListCollectionView(varietyPairs.Varieties); WordPairsViewModel cognates = varietyPairs.SelectedVarietyPair.Cognates; cognates.WordPairsView = new ListCollectionView(cognates.WordPairs); WordPairViewModel[] cognatesArray = cognates.WordPairsView.Cast <WordPairViewModel>().ToArray(); WordPairsViewModel noncognates = varietyPairs.SelectedVarietyPair.Noncognates; noncognates.WordPairsView = new ListCollectionView(noncognates.WordPairs); WordPairViewModel[] noncognatesArray = noncognates.WordPairsView.Cast <WordPairViewModel>().ToArray(); FindViewModel findViewModel = null; Action closeCallback = null; dialogService.ShowModelessDialog(varietyPairs, Arg.Do <FindViewModel>(vm => findViewModel = vm), Arg.Do <Action>(callback => closeCallback = callback)); varietyPairs.FindCommand.Execute(null); Assert.That(findViewModel, Is.Not.Null); Assert.That(closeCallback, Is.Not.Null); // already open, shouldn't get opened twice dialogService.ClearReceivedCalls(); varietyPairs.FindCommand.Execute(null); dialogService.DidNotReceive().ShowModelessDialog(varietyPairs, Arg.Any <FindViewModel>(), Arg.Any <Action>()); // form searches findViewModel.Field = FindField.Form; // nothing selected, no match findViewModel.String = "nothing"; findViewModel.FindNextCommand.Execute(null); Assert.That(cognates.SelectedWordPairs, Is.Empty); Assert.That(noncognates.SelectedWordPairs, Is.Empty); // nothing selected, matches findViewModel.String = "g"; findViewModel.FindNextCommand.Execute(null); Assert.That(cognates.SelectedWordPairs, Is.EquivalentTo(cognatesArray[1].ToEnumerable())); Assert.That(noncognates.SelectedWordPairs, Is.Empty); findViewModel.FindNextCommand.Execute(null); Assert.That(cognates.SelectedWordPairs, Is.Empty); Assert.That(noncognates.SelectedWordPairs, Is.EquivalentTo(noncognatesArray[0].ToEnumerable())); findViewModel.FindNextCommand.Execute(null); Assert.That(cognates.SelectedWordPairs, Is.Empty); Assert.That(noncognates.SelectedWordPairs, Is.EquivalentTo(noncognatesArray[0].ToEnumerable())); // first word selected, matches noncognates.SelectedWordPairs.Clear(); cognates.SelectedWordPairs.Add(cognatesArray[0]); findViewModel.String = "ʊ"; findViewModel.FindNextCommand.Execute(null); Assert.That(cognates.SelectedWordPairs, Is.Empty); Assert.That(noncognates.SelectedWordPairs, Is.EquivalentTo(noncognatesArray[0].ToEnumerable())); findViewModel.FindNextCommand.Execute(null); Assert.That(cognates.SelectedWordPairs, Is.EquivalentTo(cognatesArray[0].ToEnumerable())); Assert.That(noncognates.SelectedWordPairs, Is.Empty); findViewModel.FindNextCommand.Execute(null); Assert.That(cognates.SelectedWordPairs, Is.EquivalentTo(cognatesArray[0].ToEnumerable())); Assert.That(noncognates.SelectedWordPairs, Is.Empty); // start over findViewModel.FindNextCommand.Execute(null); Assert.That(cognates.SelectedWordPairs, Is.Empty); Assert.That(noncognates.SelectedWordPairs, Is.EquivalentTo(noncognatesArray[0].ToEnumerable())); // last word selected, matches cognates.SelectedWordPairs.Clear(); noncognates.SelectedWordPairs.Add(noncognatesArray[0]); findViewModel.String = "h"; findViewModel.FindNextCommand.Execute(null); Assert.That(cognates.SelectedWordPairs, Is.EquivalentTo(cognatesArray[0].ToEnumerable())); Assert.That(noncognates.SelectedWordPairs, Is.Empty); findViewModel.FindNextCommand.Execute(null); Assert.That(cognates.SelectedWordPairs, Is.EquivalentTo(cognatesArray[0].ToEnumerable())); Assert.That(noncognates.SelectedWordPairs, Is.Empty); // switch variety pair, nothing selected, no cognates, matches, change selected word varietyPairs.SelectedVariety2 = varietyPairs.Varieties[2]; cognates = varietyPairs.SelectedVarietyPair.Cognates; cognates.WordPairsView = new ListCollectionView(cognates.WordPairs); noncognates = varietyPairs.SelectedVarietyPair.Noncognates; noncognates.WordPairsView = new ListCollectionView(noncognates.WordPairs); noncognatesArray = noncognates.WordPairsView.Cast <WordPairViewModel>().ToArray(); findViewModel.String = "l"; findViewModel.FindNextCommand.Execute(null); Assert.That(cognates.SelectedWordPairs, Is.Empty); Assert.That(noncognates.SelectedWordPairs, Is.EquivalentTo(noncognatesArray[0].ToEnumerable())); findViewModel.FindNextCommand.Execute(null); Assert.That(cognates.SelectedWordPairs, Is.Empty); Assert.That(noncognates.SelectedWordPairs, Is.EquivalentTo(noncognatesArray[2].ToEnumerable())); noncognates.SelectedWordPairs.Clear(); noncognates.SelectedWordPairs.Add(noncognatesArray[1]); findViewModel.FindNextCommand.Execute(null); Assert.That(cognates.SelectedWordPairs, Is.Empty); Assert.That(noncognates.SelectedWordPairs, Is.EquivalentTo(noncognatesArray[2].ToEnumerable())); findViewModel.FindNextCommand.Execute(null); Assert.That(cognates.SelectedWordPairs, Is.Empty); Assert.That(noncognates.SelectedWordPairs, Is.EquivalentTo(noncognatesArray[0].ToEnumerable())); findViewModel.FindNextCommand.Execute(null); Assert.That(cognates.SelectedWordPairs, Is.Empty); Assert.That(noncognates.SelectedWordPairs, Is.EquivalentTo(noncognatesArray[0].ToEnumerable())); // gloss searches findViewModel.Field = FindField.Gloss; findViewModel.String = "gloss2"; findViewModel.FindNextCommand.Execute(null); Assert.That(cognates.SelectedWordPairs, Is.Empty); Assert.That(noncognates.SelectedWordPairs, Is.EquivalentTo(noncognatesArray[1].ToEnumerable())); findViewModel.FindNextCommand.Execute(null); Assert.That(cognates.SelectedWordPairs, Is.Empty); Assert.That(noncognates.SelectedWordPairs, Is.EquivalentTo(noncognatesArray[1].ToEnumerable())); }
public void TaskAreas() { DispatcherHelper.Initialize(); var segmentPool = new SegmentPool(); var projectService = Substitute.For <IProjectService>(); var dialogService = Substitute.For <IDialogService>(); var busyService = Substitute.For <IBusyService>(); var exportService = Substitute.For <IExportService>(); var analysisService = new AnalysisService(_spanFactory, segmentPool, projectService, dialogService, busyService); WordPairsViewModel.Factory wordPairsFactory = () => new WordPairsViewModel(busyService); VarietyPairViewModel.Factory varietyPairFactory = (vp, order) => new VarietyPairViewModel(segmentPool, projectService, wordPairsFactory, vp, order); var varietyPairs = new VarietyPairsViewModel(projectService, busyService, dialogService, exportService, analysisService, varietyPairFactory); CogProject project = TestHelpers.GetTestProject(_spanFactory, segmentPool); project.Meanings.AddRange(new[] { new Meaning("gloss1", "cat1"), new Meaning("gloss2", "cat2"), new Meaning("gloss3", "cat3"), new Meaning("gloss4", "cat4") }); project.Varieties.AddRange(new[] { new Variety("variety1"), new Variety("variety2"), new Variety("variety3") }); project.Varieties[0].Words.AddRange(new[] { new Word("hɛ.loʊ", project.Meanings[0]), new Word("gʊd", project.Meanings[1]), new Word("bæd", project.Meanings[2]), new Word("wɜrd", project.Meanings[3]) }); project.Varieties[1].Words.AddRange(new[] { new Word("hɛlp", project.Meanings[0]), new Word("gu.gəl", project.Meanings[1]), new Word("gu.fi", project.Meanings[2]), new Word("kɑr", project.Meanings[3]) }); projectService.Project.Returns(project); analysisService.SegmentAll(); var varietyPairGenerator = new VarietyPairGenerator(); varietyPairGenerator.Process(project); var wordPairGenerator = new SimpleWordPairGenerator(segmentPool, project, 0.3, ComponentIdentifiers.PrimaryWordAligner); foreach (VarietyPair vp in project.VarietyPairs) { wordPairGenerator.Process(vp); vp.SoundChangeFrequencyDistribution = new ConditionalFrequencyDistribution <SoundContext, Ngram <Segment> >(); vp.SoundChangeProbabilityDistribution = new ConditionalProbabilityDistribution <SoundContext, Ngram <Segment> >(vp.SoundChangeFrequencyDistribution, (sc, fd) => new MaxLikelihoodProbabilityDistribution <Ngram <Segment> >(fd)); } int i = 0; foreach (WordPair wp in project.VarietyPairs[0].WordPairs) { wp.PhoneticSimilarityScore = (1.0 / project.VarietyPairs[0].WordPairs.Count) * (i + 1); wp.AreCognatePredicted = wp.Meaning.Gloss.IsOneOf("gloss1", "gloss3"); i++; } projectService.ProjectOpened += Raise.Event(); varietyPairs.VarietiesView1 = new ListCollectionView(varietyPairs.Varieties); varietyPairs.VarietiesView2 = new ListCollectionView(varietyPairs.Varieties); WordPairsViewModel cognates = varietyPairs.SelectedVarietyPair.Cognates; cognates.WordPairsView = new ListCollectionView(cognates.WordPairs); WordPairViewModel[] cognatesArray = cognates.WordPairsView.Cast <WordPairViewModel>().ToArray(); WordPairsViewModel noncognates = varietyPairs.SelectedVarietyPair.Noncognates; noncognates.WordPairsView = new ListCollectionView(noncognates.WordPairs); WordPairViewModel[] noncognatesArray = noncognates.WordPairsView.Cast <WordPairViewModel>().ToArray(); Assert.That(cognatesArray.Select(wp => wp.Meaning.Gloss), Is.EqualTo(new[] { "gloss3", "gloss1" })); Assert.That(noncognatesArray.Select(wp => wp.Meaning.Gloss), Is.EqualTo(new[] { "gloss4", "gloss2" })); var commonTasks = (TaskAreaItemsViewModel)varietyPairs.TaskAreas[0]; var sortWordsByItems = (TaskAreaItemsViewModel)commonTasks.Items[2]; var sortWordsByGroup = (TaskAreaCommandGroupViewModel)sortWordsByItems.Items[0]; // default sorting is by similarity, change to gloss sortWordsByGroup.SelectedCommand = sortWordsByGroup.Commands[1]; sortWordsByGroup.SelectedCommand.Command.Execute(null); cognatesArray = cognates.WordPairsView.Cast <WordPairViewModel>().ToArray(); noncognatesArray = noncognates.WordPairsView.Cast <WordPairViewModel>().ToArray(); Assert.That(cognatesArray.Select(wp => wp.Meaning.Gloss), Is.EqualTo(new[] { "gloss1", "gloss3" })); Assert.That(noncognatesArray.Select(wp => wp.Meaning.Gloss), Is.EqualTo(new[] { "gloss2", "gloss4" })); }
public void FindCommand() { DispatcherHelper.Initialize(); var segmentPool = new SegmentPool(); var projectService = Substitute.For <IProjectService>(); var dialogService = Substitute.For <IDialogService>(); var busyService = Substitute.For <IBusyService>(); var graphService = new GraphService(projectService); var imageExportService = Substitute.For <IImageExportService>(); var analysisService = new AnalysisService(_spanFactory, segmentPool, projectService, dialogService, busyService); WordPairsViewModel.Factory wordPairsFactory = () => new WordPairsViewModel(busyService); WordPairViewModel.Factory wordPairFactory = (pair, order) => new WordPairViewModel(projectService, analysisService, pair, order); var globalCorrespondences = new GlobalCorrespondencesViewModel(projectService, busyService, dialogService, imageExportService, graphService, wordPairsFactory, wordPairFactory); CogProject project = TestHelpers.GetTestProject(_spanFactory, segmentPool); project.Meanings.AddRange(new[] { new Meaning("gloss1", "cat1"), new Meaning("gloss2", "cat2"), new Meaning("gloss3", "cat3") }); project.Varieties.AddRange(new[] { new Variety("variety1"), new Variety("variety2"), new Variety("variety3") }); project.Varieties[0].Words.AddRange(new[] { new Word("hɛ.loʊ", project.Meanings[0]), new Word("gʊd", project.Meanings[1]), new Word("kæd", project.Meanings[2]) }); project.Varieties[1].Words.AddRange(new[] { new Word("hɛlp", project.Meanings[0]), new Word("gu.gəl", project.Meanings[1]), new Word("gu.fi", project.Meanings[2]) }); project.Varieties[2].Words.AddRange(new[] { new Word("wɜrd", project.Meanings[0]), new Word("kɑr", project.Meanings[1]), new Word("fʊt.bɔl", project.Meanings[2]) }); projectService.Project.Returns(project); analysisService.SegmentAll(); var varietyPairGenerator = new VarietyPairGenerator(); varietyPairGenerator.Process(project); var wordPairGenerator = new SimpleWordPairGenerator(segmentPool, project, 0.3, ComponentIdentifiers.PrimaryWordAligner); var globalCorrIdentifier = new SoundCorrespondenceIdentifier(segmentPool, project, ComponentIdentifiers.PrimaryWordAligner); foreach (VarietyPair vp in project.VarietyPairs) { wordPairGenerator.Process(vp); foreach (WordPair wp in vp.WordPairs) { wp.PredictedCognacy = true; } vp.CognateSoundCorrespondenceFrequencyDistribution = new ConditionalFrequencyDistribution <SoundContext, Ngram <Segment> >(); vp.CognateSoundCorrespondenceProbabilityDistribution = new ConditionalProbabilityDistribution <SoundContext, Ngram <Segment> >(vp.CognateSoundCorrespondenceFrequencyDistribution, (sc, fd) => new MaxLikelihoodProbabilityDistribution <Ngram <Segment> >(fd)); globalCorrIdentifier.Process(vp); } projectService.AreAllVarietiesCompared.Returns(true); projectService.ProjectOpened += Raise.Event(); WordPairsViewModel observedWordPairs = globalCorrespondences.ObservedWordPairs; observedWordPairs.WordPairsView = new ListCollectionView(observedWordPairs.WordPairs); FindViewModel findViewModel = null; Action closeCallback = null; dialogService.ShowModelessDialog(globalCorrespondences, Arg.Do <FindViewModel>(vm => findViewModel = vm), Arg.Do <Action>(callback => closeCallback = callback)); globalCorrespondences.FindCommand.Execute(null); Assert.That(findViewModel, Is.Not.Null); Assert.That(closeCallback, Is.Not.Null); // already open, shouldn't get opened twice dialogService.ClearReceivedCalls(); globalCorrespondences.FindCommand.Execute(null); dialogService.DidNotReceive().ShowModelessDialog(globalCorrespondences, Arg.Any <FindViewModel>(), Arg.Any <Action>()); // form searches findViewModel.Field = FindField.Form; // no word pairs, no match findViewModel.String = "nothing"; findViewModel.FindNextCommand.Execute(null); Assert.That(observedWordPairs.SelectedWordPairs, Is.Empty); globalCorrespondences.SelectedCorrespondence = globalCorrespondences.Graph.Edges.First(e => e.Source.StrRep == "k" && e.Target.StrRep == "g"); WordPairViewModel[] wordPairsArray = observedWordPairs.WordPairsView.Cast <WordPairViewModel>().ToArray(); // nothing selected, no match findViewModel.String = "nothing"; findViewModel.FindNextCommand.Execute(null); Assert.That(observedWordPairs.SelectedWordPairs, Is.Empty); // nothing selected, matches findViewModel.String = "d"; findViewModel.FindNextCommand.Execute(null); Assert.That(observedWordPairs.SelectedWordPairs, Is.EquivalentTo(wordPairsArray[1].ToEnumerable())); findViewModel.FindNextCommand.Execute(null); Assert.That(observedWordPairs.SelectedWordPairs, Is.EquivalentTo(wordPairsArray[2].ToEnumerable())); findViewModel.FindNextCommand.Execute(null); Assert.That(observedWordPairs.SelectedWordPairs, Is.EquivalentTo(wordPairsArray[2].ToEnumerable())); // first word selected, matches observedWordPairs.SelectedWordPairs.Clear(); observedWordPairs.SelectedWordPairs.Add(wordPairsArray[0]); findViewModel.String = "g"; findViewModel.FindNextCommand.Execute(null); Assert.That(observedWordPairs.SelectedWordPairs, Is.EquivalentTo(wordPairsArray[1].ToEnumerable())); findViewModel.FindNextCommand.Execute(null); Assert.That(observedWordPairs.SelectedWordPairs, Is.EquivalentTo(wordPairsArray[2].ToEnumerable())); findViewModel.FindNextCommand.Execute(null); Assert.That(observedWordPairs.SelectedWordPairs, Is.EquivalentTo(wordPairsArray[0].ToEnumerable())); findViewModel.FindNextCommand.Execute(null); Assert.That(observedWordPairs.SelectedWordPairs, Is.EquivalentTo(wordPairsArray[0].ToEnumerable())); // start search over findViewModel.FindNextCommand.Execute(null); Assert.That(observedWordPairs.SelectedWordPairs, Is.EquivalentTo(wordPairsArray[1].ToEnumerable())); // last word selected, matches observedWordPairs.SelectedWordPairs.Clear(); observedWordPairs.SelectedWordPairs.Add(wordPairsArray[2]); findViewModel.String = "u"; findViewModel.FindNextCommand.Execute(null); Assert.That(observedWordPairs.SelectedWordPairs, Is.EquivalentTo(wordPairsArray[0].ToEnumerable())); findViewModel.FindNextCommand.Execute(null); Assert.That(observedWordPairs.SelectedWordPairs, Is.EquivalentTo(wordPairsArray[2].ToEnumerable())); findViewModel.FindNextCommand.Execute(null); Assert.That(observedWordPairs.SelectedWordPairs, Is.EquivalentTo(wordPairsArray[2].ToEnumerable())); // nothing selected, matches, change selected word observedWordPairs.SelectedWordPairs.Clear(); findViewModel.String = "."; findViewModel.FindNextCommand.Execute(null); Assert.That(observedWordPairs.SelectedWordPairs, Is.EquivalentTo(wordPairsArray[0].ToEnumerable())); findViewModel.FindNextCommand.Execute(null); Assert.That(observedWordPairs.SelectedWordPairs, Is.EquivalentTo(wordPairsArray[2].ToEnumerable())); observedWordPairs.SelectedWordPairs.Clear(); observedWordPairs.SelectedWordPairs.Add(wordPairsArray[1]); findViewModel.FindNextCommand.Execute(null); Assert.That(observedWordPairs.SelectedWordPairs, Is.EquivalentTo(wordPairsArray[2].ToEnumerable())); findViewModel.FindNextCommand.Execute(null); Assert.That(observedWordPairs.SelectedWordPairs, Is.EquivalentTo(wordPairsArray[0].ToEnumerable())); findViewModel.FindNextCommand.Execute(null); Assert.That(observedWordPairs.SelectedWordPairs, Is.EquivalentTo(wordPairsArray[0].ToEnumerable())); // gloss searches findViewModel.Field = FindField.Gloss; findViewModel.String = "gloss2"; findViewModel.FindNextCommand.Execute(null); Assert.That(observedWordPairs.SelectedWordPairs, Is.EquivalentTo(wordPairsArray[1].ToEnumerable())); findViewModel.FindNextCommand.Execute(null); Assert.That(observedWordPairs.SelectedWordPairs, Is.EquivalentTo(wordPairsArray[0].ToEnumerable())); findViewModel.FindNextCommand.Execute(null); Assert.That(observedWordPairs.SelectedWordPairs, Is.EquivalentTo(wordPairsArray[0].ToEnumerable())); }