library(testthat) library(AutoEDA) #========================================================== # missing_summary() #========================================================== test_that("missing_summary returns MissingSummary object", { ms <- missing_summary(iris) expect_s3_class( ms, "MissingSummary" ) }) test_that("missing_summary returns expected components", { ms <- missing_summary(iris) expect_named( ms, c( "TotalRows", "TotalColumns", "TotalCells", "TotalMissing", "OverallPercent", "VariablesWithMissing", "CompleteCases", "VariableSummary" ) ) }) test_that("missing_summary works when no missing values exist", { ms <- missing_summary(iris) expect_equal(ms$TotalRows, 150) expect_equal(ms$TotalColumns, 5) expect_equal(ms$TotalMissing, 0) expect_equal(ms$VariablesWithMissing, 0) expect_equal(ms$CompleteCases, 150) }) test_that("missing_summary detects missing values correctly", { dat <- iris dat$Sepal.Length[1:10] <- NA dat$Petal.Width[1:5] <- NA ms <- missing_summary(dat) expect_equal( ms$TotalMissing, 15 ) expect_equal( ms$VariablesWithMissing, 2 ) }) test_that("missing_summary computes overall percentage correctly", { dat <- iris dat$Sepal.Length[1:15] <- NA ms <- missing_summary(dat) expect_equal( ms$OverallPercent, round(100 * 15 / (150 * 5), 2) ) }) test_that("missing_summary orders variables by missing percentage", { dat <- iris dat$Sepal.Length[1:20] <- NA dat$Petal.Width[1:5] <- NA ms <- missing_summary(dat) expect_equal( ms$VariableSummary$Variable[1], "Sepal.Length" ) }) test_that("missing_summary works with mixed variable types", { dat <- data.frame( x = c(1,2,NA,4), y = c("A","B","C",NA), z = factor(c("Low","High","Low","Medium")) ) ms <- missing_summary(dat) expect_s3_class( ms, "MissingSummary" ) }) test_that("missing_summary stores variable classes", { dat <- data.frame( x = 1:5, y = letters[1:5], z = factor(letters[1:5]) ) ms <- missing_summary(dat) expect_equal( ms$VariableSummary$Type, c( "integer", "character", "factor" ) ) }) #========================================================== # Invalid input #========================================================== test_that("missing_summary rejects non-data.frame", { expect_error( missing_summary( 1:10 ) ) }) test_that("missing_summary rejects empty data.frame", { expect_error( missing_summary( data.frame() ) ) }) #========================================================== # Return values #========================================================== test_that("VariableSummary is a data.frame", { ms <- missing_summary(iris) expect_s3_class( ms$VariableSummary, "data.frame" ) }) test_that("VariableSummary contains expected columns", { ms <- missing_summary(iris) expect_equal( names(ms$VariableSummary), c( "Variable", "Type", "Missing", "Percent", "Complete" ) ) })