test_that("assert_intervaltime_single", {
  expect_equal(
    assert_intervaltime_single(interval = c(1, 2)),
    c(1, 2)
  )
  expect_equal(
    assert_intervaltime_single(start = 1, end = 2),
    c(1, 2)
  )
  expect_equal(
    assert_intervaltime_single(interval = c(1, 2), start = 1, end = 2),
    c(1, 2)
  )
  expect_error(
    assert_intervaltime_single(interval = c(1, 2), start = 1.1, end = 2),
    regexp = "`start` must be the same as the first value in the interval if both are given: 1.1!=1",
    fixed = TRUE
  )
  expect_error(
    assert_intervaltime_single(interval = c(1, 2), start = 1, end = 2.1),
    regexp = "`end` must be the same as the second value in the interval if both are given: 2.1!=2",
    fixed = TRUE
  )
})

test_that("assert_conc", {
  expect_warning(
    assert_conc(conc = -1),
    regexp="Negative concentrations found"
  )
  expect_warning(
    assert_conc(conc = c(NA, -1)),
    regexp="Negative concentrations found"
  )
  expect_warning(
    assert_conc(conc = c(NA, -1, 1)),
    regexp="Negative concentrations found"
  )
  expect_warning(
    assert_conc(conc = NA),
    regexp="All concentration data are missing"
  )
  expect_error(
    assert_conc(conc="A"),
    regexp="Assertion on 'conc' failed: Must be of type 'numeric', not 'character'."
  )
  expect_error(
    assert_conc(conc=factor("A")),
    regexp="Assertion on 'conc' failed: Must be of type 'numeric', not 'factor'."
  )
})

test_that("assert_time", {
  expect_error(
    assert_time(time=NA),
    regexp="Assertion on 'time' failed: Contains missing values (element 1).",
    fixed = TRUE
  )
  expect_error(
    assert_time(time = c(0, 0)),
    regexp="Assertion on 'time' failed: Contains duplicated values, position 2."
  )
  expect_error(
    assert_time(time = c(1, 0)),
    regexp="Assertion on 'time' failed: Must be sorted."
  )
  expect_error(
    assert_time(time="A"),
    regexp="Assertion on 'time' failed: Must be of type 'numeric', not 'character'."
  )
  expect_error(
    assert_time(time=factor("A")),
    regexp="Assertion on 'time' failed: Must be of type 'numeric', not 'factor'."
  )
})

test_that("assert_conc_time", {
  expect_error(
    assert_conc_time(conc = 1, time = 1:2),
    regexp="Assertion on 'conc' failed: Must have length 2, but has length 1."
  )
  expect_error(
    assert_conc_time(conc = 1:2, time = 2),
    regexp="Assertion on 'conc' failed: Must have length 1, but has length 2."
  )
})

test_that("assert_lambdaz", {
  expect_equal(assert_lambdaz(1), 1)
  expect_equal(assert_lambdaz(NA), NA) # NA is allowed by default
  expect_error(
    assert_lambdaz(NA, any.missing = FALSE),
    regexp = "Assertion on 'NA' failed: Contains missing values (element 1).",
    fixed = TRUE
  )
  expect_error(
    assert_lambdaz(-1),
    regexp = "Assertion on '-1' failed: Element 1 is not > 0"
  )
})

test_that("assert_PKNCAdata", {
  expect_error(
    assert_PKNCAdata("A"),
    regexp = "Must be a PKNCAdata object"
  )
})

test_that("element_find", {
  values5<-c(TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, TRUE, TRUE)
  values10<-c(TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, TRUE, TRUE)
  expect_equal(
    element_find(values5),
    element_find(values10)
  )
  
  expect_equal(
    element_find(values5),
    "Elements 1, 2, 3, 4, 5"
  )
  
  expect_equal(
    element_find(values10),
    "Elements 1, 2, 3, 4, 5"
  )
})

test_that("assert_unit_col", {
  d <- data.frame(A = 1, B = "C")
  expect_equal(
    assert_unit_col(unit = "B", data = d),
    structure("B", unit_type = "column")
  )
  expect_error(
    assert_unit_col(unit = 1:2),
    regexp = "`unit` must be a single value"
  )
  expect_error(
    assert_unit_col(unit = 1),
    regexp = "`unit` must be a character string"
  )
  expect_error(
    assert_unit_col(unit = "D", data = "A"),
    regexp = "`data` must be a data.frame"
  )
  expect_error(
    assert_unit_col(unit = "D", data = d),
    regexp = "`unit` (D) must be a column name in the data",
    fixed = TRUE
  )
  expect_error(
    assert_unit_col(unit = "A", data = d),
    regexp = "`unit` (A) must contain character data",
    fixed = TRUE
  )
})

test_that("assert_unit_value", {
  expect_equal(assert_unit_value("A"), structure("A", unit_type = "value"))
  expect_null(assert_unit_value(NULL))
  expect_error(
    assert_unit_value(c("A", "B")),
    regexp = "`unit` must be a single value"
  )
  expect_error(
    assert_unit_value(1),
    regexp = "`unit` must be a character string"
  )
})

test_that("assert_unit", {
  d <- data.frame(A = 1, B = "C")

  expect_null(assert_unit(NULL, data = d))
  expect_equal(
    assert_unit(unit = "B", data = d),
    structure("B", unit_type = "column")
  )
  expect_equal(
    assert_unit(unit = "C", data = d),
    structure("C", unit_type = "value")
  )
  expect_error(
    assert_unit(unit = 1, data = d),
    regexp = "`unit` must be a character string"
  )
})
