kythe.io@v0.0.68-0.20240422202219-7225dbc01741/kythe/go/languageserver/pathmap/mapper_test.go (about)

     1  /*
     2   * Copyright 2017 The Kythe Authors. All rights reserved.
     3   *
     4   * Licensed under the Apache License, Version 2.0 (the "License");
     5   * you may not use this file except in compliance with the License.
     6   * You may obtain a copy of the License at
     7   *
     8   *   http://www.apache.org/licenses/LICENSE-2.0
     9   *
    10   * Unless required by applicable law or agreed to in writing, software
    11   * distributed under the License is distributed on an "AS IS" BASIS,
    12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13   * See the License for the specific language governing permissions and
    14   * limitations under the License.
    15   */
    16  
    17  package pathmap
    18  
    19  import (
    20  	"reflect"
    21  	"testing"
    22  )
    23  
    24  type values map[string]string
    25  type failures []string
    26  type successes []struct {
    27  	string
    28  	values
    29  }
    30  
    31  type testcase struct {
    32  	successes
    33  	failures
    34  }
    35  
    36  var cases = map[string]testcase{
    37  	"": {
    38  		successes{
    39  			{"", values{}},
    40  		},
    41  		failures{"fail"},
    42  	},
    43  	"hello": {
    44  		successes{
    45  			{"hello", values{}},
    46  		},
    47  		failures{"", "notHello"},
    48  	},
    49  	":file": {
    50  		successes{
    51  			{"hello", values{"file": "hello"}},
    52  		},
    53  		failures{"dir/file"},
    54  	},
    55  	"/dir/:file": {
    56  		successes{
    57  			{"/dir/test", values{"file": "test"}},
    58  		},
    59  		failures{"", "dir/", "dir/test", "/dir/trailing/", "/dir/too/long"},
    60  	},
    61  	"/dir/:files*": {
    62  		successes{
    63  			{"/dir/test", values{"files": "test"}},
    64  			{"/dir/test/nested", values{"files": "test/nested"}},
    65  		},
    66  		failures{"/dir/test/", "/dir/"},
    67  	},
    68  	"/dir/:splat*/sep/:file": {
    69  		successes{
    70  			{"/dir/deeply/nested/sep/img.png", values{"splat": "deeply/nested", "file": "img.png"}},
    71  		},
    72  		failures{"/dir//sep/hi"},
    73  	},
    74  }
    75  
    76  func TestNewMapper(t *testing.T) {
    77  	for p := range cases {
    78  		_, err := NewMapper(p)
    79  		if err != nil {
    80  			t.Errorf("unexpected error parsing pattern (%s):\n%v", p, err)
    81  		}
    82  	}
    83  
    84  	_, err := NewMapper("not a path")
    85  	if err == nil {
    86  		t.Error("expected error parsing non-path pattern")
    87  	}
    88  }
    89  
    90  func TestMapperParseGenerate(t *testing.T) {
    91  	for pat, c := range cases {
    92  		m, err := NewMapper(pat)
    93  		if err != nil {
    94  			t.Errorf("unexpected error parsing pattern (%s):\n%v", pat, err)
    95  			continue
    96  		}
    97  
    98  		for _, p := range c.successes {
    99  			v, err := m.Parse(p.string)
   100  			if err != nil {
   101  				t.Errorf("unexpected error parsing path (%s) with pattern (%v):\n%v", p.string, m.re, err)
   102  			}
   103  			if !reflect.DeepEqual(values(v), p.values) {
   104  				t.Errorf("incorrect values parsing path (%s) with pattern (%s):\nExpected: %v\nFound: %v", p.string, pat, p.values, v)
   105  			}
   106  
   107  			g, err := m.Generate(p.values)
   108  			if err != nil {
   109  				t.Errorf("unexpected error generating path with pattern (%s) and values (%v)", pat, p.values)
   110  			}
   111  			if g != p.string {
   112  				t.Errorf("incorrect generated path with pattern (%s) and values (%v):\nExpected: %s\nFound: %s", pat, p.values, p.string, g)
   113  			}
   114  		}
   115  
   116  		for _, p := range c.failures {
   117  			_, err := m.Parse(p)
   118  			if err == nil {
   119  				t.Errorf("expected error parsing path (%s) with pattern (%s)", p, pat)
   120  			}
   121  		}
   122  	}
   123  }