1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
|
use codecrafters_redis::resp_parser::*;
#[test]
fn test_valid_arrays() {
// Simple array with strings
let arr = vec![
RespType::BulkString("hello".into()),
RespType::BulkString("world".into()),
];
assert_eq!(
parse_array(b"*2\r\n$5\r\nhello\r\n$5\r\nworld\r\n")
.unwrap()
.0,
RespType::Array(arr)
);
// Array with mixed types
let arr = vec![
RespType::Integer(42),
RespType::SimpleString("OK".to_string()),
RespType::Null(),
];
assert_eq!(
parse_array(b"*3\r\n:42\r\n+OK\r\n_\r\n").unwrap().0,
RespType::Array(arr)
);
// Nested array
let arr = vec![
RespType::Array(vec![
RespType::BulkString("nested".into()),
RespType::Integer(123),
]),
RespType::SimpleError("ERR test".to_string()),
];
assert_eq!(
parse_array(b"*2\r\n*2\r\n$6\r\nnested\r\n:123\r\n-ERR test\r\n")
.unwrap()
.0,
RespType::Array(arr)
);
// Empty array
let arr = vec![];
assert_eq!(parse_array(b"*0\r\n").unwrap().0, RespType::Array(arr));
}
#[test]
fn test_invalid_arrays() {
// Wrong data type marker
assert_eq!(
parse_array(b"+2\r\n$5\r\nhello\r\n")
.err()
.unwrap()
.message(),
"ERR Invalid data type"
);
// Missing \r\n terminator
assert_eq!(
parse_array(b"*2\r\n$5\r\nhello\r\n$5\r\nworld")
.err()
.unwrap()
.message(),
"ERR Unexpected end of input"
);
// Invalid length
assert_eq!(
parse_array(b"*-1\r\n").err().unwrap().message(),
"ERR invalid value"
);
// Non-numeric length
assert_eq!(
parse_array(b"*abc\r\n").err().unwrap().message(),
"ERR invalid value"
);
// Incomplete array elements
assert_eq!(
parse_array(b"*2\r\n$5\r\nhello\r\n")
.err()
.unwrap()
.message(),
"ERR Unexpected end of input"
);
// Empty input
assert_eq!(parse_array(b"").err().unwrap().message(), "ERR Empty data");
// Just the marker
assert_eq!(
parse_array(b"*").err().unwrap().message(),
"ERR Unexpected end of input"
);
// Invalid element type
assert_eq!(
parse_array(b"*1\r\n@invalid\r\n").err().unwrap().message(),
"ERR Invalid data type"
);
}
#[test]
fn test_array_remaining_bytes() {
// Test with remaining data
let arr = vec![RespType::BulkString("test".into()), RespType::Integer(99)];
let (value, remaining) = parse_array(b"*2\r\n$4\r\ntest\r\n:99\r\n+OK\r\n").unwrap();
assert_eq!(value, RespType::Array(arr));
assert_eq!(remaining, b"+OK\r\n");
// Test with no remaining data
let arr = vec![RespType::SimpleString("PONG".to_string())];
let (value, remaining) = parse_array(b"*1\r\n+PONG\r\n").unwrap();
assert_eq!(value, RespType::Array(arr));
assert_eq!(remaining, b"");
// Test with multiple commands
let arr = vec![RespType::Null()];
let (value, remaining) = parse_array(b"*1\r\n_\r\n*0\r\n").unwrap();
assert_eq!(value, RespType::Array(arr));
assert_eq!(remaining, b"*0\r\n");
// Test with empty array and remaining data
let arr = vec![];
let (value, remaining) = parse_array(b"*0\r\n-ERR test\r\n").unwrap();
assert_eq!(value, RespType::Array(arr));
assert_eq!(remaining, b"-ERR test\r\n");
}
|