grass/tests/imports.rs

181 lines
4.8 KiB
Rust
Raw Normal View History

2020-07-06 12:55:34 -04:00
#![cfg(test)]
2020-02-01 23:09:22 -05:00
use std::io::Write;
use tempfile::Builder;
2020-07-06 12:55:34 -04:00
#[macro_use]
mod macros;
2020-04-24 19:42:04 -04:00
/// Create a temporary file with the given name
/// and contents.
///
/// This must be a macro rather than a function
/// because the tempfile will be deleted when it
/// exits scope
macro_rules! tempfile {
($name:literal, $content:literal) => {
let mut f = Builder::new()
.rand_bytes(0)
.prefix("")
.suffix($name)
.tempfile_in("")
.unwrap();
write!(f, "{}", $content).unwrap();
};
2020-04-24 21:38:25 -04:00
($name:literal, $content:literal, dir=$dir:literal) => {
let _d = Builder::new()
.rand_bytes(0)
.prefix("")
.suffix($dir)
.tempdir_in("")
.unwrap();
2020-04-26 01:52:43 -04:00
let mut f = Builder::new()
2020-04-24 21:38:25 -04:00
.rand_bytes(0)
.prefix("")
.suffix($name)
.tempfile_in($dir)
2020-04-26 01:52:43 -04:00
.unwrap();
2020-04-24 21:38:25 -04:00
write!(f, "{}", $content).unwrap();
};
2020-02-01 23:09:22 -05:00
}
2020-04-24 19:42:04 -04:00
#[test]
fn imports_variable() {
let input = "@import \"imports_variable\";\na {\n color: $a;\n}";
tempfile!("imports_variable", "$a: red;");
assert_eq!(
"a {\n color: red;\n}\n",
2020-06-16 19:38:30 -04:00
&grass::from_string(input.to_string()).expect(input)
2020-04-24 19:42:04 -04:00
);
}
#[test]
#[ignore = "we don't actually check if the semicolon exists"]
2020-04-24 19:42:04 -04:00
fn import_no_semicolon() {
let input = "@import \"import_no_semicolon\"\na {\n color: $a;\n}";
tempfile!("import_no_semicolon", "$a: red;");
}
#[test]
fn import_no_quotes() {
let input = "@import import_no_quotes";
tempfile!("import_no_quotes", "$a: red;");
2020-06-16 19:38:30 -04:00
match grass::from_string(input.to_string()) {
Ok(..) => panic!("did not fail"),
Err(e) => assert_eq!(
"Error: Expected string.",
e.to_string()
.chars()
.take_while(|c| *c != '\n')
.collect::<String>()
.as_str()
),
}
}
2020-04-24 19:42:04 -04:00
#[test]
fn single_quotes_import() {
let input = "@import 'single_quotes_import';\na {\n color: $a;\n}";
tempfile!("single_quotes_import", "$a: red;");
assert_eq!(
"a {\n color: red;\n}\n",
2020-06-16 19:38:30 -04:00
&grass::from_string(input.to_string()).expect(input)
2020-04-24 19:42:04 -04:00
);
}
#[test]
fn finds_name_scss() {
let input = "@import \"finds_name_scss\";\na {\n color: $a;\n}";
tempfile!("finds_name_scss.scss", "$a: red;");
assert_eq!(
"a {\n color: red;\n}\n",
2020-06-16 19:38:30 -04:00
&grass::from_string(input.to_string()).expect(input)
2020-04-24 19:42:04 -04:00
);
}
#[test]
fn finds_underscore_name_scss() {
let input = "@import \"finds_underscore_name_scss\";\na {\n color: $a;\n}";
tempfile!("_finds_underscore_name_scss.scss", "$a: red;");
assert_eq!(
"a {\n color: red;\n}\n",
2020-06-16 19:38:30 -04:00
&grass::from_string(input.to_string()).expect(input)
2020-04-24 19:42:04 -04:00
);
}
2020-04-24 20:30:14 -04:00
#[test]
fn chained_imports() {
let input = "@import \"chained_imports__a\";\na {\n color: $a;\n}";
tempfile!("chained_imports__a.scss", "@import \"chained_imports__b\";");
tempfile!("chained_imports__b.scss", "@import \"chained_imports__c\";");
tempfile!("chained_imports__c.scss", "$a: red;");
assert_eq!(
"a {\n color: red;\n}\n",
2020-06-16 19:38:30 -04:00
&grass::from_string(input.to_string()).expect(input)
2020-04-24 20:30:14 -04:00
);
}
2020-04-24 21:38:25 -04:00
#[test]
fn chained_imports_in_directory() {
let input = "@import \"chained_imports_in_directory__a\";\na {\n color: $a;\n}";
tempfile!(
"chained_imports_in_directory__a.scss",
"@import \"chained_imports_in_directory__b\";"
);
tempfile!(
"index.scss",
"@import \"../chained_imports_in_directory__c\";",
dir = "chained_imports_in_directory__b"
);
tempfile!("chained_imports_in_directory__c.scss", "$a: red;");
assert_eq!(
"a {\n color: red;\n}\n",
2020-06-16 19:38:30 -04:00
&grass::from_string(input.to_string()).expect(input)
2020-04-24 21:38:25 -04:00
);
}
2020-07-06 12:55:34 -04:00
error!(
missing_input_after_import,
"@import", "Error: expected more input."
);
error!(
import_unquoted_http,
"@import http://foo.com/;", "Error: Expected string."
);
error!(
import_file_doesnt_exist,
"@import \"idontexist\";", "Error: Can't find stylesheet to import."
);
error!(
file_name_is_two_periods,
"@import \"foo/..\";", "Error: Can't find stylesheet to import."
);
test!(
import_beginning_with_http,
"@import \"http://foo.com/\";",
"@import \"http://foo.com/\";\n"
);
test!(
import_beginning_with_http_no_ending_slash,
"@import \"http://foo.com\";",
"@import \"http://foo.com\";\n"
);
test!(
import_beginning_with_https,
"@import \"https://foo.com/\";",
"@import \"https://foo.com/\";\n"
);
test!(
import_ending_in_css,
"@import \"foo.css\";",
"@import \"foo.css\";\n"
);
test!(import_url, "@import url(foo..);", "@import url(foo..);\n");
test!(
import_url_interpolation,
"@import url(#{1+1}..);",
"@import url(2..);\n"
);
2020-07-06 12:55:34 -04:00
2020-04-24 21:38:25 -04:00
// todo: test for calling paths, e.g. `grass b\index.scss`
// todo: test for absolute paths (how?)