func AhoCorasickReaderSpec(c gospec.Context) { c.Specify("Basic test", func() { strs := [][]byte{ []byte("baa"), []byte("anba"), []byte("banana"), } acd := core.AhoCorasickPreprocess(strs) str := "baababanananba" res := core.AhoCorasickFromReader(acd, bytes.NewBuffer([]byte(str)), 2) c.Expect(res[0], ContainsExactly, []int{0}) c.Expect(res[1], ContainsExactly, []int{10}) c.Expect(res[2], ContainsExactly, []int{5}) }) c.Specify("Substrings test", func() { strs := [][]byte{ []byte("baa"), []byte("aab"), []byte("aaa"), []byte("aa"), } acd := core.AhoCorasickPreprocess(strs) str := "abbaababbbbaaaaaabbbbaabaabaabbb" res := core.AhoCorasickFromReader(acd, bytes.NewBuffer([]byte(str)), 2) c.Expect(res[0], ContainsExactly, []int{2, 10, 20, 23, 26}) c.Expect(res[1], ContainsExactly, []int{3, 15, 21, 24, 27}) c.Expect(res[2], ContainsExactly, []int{11, 12, 13, 14}) c.Expect(res[3], ContainsExactly, []int{3, 11, 12, 13, 14, 15, 21, 24, 27}) }) c.Specify("Comprehensive 12 x 2^3 x 2^9 test", func() { for buf_size := 1; buf_size <= 12; buf_size++ { var ps [][]byte b := make([]byte, 3) for augment(b, 2) { p := make([]byte, 3) copy(p, b) ps = append(ps, p) } t := make([]byte, 9) for augment(t, 2) { acd := core.AhoCorasickPreprocess(ps) acres := core.AhoCorasickFromReader(acd, bytes.NewBuffer(t), buf_size) ires := idiotAhoCorasick(ps, t) for i := range ps { c.Expect(acres[i], ContainsExactly, ires[i]) } } } }) }
// Like In(), but searches the data from a Reader instead of a []byte. func (sf *StringSetFinder) InReader(input io.Reader) map[int][]int { return core.AhoCorasickFromReader(sf.acd, input, 100000) }