mirror of
https://github.com/opentofu/opentofu.git
synced 2024-12-23 07:33:32 -06:00
131c2cadda
Signed-off-by: Andrew Hayes <andrew.hayes@harness.io>
227 lines
4.5 KiB
Go
227 lines
4.5 KiB
Go
// Copyright (c) The OpenTofu Authors
|
|
// SPDX-License-Identifier: MPL-2.0
|
|
// Copyright (c) 2023 HashiCorp, Inc.
|
|
// SPDX-License-Identifier: MPL-2.0
|
|
|
|
package command
|
|
|
|
import "testing"
|
|
|
|
func Test_commandInOpenState(t *testing.T) {
|
|
type testCase struct {
|
|
input string
|
|
expected int
|
|
}
|
|
|
|
tests := map[string]testCase{
|
|
"plain braces": {
|
|
input: "{}",
|
|
expected: 0,
|
|
},
|
|
"plain brackets": {
|
|
input: "[]",
|
|
expected: 0,
|
|
},
|
|
"plain parentheses": {
|
|
input: "()",
|
|
expected: 0,
|
|
},
|
|
"open braces": {
|
|
input: "{",
|
|
expected: 1,
|
|
},
|
|
"open brackets": {
|
|
input: "[",
|
|
expected: 1,
|
|
},
|
|
"open parentheses": {
|
|
input: "(",
|
|
expected: 1,
|
|
},
|
|
"two open braces": {
|
|
input: "{{",
|
|
expected: 2,
|
|
},
|
|
"two open brackets": {
|
|
input: "[[",
|
|
expected: 2,
|
|
},
|
|
"two open parentheses": {
|
|
input: "((",
|
|
expected: 2,
|
|
},
|
|
"open and closed braces": {
|
|
input: "{{}",
|
|
expected: 1,
|
|
},
|
|
"open and closed brackets": {
|
|
input: "[[]",
|
|
expected: 1,
|
|
},
|
|
"open and closed parentheses": {
|
|
input: "(()",
|
|
expected: 1,
|
|
},
|
|
"mix braces and brackets": {
|
|
input: "{[]",
|
|
expected: 1,
|
|
},
|
|
"mix brackets and parentheses": {
|
|
input: "[()",
|
|
expected: 1,
|
|
},
|
|
"mix parentheses and braces": {
|
|
input: "({}",
|
|
expected: 1,
|
|
},
|
|
"invalid braces": {
|
|
input: "{}}",
|
|
expected: -1,
|
|
},
|
|
"invalid brackets": {
|
|
input: "[]]",
|
|
expected: -1,
|
|
},
|
|
"invalid parentheses": {
|
|
input: "())",
|
|
expected: -1,
|
|
},
|
|
"escaped new line": {
|
|
input: "\\",
|
|
expected: 1,
|
|
},
|
|
"false positive new line": {
|
|
input: "\\\\",
|
|
expected: 0,
|
|
},
|
|
"mix parentheses and new line": {
|
|
input: "(\\",
|
|
expected: 2,
|
|
},
|
|
}
|
|
|
|
for testName, tc := range tests {
|
|
t.Run(testName, func(t *testing.T) {
|
|
state := consoleBracketState{}
|
|
_, actual := state.UpdateState(tc.input)
|
|
if actual != tc.expected {
|
|
t.Fatalf("Actual: %d, expected %d", actual, tc.expected)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func Test_UpdateState(t *testing.T) {
|
|
type testCase struct {
|
|
inputs []string
|
|
expected int
|
|
}
|
|
|
|
tests := map[string]testCase{
|
|
"plain braces": {
|
|
inputs: []string{"{", "}"},
|
|
expected: 0,
|
|
},
|
|
"open brackets": {
|
|
inputs: []string{"[", "[", "]"},
|
|
expected: 1,
|
|
},
|
|
"invalid parenthesis": {
|
|
inputs: []string{"(", ")", ")"},
|
|
expected: -1,
|
|
},
|
|
"a fake brace": {
|
|
inputs: []string{"{", "\"}\"", "}"},
|
|
expected: 0,
|
|
},
|
|
"a mixed bag": {
|
|
inputs: []string{"{", "}", "[", "...", "()", "]"},
|
|
expected: 0,
|
|
},
|
|
"multiple open": {
|
|
inputs: []string{"{", "[", "("},
|
|
expected: 3,
|
|
},
|
|
"escaped new line": {
|
|
inputs: []string{"\\"},
|
|
expected: 1,
|
|
},
|
|
"false positive new line": {
|
|
inputs: []string{"\\\\"},
|
|
expected: 0,
|
|
},
|
|
}
|
|
|
|
for testName, tc := range tests {
|
|
t.Run(testName, func(t *testing.T) {
|
|
actual := 0
|
|
state := consoleBracketState{}
|
|
for _, input := range tc.inputs {
|
|
_, actual = state.UpdateState(input)
|
|
}
|
|
|
|
if actual != tc.expected {
|
|
t.Fatalf("Actual: %d, expected %d", actual, tc.expected)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func Test_GetFullCommand(t *testing.T) {
|
|
type testCase struct {
|
|
inputs []string
|
|
expected []string
|
|
}
|
|
|
|
tests := map[string]testCase{
|
|
"plain braces": {
|
|
inputs: []string{"{", "}"},
|
|
expected: []string{"{", "{\n}"},
|
|
},
|
|
"open brackets": {
|
|
inputs: []string{"[", "[", "]"},
|
|
expected: []string{"[", "[\n[", "[\n[\n]"},
|
|
},
|
|
"invalid parenthesis": {
|
|
inputs: []string{"(", ")", ")"},
|
|
expected: []string{"(", "(\n)", ")"},
|
|
},
|
|
"a fake brace": {
|
|
inputs: []string{"{", "\"}\"", "}"},
|
|
expected: []string{"{", "{\n\"}\"", "{\n\"}\"\n}"},
|
|
},
|
|
"a mixed bag": {
|
|
inputs: []string{"{", "}", "[", "...", "", "()", "]"},
|
|
expected: []string{"{", "{\n}", "[", "[\n...", "[\n...", "[\n...\n()", "[\n...\n()\n]"},
|
|
},
|
|
"multiple open": {
|
|
inputs: []string{"{", "[", "("},
|
|
expected: []string{"{", "{\n[", "{\n[\n("},
|
|
},
|
|
"escaped new line": {
|
|
inputs: []string{"\\"},
|
|
expected: []string{""},
|
|
},
|
|
"false positive new line": {
|
|
inputs: []string{"\\\\"},
|
|
expected: []string{"\\"},
|
|
},
|
|
}
|
|
|
|
for testName, tc := range tests {
|
|
t.Run(testName, func(t *testing.T) {
|
|
state := consoleBracketState{}
|
|
if len(tc.inputs) != len(tc.expected) {
|
|
t.Fatalf("\nthe length of inputs: %d\n and expected: %d don't match", len(tc.inputs), len(tc.expected))
|
|
}
|
|
|
|
for i, input := range tc.inputs {
|
|
actual, _ := state.UpdateState(input)
|
|
if actual != tc.expected[i] {
|
|
t.Fatalf("\nActual: %q\nexpected: %q", actual, tc.expected[i])
|
|
}
|
|
}
|
|
})
|
|
}
|
|
}
|