Auto merge of #21304 - lifthrasiir:htmldocck, r=alexcrichton

The script is intended as a tool for doing every sort of verifications amenable to Rustdoc's HTML output. For example, link checkers would go to this script. It already parses HTML into a document tree form (with a slight caveat), so future tests can make use of it.

As an example, relevant `rustdoc-*` run-make tests have been updated to use `htmldocck.py` and got their `verify.sh` removed. In the future they may go to a dedicated directory with htmldocck running by default. The detailed explanation of test scripts is provided as a docstring of htmldocck.

cc #19723
This commit is contained in:
bors 2015-01-20 06:45:02 +00:00
commit 3bf41dafcf
16 changed files with 389 additions and 99 deletions

View file

@ -7,8 +7,7 @@ all:
@echo $(RUSTDOC)
$(HOST_RPATH_ENV) $(RUSTDOC) --test foo.rs
$(HOST_RPATH_ENV) $(RUSTDOC) -w html -o $(TMPDIR)/doc foo.rs
cp verify.sh $(TMPDIR)
$(call RUN,verify.sh) $(TMPDIR)
$(HTMLDOCCK) $(TMPDIR)/doc foo.rs
else
all:

View file

@ -30,3 +30,7 @@
/// }
/// ```
pub fn foo() {}
// @!has foo/fn.foo.html invisible
// @matches - //pre '#.*\[.*derive.*\(.*Eq.*\).*\].*//.*Bar'

View file

@ -1,8 +0,0 @@
#!/bin/sh
file="$1/doc/foo/fn.foo.html"
grep -v 'invisible' $file &&
grep '#.*\[.*derive.*(.*Eq.*).*\].*//.*Bar' $file
exit $?

View file

@ -7,9 +7,7 @@ source=index.rs
all:
$(HOST_RPATH_ENV) $(RUSTDOC) -w html -o $(TMPDIR)/doc $(source)
cp $(source) $(TMPDIR)
cp verify.sh $(TMPDIR)
$(call RUN,verify.sh) $(TMPDIR)
$(HTMLDOCCK) $(TMPDIR)/doc $(source)
else
all:

View file

@ -10,20 +10,17 @@
#![crate_name = "rustdoc_test"]
// In: Foo
// @has search-index.js Foo
pub use private::Foo;
mod private {
pub struct Foo;
impl Foo {
// In: test_method
pub fn test_method() {}
// Out: priv_method
fn priv_method() {}
pub fn test_method() {} // @has - test_method
fn priv_method() {} // @!has - priv_method
}
pub trait PrivateTrait {
// Out: priv_method
fn trait_method() {}
fn trait_method() {} // @!has - priv_method
}
}

View file

@ -1,33 +0,0 @@
#!/bin/sh
source="$1/index.rs"
index="$1/doc/search-index.js"
if ! [ -e $index ]
then
echo "Could not find the search index (looked for $index)"
exit 1
fi
ins=$(grep -o 'In: .*' $source | sed 's/In: \(.*\)/\1/g')
outs=$(grep -o 'Out: .*' $source | sed 's/Out: \(.*\)/\1/g')
for p in $ins
do
if ! grep -q $p $index
then
echo "'$p' was erroneously excluded from search index."
exit 1
fi
done
for p in $outs
do
if grep -q $p $index
then
echo "'$p' was erroneously included in search index."
exit 1
fi
done
exit 0

View file

@ -1,5 +1,4 @@
-include ../tools.mk
all:
$(HOST_RPATH_ENV) $(RUSTDOC) -w html -o $(TMPDIR)/doc foo.rs
cp verify.sh $(TMPDIR)
$(call RUN,verify.sh) $(TMPDIR)
$(HTMLDOCCK) $(TMPDIR)/doc foo.rs

View file

@ -8,22 +8,29 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.
// @has foo/index.html
#![crate_name = "foo"]
//! Very docs
// @has foo/bar/index.html
pub mod bar {
/// So correct
// @has foo/bar/baz/index.html
pub mod baz {
/// Much detail
// @has foo/bar/baz/fn.baz.html
pub fn baz() { }
}
/// *wow*
// @has foo/bar/trait.Doge.html
pub trait Doge { }
// @has foo/bar/struct.Foo.html
pub struct Foo { x: int, y: uint }
// @has foo/bar/fn.prawns.html
pub fn prawns((a, b): (int, uint), Foo { x, y }: Foo) { }
}

View file

