diff --git a/internal/resp_assertions/ordered_array_assertion.go b/internal/resp_assertions/ordered_array_assertion.go new file mode 100644 index 00000000..def0ba36 --- /dev/null +++ b/internal/resp_assertions/ordered_array_assertion.go @@ -0,0 +1,44 @@ +package resp_assertions + +import ( + "bytes" + "fmt" + + resp_value "github.com/codecrafters-io/redis-tester/internal/resp/value" +) + +// OrderedArrayAssertion : Order of the actual and expected values matters. +// All RESP values are accepted as elements in this array. +// We don't alter the ordering. +type OrderedArrayAssertion struct { + ExpectedValue []resp_value.Value +} + +func NewOrderedArrayAssertion(expectedValue []resp_value.Value) RESPAssertion { + return OrderedArrayAssertion{ExpectedValue: expectedValue} +} + +func (a OrderedArrayAssertion) Run(value resp_value.Value) error { + if value.Type != resp_value.ARRAY { + return fmt.Errorf("Expected an array, got %s", value.Type) + } + + if len(value.Array()) != len(a.ExpectedValue) { + return fmt.Errorf("Expected %d elements in array, got %d (%s)", len(a.ExpectedValue), len(value.Array()), value.FormattedString()) + } + + for i, expectedValue := range a.ExpectedValue { + actualElement := value.Array()[i] + + if actualElement.Type != expectedValue.Type { + return fmt.Errorf("Expected element #%d to be a %s, got %s", i+1, expectedValue.Type, actualElement.Type) + } + + // ToDo: Equal or EqualFold ? + if !bytes.Equal(actualElement.Bytes(), expectedValue.Bytes()) { + return fmt.Errorf("Expected element #%d to be %q, got %q", i+1, expectedValue.FormattedString(), actualElement.FormattedString()) + } + } + + return nil +} diff --git a/internal/tester_definition.go b/internal/tester_definition.go index f7a470b9..aec7e625 100644 --- a/internal/tester_definition.go +++ b/internal/tester_definition.go @@ -192,5 +192,13 @@ var testerDefinition = tester_definition.TesterDefinition{ Slug: "xu1", TestFunc: testStreamsXreadBlockMaxID, }, + { + Slug: "xv1", + TestFunc: testTxSuccess, + }, + { + Slug: "jy1", + TestFunc: testTxErr, + }, }, }