library(testit) render_jekyll('prettify') options(prompt = '> ', continue = '+ ') # see http://stackoverflow.com/q/18992260/559676 for the bug assert('the source hook pastes source code into one character string', { (knit_hooks$get('source')(c('1+1', '2-2'), opts_chunk$get()) %==% "\n\n
1+1\n2-2
\n\n") (knit_hooks$get('source')(c('1+1+\n1', '2-2'), opts_chunk$merge(list(prompt = TRUE))) %==% "\n\n
> 1+1+\n+ 1\n> 2-2
\n\n") }) render_markdown() img_output = function(path, opts = list()) { opts = opts_chunk$merge(opts) sew(knit_print(include_graphics(path, error = FALSE)), opts) } assert('include_graphics() includes custom images correctly', { (img_output('a.png') %==% '![](a.png)') (img_output(c('a.png', 'b.png'), list(fig.show = 'hold')) %==% '![](a.png)![](b.png)') (img_output('a.png', list(fig.cap = 'foo bar')) %==% '![foo bar](a.png)') (img_output('a.png', list(out.width = '50%')) %==% '') (img_output('a.pdf', list(out.width = '300px')) %==% '') }) hook_src = knit_hooks$get("source") options_ = list(engine = "r", prompt = FALSE, highlight = TRUE) assert('Length of fences are satisfied', { (hook_src("", options_) %==% "\n\n```r\n\n```\n\n") (hook_src("```", options_) %==% "\n\n````r\n```\n````\n\n") }) assert('Attributes for source can be specified class.source and attr.source', { (hook_src("1", c(options_, class.source = "a b")) %==% "\n\n```{.r .a .b}\n1\n```\n\n") (hook_src("1", c(options_, attr.source = ".a .b")) %==% "\n\n```{.r .a .b}\n1\n```\n\n") (hook_src("1", c(options_, class.source = "a", attr.source = "b='1'")) %==% "\n\n```{.r .a b='1'}\n1\n```\n\n") (hook_src("1", c(options_, attr.source = ".a b='1'")) %==% "\n\n```{.r .a b='1'}\n1\n```\n\n") }) assert('class.source and attr.source works also with collapse = TRUE', { hook_chunk = hooks_markdown()$chunk (hook_chunk("```{.r .a b=1}\n1\n```", c(options_, collapse = TRUE)) %==% "```{.r .a b=1}\n1\n```") (hook_chunk("```{.r .a b=1}\n1\n```\n```{.r .a b=1}\n1\n```", c(options_, collapse = TRUE)) %==% "```{.r .a b=1}\n1\n1\n```") }) hook_out = knit_hooks$get("output") assert('Attributes for source can be specified class.source and attr.source', { (hook_out("1\n", c(options_, class.output = "a b")) %==% "\n\n```{.a .b}\n1\n```\n\n") (hook_out("1\n", c(options_, attr.output = ".a .b")) %==% "\n\n```{.a .b}\n1\n```\n\n") (hook_out("1\n", c(options_, class.output = "a", attr.output = "b='1'")) %==% "\n\n```{.a b='1'}\n1\n```\n\n") (hook_out("1\n", c(options_, attr.output = ".a b='1'")) %==% "\n\n```{.a b='1'}\n1\n```\n\n") }) hook_chunk = knit_hooks$get("chunk") assert('Chunks are enclosed by fenced divs when needed.', { (hook_chunk('', list(class.chunk=NULL)) %==% '') (hook_chunk('', list(class.chunk="")) %==% '::: \n\n:::') (hook_chunk('', list(class.chunk="foo")) %==% '::: foo\n\n:::') (hook_chunk(':::', list(class.chunk="foo")) %==% ':::: foo\n:::\n::::') }) knit_hooks$restore() x = "1.png" w = h = 1 ex = "style='margin: 0;'" cap = "foo" opt = function( w = NULL, h = NULL, ex = NULL, cap = NULL, show = 'asis', fig.align = 'default', ... ) { list( out.width = w, out.height = h, out.extra = ex, fig.cap = cap, fig.show = show, fig.align = fig.align, ... ) } assert("Include a plot by pandoc md", { (hook_plot_md_pandoc(x, opt()) %==% "![](1.png)") (hook_plot_md_pandoc(x, opt(w = w)) %==% sprintf("![](1.png){width=%s}", w)) (hook_plot_md_pandoc(x, opt(h = h)) %==% sprintf("![](1.png){height=%s}", h)) (hook_plot_md_pandoc(x, opt(cap = cap)) %==% sprintf("![%s](1.png)", cap)) (hook_plot_md_pandoc(x, opt(ex = ex)) %==% sprintf("![](1.png){%s}", ex)) (hook_plot_md_pandoc(x, opt(w = w, cap = cap, ex = ex)) %==% sprintf("![%s](1.png){width=%s %s}", cap, w, ex)) }) assert("fig.alt does not break office document", { old = opts_knit$get('rmarkdown.pandoc.to') opts_knit$set(rmarkdown.pandoc.to = "docx") (suppressWarnings(hook_plot_md(x, opt())) %==% "![](1.png)") (suppressWarnings(hook_plot_md(x, opt(fig.alt = "bar"))) %==% "![](1.png)") opts_knit$set('rmarkdown.pandoc.to' = old) })