# Tests for utility functions test_that("simulate_invasion generates correct structure", { dat <- simulate_invasion(n_years = 25, seed = 123) expect_true(is.data.frame(dat)) expect_true("year" %in% names(dat)) expect_true("count" %in% names(dat)) expect_true("true_phase" %in% names(dat)) expect_equal(nrow(dat), 25) }) test_that("simulate_invasion respects parameters", { dat <- simulate_invasion( n_years = 40, start_year = 1980, lag_duration = 15, seed = 123 ) expect_equal(min(dat$year), 1980) expect_equal(max(dat$year), 2019) expect_equal(attr(dat, "true_breakpoint"), 1995) }) test_that("simulate_invasion generates effort when requested", { dat <- simulate_invasion(effort = TRUE, seed = 123) expect_true("effort" %in% names(dat)) expect_true(all(dat$effort > 0)) }) test_that("invasion_summary computes correct statistics", { dat <- simulate_invasion(n_years = 20, seed = 123) stats <- invasion_summary(dat$year, dat$count) expect_s3_class(stats, "invasion_summary") expect_equal(stats$time_span$duration, 20) expect_equal(stats$counts$total, sum(dat$count)) expect_true(!is.null(stats$assessment)) }) test_that("validate_invasion_data catches issues", { # Good data should pass dat <- simulate_invasion(seed = 123) expect_true(validate_invasion_data(dat$year, dat$count)) # Different lengths should fail expect_false(suppressWarnings( validate_invasion_data(1:10, 1:5) )) }) test_that("aggregate_by_year works correctly", { raw <- data.frame( year = c(2000, 2000, 2000, 2001, 2001, 2002), species = "test" ) agg <- aggregate_by_year(raw, "year") expect_equal(nrow(agg), 3) expect_equal(agg$count[agg$year == 2000], 3) expect_equal(agg$count[agg$year == 2001], 2) expect_equal(agg$count[agg$year == 2002], 1) })