library(testit)
op = options(digits = 3, scipen = 0, knitr.digits.signif = TRUE)
assert('format_sci() uses correct number of significant digits', {
(format_sci(1) %==% '1')
(format_sci(0) %==% '0')
(format_sci(3.1415e2) %==% '314')
(format_sci(3.1415) %==% '3.14')
})
options(op)
op = options(digits = 14, scipen = 0, knitr.digits.signif = TRUE)
assert('format_sci() prints numerics at maximum number of significant digits', {
(format_sci(3.14159265358979) %==% '3.1415926535898')
})
options(op)
op = options(digits = 4, scipen = 0)
assert('format_sci() turns numbers into scientific notations', {
(format_sci(c(1.84e8, 1e5, 2.34e3)) %==% c('1.84\\times 10^{8}', '10^{5}', '2340'))
(format_sci(1.23456789 * 10^-5) %==% '1.2346\\times 10^{-5}')
(format_sci(10^-5) %==% '10^{-5}')
(format_sci(10^5) %==% '10^{5}')
(format_sci(-10^-5) %==% '-10^{-5}')
(format_sci(-10^5) %==% '-10^{5}')
(format_sci(9.87654e6, 'html') %==% '9.8765 × 106')
(format_sci(9.87654e6, 'rst') %==% '9.8765 |times| 10 :sup:`6`')
(format_sci(letters) %==% letters)
(format_sci(NA_real_) %==% NA_character_)
})
assert('format_sci() coerces non-numeric and non-double values to characters', {
(format_sci(Sys.Date()) == as.character(Sys.Date()))
(format_sci(1000000L) == '1000000')
})
# https://github.com/yihui/knitr/issues/1625
assert('format_sci() does not convert roman numerals to arabic numerals', {
format_sci(as.roman(c(1, 4, 7, 33, 100))) %==% c('I', 'IV', 'VII', 'XXXIII', 'C')
})
assert('format_sci() for Rnw does not add \\ensuremath{} at all', {
(!grepl('[\\]ensuremath', format_sci(c(1e4, 1.2345e10, 2 * pnorm(-(3:4)), -Inf))))
})
assert('the inline hook for Rnw applies \\ensuremath{} correctly', {
(.inline.hook.tex(1e4) == '\\ensuremath{10^{4}}')
(.inline.hook.tex(-Inf) == '\\ensuremath{-\\infty{}}')
(.inline.hook.tex(-1.23) == '-1.23')
(.inline.hook.tex(c(1.2345e10, 2 * pnorm(-(3:4)))) ==
"\\ensuremath{1.2345\\times 10^{10}}, 0.0027, \\ensuremath{6.3342\\times 10^{-5}}")
})
assert('Infinity and NaN are formatted correctly', {
(format_sci(-Inf) %==% '-\\infty{}')
(format_sci(-Inf, 'html') %==% '-∞')
(format_sci(-Inf, 'rst') %==% '-Inf')
(format_sci(NaN) %==% 'NaN')
})
assert('sanitize_fn() warns against spaces in filenames', {
(has_warning(sanitize_fn('figure/a b')))
})
options(op)
assert('fig_path() sanitizes paths', {
(sanitize_fn('fig/foo') %==% 'fig/foo')
(sanitize_fn('figure/a b c', FALSE) %==% 'figure/a_b__c')
(sanitize_fn('fig space/a.b') %==% 'fig_space/a.b')
(sanitize_fn('../c.d') %==% '../c.d')
(sanitize_fn('./../c..d') %==% './../c..d')
(sanitize_fn('C:/foo/bar') %==% 'C:/foo/bar')
})
assert('fig_chunk() generates figure filenames for a code chunk', {
(fig_chunk('foo') %==% 'figure/foo-1')
(fig_chunk('foo', 'pdf') %==% 'figure/foo-1.pdf')
(fig_chunk('foo', 'png', 2) %==% 'figure/foo-2.png')
(fig_chunk('foo', 'svg', 1:5) %==% sprintf('figure/foo-%d.svg', 1:5))
(fig_chunk('foo', fig.path = 'my_figure/') %==% 'my_figure/foo-1')
(fig_chunk('foo', '.pdf') %==%'figure/foo-1.pdf')
})
assert('all_figs() generates all figure paths for a code chunk', {
opts = list(fig.path = 'abc/', label = 'foo', fig.num = 3)
(all_figs(opts, '.svg') %==% sprintf('abc/foo-%d.svg', 1:3))
(all_figs(opts, c('png', 'pdf')) %==% apply(
expand.grid(1:3, c('.png', '.pdf')), 1, function(x) {
paste0(c('abc/foo-', x), collapse = '')
}
))
})
assert('escape_latex() escapes special LaTeX characters', {
(escape_latex('# $ % & ~ _ ^ \\ { }') %==%
'\\# \\$ \\% \\& \\textasciitilde{} \\_ \\textasciicircum{} \\textbackslash{} \\{ \\}'
)
(escape_latex('a b', spaces = TRUE) %==% 'a b')
(escape_latex('a b', spaces = TRUE) %==% 'a \\ \\ b')
})
assert('indent_block() works when the first element is empty (#790)', {
(indent_block(c('', 'a')) %==% c(' ', ' a'))
(indent_block(c('', '')) %==% c(' ', ' '))
})
assert('current_input() returns NULL by default', {
(is.null(current_input()))
(suppressWarnings(is.null(current_input(TRUE))))
})
assert('color_def() generates LaTeX code to define a color variable', {
(color_def(NA) %==% '')
(color_def('red') %==% '\\definecolor{shadecolor}{rgb}{1, 0, 0}')
(color_def('#00ff00') %==% '\\definecolor{shadecolor}{rgb}{0, 1, 0}')
(color_def('.5,.6,.7', 'fgcolor') %==% '\\definecolor{fgcolor}{rgb}{.5, .6, .7}')
})
cw = function(...) unclass(combine_words(...))
assert('combine_words() combines multiple words into a single string', {
(cw(NULL) %==% NULL)
(cw(c('a')) %==% 'a')
(cw(c('a', 'b')) %==% 'a and b')
(cw(c('a', 'b'), and = "") %==% 'a, b')
(cw(c('a', 'b', 'c')) %==% 'a, b, and c')
(cw(c('a', 'b', 'c'), and = '') %==% 'a, b, c')
(cw(c('a', 'b', 'c'), ' / ', '') %==% 'a / b / c')
(cw(c('a', 'b', 'c'), before = '"') %==% '"a", "b", and "c"')
(cw(c('a', 'b', 'c'), before = '``', after = "''") %==% "``a'', ``b'', and ``c''")
(cw(c('a', 'b', 'c'), before = '``', after = "''", oxford_comma = FALSE) %==% "``a'', ``b'' and ``c''")
})
rm(list = 'cw')
opts = list(
fig.cap = 'Figure "caption" <>.', fig.lp = 'Fig:', label = 'foo'
)
assert('.img.cap() generates the figure caption and alt attribute', {
(.img.cap(list(fig.cap = NULL), FALSE) %==% "")
(.img.cap(opts, FALSE) %==% opts$fig.cap)
(.img.cap(opts, TRUE, TRUE) %==% 'Figure "caption" <>.')
opts$fig.alt = 'Figure "alternative text" <>.'
(.img.cap(opts, TRUE, TRUE) %==% 'Figure "alternative text" <>.')
(.img.cap(opts, FALSE) %==% opts$fig.cap)
(.img.cap(list(fig.cap = '', fig.alt = "alt"), FALSE) %==% "")
(.img.cap(list(fig.cap = '', fig.alt = "alt"), TRUE) %==% "alt")
})
z = as.strict_list(list(a = 1, aa = 2, bbb = 3))
assert('as.strict_list() does not allow partial matching', {
(z$b %==% NULL)
(z$bbb %==% 3)
})
out = c('*hello*', raw_output('content *protect* me!'), '*world*')
pre = extract_raw_output(out)
pre$value = gsub('[*]([^*]+)[*]', '\\1', pre$value) # think this as Pandoc conversion
# raw output was protected from the conversion (e.g. *protect* was not converted)
assert('restore_raw_output() restores raw output', {
(restore_raw_output(pre$value, pre$chunks) %==%
'hello\ncontent *protect* me!\nworld')
})
assert('raw_block() returns a raw attribute block for Pandoc', {
(raw_latex('\\emph{x}') == '\n```{=latex}\n\\emph{x}\n```\n')
(raw_html('foo') == '\n```{=html}\nfoo\n```\n')
})
assert('block_class() turns a character vector into Pandoc attributes for code block classes', {
(block_class(NULL) %==% NULL)
(block_class('a') %==% '.a')
(block_class('a b') %==% c('.a', '.b'))
(block_class(c('a', 'b')) %==% c('.a', '.b'))
})
assert('block_attr(x) turns a character vector into Pandoc attributes', {
(block_attr(NULL) %==% NULL)
(block_attr(NULL, lang = 'r') %==% 'r')
(block_attr('.a') %==% '{.a}')
(block_attr('.a b="11"') %==% '{.a b="11"}')
(block_attr(c('.a', 'b="11"')) %==% '{.a b="11"}')
})
assert('when collapse is TRUE, class.* and attr.* become NULL except for class.source and attr.source', {
keys = unlist(lapply(
c('class.', 'attr.'), paste0, c('source', 'output', 'message', 'warning', 'error')
))
keys_source = c('class.source', 'attr.source')
opts = fix_options(opts_chunk$merge(c(setNames(as.list(keys), keys), list(collapse = TRUE))))
(opts[keys_source] %==% as.list(setNames(keys_source, keys_source)))
(!any(names(opts) %in% setdiff(keys, keys_source)))
rm(keys, keys_source, opts)
})
assert('default strip.white is conditional to collapse', {
opts = opts_chunk$get(default = TRUE)
(fix_options(opts)$strip.white %==% TRUE)
opts$collapse = TRUE
(fix_options(opts)$strip.white %==% FALSE)
opts$strip.white = TRUE
(fix_options(opts)$strip.white %==% TRUE)
rm(opts)
})
assert('pandoc_to gets the current Pandoc format', {
opts = opts_knit$get(c('rmarkdown.pandoc.to', 'rmarkdown.pandoc.from'))
opts_knit$delete(c("rmarkdown.pandoc.from", "rmarkdown.pandoc.to"))
(pandoc_from() %==% 'markdown')
(pandoc_to() %==% NULL)
opts_knit$set(rmarkdown.pandoc.from = 'gfm', rmarkdown.pandoc.to = 'docx')
(pandoc_from() %==% 'gfm')
(pandoc_to() %==% 'docx')
(pandoc_to('docx'))
(!pandoc_to('pptx'))
(pandoc_to(c('docx', 'pptx')))
opts_knit$set(opts)
})
assert('comment_out() add prefix and newlines if asked', {
(comment_out("a") %==% "## a\n")
(comment_out("ab cd") %==% "## ab cd\n")
(comment_out("ab cd\n") %==% "## ab cd\n")
(comment_out("") %==% "## \n")
(comment_out("\n") %==% "## \n")
(comment_out(c("a", "b")) %==% c("## a\n", "## b\n"))
(comment_out(c("a", "b"), which = 2) %==% c("a\n", "## b\n"))
(comment_out("a", newline = FALSE) %==% "## a")
(comment_out("a", prefix = "$") %==% "$ a\n")
(comment_out("a", prefix = NULL) %==% "a\n")
})
assert('remove_urls() removes the link', {
(remove_urls(c('[a](b)', '[a b](c)')) %==% c('a', 'a b'))
(remove_urls('a [b](c) d.') %==% 'a b d.')
(remove_urls('a [b](c) d [e f+g](h) i.') %==% 'a b d e f+g i.')
(remove_urls('a [b](c) `[d](e)` f.') %==% 'a b `[d](e)` f.')
})
assert('options using `-` are converted to `.` and default value replaced', {
opts = opts_chunk$merge(list('fig-cap' = 'caption', 'out-width' = 300))
(is.null(dot_names(opts)[['fig-cap']]))
(is.null(dot_names(opts)[['out-width']]))
(dot_names(opts)[['fig.cap']] %==% 'caption')
(dot_names(opts)[['out.width']] %==% 300)
rm(opts)
})
assert('fig.format and fig.dpi', {
opts = opts_chunk$merge(list('fig-format' = 'svg', 'fig-dpi' = 750))
(is.null(dot_names(opts)[['fig-format']]))
(is.null(dot_names(opts)[['fig-dpi']]))
(dot_names(opts)[['dev']] %==% 'svg')
(dot_names(opts)[['dpi']] %==% 750)
rm(opts)
})
assert('options using `.` are converted to `-` and default value replaced', {
opts = opts_chunk$merge(list('fig.cap' = 'caption', 'out.width' = 300))
(is.null(dash_names(opts)[['fig.cap']]))
(is.null(dash_names(opts)[['out.width']]))
(dash_names(opts)[['fig-cap']] %==% 'caption')
(dash_names(opts)[['out-width']] %==% 300)
rm(opts)
})
assert('dev and dpi are convert to fig-format and fig-dpi', {
opts = opts_chunk$merge(list('dev' = 'svg', 'dpi' = 750))
(is.null(dash_names(opts)[['dev']]))
(is.null(dash_names(opts)[['dpi']]))
(dash_names(opts)[['fig-format']] %==% 'svg')
(dash_names(opts)[['fig-dpi']] %==% 750)
rm(opts)
})