diff --git a/mk/check.mk b/mk/check.mk index b3a9a899ea8..2b9253fe326 100644 --- a/mk/check.mk +++ b/mk/check.mk @@ -22,7 +22,7 @@ servo-test: $(DEPS_servo) $(RUSTC) $(RFLAGS_servo) --test -o $@ $< reftest: $(S)src/test/harness/reftest/reftest.rs servo - $(RUSTC) $(RFLAGS_servo) -o $@ $< -L . + $(RUSTC) -o $@ $< contenttest: $(S)src/test/harness/contenttest/contenttest.rs servo $(RUSTC) $(RFLAGS_servo) -o $@ $< -L . @@ -44,15 +44,15 @@ check-all: $(DEPS_CHECK_TARGETS_ALL) check-servo tidy .PHONY: check-servo check-servo: servo-test - ./servo-test $(TESTNAME) + ./servo-test .PHONY: check-ref check-ref: reftest - ./reftest --source-dir=$(S)/src/test/html/ref --work-dir=src/test/html/ref $(TESTNAME) + ./reftest $(S)src/test/ref/*.list .PHONY: check-content check-content: contenttest - ./contenttest --source-dir=$(S)/src/test/html/content $(TESTNAME) + ./contenttest --source-dir=$(S)src/test/html/content $(TESTNAME) .PHONY: tidy tidy: diff --git a/src/test/harness/reftest/reftest.rs b/src/test/harness/reftest/reftest.rs index 8ba59299148..11e96cfdf75 100644 --- a/src/test/harness/reftest/reftest.rs +++ b/src/test/harness/reftest/reftest.rs @@ -8,188 +8,141 @@ // except according to those terms. extern mod std; -extern mod servo; +extern mod extra; -use std::test::{TestOpts, run_tests_console, TestDesc}; -use std::getopts::{getopts, reqopt, opt_str, fail_str}; -use os::list_dir_path; -use servo::run_pipeline_png; -use servo::image::base::Image; +use std::cell::Cell; +use std::io; +use std::os; +use std::run; +use extra::digest::{Digest, DigestUtil}; +use extra::sha1::Sha1; +use extra::test::{DynTestName, DynTestFn, TestDesc, TestOpts, TestDescAndFn}; +use extra::test::run_tests_console; -fn main(args: ~[~str]) { - let config = parse_config(args); - let opts = test_options(config); - let tests = find_tests(config); - install_rasterize_py(config); - run_tests_console(opts, tests); -} - -struct Config { - source_dir: ~str, - work_dir: ~str, - filter: Option<~str> -} - -fn parse_config(args: ~[~str]) -> Config { - let args = args.tail(); - let opts = ~[reqopt(~"source-dir"), reqopt(~"work-dir")]; - let matches = match getopts(args, opts) { - Ok(m) => m, - Err(f) => fail fail_str(f) - }; - - Config { - source_dir: opt_str(matches, ~"source-dir"), - work_dir: opt_str(matches, ~"work-dir"), - filter: if matches.free.is_empty() { - None - } else { - Some(matches.free.head()) - } +fn main() { + let args = os::args(); + if args.len() < 2 { + println("error: at least one reftest list must be given"); + os::set_exit_status(1); + return; } -} -fn test_options(config: Config) -> TestOpts { - { - filter: config.filter, + let tests = parse_lists(args.tail()); + let test_opts = TestOpts { + filter: None, run_ignored: false, - logfile: None - } -} - -fn find_tests(config: Config) -> ~[TestDesc] { - let all_files = list_dir_path(&Path(config.source_dir)); - let html_files = all_files.filter( |file| file.to_str().ends_with(".html") ); - return html_files.map(|file| make_test(config, (*file).to_str()) ); -} - -fn make_test(config: Config, file: ~str) -> TestDesc { - let directives = load_test_directives(file); - - { - name: file, - testfn: fn~() { run_test(config, file) }, - ignore: directives.ignore, - should_fail: false - } -} - -struct Directives { - ignore: bool -} - -fn load_test_directives(file: ~str) -> Directives { - let data = match io::read_whole_file_str(&Path(file)) { - result::Ok(data) => data, - result::Err(e) => fail #fmt("unable to load directives for %s: %s", file, e) + logfile: None, + run_tests: true, + run_benchmarks: false, + save_results: None, + compare_results: None, }; - let mut ignore = false; + if !run_tests_console(&test_opts, tests) { + os::set_exit_status(1); + } +} - for str::lines(data).each |line| { - if is_comment(line) { - if line.contains("ignore") { - ignore = true; - break; +enum ReftestKind { + Same, + Different, +} + +struct Reftest { + name: ~str, + kind: ReftestKind, + left: ~str, + right: ~str, +} + +fn parse_lists(filenames: &[~str]) -> ~[TestDescAndFn] { + let mut tests: ~[TestDescAndFn] = ~[]; + for filenames.iter().advance |file| { + let file_path = Path(*file); + let contents = match io::read_whole_file_str(&file_path) { + Ok(x) => x, + Err(s) => fail!(s) + }; + + for contents.line_iter().advance |line| { + let parts: ~[&str] = line.split_iter(' ').filter(|p| !p.is_empty()).collect(); + + if parts.len() != 3 { + fail!(fmt!("reftest line: '%s' doesn't match 'KIND LEFT RIGHT'", line)); } + + let kind = match parts[0] { + "==" => Same, + "!=" => Different, + _ => fail!(fmt!("reftest line: '%s' has invalid kind '%s'", + line, parts[0])) + }; + let src_dir = file_path.dirname(); + let file_left = src_dir + "/" + parts[1]; + let file_right = src_dir + "/" + parts[2]; + + let reftest = Reftest { + name: parts[1] + " / " + parts[2], + kind: kind, + left: file_left, + right: file_right, + }; + + tests.push(make_test(reftest)); } } + tests +} - fn is_comment(line: ~str) -> bool { - line.starts_with("