Nothing
# ==============================================================================
# TELEMETRY EDGE CASES
# ==============================================================================
test_that("telemetry functions handle edge cases and errors", {
skip_if_no_telemetry_deps()
# test file not found
expect_error(
bid_ingest_telemetry("/nonexistent/path/file.json"),
"not found"
)
# test empty file - this should warn, not error
empty_file <- tempfile(fileext = ".json")
file.create(empty_file)
on.exit(unlink(empty_file))
expect_warning(
result <- bid_ingest_telemetry(empty_file),
"No telemetry events found"
)
expect_length(result, 0)
})
test_that("telemetry format detection handles edge cases", {
# test unsupported file extensions
unsupported_file <- tempfile(fileext = ".xyz")
file.create(unsupported_file)
on.exit(unlink(unsupported_file))
expect_error(
bid_ingest_telemetry(unsupported_file),
"Cannot auto-detect format"
)
})
test_that("telemetry data normalization handles malformed data", {
# test malformed JSON
bad_json_file <- tempfile(fileext = ".json")
writeLines('{"invalid": json}', bad_json_file)
on.exit(unlink(bad_json_file))
expect_warning(
bid_ingest_telemetry(bad_json_file),
"No telemetry events found"
)
# test empty JSON file
empty_json_file <- tempfile(fileext = ".json")
writeLines("[]", empty_json_file)
on.exit(unlink(empty_json_file), add = TRUE)
expect_warning(
result <- bid_ingest_telemetry(empty_json_file),
"No telemetry events found"
)
expect_length(result, 0)
})
# ==============================================================================
# ERROR AND WARNING CODE PATHS
# ==============================================================================
test_that("bid functions handle invalid previous_stage objects", {
# test invalid previous stage structure
invalid_stage <- list(not_a_tibble = TRUE)
expect_error(
bid_notice(
previous_stage = invalid_stage,
problem = "Test",
evidence = "Test"
),
"Invalid previous_stage format"
)
expect_error(
bid_anticipate(previous_stage = invalid_stage),
"Invalid previous_stage format"
)
})
test_that("suggestion system handles missing dependencies", {
# test suggestion generation when dependencies are missing
if (exists("generate_stage_suggestions")) {
# test with empty context
empty_suggestions <- generate_stage_suggestions("Notice", list())
expect_type(empty_suggestions, "character")
# test with invalid stage name
suppressWarnings({
invalid_suggestions <- generate_stage_suggestions("InvalidStage", list())
expect_type(invalid_suggestions, "character")
})
} else {
skip("generate_stage_suggestions not available")
}
})
# ==============================================================================
# COMPLEX DATA STRUCTURES
# ==============================================================================
test_that("bid functions handle complex data story structures", {
# test nested data story with complex types
complex_story <- list(
hook = "Complex hook",
context = list(nested = "context"),
metrics = c(1, 2, 3),
visual_approach = NA
)
result <- bid_interpret(
central_question = "Complex test?",
data_story = complex_story
)
validate_bid_stage_structure(result, "Interpret")
expect_equal(result$hook[1], "Complex hook")
})
test_that("persona validation handles edge cases", {
# test personas with missing recommended fields
minimal_personas <- list(list(name = "Minimal Persona"))
suppressWarnings({
expect_true(validate_user_personas(minimal_personas))
})
# test personas with extra fields
extended_personas <- list(list(
name = "Extended Persona",
goals = "Test goals",
pain_points = "Test pain points",
technical_level = "Advanced",
extra_field = "Should be ignored"
))
expect_true(validate_user_personas(extended_personas))
})
# ==============================================================================
# FORMATTING AND DISPLAY EDGE CASES
# ==============================================================================
test_that("formatting functions handle unicode and special characters", {
unicode_text <- "Test with émojis 🎉 and àccénts"
expect_type(truncate_text(unicode_text, 20), "character")
expect_type(normalize_text(unicode_text), "character")
# test very long text
long_text <- paste(rep("word", 100), collapse = " ")
truncated <- truncate_text(long_text, 50)
expect_true(nchar(truncated) <= 50)
expect_match(truncated, "\\.\\.\\.$")
})
test_that("print methods handle missing or NA values gracefully", {
# test stage with many NA values
sparse_stage <- bid_stage("Notice", tibble::tibble(
stage = "Notice",
problem = "Test problem",
theory = NA,
evidence = NA,
suggestions = NA,
timestamp = Sys.time()
))
expect_output(print(sparse_stage), "BID Framework")
expect_output(print(sparse_stage), "Problem:")
# should not error on NA values
})
# ==============================================================================
# ACCESSIBILITY AND LAYOUT EDGE CASES
# ==============================================================================
test_that("accessibility functions handle edge cases", {
# test unknown layout types
unknown_layout_advice <- get_accessibility_advice("unknown_layout")
expect_type(unknown_layout_advice, "character")
expect_gt(nchar(unknown_layout_advice), 0)
# test NULL layout
null_layout_advice <- get_accessibility_advice(NULL)
expect_type(null_layout_advice, "character")
expect_gt(nchar(null_layout_advice), 0)
# test complex accessibility structures
complex_accessibility <- list(
contrast = "AA",
keyboard = "full",
screen_reader = "compatible"
)
formatted <- format_accessibility_for_storage(complex_accessibility)
expect_true(is.character(formatted) || is.na(formatted))
})
# ==============================================================================
# CONCEPT DETECTION AND MATCHING EDGE CASES
# ==============================================================================
test_that("concept detection handles complex text inputs", {
# test text with no recognizable concepts
no_concepts_text <- "This text contains no behavioral science concepts whatsoever"
concepts <- detect_concepts_from_text(no_concepts_text)
expect_type(concepts, "character")
# test text with mixed case and punctuation
mixed_text <- "COGNITIVE Load theory, and Visual-Hierarchy!!! are important."
mixed_concepts <- detect_concepts_from_text(mixed_text)
expect_type(mixed_concepts, "character")
# test very long text
long_concept_text <- paste(
"cognitive load theory",
paste(rep("filler word", 100), collapse = " "),
"visual hierarchy"
)
long_concepts <- detect_concepts_from_text(long_concept_text)
expect_type(long_concepts, "character")
})
# ==============================================================================
# WORKFLOW STATE AND METADATA EDGE CASES
# ==============================================================================
test_that("workflow state handling covers edge cases", {
# test workflow with out-of-order stages
stage1 <- bid_stage("Validate", tibble::tibble(
stage = "Validate",
summary_panel = "Test summary",
timestamp = Sys.time()
))
stage2 <- bid_stage("Notice", tibble::tibble(
stage = "Notice",
problem = "Test problem",
timestamp = Sys.time()
))
workflow <- bid_result(list(stage1, stage2))
expect_false(is_complete(workflow))
# test extraction of non-existent stage
missing_stage <- extract_stage(workflow, "Interpret")
expect_null(missing_stage)
})
test_that("metadata generation handles edge cases", {
# test metadata with unusual custom fields
unusual_metadata <- get_stage_metadata(1, list(
unicode_field = "🎉 emoji value",
null_field = NULL,
nested_field = list(inner = "value")
))
expect_type(unusual_metadata, "list")
expect_equal(unusual_metadata$stage_number, 1)
})
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.