test_that("union works", { relations <- data.frame( sets = c(rep("a", 5), "b", "c"), elements = letters[seq_len(7)] ) a <- tidySet(relations) b <- union(a, c("c", "b"), "d") expect_s4_class(b, "TidySet") expect_equal(name_sets(b), "d") expect_equal(name_elements(b), c("f", "g")) # Simple case with duplicate relations relations <- data.frame( sets = c(rep("a", 5), "b", "c"), elements = c(letters[seq_len(6)], letters[6]) ) a <- tidySet(relations) b <- union(a, c("c", "b"), "d") expect_s4_class(b, "TidySet") expect_equal(name_sets(b), "d") expect_equal(name_elements(b), "f") }) test_that("union works fuzzy", { relations <- data.frame( sets = c(rep("a", 5), "b", "c"), elements = c(letters[seq_len(6)], letters[6]), fuzzy = runif(7) ) a <- tidySet(relations) b <- union(a, c("c", "b"), "d") expect_s4_class(b, "TidySet") expect_equal(name_sets(b), "d") expect_equal(name_elements(b), "f") expect_equal(b@relations$fuzzy, max(a@relations$fuzzy[6:7])) d <- union(a, c("a", "c"), "d") expect_s4_class(d, "TidySet") expect_equal(name_sets(d), "d") expect_equal(name_elements(d), letters[1:6]) }) test_that("union keep", { relations <- data.frame( sets = c(rep("A", 4), "B", "C", "D"), elements = letters[seq_len(7)] ) a <- tidySet(relations) b <- union(a, c("A", "C"), "E", keep = TRUE) expect_s4_class(b, "TidySet") expect_length(name_sets(b), 5L) expect_equal(nSets(b), nSets(a) + 1) }) test_that("union works fuzzy keep", { relations <- data.frame( sets = c(rep("a", 5), "b", "c"), elements = c(letters[seq_len(6)], letters[6]), fuzzy = runif(7) ) a <- tidySet(relations) b <- union(a, c("c", "b"), "d", keep = TRUE) expect_s4_class(b, "TidySet") expect_equal(nSets(b), nSets(a) + 1) expect_equal(b@relations$fuzzy[8], max(a@relations$fuzzy[6:7])) d <- union(a, c("a", "c"), "d", keep = TRUE) expect_s4_class(d, "TidySet") expect_equal(nSets(d), nSets(a) + 1) expect_equal(name_sets(d), name_sets(b)) expect_equal(name_elements(d), letters[1:6]) }) test_that("check coherence", { relations <- data.frame( sets = c("A", "A", "A", "A", "B", "C", "D"), elements = c("a", "b", "c", "d", "e", "f", "g") ) a <- tidySet(relations = relations) b <- union(a, c("A", "B"), "AuB") d <- union(a, c("A", "B"), "AuB", keep = TRUE) expect_equal(nSets(b) + 4, nSets(d)) }) test_that("fapply works in order", { fuzzy_set <- new("TidySet", elements = data.frame(elements = factor(c("a", "b", "c", "d", "e", "f"))), sets = data.frame(sets = factor(c("A", "B"))), relations = data.frame( sets = factor(rep(c("A", "B"), c(5L, 2L))), elements = factor(c("a", "b", "c", "d", "e", "a", "f")), fuzzy = c( 0.183724598027766, 0.45670090126805, 0.815207473235205, 0.580061004729941, 0.572497315471992, 0.938118239864707, 0.946015807567164 ) ) ) df <- as.data.frame(union(fuzzy_set, c("A", "B"), "D", keep = TRUE)) expect_equal( df$fuzzy[df$elements == "b" & df$sets == "A"], df$fuzzy[df$elements == "b" & df$sets == "D"] ) }) test_that("union pass other arguments to FUN", { set.seed(98632187) relations <- data.frame( sets = c(rep("A", 5), rep("B", 5)), elements = c(letters[1:5], letters[2:6]), fuzzy = runif(10) ) a <- tidySet(relations) q <- function(x, quantile) { quantile(x, probs = quantile) } r <- union(a, c("A", "B"), "C", FUN = q, quantile = 0.5) expect_equal( relations(r)$fuzzy[relations(r)$elements == "b"], unname(q(relations$fuzzy[relations$elements == "b"], 0.5)) ) })