github.com/hirochachacha/plua@v0.0.0-20170217012138-c82f520cc725/internal/pattern/pattern_test.go (about)

     1  package pattern
     2  
     3  import (
     4  	"reflect"
     5  	"testing"
     6  )
     7  
     8  var testFindIndexCases = []struct {
     9  	input    string
    10  	pat      string
    11  	off      int
    12  	captures []Capture
    13  }{
    14  	{"", "", 0, []Capture{{0, 0, false}}},
    15  	{"a", "a", 0, []Capture{{0, 1, false}}},
    16  	{"b", "a", 0, nil},
    17  	{"testfootest", "foo", 0, []Capture{{4, 7, false}}},
    18  	{"testfootest", "foo.", 0, []Capture{{4, 8, false}}},
    19  	{"baaac", "a+", 0, []Capture{{1, 4, false}}},
    20  	{"bc", "a+", 0, nil},
    21  	{"baaac", "a*", 0, []Capture{{0, 0, false}}},
    22  	{"aaac", "a*", 0, []Capture{{0, 3, false}}},
    23  	{"aab", "a+b+", 0, []Capture{{0, 3, false}}},
    24  	{"aa", "a-", 0, []Capture{{0, 0, false}}},
    25  	{"aab", "a-b", 0, []Capture{{0, 3, false}}},
    26  	{"xaabaacba", "((a+)(b+))%2c%3", 0, []Capture{
    27  		{1, 8, false},
    28  		{1, 4, false},
    29  		{1, 3, false},
    30  		{3, 4, false},
    31  	}},
    32  	{"abaac", "[ab]*", 0, []Capture{{0, 4, false}}},
    33  	{"abaac", "([ab]*)c", 0, []Capture{{0, 5, false}, {0, 4, false}}},
    34  	{"a", "^a", 0, []Capture{{0, 1, false}}},
    35  	{"ba", "^a", 0, nil},
    36  	{"a", "a$", 0, []Capture{{0, 1, false}}},
    37  	{"ab", "a$", 0, nil},
    38  	{"$ab", "%$a", 0, []Capture{{0, 2, false}}},
    39  	{"abcabc", "$", 0, []Capture{{6, 6, false}}},
    40  	{"aabb", "%f[a]", 0, []Capture{{0, 0, false}}},
    41  	{"aabb", "%f[b]", 0, []Capture{{2, 2, false}}},
    42  	{"aa(bb)cc", "%b()", 0, []Capture{{2, 6, false}}},
    43  	{"aa'bb'cc", "%b''", 0, []Capture{{2, 6, false}}},
    44  	{"ab ! test", "[^%sa-z]", 0, []Capture{{3, 4, false}}},
    45  	{`[]`, `^%[%]$`, 0, []Capture{{0, 2, false}}},
    46  	{`["]`, `^%["%]$`, 0, []Capture{{0, 3, false}}},
    47  	{`[string "]`, `^%[string "%]$`, 0, []Capture{{0, 10, false}}},
    48  	{`[string "foo bar baz"]`, `^%[string [^x]*"%]$`, 0, []Capture{{0, 22, false}}},
    49  	{`xyz`, `[^x]+`, 0, []Capture{{1, 3, false}}},
    50  	{`xyz`, `[yz]+`, 0, []Capture{{1, 3, false}}},
    51  	{`]]]a`, `[^]]`, 0, []Capture{{3, 4, false}}},
    52  	{`xyz`, `()y()`, 0, []Capture{{1, 2, false}, {1, 1, true}, {2, 2, true}}},
    53  	{"ab", "b", 1, []Capture{{1, 2, false}}},
    54  	{" a ", "%w", 1, []Capture{{1, 2, false}}},
    55  	{"x=y", "x%py", 0, []Capture{{0, 3, false}}},
    56  	{"aa5bb", "[%d]", 0, []Capture{{2, 3, false}}},
    57  	{"aa5bb", "[^%D]", 0, []Capture{{2, 3, false}}},
    58  	{"aa", "%f[a]", 0, []Capture{{0, 0, false}}},
    59  	{"aa", "%f[^a]", 0, []Capture{{2, 2, false}}},
    60  	{"aa", "%f[^\x00]", 0, []Capture{{0, 0, false}}},
    61  	{"aa", "%f[\x00]", 0, []Capture{{2, 2, false}}},
    62  }
    63  
    64  func TestFindIndex(t *testing.T) {
    65  	for i, test := range testFindIndexCases {
    66  		got, err := FindIndex(test.input, test.pat, test.off)
    67  		if err != nil {
    68  			t.Fatal(err)
    69  		}
    70  		want := test.captures
    71  		if !reflect.DeepEqual(got, want) {
    72  			t.Errorf("%d: got %v, want %v", i+1, got, want)
    73  		}
    74  	}
    75  }
    76  
    77  var testFindAllIndexCases = []struct {
    78  	input       string
    79  	pat         string
    80  	allCaptures [][]Capture
    81  }{
    82  	{"abc", "", [][]Capture{
    83  		{{0, 0, false}},
    84  		{{1, 1, false}},
    85  		{{2, 2, false}},
    86  		{{3, 3, false}},
    87  	}},
    88  	{"a bc", " *", [][]Capture{
    89  		{{0, 0, false}},
    90  		{{1, 2, false}},
    91  		{{3, 3, false}},
    92  		{{4, 4, false}},
    93  	}},
    94  	{"abc abc ababcabc", "abc", [][]Capture{
    95  		{{0, 3, false}},
    96  		{{4, 7, false}},
    97  		{{10, 13, false}},
    98  		{{13, 16, false}},
    99  	}},
   100  }
   101  
   102  func TestFindAllIndex(t *testing.T) {
   103  	for i, test := range testFindAllIndexCases {
   104  		got, err := FindAllIndex(test.input, test.pat, -1)
   105  		if err != nil {
   106  			t.Fatal(err)
   107  		}
   108  		want := test.allCaptures
   109  		if !reflect.DeepEqual(got, want) {
   110  			t.Errorf("%d: got %v, want %v", i+1, got, want)
   111  		}
   112  	}
   113  }
   114  
   115  var testReplaceAllCases = []struct {
   116  	input  string
   117  	pat    string
   118  	repl   string
   119  	output string
   120  }{
   121  	{"abc", "", "-", "-a-b-c-"},
   122  	{"a bc", " *", "-", "-a-b-c-"},
   123  }
   124  
   125  func TestReplaceAllFunc(t *testing.T) {
   126  	for i, test := range testReplaceAllCases {
   127  		got, _, err := ReplaceAllFunc(test.input, test.pat, func(caps []Capture) (string, error) {
   128  			return test.repl, nil
   129  		}, -1)
   130  		if err != nil {
   131  			t.Fatal(err)
   132  		}
   133  		want := test.output
   134  		if !reflect.DeepEqual(got, want) {
   135  			t.Errorf("%d: got %v, want %v", i+1, got, want)
   136  		}
   137  	}
   138  }