aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPhilipp A2019-11-12 22:57:02 +0100
committerPhilipp A2019-11-12 22:57:02 +0100
commit271cb95ec3e12d6f97852491bc723c5060ce4b75 (patch)
tree78cb094fb882fd6c56733ff9e4d1a9377713d393
parent18fba4a71eeebf3a2df91a6bcfda7f13e6c3f561 (diff)
downloadrust-rst-271cb95ec3e12d6f97852491bc723c5060ce4b75.tar.bz2
Run python tests
-rw-r--r--.travis.yml2
-rw-r--r--Cargo.toml4
-rw-r--r--build.rs22
-rw-r--r--build_tests.py27
-rw-r--r--src/bin.rs2
-rw-r--r--src/renderer.rs2
-rw-r--r--src/renderer/html.rs12
-rw-r--r--src/renderer/html_tests.rs15
8 files changed, 82 insertions, 4 deletions
diff --git a/.travis.yml b/.travis.yml
index ec58734..58e9cb1 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,4 +1,4 @@
language: rust
cache: cargo
rust:
- - beta
+ - stable
diff --git a/Cargo.toml b/Cargo.toml
index 6f6799d..845b1fd 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -11,6 +11,7 @@ homepage = 'https://github.com/flying-sheep/rust-rst'
repository = 'https://github.com/flying-sheep/rust-rst.git'
edition = '2018'
+build = 'build.rs'
[lib]
name = 'rst'
@@ -37,3 +38,6 @@ serde-xml-rs = '0.3.1'
quicli = '0.4.0'
structopt = '0.2.15'
clap = '2.32.0'
+
+[dev-dependencies]
+pretty_assertions = '0.6.1'
diff --git a/build.rs b/build.rs
new file mode 100644
index 0000000..88b6214
--- /dev/null
+++ b/build.rs
@@ -0,0 +1,22 @@
+
+use std::env;
+use std::io::{self, Write};
+use std::path::Path;
+use std::process::Command;
+
+fn main() {
+ let manifest_dir = env::var("CARGO_MANIFEST_DIR").unwrap();
+
+ let input = Path::new(&manifest_dir).join("build_tests.py");
+ let output = Path::new(&env::var("OUT_DIR").unwrap()).join("html_tests.rs");
+ println!("cargo:rerun-if-changed={}", input.display());
+
+ let output = Command::new("python3")
+ .arg("build_tests.py")
+ .arg(format!("{}", output.display()))
+ .output()
+ .expect("failed to execute process");
+ io::stdout().write_all(&output.stdout).unwrap();
+ io::stderr().write_all(&output.stderr).unwrap();
+ assert!(output.status.success());
+}
diff --git a/build_tests.py b/build_tests.py
new file mode 100644
index 0000000..3fe4e9a
--- /dev/null
+++ b/build_tests.py
@@ -0,0 +1,27 @@
+import sys
+import json
+from ast import literal_eval
+from urllib.request import urlopen
+
+out = sys.argv[1]
+url_base = 'https://sourceforge.net/p/docutils/code/HEAD/tree/trunk/docutils'
+
+with urlopen(f'{url_base}/test/test_writers/test_html5_polyglot_parts.py?format=raw') as con:
+ code = con.read().decode()
+
+code = code[code.find('totest ='):code.find('if __name__')]
+exec(code)
+with open(out, 'w') as f:
+ t = 0
+ for k, (opts, tests) in totest.items():
+ for rst, result_code in tests:
+ result = literal_eval(result_code)['fragment']
+ rst, result = (r.replace('"', r'\"') for r in (rst, result))
+ f.write(f'''\
+#[test]
+fn test_{t:02}() {{
+ check_renders_to("{rst}", "{result.strip()}");
+}}
+''')
+ t += 1
+
diff --git a/src/bin.rs b/src/bin.rs
index 6916af1..394b416 100644
--- a/src/bin.rs
+++ b/src/bin.rs
@@ -49,7 +49,7 @@ fn main() -> CliResult {
match args.format {
Format::json => render_json(&document, stdout)?,
Format::xml => render_xml (&document, stdout)?,
- Format::html => render_html(&document, stdout)?,
+ Format::html => render_html(&document, stdout, true)?,
}
Ok(())
}
diff --git a/src/renderer.rs b/src/renderer.rs
index fed670b..82a5826 100644
--- a/src/renderer.rs
+++ b/src/renderer.rs
@@ -1,4 +1,6 @@
mod html;
+#[cfg(test)]
+pub mod html_tests;
use std::io::Write;
diff --git a/src/renderer/html.rs b/src/renderer/html.rs
index 56e3175..869444f 100644
--- a/src/renderer/html.rs
+++ b/src/renderer/html.rs
@@ -15,8 +15,16 @@ use crate::document_tree::{
// static FOOTNOTE_SYMBOLS: [char; 10] = ['*', '†', '‡', '§', '¶', '#', '♠', '♥', '♦', '♣'];
-pub fn render_html<W>(document: &Document, mut stream: W) -> Result<(), Error> where W: Write {
- document.render_html(stream.by_ref())
+pub fn render_html<W>(document: &Document, mut stream: W, standalone: bool) -> Result<(), Error> where W: Write {
+ if standalone {
+ document.render_html(stream.by_ref())
+ } else {
+ let stream = stream.by_ref();
+ for c in document.children() {
+ (*c).render_html(stream)?;
+ }
+ Ok(())
+ }
}
trait HTMLRender {
diff --git a/src/renderer/html_tests.rs b/src/renderer/html_tests.rs
new file mode 100644
index 0000000..a91dd80
--- /dev/null
+++ b/src/renderer/html_tests.rs
@@ -0,0 +1,15 @@
+use pretty_assertions::assert_eq;
+
+use crate::parser::parse;
+use super::html::render_html;
+
+fn check_renders_to(rst: &str, expected: &str) {
+ println!("Rendering:\n{}\n---", rst);
+ let doc = parse(rst).expect("Cannot parse");
+ let mut result_data: Vec<u8> = vec![];
+ render_html(&doc, &mut result_data, false).expect("Render error");
+ let result = String::from_utf8(result_data).expect("Could not decode");
+ assert_eq!(result.as_str().trim(), expected);
+}
+
+include!(concat!(env!("OUT_DIR"), "/html_tests.rs"));