tests/testthat/test-0-9-m2-irt-scoring-adaptive.R

test_that("native dichotomous scoring and uncertainty work", {
  items <- data.frame(item_id = paste0("I", 1:6), a = 1, b = seq(-1.5, 1.5, length.out = 6), c = 0, d = 1)
  response <- c(1,1,1,0,0,0)
  eap <- eyeprocess_irt_eap_score(response, items)
  map <- eyeprocess_irt_map_score(response, items)
  mle <- eyeprocess_irt_mle_score(response, items)
  expect_s3_class(eap, "eye_irt_score")
  expect_true(all(is.finite(c(eap$estimate, map$estimate, mle$estimate))))
  pv <- eyeprocess_irt_plausible_values(eap, n = 20, seed = 3)
  expect_length(pv, 20L)
  expect_error(eyeprocess_irt_eap_score(response, items, prior_mean = c(0, 1)))
  expect_error(eyeprocess_irt_plausible_values(eap, n = c(2, 3), seed = 3))
})

test_that("adaptive item selection respects eligibility and stopping", {
  items <- data.frame(item_id = paste0("I", 1:5), a = c(.8,1,1.5,1.1,.9), b = c(-1,-.5,0,.5,1), c = 0, d = 1)
  bank <- eyeprocess_irt_item_bank(items, content = c("A","A","B","B","B"))
  sel <- eyeprocess_irt_item_selection(bank, theta = 0, administered = "I3")
  expect_false(sel$selected == "I3")
  expect_true(eyeprocess_irt_stopping_rule(10, se = .2, min_items = 5)$stop)
  trace <- eyeprocess_irt_adaptive_trace(c("I1","I2"), c(0,.1), c(.1,.2), c(.5,.4), c(1,1.5), c(1,0))
  expect_s3_class(trace, "eye_irt_adaptive_trace")
  trace_default <- eyeprocess_irt_adaptive_trace(c("I1","I2"), c(0,.1), c(.1,.2), c(.5,.4), c(1,1.5))
  expect_equal(length(trace_default$response), 2L)
  balance <- eyeprocess_irt_content_balance_audit(c("I1","I3"), bank, target = c(A = .4, B = .6))
  expect_equal(sum(balance$target), 1, tolerance = 1e-12)
  expect_equal(sort(balance$content), c("A", "B"))
  penalty <- eyeprocess_irt_process_aware_selection_penalty(c(1, 2), burden = .1)
  expect_length(penalty, 2L)
  expect_error(eyeprocess_irt_stopping_rule(c(1, 2), se = .2))
})

Try the eyeprocess package in your browser

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

eyeprocess documentation built on Sept. 28, 2026, 5:08 p.m.