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

     1  package langserver
     2  
     3  import (
     4  	"context"
     5  	"github.com/thought-machine/please/src/core"
     6  	"strings"
     7  	"testing"
     8  
     9  	"github.com/thought-machine/please/tools/build_langserver/lsp"
    10  
    11  	"github.com/stretchr/testify/assert"
    12  )
    13  
    14  /***************************************
    15   *Tests for Build Definitions
    16   ***************************************/
    17  func TestGetHoverContentOnBuildDefName(t *testing.T) {
    18  	var ctx = context.Background()
    19  
    20  	content, err := handler.getHoverContent(ctx, exampleBuildURI, lsp.Position{Line: 0, Character: 3})
    21  	expected := analyzer.BuiltIns["go_library"].Header + "\n\n" + analyzer.BuiltIns["go_library"].Docstring
    22  
    23  	assert.Equal(t, nil, err)
    24  	assert.Equal(t, expected, content)
    25  }
    26  
    27  func TestGetHoverContentOnArgument(t *testing.T) {
    28  	var ctx = context.Background()
    29  
    30  	// Test hovering over argument name
    31  	content, err := handler.getHoverContent(ctx, exampleBuildURI, lsp.Position{Line: 7, Character: 7})
    32  	assert.Equal(t, nil, err)
    33  	assert.Equal(t, "deps required:false, type:list", content)
    34  
    35  	// Test hovering over argument name with nested call
    36  	content, err = handler.getHoverContent(ctx, exampleBuildURI, lsp.Position{Line: 2, Character: 7})
    37  	assert.Equal(t, nil, err)
    38  	assert.Equal(t, "srcs required:true, type:list",
    39  		content)
    40  
    41  	// Test hovering over argument content
    42  
    43  	// when build label is a label for including all sub packages
    44  	content, err = handler.getHoverContent(ctx, exampleBuildURI, lsp.Position{Line: 6, Character: 21})
    45  	assert.Equal(t, nil, err)
    46  	expected := "BuildLabel includes all subpackages in path: " +
    47  		core.RepoRoot + "/tools/build_langserver"
    48  	assert.Equal(t, expected, content)
    49  
    50  	// When build label is definitive, e.g. "//src/core" or "//src/core:core"
    51  	content, err = handler.getHoverContent(ctx, exampleBuildURI, lsp.Position{Line: 6, Character: 57})
    52  	expectedContent := []string{"go_library(", "    name = \"core\",", "    srcs = glob("}
    53  	assert.Equal(t, nil, err)
    54  	// Checking only the first 3 line
    55  	splited := strings.Split(content, "\n")
    56  	assert.Equal(t, expectedContent, splited[:3])
    57  }
    58  
    59  func TestGetHoverContentOnNestedCall(t *testing.T) {
    60  	var ctx = context.Background()
    61  
    62  	// Test hovering over nested call on definition, e.g. glob(
    63  	content, err := handler.getHoverContent(ctx, exampleBuildURI, lsp.Position{Line: 2, Character: 14})
    64  	assert.Equal(t, nil, err)
    65  	assert.Equal(t, "def glob(include:list, exclude:list&excludes=[], hidden:bool=False)",
    66  		content)
    67  
    68  	// Test hovering over nested call on ending parenthese
    69  	content, err = handler.getHoverContent(ctx, exampleBuildURI, lsp.Position{Line: 5, Character: 6})
    70  	assert.Equal(t, nil, err)
    71  	assert.Equal(t, "", content)
    72  
    73  	// Test hovering over argument assignment of nested call
    74  	content, err = handler.getHoverContent(ctx, exampleBuildURI, lsp.Position{Line: 4, Character: 15})
    75  	assert.Equal(t, nil, err)
    76  	assert.Equal(t, "exclude required:false, type:list",
    77  		content)
    78  
    79  	content, err = handler.getHoverContent(ctx, exampleBuildURI, lsp.Position{Line: 3, Character: 15})
    80  	assert.Equal(t, nil, err)
    81  	assert.Equal(t, "include required:true, type:list",
    82  		content)
    83  }
    84  
    85  func TestGetHoverContentOnEmptyContent(t *testing.T) {
    86  	var ctx = context.Background()
    87  
    88  	content, err := handler.getHoverContent(ctx, exampleBuildURI, lsp.Position{Line: 1, Character: 3})
    89  	assert.Equal(t, nil, err)
    90  	assert.Equal(t, "", content)
    91  
    92  	content, err = handler.getHoverContent(ctx, exampleBuildURI, lsp.Position{Line: 2, Character: 30})
    93  	assert.Equal(t, nil, err)
    94  	assert.Equal(t, "", content)
    95  }
    96  
    97  func TestGetHoverContentOnBuildLabels(t *testing.T) {
    98  	var ctx = context.Background()
    99  
   100  	// Test hovering over buildlabels
   101  	content, err := handler.getHoverContent(ctx, exampleBuildURI, lsp.Position{Line: 13, Character: 15})
   102  	expected := "go_get(\n" +
   103  		"    name = \"jsonrpc2\",\n" +
   104  		"    get = \"github.com/sourcegraph/jsonrpc2\",\n" +
   105  		"    revision = \"549eb959f029d014d623104d40ab966d159a92de\",\n" +
   106  		")"
   107  	assert.Equal(t, nil, err)
   108  	assert.Equal(t, expected, content)
   109  }
   110  
   111  func TestGetHoverContentOnNoneBuildLabelString(t *testing.T) {
   112  	var ctx = context.Background()
   113  
   114  	content, err := handler.getHoverContent(ctx, exampleBuildURI, lsp.Position{Line: 20, Character: 18})
   115  	assert.Equal(t, nil, err)
   116  	assert.Equal(t, "", content)
   117  }
   118  
   119  func TestGetHoverContentOnArgumentWithProperty(t *testing.T) {
   120  	var ctx = context.Background()
   121  
   122  	// Hover on argument name
   123  	content, err := handler.getHoverContent(ctx, exampleBuildURI, lsp.Position{Line: 35, Character: 6})
   124  	assert.Equal(t, nil, err)
   125  	assert.Equal(t, "name required:true, type:str", content)
   126  
   127  	// Hover on property name
   128  	content, err = handler.getHoverContent(ctx, exampleBuildURI, lsp.Position{Line: 35, Character: 20})
   129  	assert.Equal(t, nil, err)
   130  	assert.Equal(t, "", content)
   131  
   132  	// Hover on property call
   133  	content, err = handler.getHoverContent(ctx, exampleBuildURI, lsp.Position{Line: 35, Character: 34})
   134  	assert.Equal(t, nil, err)
   135  	assert.Equal(t, "str.format()", content)
   136  }
   137  
   138  func TestGetHoverContentArgOnTheSameLine(t *testing.T) {
   139  	var ctx = context.Background()
   140  
   141  	content, err := handler.getHoverContent(ctx, exampleBuildURI, lsp.Position{Line: 43, Character: 17})
   142  	assert.Equal(t, nil, err)
   143  	assert.Equal(t, "name required:true, type:str", content)
   144  }
   145  
   146  /***************************************
   147  *Tests for Variable assignments
   148  ***************************************/
   149  func TestGetHoverContentOnPropertyAssignment(t *testing.T) {
   150  	var ctx = context.Background()
   151  
   152  	//Hover on assignment with properties
   153  	content, err := handler.getHoverContent(ctx, assignBuildURI, lsp.Position{Line: 0, Character: 30})
   154  	assert.Equal(t, nil, err)
   155  	assert.Equal(t, "str.format()", content)
   156  
   157  	content, err = handler.getHoverContent(ctx, assignBuildURI, lsp.Position{Line: 2, Character: 18})
   158  	assert.Equal(t, nil, err)
   159  	assert.Equal(t, "str.replace(old:str, new:str)", content)
   160  
   161  	//Hover on argument of assignment property
   162  	content, err = handler.getHoverContent(ctx, assignBuildURI, lsp.Position{Line: 0, Character: 36})
   163  	assert.Equal(t, nil, err)
   164  	assert.Equal(t, "", content)
   165  
   166  	content, err = handler.getHoverContent(ctx, assignBuildURI, lsp.Position{Line: 2, Character: 25})
   167  	assert.Equal(t, nil, err)
   168  	assert.Equal(t, "old required:true, type:str", content)
   169  
   170  	content, err = handler.getHoverContent(ctx, assignBuildURI, lsp.Position{Line: 2, Character: 29})
   171  	assert.Equal(t, nil, err)
   172  	assert.Equal(t, "new required:true, type:str", content)
   173  
   174  	// Hover on assignment with function call
   175  	content, err = handler.getHoverContent(ctx, assignBuildURI, lsp.Position{Line: 6, Character: 18})
   176  	assert.Equal(t, nil, err)
   177  	assert.Equal(t, "def subinclude(target:str, hash:str=None)", content)
   178  }
   179  
   180  func TestGetHoverAssignmentBuildLabel(t *testing.T) {
   181  	var ctx = context.Background()
   182  
   183  	content, err := handler.getHoverContent(ctx, assignBuildURI, lsp.Position{Line: 25, Character: 13})
   184  	expected := []string{"go_library(", "    name = \"fs\",", "    srcs = ["}
   185  	t.Log(content)
   186  	assert.Equal(t, nil, err)
   187  	assert.Equal(t, strings.Split(content, "\n")[:3], expected)
   188  }
   189  
   190  func TestGetHoverContentOnUnaryAssignment(t *testing.T) {
   191  	var ctx = context.Background()
   192  
   193  	// Hover on assignment with unary op
   194  	content, err := handler.getHoverContent(ctx, assignBuildURI, lsp.Position{Line: 4, Character: 13})
   195  	assert.Equal(t, nil, err)
   196  	assert.Equal(t, "def len(obj)", content)
   197  }
   198  
   199  func TestGetHoverContentOnListAssignment(t *testing.T) {
   200  	var ctx = context.Background()
   201  
   202  	coreContent := []string{"go_library(", "    name = \"core\",", "    srcs = glob("}
   203  	fsContent := []string{"go_library(", "    name = \"fs\",", "    srcs = ["}
   204  
   205  	// Hover on assignment with Multiline list
   206  	content, err := handler.getHoverContent(ctx, assignBuildURI, lsp.Position{Line: 10, Character: 11})
   207  	assert.Equal(t, nil, err)
   208  	splited := strings.Split(content, "\n")
   209  	assert.Equal(t, coreContent, splited[:3])
   210  
   211  	// Hover on assignment with single line list
   212  	content, err = handler.getHoverContent(ctx, assignBuildURI, lsp.Position{Line: 19, Character: 26})
   213  	assert.Equal(t, nil, err)
   214  	splited = strings.Split(content, "\n")
   215  	assert.Equal(t, fsContent, splited[:3])
   216  
   217  	content, err = handler.getHoverContent(ctx, assignBuildURI, lsp.Position{Line: 19, Character: 39})
   218  	assert.Equal(t, nil, err)
   219  	splited = strings.Split(content, "\n")
   220  	assert.Equal(t, coreContent, splited[:3])
   221  
   222  	// Hover on empty space assignment
   223  	content, err = handler.getHoverContent(ctx, assignBuildURI, lsp.Position{Line: 12, Character: 52})
   224  	assert.Equal(t, nil, err)
   225  	assert.Equal(t, "", content)
   226  }
   227  
   228  func TestGetHoverContentOnIfAssignment(t *testing.T) {
   229  	var ctx = context.Background()
   230  
   231  	// Hover on if statement assignment empty
   232  	content, err := handler.getHoverContent(ctx, assignBuildURI, lsp.Position{Line: 21, Character: 33})
   233  	assert.Equal(t, nil, err)
   234  	assert.Equal(t, "", content)
   235  
   236  	// Hover on else statement assignment
   237  	content, err = handler.getHoverContent(ctx, assignBuildURI, lsp.Position{Line: 21, Character: 40})
   238  	assert.Equal(t, nil, err)
   239  	assert.Equal(t, "def subinclude(target:str, hash:str=None)",
   240  		content)
   241  }
   242  
   243  /***************************************
   244  *Tests for Variable augAssign
   245  ***************************************/
   246  func TestGetHoverContentAugAssign(t *testing.T) {
   247  	var ctx = context.Background()
   248  
   249  	// Hover on assignment with call
   250  	content, err := handler.getHoverContent(ctx, assignBuildURI, lsp.Position{Line: 23, Character: 14})
   251  	assert.Equal(t, nil, err)
   252  	assert.Equal(t, "def len(obj)", content)
   253  
   254  	// Hover on empty space
   255  	content, err = handler.getHoverContent(ctx, assignBuildURI, lsp.Position{Line: 23, Character: 56})
   256  	assert.Equal(t, nil, err)
   257  	assert.Equal(t, "", content)
   258  }
   259  
   260  /***************************************
   261  *Tests for property
   262  ***************************************/
   263  func TestGetHoverContentProperty(t *testing.T) {
   264  	var ctx = context.Background()
   265  
   266  	// Hover on CONFIG property
   267  	content, err := handler.getHoverContent(ctx, propURI, lsp.Position{Line: 0, Character: 4})
   268  	assert.Equal(t, nil, err)
   269  	assert.Equal(t, "", content)
   270  
   271  	content, err = handler.getHoverContent(ctx, propURI, lsp.Position{Line: 2, Character: 4})
   272  	assert.Equal(t, nil, err)
   273  	assert.Equal(t, "str.replace(old:str, new:str)", content)
   274  }
   275  
   276  /***************************************
   277  *Tests for ast expression statements
   278  ***************************************/
   279  func TestGetHoverContentAst(t *testing.T) {
   280  	var ctx = context.Background()
   281  
   282  	// Test for statement
   283  	content, err := handler.getHoverContent(ctx, miscURI, lsp.Position{Line: 0, Character: 11})
   284  	assert.Equal(t, nil, err)
   285  	assert.Equal(t, "def len(obj)", content)
   286  
   287  	// Test inner For statement
   288  	content, err = handler.getHoverContent(ctx, miscURI, lsp.Position{Line: 1, Character: 11})
   289  	assert.Equal(t, nil, err)
   290  	assert.Equal(t, "str.replace(old:str, new:str)", content)
   291  
   292  	// Test Assert For statement
   293  	content, err = handler.getHoverContent(ctx, miscURI, lsp.Position{Line: 2, Character: 17})
   294  	assert.Equal(t, nil, err)
   295  	assert.Equal(t, "def subinclude(target:str, hash:str=None)", content)
   296  }
   297  
   298  func TestGetHoverContentAst2(t *testing.T) {
   299  	var ctx = context.Background()
   300  
   301  	// Test if statement
   302  	content, err := handler.getHoverContent(ctx, miscURI, lsp.Position{Line: 4, Character: 7})
   303  	assert.Equal(t, nil, err)
   304  	assert.Equal(t, "str.find(needle:str)", content)
   305  
   306  	// Test elif statement
   307  	content, err = handler.getHoverContent(ctx, miscURI, lsp.Position{Line: 6, Character: 8})
   308  	assert.Equal(t, nil, err)
   309  	assert.Equal(t, "str.count(needle:str)", content)
   310  
   311  	// Test return statement
   312  	content, err = handler.getHoverContent(ctx, miscURI, lsp.Position{Line: 5, Character: 17})
   313  	assert.Equal(t, nil, err)
   314  	assert.Equal(t, "def subinclude(target:str, hash:str=None)", content)
   315  
   316  	content, err = handler.getHoverContent(ctx, miscURI, lsp.Position{Line: 9, Character: 17})
   317  	assert.Equal(t, nil, err)
   318  	assert.Equal(t, "str.lower()", content)
   319  }
   320  
   321  func TestGetHoverContentSubinclude(t *testing.T) {
   322  	var ctx = context.Background()
   323  
   324  	// hover on subincluded rule name
   325  	content, err := handler.getHoverContent(ctx, subincludeURI, lsp.Position{Line: 2, Character: 8})
   326  	assert.Equal(t, nil, err)
   327  
   328  	expected := "def plz_e2e_test(name, cmd, pre_cmd=None, expected_output=None, expected_failure=False,\n" +
   329  		"                 expect_output_contains=None, expect_output_doesnt_contain=None,\n" +
   330  		"                 deps=None, data=[], labels=None, sandbox=None,\n" +
   331  		"                 expect_file_exists=None, expect_file_doesnt_exist=None)"
   332  	assert.Equal(t, expected, content)
   333  
   334  	// hover on subincluded arg
   335  	content, err = handler.getHoverContent(ctx, subincludeURI, lsp.Position{Line: 3, Character: 7})
   336  	assert.Equal(t, nil, err)
   337  	assert.Equal(t, "name required:true", content)
   338  }