add spec tests
This commit is contained in:
parent
40a612df95
commit
8c0abca85f
7 changed files with 143 additions and 0 deletions
3
.gitmodules
vendored
Normal file
3
.gitmodules
vendored
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
[submodule "jgm/djot"]
|
||||||
|
path = modules/djot
|
||||||
|
url = git@github.com:jgm/djot.git
|
|
@ -11,5 +11,11 @@ homepage = "https://hllmn.net/projects/jotdown"
|
||||||
repository = "https://github.com/hellux/jotdown"
|
repository = "https://github.com/hellux/jotdown"
|
||||||
documentation = "https://docs.rs/jotdown"
|
documentation = "https://docs.rs/jotdown"
|
||||||
exclude = [
|
exclude = [
|
||||||
|
".gitmodules",
|
||||||
"Makefile",
|
"Makefile",
|
||||||
|
"modules",
|
||||||
|
"tests",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[features]
|
||||||
|
suite = [] # test suite
|
||||||
|
|
16
Makefile
Normal file
16
Makefile
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
.POSIX:
|
||||||
|
|
||||||
|
.PHONY: suite
|
||||||
|
suite:
|
||||||
|
git submodule update --init modules/djot
|
||||||
|
for f in $$(find modules/djot/test -name '*.test' | xargs basename -a); do \
|
||||||
|
ln -fs ../../modules/djot/test/$$f tests/suite/$$f; \
|
||||||
|
done
|
||||||
|
(cd tests/suite && make)
|
||||||
|
cargo test --features suite
|
||||||
|
|
||||||
|
clean:
|
||||||
|
cargo clean
|
||||||
|
git submodule deinit -f --all
|
||||||
|
rm -f tests/suite/*.test
|
||||||
|
(cd tests/suite && make clean)
|
1
modules/djot
Submodule
1
modules/djot
Submodule
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit 4b3bf26dde0fa46a5d22b536154e3634619ef3a4
|
48
tests/lib.rs
Normal file
48
tests/lib.rs
Normal file
|
@ -0,0 +1,48 @@
|
||||||
|
#[cfg(feature = "suite")]
|
||||||
|
mod suite;
|
||||||
|
|
||||||
|
#[cfg(feature = "suite")]
|
||||||
|
#[macro_export]
|
||||||
|
macro_rules! suite_test {
|
||||||
|
($src:expr, $expected:expr) => {
|
||||||
|
let src = $src;
|
||||||
|
let expected = $expected;
|
||||||
|
let p = jotdown::Parser::new(src);
|
||||||
|
let mut actual = String::new();
|
||||||
|
jotdown::html::push(p, &mut actual);
|
||||||
|
assert_eq!(
|
||||||
|
actual.trim(),
|
||||||
|
expected.trim(),
|
||||||
|
concat!(
|
||||||
|
"\n",
|
||||||
|
"\x1b[0;1m========================= INPUT ============================\x1b[0m\n",
|
||||||
|
"\x1b[2m{}",
|
||||||
|
"\x1b[0;1m=================== ACTUAL vs EXPECTED =====================\x1b[0m\n",
|
||||||
|
"{}",
|
||||||
|
"\x1b[0;1m============================================================\x1b[0m\n",
|
||||||
|
),
|
||||||
|
$src,
|
||||||
|
{
|
||||||
|
let a = actual.trim().split('\n');
|
||||||
|
let b = expected.trim().split('\n');
|
||||||
|
let max = a.clone().count().max(b.clone().count());
|
||||||
|
let a_width = a.clone().map(|a| a.len()).max().unwrap_or(0);
|
||||||
|
a.chain(std::iter::repeat(""))
|
||||||
|
.zip(b.chain(std::iter::repeat("")))
|
||||||
|
.take(max)
|
||||||
|
.map(|(a, b)| {
|
||||||
|
format!(
|
||||||
|
"\x1b[{}m{:a_width$}\x1b[0m {}= \x1b[{}m{}\x1b[0m\n",
|
||||||
|
if a == b { "2" } else { "31" },
|
||||||
|
a,
|
||||||
|
if a == b { '=' } else { '!' },
|
||||||
|
if a == b { "2" } else { "32" },
|
||||||
|
b,
|
||||||
|
a_width = a_width,
|
||||||
|
)
|
||||||
|
})
|
||||||
|
.collect::<String>()
|
||||||
|
},
|
||||||
|
);
|
||||||
|
};
|
||||||
|
}
|
22
tests/suite/Makefile
Normal file
22
tests/suite/Makefile
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
.POSIX:
|
||||||
|
|
||||||
|
.SUFFIXES: .test .rs
|
||||||
|
|
||||||
|
TEST=$(shell find . -name '*.test' | sort)
|
||||||
|
TEST_RS=${TEST:.test=.rs}
|
||||||
|
|
||||||
|
.PHONY: suite
|
||||||
|
suite: mod.rs
|
||||||
|
|
||||||
|
mod.rs: ${TEST_RS}
|
||||||
|
printf "" > $@
|
||||||
|
for f in ${TEST}; do \
|
||||||
|
name=$$(basename -s .test $$f); \
|
||||||
|
echo "mod $$name;" >> $@; \
|
||||||
|
done
|
||||||
|
|
||||||
|
.test.rs:
|
||||||
|
awk -fgen.awk $< > $@
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f *.rs
|
47
tests/suite/gen.awk
Normal file
47
tests/suite/gen.awk
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
BEGIN {
|
||||||
|
print "use crate::suite_test;"
|
||||||
|
print ""
|
||||||
|
}
|
||||||
|
|
||||||
|
$0 ~ "^`{3,}$" {
|
||||||
|
l=length($0)
|
||||||
|
if (fence == 0) { # enter fence
|
||||||
|
print "#[test]"
|
||||||
|
printf "fn test%02d() {\n", count
|
||||||
|
printf " let src = r##\""
|
||||||
|
fence=l
|
||||||
|
count+=1
|
||||||
|
} else if (fence == l) { # exit fence
|
||||||
|
if (ignore) {
|
||||||
|
ignore=0
|
||||||
|
} else {
|
||||||
|
print "\"##;"
|
||||||
|
print " suite_test!(src, expected);"
|
||||||
|
print "}"
|
||||||
|
print ""
|
||||||
|
}
|
||||||
|
fence=0
|
||||||
|
} else {
|
||||||
|
print $0 # md/html
|
||||||
|
}
|
||||||
|
next
|
||||||
|
}
|
||||||
|
|
||||||
|
fence == 0 && $0 ~ "^`{3,} .*$" {
|
||||||
|
ignore=1
|
||||||
|
fence=match($0, "[^`]")-1
|
||||||
|
next
|
||||||
|
}
|
||||||
|
|
||||||
|
$0 ~ "^\\.$" && !ignore { # enter html
|
||||||
|
print "\"##;"
|
||||||
|
printf " let expected = r##\""
|
||||||
|
next
|
||||||
|
}
|
||||||
|
|
||||||
|
!ignore {
|
||||||
|
if (fence==0 && $0 != "") { # comment
|
||||||
|
printf "// "
|
||||||
|
}
|
||||||
|
print $0 # comment/md/html
|
||||||
|
}
|
Loading…
Reference in a new issue