source(file.path("_helper", "init.R"))

lst <- new("unitizerList")

# - "unitizerList basic tests" -------------------------------------------------

length(lst) == 0L
is(lst <- unitizer:::append(lst, 5), "unitizerList")
length(lst) == 1L
is(
  lst <- unitizer:::append(
    lst, list("booyah", list(1:3), matrix(1:9, nrow = 3))
  ), "unitizerList"
)
length(lst) == 4L
is(lst[3L], "unitizerList")
is(lst[[3L]], "list")
lst <- unitizer:::append(lst, list(data.frame(a = letters[1:3])), 2L)
is(lst[[3L]], "data.frame")
length(lst[1:4]) == 4L
lst[[4L]] <- "boo"
is(lst[[4L]], "character")
lst[4L:5L] <- letters[1:2]

c(lst[[4L]], lst[[5L]])
lst[[4L]]

is(unitizer:::as.list(lst), "list")
length(unitizer:::as.list(lst)) == 5L
is(unitizer:::as.expression(lst), "expression")

try(unitizer:::getItem(lst))  # error
lst <- unitizer:::nextItem(lst)
unitizer:::getItem(lst)
lst <- unitizer:::nextItem(lst)
unitizer:::getItem(lst)
lst <- unitizer:::prevItem(lst)
unitizer:::getItem(lst)
lst <<- lst  # leftover from testthat testing?

# - "unitizerList pointer seeking" ---------------------------------------------

for (i in 1:10) lst <- unitizer:::nextItem(lst)
try(unitizer:::getItem(lst))
unitizer:::done(lst)
is(lst <- unitizer:::reset(lst, "back"), "unitizerList")
try(unitizer:::reset(lst, letters))
try(unitizer:::reset(lst, NA_character_))
try(unitizer:::getItem(lst))
lst <- unitizer:::prevItem(lst)
unitizer:::getItem(lst) == "b"
while (!unitizer:::done(lst)) {
    item <- unitizer:::getItem(lst)
    lst <- unitizer:::prevItem(lst)
}
item == 5L
try(unitizer:::getItem(lst))
withCallingHandlers(
  lst[[4]] <- "new value",
  warning = function() stop("A Warning!")
)

for (i in 1:5) lst <- unitizer:::nextItem(lst)
lst@.pointer

# - "unitizerList value replacement and pointer adjustments" -------------------

lst[[4]] <- NULL
lst@.pointer
unitizer:::reset(lst, "back")
lst.len <- length(lst)
identical(lst@.pointer, lst.len)
lst[2:3] <- letters[1:2]
identical(lst@.pointer, lst.len)
lst[2:3] <- list(NULL, NULL)
identical(lst@.pointer, lst.len)
lst[2:3] <- NULL
identical(lst@.pointer, lst.len - 2L)

lst <- unitizer:::reset(lst, "front")
for (i in 1:2) lst <- unitizer:::nextItem(lst)
curr.point <- lst@.pointer
lst[[3]] <- NULL
identical(curr.point, lst@.pointer)
lst <- unitizer:::append(lst, list(5, 6, "blaskdjf"), 1L)
identical(curr.point + 3L, lst@.pointer)
lst <- unitizer:::append(lst, list(matrix(1:9, nrow = 3)), 5L)
identical(curr.point + 3L, lst@.pointer)

# - "Append Factors Works" -----------------------------------------------------

vec <- factor(letters[1:3], levels = letters)
vec2 <- factor(letters[10:15], levels = letters)

all.equal(structure(c(1L, 2L, 3L, 10L, 11L, 12L, 13L, 14L,
  15L), levels = c("a", "b", "c", "d", "e", "f", "g", "h",
  "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t",
  "u", "v", "w", "x", "y", "z"), class = "factor"), append(vec,
  vec2))
all.equal(structure(c(1L, 2L, 10L, 11L, 12L, 13L, 14L, 15L,
  3L), levels = c("a", "b", "c", "d", "e", "f", "g", "h", "i",
  "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u",
  "v", "w", "x", "y", "z"), class = "factor"), append(vec,
  vec2, 2))

all.equal(structure(c(10L, 11L, 12L, 13L, 1L, 2L, 3L, 14L,
  15L), levels = c("a", "b", "c", "d", "e", "f", "g", "h",
  "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t",
  "u", "v", "w", "x", "y", "z"), class = "factor"), append(vec2,
  vec, 4))
try(append(vec2, vec, 20))
try(append(vec2, vec, -5))

# - "List coersion works even inside apply functions" --------------------------

ulist <- new("unitizerList", .items = list("a", 1, 2, "b"))
identical(lapply(ulist, identity), ulist@.items)

# - "Errors" -------------------------------------------------------------------

setClass("uhtsdfoqiuerhzb", slots = c(a = "integer"))
dummy <- new("uhtsdfoqiuerhzb", a = 1L)
lst2 <- new("unitizerList", .items = list(1, 2, 3))
try(append(lst2, 5, after = -1))
try(append(lst2, dummy))

lst3 <- new("unitizerList", .items = expression(1, 2, 3))
try(append(lst3, dummy))

# - "Set Names" ----------------------------------------------------------------

nlst <- new("unitizerList", .items = list(a = "a", b = "b"))
names(nlst) <- toupper(names(nlst))
as.list(nlst)

