From 246c72defe8eb595cb0c5599c33769472df00d3e Mon Sep 17 00:00:00 2001 From: Nico Gallinal Date: Thu, 14 Dec 2023 17:25:09 -0300 Subject: [PATCH 1/2] add proptest crate --- Cargo.lock | 147 ++++++++++++++++++ crates/parser/Cargo.toml | 1 + .../parser/proptest-regressions/codegen.txt | 6 + crates/parser/src/codegen.rs | 35 +++-- 4 files changed, 172 insertions(+), 17 deletions(-) create mode 100644 crates/parser/proptest-regressions/codegen.txt diff --git a/Cargo.lock b/Cargo.lock index 52ca5216..9134793b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -110,6 +110,21 @@ dependencies = [ "which", ] +[[package]] +name = "bit-set" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" + [[package]] name = "bitflags" version = "1.3.2" @@ -337,6 +352,12 @@ dependencies = [ "miniz_oxide", ] +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + [[package]] name = "form_urlencoded" version = "1.2.0" @@ -438,6 +459,17 @@ dependencies = [ "byteorder", ] +[[package]] +name = "getrandom" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe9006bed769170c11f845cf00c7c1e9092aeb3f268e007c3e760ac68008070f" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + [[package]] name = "gimli" version = "0.28.0" @@ -590,6 +622,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "libm" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" + [[package]] name = "linked-hash-map" version = "0.5.6" @@ -679,6 +717,16 @@ dependencies = [ "minimal-lexical", ] +[[package]] +name = "num-traits" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" +dependencies = [ + "autocfg", + "libm", +] + [[package]] name = "num_cpus" version = "1.16.0" @@ -739,6 +787,7 @@ dependencies = [ "petgraph", "pg_query", "pg_query_proto_parser", + "proptest", "regex", "serde_json", ] @@ -843,6 +892,12 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + [[package]] name = "prettyplease" version = "0.2.15" @@ -886,6 +941,26 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "proptest" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31b476131c3c86cb68032fdc5cb6d5a1045e3e42d96b69fa599fd77701e1f5bf" +dependencies = [ + "bit-set", + "bit-vec", + "bitflags 2.4.1", + "lazy_static", + "num-traits", + "rand", + "rand_chacha", + "rand_xorshift", + "regex-syntax", + "rusty-fork", + "tempfile", + "unarray", +] + [[package]] name = "prost" version = "0.10.4" @@ -977,6 +1052,12 @@ dependencies = [ "thiserror", ] +[[package]] +name = "quick-error" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" + [[package]] name = "quote" version = "1.0.33" @@ -986,6 +1067,45 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rand_xorshift" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" +dependencies = [ + "rand_core", +] + [[package]] name = "redox_syscall" version = "0.4.1" @@ -1059,6 +1179,18 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "rusty-fork" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb3dcc6e454c328bb824492db107ab7c0ae8fcffe4ad210136ef014458c1bc4f" +dependencies = [ + "fnv", + "quick-error", + "tempfile", + "wait-timeout", +] + [[package]] name = "ryu" version = "1.0.15" @@ -1424,6 +1556,12 @@ dependencies = [ "stable_deref_trait", ] +[[package]] +name = "unarray" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" + [[package]] name = "unicode-bidi" version = "0.3.13" @@ -1469,6 +1607,15 @@ version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +[[package]] +name = "wait-timeout" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f200f5b12eb75f8c1ed65abd4b2db8a6e1b138a20de009dacee265a2498f3f6" +dependencies = [ + "libc", +] + [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" diff --git a/crates/parser/Cargo.toml b/crates/parser/Cargo.toml index 92edf274..1a07a877 100644 --- a/crates/parser/Cargo.toml +++ b/crates/parser/Cargo.toml @@ -19,6 +19,7 @@ pg_query_proto_parser.workspace = true [dev-dependencies] insta = "1.31.0" +proptest = "1.0.0" [lib] doctest = false diff --git a/crates/parser/proptest-regressions/codegen.txt b/crates/parser/proptest-regressions/codegen.txt new file mode 100644 index 00000000..341ba3ff --- /dev/null +++ b/crates/parser/proptest-regressions/codegen.txt @@ -0,0 +1,6 @@ +# Seeds for failure cases proptest has generated in the past. It is +# automatically read and these particular cases re-run before any +# novel cases are generated. +# +# It is recommended to check this file in to source control so that +# everyone who runs the test benefits from these saved cases. diff --git a/crates/parser/src/codegen.rs b/crates/parser/src/codegen.rs index 1082448a..37b933af 100644 --- a/crates/parser/src/codegen.rs +++ b/crates/parser/src/codegen.rs @@ -5,6 +5,7 @@ parser_codegen!(); #[cfg(test)] mod tests { use log::debug; + use proptest::prelude::*; use crate::codegen::{get_nodes, SyntaxKind, TokenProperty}; @@ -72,25 +73,25 @@ mod tests { assert_eq!(node_graph[node_index].properties.len(), expected.len()); } - #[test] - fn test_simple_select() { - test_get_node_properties( - "select 1;", - SyntaxKind::SelectStmt, - vec![TokenProperty::from(SyntaxKind::Select)], - ) + proptest! { + #[test] + fn test_simple_select(n in 0..100i32) { + test_get_node_properties(&format!("select {};", n), SyntaxKind::SelectStmt, vec![TokenProperty::from(SyntaxKind::Select)]) + } } - #[test] - fn test_select_with_from() { - test_get_node_properties( - "select 1 from contact;", - SyntaxKind::SelectStmt, - vec![ - TokenProperty::from(SyntaxKind::Select), - TokenProperty::from(SyntaxKind::From), - ], - ) + proptest! { + #[test] + fn test_select_with_from(n in 0..100i32, table_name in "ab?c?d?") { + test_get_node_properties( + &format!("select {} from {};", n, table_name), + SyntaxKind::SelectStmt, + vec![ + TokenProperty::from(SyntaxKind::Select), + TokenProperty::from(SyntaxKind::From), + ], + ) + } } #[test] From c5de57e257e65bba27d8dcf45cb542fad933b254 Mon Sep 17 00:00:00 2001 From: Nico Gallinal Date: Thu, 14 Dec 2023 17:43:45 -0300 Subject: [PATCH 2/2] add test with where --- crates/parser/src/codegen.rs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/crates/parser/src/codegen.rs b/crates/parser/src/codegen.rs index 37b933af..52862fa7 100644 --- a/crates/parser/src/codegen.rs +++ b/crates/parser/src/codegen.rs @@ -94,6 +94,21 @@ mod tests { } } + proptest! { + #[test] + fn test_select_with_where(table_name in "ab?c?d?", condition in "<|>|=|<>|!=", n in 0..100i32) { + test_get_node_properties( + &format!("select * from {} where id {} {};", table_name, condition, n), + SyntaxKind::SelectStmt, + vec![ + TokenProperty::from(SyntaxKind::Select), + TokenProperty::from(SyntaxKind::From), + TokenProperty::from(SyntaxKind::Where), + ], + ) + } + } + #[test] fn test_create_domain() { test_get_node_properties(