test_that("quotes_linter skips allowed usages", {
  linter <- quotes_linter()

  expect_lint("blah", NULL, linter)
  expect_lint('"blah"', NULL, linter)
  expect_lint('"\'blah"', NULL, linter)
  expect_lint('"blah\'"', NULL, linter)
  expect_lint('"\'blah\'"', NULL, linter)
  expect_lint("'\"'", NULL, linter)
  expect_lint("'\"blah\"'", NULL, linter)
})

test_that("quotes_linter blocks disallowed usages", {
  linter <- quotes_linter()
  lint_msg <- rex::rex("Only use double-quotes.")

  expect_lint("'blah'", lint_msg, linter)
  expect_lint("fun('blah')", lint_msg, linter)
  expect_lint("{'blah'}", lint_msg, linter)

  expect_lint(
    "
    x = 'test
    '",
    list(message = lint_msg, ranges = list(c(9L, 13L))),
    linter
  )
})

# NB: repeat of above tests with (mostly) opposite results
test_that("quotes_linter skips allowed usages of delimiter='", {
  linter <- quotes_linter(delimiter = "'")

  expect_lint("blah", NULL, linter)
  expect_lint('"\'blah"', NULL, linter)
  expect_lint('"blah\'"', NULL, linter)
  expect_lint('"\'blah\'"', NULL, linter)
  expect_lint("'\"'", NULL, linter)
  expect_lint("'\"blah\"'", NULL, linter)
  expect_lint("'blah'", NULL, linter)
  expect_lint("fun('blah')", NULL, linter)
  expect_lint("{'blah'}", NULL, linter)
})

test_that("quotes_linter blocks disallowed usages of delimiter='", {
  linter <- quotes_linter(delimiter = "'")
  lint_msg <- rex::rex("Only use single-quotes.")

  expect_lint('"blah"', lint_msg, linter)
  expect_lint(
    '
    x = "test
    "',
    list(message = lint_msg, ranges = list(c(9L, 13L))),
    linter
  )
})

test_that("handles R>=4.0.0 strings", {
  skip_if_not_r_version("4.0.0")
  linter <- quotes_linter()
  expect_lint('R"(hello \'\' there)"', NULL, linter)
  expect_lint("R'( whoops )'", rex::rex("Only use double-quotes."), linter)
  expect_lint("R'---[ daisy ]---'", rex::rex("Only use double-quotes."), linter)
  expect_lint("r'(\")'", NULL, linter)
})

test_that("single_quotes_linter is deprecated", {
  expect_warning(
    {
      old_linter <- single_quotes_linter()
    },
    "Use quotes_linter instead",
    fixed = TRUE
  )
  expect_lint('"blah"', NULL, old_linter)
  expect_lint("'blah'", "Only use double-quotes", old_linter)
})
