aboutsummaryrefslogtreecommitdiff
path: root/tests/test_parse_integer.rs
diff options
context:
space:
mode:
Diffstat (limited to 'tests/test_parse_integer.rs')
-rw-r--r--tests/test_parse_integer.rs165
1 files changed, 165 insertions, 0 deletions
diff --git a/tests/test_parse_integer.rs b/tests/test_parse_integer.rs
new file mode 100644
index 0000000..b97d330
--- /dev/null
+++ b/tests/test_parse_integer.rs
@@ -0,0 +1,165 @@
+use codecrafters_redis::resp_parser::*;
+
+#[test]
+fn test_valid_integers() {
+ // Basic valid cases
+ assert_eq!(parse_integers(b":0\r\n").unwrap().0, 0u64);
+ assert_eq!(parse_integers(b":1\r\n").unwrap().0, 1u64);
+ assert_eq!(parse_integers(b":42\r\n").unwrap().0, 42u64);
+ assert_eq!(parse_integers(b":1000\r\n").unwrap().0, 1000u64);
+
+ assert_eq!(parse_integers(b":+42\r\n").unwrap().0, 42u64);
+
+ // Large numbers
+ assert_eq!(
+ parse_integers(b":9223372036854775807\r\n").unwrap().0,
+ 9223372036854775807u64
+ );
+ assert_eq!(
+ parse_integers(b":18446744073709551615\r\n").unwrap().0,
+ 18446744073709551615u64
+ ); // u64::MAX
+
+ // Edge cases
+ assert_eq!(parse_integers(b":123456789\r\n").unwrap().0, 123456789u64);
+
+ // Numbers with leading zeros (should still parse correctly)
+ assert_eq!(parse_integers(b":0000042\r\n").unwrap().0, 42u64);
+ assert_eq!(parse_integers(b":00000\r\n").unwrap().0, 0u64);
+}
+
+#[test]
+fn test_invalid_integers() {
+ // Wrong data type marker
+ assert_eq!(
+ parse_integers(b"+42\r\n").err().unwrap().message(),
+ "ERR Invalid data type"
+ );
+
+ // Negative numbers (not valid for u64)
+ assert_eq!(
+ parse_integers(b":-42\r\n").err().unwrap().message(),
+ "ERR invalid value"
+ );
+
+ // Non-numeric content
+ assert_eq!(
+ parse_integers(b":abc\r\n").err().unwrap().message(),
+ "ERR invalid value"
+ );
+
+ // Mixed numeric and non-numeric
+ assert_eq!(
+ parse_integers(b":42abc\r\n").err().unwrap().message(),
+ "ERR invalid value"
+ );
+
+ // Empty integer
+ assert_eq!(
+ parse_integers(b":\r\n").err().unwrap().message(),
+ "ERR invalid value"
+ );
+
+ // Contains \r in content
+ assert_eq!(
+ parse_integers(b":42\r23\r\n").err().unwrap().message(),
+ "ERR invalid value"
+ );
+
+ // Contains \n in content
+ assert_eq!(
+ parse_integers(b":42\n23\r\n").err().unwrap().message(),
+ "ERR invalid value"
+ );
+
+ // Missing \r\n terminator
+ assert_eq!(
+ parse_integers(b":42").err().unwrap().message(),
+ "ERR Unexpected end of input"
+ );
+
+ // Only \r without \n
+ assert_eq!(
+ parse_integers(b":42\r").err().unwrap().message(),
+ "ERR Unexpected end of input"
+ );
+
+ // Only \n without \r
+ assert_eq!(
+ parse_integers(b":42\n").err().unwrap().message(),
+ "ERR Unexpected end of input"
+ );
+
+ // Empty input
+ assert_eq!(
+ parse_integers(b"").err().unwrap().message(),
+ "ERR Empty data"
+ );
+
+ // Just the marker without content
+ assert_eq!(
+ parse_integers(b":").err().unwrap().message(),
+ "ERR Unexpected end of input"
+ );
+
+ // Number too large for u64
+ assert_eq!(
+ parse_integers(b":18446744073709551616\r\n") // u64::MAX + 1
+ .err()
+ .unwrap()
+ .message(),
+ "ERR invalid value"
+ );
+
+ // Floating point numbers
+ assert_eq!(
+ parse_integers(b":42.5\r\n").err().unwrap().message(),
+ "ERR invalid value"
+ );
+
+ // Scientific notation
+ assert_eq!(
+ parse_integers(b":1e5\r\n").err().unwrap().message(),
+ "ERR invalid value"
+ );
+
+ // Hexadecimal numbers
+ assert_eq!(
+ parse_integers(b":0x42\r\n").err().unwrap().message(),
+ "ERR invalid value"
+ );
+
+ // Whitespace
+ assert_eq!(
+ parse_integers(b": 42\r\n").err().unwrap().message(),
+ "ERR invalid value"
+ );
+
+ assert_eq!(
+ parse_integers(b":42 \r\n").err().unwrap().message(),
+ "ERR invalid value"
+ );
+}
+
+#[test]
+fn test_integer_remaining_bytes() {
+ // Test that remaining bytes are correctly returned
+ let (integer, remaining) = parse_integers(b":42\r\nnext data").unwrap();
+ assert_eq!(integer, 42u64);
+ assert_eq!(remaining, b"next data");
+
+ // Test with multiple commands
+ let (integer, remaining) = parse_integers(b":1337\r\n+OK\r\n").unwrap();
+ assert_eq!(integer, 1337u64);
+ assert_eq!(remaining, b"+OK\r\n");
+
+ // Test with no remaining data
+ let (integer, remaining) = parse_integers(b":999\r\n").unwrap();
+ assert_eq!(integer, 999u64);
+ assert_eq!(remaining, b"");
+
+ // Test with zero and remaining data
+ let (integer, remaining) = parse_integers(b":0\r\n-ERR test\r\n").unwrap();
+ assert_eq!(integer, 0u64);
+ assert_eq!(remaining, b"-ERR test\r\n");
+}