set.seed(1234)

node_marks <- funs_objs[grepl("node_is_", names(funs_objs))]
for(fn in names(node_marks)) {
  for (ob in names(data_objs)) { 
    test_that(paste(fn, "works on", ob), {
      if(fn == "node_is_exposed"){
        expect_s3_class(node_marks[[fn]](data_objs[[ob]], mark = c(1,3)), 
                        "node_mark")
      } else if(fn == "node_is_core"){
        skip_if(fn == "node_is_core" && manynet::is_directed(data_objs[[ob]]))
        expect_s3_class(node_marks[[fn]](data_objs[[ob]]), "node_mark")
      } else if(fn == "node_is_neighbor"){
        expect_s3_class(node_marks[[fn]](data_objs[[ob]], node = 1), 
                        "node_mark")
      } else if(grepl("recovered|latent|infected", fn)){
        if(ob == "diffusion")
        expect_s3_class(node_marks[[fn]](data_objs[[ob]]), 
                        "node_mark") else succeed("Only used for diffusion objects")
      } else if(grepl("min|max|mean", fn)){
          expect_s3_class(node_marks[[fn]](node_by_deg(data_objs[[ob]])), 
                          "node_mark")
      } else {
        expect_s3_class(node_marks[[fn]](data_objs[[ob]]), "node_mark")
      }
    })
  }
}

test_that("node_is_cutpoint", {
  expect_length(node_is_cutpoint(ison_southern_women),
                c(net_nodes(ison_southern_women)))
})

test_that("node_is_isolate", {
  f <- node_is_isolate
  test <- f(ison_brandes)
  test_that("returns correct values", {
    expect_equal(length(test), c(net_nodes(ison_brandes)))
  })
  test_that("returns correct type", {
    expect_s3_class(test, "logical")
  })
})

test_that("node_is_fold works", {
  test <- node_is_fold(create_explicit(A-B, B-C, A-C, C-D, C-E, D-E))
  expect_equal(as.logical(test), c(F,F,T,F,F))
})

test_that("node_is_neighbor works", {
  expect_equal(names(which(node_is_neighbor(ison_adolescents, "Betty"))), "Sue")
})

test_that("node_is_max works", {
  # skip_on_cran()
  # skip_on_ci()
  expect_equal(length(node_is_max(node_by_betweenness(ison_brandes))),
               c(net_nodes(ison_brandes)))
  expect_equal(sum(node_is_max(node_by_betweenness(ison_brandes)) == TRUE), 1)
  expect_s3_class(node_is_max(node_by_betweenness(ison_brandes)), "logical")
})

test_that("node_is_min works", {
  # skip_on_cran()
  # skip_on_ci()
  expect_equal(length(node_is_min(node_by_betweenness(ison_brandes))),
               c(net_nodes(ison_brandes)))
  expect_equal(sum(node_is_min(node_by_betweenness(ison_brandes)) == TRUE), 4)
  expect_s3_class(node_is_min(node_by_betweenness(ison_brandes)), "logical")
})

test_that("node_is_mean works", {
  expect_s3_class(node_is_mean(node_by_betweenness(ison_brandes)), "logical")
})

test_that("additional node mark functions work", {
  expect_mark(node_is_independent(ison_adolescents), c(TRUE,FALSE,F))
  expect_mark(node_is_core(ison_adolescents), c(F,T,T))
  expect_mark(node_is_mentor(ison_adolescents), c(F,T,T))
  expect_mark(node_is_latent(play_diffusion(create_tree(6), latency = 1), time = 1),
               c(F,T,T))
  expect_mark(node_is_infected(play_diffusion(create_tree(6)), time = 1),
               c(T,T,T,F,F,F), top = 6)
  set.seed(123)
  expect_mark(node_is_recovered(play_diffusion(create_tree(12), recovery = 0.3), time = 3),
               c(T,T,T,F,F,F), top = 6)
  expect_mark(node_is_exposed(manynet::create_tree(6), mark = c(1,3)),
               c(F,T,F))
  set.seed(1234)
  expect_mark(node_is_random(ison_adolescents, 2), c(F,T,F))
})

test_that("node_is_pendant correctly identifies pendant nodes", {
  # Apply the function
  result <- node_is_pendant(create_star(5))
  
  # The center of the star (node 1) is not pendant, others are
  expect_type(result, "logical")
  expect_length(result, 5)
  expect_equal(as.logical(result), c(FALSE, TRUE, TRUE, TRUE, TRUE))
  expect_output(print(result), "V1")
})

test_that("node infection, exposure, and recovery works", {
  skip_on_cran()
  skip_on_ci()
  set.seed(1234)
  .data <- play_diffusion(create_tree(15),
                          seeds = 10, latency = 1, steps = 10)
  expect_true(which(node_is_infected(.data, time = 0))==10)
  expect_true(which(node_is_latent(.data, time = 2))==5)
})


