github.com/m10x/go/src@v0.0.0-20220112094212-ba61592315da/strings/search_test.go (about)

     1  // Copyright 2012 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package strings_test
     6  
     7  import (
     8  	"reflect"
     9  	. "strings"
    10  	"testing"
    11  )
    12  
    13  func TestFinderNext(t *testing.T) {
    14  	testCases := []struct {
    15  		pat, text string
    16  		index     int
    17  	}{
    18  		{"", "", 0},
    19  		{"", "abc", 0},
    20  		{"abc", "", -1},
    21  		{"abc", "abc", 0},
    22  		{"d", "abcdefg", 3},
    23  		{"nan", "banana", 2},
    24  		{"pan", "anpanman", 2},
    25  		{"nnaaman", "anpanmanam", -1},
    26  		{"abcd", "abc", -1},
    27  		{"abcd", "bcd", -1},
    28  		{"bcd", "abcd", 1},
    29  		{"abc", "acca", -1},
    30  		{"aa", "aaa", 0},
    31  		{"baa", "aaaaa", -1},
    32  		{"at that", "which finally halts.  at that point", 22},
    33  	}
    34  
    35  	for _, tc := range testCases {
    36  		got := StringFind(tc.pat, tc.text)
    37  		want := tc.index
    38  		if got != want {
    39  			t.Errorf("stringFind(%q, %q) got %d, want %d\n", tc.pat, tc.text, got, want)
    40  		}
    41  	}
    42  }
    43  
    44  func TestFinderCreation(t *testing.T) {
    45  	testCases := []struct {
    46  		pattern string
    47  		bad     [256]int
    48  		suf     []int
    49  	}{
    50  		{
    51  			"abc",
    52  			[256]int{'a': 2, 'b': 1, 'c': 3},
    53  			[]int{5, 4, 1},
    54  		},
    55  		{
    56  			"mississi",
    57  			[256]int{'i': 3, 'm': 7, 's': 1},
    58  			[]int{15, 14, 13, 7, 11, 10, 7, 1},
    59  		},
    60  		// From https://www.cs.utexas.edu/~moore/publications/fstrpos.pdf
    61  		{
    62  			"abcxxxabc",
    63  			[256]int{'a': 2, 'b': 1, 'c': 6, 'x': 3},
    64  			[]int{14, 13, 12, 11, 10, 9, 11, 10, 1},
    65  		},
    66  		{
    67  			"abyxcdeyx",
    68  			[256]int{'a': 8, 'b': 7, 'c': 4, 'd': 3, 'e': 2, 'y': 1, 'x': 5},
    69  			[]int{17, 16, 15, 14, 13, 12, 7, 10, 1},
    70  		},
    71  	}
    72  
    73  	for _, tc := range testCases {
    74  		bad, good := DumpTables(tc.pattern)
    75  
    76  		for i, got := range bad {
    77  			want := tc.bad[i]
    78  			if want == 0 {
    79  				want = len(tc.pattern)
    80  			}
    81  			if got != want {
    82  				t.Errorf("boyerMoore(%q) bad['%c']: got %d want %d", tc.pattern, i, got, want)
    83  			}
    84  		}
    85  
    86  		if !reflect.DeepEqual(good, tc.suf) {
    87  			t.Errorf("boyerMoore(%q) got %v want %v", tc.pattern, good, tc.suf)
    88  		}
    89  	}
    90  }