tests/testthat/test-epitool.R

test_that("2 x 2 engine returns expected RR", {
  x <- R4VN:::.r4vn_epi_2x2(20,80,10,90)
  expect_equal(x$risk_exposed,.20)
  expect_equal(x$risk_unexposed,.10)
  expect_equal(x$rr,2,tolerance=1e-10)
  expect_true(is.finite(x$fisher_p))
})

test_that("line-list health check detects errors", {
  d <- data.frame(
    id=c(1,1,2),
    onset=as.Date(c("2026-01-03","2026-01-05","2026-01-08")),
    report=as.Date(c("2026-01-04","2026-01-03","2026-01-09")),
    age=c(20,30,140)
  )
  h <- R4VN:::.r4vn_epi_health(d,"id","onset","report","age")
  expect_true(any(h$table$Issue=="Duplicate IDs"))
  expect_true(any(h$table$Issue=="Report date before onset date"))
  expect_true(any(h$table$Issue=="Impossible age (<0 or >120)"))
})

test_that("template mapping recognizes common Vietnamese coordinate names", {
  d <- data.frame(ma_ca=1:3, vi_do=c(10.7,10.8,10.9), kinh_do=c(106.6,106.7,106.8))
  expect_warning(
    m <- R4VN:::.r4vn_epi_guess_mapping(d,"spatial_cases"),
    NA
  )
  expect_equal(unname(m["case_id"]),"ma_ca")
  expect_equal(unname(m["latitude"]),"vi_do")
  expect_equal(unname(m["longitude"]),"kinh_do")
})

test_that("spatial import validation identifies coordinate issues", {
  d <- data.frame(case_id=c("A","A","B"),latitude=c(10.7,95,NA),longitude=c(106.6,106.7,106.8))
  expect_warning(
    v <- R4VN:::.r4vn_epi_validate_import(d,"spatial_cases"),
    NA
  )
  expect_true(v$critical > 0)
  expect_true(any(grepl("Duplicate",v$issues$Issue)))
  expect_true(any(grepl("outside valid",v$issues$Issue)))
})

test_that("surveillance baseline returns signals field", {
  d <- data.frame(
    date=as.Date(c("2023-01-02","2024-01-01","2025-01-06","2026-01-05")),
    cases=c(10,11,9,30)
  )
  z <- R4VN:::.r4vn_epi_surveillance(d,"date","cases","week",3,2)
  expect_true(all(c("baseline_mean","threshold","signal")%in%names(z)))
})

test_that("spatial validation counts valid coordinates", {
  d <- data.frame(lat=c(10.7,10.8,NA,100),lon=c(106.6,106.7,106.8,106.9))
  z <- R4VN:::.r4vn_epi_spatial_validate(d,"lat","lon")
  expect_equal(z$valid_n,2)
  expect_equal(z$invalid_range_n,1)
})

test_that("buffer and distance engines work when sf is installed", {
  skip_if_not_installed("sf")
  cases <- data.frame(id=1:3,latitude=c(10.764,10.765,10.80),longitude=c(106.662,106.663,106.70))
  src <- data.frame(source_id="S1",latitude=10.764,longitude=106.662)
  z <- R4VN:::.r4vn_epi_spatial_buffer(cases,src,500,"latitude","longitude")
  expect_equal(nrow(z$data),3)
  expect_true(z$data$within_buffer[1])
  expect_true(all(is.finite(z$data$distance_source_m)))
})

test_that("density grid works when sf is installed", {
  skip_if_not_installed("sf")
  d <- data.frame(latitude=c(10.764,10.765,10.766),longitude=c(106.662,106.663,106.664))
  g <- R4VN:::.r4vn_epi_spatial_grid(d,"latitude","longitude",500,"hexagon")
  expect_s3_class(g,"sf")
  expect_equal(sum(g$cases),3)
})

test_that("DBSCAN clustering works when optional packages are installed", {
  skip_if_not_installed("sf")
  skip_if_not_installed("dbscan")
  d <- data.frame(latitude=c(10.764,10.7641,10.7642,10.80),
                  longitude=c(106.662,106.6621,106.6622,106.70))
  z <- R4VN:::.r4vn_epi_spatial_dbscan(d,"latitude","longitude",100,2)
  expect_true("cluster_id"%in%names(z))
  expect_true(any(z$cluster_id>0))
})

test_that("epitool app can be constructed when shiny is installed", {
  skip_if_not_installed("shiny")
  d <- data.frame(id=1:3,onset_date=as.Date("2026-01-01")+0:2,
                  latitude=c(10.7,10.71,10.72),longitude=c(106.6,106.61,106.62))
  app <- R4VN:::.r4vn_epitool_app(d,"d")
  expect_s3_class(app,"shiny.appobj")
})

Try the R4VN package in your browser

Any scripts or data that you put into this service are public.

R4VN documentation built on Sept. 30, 2026, 5:13 p.m.