test_that("it returns markers which match lints", {
  skip_if_not_installed("mockery")

  mockery::stub(rstudio_source_markers, "rstudioapi::callFun", function(...) list(...))
  mockery::stub(rstudio_source_markers, "rstudioapi::executeCommand", function(...) NULL)

  lint1 <- list(Lint(
    filename = "test_file",
    line_number = 1L,
    column_number = 2L,
    type = "error",
    line = "a line",
    message = "hi"
  ))
  class(lint1) <- "lints"
  lint1[[1L]]$linter <- "linter_name"

  marker1 <- rstudio_source_markers(lint1)
  expect_identical(marker1$name, "lintr")
  expect_identical(marker1$markers[[1L]]$type, lint1[[1L]]$type)
  expect_identical(marker1$markers[[1L]]$file, lint1[[1L]]$filename)
  expect_identical(marker1$markers[[1L]]$line, lint1[[1L]]$line_number)
  expect_identical(marker1$markers[[1L]]$column, lint1[[1L]]$column_number)
  expect_identical(marker1$markers[[1L]]$message, paste0("[", lint1[[1L]]$linter, "] ", lint1[[1L]]$message))

  lint2 <- list(
    Lint(
      filename = "test_file",
      line_number = 1L,
      column_number = 2L,
      type = "error",
      line = "a line",
      message = "hi"
    ),
    Lint(
      filename = "test_file2",
      line_number = 10L,
      column_number = 1L,
      type = "warning",
      message = "test a message"
    )
  )
  class(lint2) <- "lints"
  lint2[[1L]]$linter <- "linter_name"
  lint2[[2L]]$linter <- "linter_name"
  marker2 <- rstudio_source_markers(lint2)
  expect_identical(marker2$name, "lintr")
  expect_identical(marker2$markers[[1L]]$type, lint2[[1L]]$type)
  expect_identical(marker2$markers[[1L]]$file, lint2[[1L]]$filename)
  expect_identical(marker2$markers[[1L]]$line, lint2[[1L]]$line_number)
  expect_identical(marker2$markers[[1L]]$column, lint2[[1L]]$column_number)
  expect_identical(marker2$markers[[1L]]$message, paste0("[", lint2[[1L]]$linter, "] ", lint2[[1L]]$message))
})

test_that("it prepends the package path if it exists", {
  skip_if_not_installed("mockery")

  mockery::stub(rstudio_source_markers, "rstudioapi::callFun", function(...) list(...))
  mockery::stub(rstudio_source_markers, "rstudioapi::executeCommand", function(...) NULL)

  lint3 <- list(Lint(
    filename = "test_file",
    line_number = 1L,
    column_number = 2L,
    type = "error",
    line = "a line",
    message = "hi"
  ))
  class(lint3) <- "lints"
  attr(lint3, "path") <- "test"
  lint3[[1L]]$linter <- "linter_name"
  marker3 <- rstudio_source_markers(lint3)
  expect_identical(marker3$name, "lintr")
  expect_identical(marker3$basePath, "test")
  expect_identical(marker3$markers[[1L]]$type, lint3[[1L]]$type)
  expect_identical(marker3$markers[[1L]]$file, file.path("test", lint3[[1L]]$filename))
  expect_identical(marker3$markers[[1L]]$line, lint3[[1L]]$line_number)
  expect_identical(marker3$markers[[1L]]$column, lint3[[1L]]$column_number)
  expect_identical(marker3$markers[[1L]]$message, paste0("[", lint3[[1L]]$linter, "] ", lint3[[1L]]$message))
})

test_that("it returns an empty list of markers if there are no lints", {
  skip_if_not_installed("mockery")

  mockery::stub(rstudio_source_markers, "rstudioapi::callFun", function(...) list(...))
  mockery::stub(rstudio_source_markers, "rstudioapi::executeCommand", function(...) NULL)

  lint4 <- `class<-`(list(), "lints")
  marker4 <- rstudio_source_markers(lint4)
  expect_identical(marker4$name, "lintr")
  expect_identical(marker4$markers, list())
})

test_that("rstudio_source_markers apply to print within rstudio", {
  skip_if_not_installed("mockery")

  withr::local_options(lintr.rstudio_source_markers = TRUE)

  tmp <- withr::local_tempfile(lines = "1:ncol(x)")
  empty <- withr::local_tempfile(lines = character(0L))

  mockery::stub(print.lints, "rstudioapi::hasFun", function(x, ...) TRUE)
  mockery::stub(print.lints, "rstudio_source_markers", function(x) cat("matched\n"))

  l <- lint(tmp, seq_linter())
  expect_output(print(l), "matched", fixed = TRUE)

  l <- lint(empty, seq_linter())
  expect_output(print(l), "matched", fixed = TRUE)
})
