build: Run tutorial tests
This commit is contained in:
parent
ba5cc236f7
commit
327c8bc733
4 changed files with 66 additions and 5 deletions
1
configure
vendored
1
configure
vendored
|
@ -460,6 +460,7 @@ do
|
||||||
make_dir $h/test/bench
|
make_dir $h/test/bench
|
||||||
make_dir $h/test/perf
|
make_dir $h/test/perf
|
||||||
make_dir $h/test/pretty
|
make_dir $h/test/pretty
|
||||||
|
make_dir $h/test/doc-tutorial
|
||||||
done
|
done
|
||||||
|
|
||||||
# Configure submodules
|
# Configure submodules
|
||||||
|
|
|
@ -642,6 +642,7 @@ you use the matching to get at the contents of data types. Remember
|
||||||
that `(float, float)` is a tuple of two floats:
|
that `(float, float)` is a tuple of two floats:
|
||||||
|
|
||||||
~~~~
|
~~~~
|
||||||
|
## xfail-test
|
||||||
fn angle(vec: (float, float)) -> float {
|
fn angle(vec: (float, float)) -> float {
|
||||||
alt vec {
|
alt vec {
|
||||||
(0f, y) if y < 0f { 1.5 * float::consts::pi }
|
(0f, y) if y < 0f { 1.5 * float::consts::pi }
|
||||||
|
@ -895,6 +896,7 @@ should almost always specify the type of that argument as `fn()`, so
|
||||||
that callers have the flexibility to pass whatever they want.
|
that callers have the flexibility to pass whatever they want.
|
||||||
|
|
||||||
~~~~
|
~~~~
|
||||||
|
## xfail-test
|
||||||
fn call_twice(f: fn()) { f(); f(); }
|
fn call_twice(f: fn()) { f(); f(); }
|
||||||
call_twice({|| "I am a stack closure; });
|
call_twice({|| "I am a stack closure; });
|
||||||
call_twice(fn@() { "I am a boxed closure"; });
|
call_twice(fn@() { "I am a boxed closure"; });
|
||||||
|
@ -1154,6 +1156,7 @@ get at their contents. All variant constructors can be used as
|
||||||
patterns, as in this definition of `area`:
|
patterns, as in this definition of `area`:
|
||||||
|
|
||||||
~~~~
|
~~~~
|
||||||
|
## xfail-test
|
||||||
# type point = {x: float, y: float};
|
# type point = {x: float, y: float};
|
||||||
# enum shape { circle(point, float), rectangle(point, point) }
|
# enum shape { circle(point, float), rectangle(point, point) }
|
||||||
fn area(sh: shape) -> float {
|
fn area(sh: shape) -> float {
|
||||||
|
@ -2152,6 +2155,7 @@ hexadecimal string and prints to standard output. If you have the
|
||||||
OpenSSL libraries installed, it should 'just work'.
|
OpenSSL libraries installed, it should 'just work'.
|
||||||
|
|
||||||
~~~~
|
~~~~
|
||||||
|
## xfail-test
|
||||||
use std;
|
use std;
|
||||||
|
|
||||||
native mod crypto {
|
native mod crypto {
|
||||||
|
@ -2182,6 +2186,7 @@ Before we can call `SHA1`, we have to declare it. That is what this
|
||||||
part of the program is responsible for:
|
part of the program is responsible for:
|
||||||
|
|
||||||
~~~~
|
~~~~
|
||||||
|
## xfail-test
|
||||||
native mod crypto {
|
native mod crypto {
|
||||||
fn SHA1(src: *u8, sz: uint, out: *u8) -> *u8;
|
fn SHA1(src: *u8, sz: uint, out: *u8) -> *u8;
|
||||||
}
|
}
|
||||||
|
@ -2197,6 +2202,7 @@ link that in. If you want the module to have a different name from the
|
||||||
actual library, you can use the `"link_name"` attribute, like:
|
actual library, you can use the `"link_name"` attribute, like:
|
||||||
|
|
||||||
~~~~
|
~~~~
|
||||||
|
## xfail-test
|
||||||
#[link_name = "crypto"]
|
#[link_name = "crypto"]
|
||||||
native mod something {
|
native mod something {
|
||||||
fn SHA1(src: *u8, sz: uint, out: *u8) -> *u8;
|
fn SHA1(src: *u8, sz: uint, out: *u8) -> *u8;
|
||||||
|
@ -2229,6 +2235,7 @@ The native `SHA1` function is declared to take three arguments, and
|
||||||
return a pointer.
|
return a pointer.
|
||||||
|
|
||||||
~~~~
|
~~~~
|
||||||
|
## xfail-test
|
||||||
# native mod crypto {
|
# native mod crypto {
|
||||||
fn SHA1(src: *u8, sz: uint, out: *u8) -> *u8;
|
fn SHA1(src: *u8, sz: uint, out: *u8) -> *u8;
|
||||||
# }
|
# }
|
||||||
|
@ -2407,6 +2414,7 @@ For example, imagine we wish to perform two expensive computations
|
||||||
in parallel. We might write something like:
|
in parallel. We might write something like:
|
||||||
|
|
||||||
~~~~
|
~~~~
|
||||||
|
## xfail-test
|
||||||
# fn some_expensive_computation() -> int { 42 }
|
# fn some_expensive_computation() -> int { 42 }
|
||||||
# fn some_other_expensive_computation() {}
|
# fn some_other_expensive_computation() {}
|
||||||
let port = comm::port::<int>();
|
let port = comm::port::<int>();
|
||||||
|
@ -2454,6 +2462,7 @@ some other expensive computation and then waiting for the child's result
|
||||||
to arrive on the port:
|
to arrive on the port:
|
||||||
|
|
||||||
~~~~
|
~~~~
|
||||||
|
## xfail-test
|
||||||
# fn some_other_expensive_computation() {}
|
# fn some_other_expensive_computation() {}
|
||||||
# let port = comm::port::<int>();
|
# let port = comm::port::<int>();
|
||||||
some_other_expensive_computation();
|
some_other_expensive_computation();
|
||||||
|
@ -2492,7 +2501,7 @@ strified version of the received value, `uint::to_str(value)`.
|
||||||
|
|
||||||
Here is the code for the parent task:
|
Here is the code for the parent task:
|
||||||
~~~~
|
~~~~
|
||||||
|
## xfail-test
|
||||||
# fn stringifier(from_par: comm::port<uint>,
|
# fn stringifier(from_par: comm::port<uint>,
|
||||||
# to_par: comm::chan<str>) {}
|
# to_par: comm::chan<str>) {}
|
||||||
fn main() {
|
fn main() {
|
||||||
|
|
45
mk/tests.mk
45
mk/tests.mk
|
@ -99,6 +99,24 @@ tidy:
|
||||||
| xargs -n 10 python $(S)src/etc/tidy.py
|
| xargs -n 10 python $(S)src/etc/tidy.py
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
|
||||||
|
######################################################################
|
||||||
|
# Extracting tests for docs
|
||||||
|
######################################################################
|
||||||
|
|
||||||
|
EXTRACT_TESTS := $(CFG_PYTHON) $(S)src/etc/extract-tests.py
|
||||||
|
|
||||||
|
define DEF_DOC_TEST_HOST
|
||||||
|
|
||||||
|
doc-tutorial-extract$(1):
|
||||||
|
@$$(call E, extract: tutorial tests)
|
||||||
|
$$(Q)$$(EXTRACT_TESTS) $$(S)doc/tutorial.md $(1)/test/doc-tutorial
|
||||||
|
|
||||||
|
endef
|
||||||
|
|
||||||
|
$(foreach host,$(CFG_TARGET_TRIPLES), \
|
||||||
|
$(eval $(call DEF_DOC_TEST_HOST,$(host))))
|
||||||
|
|
||||||
######################################################################
|
######################################################################
|
||||||
# Rules for the test runners
|
# Rules for the test runners
|
||||||
######################################################################
|
######################################################################
|
||||||
|
@ -121,7 +139,8 @@ check-stage$(1)-T-$(2)-H-$(3): tidy \
|
||||||
check-stage$(1)-T-$(2)-H-$(3)-cfail \
|
check-stage$(1)-T-$(2)-H-$(3)-cfail \
|
||||||
check-stage$(1)-T-$(2)-H-$(3)-bench \
|
check-stage$(1)-T-$(2)-H-$(3)-bench \
|
||||||
check-stage$(1)-T-$(2)-H-$(3)-pretty \
|
check-stage$(1)-T-$(2)-H-$(3)-pretty \
|
||||||
check-stage$(1)-T-$(2)-H-$(3)-rustdoc
|
check-stage$(1)-T-$(2)-H-$(3)-rustdoc \
|
||||||
|
check-stage$(1)-T-$(2)-H-$(3)-doc-tutorial
|
||||||
|
|
||||||
check-stage$(1)-T-$(2)-H-$(3)-core: \
|
check-stage$(1)-T-$(2)-H-$(3)-core: \
|
||||||
check-stage$(1)-T-$(2)-H-$(3)-core-dummy
|
check-stage$(1)-T-$(2)-H-$(3)-core-dummy
|
||||||
|
@ -168,6 +187,9 @@ check-stage$(1)-T-$(2)-H-$(3)-pretty-pretty: \
|
||||||
check-stage$(1)-T-$(2)-H-$(3)-rustdoc: \
|
check-stage$(1)-T-$(2)-H-$(3)-rustdoc: \
|
||||||
check-stage$(1)-T-$(2)-H-$(3)-rustdoc-dummy
|
check-stage$(1)-T-$(2)-H-$(3)-rustdoc-dummy
|
||||||
|
|
||||||
|
check-stage$(1)-T-$(2)-H-$(3)-doc-tutorial: \
|
||||||
|
check-stage$(1)-T-$(2)-H-$(3)-doc-tutorial-dummy
|
||||||
|
|
||||||
# Rules for the core library test runner
|
# Rules for the core library test runner
|
||||||
|
|
||||||
$(3)/test/coretest.stage$(1)-$(2)$$(X): \
|
$(3)/test/coretest.stage$(1)-$(2)$$(X): \
|
||||||
|
@ -293,6 +315,12 @@ PRETTY_PRETTY_ARGS$(1)-T-$(2)-H-$(3) := \
|
||||||
--build-base $(3)/test/pretty/ \
|
--build-base $(3)/test/pretty/ \
|
||||||
--mode pretty
|
--mode pretty
|
||||||
|
|
||||||
|
DOC_TUTORIAL_ARGS$(1)-T-$(2)-H-$(3) := \
|
||||||
|
$$(CTEST_COMMON_ARGS$(1)-T-$(2)-H-$(3)) \
|
||||||
|
--src-base $(3)/test/doc-tutorial/ \
|
||||||
|
--build-base $(3)/test/doc-tutorial/ \
|
||||||
|
--mode run-pass
|
||||||
|
|
||||||
check-stage$(1)-T-$(2)-H-$(3)-cfail-dummy: \
|
check-stage$(1)-T-$(2)-H-$(3)-cfail-dummy: \
|
||||||
$$(HBIN$(1)_H_$(3))/compiletest$$(X) \
|
$$(HBIN$(1)_H_$(3))/compiletest$$(X) \
|
||||||
$$(SREQ$(1)_T_$(2)_H_$(3)) \
|
$$(SREQ$(1)_T_$(2)_H_$(3)) \
|
||||||
|
@ -365,6 +393,14 @@ check-stage$(1)-T-$(2)-H-$(3)-pretty-pretty-dummy: \
|
||||||
$$(Q)$$(call CFG_RUN_CTEST,$(1),$$<,$(3)) \
|
$$(Q)$$(call CFG_RUN_CTEST,$(1),$$<,$(3)) \
|
||||||
$$(PRETTY_PRETTY_ARGS$(1)-T-$(2)-H-$(3))
|
$$(PRETTY_PRETTY_ARGS$(1)-T-$(2)-H-$(3))
|
||||||
|
|
||||||
|
check-stage$(1)-T-$(2)-H-$(3)-doc-tutorial-dummy: \
|
||||||
|
$$(HBIN$(1)_H_$(3))/compiletest$$(X) \
|
||||||
|
$$(SREQ$(1)_T_$(2)_H_$(3)) \
|
||||||
|
doc-tutorial-extract$(3)
|
||||||
|
@$$(call E, run doc-tutorial: $$<)
|
||||||
|
$$(Q)$$(call CFG_RUN_CTEST,$(1),$$<,$(3)) \
|
||||||
|
$$(DOC_TUTORIAL_ARGS$(1)-T-$(2)-H-$(3))
|
||||||
|
|
||||||
endef
|
endef
|
||||||
|
|
||||||
# Instantiate the template for stage 0, 1, 2, 3
|
# Instantiate the template for stage 0, 1, 2, 3
|
||||||
|
@ -471,6 +507,9 @@ check-stage$(1)-H-$(2)-pretty-pretty: \
|
||||||
check-stage$(1)-H-$(2)-rustdoc: \
|
check-stage$(1)-H-$(2)-rustdoc: \
|
||||||
$$(foreach target,$$(CFG_TARGET_TRIPLES), \
|
$$(foreach target,$$(CFG_TARGET_TRIPLES), \
|
||||||
check-stage$(1)-T-$$(target)-H-$(2)-rustdoc)
|
check-stage$(1)-T-$$(target)-H-$(2)-rustdoc)
|
||||||
|
check-stage$(1)-H-$(2)-doc-tutorial: \
|
||||||
|
$$(foreach target,$$(CFG_TARGET_TRIPLES), \
|
||||||
|
check-stage$(1)-T-$$(target)-H-$(2)-doc-tutorial)
|
||||||
|
|
||||||
endef
|
endef
|
||||||
|
|
||||||
|
@ -534,6 +573,9 @@ check-stage$(1)-H-all-pretty-pretty: \
|
||||||
check-stage$(1)-H-all-rustdoc: \
|
check-stage$(1)-H-all-rustdoc: \
|
||||||
$$(foreach target,$$(CFG_TARGET_TRIPLES), \
|
$$(foreach target,$$(CFG_TARGET_TRIPLES), \
|
||||||
check-stage$(1)-H-$$(target)-rustdoc)
|
check-stage$(1)-H-$$(target)-rustdoc)
|
||||||
|
check-stage$(1)-H-all-doc-tutorial: \
|
||||||
|
$$(foreach target,$$(CFG_TARGET_TRIPLES), \
|
||||||
|
check-stage$(1)-H-$$(target)-doc-tutorial)
|
||||||
|
|
||||||
endef
|
endef
|
||||||
|
|
||||||
|
@ -557,6 +599,7 @@ check-stage$(1)-pretty-rfail: check-stage$(1)-H-$$(CFG_HOST_TRIPLE)-pretty-rfail
|
||||||
check-stage$(1)-pretty-bench: check-stage$(1)-H-$$(CFG_HOST_TRIPLE)-pretty-bench
|
check-stage$(1)-pretty-bench: check-stage$(1)-H-$$(CFG_HOST_TRIPLE)-pretty-bench
|
||||||
check-stage$(1)-pretty-pretty: check-stage$(1)-H-$$(CFG_HOST_TRIPLE)-pretty-pretty
|
check-stage$(1)-pretty-pretty: check-stage$(1)-H-$$(CFG_HOST_TRIPLE)-pretty-pretty
|
||||||
check-stage$(1)-rustdoc: check-stage$(1)-H-$$(CFG_HOST_TRIPLE)-rustdoc
|
check-stage$(1)-rustdoc: check-stage$(1)-H-$$(CFG_HOST_TRIPLE)-rustdoc
|
||||||
|
check-stage$(1)-doc-tutorial: check-stage$(1)-H-$$(CFG_HOST_TRIPLE)-doc-tutorial
|
||||||
|
|
||||||
endef
|
endef
|
||||||
|
|
||||||
|
|
|
@ -6,11 +6,12 @@
|
||||||
|
|
||||||
import sys, re;
|
import sys, re;
|
||||||
|
|
||||||
if len(sys.argv) < 2:
|
if len(sys.argv) < 3:
|
||||||
print("Please provide an input filename")
|
print("Please provide an input filename")
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
filename = sys.argv[1]
|
filename = sys.argv[1]
|
||||||
|
dest = sys.argv[2]
|
||||||
f = open(filename)
|
f = open(filename)
|
||||||
lines = f.readlines()
|
lines = f.readlines()
|
||||||
f.close()
|
f.close()
|
||||||
|
@ -30,24 +31,31 @@ while cur < len(lines):
|
||||||
elif re.match("~~~", line):
|
elif re.match("~~~", line):
|
||||||
block = ""
|
block = ""
|
||||||
ignore = False
|
ignore = False
|
||||||
|
xfail = False
|
||||||
while cur < len(lines):
|
while cur < len(lines):
|
||||||
line = lines[cur]
|
line = lines[cur]
|
||||||
cur += 1
|
cur += 1
|
||||||
if re.match(r"\s*## (notrust|ignore)", line):
|
if re.match(r"\s*## (notrust|ignore)", line):
|
||||||
ignore = True
|
ignore = True
|
||||||
|
elif re.match(r"\s*## xfail-test", line):
|
||||||
|
xfail = True
|
||||||
elif re.match("~~~", line):
|
elif re.match("~~~", line):
|
||||||
break
|
break
|
||||||
else:
|
else:
|
||||||
block += re.sub("^# ", "", line)
|
block += re.sub("^# ", "", line)
|
||||||
if not ignore:
|
if not ignore:
|
||||||
if not re.search(r"\bfn main\b", block):
|
if not re.search(r"\bfn main\b", block):
|
||||||
if re.search(r"(^|\n) *(native|use|mod|import|export)\b", block):
|
if re.search(
|
||||||
|
r"(^|\n) *(native|use|mod|import|export)\b", block):
|
||||||
block += "\nfn main() {}\n"
|
block += "\nfn main() {}\n"
|
||||||
else:
|
else:
|
||||||
block = "fn main() {\n" + block + "\n}\n"
|
block = "fn main() {\n" + block + "\n}\n"
|
||||||
if not re.search(r"\buse std\b", block):
|
if not re.search(r"\buse std\b", block):
|
||||||
block = "use std;\n" + block;
|
block = "use std;\n" + block;
|
||||||
filename = "fragments/" + str(chapter) + "_" + str(chapter_n) + ".rs"
|
if xfail:
|
||||||
|
block = "// xfail-test\n" + block
|
||||||
|
filename = (dest + "/" + str(chapter)
|
||||||
|
+ "_" + str(chapter_n) + ".rs")
|
||||||
chapter_n += 1
|
chapter_n += 1
|
||||||
f = open(filename, 'w')
|
f = open(filename, 'w')
|
||||||
f.write(block)
|
f.write(block)
|
Loading…
Add table
Add a link
Reference in a new issue