rustllvm \
dl stage0 stage1 stage2 stage3 \
stage0/lib stage1/lib stage2/lib stage3/lib \
- test/run-pass test/run-fail test/compile-fail test/bench
+ test/run-pass test/run-fail test/compile-fail test/bench test/pretty
do
make_dir $i
done
$(S)src/test/*/*/*.rs \
$(S)src/test/*/*.rc)
-BENCH_RS := $(wildcard $(S)src/test/bench/*.rs)
RPASS_RC := $(wildcard $(S)src/test/run-pass/*.rc)
RPASS_RS := $(wildcard $(S)src/test/run-pass/*.rs)
RFAIL_RC := $(wildcard $(S)src/test/run-fail/*.rc)
RFAIL_RS := $(wildcard $(S)src/test/run-fail/*.rs)
CFAIL_RC := $(wildcard $(S)src/test/compile-fail/*.rc)
CFAIL_RS := $(wildcard $(S)src/test/compile-fail/*.rs)
+BENCH_RS := $(wildcard $(S)src/test/bench/*.rs)
+PRETTY_RS := $(wildcard $(S)src/test/pretty/*.rs)
RPASS_TESTS := $(RPASS_RC) $(RPASS_RS)
RFAIL_TESTS := $(RFAIL_RC) $(RFAIL_RS)
CFAIL_TESTS := $(CFAIL_RC) $(CFAIL_RS)
BENCH_TESTS := $(BENCH_RS)
+PRETTY_TESTS := $(PRETTY_RS)
FT := run_pass_stage2
FT_LIB := $(call CFG_LIB_NAME,$(FT))
check-stage$(2)-bench: test/bench.stage$(2).out \
-check-stage$(2)-pretty: test/pretty.stage$(2).out \
-
check-stage$(2)-pretty-rpass: test/pretty-rpass.stage$(2).out \
check-stage$(2)-pretty-rfail: test/pretty-rfail.stage$(2).out \
+check-stage$(2)-pretty-pretty: test/pretty-pretty.stage$(2).out \
+
+check-stage$(2)-pretty: check-stage$(2)-pretty-rpass \
+ check-stage$(2)-pretty-rfail \
+ check-stage$(2)-pretty-pretty \
+
CTEST_COMMON_ARGS$(2) := --compile-lib-path stage$(2) \
--run-lib-path stage$(2)/lib \
--rustc-path stage$(2)/rustc$$(X) \
--build-base test/run-fail/ \
--mode pretty \
+PRETTY_PRETTY_ARGS$(2) := $$(CTEST_COMMON_ARGS$(2)) \
+ --src-base $$(S)src/test/pretty/ \
+ --build-base test/pretty/ \
+ --mode pretty \
+
test/compiletest.stage$(2)$$(X): $$(COMPILETEST_CRATE) \
$$(COMPILETEST_INPUTS) \
$$(SREQ$(2))
$$(Q)$$(call CFG_RUN_CTEST,$(2),$$<) $$(PRETTY_RFAIL_ARGS$(2))
$$(Q)touch $$@
-test/pretty.stage$(2).out.tmp: test/pretty-rpass.stage$(2).out.tmp \
- test/pretty-rfail.stage$(2).out.tmp
+test/pretty-pretty.stage$(2).out.tmp: test/compiletest.stage$(2)$$(X) \
+ $$(PRETTY_TESTS)
+ @$$(call E, run: $$<)
+ $$(Q)$$(call CFG_RUN_CTEST,$(2),$$<) $$(PRETTY_PRETTY_ARGS$(2))
$$(Q)touch $$@
endef
import std::option;
import std::str;
import std::io;
+import std::fs;
import common::config;
export load_props;
export is_test_ignored;
-type test_props = {error_patterns: str[], compile_flags: option::t[str]};
+type test_props = {
+ // Lines that should be expected, in order, on standard out
+ error_patterns: str[],
+ // Extra flags to pass to the compiler
+ compile_flags: option::t[str],
+ // If present, the name of a file that this test should match when
+ // pretty-printed
+ pp_exact: option::t[str]
+};
// Load any test directives embedded in the file
fn load_props(testfile: &str) -> test_props {
let error_patterns = ~[];
let compile_flags = option::none;
+ let pp_exact = option::none;
for each ln: str in iter_header(testfile) {
alt parse_error_pattern(ln) {
option::some(ep) { error_patterns += ~[ep]; }
option::none. { }
}
-
if option::is_none(compile_flags) {
compile_flags = parse_compile_flags(ln);
}
+
+ if option::is_none(pp_exact) {
+ pp_exact = parse_pp_exact(ln, testfile);
+ }
}
- ret {error_patterns: error_patterns, compile_flags: compile_flags};
+ ret {
+ error_patterns: error_patterns,
+ compile_flags: compile_flags,
+ pp_exact: pp_exact
+ };
}
fn is_test_ignored(config: &config, testfile: &str) -> bool {
parse_name_value_directive(line, "compile-flags")
}
+fn parse_pp_exact(line: &str, testfile: &str) -> option::t[str] {
+ alt parse_name_value_directive(line, "pp-exact") {
+ option::some(s) { option::some(s) }
+ option::none. {
+ if parse_name_directive(line, "pp-exact") {
+ option::some(fs::basename(testfile))
+ } else {
+ option::none
+ }
+ }
+ }
+}
+
fn parse_name_directive(line: &str, directive: &str) -> bool {
str::find(line, directive) >= 0
}
}
fn run_pretty_test(cx: &cx, props: &test_props, testfile: &str) {
- const rounds: int = 2;
+ if option::is_some(props.pp_exact) {
+ logv(cx.config, "testing for exact pretty-printing");
+ } else {
+ logv(cx.config, "testing for converging pretty-printing");
+ }
+
+ let rounds = alt props.pp_exact {
+ option::some(_) { 1 }
+ option::none. { 2 }
+ };
let srcs = ~[str::unsafe_from_bytes(
io::file_reader(testfile).read_whole_stream())];
round += 1;
}
- let expected = srcs.(ivec::len(srcs) - 2u);
+ let expected = alt props.pp_exact {
+ option::some(file) {
+ let filepath = fs::connect(fs::dirname(testfile), file);
+ str::unsafe_from_bytes(
+ io::file_reader(filepath).read_whole_stream())
+ }
+ option::none. {
+ srcs.(ivec::len(srcs) - 2u)
+ }
+ };
let actual = srcs.(ivec::len(srcs) - 1u);
compare_source(expected, actual);
fn compare_source(expected: &str, actual: &str) {
if expected != actual {
- error("pretty-printed source does not converge");
+ error("pretty-printed source does match expected source");
let msg = #fmt("\n\
expected:\n\
------------------------------------------\n\
--- /dev/null
+// pp-exact
+
+fn main() { }
\ No newline at end of file
--- /dev/null
+// pp-exact:example2.pp
+
+fn main() { }
\ No newline at end of file
--- /dev/null
+// pp-exact:example2.pp
+
+fn
+main
+()
+{
+}
\ No newline at end of file