From 41f99dc4c0860155003120e9eabfe8c4a6ff770a Mon Sep 17 00:00:00 2001 From: Steven Fackler Date: Sat, 21 Jan 2017 10:11:55 +0000 Subject: [PATCH] Dynamically generate test harness This uses the rustc-test crate, a copy of the standard test crate, to dynamically create tests for each reference test. No need to remember to update the macro, just add the directory to ref! --- .gitignore | 2 + Cargo.lock | 30 ++++++++++ Cargo.toml | 6 ++ src/lib.rs | 1 - tests/ref.rs | 157 ++++++++++++++++++++++----------------------------- 5 files changed, 106 insertions(+), 90 deletions(-) diff --git a/.gitignore b/.gitignore index fc0556c6..db0a5014 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,4 @@ target FlameGraph +.idea +*.iml diff --git a/Cargo.lock b/Cargo.lock index 69748fb2..37745b11 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -15,6 +15,7 @@ dependencies = [ "mio 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "notify 2.6.3 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-test 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "serde 0.8.19 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 0.8.19 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 0.8.4 (registry+https://github.com/rust-lang/crates.io-index)", @@ -320,6 +321,11 @@ dependencies = [ "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "getopts" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "gl_generator" version = "0.5.2" @@ -774,6 +780,18 @@ name = "rustc-serialize" version = "0.3.22" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "rustc-test" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "getopts 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-serialize 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", + "term 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", + "time 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "rustc_version" version = "0.1.7" @@ -944,6 +962,15 @@ dependencies = [ "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "term" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "time" version = "0.1.35" @@ -1145,6 +1172,7 @@ dependencies = [ "checksum fsevent-sys 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "72e33a926306442d961595c3a325864326ca4287795e106dae8993afe484ede6" "checksum gcc 0.3.40 (registry+https://github.com/rust-lang/crates.io-index)" = "872db9e59486ef2b14f8e8c10e9ef02de2bccef6363d7f34835dedb386b3d950" "checksum gdi32-sys 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "65256ec4dc2592e6f05bfc1ca3b956a4e0698aa90b1dff1f5687d55a5a3fd59a" +"checksum getopts 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)" = "d9047cfbd08a437050b363d35ef160452c5fe8ea5187ae0a624708c91581d685" "checksum gl_generator 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f1d8edc81c5ae84605a62f5dac661a2313003b26d59839f81d47d46cf0f16a55" "checksum gleam 0.2.29 (registry+https://github.com/rust-lang/crates.io-index)" = "1b83402229bde9d923f0b92811be017f9df5946ee86f8647367b1e02bcf5c293" "checksum glutin 0.6.1 (git+https://github.com/jwilm/glutin?rev=af7fe340bd4a2af53ea521defcb4f377cdc588cf)" = "" @@ -1196,6 +1224,7 @@ dependencies = [ "checksum rand 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)" = "022e0636ec2519ddae48154b028864bdce4eaf7d35226ab8e65c611be97b189d" "checksum regex-syntax 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "f9ec002c35e86791825ed294b50008eea9ddfc8def4420124fbc6b08db834957" "checksum rustc-serialize 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)" = "237546c689f20bb44980270c73c3b9edd0891c1be49cc1274406134a66d3957b" +"checksum rustc-test 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "5a8a7c2bc3cd2df4e0da9e548cd1b50c4c7b68d72410d34eba98a2d5393a2875" "checksum rustc_version 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "c5f5376ea5e30ce23c03eb77cbe4962b988deead10910c372b226388b594c084" "checksum semver 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)" = "d4f410fedcf71af0345d7607d246e7ad15faaadd49d240ee3b24e5dc21a820ac" "checksum semver 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2d5b7638a1f03815d94e88cb3b3c08e87f0db4d683ef499d1836aaf70a45623f" @@ -1217,6 +1246,7 @@ dependencies = [ "checksum syn 0.10.3 (registry+https://github.com/rust-lang/crates.io-index)" = "94e7d81ecd16d39f16193af05b8d5a0111b9d8d2f3f78f31760f327a247da777" "checksum target_build_utils 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "54c550e226618cd35334b75e92bfa5437c61474bdb75c38bf330ab5a8037b77c" "checksum tempfile 2.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "9270837a93bad1b1dac18fe67e786b3c960513af86231f6f4f57fddd594ff0c8" +"checksum term 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "3deff8a2b3b6607d6d7cc32ac25c0b33709453ca9cceac006caac51e963cf94a" "checksum time 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)" = "3c7ec6d62a20df54e07ab3b78b9a3932972f4b7981de295563686849eb3989af" "checksum toml 0.1.30 (registry+https://github.com/rust-lang/crates.io-index)" = "0590d72182e50e879c4da3b11c6488dae18fccb1ae0c7a3eda18e16795844796" "checksum unicode-normalization 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "26643a2f83bac55f1976fb716c10234485f9202dcd65cfbdf9da49867b271172" diff --git a/Cargo.toml b/Cargo.toml index dc335150..02b0e95f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,6 +10,10 @@ doc = false path = "src/main.rs" name = "alacritty" +[[test]] +name = "ref" +harness = false + [dependencies] libc = "*" cgmath = "0.7" @@ -44,6 +48,8 @@ gl_generator = "0.5" git = "https://github.com/jwilm/glutin" rev = "af7fe340bd4a2af53ea521defcb4f377cdc588cf" +[dev-dependencies] +rustc-test = "0.1" [profile.release] lto = true diff --git a/src/lib.rs b/src/lib.rs index 22a3bd10..794a819c 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -19,7 +19,6 @@ #![cfg_attr(feature = "clippy", deny(enum_glob_use))] #![cfg_attr(feature = "clippy", deny(if_not_else))] #![cfg_attr(feature = "clippy", deny(wrong_pub_self_convention))] -#![cfg_attr(test, feature(test))] #![cfg_attr(feature = "nightly", feature(core_intrinsics))] #[macro_use] diff --git a/tests/ref.rs b/tests/ref.rs index be0150ef..c91fdc78 100644 --- a/tests/ref.rs +++ b/tests/ref.rs @@ -1,99 +1,78 @@ extern crate alacritty; -extern crate serde_json; +extern crate serde_json as json; +extern crate test; -/// ref tests -mod reference { - use std::fs::File; - use std::io::{self, Read}; - use std::path::Path; +use std::env; +use std::fs::File; +use std::io::{self, Read}; +use std::path::{Path, PathBuf}; +use test::{TestDescAndFn, TestDesc, TestFn, ShouldPanic, TestName, test_main}; - use serde_json as json; +use alacritty::Grid; +use alacritty::Term; +use alacritty::term::Cell; +use alacritty::term::SizeInfo; +use alacritty::ansi; - use alacritty::Grid; - use alacritty::Term; - use alacritty::term::Cell; - use alacritty::term::SizeInfo; - use alacritty::ansi; +fn main() { + let test_dir = Path::new(concat!(env!("CARGO_MANIFEST_DIR"), "/tests/ref")); - /// The /dev/null of io::Write - struct Void; + let args = env::args().collect::>(); - impl io::Write for Void { - fn write(&mut self, bytes: &[u8]) -> io::Result { - Ok(bytes.len()) - } + let tests = test_dir + .read_dir() + .unwrap() + .map(|e| desc(e.unwrap().path())) + .collect(); - fn flush(&mut self) -> io::Result<()> { - Ok(()) - } - } + test_main(&args, tests); +} - macro_rules! ref_file { - ($ref_name:ident, $file:expr) => { - concat!( - env!("CARGO_MANIFEST_DIR"), - "/tests/ref/", stringify!($ref_name), "/", $file - ) - } - } - - fn read_u8

(path: P) -> Vec - where P: AsRef - { - let mut res = Vec::new(); - File::open(path.as_ref()).unwrap() - .read_to_end(&mut res).unwrap(); - - res - } - - fn read_string

(path: P) -> String - where P: AsRef - { - let mut res = String::new(); - File::open(path.as_ref()).unwrap() - .read_to_string(&mut res).unwrap(); - - res - } - - macro_rules! ref_test { - ($name:ident) => { - #[test] - fn $name() { - let recording = read_u8(ref_file!($name, "alacritty.recording")); - let serialized_size = read_string(ref_file!($name, "size.json")); - let serialized_grid = read_string(ref_file!($name, "grid.json")); - - let size: SizeInfo = json::from_str(&serialized_size).unwrap(); - let grid: Grid = json::from_str(&serialized_grid).unwrap(); - - let mut terminal = Term::new(size); - let mut parser = ansi::Processor::new(); - - for byte in recording { - parser.advance(&mut terminal, byte, &mut Void); - } - - assert_eq!(grid, *terminal.grid()); - } - }; - - ($( $name:ident ),*) => { - $( - ref_test! { $name } - )* - }; - } - - // Ref tests! - ref_test! { - ll, - vim_simple_edit, - tmux_htop, - tmux_git_log, - vim_large_window_scroll, - indexed_256_colors, - fish_cc +fn desc(dir: PathBuf) -> TestDescAndFn { + TestDescAndFn { + desc: TestDesc { + name: TestName::DynTestName(dir.file_name().unwrap().to_string_lossy().into_owned()), + ignore: false, + should_panic: ShouldPanic::No, + }, + testfn: TestFn::dyn_test_fn(move || ref_test(&dir)), } } + +fn read_u8

(path: P) -> Vec + where P: AsRef +{ + let mut res = Vec::new(); + File::open(path.as_ref()).unwrap() + .read_to_end(&mut res).unwrap(); + + res +} + +fn read_string

(path: P) -> String + where P: AsRef +{ + let mut res = String::new(); + File::open(path.as_ref()).unwrap() + .read_to_string(&mut res).unwrap(); + + res +} + +fn ref_test(dir: &Path) { + let recording = read_u8(dir.join("alacritty.recording")); + let serialized_size = read_string(dir.join("size.json")); + let serialized_grid = read_string(dir.join("grid.json")); + + let size: SizeInfo = json::from_str(&serialized_size).unwrap(); + let grid: Grid = json::from_str(&serialized_grid).unwrap(); + + let mut terminal = Term::new(size); + let mut parser = ansi::Processor::new(); + + for byte in recording { + parser.advance(&mut terminal, byte, &mut io::sink()); + } + + assert_eq!(grid, *terminal.grid()); +}