# tokenise_block ----------------------------------------------------------

test_that("parses into tag and value", {
  x <- tokenise_block("#' @xyz abc", file = "", offset = 0)
  expect_equal(length(x), 1)

  expect_equal(x[[1]]$tag, "xyz")
  expect_equal(x[[1]]$raw, "abc")
})

test_that("description block gets empty tag", {
  x <- tokenise_block("#' abc", file = "", offset = 0L)
  expect_equal(length(x), 1)

  expect_equal(x[[1]]$tag, "")
  expect_equal(x[[1]]$raw, "abc")
})

test_that("multi line tags collapsed into one", {
  x <- tokenise_block(c(
    "#' @tag abc",
    "#'   def"),
    file = "", offset = 0L)
  expect_equal(length(x), 1)
  expect_equal(x[[1]]$raw, "abc\n  def")
})

test_that("description block gets empty tag when followed by tag", {
  x <- tokenise_block(c(
    "#' abc",
    "#' @xyz abc"),
    file = "", offset = 0L)
  expect_equal(length(x), 2)

  expect_equal(x[[1]]$tag, "")
  expect_equal(x[[1]]$raw, "abc")

  expect_equal(x[[2]]$tag, "xyz")
  expect_equal(x[[2]]$raw, "abc")
})

test_that("leading whitespace is ignored", {
  ref <- tokenise_block("#' abc", file = "", offset = 0L)

  expect_equal(tokenise_block("   #' abc", file = "", offset = 0L), ref)
})

test_that("need one or more #", {
  ref <- tokenise_block("#' abc", file = "", offset = 0L)

  expect_equal(tokenise_block("##' abc", file = "", offset = 0L), ref)
  expect_equal(tokenise_block("###' abc", file = "", offset = 0L), ref)
})

test_that("@@ becomes @", {
  expect_equal(tokenise_block("#' @tag @@", file = "", offset = 0L)[[1]]$raw, "@")
})

# Inline comments ---------------------------------------------------------

test_that("Inline comments are supported", {
  out <- roc_proc_text(rd_roclet(), "
    #' Description
    a <- function(x) {
      #' @param x an integer
      stopifnot(is.integer(x))
    }")[[1]]
  expect_equal(out$get_value("param"), c(x = "an integer"))
})

test_that("Inline comments just before the closing brace are allowed", {
  out <- roc_proc_text(rd_roclet(), "
    #' Description
    a <- function(x) {
      #' @param x an integer
      stopifnot(is.integer(x))

      #' @seealso somewhere
    }")[[1]]
  expect_equal(out$get_value("seealso"), "somewhere")
})

test_that("Inline comments do not extend past the closing brace", {
  out <- roc_proc_text(rd_roclet(), "
    #' Description
    a <- function(x) {
      #' @param x an integer
      stopifnot(is.integer(x))
    }; #' @seealso somewhere")[[1]]
  expect_null(out$get_value("seealso"))
})

test_that("Line numbers are ok", {

  check_line_nums <- function(block, lines) {
    for (t in names(lines)) {
      expect_equal(block_get_tag(block, t)$line, lines[[t]], info = t)
    }
  }

  text <-
    "#' @title
     #' Foo
     #'
     #' @description
     #' Description
     #'
     #' @details
     #' Details
     #'
     #' @param x xyz
     #' @export
     NULL"
  block <- parse_text(text)[[1]]
  ls <- c(title = 1, description = 4, details = 7, param = 10, export = 11)
  check_line_nums(block, ls)

  text <-
    "#' @title Foo
     #'
     #' @description Description
     #'
     #' @details Details
     #'
     #' @param x xy
     #' z
     #'
     #' @export
     NULL"
  block <- parse_text(text)[[1]]
  ls <- c(title = 1, description = 3, details = 5, param = 7, export = 10)
  check_line_nums(block, ls)

  text <-
    "#' @title Foo
     #'
     #' @description Description
     #'
     #' @details Details
     # not - a - roxy - comment
     #' @param x xy
     #' z
     quote(neither - is -
     #' @export
     this)"
  block <- parse_text(text)[[1]]
  ls <- c(title = 1, description = 3, details = 5, param = 7, export = 10)
  check_line_nums(block, ls)

  text <-
    "# 1
     # 2
     #' foo
     #'
     #' Description
     # 6
     # 7
     #' @param x xyz
     NULL"
  block <- parse_text(text)[[1]]
  ls <- c(title = 3, description = 5, param = 8)
  check_line_nums(block, ls)
})
