Skip to content

Commit e2bc1d3

Browse files
more nosuggest testing (#157)
1 parent 493d680 commit e2bc1d3

4 files changed

Lines changed: 40 additions & 2 deletions

File tree

‎R/array-nested.R‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,9 @@ NestedArray <- R6::R6Class("NestedArray",
190190
)
191191
} else if(is_int64_dtype(self$dtype_obj) && has_bit64()) {
192192
vec_from_raw <- raw_to_integer64(buf, num_shape_elements, endian)
193+
} else if(is_int64_dtype(self$dtype_obj)) {
194+
vec_from_raw <- raw_to_double_from_int64(buf, num_shape_elements,
195+
endian, dtype_signed)
193196
} else {
194197
vec_from_raw <- readBin(
195198
con = buf,

‎R/utils.R‎

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -357,6 +357,37 @@ raw_to_integer64 <- function(buf, n, endian = "little") {
357357
vec
358358
}
359359

360+
#' Convert raw bytes to double from int64 (fallback when bit64 unavailable)
361+
#' @param buf Raw vector of 8-byte integers.
362+
#' @param n Number of elements to read.
363+
#' @param endian "little" or "big".
364+
#' @param signed Logical; if TRUE, treat as signed int64.
365+
#' @return A double vector (precision loss possible for values > 2^53).
366+
#' @keywords internal
367+
raw_to_double_from_int64 <- function(buf, n, endian = "little", signed = TRUE) {
368+
# Read as signed 4-byte ints (unsigned flag only valid for sizes 1-2)
369+
vals <- readBin(con = buf, what = integer(), size = 4, n = n * 2,
370+
signed = TRUE, endian = endian)
371+
# vals are interleaved: lo[1], hi[1], lo[2], hi[2], ...
372+
idx_lo <- seq(1, n * 2, by = 2)
373+
idx_hi <- seq(2, n * 2, by = 2)
374+
# Convert to unsigned double: negative int32 means high bit set
375+
lo_vals <- ifelse(vals[idx_lo] < 0,
376+
as.double(vals[idx_lo]) + 2^32,
377+
as.double(vals[idx_lo]))
378+
hi_vals <- ifelse(vals[idx_hi] < 0,
379+
as.double(vals[idx_hi]) + 2^32,
380+
as.double(vals[idx_hi]))
381+
result <- lo_vals + hi_vals * 2^32
382+
if (signed) {
383+
neg <- hi_vals >= 2^31
384+
if (any(neg)) {
385+
result[neg] <- result[neg] - 2^64
386+
}
387+
}
388+
result
389+
}
390+
360391
#' Convert integer64 vector to raw bytes
361392
#' @param x A bit64::integer64 vector.
362393
#' @param endian "little" or "big".

‎tests/testthat/test-01-parallel.R‎

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@ library(pizzarr)
33
sample_dir <- tools::R_user_dir("pizzarr")
44
clean <- !dir.exists(sample_dir)
55

6-
cache <- pizzarr_sample("dog.ome.zarr")
6+
cache <- tryCatch(pizzarr_sample("dog.ome.zarr"), error = function(e) NULL)
7+
has_dog_sample <- !is.null(cache)
78

89
SlowGettingDirectoryStore <- R6::R6Class("SlowGettingDirectoryStore",
910
inherit = DirectoryStore,
@@ -87,6 +88,7 @@ run_parallel_set <- function(num_workers) {
8788
}
8889

8990
test_that("can run get_item() and set_item in parallel", {
91+
skip_if(!has_dog_sample, "dog.ome.zarr sample not available")
9092
skip_if_not_installed("bench")
9193

9294
bench_df <- bench::mark(
@@ -108,6 +110,7 @@ test_that("can run get_item() and set_item in parallel", {
108110
})
109111

110112
test_that("can run set_item() in parallel", {
113+
skip_if(!has_dog_sample, "dog.ome.zarr sample not available")
111114
skip_if_not_installed("bench")
112115

113116
bench_df <- bench::mark(

‎tests/testthat/test-utils.R‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@ sample_dir <- tools::R_user_dir("pizzarr")
44
clean <- !dir.exists(sample_dir)
55

66
test_that("demo data", {
7-
7+
skip_if_not_installed("crul")
8+
89
demo_data <- pizzarr_sample()
910

1011
expect_true(all(dir.exists(demo_data)))

0 commit comments

Comments
 (0)