tests/testthat/test-engine.R

test_that("createEngine works and returns expected structure", {
  engine <- createEngine(
    dimension = 2,
    lowerBounds = c(-1, -1),
    upperBounds = c(1, 1),
    seed = 123,
    mean = c(0, 0),
    precision = diag(2)
  )
  
  expect_type(engine, "list")
  expect_named(engine, "engine")
  expect_true(is(engine$engine, "externalptr"))
  expect_true(length(engine) == 1)
})

test_that("createNutsEngine works", {
  nuts_engine <- createNutsEngine(
    dimension = 2,
    lowerBounds = c(-2, -2),
    upperBounds = c(2, 2),
    seed = 456,
    stepSize = 0.1,
    mean = c(0.5, -0.5),
    precision = matrix(c(2, 0.3, 0.3, 2), nrow = 2)
  )
  
  expect_type(nuts_engine, "list")
  expect_named(nuts_engine, "engine")
  expect_true(is(nuts_engine$engine, "externalptr"))
})

test_that("setMean updates engine without error", {
  engine <- createEngine(
    dimension = 2,
    lowerBounds = c(-1, -1),
    upperBounds = c(1, 1),
    seed = 123,
    mean = c(0, 0),
    precision = diag(2)
  )
  
  # Should work without error
  expect_error(setMean(engine, mean = c(1, 2)), NA)
  
  # Test with different mean values
  expect_error(setMean(engine, mean = c(-1, 1)), NA)
  expect_error(setMean(engine, mean = c(0.5, -0.5)), NA)
})

test_that("setPrecision updates engine without error", {
  engine <- createEngine(
    dimension = 2,
    lowerBounds = c(-1, -1),
    upperBounds = c(1, 1),
    seed = 123,
    mean = c(0, 0),
    precision = diag(2)
  )
  
  # Test diagonal precision
  expect_error(setPrecision(engine, precision = diag(c(2, 3))), NA)
  
  # Test correlated precision
  corr_prec <- matrix(c(2, 0.5, 0.5, 2), nrow = 2)
  expect_error(setPrecision(engine, precision = corr_prec), NA)
  
  # Test identity again
  expect_error(setPrecision(engine, precision = diag(2)), NA)
})

test_that("engine functions integrate correctly", {
  engine <- createEngine(
    dimension = 2,
    lowerBounds = c(-1, -1),
    upperBounds = c(1, 1),
    seed = 123,
    mean = c(0, 0),
    precision = diag(2)
  )
  
  # Get multiple samples to ensure engine works
  positions <- matrix(0, nrow = 5, ncol = 2)
  current_pos <- c(0.1, 0.2)
  
  for (i in 1:5) {
    current_pos <- getZigzagSample(
      position = current_pos,
      nutsFlg = FALSE,
      engine = engine,
      stepSize = 0.1
    )
    positions[i, ] <- current_pos
    
    # Update parameters every other iteration
    if (i %% 2 == 0) {
      setMean(engine, mean = runif(2, -0.5, 0.5))
      setPrecision(engine, precision = diag(runif(2, 0.5, 2)))
    }
  }
  
  # All positions should be within bounds
  expect_true(all(positions >= -1 & positions <= 1))
  expect_true(!any(is.na(positions)))
})

test_that("engine works with getMarkovianZigzagSample", {
  engine <- createEngine(
    dimension = 2,
    lowerBounds = c(-1, -1),
    upperBounds = c(1, 1),
    seed = 123,
    mean = c(0, 0),
    precision = diag(2)
  )
  
  result <- getMarkovianZigzagSample(
    position = c(0.1, -0.2),
    engine = engine,
    travelTime = 0.5
  )
  
  expect_type(result, "list")
  expect_named(result, c("position", "velocity"))
  expect_length(result$position, 2)
  expect_length(result$velocity, 2)
  expect_type(result$position, "double")
  expect_type(result$velocity, "double")
})

Try the hdtg package in your browser

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

hdtg documentation built on Feb. 11, 2026, 5:07 p.m.