| // Copyright 2019 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package span_test |
| |
| import ( |
| "fmt" |
| "path/filepath" |
| "strings" |
| "testing" |
| |
| "golang.org/x/tools/gopls/internal/span" |
| ) |
| |
| func TestFormat(t *testing.T) { |
| formats := []string{"%v", "%#v", "%+v"} |
| |
| // Element 0 is the input, and the elements 0-2 are the expected |
| // output in [%v %#v %+v] formats. Thus the first must be in |
| // canonical form (invariant under span.Parse + fmt.Sprint). |
| // The '#' form displays offsets; the '+' form outputs a URI. |
| // If len=4, element 0 is a noncanonical input and 1-3 are expected outputs. |
| for _, test := range [][]string{ |
| {"C:/file_a", "C:/file_a", "file:///C:/file_a:#0"}, |
| {"C:/file_b:1:2", "C:/file_b:1:2", "file:///C:/file_b:1:2"}, |
| {"C:/file_c:1000", "C:/file_c:1000", "file:///C:/file_c:1000:1"}, |
| {"C:/file_d:14:9", "C:/file_d:14:9", "file:///C:/file_d:14:9"}, |
| {"C:/file_e:1:2-7", "C:/file_e:1:2-7", "file:///C:/file_e:1:2-1:7"}, |
| {"C:/file_f:500-502", "C:/file_f:500-502", "file:///C:/file_f:500:1-502:1"}, |
| {"C:/file_g:3:7-8", "C:/file_g:3:7-8", "file:///C:/file_g:3:7-3:8"}, |
| {"C:/file_h:3:7-4:8", "C:/file_h:3:7-4:8", "file:///C:/file_h:3:7-4:8"}, |
| {"C:/file_i:#100", "C:/file_i:#100", "file:///C:/file_i:#100"}, |
| {"C:/file_j:#26-#28", "C:/file_j:#26-#28", "file:///C:/file_j:#26-0#28"}, // 0#28? |
| {"C:/file_h:3:7#26-4:8#37", // not canonical |
| "C:/file_h:3:7-4:8", "C:/file_h:#26-#37", "file:///C:/file_h:3:7#26-4:8#37"}} { |
| input := test[0] |
| spn := span.Parse(input) |
| wants := test[0:3] |
| if len(test) == 4 { |
| wants = test[1:4] |
| } |
| for i, format := range formats { |
| want := toPath(wants[i]) |
| if got := fmt.Sprintf(format, spn); got != want { |
| t.Errorf("Sprintf(%q, %q) = %q, want %q", format, input, got, want) |
| } |
| } |
| } |
| } |
| |
| func toPath(value string) string { |
| if strings.HasPrefix(value, "file://") { |
| return value |
| } |
| return filepath.FromSlash(value) |
| } |