@ -1,17 +0,0 @@
#!/bin/sh
# $1 is the TMPDIR
dirs="doc doc/foo doc/foo/bar doc/foo/bar/baz doc/src doc/src/foo"
for dir in $dirs; do if [ ! -d $1/$dir ]; then
echo "$1/$dir is not a directory!"
exit 1
fi done
files="doc/foo/index.html doc/foo/bar/index.html doc/foo/bar/baz/fn.baz.html doc/foo/bar/trait.Doge.html doc/src/foo/foo.rs.html"
for file in $files; do if [ ! -f $1/$file ]; then
echo "$1/$file is not a file!"
exit 1
fi done

View file

@ -1,6 +1,6 @@
-include ../tools.mk
all: verify.sh foo.rs
all: foo.rs
$(HOST_RPATH_ENV) $(RUSTDOC) -w html -o $(TMPDIR)/doc foo.rs
cp verify.sh $(TMPDIR)
$(call RUN,verify.sh) $(TMPDIR)
$(HTMLDOCCK) $(TMPDIR)/doc foo.rs

View file

@ -10,17 +10,29 @@
pub trait MyTrait {}
// @matches foo/struct.Alpha.html '//pre' "Alpha.*where.*A:.*MyTrait"
pub struct Alpha<A> where A: MyTrait;
// @matches foo/trait.Bravo.html '//pre' "Bravo.*where.*B:.*MyTrait"
pub trait Bravo<B> where B: MyTrait {}
// @matches foo/fn.charlie.html '//pre' "charlie.*where.*C:.*MyTrait"
pub fn charlie<C>() where C: MyTrait {}
pub struct Delta<D>;
// @matches foo/struct.Delta.html '//*[@class="impl"]//code' "impl.*Delta.*where.*D:.*MyTrait"
impl<D> Delta<D> where D: MyTrait {
pub fn delta() {}
}
pub struct Echo<E>;
// @matches foo/struct.Echo.html '//*[@class="impl"]//code' \
// "impl.*MyTrait.*for.*Echo.*where.*E:.*MyTrait"
// @matches foo/trait.MyTrait.html '//*[@id="implementors-list"]//code' \
// "impl.*MyTrait.*for.*Echo.*where.*E:.*MyTrait"
impl<E> MyTrait for Echo<E> where E: MyTrait {}
pub enum Foxtrot<F> {}
// @matches foo/enum.Foxtrot.html '//*[@class="impl"]//code' \
// "impl.*MyTrait.*for.*Foxtrot.*where.*F:.*MyTrait"
// @matches foo/trait.MyTrait.html '//*[@id="implementors-list"]//code' \
// "impl.*MyTrait.*for.*Foxtrot.*where.*F:.*MyTrait"
impl<F> MyTrait for Foxtrot<F> where F: MyTrait {}

View file

@ -1,23 +0,0 @@
#!/bin/sh
set -e
# $1 is the TMPDIR
DOC=$1/doc/foo
grep "Alpha.*where.*A:.*MyTrait" $DOC/struct.Alpha.html > /dev/null
echo "Alpha"
grep "Bravo.*where.*B:.*MyTrait" $DOC/trait.Bravo.html > /dev/null
echo "Bravo"
grep "charlie.*where.*C:.*MyTrait" $DOC/fn.charlie.html > /dev/null
echo "Charlie"
grep "impl.*Delta.*where.*D:.*MyTrait" $DOC/struct.Delta.html > /dev/null
echo "Delta"
grep "impl.*MyTrait.*for.*Echo.*where.*E:.*MyTrait" $DOC/struct.Echo.html > /dev/null
echo "Echo"
grep "impl.*MyTrait.*for.*Foxtrot.*where.*F:.*MyTrait" $DOC/enum.Foxtrot.html > /dev/null
echo "Foxtrot"
# check "Implementors" section of MyTrait
grep "impl.*MyTrait.*for.*Echo.*where.*E:.*MyTrait" $DOC/trait.MyTrait.html > /dev/null
grep "impl.*MyTrait.*for.*Foxtrot.*where.*F:.*MyTrait" $DOC/trait.MyTrait.html > /dev/null
echo "Implementors OK"

View file

@ -7,6 +7,7 @@ TARGET_RPATH_ENV = \
RUSTC := $(HOST_RPATH_ENV) $(RUSTC) --out-dir $(TMPDIR) -L $(TMPDIR)
CC := $(CC) -L $(TMPDIR)
HTMLDOCCK := $(PYTHON) $(S)/src/etc/htmldocck.py
# This is the name of the binary we will generate and run; use this
# e.g. for `$(CC) -o $(RUN_BINFILE)`.