/
golden_test_template.rs
73 lines (63 loc) · 2.51 KB
/
golden_test_template.rs
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
/*
* Copyright 2018 The Starlark in Rust Authors.
* Copyright (c) Facebook, Inc. and its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
use std::env;
use std::fmt::Write;
use std::fs;
use anyhow::Context;
const REGENERATE_VAR_NAME: &str = "STARLARK_RUST_REGENERATE_GOLDEN_TESTS";
#[allow(clippy::write_literal)] // We mark generated files as generated, but not this file.
fn make_golden(output: &str) -> String {
let mut golden = String::new();
writeln!(golden, "# {at}generated", at = "@").unwrap();
writeln!(golden, "# To regenerate, run:").unwrap();
writeln!(golden, "# ```").unwrap();
writeln!(
golden,
"# {REGENERATE_VAR_NAME}=1 cargo test -p starlark --lib tests"
)
.unwrap();
writeln!(golden, "# ```").unwrap();
writeln!(golden).unwrap();
writeln!(golden, "{}", output.trim_end()).unwrap();
golden
}
/// Common code for golden tests.
pub fn golden_test_template(golden_rel_path: &str, output: &str) {
assert!(golden_rel_path.starts_with("src/"));
assert!(golden_rel_path.contains(".golden"));
let manifest_dir =
env::var("CARGO_MANIFEST_DIR").expect("`CARGO_MANIFEST_DIR` variable must be set");
let golden_file_path = format!("{manifest_dir}/{golden_rel_path}");
let output_with_prefix = make_golden(output);
if env::var(REGENERATE_VAR_NAME).is_ok() {
fs::write(&golden_file_path, &output_with_prefix)
.with_context(|| format!("Writing `{golden_file_path}`"))
.unwrap();
} else {
let expected = fs::read_to_string(&golden_file_path)
.with_context(|| format!("Reading `{golden_file_path}`"))
.unwrap();
let expected = if cfg!(windows) {
// Git may check out files on Windows with \r\n as line separator.
// We could configure git, but it's more reliable to handle it in the test.
expected.replace("\r\n", "\n")
} else {
expected
};
assert_eq!(expected, output_with_prefix);
}
}