library(Matrix)

dat <- tibble(
  a = c("row1", "row1", "row2", "row2", "row2"),
  b = c("col1", "col2", "col1", "col3", "col4"),
  val = 1:5
)

test_that("Can cast tables into a sparse Matrix", {
  m <- cast_sparse(dat, a, b)
  m2 <- cast_sparse(dat, "a", "b")

  expect_s4_class(m, "dgCMatrix")
  expect_equal(m, m2)
  expect_equal(sum(m), 5)

  expect_equal(nrow(m), length(unique(dat$a)))
  expect_equal(ncol(m), length(unique(dat$b)))

  m3 <- cast_sparse(dat, a, b, val)

  expect_equal(sum(m3), sum(dat$val))
  expect_equal(m3["row2", "col3"], 4)
})

test_that("cast_sparse ignores groups", {
  m <- cast_sparse(dat, a, b)
  m2 <- cast_sparse(group_by(dat, a), a, b)

  expect_identical(m, m2)
})

test_that("Can cast_sparse with tidyeval", {
  m <- cast_sparse(dat, a, b)
  rowvar <- quo("a")
  m2 <- cast_sparse(dat, !!rowvar, b)

  expect_identical(m, m2)
})

test_that("Can cast tables into a sparse DocumentTermMatrix", {
  skip_if_not_installed("tm")
  d <- cast_dtm(dat, a, b, val)
  d2 <- cast_dtm(dat, "a", "b", "val")
  expect_equal(d, d2)
  expect_s3_class(d, "DocumentTermMatrix")
  expect_equal(dim(d), c(2, 4))
  expect_equal(sort(tm::Docs(d)), sort(unique(dat$a)))
  expect_equal(sort(tm::Terms(d)), sort(unique(dat$b)))
  expect_equal(as.numeric(as.matrix(d[1:2, 1:2])), c(1, 3, 2, 0))
  expect_equal(as.numeric(as.matrix(d[2, 3])), 4)
})

test_that("Can cast tables into a sparse TermDocumentMatrix", {
  skip_if_not_installed("tm")
  d <- cast_tdm(dat, b, a, val)
  d2 <- cast_tdm(dat, "b", "a", "val")
  expect_equal(d, d2)
  expect_s3_class(d, "TermDocumentMatrix")

  expect_equal(dim(d), c(4, 2))
  expect_equal(sort(tm::Terms(d)), sort(unique(dat$b)))
})

test_that("Can cast tables into a sparse dfm", {
  skip_if_not_installed("quanteda")

  library(methods)
  d <- cast_dfm(dat, a, b, val)
  d2 <- cast_dfm(dat, "a", "b", "val")
  expect_equal(d, d2)
  expect_true(quanteda::is.dfm(d))
  expect_equal(dim(d), c(2, 4))
  expect_equal(as.numeric(d[1, 1]), 1)
  expect_equal(as.numeric(d[2, 3]), 4)
})
