1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
|
use std::env;
use std::ffi::OsString;
use std::fs::File;
use std::io::Write;
use std::path::Path;
use walkdir::WalkDir;
fn dhall_files_in_dir<'a>(
dir: &'a Path,
take_a_suffix: bool,
) -> impl Iterator<Item = (String, String)> + 'a {
WalkDir::new(dir)
.into_iter()
.filter_map(|e| e.ok())
.filter_map(move |path| {
let path = path.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];
let path = if take_a_suffix {
if &path[path.len() - 1..] != "A" {
return None;
} else {
path[..path.len() - 1].to_owned()
}
} else {
path.to_owned()
};
let name = path.replace("/", "_").replace("-", "_");
Some((name, path))
})
}
fn make_test_module(
w: &mut impl Write,
mod_name: &str,
dir: &Path,
feature: &str,
mut exclude: impl FnMut(&str) -> bool,
) -> std::io::Result<()> {
writeln!(w, "mod {} {{", mod_name)?;
for (name, path) in dhall_files_in_dir(&dir.join("success/"), true) {
if exclude(&path) {
continue;
}
writeln!(
w,
r#"make_spec_test!({}, Success, success_{}, "{}");"#,
feature, name, path
)?;
}
for (name, path) in dhall_files_in_dir(&dir.join("failure/"), false) {
if exclude(&path) {
continue;
}
writeln!(
w,
r#"make_spec_test!({}, Failure, failure_{}, "{}");"#,
feature, name, path
)?;
}
writeln!(w, "}}")?;
Ok(())
}
fn main() -> std::io::Result<()> {
println!("cargo:rerun-if-changed=../dhall-lang/.git");
println!(
"cargo:rerun-if-changed=../.git/modules/dhall-lang/refs/heads/master"
);
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("spec_tests.rs");
let mut file = File::create(parser_tests_path)?;
make_test_module(
&mut file,
"parse",
&tests_dir.join("parser/"),
"Parser",
|path| {
// Too slow in debug mode
path == "largeExpression"
},
)?;
make_test_module(
&mut file,
"beta_normalize",
&tests_dir.join("normalization/"),
"Normalization",
|path| {
// We don't support bignums
path == "simple/integerToDouble"
// Too slow
|| path == "remoteSystems"
},
)?;
make_test_module(
&mut file,
"alpha_normalize",
&tests_dir.join("alpha-normalization/"),
"AlphaNormalization",
|_| false,
)?;
Ok(())
}
|