tests/testthat/test-backend-parity.R

library(testthat)
library(neuroim2)

context("backend parity")

backend_fixture <- system.file("extdata", "global_mask_v4.nii", package = "neuroim2")

load_backend_vecs <- function() {
  list(
    normal = read_vec(backend_fixture, mode = "normal"),
    mmap = read_vec(backend_fixture, mode = "mmap"),
    filebacked = read_vec(backend_fixture, mode = "filebacked")
  )
}

test_that("read_vec backends expose consistent dimensions and classes", {
  vecs <- load_backend_vecs()

  expect_s4_class(vecs$normal, "DenseNeuroVec")
  expect_s4_class(vecs$mmap, "MappedNeuroVec")
  expect_s4_class(vecs$filebacked, "FileBackedNeuroVec")

  expect_equal(dim(vecs$normal), dim(vecs$mmap))
  expect_equal(dim(vecs$normal), dim(vecs$filebacked))
  expect_equal(spacing(vecs$normal), spacing(vecs$mmap))
  expect_equal(spacing(vecs$normal), spacing(vecs$filebacked))
  expect_equal(origin(vecs$normal), origin(vecs$mmap))
  expect_equal(origin(vecs$normal), origin(vecs$filebacked))
  expect_equal(trans(vecs$normal), trans(vecs$mmap))
  expect_equal(trans(vecs$normal), trans(vecs$filebacked))
})

test_that("read_vec backends agree on direct indexing", {
  vecs <- load_backend_vecs()
  ref <- vecs$normal
  ind <- c(1L, 25L, 100L, 250L)
  cds <- index_to_grid(space(ref), ind)

  expect_equal(vecs$mmap[1, 1, 1, ], ref[1, 1, 1, ])
  expect_equal(vecs$filebacked[1, 1, 1, ], ref[1, 1, 1, ])

  expect_equal(vecs$mmap[1:2, 2, 3, 3:4], ref[1:2, 2, 3, 3:4])
  expect_equal(vecs$filebacked[1:2, 2, 3, 3:4], ref[1:2, 2, 3, 3:4])

  expect_equal(vecs$mmap[ind], ref[ind])
  expect_equal(vecs$filebacked[ind], ref[ind])
  expect_equal(vecs$mmap[cds], ref[cds])
  expect_equal(vecs$filebacked[cds], ref[cds])
})

test_that("read_vec backends agree on series extraction", {
  vecs <- load_backend_vecs()
  ref <- vecs$normal
  voxel_coords <- rbind(
    c(1, 1, 1),
    c(2, 2, 2),
    c(3, 3, 3)
  )
  linear_idx <- c(1L, 10L, 100L)

  expect_equal(series(vecs$mmap, 1, 1, 1), series(ref, 1, 1, 1))
  expect_equal(series(vecs$filebacked, 1, 1, 1), series(ref, 1, 1, 1))

  expect_equal(series(vecs$mmap, voxel_coords), series(ref, voxel_coords))
  expect_equal(series(vecs$filebacked, voxel_coords), series(ref, voxel_coords))

  expect_equal(series(vecs$mmap, linear_idx), series(ref, linear_idx))
  expect_equal(series(vecs$filebacked, linear_idx), series(ref, linear_idx))
})

test_that("read_vec backends agree on sub_vector and matrix conversion", {
  vecs <- load_backend_vecs()
  ref <- vecs$normal

  expect_equal(as.matrix(sub_vector(vecs$mmap, 1:3)), as.matrix(sub_vector(ref, 1:3)))
  expect_equal(as.matrix(sub_vector(vecs$filebacked, 1:3)), as.matrix(sub_vector(ref, 1:3)))

  expect_equal(as(vecs$mmap, "matrix"), as(ref, "matrix"))
  expect_equal(as(vecs$filebacked, "matrix"), as(ref, "matrix"))
})

test_that("read_vec backends agree on ROI extraction paths", {
  vecs <- load_backend_vecs()
  ref <- vecs$normal
  roi_idx <- 1:10
  roi_ref <- series_roi(ref, roi_idx)
  roi_vol <- ROIVol(space(drop_dim(space(ref))), coords(roi_ref), data = rep(1, nrow(coords(roi_ref))))

  expect_equal(values(series_roi(vecs$mmap, roi_idx)), values(roi_ref))
  expect_equal(values(series_roi(vecs$filebacked, roi_idx)), values(roi_ref))

  expect_equal(values(series_roi(vecs$mmap, roi_vol)), values(series_roi(ref, roi_vol)))
  expect_equal(values(series_roi(vecs$filebacked, roi_vol)), values(series_roi(ref, roi_vol)))
})

Try the neuroim2 package in your browser

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

neuroim2 documentation built on April 16, 2026, 5:07 p.m.