context("checkR6")

test_that("checkR6", {
  skip_if_not_physically_installed("R6")

  expect_false(testR6(1))
  expect_true("R6" %in% loadedNamespaces())

  x = R6::R6Class("Bar",
    public = list(a = 5),
    private = list(b = 42),
    active = list(c = function() 99)
    )$new()

  y = list(a = 5, b = 42)
  class(y) = "Bar"

  z = R6::R6Class("Bar", cloneable = FALSE)$new()

  expect_succ_all(R6, x)
  expect_fail_all(R6, y)

  expect_true(checkR6(NULL, null.ok = TRUE))
  expect_true(checkR6(x, "Bar", ordered = TRUE))
  expect_true(checkR6(x, cloneable = TRUE))
  expect_true(checkR6(z, cloneable = FALSE))
  expect_true(checkR6(x, public = character(0)))
  expect_true(checkR6(x, public = "a"))
  expect_true(checkR6(x, public = "c"))
  expect_true(checkR6(x, private = "b"))
  expect_true(checkR6(x, private = character(0)))

  expect_error(assertR6(NULL, null.ok = FALSE), "NULL")
  expect_error(assertR6(x, cloneable = FALSE), "cloneable")
  expect_error(assertR6(z, cloneable = TRUE), "cloneable")
  expect_error(assertR6(x, public = "b"), "public")
  expect_error(assertR6(x, private = "a"), "private")
  expect_error(assertR6(x, private = "c"), "private")
})

test_that("check contents of empty private", {
  skip_if_not_physically_installed("R6")

  x = R6::R6Class("Bar",
    public = list(a = 5),
    active = list(c = function() 99)
    )$new()

  expect_false(testR6(x, private = "b"))
  expect_true(testR6(x, private = character(0)))
})
