From a6f61ec4843f4ec91eb9651b79c8b843fb995b46 Mon Sep 17 00:00:00 2001 From: Nadrieril Date: Sun, 24 Mar 2019 17:59:57 +0100 Subject: Generate parser tests list automatically --- dhall/Cargo.toml | 1 + dhall/build.rs | 42 +++++++++++++++++++++++++++++++ dhall/tests/parser.rs | 69 ++------------------------------------------------- 3 files changed, 45 insertions(+), 67 deletions(-) create mode 100644 dhall/build.rs diff --git a/dhall/Cargo.toml b/dhall/Cargo.toml index 3c3e375..234daa4 100644 --- a/dhall/Cargo.toml +++ b/dhall/Cargo.toml @@ -3,6 +3,7 @@ name = "dhall" version = "0.1.0" authors = ["NanoTech ", "Nadrieril "] edition = "2018" +build = "build.rs" [lib] doctest = false diff --git a/dhall/build.rs b/dhall/build.rs new file mode 100644 index 0000000..c8ad6ad --- /dev/null +++ b/dhall/build.rs @@ -0,0 +1,42 @@ +use std::env; +use std::ffi::OsString; +use std::fs::{self, File}; +use std::io::Write; +use std::path::Path; + +fn dhall_files_in_dir<'a>(dir: &'a Path) -> impl Iterator + 'a { + fs::read_dir(dir).unwrap().filter_map(move |path| { + let path = path.unwrap().path(); + let path = path.strip_prefix(dir).unwrap(); + if path.extension() != Some(&OsString::from("dhall")) { + return None; + } + let path = path.to_string_lossy(); + let path = path[..path.len() - 6].to_owned(); + Some(path) + }) +} + +fn main() -> std::io::Result<()> { + let out_dir = env::var("OUT_DIR").unwrap(); + let tests_dir = Path::new("../dhall-lang/tests/"); + + let parser_tests_path = Path::new(&out_dir).join("parser_tests.rs"); + let mut file = File::create(parser_tests_path)?; + + for path in dhall_files_in_dir(&tests_dir.join("parser/success/")) { + let name = &path[..path.len() - 1]; + // Skip this test; parser is way too slow indebug mode + if name == "largeExpression" { + continue; + } + writeln!(file, r#"make_spec_test!(ParserSuccess, spec_parser_success_{0}, "{0}");"#, name)?; + } + + for path in dhall_files_in_dir(&tests_dir.join("parser/failure/")) { + let name = &path; + writeln!(file, r#"make_spec_test!(ParserFailure, spec_parser_failure_{0}, "{0}");"#, name)?; + } + + Ok(()) +} diff --git a/dhall/tests/parser.rs b/dhall/tests/parser.rs index 1db8d33..0b5e2d6 100644 --- a/dhall/tests/parser.rs +++ b/dhall/tests/parser.rs @@ -2,70 +2,5 @@ #![rustfmt::skip] mod common; -macro_rules! parser_success { - ($name:ident, $path:expr) => { - make_spec_test!(ParserSuccess, $name, $path); - }; -} -macro_rules! parser_failure { - ($name:ident, $path:expr) => { - make_spec_test!(ParserFailure, $name, $path); - }; -} - -parser_success!(spec_parser_success_annotations, "annotations"); -parser_success!(spec_parser_success_asText, "asText"); -parser_success!(spec_parser_success_blockComment, "blockComment"); -parser_success!(spec_parser_success_builtins, "builtins"); -parser_success!(spec_parser_success_collectionImportType, "collectionImportType"); -parser_success!(spec_parser_success_double, "double"); -parser_success!(spec_parser_success_doubleQuotedString, "doubleQuotedString"); -parser_success!(spec_parser_success_environmentVariables, "environmentVariables"); -parser_success!(spec_parser_success_escapedDoubleQuotedString, "escapedDoubleQuotedString"); -parser_success!(spec_parser_success_escapedSingleQuotedString, "escapedSingleQuotedString"); -parser_success!(spec_parser_success_fields, "fields"); -parser_success!(spec_parser_success_forall, "forall"); -parser_success!(spec_parser_success_functionType, "functionType"); -parser_success!(spec_parser_success_identifier, "identifier"); -parser_success!(spec_parser_success_ifThenElse, "ifThenElse"); -parser_success!(spec_parser_success_importAlt, "importAlt"); -parser_success!(spec_parser_success_interpolatedDoubleQuotedString, "interpolatedDoubleQuotedString"); -parser_success!(spec_parser_success_interpolatedSingleQuotedString, "interpolatedSingleQuotedString"); -parser_success!(spec_parser_success_label, "label"); -parser_success!(spec_parser_success_lambda, "lambda"); -// parser_success!(spec_parser_success_largeExpression, "largeExpression"); -parser_success!(spec_parser_success_let, "let"); -parser_success!(spec_parser_success_lineComment, "lineComment"); -parser_success!(spec_parser_success_list, "list"); -parser_success!(spec_parser_success_merge, "merge"); -parser_success!(spec_parser_success_multilet, "multilet"); -parser_success!(spec_parser_success_natural, "natural"); -parser_success!(spec_parser_success_nestedBlockComment, "nestedBlockComment"); -parser_success!(spec_parser_success_operators, "operators"); -parser_success!(spec_parser_success_parenthesizeUsing, "parenthesizeUsing"); -parser_success!(spec_parser_success_pathTermination, "pathTermination"); -parser_success!(spec_parser_success_paths, "paths"); -parser_success!(spec_parser_success_quotedLabel, "quotedLabel"); -parser_success!(spec_parser_success_quotedPaths, "quotedPaths"); -parser_success!(spec_parser_success_record, "record"); -parser_success!(spec_parser_success_reservedPrefix, "reservedPrefix"); -parser_success!(spec_parser_success_singleQuotedString, "singleQuotedString"); -parser_success!(spec_parser_success_sort, "sort"); -parser_success!(spec_parser_success_spaceAfterListAppend, "spaceAfterListAppend"); -parser_success!(spec_parser_success_template, "template"); -parser_success!(spec_parser_success_unicodeComment, "unicodeComment"); -parser_success!(spec_parser_success_unicodeDoubleQuotedString, "unicodeDoubleQuotedString"); -parser_success!(spec_parser_success_unicodePaths, "unicodePaths"); -parser_success!(spec_parser_success_union, "union"); -parser_success!(spec_parser_success_urls, "urls"); -parser_success!(spec_parser_success_whitespace, "whitespace"); -parser_success!(spec_parser_success_whitespaceBuffet, "whitespaceBuffet"); - -parser_failure!(spec_parser_failure_annotation, "annotation"); -parser_failure!(spec_parser_failure_builtins, "builtins"); -parser_failure!(spec_parser_failure_doubleBoundsNeg, "doubleBoundsNeg"); -parser_failure!(spec_parser_failure_doubleBoundsPos, "doubleBoundsPos"); -parser_failure!(spec_parser_failure_importAccess, "importAccess"); -parser_failure!(spec_parser_failure_incompleteIf, "incompleteIf"); -parser_failure!(spec_parser_failure_mandatoryNewline, "mandatoryNewline"); -parser_failure!(spec_parser_failure_missingSpace, "missingSpace"); +// See ../build.rs +include!(concat!(env!("OUT_DIR"), "/parser_tests.rs")); -- cgit v1.2.3