library(testthat) test_that("boilerplate_standardise_measures works correctly", { # Create test measures database test_measures <- list( age = list( description = "Age in years", reference = "survey2023" ), gender = list( description = "Gender of participant", items = list("What is your gender?") ), anxiety = list( description = "Generalized Anxiety Disorder 7-item scale (GAD-7)", items = list( "Feeling nervous, anxious or on edge", "Not being able to stop worrying" ), reference = "Spitzer et al. (2006)" ) ) # Run standardization standardised <- boilerplate_standardise_measures( test_measures, quiet = TRUE ) # Check that all measures have name field set for (measure in standardised) { expect_true("name" %in% names(measure)) } # Check that names were set correctly expect_equal(standardised$age$name, "age") expect_equal(standardised$gender$name, "gender") expect_equal(standardised$anxiety$name, "anxiety") # Check that existing data is preserved expect_equal(standardised$age$description, "Age in years") expect_equal(standardised$anxiety$items[[1]], "Feeling nervous, anxious or on edge") # The scale extraction removes the scale info from description, so check it was extracted expect_true(!is.null(standardised$anxiety$scale_points) || !is.null(standardised$anxiety$scale_info)) }) test_that("boilerplate_measures_report generates correct report", { # Create test database test_db <- list( complete_measure = list( description = "Complete measure with all fields", reference = "Author (2023)", items = list("Item 1", "Item 2", "Item 3"), waves = "1-3", keywords = c("test", "complete"), standardised = TRUE ), partial_measure = list( description = "Partial measure", items = list("Single item") # Missing reference, waves, keywords ), minimal_measure = list( # Only has a name (the key) ) ) # Capture printed output output <- capture.output({ # Generate report as data frame report_df <- boilerplate_measures_report(test_db, return_report = TRUE) }) # Check printed output expect_true(any(grepl("Measures Database Quality Report", output))) expect_true(any(grepl("Total measures: 3", output))) expect_true(any(grepl("Complete descriptions: 2", output))) expect_true(any(grepl("With references: 1", output))) expect_true(any(grepl("With items: 2", output))) # Check returned data frame expect_equal(nrow(report_df), 3) expect_equal(report_df$measure, c("complete_measure", "partial_measure", "minimal_measure")) expect_true(report_df$has_description[1]) expect_true(report_df$has_reference[1]) expect_equal(report_df$n_items[1], 3) expect_true(report_df$is_standardised[1]) # Check partial measure expect_true(report_df$has_description[2]) expect_false(report_df$has_reference[2]) expect_equal(report_df$n_items[2], 1) expect_false(report_df$is_standardised[2]) # Check minimal measure expect_false(report_df$has_description[3]) expect_false(report_df$has_reference[3]) expect_equal(report_df$n_items[3], 0) }) test_that("boilerplate_standardise_measures handles edge cases", { # Test with empty measures database - skip as it causes error with order() # The function expects at least one measure # Test with single measure single_measure <- list( test_measure = list( description = "Single test measure" ) ) result <- boilerplate_standardise_measures(single_measure, quiet = TRUE) expect_equal(result$test_measure$name, "test_measure") expect_true("name" %in% names(result$test_measure)) expect_equal(result$test_measure$description, "Single test measure") # Test with specific measure names multi_db <- list( measure1 = list(description = "First"), measure2 = list(description = "Second"), measure3 = list(description = "Third") ) # Only standardise measure1 and measure3 result <- boilerplate_standardise_measures( multi_db, measure_names = c("measure1", "measure3"), quiet = TRUE ) # All measures should still be in result (function processes selected but returns all) expect_equal(length(result), 3) expect_equal(result$measure1$name, "measure1") expect_equal(result$measure3$name, "measure3") }) test_that("standardisation preserves all valid data", { # Create measure with additional custom fields test_measures <- list( complete = list( description = "Complete measure", reference = "Author2023", items = list("Item A", "Item B"), # Standard fields above, custom fields below unit = "points", # Extra field range = c(0, 100), # Extra field notes = "Additional information", # Extra field custom_field = "Should be preserved" ) ) result <- boilerplate_standardise_measures(test_measures, quiet = TRUE) # Check that key fields exist expect_true("name" %in% names(result$complete)) expect_true("description" %in% names(result$complete)) # Check that extra fields are preserved expect_equal(result$complete$unit, "points") expect_equal(result$complete$range, c(0, 100)) expect_equal(result$complete$notes, "Additional information") expect_equal(result$complete$custom_field, "Should be preserved") # Check that original data is preserved (reference might be standardised) expect_equal(result$complete$description, "Complete measure") expect_true("reference" %in% names(result$complete)) expect_equal(result$complete$items, list("Item A", "Item B")) }) test_that("measures report handles special characters", { # Database with special characters in measure names test_db <- list( "measure-with-dash" = list( description = "Measure with dash in name", items = list("Item 1", "Item 2") ), "measure_with_underscore" = list( description = "Measure with underscore", reference = "Author_2023" ), "measure.with.dots" = list( description = "Measure with dots", waves = "1.2.3" ) ) # Capture output and get report output <- capture.output({ report_df <- boilerplate_measures_report(test_db, return_report = TRUE) }) # Check that special characters in names are preserved in the report expect_equal(report_df$measure[1], "measure-with-dash") expect_equal(report_df$measure[2], "measure_with_underscore") expect_equal(report_df$measure[3], "measure.with.dots") # Verify data was correctly analysed expect_equal(report_df$n_items[1], 2) expect_true(report_df$has_reference[2]) expect_true(report_df$has_waves[3]) })