Skip to content

Commit af107fc

Browse files
Merge pull request #228 from codecrafters-io/data-type-assertion
Data Type Assertion
2 parents fbf9707 + 6b91976 commit af107fc

File tree

78 files changed

+271
-212
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

78 files changed

+271
-212
lines changed

internal/anti_cheat.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ func antiCheatTest(stageHarness *test_case_harness.TestCaseHarness) error {
3232
commandTestCase := test_cases.SendCommandTestCase{
3333
Command: "MEMORY",
3434
Args: []string{"DOCTOR"},
35-
Assertion: resp_assertions.NewRegexStringAssertion("[sS]am"),
35+
Assertion: resp_assertions.NewRegexBulkStringAssertion("[sS]am"),
3636
ShouldSkipUnreadDataCheck: true,
3737
}
3838
err = commandTestCase.Run(client, logger)

internal/resp_assertions/array_element_assertion.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,10 @@ type ArrayElementAssertion struct {
1212
}
1313

1414
func (a ArrayElementAssertion) Run(value resp_value.Value) error {
15-
if value.Type != resp_value.ARRAY {
16-
return fmt.Errorf("Expected array, got %s", value.Type)
15+
arrayTypeAssertion := DataTypeAssertion{ExpectedType: resp_value.ARRAY}
16+
17+
if err := arrayTypeAssertion.Run(value); err != nil {
18+
return err
1719
}
1820

1921
array := value.Array()

internal/resp_assertions/array_elements_assertion.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package resp_assertions
22

33
import (
4-
"fmt"
54
"slices"
65

76
resp_value "github.com/codecrafters-io/redis-tester/internal/resp/value"
@@ -18,8 +17,10 @@ type ArrayElementsAssertion struct {
1817
}
1918

2019
func (a ArrayElementsAssertion) Run(value resp_value.Value) error {
21-
if value.Type != resp_value.ARRAY {
22-
return fmt.Errorf("Expected array, got %s", value.Type)
20+
dataTypeAssertion := DataTypeAssertion{ExpectedType: resp_value.ARRAY}
21+
22+
if err := dataTypeAssertion.Run(value); err != nil {
23+
return err
2324
}
2425

2526
// Sort the indexes so the assertion runs serially

internal/resp_assertions/bulk_string_absent_from_array_assertion.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,10 @@ type BulkStringAbsentFromArrayAssertion struct {
1111
}
1212

1313
func (a BulkStringAbsentFromArrayAssertion) Run(value resp_value.Value) error {
14-
if value.Type != resp_value.ARRAY {
15-
return fmt.Errorf("Expected array, got %s", value.Type)
14+
arrayTypeAssertion := DataTypeAssertion{ExpectedType: resp_value.ARRAY}
15+
16+
if err := arrayTypeAssertion.Run(value); err != nil {
17+
return err
1618
}
1719

1820
array := value.Array()
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package resp_assertions
2+
3+
import (
4+
"fmt"
5+
6+
resp_value "github.com/codecrafters-io/redis-tester/internal/resp/value"
7+
)
8+
9+
type BulkStringAssertion struct {
10+
ExpectedValue string
11+
}
12+
13+
func NewBulkStringAssertion(expectedValue string) RESPAssertion {
14+
return BulkStringAssertion{ExpectedValue: expectedValue}
15+
}
16+
17+
func (a BulkStringAssertion) Run(value resp_value.Value) error {
18+
bulkStringTypeAssertion := DataTypeAssertion{ExpectedType: resp_value.BULK_STRING}
19+
20+
if err := bulkStringTypeAssertion.Run(value); err != nil {
21+
return err
22+
}
23+
24+
if value.String() != a.ExpectedValue {
25+
return fmt.Errorf("Expected %q, got %q", a.ExpectedValue, value.String())
26+
}
27+
28+
return nil
29+
}

internal/resp_assertions/bulk_string_present_in_array_assertion.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,10 @@ type BulkStringPresentInArrayAssertion struct {
1111
}
1212

1313
func (a BulkStringPresentInArrayAssertion) Run(value resp_value.Value) error {
14-
if value.Type != resp_value.ARRAY {
15-
return fmt.Errorf("Expected array, got %s", value.Type)
14+
arrayTypeAssertion := DataTypeAssertion{ExpectedType: resp_value.ARRAY}
15+
16+
if err := arrayTypeAssertion.Run(value); err != nil {
17+
return err
1618
}
1719

1820
array := value.Array()

internal/resp_assertions/command_assertion.go

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,10 @@ func NewCommandAssertion(expectedCommand string, expectedArgs ...string) RESPAss
2020
}
2121

2222
func (a CommandAssertion) Run(value resp_value.Value) error {
23-
if value.Type != resp_value.ARRAY {
24-
return fmt.Errorf("Expected array type, got %s", value.Type)
23+
arrayTypeAssertion := DataTypeAssertion{ExpectedType: resp_value.ARRAY}
24+
25+
if err := arrayTypeAssertion.Run(value); err != nil {
26+
return err
2527
}
2628

2729
elements := value.Array()
@@ -30,8 +32,8 @@ func (a CommandAssertion) Run(value resp_value.Value) error {
3032
return fmt.Errorf("Expected array with at least 1 element, got %d elements", len(elements))
3133
}
3234

33-
if elements[0].Type != resp_value.SIMPLE_STRING && elements[0].Type != resp_value.BULK_STRING {
34-
return fmt.Errorf("Expected first array element to be a string, got %s", elements[0].Type)
35+
if elements[0].Type != resp_value.BULK_STRING {
36+
return fmt.Errorf("Expected first array element to be a bulk string, got %s", elements[0].Type)
3537
}
3638

3739
command := elements[0].String()
@@ -46,8 +48,8 @@ func (a CommandAssertion) Run(value resp_value.Value) error {
4648

4749
for i, expectedArg := range a.ExpectedArgs {
4850
actualArg := elements[i+1]
49-
if actualArg.Type != resp_value.SIMPLE_STRING && actualArg.Type != resp_value.BULK_STRING {
50-
return fmt.Errorf("Expected argument %d to be a string, got %s", i+1, actualArg.Type)
51+
if actualArg.Type != resp_value.BULK_STRING {
52+
return fmt.Errorf("Expected argument %d to be a bulk string, got %s", i+1, actualArg.Type)
5153
}
5254

5355
if actualArg.String() != expectedArg {

internal/resp_assertions/data_type_assertion.go

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,22 @@ type DataTypeAssertion struct {
1111
}
1212

1313
func (a DataTypeAssertion) Run(value resp_value.Value) error {
14+
dataTypeHint := ""
15+
16+
switch a.ExpectedType {
17+
case resp_value.NIL:
18+
dataTypeHint = "$-1\r\n"
19+
case resp_value.NIL_ARRAY:
20+
dataTypeHint = "*-1\r\n"
21+
}
22+
23+
// Spacing
24+
if dataTypeHint != "" {
25+
dataTypeHint = " " + dataTypeHint
26+
}
27+
1428
if value.Type != a.ExpectedType {
15-
return fmt.Errorf("Expected %s, found %s", a.ExpectedType, value.Type)
29+
return fmt.Errorf("Expected %s%s, found %s", a.ExpectedType, dataTypeHint, value.Type)
1630
}
1731
return nil
1832
}

internal/resp_assertions/error_assertion.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,10 @@ func NewErrorAssertion(expectedValue string) RESPAssertion {
1515
}
1616

1717
func (a ErrorAssertion) Run(value resp_value.Value) error {
18-
if value.Type != resp_value.ERROR {
19-
return fmt.Errorf("Expected error, got %s", value.Type)
18+
respErrorTypeAssertion := DataTypeAssertion{ExpectedType: resp_value.ERROR}
19+
20+
if err := respErrorTypeAssertion.Run(value); err != nil {
21+
return err
2022
}
2123

2224
if value.Error() != a.ExpectedValue {

internal/resp_assertions/floating_point_bulk_string_assertion.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,10 @@ func NewFloatingPointBulkStringAssertion(expectedValue float64, tolerance float6
2121
}
2222

2323
func (a FloatingPointBulkStringAssertion) Run(value resp_value.Value) error {
24-
if value.Type != resp_value.BULK_STRING {
25-
return fmt.Errorf("Expected bulk string, got %s", value.Type)
24+
bulkStringTypeAssertion := DataTypeAssertion{ExpectedType: resp_value.BULK_STRING}
25+
26+
if err := bulkStringTypeAssertion.Run(value); err != nil {
27+
return err
2628
}
2729

2830
stringValue := value.String()

0 commit comments

Comments
 (0)