
test_that("R files have balanced covr exclusions", {

  renv_scope_wd("../..")

  errors <- stack()

  files <- list.files("R", pattern = "[.][rR]$", full.names = TRUE)
  lapply(files, function(file) {

    nocov <- FALSE
    contents <- catch(readLines(file))
    if (inherits(contents, "error")) {
      caution_bullets(values = "[%s]: %s", file, conditionMessage(contents))
      return()
    }

    for (i in seq_along(contents)) {
      line <- contents[[i]]

      if (grepl("#\\s+nocov\\s+start\\s*$", line)) {
        if (nocov) {
          errors$push(list(file, i, "# nocov start"))
        } else {
          nocov <- TRUE
        }
      }

      if (grepl("#\\s+nocov\\s+end\\s*$", line)) {
        if (nocov) {
          nocov <- FALSE
        } else {
          errors$push(list(file, i, "# nocov end"))
        }
      }

    }

  })

  invalid <- errors$data()
  if (length(invalid)) {
    lines <- map_chr(invalid, function(loc) {
      fmt <- "[%s:%i]: unexpected '%s'"
      sprintf(fmt, loc[[1]], loc[[2]], loc[[3]])
    })
    warning(lines)
  }

  expect_length(invalid, 0L)

})
