public VarietyPairsViewModel(IProjectService projectService, IBusyService busyService, IDialogService dialogService, IExportService exportService, IAnalysisService analysisService, VarietyPairViewModel.Factory varietyPairFactory) : base("Variety Pairs") { _projectService = projectService; _busyService = busyService; _dialogService = dialogService; _exportService = exportService; _analysisService = analysisService; _varietyPairFactory = varietyPairFactory; _projectService.ProjectOpened += _projectService_ProjectOpened; _sortPropertyName = "PhoneticSimilarityScore"; _sortDirection = ListSortDirection.Descending; Messenger.Default.Register <PerformingComparisonMessage>(this, msg => { if (msg.VarietyPair == null) { ClearComparison(); } }); Messenger.Default.Register <ComparisonPerformedMessage>(this, msg => { if (msg.VarietyPair == null) { SetSelectedVarietyPair(); } }); Messenger.Default.Register <DomainModelChangedMessage>(this, msg => { if (msg.AffectsComparison) { ClearComparison(); } }); Messenger.Default.Register <SwitchViewMessage>(this, HandleSwitchView); _findCommand = new RelayCommand(Find); _performComparisonCommand = new RelayCommand(PerformComparison); _selectedWordPairsMonitor = new SimpleMonitor(); _varietyPairState = VarietyPairState.NotSelected; TaskAreas.Add(new TaskAreaItemsViewModel("Common tasks", new TaskAreaCommandViewModel("Compare variety pair", new RelayCommand(PerformComparison, CanPerformComparison)), new TaskAreaCommandViewModel("Find words", _findCommand), new TaskAreaItemsViewModel("Sort word pairs by", new TaskAreaCommandGroupViewModel( new TaskAreaCommandViewModel("Similarity", new RelayCommand(() => SortWordPairsBy("PhoneticSimilarityScore", ListSortDirection.Descending))), new TaskAreaCommandViewModel("Gloss", new RelayCommand(() => SortWordPairsBy("Meaning.Gloss", ListSortDirection.Ascending))))))); TaskAreas.Add(new TaskAreaItemsViewModel("Other tasks", new TaskAreaCommandViewModel("Export results for variety pair", new RelayCommand(ExportVarietyPair, CanExportVarietyPair)))); }
public VarietyPairsViewModel(IProjectService projectService, IBusyService busyService, IDialogService dialogService, IExportService exportService, IAnalysisService analysisService, VarietyPairViewModel.Factory varietyPairFactory) : base("Variety Pairs") { _projectService = projectService; _busyService = busyService; _dialogService = dialogService; _exportService = exportService; _analysisService = analysisService; _varietyPairFactory = varietyPairFactory; _projectService.ProjectOpened += _projectService_ProjectOpened; _sortPropertyName = "PhoneticSimilarityScore"; _sortDirection = ListSortDirection.Descending; Messenger.Default.Register<PerformingComparisonMessage>(this, msg => { if (msg.VarietyPair == null) ClearComparison(); }); Messenger.Default.Register<ComparisonPerformedMessage>(this, msg => { if (msg.VarietyPair == null) SetSelectedVarietyPair(); }); Messenger.Default.Register<DomainModelChangedMessage>(this, msg => { if (msg.AffectsComparison) ClearComparison(); }); Messenger.Default.Register<SwitchViewMessage>(this, HandleSwitchView); _findCommand = new RelayCommand(Find); _performComparisonCommand = new RelayCommand(PerformComparison); _selectedWordPairsMonitor = new SimpleMonitor(); _varietyPairState = VarietyPairState.NotSelected; TaskAreas.Add(new TaskAreaItemsViewModel("Common tasks", new TaskAreaCommandViewModel("Compare variety pair", new RelayCommand(PerformComparison, CanPerformComparison)), new TaskAreaCommandViewModel("Find words", _findCommand), new TaskAreaItemsViewModel("Sort word pairs by", new TaskAreaCommandGroupViewModel( new TaskAreaCommandViewModel("Similarity", new RelayCommand(() => SortWordPairsBy("PhoneticSimilarityScore", ListSortDirection.Descending))), new TaskAreaCommandViewModel("Gloss", new RelayCommand(() => SortWordPairsBy("Meaning.Gloss", ListSortDirection.Ascending))))))); TaskAreas.Add(new TaskAreaItemsViewModel("Other tasks", new TaskAreaCommandViewModel("Export results for variety pair", new RelayCommand(ExportVarietyPair, CanExportVarietyPair)))); }
public TestEnvironment() { DispatcherHelper.Initialize(); _segmentPool = new SegmentPool(); _projectService = Substitute.For <IProjectService>(); _dialogService = Substitute.For <IDialogService>(); var busyService = Substitute.For <IBusyService>(); var exportService = Substitute.For <IExportService>(); _analysisService = new AnalysisService(_segmentPool, _projectService, _dialogService, busyService); WordPairsViewModel.Factory wordPairsFactory = () => new WordPairsViewModel(busyService); WordPairViewModel.Factory wordPairFactory = (pair, order) => new WordPairViewModel(_projectService, _analysisService, pair, order); VarietyPairViewModel.Factory varietyPairFactory = (vp, order) => new VarietyPairViewModel(_segmentPool, _projectService, wordPairsFactory, wordPairFactory, vp, order); _varietyPairs = new VarietyPairsViewModel(_projectService, busyService, _dialogService, exportService, _analysisService, varietyPairFactory); _project = TestHelpers.GetTestProject(_segmentPool); _projectService.Project.Returns(_project); }
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 Varieties() { 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); projectService.Project.Returns(project); projectService.ProjectOpened += Raise.Event(); varietyPairs.VarietiesView1 = new ListCollectionView(varietyPairs.Varieties); varietyPairs.VarietiesView2 = new ListCollectionView(varietyPairs.Varieties); Assert.That(varietyPairs.Varieties, Is.Empty); Assert.That(varietyPairs.VarietyPairState, Is.EqualTo(VarietyPairState.NotSelected)); Assert.That(varietyPairs.SelectedVariety1, Is.Null); Assert.That(varietyPairs.SelectedVariety2, Is.Null); Assert.That(varietyPairs.SelectedVarietyPair, Is.Null); 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]) }); analysisService.SegmentAll(); Messenger.Default.Send(new DomainModelChangedMessage(true)); Assert.That(varietyPairs.VarietyPairState, Is.EqualTo(VarietyPairState.SelectedAndNotCompared)); Assert.That(varietyPairs.SelectedVariety1, Is.EqualTo(varietyPairs.VarietiesView1.Cast <VarietyViewModel>().First())); Assert.That(varietyPairs.SelectedVariety2, Is.EqualTo(varietyPairs.VarietiesView2.Cast <VarietyViewModel>().ElementAt(1))); Assert.That(varietyPairs.SelectedVarietyPair, Is.Null); Messenger.Default.Send(new PerformingComparisonMessage()); 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)); } Messenger.Default.Send(new ComparisonPerformedMessage()); Assert.That(varietyPairs.VarietyPairState, Is.EqualTo(VarietyPairState.SelectedAndCompared)); Assert.That(varietyPairs.SelectedVarietyPair, Is.Not.Null); Assert.That(varietyPairs.SelectedVarietyPair.AreVarietiesInOrder, Is.True); VarietyViewModel temp = varietyPairs.SelectedVariety2; varietyPairs.SelectedVariety2 = varietyPairs.SelectedVariety1; varietyPairs.SelectedVariety1 = temp; Assert.That(varietyPairs.VarietyPairState, Is.EqualTo(VarietyPairState.SelectedAndCompared)); Assert.That(varietyPairs.SelectedVarietyPair, Is.Not.Null); Assert.That(varietyPairs.SelectedVarietyPair.AreVarietiesInOrder, Is.False); Messenger.Default.Send(new DomainModelChangedMessage(true)); Assert.That(varietyPairs.VarietyPairState, Is.EqualTo(VarietyPairState.SelectedAndNotCompared)); project.Varieties.RemoveRangeAt(0, 2); Messenger.Default.Send(new DomainModelChangedMessage(true)); Assert.That(varietyPairs.VarietyPairState, Is.EqualTo(VarietyPairState.NotSelected)); Assert.That(varietyPairs.SelectedVariety1, Is.EqualTo(varietyPairs.VarietiesView1.Cast <VarietyViewModel>().First())); Assert.That(varietyPairs.SelectedVariety2, Is.EqualTo(varietyPairs.VarietiesView2.Cast <VarietyViewModel>().First())); }
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())); }