public void CacheSortPoaAscTest()
        {
            AddWords("fib bit ebay bitter drillbit abdiging", "cvc cvc vcvc cvccvc ccvcccvc vccvcvcc");
            _sortOptions.SortType = PhoneticSortType.POA;
            _sortOptions.SetPrimarySortField(_phoneticField, false, kAscending);
            _cache.Sort(_sortOptions);

            Assert.AreEqual(6, _cache.Count);

            string[] words = { "bit", "bitter", "drillbit", "fib", "ebay", "abdiging" };             // expected answer
            for (int i = 0; i < _cache.Count; i++)
            {
                Assert.AreEqual(words[i], _cache[i].WordCacheEntry["Phonetic"]);
            }
        }
        public void AdvancedPOASortTest1()
        {
            AddWords("mappu sippu", null);
            _query.Pattern = "p/*_*";
            WordListCache cache = App.Search(_query);

            Assert.IsNotNull(cache);

            _sortOptions.SortType        = PhoneticSortType.POA;
            _sortOptions.AdvancedEnabled = true;
            _sortOptions.AdvSortOrder    = new[] { 1, 0, 2 };
            _sortOptions.AdvRlOptions    = new[] { true, false, false };
            _sortOptions.SetPrimarySortField(_phoneticField, false, kAscending);
            cache.Sort(_sortOptions);

            Assert.AreEqual(4, cache.Count);
            Assert.AreEqual("sippu", cache[0].PhoneticValue);
            Assert.AreEqual(3, cache[0].SearchItemOffset);
            Assert.AreEqual("mappu", cache[1].PhoneticValue);
            Assert.AreEqual(3, cache[1].SearchItemOffset);
            Assert.AreEqual("sippu", cache[2].PhoneticValue);
            Assert.AreEqual(2, cache[2].SearchItemOffset);
            Assert.AreEqual("mappu", cache[3].PhoneticValue);
            Assert.AreEqual(2, cache[3].SearchItemOffset);
        }
        public void CacheSortCvcAscPoaDescTest()
        {
            AddWords("fib bit dig ebay bitter digger drillbit abdiging",
                     "cvc cvc cvc vcvv cvccvc cvccvc ccvcccvc vccvcvcc");
            _query.Pattern = "b/*_*";
            WordListCache cache = App.Search(_query);

            _sortOptions.SortType        = PhoneticSortType.POA;
            _sortOptions.AdvancedEnabled = true;
            _sortOptions.SetPrimarySortField(_phoneticField, false, kDescending);      // 2nd sort
            _sortOptions.SetPrimarySortField(_cvField, false, kAscending);             // 1st sort
            cache.Sort(_sortOptions);

            System.Diagnostics.Debug.WriteLine("b = " + _prj.PhoneCache["b"].POAKey);
            System.Diagnostics.Debug.WriteLine("f = " + _prj.PhoneCache["f"].POAKey);
            System.Diagnostics.Debug.WriteLine("t = " + _prj.PhoneCache["t"].POAKey);
            System.Diagnostics.Debug.WriteLine("d = " + _prj.PhoneCache["d"].POAKey);
            System.Diagnostics.Debug.WriteLine("n = " + _prj.PhoneCache["n"].POAKey);
            System.Diagnostics.Debug.WriteLine("r = " + _prj.PhoneCache["r"].POAKey);
            System.Diagnostics.Debug.WriteLine("l = " + _prj.PhoneCache["l"].POAKey);
            System.Diagnostics.Debug.WriteLine("g = " + _prj.PhoneCache["g"].POAKey);
            System.Diagnostics.Debug.WriteLine("i = " + _prj.PhoneCache["i"].POAKey);
            System.Diagnostics.Debug.WriteLine("e = " + _prj.PhoneCache["e"].POAKey);
            System.Diagnostics.Debug.WriteLine("a = " + _prj.PhoneCache["a"].POAKey);
            System.Diagnostics.Debug.WriteLine("y = " + _prj.PhoneCache["y"].POAKey);

            Assert.AreEqual(6, cache.Count);
            Assert.AreEqual("drillbit", cache[0].WordCacheEntry["Phonetic"]);
            Assert.AreEqual("fib", cache[1].WordCacheEntry["Phonetic"]);
            Assert.AreEqual("bit", cache[2].WordCacheEntry["Phonetic"]);
            Assert.AreEqual("bitter", cache[3].WordCacheEntry["Phonetic"]);
            Assert.AreEqual("abdiging", cache[4].WordCacheEntry["Phonetic"]);
            Assert.AreEqual("ebay", cache[5].WordCacheEntry["Phonetic"]);
        }
        /// ------------------------------------------------------------------------------------
        private WordListCache GetCIEResults(CIEOptions options)
        {
            var sortOptions = new SortOptions(true, _prj)
            {
                AdvancedEnabled = true
            };

            if (options.Type != CIEOptions.IdenticalType.After)
            {
                sortOptions.AdvSortOrder = new[] { 0, 1, 2 }
            }
            ;
            else
            {
                sortOptions.AdvSortOrder    = new[] { 2, 1, 0 };
                sortOptions.AdvRlOptions[2] = true;
            }

            _cache.Sort(sortOptions);

            sortOptions = new SortOptions(true, _prj)
            {
                AdvancedEnabled = true
            };
            return(new CIEBuilder(_cache, sortOptions, options).FindMinimalPairs());
        }
        /// ------------------------------------------------------------------------------------
        /// <summary>
        /// Use a special sort to make sure the reference fields for word list cache entries
        /// that come from audio files are taken from the word list cache entries and not the
        /// record cache entries that own the word list entries.
        /// </summary>
        /// ------------------------------------------------------------------------------------
        protected bool OnSortCache(object args)
        {
            object[] argArray = args as object[];
            if (argArray == null || argArray.Length < 2)
            {
                return(false);
            }

            WordListCache wcache      = argArray[0] as WordListCache;
            SortOptions   sortOptions = argArray[1] as SortOptions;

            if (wcache == null || sortOptions == null)
            {
                return(false);
            }

            wcache.Sort(new SACacheSortComparer(sortOptions));
            return(true);
        }
        public void CacheSortCvcDescMoaAscTest()
        {
            AddWords("fib bit dig ebay bitter digger drillbit abdiging",
                     "cvc cvc cvc vcvc cvccvc cvccvc ccvcccvc vccvcvcc");
            _query.Pattern = "b/*_*";
            WordListCache cache = App.Search(_query);

            _sortOptions.SortType = PhoneticSortType.MOA;
            _sortOptions.SetPrimarySortField(_phoneticField, false, kAscending);        // 2nd sort
            _sortOptions.SetPrimarySortField(_cvField, false, kDescending);             // 1st sort
            cache.Sort(_sortOptions);

            Assert.AreEqual(6, cache.Count);
            string[] words = { "ebay", "abdiging", "bitter", "fib", "bit", "drillbit" };             // expected answer
            for (int i = 0; i < cache.Count; i++)
            {
                Assert.AreEqual(words[i], cache[i].WordCacheEntry["Phonetic"]);
            }
        }
        public void CacheAdvSortMoaDescTest()
        {
            AddWords("rabbit bir fib bit dig ebay bitter digger drillbit abdiging",
                     "cvccvc cvc cvc cvc cvc vcvc cvccvc cvccvc ccvcccvc vccvcvcc");
            _query.Pattern = "bi/*_*";
            WordListCache cache = App.Search(_query);

            _sortOptions.SortType        = PhoneticSortType.MOA;
            _sortOptions.AdvancedEnabled = true;
            _sortOptions.AdvSortOrder    = new[] { 0, 2, 1 };
            _sortOptions.AdvRlOptions    = new[] { true, true, true };
            _sortOptions.SetPrimarySortField(_phoneticField, false, kDescending);
            cache.Sort(_sortOptions);

            Assert.AreEqual(5, cache.Count);
            string[] words = { "rabbit", "drillbit", "bit", "bitter", "bir" };             // expected answer
            for (int i = 0; i < cache.Count; i++)
            {
                Assert.AreEqual(words[i], cache[i].WordCacheEntry["Phonetic"]);
            }
        }
        public void SimplePOASortTest1()
        {
            AddWords("b\u0324it bag", null);
            var cache = new WordListCache();

            foreach (var entry in _recCache.WordCache)
            {
                cache.Add(entry);
            }

            Assert.IsNotNull(cache);

            _sortOptions.SortType        = PhoneticSortType.POA;
            _sortOptions.AdvancedEnabled = false;
            _sortOptions.SetPrimarySortField(_phoneticField, false, kAscending);
            cache.Sort(_sortOptions);

            Assert.AreEqual(2, cache.Count);
            Assert.AreEqual("bag", cache[0].WordCacheEntry["Phonetic"]);
            Assert.AreEqual("b\u0324it", cache[1].WordCacheEntry["Phonetic"]);
        }
        public void CacheAdvSortPoaRLTest()
        {
            AddWords("pig big p\u02B0ig", null);
            _query.Pattern = "[V]/*_*";
            WordListCache cache = App.Search(_query);

            Assert.IsNotNull(cache);

            _sortOptions.SortType        = PhoneticSortType.POA;
            _sortOptions.AdvancedEnabled = true;
            _sortOptions.AdvSortOrder    = new[] { 1, 0, 2 };
            _sortOptions.AdvRlOptions    = new[] { true, false, false };
            _sortOptions.SetPrimarySortField(_phoneticField, false, kAscending);
            cache.Sort(_sortOptions);

            Assert.AreEqual(3, cache.Count);
            string[] words = { "pig", "p\u02B0ig", "big" };             // expected answer
            for (int i = 0; i < cache.Count; i++)
            {
                Assert.AreEqual(words[i], cache[i].WordCacheEntry["Phonetic"]);
            }
        }
        public void CacheAdvSortCvcAscPoaDescTest()
        {
            AddWords("pig fib bit dig ebay bitter digger drillbit abdiging",
                     "cvc cvc cvc cvc vcvc cvccvc cvccvc ccvcccvc vccvcvcc");
            _query.Pattern = "i/*_*";
            WordListCache cache = App.Search(_query);

            _sortOptions.SortType        = PhoneticSortType.POA;
            _sortOptions.AdvancedEnabled = true;
            _sortOptions.AdvSortOrder    = new[] { 2, 0, 1 };
            _sortOptions.AdvRlOptions    = new[] { true, false, true };
            _sortOptions.SetPrimarySortField(_phoneticField, false, kDescending);      // 2nd sort
            _sortOptions.SetPrimarySortField(_cvField, false, kAscending);             // 1st sort
            cache.Sort(_sortOptions);

            Assert.AreEqual(10, cache.Count);
            // Expected answer
            string[] words = { "drillbit", "drillbit", "dig", "pig", "bit", "fib", "digger", "bitter", "abdiging", "abdiging" };
            for (int i = 0; i < cache.Count; i++)
            {
                Assert.AreEqual(words[i], cache[i].WordCacheEntry["Phonetic"]);
            }
        }
        /// ------------------------------------------------------------------------------------
        public WordListCache FindMinimalPairs()
        {
            if (Cache == null || !Cache.IsForSearchResults)
            {
                return(null);
            }

            foreach (var entry in Cache)
            {
                entry.CIEGroupId = -1;
            }

            // First, send a message to see if there is an AddOn to find minimal pairs. If so,
            // then return the cache it generated instead of the one built by this method.
            object args = this;

            if (App.MsgMediator.SendMessage("FindMinimalPairsAlternate", args))
            {
                if (args is WordListCache)
                {
                    return(args as WordListCache);
                }
            }

            var cieGroups = new Dictionary <string, List <WordListCacheEntry> >();
            var noDups    = new HashSet <string>();

            foreach (var entry in Cache)
            {
                string pattern = GetCIEPattern(entry, _cieOptions);

                List <WordListCacheEntry> entryList;
                if (!cieGroups.TryGetValue(pattern, out entryList))
                {
                    entryList          = new List <WordListCacheEntry>();
                    cieGroups[pattern] = entryList;
                }

                var setItem = pattern + "+" + entry.SearchItem;

                if (!noDups.Contains(setItem))
                {
                    noDups.Add(setItem);
                    entryList.Add(entry);
                }
            }
            noDups.Clear();

            // The groups are not guaranteed to be in any particular order, just the words within groups.
            // TODO: Sort groups by POA, or MOA, based on what's specified in _sortOptions.

            // Create a new cache which is the subset containing minimal pair entries.
            int cieGroupId    = 0;
            var cieGroupTexts = new SortedList <int, string>();
            var cieCache      = new WordListCache();

            foreach (var grp in cieGroups.Where(g => g.Value.Count >= 2))
            {
                foreach (var entry in grp.Value)
                {
                    entry.CIEGroupId = cieGroupId;
                    cieCache.Add(entry);
                }

                cieGroupTexts[cieGroupId++] = grp.Key;
            }

            cieCache.IsMinimalPair      = true;
            cieCache.CIEGroupTexts      = cieGroupTexts;
            cieCache.IsForSearchResults = true;
            cieCache.Sort(_sortOptions);
            cieCache.SearchQuery = Cache.SearchQuery.Clone();
            return(cieCache);
        }