#[cfg(test)]
mod tests {
#[test]
fn test_use_statement_variations() {
let test_cases = vec![
(
"USE agent_platform;\nCREATE TABLE test (id INT);",
"标准格式",
),
(
"USE `agent_platform`;\nCREATE TABLE test (id INT);",
"带反引号",
),
(
"use Agent_Platform;\nCREATE TABLE test (id INT);",
"大小写混合",
),
(
"USE agent_platform ;\nCREATE TABLE test (id INT);",
"多个空格",
),
("USE agent_platform\nCREATE TABLE test (id INT);", "无分号"),
(
"-- Comment\nUSE agent_platform;\nCREATE TABLE test (id INT);",
"前面有注释",
),
];
for (sql, description) in test_cases {
assert!(sql.contains("CREATE TABLE"), "测试失败: {}", description);
println!("✓ 测试通过: {}", description);
}
println!("✅ 所有 USE 语句格式测试通过");
}
#[test]
fn test_regex_pattern_multiline() {
use regex::Regex;
let database_name = "agent_platform";
let pattern = format!(
r"(?im)^\s*USE\s+`?{}`?\s*;?\s*$",
regex::escape(database_name)
);
let re = Regex::new(&pattern).unwrap();
let test_cases = vec![
("USE agent_platform;\n", true, "标准格式"),
("USE `agent_platform`;\n", true, "带反引号"),
("use agent_platform;\n", true, "小写"),
("USE agent_platform ;\n", true, "多个空格"),
("USE agent_platform\n", true, "无分号"),
(" USE agent_platform; \n", true, "前后有空格"),
("USE other_database;\n", false, "其他数据库"),
("-- USE agent_platform;\n", false, "注释中的USE"),
];
for (sql, should_match, description) in test_cases {
let matches = re.is_match(sql);
assert_eq!(
matches, should_match,
"测试失败: {} - SQL: {}",
description, sql
);
if matches {
println!("✓ 匹配成功: {}", description);
} else {
println!("✓ 正确拒绝: {}", description);
}
}
println!("✅ 正则表达式多行模式测试通过");
}
#[test]
fn test_extract_after_use_statement() {
use client_core::sql_diff::parse_sql_tables;
let sql = "-- Some comments\nUSE agent_platform;\nCREATE TABLE users (id INT PRIMARY KEY);\nCREATE TABLE posts (id INT PRIMARY KEY);";
match parse_sql_tables(sql) {
Ok(tables) => {
println!("✓ 成功解析 {} 个表", tables.len());
assert_eq!(tables.len(), 2, "应该解析出2个表");
let has_users = tables.contains_key("users") || tables.contains_key("`users`");
let has_posts = tables.contains_key("posts") || tables.contains_key("`posts`");
assert!(has_users, "应该包含 users 表");
assert!(has_posts, "应该包含 posts 表");
println!("✅ USE 语句处理验证通过");
}
Err(e) => {
panic!("解析失败: {}", e);
}
}
}
#[test]
fn test_parser_integration() {
use client_core::sql_diff::parse_sql_tables;
let sql_with_use = r#"
USE agent_platform;
CREATE TABLE `users` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`name` VARCHAR(64) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `posts` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`user_id` BIGINT NOT NULL,
`title` VARCHAR(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
"#;
let use_pattern = r"(?im)^\s*USE\s+`?agent_platform`?\s*;?\s*$";
let re = regex::Regex::new(use_pattern).unwrap();
let extracted = if let Some(mat) = re.find(sql_with_use) {
sql_with_use[mat.end()..].trim()
} else {
sql_with_use
};
match parse_sql_tables(extracted) {
Ok(tables) => {
println!("✓ 成功解析 {} 个表", tables.len());
println!("✓ 解析到的表名:");
for table_name in tables.keys() {
println!(" - {}", table_name);
}
assert_eq!(tables.len(), 2, "应该解析出2个表");
let has_users = tables.contains_key("users") || tables.contains_key("`users`");
let has_posts = tables.contains_key("posts") || tables.contains_key("`posts`");
assert!(
has_users,
"应该包含 users 表(实际表名: {:?})",
tables.keys().collect::<Vec<_>>()
);
assert!(
has_posts,
"应该包含 posts 表(实际表名: {:?})",
tables.keys().collect::<Vec<_>>()
);
println!("✅ parse_sql_tables 集成测试通过");
}
Err(e) => {
panic!("解析失败: {}", e);
}
}
}
}