Skip to content

Commit f2b8e98

Browse files
committed
sql-parser: add dev deps for dataset tests
1 parent 5f9957a commit f2b8e98

File tree

4 files changed

+243
-0
lines changed

4 files changed

+243
-0
lines changed

Cargo.lock

+156
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

+4
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@ description = "An SQLite fully compatible tokenizer and parser written in Rust"
1212
[dependencies]
1313
once_cell = "1.20.2"
1414

15+
[dev-dependencies]
16+
sqlite3-parser = "0.13.0"
17+
fallible-iterator = "0.3.0"
18+
1519
[profile.release]
1620
lto = true
1721
codegen-units = 16

tests/codeschool-sqlite-parser-test-files/main.rs

+40
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
use std::{fs, path::Path};
2+
mod sqlite_parser;
23

34
use db_academy_sql_parser::Parser;
5+
use sqlite_parser::parse_sql_file;
46

57
#[test]
68
fn run_codeschool_sqlite_parser_test() {
@@ -46,3 +48,41 @@ fn run_test(sql_content: &str) -> bool {
4648
let statement = parser.parse_statement();
4749
statement.is_ok()
4850
}
51+
52+
#[test]
53+
fn run_codeschool_sqlite_parser_with_sqlite3_parser() {
54+
let test_set_path = Path::new("tests/codeschool-sqlite-parser-test-files/sql");
55+
56+
let mut total_tests = 0;
57+
let mut passed_test = 0;
58+
59+
for group in fs::read_dir(test_set_path).expect("Failed to read test_set directory") {
60+
let group = group.expect("Failed to read directory entry").path();
61+
if !group.is_dir() {
62+
continue;
63+
}
64+
65+
for entry in fs::read_dir(group).expect("Failed to read test_set directory") {
66+
let file = entry.expect("Failed to read directory entry").path();
67+
68+
if file.extension().and_then(|ext| ext.to_str()) == Some("sql") {
69+
let parsing_result = parse_sql_file(&file.to_str().unwrap());
70+
if parsing_result {
71+
passed_test += 1;
72+
}
73+
total_tests += 1;
74+
}
75+
}
76+
}
77+
78+
println!("Tested {} SQL files", total_tests);
79+
println!(
80+
"Passed {} SQL files, {} failed",
81+
passed_test,
82+
total_tests - passed_test
83+
);
84+
println!(
85+
"Passed {:.2}% of the tests",
86+
passed_test as f64 / total_tests as f64 * 100.0
87+
);
88+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
use fallible_iterator::FallibleIterator;
2+
use std::fs::read;
3+
4+
use sqlite3_parser::lexer::sql::Parser;
5+
6+
/// Parse specified files and check all commands.
7+
pub fn parse_sql_file(file_path: &str) -> bool {
8+
let input = read(file_path).unwrap();
9+
let mut parser = Parser::new(&input);
10+
loop {
11+
match parser.next() {
12+
Ok(None) => return true,
13+
Err(err) => {
14+
eprintln!("Err: {err} in {file_path}");
15+
return false;
16+
}
17+
Ok(Some(cmd)) => {
18+
let input = cmd.to_string();
19+
let mut checker = Parser::new(input.as_bytes());
20+
match checker.next() {
21+
Err(err) => {
22+
eprintln!(
23+
"Check Err in {}:{}, {} in\n{}\n{:?}",
24+
file_path,
25+
parser.line(),
26+
err,
27+
input,
28+
cmd
29+
);
30+
}
31+
Ok(None) => {
32+
eprintln!("Check Err in {}:{}, {:?}", file_path, parser.line(), cmd);
33+
}
34+
Ok(Some(check)) => {
35+
if cmd != check {
36+
eprintln!("{cmd:?}\n<>\n{check:?}");
37+
}
38+
}
39+
}
40+
}
41+
}
42+
}
43+
}

0 commit comments

Comments
 (0)