github.com/btccom/go-micro/v2@v2.9.3/api/router/util/compile_test.go (about)

     1  package util
     2  
     3  // download from https://raw.githubusercontent.com/grpc-ecosystem/grpc-gateway/master/protoc-gen-grpc-gateway/httprule/compile_test.go
     4  
     5  import (
     6  	"reflect"
     7  	"testing"
     8  )
     9  
    10  const (
    11  	operandFiller = 0
    12  )
    13  
    14  func TestCompile(t *testing.T) {
    15  	for _, spec := range []struct {
    16  		segs []segment
    17  		verb string
    18  
    19  		ops    []int
    20  		pool   []string
    21  		fields []string
    22  	}{
    23  		{},
    24  		{
    25  			segs: []segment{
    26  				wildcard{},
    27  			},
    28  			ops: []int{int(OpPush), operandFiller},
    29  		},
    30  		{
    31  			segs: []segment{
    32  				deepWildcard{},
    33  			},
    34  			ops: []int{int(OpPushM), operandFiller},
    35  		},
    36  		{
    37  			segs: []segment{
    38  				literal("v1"),
    39  			},
    40  			ops:  []int{int(OpLitPush), 0},
    41  			pool: []string{"v1"},
    42  		},
    43  		{
    44  			segs: []segment{
    45  				literal("v1"),
    46  			},
    47  			verb: "LOCK",
    48  			ops:  []int{int(OpLitPush), 0},
    49  			pool: []string{"v1"},
    50  		},
    51  		{
    52  			segs: []segment{
    53  				variable{
    54  					path: "name.nested",
    55  					segments: []segment{
    56  						wildcard{},
    57  					},
    58  				},
    59  			},
    60  			ops: []int{
    61  				int(OpPush), operandFiller,
    62  				int(OpConcatN), 1,
    63  				int(OpCapture), 0,
    64  			},
    65  			pool:   []string{"name.nested"},
    66  			fields: []string{"name.nested"},
    67  		},
    68  		{
    69  			segs: []segment{
    70  				literal("obj"),
    71  				variable{
    72  					path: "name.nested",
    73  					segments: []segment{
    74  						literal("a"),
    75  						wildcard{},
    76  						literal("b"),
    77  					},
    78  				},
    79  				variable{
    80  					path: "obj",
    81  					segments: []segment{
    82  						deepWildcard{},
    83  					},
    84  				},
    85  			},
    86  			ops: []int{
    87  				int(OpLitPush), 0,
    88  				int(OpLitPush), 1,
    89  				int(OpPush), operandFiller,
    90  				int(OpLitPush), 2,
    91  				int(OpConcatN), 3,
    92  				int(OpCapture), 3,
    93  				int(OpPushM), operandFiller,
    94  				int(OpConcatN), 1,
    95  				int(OpCapture), 0,
    96  			},
    97  			pool:   []string{"obj", "a", "b", "name.nested"},
    98  			fields: []string{"name.nested", "obj"},
    99  		},
   100  	} {
   101  		tmpl := template{
   102  			segments: spec.segs,
   103  			verb:     spec.verb,
   104  		}
   105  		compiled := tmpl.Compile()
   106  		if got, want := compiled.Version, opcodeVersion; got != want {
   107  			t.Errorf("tmpl.Compile().Version = %d; want %d; segs=%#v, verb=%q", got, want, spec.segs, spec.verb)
   108  		}
   109  		if got, want := compiled.OpCodes, spec.ops; !reflect.DeepEqual(got, want) {
   110  			t.Errorf("tmpl.Compile().OpCodes = %v; want %v; segs=%#v, verb=%q", got, want, spec.segs, spec.verb)
   111  		}
   112  		if got, want := compiled.Pool, spec.pool; !reflect.DeepEqual(got, want) {
   113  			t.Errorf("tmpl.Compile().Pool = %q; want %q; segs=%#v, verb=%q", got, want, spec.segs, spec.verb)
   114  		}
   115  		if got, want := compiled.Verb, spec.verb; got != want {
   116  			t.Errorf("tmpl.Compile().Verb = %q; want %q; segs=%#v, verb=%q", got, want, spec.segs, spec.verb)
   117  		}
   118  		if got, want := compiled.Fields, spec.fields; !reflect.DeepEqual(got, want) {
   119  			t.Errorf("tmpl.Compile().Fields = %q; want %q; segs=%#v, verb=%q", got, want, spec.segs, spec.verb)
   120  		}
   121  	}
   122  }