diff options
| author | omagdy <omar.professional8777@gmail.com> | 2025-07-17 08:06:26 +0300 |
|---|---|---|
| committer | omagdy <omar.professional8777@gmail.com> | 2025-07-17 08:06:26 +0300 |
| commit | 38b649ea16d8ed053fd9222bfb9867e3432ee2a6 (patch) | |
| tree | a7fbde68ad869e1b74071207bdf7b7c159c7f75f /tests/test_parse_integer.rs | |
| parent | c880c7ad3eba9546ce95bc268218c66a128d319f (diff) | |
| download | redis-rust-38b649ea16d8ed053fd9222bfb9867e3432ee2a6.tar.xz redis-rust-38b649ea16d8ed053fd9222bfb9867e3432ee2a6.zip | |
test: Moved tests to seprate files under tests folder for more structure
Diffstat (limited to 'tests/test_parse_integer.rs')
| -rw-r--r-- | tests/test_parse_integer.rs | 165 |
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"); +} |
