From fc93d0d915d572c9322249b0308924094f9a931c Mon Sep 17 00:00:00 2001 From: Myzel394 <50424412+Myzel394@users.noreply.github.com> Date: Sun, 11 Aug 2024 18:29:48 +0200 Subject: [PATCH 1/3] fix: Improvements; Add tests --- handlers/fstab/fstab_test.go | 121 ++++++++++++++++++++ handlers/fstab/text-document-completion.go | 12 ++ handlers/fstab/text-document-hover.go | 4 + handlers/openssh/value-data-amount-value.go | 2 +- handlers/openssh/value-time-format.go | 2 +- 5 files changed, 139 insertions(+), 2 deletions(-) create mode 100644 handlers/fstab/fstab_test.go diff --git a/handlers/fstab/fstab_test.go b/handlers/fstab/fstab_test.go new file mode 100644 index 0000000..14d4261 --- /dev/null +++ b/handlers/fstab/fstab_test.go @@ -0,0 +1,121 @@ +package fstab + +import ( + fstabdocumentation "config-lsp/handlers/fstab/documentation" + "config-lsp/utils" + "testing" +) + +var sampleValidBasicExample = ` +LABEL=test /mnt/test ext4 defaults 0 0 +` +var sampleInvalidOptionsExample = ` +LABEL=test /mnt/test btrfs subvol=backup,fat=32 0 0 +` + +func TestValidBasicExample(t *testing.T) { + // Arrange + parser := FstabParser{} + + errors := parser.ParseFromContent(sampleValidBasicExample) + + if len(errors) > 0 { + t.Fatal("ParseFromContent failed with error", errors) + } + + // Get hover for first field + entry := parser.entries[0] + + println("Getting hover info") + { + hover, err := getHoverInfo(&entry, uint32(0)) + + if err != nil { + t.Fatal("getHoverInfo failed with error", err) + } + + if hover.Contents != SpecHoverField.Contents { + t.Fatal("getHoverInfo failed to return correct hover content. Got:", hover.Contents, "but expected:", SpecHoverField.Contents) + } + + // Get hover for second field + hover, err = getHoverInfo(&entry, uint32(11)) + if err != nil { + t.Fatal("getHoverInfo failed with error", err) + } + + if hover.Contents != MountPointHoverField.Contents { + t.Fatal("getHoverInfo failed to return correct hover content. Got:", hover.Contents, "but expected:", MountPointHoverField.Contents) + } + + hover, err = getHoverInfo(&entry, uint32(20)) + + if err != nil { + t.Fatal("getHoverInfo failed with error", err) + } + + if hover.Contents != MountPointHoverField.Contents { + t.Fatal("getHoverInfo failed to return correct hover content. Got:", hover.Contents, "but expected:", MountPointHoverField.Contents) + } + } + + println("Getting completions") + { + completions, err := getCompletion(entry.Line, uint32(0)) + + if err != nil { + t.Fatal("getCompletion failed with error", err) + } + + if len(completions) != 4 { + t.Fatal("getCompletion failed to return correct number of completions. Got:", len(completions), "but expected:", 4) + } + + if completions[0].Label != "UUID" { + t.Fatal("getCompletion failed to return correct label. Got:", completions[0].Label, "but expected:", "UUID") + } + } + + { + completions, err := getCompletion(entry.Line, uint32(21)) + + if err != nil { + t.Fatal("getCompletion failed with error", err) + } + + expectedLength := len(utils.KeysOfMap(fstabdocumentation.MountOptionsMapField)) + if len(completions) != expectedLength { + t.Fatal("getCompletion failed to return correct number of completions. Got:", len(completions), "but expected:", expectedLength) + } + } + + println("Checking values") + { + diagnostics := parser.AnalyzeValues() + + if len(diagnostics) > 0 { + t.Fatal("AnalyzeValues failed with error", diagnostics) + } + } +} + +func TestInvalidOptionsExample(t *testing.T) { + // Arrange + parser := FstabParser{} + + errors := parser.ParseFromContent(sampleInvalidOptionsExample) + + if len(errors) > 0 { + t.Fatal("ParseFromContent returned error", errors) + } + + // Get hover for first field + println("Checking values") + { + diagnostics := parser.AnalyzeValues() + + if len(diagnostics) == 0 { + t.Fatal("AnalyzeValues should have returned error") + } + } +} diff --git a/handlers/fstab/text-document-completion.go b/handlers/fstab/text-document-completion.go index 293ed0e..5358634 100644 --- a/handlers/fstab/text-document-completion.go +++ b/handlers/fstab/text-document-completion.go @@ -21,8 +21,20 @@ func TextDocumentCompletion(context *glsp.Context, params *protocol.CompletionPa ), nil } + if entry.Type == FstabEntryTypeComment { + return nil, nil + } + cursor := params.Position.Character line := entry.Line + + return getCompletion(line, cursor) +} + +func getCompletion( + line FstabLine, + cursor uint32, +) ([]protocol.CompletionItem, error) { targetField := line.GetFieldAtPosition(cursor) switch targetField { diff --git a/handlers/fstab/text-document-hover.go b/handlers/fstab/text-document-hover.go index 534776e..96fa182 100644 --- a/handlers/fstab/text-document-hover.go +++ b/handlers/fstab/text-document-hover.go @@ -26,6 +26,10 @@ func TextDocumentHover(context *glsp.Context, params *protocol.HoverParams) (*pr return nil, nil } + return getHoverInfo(entry, cursor) +} + +func getHoverInfo(entry *FstabEntry, cursor uint32) (*protocol.Hover, error) { line := entry.Line targetField := line.GetFieldAtPosition(cursor) diff --git a/handlers/openssh/value-data-amount-value.go b/handlers/openssh/value-data-amount-value.go index 8a26356..4e90811 100644 --- a/handlers/openssh/value-data-amount-value.go +++ b/handlers/openssh/value-data-amount-value.go @@ -27,7 +27,7 @@ func (v DataAmountValue) CheckIsValid(value string) []*docvalues.InvalidValue { if !dataAmountCheckPattern.MatchString(value) { return []*docvalues.InvalidValue{ { - Err: InvalidDataAmountError{}, + Err: InvalidDataAmountError{}, Start: 0, End: uint32(len(value)), }, diff --git a/handlers/openssh/value-time-format.go b/handlers/openssh/value-time-format.go index 87c8c5f..b2f3554 100644 --- a/handlers/openssh/value-time-format.go +++ b/handlers/openssh/value-time-format.go @@ -29,7 +29,7 @@ func (v TimeFormatValue) CheckIsValid(value string) []*docvalues.InvalidValue { if !timeFormatCheckPattern.MatchString(value) { return []*docvalues.InvalidValue{ { - Err: InvalidTimeFormatError{}, + Err: InvalidTimeFormatError{}, Start: 0, End: uint32(len(value)), }, From c166dbabdb2498eb922100217f0bf9ca6b9a01a1 Mon Sep 17 00:00:00 2001 From: Myzel394 <50424412+Myzel394@users.noreply.github.com> Date: Sun, 11 Aug 2024 19:19:43 +0200 Subject: [PATCH 2/3] feat(ci-cd): Add pull request go tests --- .github/workflows/pr-tests.yaml | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 .github/workflows/pr-tests.yaml diff --git a/.github/workflows/pr-tests.yaml b/.github/workflows/pr-tests.yaml new file mode 100644 index 0000000..26142a5 --- /dev/null +++ b/.github/workflows/pr-tests.yaml @@ -0,0 +1,26 @@ +name: Run Go tests + +on: [pull_request] + +jobs: + build: + runs-on: ubuntu-latest + strategy: + matrix: + go-version: [ '1.22.x' ] + + steps: + - uses: actions/checkout@v4 + - name: Setup Go ${{ matrix.go-version }} + uses: actions/setup-go@v5 + with: + go-version: ${{ matrix.go-version }} + # You can test your matrix by printing the current Go version + - name: Display Go version + run: go version + + - name: Get dependencies + run: go mod download + + - name: Run tests + run: go test -v ./... From 5d06143883742022d38e4c77a0df4254b1a1c57b Mon Sep 17 00:00:00 2001 From: Myzel394 <50424412+Myzel394@users.noreply.github.com> Date: Sun, 11 Aug 2024 19:25:14 +0200 Subject: [PATCH 3/3] fix: Fix print --- root-handler/lsp-utils.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/root-handler/lsp-utils.go b/root-handler/lsp-utils.go index 9954660..b714340 100644 --- a/root-handler/lsp-utils.go +++ b/root-handler/lsp-utils.go @@ -28,7 +28,7 @@ type FatalFileNotReadableError struct { } func (e FatalFileNotReadableError) Error() string { - return fmt.Sprint("Fatal error! config-lsp was unable to read the file (%s); error: %s", e.FileURI, e.Err.Error()) + return fmt.Sprintf("Fatal error! config-lsp was unable to read the file (%s); error: %s", e.FileURI, e.Err.Error()) } type UnsupportedLanguageError struct { @@ -36,7 +36,7 @@ type UnsupportedLanguageError struct { } func (e UnsupportedLanguageError) Error() string { - return fmt.Sprint("Language '%s' is not supported. Choose one of: %s", e.SuggestedLanguage, strings.Join(AllSupportedLanguages, ", ")) + return fmt.Sprintf("Language '%s' is not supported. Choose one of: %s", e.SuggestedLanguage, strings.Join(AllSupportedLanguages, ", ")) } type LanguageUndetectableError struct{}