public static SuffixTree Create(string word, char canonizationChar = '$') { var tree = new SuffixTree(word); tree.Build(canonizationChar); return(tree); }
public void Contains_Simple_OnLongString_ShouldReturnTrue() { var s = "olbafuynhfcxzqhnebecxjrfwfttwrxvgujqxaxuaukbflddcrptlvyoaxuwzlwmoeljnxgmsleapkyzodhtymxuvlchoomsuodicehnzyebqtgsqeplinthhnalituxrisknsyjszuaatwoulznpjbvjmhytqgaqmctqvwgxailhproehwctldlagpjqaawdbialginqmweqrcopiqfnludmjuxkqlsgrydzyhecoojgmspowoykgghnbudhujnmyhqxbkfggxxprgfhraksfylcveevxvlxpzxkcqtkchasarbusvqzimvvfsvredhjykpqyyysyxbzwsuqahpjcroqvhysaynfheehppinszvwmyqlmymyqngrqzuefojczpoqcgbkvkmfpipdoetqxtdigphjhkxuwzieqirlvapypdysohfydtxzppfuufcreorhpsyydvvvsproofmuucwqqtskzieegstlokqkvjbssfythoenpbhlhnnsgknlapaigdwvrvsnyrhxhuzqkzoakldexmvnuvqscxmrysnuumawqrldjbtbmnhytvmmyykdaxuvqifecczafafzewmuplebvkxseatwsxwatbszboybwzhgfdtsjpxckknalqvgwuwwretocfaphnyuoyvnxbtabosfewkfrlbbeiduuidlogxfdacbplkbkpljvthltjjrlxbtejpdqjddnnsfhsljjfvmsjigyxmhjeqfcmmzzqpsxmnkuwlhhvcrtxskfmyieoctweswpkplcnjiqmtjjdloobapntxqmducnkabjcutinyhhekioybfokektjerdojqfvyalkvpqsznlvqvrswhelvburtkzdcceqehyqndhlcvkbieceazmuanqiauhkyhcbcckeydaevunddkwlntezctepnfrchvquxgtsnupoiwneengszjggwxkmahlbiwzsbyryqasufdsaaigulgwjqepccwesmbcfpoymrsjrbqwzjpjmbexpjloxdtwxqbdmggreurdcohfpgbchhrthdopewrsyfindsvrexpkkooxkmzxklsalyfuxscwthbfdbeghnpowbjxcedzogidsrdnjimcybbxmwpdiwnihhgylpsbukpsjtbkktylouakffurdfmpsnndtjcvjkbviezyqdgvhdcllibfbniafffwebrmyvbryjnomzgiglecxjntcvcrngwrvhefqaswhpynyzqwdpvewmjlpndtihwebjqolymkytrtidajqrdyvqzhcsvlvfvqspskkttqjsotdqkcdwzmdxxuevpvcrsijxskruaajrqaqgcarbxfrwerhddeetidequujlxmyaaoriomkhdmqaitbzbvhmnhmuntueqwueagpomwdhturmpwkyszjiwwlucqbhqbxgibuqmghvlrrbypswfsxkhgwjcndjnqblxargeegkzmhlahbahsfecevnpbxqdbuamjffddctbcedlcptoynjiuypvbgeatatnxztxsxvjrihxmoeeqmghwxxdyzrczljthnteqrfrquhvlssswndmdwxcfzrhcszffqdnjmqyjnywrurbsyavdxcwwtjsttcbsnvrpgiqlswqdcqmxjxwoebxjwlhlxbjuxuacdwktlivrfmncnqosxecfccutmikgwkeprlrkdfcinqgeeeompsmpcvxvnopzmrnuvdljcxjurxmliveisyfqsnpxsokkefgdujosxckvrkgeavugntchvztxkdqeiwyluxxgptyuuligmgfjcwcynffbgysjewlaaglqjuujjxytrphnfwncbkgkwswhcvliseqyifouatvszslptxqnhawzjhgfyorphndgksqdeoqohsqvwctwofrvqqpsnfisbcpluhesurrihkxvpugeitmatignbqqqldkdwqzaggxmitqlzobbuqccoeddmsdtjvywnbiiwkbidkjrofmbxjlnzfryzgxjbwgiaxbahchovroigmraoofyuzqheonmrfpskgciitjtxjzbhlpsohvysrwdwviirlxpvemizykpykhipjwhmqxoiwtevhyddyrigooibzrshqmbypvthubgozvhinzmntadmkfplledvglacrbeghcofvsddhokjhyfcqwwhbwjlkafilmaezpwezzgzgajpxhxcgwmcieilzlfrsxjlagjbjryhbrznmsfushtydgfsizclunncsbzpktmkmhmacicjuqhqaozwtihtcokd"; var t = s.Substring(s.Length / 2, s.Length / 50); var st = SuffixTree.Build(s); Assert.IsTrue(st.Contains(t)); }
public void Contains_OnNonRepeated_ShouldReturnFalse() { var s = "abcdefghijklmnpqrst"; var t = "rstb"; var st = SuffixTree.Build(s); Assert.IsFalse(st.Contains(t)); }
public void Contains_OnNonRepeated_ShouldReturnTrue() { var s = "abcdefghijklmnpqrst"; var t = s.Substring(3, 6); var st = SuffixTree.Build(s); Assert.IsTrue(st.Contains(t)); }
public void Contains_InShortRandomString_ShouldReturnTrue() { const int CYCLES = 2000, STRLEN = 200, MATCHLEN = 20; var r = new Random(); for (int i = 0; i < CYCLES; i++) { var s = MakeRandomString(STRLEN); var ss = s.Substring(r.Next(0, s.Length - MATCHLEN), MATCHLEN); var res = false; try { res = SuffixTree.Build(s).Contains(ss); } catch (Exception e) { throw new Exception($"\nString: \n{s}, \nSubstring: \n{ss}, Error message: {e.Message}", e); } Assert.IsTrue(res, $"\nString: \n{s}, \nSubstring: \n{ss}"); } string MakeRandomString(int len) { const string SET = "abcdefghijklmnopqrstuvwxyz"; var res = new char[len]; while (len-- > 0) { res[len] = SET[r.Next(SET.Length)]; } return(new string(res)); } }
public void Build_ExpectsCorrectTree() { string text = "banana"; SuffixTreeNode root = SuffixTree.Build(text); CheckSuffixTreeProperties(root, text); Assert.IsTrue(root.IsRoot); Assert.IsFalse(root.IsLeaf); Assert.IsFalse(root.IsIntermediate); Assert.AreEqual(string.Empty, root.StringValue); Assert.AreEqual(-1, root.StartIndex); Assert.AreEqual(3, root.Children.Count); SuffixTreeNode rootChild1 = root.Children[0]; /* a */ SuffixTreeNode rootChild2 = root.Children[1]; /* na */ SuffixTreeNode rootChild3 = root.Children[2]; /* banana$ */ Assert.IsTrue(rootChild1.IsIntermediate); Assert.IsFalse(rootChild1.IsRoot); Assert.IsFalse(rootChild1.IsLeaf); Assert.AreEqual("a", rootChild1.StringValue); Assert.AreEqual(-1, rootChild1.StartIndex); Assert.AreEqual(2, rootChild1.Children.Count); SuffixTreeNode childA1 = rootChild1.Children[0]; /* $ */ SuffixTreeNode childA2 = rootChild1.Children[1]; /* na */ Assert.IsFalse(childA1.IsIntermediate); Assert.IsFalse(childA1.IsRoot); Assert.IsTrue(childA1.IsLeaf); Assert.AreEqual("$", childA1.StringValue); Assert.AreEqual(5, childA1.StartIndex); Assert.AreEqual(0, childA1.Children.Count); Assert.IsTrue(childA2.IsIntermediate); Assert.IsFalse(childA2.IsRoot); Assert.IsFalse(childA2.IsLeaf); Assert.AreEqual("na", childA2.StringValue); Assert.AreEqual(-1, childA2.StartIndex); Assert.AreEqual(2, childA2.Children.Count); SuffixTreeNode childA2NA1 = childA2.Children[0]; /* $ */ SuffixTreeNode childA2NA2 = childA2.Children[1]; /* na$ */ Assert.IsFalse(childA2NA1.IsIntermediate); Assert.IsFalse(childA2NA1.IsRoot); Assert.IsTrue(childA2NA1.IsLeaf); Assert.AreEqual("$", childA2NA1.StringValue); Assert.AreEqual(3, childA2NA1.StartIndex); Assert.AreEqual(0, childA2NA1.Children.Count); Assert.IsFalse(childA2NA2.IsIntermediate); Assert.IsFalse(childA2NA2.IsRoot); Assert.IsTrue(childA2NA2.IsLeaf); Assert.AreEqual("na$", childA2NA2.StringValue); Assert.AreEqual(1, childA2NA2.StartIndex); Assert.AreEqual(0, childA2NA2.Children.Count); Assert.IsTrue(rootChild2.IsIntermediate); Assert.IsFalse(rootChild2.IsRoot); Assert.IsFalse(rootChild2.IsLeaf); Assert.AreEqual("na", rootChild2.StringValue); Assert.AreEqual(-1, rootChild2.StartIndex); Assert.AreEqual(2, rootChild2.Children.Count); SuffixTreeNode childNA1 = rootChild2.Children[0]; /* $ */ SuffixTreeNode childNA2 = rootChild2.Children[1]; /* na$ */ Assert.IsFalse(childNA1.IsIntermediate); Assert.IsFalse(childNA1.IsRoot); Assert.IsTrue(childNA1.IsLeaf); Assert.AreEqual("$", childNA1.StringValue); Assert.AreEqual(4, childNA1.StartIndex); Assert.AreEqual(0, childNA1.Children.Count); Assert.IsFalse(childNA2.IsIntermediate); Assert.IsFalse(childNA2.IsRoot); Assert.IsTrue(childNA2.IsLeaf); Assert.AreEqual("na$", childNA2.StringValue); Assert.AreEqual(2, childNA2.StartIndex); Assert.AreEqual(0, childNA2.Children.Count); Assert.IsFalse(rootChild3.IsIntermediate); Assert.IsFalse(rootChild3.IsRoot); Assert.IsTrue(rootChild3.IsLeaf); Assert.AreEqual("banana$", rootChild3.StringValue); Assert.AreEqual(0, rootChild3.StartIndex); Assert.AreEqual(0, rootChild3.Children.Count); }
public void Build_ShouldNotThrow(string treeContent) { Assert.DoesNotThrow( () => SuffixTree.Build(treeContent) ); }