library(testit)
assert(
'parse_params() parses chunk options to a list',
identical(parse_params('a-s-d,b=TRUE,c=def'), alist(label = 'a-s-d', b = TRUE, c = def)),
has_error(parse_params('a,b')),
has_error(parse_params('a,b,c=qwer')),
identical(parse_params('a,opt=c(1,3,5)'), alist(label = 'a', opt = c(1, 3, 5))),
identical(parse_params('label="xx",opt=zz'), alist(label = 'xx', opt = zz)),
identical(parse_params('label=foo'), alist(label = 'foo')),
identical(parse_params('a,b=2,c="qwer",asdf="efg"'),
alist(label = 'a', b = 2, c = 'qwer', asdf = 'efg')),
identical(parse_params('2a'), alist(label = '2a')),
identical(parse_params('abc-function,fig.path="foo/bar-"'),
alist(label = 'abc-function', fig.path = "foo/bar-"))
)
opts_knit$set(out.format = 'markdown')
assert(
'parse_params() parses the language engine from ```{lang}',
identical(
parse_block(NULL, '', 'r, foo, a=1,')$params,
alist(label = 'foo', a = 1)
),
identical(
parse_block(NULL, '', 'Rcpp, foo, a=1,')$params,
alist(label = 'foo', a = 1, engine = 'Rcpp')
)
)
res = split_file(
c('abc', '```{r foo}', '1+1', '```{r bar}', '2+2', '```', 'def'),
patterns = all_patterns$md
)
assert(
'split_file() treats ``` as part of code chunk instead of beginning of text chunk',
# the foo chunk does not have a closing mark
knit_code$get('foo') == '1+1',
knit_code$get('bar') == '2+2',
# before knitr v1.6, the text chunk was c('', 'def')
identical(res[[4]][['input']], 'def')
)
opts_knit$restore()
knit_code$restore(); knit_concord$restore()
res = parse_inline(c('aaa \\Sexpr{x}', 'bbb \\Sexpr{NA} and \\Sexpr{1+2}',
'another expression \\Sexpr{rnorm(10)}'), all_patterns$rnw)
assert(
'parse_inline() parses inline text',
identical(res$code, c('x', 'NA', '1+2', 'rnorm(10)')),
identical(nchar(res$input), 81L),
# empty inline code is not recognized
identical(parse_inline('\\Sexpr{}', all_patterns$rnw)$code, character(0)),
# can use > in HTML inline code
identical(parse_inline('', all_patterns$html)$code, ' "" ')
)
res = parse_inline('inline expressions `r pi+1`, +r cos(0)+ in AsciiDoc',
all_patterns$asciidoc)
assert(
'both `r expression` and +r expression+ work for AsciiDoc',
identical(res$code, c('pi+1', 'cos(0)'))
)
knit_code$restore()
read_chunk(lines = c('1+1'))
assert(
'read_chunk() does not discard code without chunk headers',
identical(knit_code$get(), list('unnamed-chunk-1' = '1+1'))
)
knit_code$restore()
read_chunk(lines = c('# ---- foo ----', '1+1'))
assert(
'read_chunk() can identify chunk labels',
identical(knit_code$get(), list(foo = '1+1'))
)
knit_code$restore()
# chunk references with <<>> --------------------------------------------------
knit_code$restore(list(
a = '1+1', b = '2-2', c = c('if (T)', ' <>'), d = c('function() {', ' <>', '}')
))
pc = function(x) parse_chunk(x, all_patterns$rnw$ref.chunk)
assert(
'parse_chunk() preserves indentation',
identical(pc(c('3*3', '<>', ' <>', 'if (T)', ' <>')),
c("3*3", "1+1", " 2-2", "if (T)", " 1+1" )),
identical(pc('<>'), c('function() {', ' if (T)', ' 1+1', '}'))
)
knit_code$restore()
# duplication of labels
knit_code$restore(list(a = '1+1'))
assert(
!has_error(parse_block(NULL, '', 'label = "a"')),
has_error(parse_block('2+2', '', 'label = "a"')),
has_error(parse_block(NULL, '','label = "a", code = "2+2"')),
has_error(parse_block(NULL, '','label = "a", file = "dummy.R"'))
)
op = options(knitr.duplicate.label = 'allow')
assert(
!has_error(parse_block('2+2', '', 'label = "a"')),
!has_error(parse_block(NULL, '','label = "a", code = "2+2"')),
!has_error(parse_block(NULL, '','label = "a", file = "dummy.R"'))
)
options(op)
knit_code$restore()