From ecf36cd6d37aa78164d183eeddc730c56de714c9 Mon Sep 17 00:00:00 2001
From: ConnorSkees <39542938+ConnorSkees@users.noreply.github.com>
Date: Fri, 24 Apr 2020 19:42:04 -0400
Subject: [PATCH] refactor how @ import is tested

---
 tests/imports.rs | 86 ++++++++++++++++++++++++++++++++++++------------
 1 file changed, 65 insertions(+), 21 deletions(-)

diff --git a/tests/imports.rs b/tests/imports.rs
index 6ac5545..752125e 100644
--- a/tests/imports.rs
+++ b/tests/imports.rs
@@ -3,26 +3,70 @@ use tempfile::Builder;
 
 use grass::StyleSheet;
 
-macro_rules! test_import {
-    ($func:ident, $input:literal => $output:literal | $( $name:literal($content:literal) ),*) => {
-        #[test]
-        fn $func() {
-            $(
-                let mut f = Builder::new().rand_bytes(0).prefix("").suffix($name).tempfile_in("").unwrap();
-                write!(f, $content).unwrap();
-            )*
-            let sass = StyleSheet::new($input.to_string())
-            .expect(concat!("failed to parse on ", $input));
-            assert_eq!(
-                String::from($output),
-                sass
-            );
-        }
-    }
+/// 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();
+    };
 }
 
-// we have to use test name as filename because tests are run multithreaded in the same directory, so some names may conflict
-test_import!(imports_variable, "@import \"imports_variable\";\na {\n color: $a;\n}" => "a {\n  color: red;\n}\n" | "imports_variable"("$a: red;"));
-test_import!(single_quotes_import, "@import 'single_quotes_import';\na {\n color: $a;\n}" => "a {\n  color: red;\n}\n" | "single_quotes_import"("$a: red;"));
-test_import!(finds_name_scss, "@import \"finds_name_scss\";\na {\n color: $a;\n}" => "a {\n  color: red;\n}\n" | "finds_name_scss.scss"("$a: red;"));
-test_import!(finds_underscore_name_scss, "@import \"finds_underscore_name_scss\";\na {\n color: $a;\n}" => "a {\n  color: red;\n}\n" | "_finds_underscore_name_scss.scss"("$a: red;"));
+#[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",
+        &StyleSheet::new(input.to_string()).expect(input)
+    );
+}
+
+#[test]
+fn import_no_semicolon() {
+    let input = "@import \"import_no_semicolon\"\na {\n color: $a;\n}";
+    tempfile!("import_no_semicolon", "$a: red;");
+    assert_eq!(
+        "a {\n  color: red;\n}\n",
+        &StyleSheet::new(input.to_string()).expect(input)
+    );
+}
+
+#[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",
+        &StyleSheet::new(input.to_string()).expect(input)
+    );
+}
+
+#[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",
+        &StyleSheet::new(input.to_string()).expect(input)
+    );
+}
+
+#[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",
+        &StyleSheet::new(input.to_string()).expect(input)
+    );
+}