From 2af2b05e53182ef658d38e1b57031e5e3002c10d Mon Sep 17 00:00:00 2001 From: Russell Date: Mon, 17 Feb 2025 19:19:47 -0800 Subject: [PATCH 1/3] restrict first char of identifiers --- src/filter/grammar.pest | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/filter/grammar.pest b/src/filter/grammar.pest index 057f8a9..a93c8b4 100644 --- a/src/filter/grammar.pest +++ b/src/filter/grammar.pest @@ -5,7 +5,8 @@ quote = _{ "\"" | "'" } quoted_name = { quoted_char+ } quoted_char = _{ !(quote) ~ ANY } prop = _{ "." ~ name } -name = { id_char+ } +name = { start_char ~ id_char* } +start_char = _{ ASCII_ALPHA | "_" } id_char = _{ ASCII_ALPHANUMERIC | "_" } labels = _{ "{" ~ label_expr ~ ("," ~ label_expr)* ~ "}" } label_expr = _{ "\"" ~ label ~ "\"" } From e55e3ca554f4d4fb8309d11062aafb169461ddd4 Mon Sep 17 00:00:00 2001 From: Russell Date: Mon, 17 Feb 2025 19:34:38 -0800 Subject: [PATCH 2/3] simplify tests --- src/filter/parser.rs | 17 +++++------- tests/delete-tests.rs | 62 +++++++++++++++++++++---------------------- tests/query-tests.rs | 44 ++++++++++-------------------- tests/write-tests.rs | 33 +++++++++-------------- 4 files changed, 63 insertions(+), 93 deletions(-) diff --git a/src/filter/parser.rs b/src/filter/parser.rs index bb26e14..9e0588f 100644 --- a/src/filter/parser.rs +++ b/src/filter/parser.rs @@ -73,38 +73,33 @@ pub fn parse_filter(input: &str) -> Result, Box>> { #[cfg(test)] mod tests { - use std::error::Error; - use super::*; #[test] - fn name_filter() -> Result<(), Box> { + fn name_filter() { let input = ".a_name"; let expected = vec![Field::new("a_name")]; - let fields = parse_filter(input)?; + let fields = parse_filter(input).expect("parse error"); assert_eq!(expected, fields); - Ok(()) } #[test] - fn label_filter() -> Result<(), Box> { + fn label_filter() { let input = ".a_name{\"a_label\"}"; let expected = vec![Field::labeled("a_name", &["a_label"])]; - let fields = parse_filter(input)?; + let fields = parse_filter(input).expect("parse error"); assert_eq!(expected, fields); - Ok(()) } #[test] - fn traversal_filter() -> Result<(), Box> { + fn traversal_filter() { let input = ".a_name{\"a_label\"}.another_name{\"another_label\"}.third_name"; let expected = vec![ Field::labeled("a_name", &["a_label"]), Field::labeled("another_name", &["another_label"]), Field::new("third_name"), ]; - let fields = parse_filter(input)?; + let fields = parse_filter(input).expect("parse error"); assert_eq!(expected, fields); - Ok(()) } } diff --git a/tests/delete-tests.rs b/tests/delete-tests.rs index cfb8c32..436891e 100644 --- a/tests/delete-tests.rs +++ b/tests/delete-tests.rs @@ -1,98 +1,96 @@ -use std::error::Error; - use hq_rs::{delete, parser::Field}; #[test] -fn delete_attr() -> Result<(), Box> { +fn delete_attr() { // filter '.version' let fields = vec![Field::new("version")]; - let mut body = utilities::edit_hcl("version = \"test\"")?; + let mut body = utilities::edit_hcl("version = \"test\"").expect("hcl error"); - delete(fields, &mut body)?; + delete(fields, &mut body).expect("delete error"); assert_eq!("", body.to_string()); - - Ok(()) } #[test] -fn delete_labeled_block() -> Result<(), Box> { +fn delete_labeled_block() { // filter '.module{"cool-module"}' let fields = vec![Field::labeled("module", &["cool-module"])]; - let mut body = utilities::edit_hcl("module \"cool-module\" { version = \"1.0\" }")?; + let mut body = + utilities::edit_hcl("module \"cool-module\" { version = \"1.0\" }").expect("hcl error"); - delete(fields, &mut body)?; + delete(fields, &mut body).expect("delete error"); assert_eq!("", body.to_string()); - Ok(()) } #[test] -fn delete_labeled_block_attr() -> Result<(), Box> { +fn delete_labeled_block_attr() { // filter '.module{"cool-module"}.version' let fields = vec![ Field::labeled("module", &["cool-module"]), Field::new("version"), ]; - let mut body = utilities::edit_hcl("module \"cool-module\" { version = \"1.0\" }")?; + let mut body = + utilities::edit_hcl("module \"cool-module\" { version = \"1.0\" }").expect("hcl error"); - delete(fields, &mut body)?; + delete(fields, &mut body).expect("delete error"); assert_eq!("module \"cool-module\" {}", body.to_string()); - Ok(()) } #[test] -fn delete_block() -> Result<(), Box> { +fn delete_block() { // filter '.local' let fields = vec![Field::new("local")]; - let mut body = utilities::edit_hcl("local { var = 5 }")?; + let mut body = utilities::edit_hcl("local { var = 5 }").expect("hcl error"); - delete(fields, &mut body)?; + delete(fields, &mut body).expect("delete error"); assert_eq!("", body.to_string()); - Ok(()) } #[test] -fn delete_block_attr() -> Result<(), Box> { +fn delete_block_attr() { // filter '.local.var' let fields = vec![Field::new("local"), Field::new("var")]; - let mut body = utilities::edit_hcl("local { var = 5 }")?; + let mut body = utilities::edit_hcl("local { var = 5 }").expect("hcl error"); - delete(fields, &mut body)?; + delete(fields, &mut body).expect("delete error"); assert_eq!("local {}", body.to_string()); - Ok(()) } #[test] -fn delete_from_object() -> Result<(), Box> { +fn delete_from_object() { // filter '.local.obj.val' let fields = vec![Field::new("local"), Field::new("obj"), Field::new("val")]; - let mut body = utilities::edit_hcl("local { obj = { val = 5 } }")?; + let mut body = utilities::edit_hcl("local { obj = { val = 5 } }").expect("hcl error"); - delete(fields, &mut body)?; + delete(fields, &mut body).expect("delete error"); assert_eq!("local { obj = {} }", body.to_string()); - Ok(()) } #[test] -fn delete_from_nested_object() -> Result<(), Box> { +fn delete_from_nested_object() { // filter '.local.obj.obj2.val' - let fields = vec![Field::new("local"), Field::new("obj"), Field::new("obj2"), Field::new("val")]; + let fields = vec![ + Field::new("local"), + Field::new("obj"), + Field::new("obj2"), + Field::new("val"), + ]; - let mut body = utilities::edit_hcl("local { obj = { obj2 = { val = 5 } } }")?; + let mut body = + utilities::edit_hcl("local { obj = { obj2 = { val = 5 } } }").expect("hcl error"); - delete(fields, &mut body)?; + delete(fields, &mut body).expect("delete error"); assert_eq!("local { obj = { obj2 = {} } }", body.to_string()); - Ok(()) } diff --git a/tests/query-tests.rs b/tests/query-tests.rs index 24cbf8f..e96e3a2 100644 --- a/tests/query-tests.rs +++ b/tests/query-tests.rs @@ -1,12 +1,10 @@ -use std::error::Error; - use hq_rs::{parser::Field, query}; #[test] -fn scalar_attr() -> Result<(), Box> { +fn scalar_attr() { // filter '.version' let mut fields = vec![Field::new("version")]; - let body = utilities::read_test_hcl()?; + let body = utilities::read_test_hcl().expect("hcl error"); let expected = vec![String::from("\"test\"")]; @@ -16,15 +14,13 @@ fn scalar_attr() -> Result<(), Box> { .collect(); assert_eq!(expected, results); - - Ok(()) } #[test] -fn obj_attr() -> Result<(), Box> { +fn obj_attr() { // filter '.options' let mut fields = vec![Field::new("options")]; - let body = utilities::read_test_hcl()?; + let body = utilities::read_test_hcl().expect("hcl error"); let expected = vec![String::from("{\n verbose = true\n debug = false\n}")]; @@ -34,15 +30,13 @@ fn obj_attr() -> Result<(), Box> { .collect(); assert_eq!(expected, results); - - Ok(()) } #[test] -fn block_attr() -> Result<(), Box> { +fn block_attr() { // filter '.variable.default' let mut fields = vec![Field::new("variable"), Field::new("default")]; - let body = utilities::read_test_hcl()?; + let body = utilities::read_test_hcl().expect("hcl error"); let expected = vec![ String::from("\"my_default_value\""), @@ -55,18 +49,16 @@ fn block_attr() -> Result<(), Box> { .collect(); assert_eq!(expected, results); - - Ok(()) } #[test] -fn labeled_block_attr() -> Result<(), Box> { +fn labeled_block_attr() { // filter '.variable{"my_var"}.default' let mut fields = vec![ Field::labeled("variable", &["my_var"]), Field::new("default"), ]; - let body = utilities::read_test_hcl()?; + let body = utilities::read_test_hcl().expect("hcl error"); let expected = vec![String::from("\"my_default_value\"")]; @@ -76,15 +68,13 @@ fn labeled_block_attr() -> Result<(), Box> { .collect(); assert_eq!(expected, results); - - Ok(()) } #[test] -fn block() -> Result<(), Box> { +fn block() { // filter '.data' let mut fields = vec![Field::new("data")]; - let body = utilities::read_test_hcl()?; + let body = utilities::read_test_hcl().expect("hcl error"); let expected = vec![ String::from("data \"a_data_block\" \"with_some_attrs\" {\n my_attr = \"my_attr_value\"\n another_attr = \"another_attr_value\"\n}\n"), @@ -97,15 +87,13 @@ fn block() -> Result<(), Box> { .collect(); assert_eq!(expected, results); - - Ok(()) } #[test] -fn labeled_block() -> Result<(), Box> { +fn labeled_block() { // filter '.data{"another_data_block"}' let mut fields = vec![Field::labeled("data", &["another_data_block"])]; - let body = utilities::read_test_hcl()?; + let body = utilities::read_test_hcl().expect("hcl error"); let expected = vec![String::from("data \"another_data_block\" \"with_some_attrs\" {\n cromulent_attr = \"cromulent_value\"\n}\n")]; @@ -115,18 +103,16 @@ fn labeled_block() -> Result<(), Box> { .collect(); assert_eq!(expected, results); - - Ok(()) } #[test] -fn dash_labeled_block() -> Result<(), Box> { +fn dash_labeled_block() { // filter '.module{"cool-module"}.version' let mut fields = vec![ Field::labeled("module", &["cool-module"]), Field::new("version"), ]; - let body = utilities::read_test_hcl()?; + let body = utilities::read_test_hcl().expect("hcl error"); let expected = vec![String::from("\"1.2.3\"")]; @@ -136,6 +122,4 @@ fn dash_labeled_block() -> Result<(), Box> { .collect(); assert_eq!(expected, results); - - Ok(()) } diff --git a/tests/write-tests.rs b/tests/write-tests.rs index 1bf0a1e..83bd716 100644 --- a/tests/write-tests.rs +++ b/tests/write-tests.rs @@ -1,57 +1,50 @@ -use std::error::Error; - use hq_rs::{parser::Field, write}; #[test] -fn attr() -> Result<(), Box> { +fn attr() { // filter '.version' let fields = vec![Field::new("version")]; - let mut body = utilities::edit_hcl("version = \"test\"")?; + let mut body = utilities::edit_hcl("version = \"test\"").expect("hcl error"); - let value: hcl_edit::expr::Expression = "\"new_value\"".parse()?; + let value: hcl_edit::expr::Expression = "\"new_value\"".parse().expect("parse error"); - write(fields, &mut body, &value)?; + write(fields, &mut body, &value).expect("write error"); assert_eq!("version = \"new_value\"", body.to_string()); - - Ok(()) } #[test] -fn block_attr() -> Result<(), Box> { +fn block_attr() { // filter '.options.enabled' let fields = vec![Field::new("options"), Field::new("enabled")]; - let mut body = utilities::edit_hcl("options { enabled = false }")?; + let mut body = utilities::edit_hcl("options { enabled = false }").expect("hcl error"); - let value: hcl_edit::expr::Expression = "true".parse()?; + let value: hcl_edit::expr::Expression = "true".parse().expect("parse error"); - write(fields, &mut body, &value)?; + write(fields, &mut body, &value).expect("write error"); assert_eq!("options { enabled = true }", body.to_string()); - - Ok(()) } #[test] -fn labeled_block_attr() -> Result<(), Box> { +fn labeled_block_attr() { // filter '.module{"cool-module"}.version' let fields = vec![ Field::labeled("module", &["cool-module"]), Field::new("version"), ]; - let mut body = utilities::edit_hcl("module \"cool-module\" { version = \"1.0\" }")?; + let mut body = + utilities::edit_hcl("module \"cool-module\" { version = \"1.0\" }").expect("hcl error"); - let value: hcl_edit::expr::Expression = "\"2.0\"".parse()?; + let value: hcl_edit::expr::Expression = "\"2.0\"".parse().expect("parse error"); - write(fields, &mut body, &value)?; + write(fields, &mut body, &value).expect("write error"); assert_eq!( "module \"cool-module\" { version = \"2.0\" }", body.to_string() ); - - Ok(()) } From 5d92f40686aeefcac4de9af07ab5279519a23dbd Mon Sep 17 00:00:00 2001 From: Russell Date: Mon, 17 Feb 2025 19:40:01 -0800 Subject: [PATCH 3/3] add id start test --- src/filter/parser.rs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/filter/parser.rs b/src/filter/parser.rs index 9e0588f..81943b8 100644 --- a/src/filter/parser.rs +++ b/src/filter/parser.rs @@ -83,6 +83,13 @@ mod tests { assert_eq!(expected, fields); } + #[test] + fn invalid_name_filter() { + let input = ".4foo"; + let result = parse_filter(input); + assert!(result.is_err()); + } + #[test] fn label_filter() { let input = ".a_name{\"a_label\"}";