10 releases
Uses old Rust 2015
0.3.5 | Apr 8, 2018 |
---|---|
0.3.4 | Mar 27, 2018 |
0.3.1 | Feb 16, 2017 |
0.2.0 | Feb 16, 2017 |
0.1.2 | Feb 12, 2017 |
#353 in Testing
109 downloads per month
76KB
2K
SLoC
Specker
Checks if any number of files match some specification. Designed for testing file generation.
Let's say we have this specification:
## file: output/index.html
..
<body>
..
## file: output/style.css
..
body {
..
}
..
Specker can check if there is a file named output/index.html
containing
<body>
in some line, as well as file output/style.css
containing body {
and }
lines. Symbol ..
matches any number of
lines.
If there is a match error, specker can print a nice message like:
1 | <bddy>
| ^^^^^^
| Expected "<body>", found "<bddy>"
It also has iterators to run many such specification tests in bulk.
Example code that iterates the "spec" dir, collects all "txt" specifications and checks them:
extern crate specker;
use std::fs;
use std::env;
use std::path::PathBuf;
use std::collections::HashMap;
#[test]
fn check_specifications() {
let src_dir = PathBuf::from(env::var("CARGO_MANIFEST_DIR").unwrap());
for maybe_spec in specker::walk_spec_dir(&spec_dir, "txt", specker::Options {
skip_lines: "..",
marker: "##",
var_start: "${",
var_end: "}",
}) {
let spec_path = maybe_spec.unwrap_or_else(|e| {
// print nicely formatted error
panic!("\n{}", specker::display_error(&e));
});
// go over spec items and check if file contents match
for (item, input_file_name) in spec_path.spec.iter()
.filter_map(
|item| item.get_param("file")
.map(|param_value| (item, param_value))
)
{
let path = spec_dir.join(input_file_name);
let mut file = fs::File::open(&path)
.expect(&format!("failed to open file {:?}", &path));
if let Err(e) = item.match_contents(&mut file, &HashMap::new()) {
// print nicely formatted error
println!("{}", specker::display_error_for_file(&path, &e));
// print one-liner error
panic!("{}", e);
}
}
}
}
License
Licensed under either of
- Apache License, Version 2.0, (LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0)
- MIT license (LICENSE-MIT or http://opensource.org/licenses/MIT)
at your option.
Contribution
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.
Dependencies
~0.1–6.5MB
~36K SLoC