tag_df <- function(tag, start, end, argend = NULL) {
  df <- data.frame(
    stringsAsFactors = FALSE,
    tag = tag, start = start, end = end
  )
  if (!is.null(argend)) df$argend <- argend
  df
}

test_that("find_all_tag_names", {

  text <- "blah blah \\mytag blah blah"
  expect_equal(
    find_all_tag_names(text),
    tag_df("\\mytag", 11, 16)
  )
})

test_that("find_all_rd_tags", {

  cases <- list(
    ## No tags
    list("", character(), numeric(), numeric(), numeric()),
    list("nothing to see here",
         character(), numeric(), numeric(), numeric()),
    list("\nstill\nnothing\n",
         character(), numeric(), numeric(), numeric()),

    ## One tag
    list("blah blah \\mytag blah blah", "\\mytag", 11, 16, 16),
    list("blah blah \\mytag{arg1} blah blah",
         "\\mytag", 11, 16, 22),
    list("blah blah \\mytag{arg1}{arg2} blah blah",
         "\\mytag", 11, 16, 28),
    list("blah\\mytag", "\\mytag", 5, 10, 10),
    list("blah \\mytag", "\\mytag", 6, 11, 11),
    list("blah\\mytag{arg}", "\\mytag", 5, 10, 15),
    list("\\mytag hoohoo", "\\mytag", 1, 6, 6),
    list("\\mytag", "\\mytag", 1, 6, 6),
    list("\\mytag{arg}", "\\mytag", 1, 6, 11),
    list("blah \\mytag\nblah blah", "\\mytag", 6, 11, 11),

    ## Multiple tags
    list("blah \\tag1 \\tag2{arg} blah", c("\\tag1", "\\tag2"),
         c(6, 12), c(10, 16), c(10, 21)),
    list("blah \\tag1{ \\tag2{arg} } blah", c("\\tag1", "\\tag2"),
         c(6, 13), c(10, 17), c(24, 22)),
    list("blah \\tag1{\n\\tag2{arg}\n} blah", c("\\tag1", "\\tag2"),
         c(6, 13), c(10, 17), c(24, 22))
  )

  for (case in cases) {
    expect_equal(
      find_all_rd_tags(case[[1]]),
      do.call(tag_df, case[-1]),
      info = case[[1]]
    )
  }

})

test_that("find_fragile_rd_tags", {

  fragile <- c("\\frag", "\\frag1", "\\frag2")

  cases <- list(
    list("This is \\frag{here}, \\this{arg} not", "\\frag"),
    list("Embedded \\frag{ into \\frag1{arg} plus }", "\\frag"),
    list(
      "blah \\cmd{ \\frag{arg} \\frag{arg} } \\frag2 blah",
      c("\\frag", "\\frag", "\\frag2")
    )
  )

  for (case in cases) {
    expect_equal(
      find_fragile_rd_tags(case[[1]], fragile)$tag,
      case[[2]],
      info = case[[1]]
    )
  }

})


test_that("str_sub_same", {

  expect_equal(
    str_sub_same(
      "123456789ab",
      data.frame(start = c(1,6), end = c(2,10), argend = c(2,10)),
      "xxx"
    ),
    "xxx-1-345xxx-2-b"
  )

  expect_equal(
    str_sub_same(
      "123456789ab",
      data.frame(start = c(1,8), end = c(7,10), argend = c(7,10)),
      "xxx"
    ),
    "xxx-1-xxx-2-b"
  )

  expect_equal(
    str_sub_same(
      "123456789ab",
      data.frame(start = numeric(), end = numeric(),
                 argend = numeric()),
      "xxx"
    ),
    "123456789ab"
  )

})
