# ── validate_soil_data ──────────────────────────────────────────────────────── test_that("validate_soil_data returns correct structure", { data(tillage_operations, package = "soiltillr") result <- validate_soil_data(tillage_operations, "year", "field_id", "depth_cm") expect_named(result, c("valid", "issues", "warnings")) expect_type(result$valid, "logical") }) test_that("validate_soil_data passes clean data", { data(tillage_operations, package = "soiltillr") result <- validate_soil_data(tillage_operations, "year", "field_id", "depth_cm") expect_true(result$valid) expect_length(result$issues, 0) }) test_that("validate_soil_data catches missing column", { df <- data.frame(year = 2020:2022, field = "A", depth = c(10, 15, 20)) result <- validate_soil_data(df, "year", "field_id", "depth") expect_false(result$valid) expect_true(any(grepl("field_id", result$issues))) }) test_that("validate_soil_data catches negative values", { df <- data.frame(year = 2020:2022, field_id = "A", depth = c(10, -5, 20)) result <- validate_soil_data(df, "year", "field_id", "depth") expect_false(result$valid) expect_true(any(grepl("Negative", result$issues))) }) test_that("validate_soil_data rejects empty data frame", { df <- data.frame(year = integer(0), field_id = character(0), depth = numeric(0)) result <- validate_soil_data(df, "year", "field_id", "depth") expect_false(result$valid) }) # ── summarise_tillage ───────────────────────────────────────────────────────── test_that("summarise_tillage returns correct structure", { data(tillage_operations, package = "soiltillr") result <- summarise_tillage(tillage_operations, "year", "field_id", "depth_cm") expect_s3_class(result, "data.frame") expect_true(all(c("year", "field_id", "n_operations", "mean_depth_cm", "max_depth_cm") %in% names(result))) }) test_that("summarise_tillage n_operations is correct", { df <- data.frame( year = c(2020, 2020, 2021, 2021), field_id = c("A", "A", "A", "B"), depth_cm = c(10, 20, 15, 18) ) result <- summarise_tillage(df, "year", "field_id", "depth_cm") expect_equal(result$n_operations[result$year == 2020 & result$field_id == "A"], 2) expect_equal(result$n_operations[result$year == 2021 & result$field_id == "A"], 1) }) test_that("summarise_tillage mean_depth_cm is correct", { df <- data.frame( year = c(2020, 2020, 2021, 2021), field_id = c("A", "A", "A", "B"), depth_cm = c(10, 30, 20, 25) ) result <- summarise_tillage(df, "year", "field_id", "depth_cm") expect_equal(result$mean_depth_cm[result$year == 2020 & result$field_id == "A"], 20) }) test_that("summarise_tillage works with op_col", { data(tillage_operations, package = "soiltillr") result <- summarise_tillage(tillage_operations, "year", "field_id", "depth_cm", op_col = "operation") expect_true("dominant_operation" %in% names(result)) }) # ── tillage_depth_trend ─────────────────────────────────────────────────────── test_that("tillage_depth_trend returns trend column", { data(tillage_operations, package = "soiltillr") result <- tillage_depth_trend(tillage_operations, "year", "field_id", "depth_cm") expect_true("trend" %in% names(result)) expect_true("baseline" %in% result$trend) }) test_that("tillage_depth_trend first year is baseline", { data(tillage_operations, package = "soiltillr") result <- tillage_depth_trend(tillage_operations, "year", "field_id", "depth_cm") first_years <- result[result$trend == "baseline", ] expect_true(nrow(first_years) > 0) expect_true(all(is.na(first_years$depth_change_cm))) }) test_that("tillage_depth_trend detects decreasing trend", { df <- data.frame( year = rep(2020:2022, each = 1), field_id = rep("A", 3), depth_cm = c(30, 20, 10) ) result <- tillage_depth_trend(df, "year", "field_id", "depth_cm") expect_true(any(result$trend == "decreasing")) }) # ── detect_compaction ───────────────────────────────────────────────────────── test_that("detect_compaction returns risk column", { data(tillage_operations, package = "soiltillr") result <- detect_compaction(tillage_operations, "year", "field_id", "depth_cm") expect_true("compaction_risk" %in% names(result)) expect_true(all(result$compaction_risk %in% c("high", "moderate", "low"))) }) test_that("detect_compaction high risk for deep tillage", { df <- data.frame( year = c(2020, 2021), field_id = c("A", "B"), depth_cm = c(32, 28) ) result <- detect_compaction(df, "year", "field_id", "depth_cm", compaction_threshold_cm = 20) expect_equal(result$compaction_risk[result$field_id == "A"], "high") }) test_that("detect_compaction low risk for shallow tillage", { df <- data.frame( year = c(2020, 2021), field_id = c("A", "B"), depth_cm = c(5, 8) ) result <- detect_compaction(df, "year", "field_id", "depth_cm", compaction_threshold_cm = 20) expect_equal(result$compaction_risk[result$field_id == "A"], "low") })