github.com/tiagovtristao/plz@v13.4.0+incompatible/tools/build_langserver/langserver/utils_test.go (about)

     1  package langserver
     2  
     3  import (
     4  	"context"
     5  	"github.com/thought-machine/please/src/core"
     6  	"fmt"
     7  	"path"
     8  	"strings"
     9  	"testing"
    10  
    11  	"github.com/stretchr/testify/assert"
    12  
    13  	"github.com/thought-machine/please/tools/build_langserver/lsp"
    14  )
    15  
    16  func TestIsURL(t *testing.T) {
    17  	currentFile, err := getFileinCwd("utils_test.go")
    18  	assert.Equal(t, err, nil)
    19  
    20  	assert.False(t, IsURL(currentFile))
    21  
    22  	documentURI := "file://" + currentFile
    23  	assert.True(t, IsURL(documentURI))
    24  }
    25  
    26  func TestGetPathFromURL(t *testing.T) {
    27  	currentFile, err := getFileinCwd("utils_test.go")
    28  	assert.Equal(t, err, nil)
    29  	documentURI := lsp.DocumentURI("file://" + currentFile)
    30  
    31  	// Test GetPathFromURL when documentURI passed in is a URI
    32  	p, err := GetPathFromURL(documentURI, "file")
    33  	assert.Equal(t, err, nil)
    34  	assert.Equal(t, p, string(currentFile))
    35  
    36  	// Test GetPathFromURL when documentURI passed in is a file path
    37  	p2, err := GetPathFromURL(currentFile, "File")
    38  	assert.Equal(t, err, nil)
    39  	assert.Equal(t, p2, string(currentFile))
    40  
    41  }
    42  
    43  func TestGetPathFromURLFail(t *testing.T) {
    44  	// Test invalid file fail with Bogus file
    45  	bogusFile, err := getFileinCwd("BLAH.blah")
    46  	assert.Equal(t, err, nil)
    47  
    48  	p, err := GetPathFromURL(bogusFile, "file")
    49  	assert.Equal(t, p, "")
    50  	assert.Error(t, err)
    51  
    52  	// Test invalid file not in repo root
    53  	p2, err := GetPathFromURL(lsp.DocumentURI("/tmp"), "path")
    54  	assert.Equal(t, p2, "")
    55  	assert.Error(t, err)
    56  
    57  	// Test invalid pathtype
    58  	currentFile, err := getFileinCwd("utils_test.go")
    59  	assert.Equal(t, err, nil)
    60  	p3, err := GetPathFromURL(currentFile, "dir")
    61  	assert.Equal(t, p3, "")
    62  	assert.Error(t, err)
    63  }
    64  
    65  func TestLocalFilesFromURI(t *testing.T) {
    66  	exampleBuildURI := lsp.DocumentURI("file://tools/build_langserver/langserver/test_data/example.build")
    67  	files, err := LocalFilesFromURI(exampleBuildURI)
    68  	assert.NoError(t, err)
    69  	assert.True(t, StringInSlice(files, "foo.go"))
    70  	assert.True(t, !StringInSlice(files, "example.go"))
    71  }
    72  
    73  func TestPackageLabelFromURI(t *testing.T) {
    74  	filePath := path.Join(core.RepoRoot, "tools/build_langserver/langserver/BUILD")
    75  	uri := lsp.DocumentURI("file://" + filePath)
    76  	label, err := PackageLabelFromURI(uri)
    77  
    78  	assert.Equal(t, err, nil)
    79  	assert.Equal(t, "//tools/build_langserver/langserver", label)
    80  }
    81  
    82  func TestEnsureURL(t *testing.T) {
    83  	currentFile, err := getFileinCwd("utils_test.go")
    84  	assert.Equal(t, err, nil)
    85  
    86  	uri, err := EnsureURL(currentFile, "file")
    87  	assert.Equal(t, err, nil)
    88  	assert.Equal(t, uri, lsp.DocumentURI("file://"+string(currentFile)))
    89  }
    90  
    91  func TestReadFile(t *testing.T) {
    92  	ctx := context.Background()
    93  	filepath := path.Join(core.RepoRoot, "tools/build_langserver/langserver/test_data/example.build")
    94  	uri := lsp.DocumentURI("file://" + filepath)
    95  
    96  	// Test ReadFile() with filepath as uri
    97  	content, err := ReadFile(ctx, lsp.DocumentURI(filepath))
    98  	// Type checking
    99  	assert.Equal(t, fmt.Sprintf("%T", content), "[]string")
   100  	assert.Equal(t, err, nil)
   101  	// Content check
   102  	assert.Equal(t, content[0], "go_library(")
   103  	assert.Equal(t, strings.TrimSpace(content[1]), "name = \"langserver\",")
   104  
   105  	// Test ReadFile() with uri as uri
   106  	content1, err := ReadFile(ctx, uri)
   107  	// Type checking
   108  	assert.Equal(t, fmt.Sprintf("%T", content), "[]string")
   109  	assert.Equal(t, err, nil)
   110  	// Content check
   111  	assert.Equal(t, content1[0], "go_library(")
   112  	assert.Equal(t, strings.TrimSpace(content1[1]), "name = \"langserver\",")
   113  
   114  }
   115  
   116  func TestReadFileCanceledContext(t *testing.T) {
   117  	ctx, cancel := context.WithCancel(context.Background())
   118  	filepath := path.Join(core.RepoRoot, "tools/build_langserver/langserver/test_data/example.build")
   119  
   120  	cancel()
   121  	content, err := ReadFile(ctx, lsp.DocumentURI(filepath))
   122  	assert.Equal(t, content, []string(nil))
   123  	assert.Equal(t, err, nil)
   124  }
   125  
   126  func TestGetLineContent(t *testing.T) {
   127  	ctx := context.Background()
   128  	filepath := path.Join(core.RepoRoot, "tools/build_langserver/langserver/test_data/example.build")
   129  	pos := lsp.Position{
   130  		Line:      0,
   131  		Character: 0,
   132  	}
   133  
   134  	line, err := GetLineContent(ctx, lsp.DocumentURI(filepath), pos)
   135  	assert.Equal(t, err, nil)
   136  	assert.Equal(t, strings.TrimSpace(line[0]), "go_library(")
   137  }
   138  
   139  func TestTrimQoutes(t *testing.T) {
   140  	trimed := TrimQuotes("\"blah\"")
   141  	assert.Equal(t, trimed, "blah")
   142  
   143  	trimed = TrimQuotes(`"//src/core",`)
   144  	assert.Equal(t, "//src/core", trimed)
   145  
   146  	trimed = TrimQuotes(`     "//src/core",`)
   147  	assert.Equal(t, "//src/core", trimed)
   148  
   149  	trimed = TrimQuotes("'blah")
   150  	assert.Equal(t, "blah", trimed)
   151  
   152  	// this is to make sure our regex works,
   153  	// so it doesn't just match anything with a build label
   154  	trimed = TrimQuotes(`visibility = ["//tools/build_langserver/...", "//src/core"]`)
   155  	assert.Equal(t, `visibility = ["//tools/build_langserver/...", "//src/core"]`, trimed)
   156  
   157  	trimed = TrimQuotes(`"//src/core`)
   158  	assert.Equal(t, "//src/core", trimed)
   159  }
   160  
   161  func TestExtractStringVal(t *testing.T) {
   162  	assert.Equal(t, "blah", ExtractStrTail(`    srcs=["blah"`))
   163  	assert.Equal(t, "foo", ExtractStrTail(`    "foo"`))
   164  	assert.Equal(t, "", ExtractStrTail(`"blah", srcs=`))
   165  }
   166  
   167  func TestLooksLikeAttribute(t *testing.T) {
   168  	assert.True(t, LooksLikeAttribute("CONFIG."))
   169  	assert.True(t, LooksLikeAttribute("CONFIG.J"))
   170  	assert.True(t, LooksLikeAttribute("		CONFIG.J"))
   171  	assert.True(t, LooksLikeAttribute("		\"blah\".for"))
   172  	assert.True(t, LooksLikeAttribute("		\"blah\"."))
   173  	assert.True(t, LooksLikeAttribute("	mystr = \"{time}-{message}\".fo"))
   174  
   175  	assert.False(t, LooksLikeAttribute("		func(ca"))
   176  	assert.False(t, LooksLikeAttribute("call_assign = subinclude(\"//build_defs:fpm\")"))
   177  	assert.False(t, LooksLikeAttribute("     \"//tools/build_langserver/lsp\","))
   178  	assert.False(t, LooksLikeAttribute("    augassign += len(replace_str)"))
   179  }
   180  
   181  func TestLooksLikeCONFIGAttr(t *testing.T) {
   182  	assert.True(t, LooksLikeCONFIGAttr("CONFIG."))
   183  	assert.True(t, LooksLikeCONFIGAttr("CONFIG.J"))
   184  	assert.True(t, LooksLikeCONFIGAttr("		CONFIG.J"))
   185  	assert.True(t, LooksLikeCONFIGAttr("		CONFIG.9"))
   186  
   187  	assert.False(t, LooksLikeCONFIGAttr("CONFIG = BLAH."))
   188  	assert.False(t, LooksLikeCONFIGAttr("CONFIG.BLAH = \"hello\""))
   189  	assert.False(t, LooksLikeCONFIGAttr("func(ca"))
   190  }
   191  
   192  func TestLooksLikeStringAttr(t *testing.T) {
   193  	assert.True(t, LooksLikeStringAttr("\"{time}-{message}\"."))
   194  	assert.True(t, LooksLikeStringAttr("'{time}-{message}'."))
   195  	assert.True(t, LooksLikeStringAttr("	'message'."))
   196  	assert.True(t, LooksLikeStringAttr("blah = 'message'."))
   197  
   198  	// Test fail when quotes style don't match
   199  	assert.False(t, LooksLikeStringAttr("\"foo'."))
   200  }
   201  
   202  func TestLooksLikeDictAttr(t *testing.T) {
   203  	assert.True(t, LooksLikeDictAttr("{\"foo\":2, \"bar\":\"baz\"}."))
   204  	assert.True(t, LooksLikeDictAttr("{\"foo\":2}."))
   205  	assert.True(t, LooksLikeDictAttr("{\"foo\":2}.k"))
   206  	assert.True(t, LooksLikeDictAttr("{\"foo\":2}.keys"))
   207  
   208  	// Ensure completed call does not get triggered
   209  	assert.False(t, LooksLikeDictAttr("{\"foo\":2}.keys()"))
   210  }
   211  
   212  func TestExtractBuildLabel(t *testing.T) {
   213  	label := ExtractBuildLabel(`target = "//src/cache/blah:hello`)
   214  	assert.Equal(t, "//src/cache/blah:hello", label)
   215  	t.Log(label)
   216  
   217  	label = ExtractBuildLabel(`target = "//src/cache/blah:hello"`)
   218  	assert.Equal(t, "//src/cache/blah:hello", label)
   219  
   220  	label = ExtractBuildLabel(`		"//src/cache:`)
   221  	assert.Equal(t, "//src/cache:", label)
   222  
   223  	label = ExtractBuildLabel(`		"//src/cache/blah`)
   224  	assert.Equal(t, "//src/cache/blah", label)
   225  
   226  	label = ExtractBuildLabel(`		"//src/cache/blah/`)
   227  	assert.Equal(t, "//src/cache/blah/", label)
   228  
   229  	// no match
   230  	label = ExtractBuildLabel("blah")
   231  	assert.Equal(t, "", label)
   232  
   233  	label = ExtractBuildLabel(`"//src/cache/blah//`)
   234  	assert.Equal(t, "", label)
   235  
   236  	label = ExtractBuildLabel(`"//src/cache/blah/:`)
   237  	assert.Equal(t, "", label)
   238  
   239  	label = ExtractBuildLabel(`"//src/ca`)
   240  	assert.Equal(t, "//src/ca", label)
   241  }
   242  
   243  func TestExtractLiteral(t *testing.T) {
   244  	lit := ExtractLiteral(`blah = "go_librar`)
   245  	assert.Equal(t, "", lit)
   246  
   247  	lit = ExtractLiteral(`blah = go_librar`)
   248  	assert.Equal(t, "go_librar", lit)
   249  
   250  	lit = ExtractLiteral(`go_librar`)
   251  	assert.Equal(t, "go_librar", lit)
   252  
   253  	lit = ExtractLiteral(`blah = " = go_librar`)
   254  	assert.Equal(t, "", lit)
   255  
   256  	lit = ExtractLiteral(`blah = "hello", hi = go_lib`)
   257  	assert.Equal(t, "go_lib", lit)
   258  
   259  	lit = ExtractLiteral(`blah = 'hello', hi = go_lib`)
   260  	assert.Equal(t, "go_lib", lit)
   261  
   262  	lit = ExtractLiteral(`"blah = 'hello, hi = go_lib`)
   263  	assert.Equal(t, "", lit)
   264  
   265  	// Tests for extracting attribute literals
   266  	lit = ExtractLiteral(`blah.form`)
   267  	assert.Equal(t, "blah.form", lit)
   268  
   269  	lit = ExtractLiteral(`hello = blah.form`)
   270  	assert.Equal(t, "blah.form", lit)
   271  
   272  	lit = ExtractLiteral(`hello = "blah.form`)
   273  	assert.Equal(t, "", lit)
   274  
   275  	lit = ExtractLiteral(`blah = 'hello', hi = blah.form`)
   276  	assert.Equal(t, "blah.form", lit)
   277  
   278  	assert.Equal(t, ".format", ExtractLiteral(`"blah".format`))
   279  }
   280  
   281  /*
   282   * Utilities function for tests in this file
   283   */
   284  func getFileinCwd(name string) (lsp.DocumentURI, error) {
   285  	core.FindRepoRoot()
   286  	filePath := path.Join(core.RepoRoot, "tools/build_langserver/langserver/"+name)
   287  
   288  	return lsp.DocumentURI(filePath), nil
   289  }