tests/testthat/test-cross-platform.R

test_that("safe_character handles NULL", {

  expect_null(safe_character(NULL))
})

test_that("safe_character handles character vector", {
  expect_equal(safe_character(c("a", "b")), c("a", "b"))
})

test_that("safe_character handles list input", {
  # This is the bug scenario: list instead of vector from state restoration
  input_list <- list("col1", "col2")
  result <- safe_character(input_list)

  expect_type(result, "character")
  expect_equal(result, c("col1", "col2"))
})

test_that("safe_character handles nested list", {
  input_list <- list(list("a"), "b")
  result <- safe_character(input_list)

  expect_type(result, "character")
  expect_equal(result, c("a", "b"))
})

test_that("intersect with safe_character returns character vector", {
  # Simulate corrupted state where coder_cols is a list
  saved_cols <- list("coder1", "coder2")
  available_cols <- c("coder1", "coder2", "coder3")

  # Without fix: intersect(list, vector) returns list
  bad_result <- intersect(saved_cols, available_cols)
  expect_type(bad_result, "list")  # This is the bug


  # With fix: safe_character ensures character vector
  good_result <- safe_character(intersect(safe_character(saved_cols), available_cols))
  expect_type(good_result, "character")
  expect_equal(good_result, c("coder1", "coder2"))
})

test_that("column subscripting works after safe_character coercion", {
  df <- data.frame(
    unit_id = 1:3,
    coder1 = c("A", "B", "A"),
    coder2 = c("A", "B", "B")
  )

  # Simulate list input (the bug scenario)
  unit_id_list <- list("unit_id")

  # This would fail: df[[unit_id_list]]
  expect_error(df[[unit_id_list]], "invalid subscript type")

  # After safe_character coercion, it works
  unit_id_safe <- safe_character(unit_id_list)
  if (length(unit_id_safe) > 0) unit_id_safe <- unit_id_safe[1]

  expect_no_error(df[[unit_id_safe]])
  expect_equal(df[[unit_id_safe]], 1:3)
})

test_that("prepare_comparison_data works with safe_character coerced inputs", {
  df <- data.frame(
    id = 1:5,
    coder1 = c("A", "B", "A", "B", "A"),
    coder2 = c("A", "A", "B", "B", "A"),
    stringsAsFactors = FALSE
  )

  # Simulate list inputs from corrupted state
  unit_id_list <- list("id")
  coder_cols_list <- list("coder1", "coder2")

  # Coerce to character vectors
  unit_id <- safe_character(unit_id_list)
  if (length(unit_id) > 0) unit_id <- unit_id[1]
  coder_cols <- safe_character(coder_cols_list)

  # Should work without error
  result <- prepare_comparison_data(df, unit_id, coder_cols)

  expect_type(result, "list")
  expect_length(result, 2)
  expect_named(result, c("coder1", "coder2"))
})

Try the quallmer.app package in your browser

Any scripts or data that you put into this service are public.

quallmer.app documentation built on March 8, 2026, 5:06 p.m.