Single Source Integration Test Tutorial¶
In this tutorial I will demonstrate how to use single source to create an integration test from a tutorial.
Write how to use your new feature.¶
I want to add the feature to the single source code base that creates integration tests from the source code. To use this feature create a simple markdown document with the single source preprocessor flags. We will create a really simple to start.
Create what you think the API should look like as code.¶
The content of what's in the rust
blocks is not really important here. It could be any program.
The important part is the \#S:
flags.
This is how you tell single source what to do.
You can render this page using:
single_source md docs/tutorial.md docs/tutorial_rendered.md
Here we are saying set the mode to test
and include the blocks that come after this point.
#S:MODE=test,INCLUDE
Here we are hiding just the following block from the rendered md.
#S:HIDE
use std::process::Command; use assert_cmd::prelude::*; use tempdir::TempDir;
#[test] fn ss_integration() -> Result<(), Box<dyn std::error::Error>> { let mut cmd = Command::cargo_bin("single_source")?; let tmp_dir = TempDir::new("tmp")?; let manifest_dir = env!("CARGO_MANIFEST_DIR"); let sample_test = format!("{}/{}", manifest_dir, "docs/sample_test.md"); Command::new("cargo") .args(&["new", "doubler", "--lib"]) .current_dir(tmp_dir.path()) .output()?; cmd.args(&["code", &sample_test, "src/lib.rs", "rust", "code"]) .current_dir(tmp_dir.path().join("doubler")); cmd.assert() .success();
let mut cmd = Command::cargo_bin("single_source")?; cmd.args(&["code", &sample_test, "src/lib.rs", "rust", "test"]) .current_dir(tmp_dir.path().join("doubler")); cmd.assert() .success(); Command::new("cargo") .args(&["test"]) .current_dir(tmp_dir.path().join("doubler")) .output()?; Ok(()) }
Generate the tests.¶
Now generate this test by calling single_source on this file:
This says we want to generate the code from the docs/tutorial.md
and put it into the tests/integration.rs
file.
We also just want the blocks marked rust
and set to MODE=test
.
single_source code docs_src/tutorial.md tests/integration.rs rust test cargo test
Make the test pass.¶
Now you will want to make you're code pass these tests and feedback into the documentation any changes.