test_that("print - hardhat_model", {
  expect_snapshot({
    new_model()
    new_model(class = "custom_class")
    new_model(x = 4, y = "hi", class = "custom_class")
  })
})

test_that("can create new empty models", {
  x <- new_model()

  expect_s3_class(x$blueprint, "default_xy_blueprint")
  expect_s3_class(x, "hardhat_model")
  expect_s3_class(x, "hardhat_scalar")
})

test_that("can create new models", {
  x <- new_model(class = "custom")

  expect_s3_class(x, "custom")
  expect_s3_class(x$blueprint, "default_xy_blueprint")
})

test_that("can have custom elements", {
  x <- new_model(
    y = 1,
    blueprint = default_xy_blueprint(),
    class = "custom_class"
  )

  expect_equal(x$y, 1)
})

test_that("must use a valid blueprint", {
  expect_error(
    new_model(blueprint = default_xy_blueprint(), class = "custom"),
    NA
  )

  expect_error(
    new_model(blueprint = 1, class = "custom"),
    "not a numeric"
  )
})

test_that("`new_scalar()` must have elements", {
  expect_error(new_scalar(list()), "must be a list of length 1 or greater")
})

test_that("`new_scalar()` must have unique names", {
  expect_error(new_scalar(list(x = 1, x = 2)), "must have unique names")
})

test_that("`new_scalar()` must have no extra attributes", {
  x <- list(x = 1)
  attr(x, "extra") <- 1
  expect_error(new_scalar(x), "must have no attributes")
})
