#[cfg(test)] mod tests {
use crate::parser::{self, LessParser, Rule};
use pest::Parser;
#[test] fn media_query_test() {
let s = "@media screen and (min-width: 600px) {
body {
background-color: red;
}
}"; let pairs = LessParser::parse(Rule::mediaQuery, s); println!("{:#?}", pairs); assert!(pairs.is_ok()); }
#[test]
fn class_name_test() {
let s = ".example-class { color: blue; }"; let pairs = LessParser::parse(Rule::select, s); println!("{:#?}", pairs); assert!(pairs.is_ok()); }
#[test]
fn id_test() {
let s = "#example-id { margin: 10px; }"; let pairs = parser::LessParser::parse(parser::Rule::select, s); println!("{:#?}", pairs); assert!(pairs.is_ok()); }
#[test]
fn nested_selectors_test() {
let s = ".parent { .child { padding: 5px; } }"; let pairs = parser::LessParser::parse(parser::Rule::select, s); println!("{:#?}", pairs); assert!(pairs.is_ok()); }
#[test]
fn pseudo_class_test() {
let s = "a:hover { text-decoration: underline; }"; let pairs = parser::LessParser::parse(parser::Rule::select, s); println!("{:#?}", pairs); assert!(pairs.is_ok()); }
#[test]
fn pseudo_element_test() {
let s = "p::after { content: 'Hello'; }"; let pairs = parser::LessParser::parse(parser::Rule::select, s); println!("{:#?}", pairs); assert!(pairs.is_ok()); }
#[test]
fn attr_direct_test() {
let s = "color: blue;"; let pairs = parser::LessParser::parse(parser::Rule::attr, s); println!("{:#?}", pairs); assert!(pairs.is_ok()); }
#[test]
fn attr_with_spaces_test() {
let s = "margin: 10px 20px 5px 15px;"; let pairs = parser::LessParser::parse(parser::Rule::attr, s); println!("{:#?}", pairs); assert!(pairs.is_ok()); }
#[test]
fn attr_with_newline_test() {
let s = "background: url('image.jpg')\n no-repeat;"; let pairs = parser::LessParser::parse(parser::Rule::attr, s); println!("{:#?}", pairs); assert!(pairs.is_ok()); }
#[test]
fn background_shorthand_test() {
let s = "body { background: red; }"; let pairs = parser::LessParser::parse(parser::Rule::select, s); println!("{:#?}", pairs); assert!(pairs.is_ok()); }
#[test]
fn variable_direct_test() {
let s = "@primary-color: #333;"; let pairs = parser::LessParser::parse(parser::Rule::variable, s); println!("{:#?}", pairs); assert!(pairs.is_ok()); }
#[test]
fn variable_in_selector_test() {
let s = "body { @theme-color: blue; color: @theme-color; }"; let pairs = parser::LessParser::parse(parser::Rule::select, s); println!("{:#?}", pairs); assert!(pairs.is_ok()); }
#[test]
fn variable_with_complex_value_test() {
let s = "@box-shadow: 0 1px 2px rgba(0,0,0,0.2);"; let pairs = parser::LessParser::parse(parser::Rule::variable, s); println!("{:#?}", pairs); assert!(pairs.is_ok()); }
#[test]
fn nested_media_query_parse_test() {
let nested_media_file = std::fs::read_to_string("./src/test_nested_media.less")
.expect("Not Found Nested Media Test File!");
match crate::parse_less(&nested_media_file) {
Ok(css_content) => {
assert!(!css_content.is_empty(), "生成的CSS内容不应为空");
std::fs::write("./src/test_nested_media.css", css_content)
.expect("Write Error for Nested Media CSS");
}
Err(e) => {
println!("解析失败: {:?}", e);
assert!(false, "嵌套媒体查询解析应当成功");
}
}
}
#[test]
fn basic_less_parse_test() {
match crate::parse_less_file("./src/test.less") {
Ok(css_content) => {
assert!(!css_content.is_empty(), "生成的CSS内容不应为空");
std::fs::write("./src/test.css", css_content).expect("Write Error");
}
Err(e) => {
println!("解析失败: {:?}", e);
assert!(false, "基本LESS解析应当成功");
}
}
}
#[test]
fn library_api_test() {
let less = ".container { @width: 80%; width: @width; .header { color: blue; } }";
match crate::parse_less(less) {
Ok(css) => {
assert!(css.contains(".container"));
assert!(css.contains("width: 80%"));
assert!(css.contains(".container .header"));
}
Err(e) => {
panic!("库API测试失败: {}", e);
}
}
}
}