From 98a4280c41ae78f65f56f5ebce93c63d3dfbc0ba Mon Sep 17 00:00:00 2001 From: Jason Toffaletti Date: Mon, 23 May 2022 02:01:15 -0700 Subject: [PATCH] Add octal binary literals (#5604) Schema `0o[77]` with the same padding behavior as the other binary literals - this updates #5551 - test for parsing binary from octal - test for string parsing --- crates/nu-parser/src/parser.rs | 6 +- crates/nu-parser/tests/test_parser.rs | 85 +++++++++++++++++++++++++++ 2 files changed, 90 insertions(+), 1 deletion(-) diff --git a/crates/nu-parser/src/parser.rs b/crates/nu-parser/src/parser.rs index 44f20ec9b3..c7ec102231 100644 --- a/crates/nu-parser/src/parser.rs +++ b/crates/nu-parser/src/parser.rs @@ -1094,7 +1094,11 @@ pub fn parse_binary( ) -> (Expression, Option) { let (hex_value, err) = parse_binary_with_base(working_set, span, 16, 2, b"0x[", b"]"); if err.is_some() { - return parse_binary_with_base(working_set, span, 2, 8, b"0b[", b"]"); + let (octal_value, err) = parse_binary_with_base(working_set, span, 8, 3, b"0o[", b"]"); + if err.is_some() { + return parse_binary_with_base(working_set, span, 2, 8, b"0b[", b"]"); + } + return (octal_value, err); } (hex_value, err) } diff --git a/crates/nu-parser/tests/test_parser.rs b/crates/nu-parser/tests/test_parser.rs index 79339ba1c7..115ff48185 100644 --- a/crates/nu-parser/tests/test_parser.rs +++ b/crates/nu-parser/tests/test_parser.rs @@ -117,6 +117,91 @@ pub fn parse_binary_with_incomplete_binary_format() { assert_eq!(expressions[0].expr, Expr::Binary(vec![0b00000010])) } +#[test] +pub fn parse_binary_with_octal_format() { + let engine_state = EngineState::new(); + let mut working_set = StateWorkingSet::new(&engine_state); + + let (block, err) = parse(&mut working_set, None, b"0o[250]", true, &[]); + + assert!(err.is_none()); + assert!(block.len() == 1); + let expressions = &block[0]; + assert!(expressions.len() == 1); + assert_eq!(expressions[0].expr, Expr::Binary(vec![0o250])) +} + +#[test] +pub fn parse_binary_with_incomplete_octal_format() { + let engine_state = EngineState::new(); + let mut working_set = StateWorkingSet::new(&engine_state); + + let (block, err) = parse(&mut working_set, None, b"0o[2]", true, &[]); + + assert!(err.is_none()); + assert!(block.len() == 1); + let expressions = &block[0]; + assert!(expressions.len() == 1); + assert_eq!(expressions[0].expr, Expr::Binary(vec![0o2])) +} + +#[test] +pub fn parse_binary_with_invalid_octal_format() { + let engine_state = EngineState::new(); + let mut working_set = StateWorkingSet::new(&engine_state); + + let (block, err) = parse(&mut working_set, None, b"0b[90]", true, &[]); + + assert!(err.is_none()); + assert!(block.len() == 1); + let expressions = &block[0]; + assert!(expressions.len() == 1); + assert!(match &expressions[0].expr { + Expr::Binary(_) => false, + _ => true, + }) +} + +#[test] +pub fn parse_string() { + let engine_state = EngineState::new(); + let mut working_set = StateWorkingSet::new(&engine_state); + + let (block, err) = parse(&mut working_set, None, b"\"hello nushell\"", true, &[]); + + assert!(err.is_none()); + assert!(block.len() == 1); + let expressions = &block[0]; + assert!(expressions.len() == 1); + assert_eq!( + expressions[0].expr, + Expr::String("hello nushell".to_string()) + ) +} + +#[test] +pub fn parse_escaped_string() { + let engine_state = EngineState::new(); + let mut working_set = StateWorkingSet::new(&engine_state); + + let (block, err) = parse( + &mut working_set, + None, + b"\"hello \\u006e\\u0075\\u0073hell\"", + true, + &[], + ); + + assert!(err.is_none()); + assert!(block.len() == 1); + let expressions = &block[0]; + assert!(expressions.len() == 1); + assert_eq!( + expressions[0].expr, + Expr::String("hello nushell".to_string()) + ) +} + #[test] pub fn parse_call() { let engine_state = EngineState::new();