| # Licensed to the Apache Software Foundation (ASF) under one |
| # or more contributor license agreements. See the NOTICE file |
| # distributed with this work for additional information |
| # regarding copyright ownership. The ASF licenses this file |
| # to you under the Apache License, Version 2.0 (the |
| # "License"); you may not use this file except in compliance |
| # with the License. You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, |
| # software distributed under the License is distributed on an |
| # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| # KIND, either express or implied. See the License for the |
| # specific language governing permissions and limitations |
| # under the License. |
| |
| test_that("nanoarrow_pointer_is_valid() works", { |
| expect_true(nanoarrow_pointer_is_valid(na_int32())) |
| expect_true(nanoarrow_pointer_is_valid(as_nanoarrow_array(integer()))) |
| expect_true(nanoarrow_pointer_is_valid( |
| as_nanoarrow_array_stream(data.frame(a = integer()))) |
| ) |
| |
| expect_false(nanoarrow_pointer_is_valid(nanoarrow_allocate_schema())) |
| expect_false(nanoarrow_pointer_is_valid(nanoarrow_allocate_array())) |
| expect_false(nanoarrow_pointer_is_valid(nanoarrow_allocate_array_stream())) |
| |
| expect_error(nanoarrow_pointer_is_valid(NULL), "must inherit from") |
| }) |
| |
| test_that("nanoarrow_pointer_release() works", { |
| ptr <- na_int32() |
| expect_true(nanoarrow_pointer_is_valid(ptr)) |
| nanoarrow_pointer_release(ptr) |
| expect_false(nanoarrow_pointer_is_valid(ptr)) |
| |
| ptr <- as_nanoarrow_array(integer()) |
| expect_true(nanoarrow_pointer_is_valid(ptr)) |
| nanoarrow_pointer_release(ptr) |
| expect_false(nanoarrow_pointer_is_valid(ptr)) |
| |
| ptr <- as_nanoarrow_array_stream(data.frame(a = integer())) |
| expect_true(nanoarrow_pointer_is_valid(ptr)) |
| nanoarrow_pointer_release(ptr) |
| expect_false(nanoarrow_pointer_is_valid(ptr)) |
| |
| expect_error(nanoarrow_pointer_release(NULL), "must inherit from") |
| }) |
| |
| test_that("nanoarrow_pointer_move() works for schema", { |
| ptr <- na_int32() |
| dst <- nanoarrow_allocate_schema() |
| nanoarrow_pointer_move(ptr, dst) |
| expect_false(nanoarrow_pointer_is_valid(ptr)) |
| expect_true(nanoarrow_schema_identical(dst, na_int32())) |
| |
| expect_error( |
| nanoarrow_pointer_move(ptr, dst), |
| "`ptr_dst` is a valid struct ArrowSchema" |
| ) |
| |
| expect_error( |
| nanoarrow_pointer_move(nanoarrow_allocate_schema(), ptr), |
| "`ptr_src` is not a valid struct ArrowSchema" |
| ) |
| }) |
| |
| test_that("nanoarrow_pointer_move() works for array", { |
| ptr <- as_nanoarrow_array(integer()) |
| dst <- nanoarrow_allocate_array() |
| nanoarrow_pointer_move(ptr, dst) |
| expect_false(nanoarrow_pointer_is_valid(ptr)) |
| expect_identical(convert_array(dst), integer()) |
| |
| expect_error( |
| nanoarrow_pointer_move(ptr, dst), |
| "`ptr_dst` is a valid struct ArrowArray" |
| ) |
| |
| expect_error( |
| nanoarrow_pointer_move(nanoarrow_allocate_array(), ptr), |
| "`ptr_src` is not a valid struct ArrowArray" |
| ) |
| }) |
| |
| test_that("nanoarrow_pointer_move() works for array_stream", { |
| ptr <- as_nanoarrow_array_stream(data.frame(a = integer())) |
| dst <- nanoarrow_allocate_array_stream() |
| nanoarrow_pointer_move(ptr, dst) |
| expect_false(nanoarrow_pointer_is_valid(ptr)) |
| expect_true(nanoarrow_pointer_is_valid(dst)) |
| |
| expect_error( |
| nanoarrow_pointer_move(ptr, dst), |
| "`ptr_dst` is a valid struct ArrowArrayStream" |
| ) |
| |
| expect_error( |
| nanoarrow_pointer_move(nanoarrow_allocate_array_stream(), ptr), |
| "`ptr_src` is not a valid struct ArrowArrayStream" |
| ) |
| }) |
| |
| test_that("nanoarrow_pointer_move() can import from chr address", { |
| ptr <- na_int32() |
| ptr_chr <- nanoarrow_pointer_addr_chr(ptr) |
| dst <- nanoarrow_allocate_schema() |
| |
| nanoarrow_pointer_move(ptr_chr, dst) |
| expect_false(nanoarrow_pointer_is_valid(ptr)) |
| expect_true(nanoarrow_pointer_is_valid(dst)) |
| }) |
| |
| test_that("nanoarrow_pointer_move() can import from dbl address", { |
| ptr <- na_int32() |
| ptr_dbl <- nanoarrow_pointer_addr_dbl(ptr) |
| dst <- nanoarrow_allocate_schema() |
| |
| nanoarrow_pointer_move(ptr_dbl, dst) |
| expect_false(nanoarrow_pointer_is_valid(ptr)) |
| expect_true(nanoarrow_pointer_is_valid(dst)) |
| }) |
| |
| test_that("nanoarrow_pointer_move() errors for bad input", { |
| ptr <- na_int32() |
| dst <- nanoarrow_allocate_schema() |
| expect_error(nanoarrow_pointer_move(ptr, NULL), "`ptr_dst` must inherit from") |
| expect_error( |
| nanoarrow_pointer_move(NULL, dst), |
| "Pointer must be chr\\[1\\], dbl\\[1\\], or external pointer" |
| ) |
| }) |
| |
| test_that("nanoarrow_pointer_export() works for schema", { |
| ptr <- na_int32() |
| dst <- nanoarrow_allocate_schema() |
| nanoarrow_pointer_export(ptr, dst) |
| expect_true(nanoarrow_pointer_is_valid(ptr)) |
| expect_true(nanoarrow_schema_identical(dst, na_int32())) |
| |
| expect_error( |
| nanoarrow_pointer_export(ptr, dst), |
| "`ptr_dst` is a valid struct ArrowSchema" |
| ) |
| |
| expect_error( |
| nanoarrow_pointer_export(nanoarrow_allocate_schema(), nanoarrow_allocate_schema()), |
| "has already been released" |
| ) |
| }) |
| |
| test_that("nanoarrow_pointer_export() works for array", { |
| ptr <- as_nanoarrow_array(integer()) |
| dst <- nanoarrow_allocate_array() |
| nanoarrow_pointer_export(ptr, dst) |
| expect_true(nanoarrow_pointer_is_valid(ptr)) |
| # (when exporting the schema is not included) |
| nanoarrow_array_set_schema(dst, infer_nanoarrow_schema(ptr)) |
| expect_identical(convert_array(dst), integer()) |
| |
| expect_error( |
| nanoarrow_pointer_export(ptr, dst), |
| "`ptr_dst` is a valid struct ArrowArray" |
| ) |
| |
| expect_error( |
| nanoarrow_pointer_export(nanoarrow_allocate_array(), nanoarrow_allocate_array()), |
| "has already been released" |
| ) |
| }) |
| |
| test_that("exported Arrays can have their children released", { |
| ptr <- as_nanoarrow_array(data.frame(a = 1L, b = 2)) |
| dst <- nanoarrow_allocate_array() |
| |
| nanoarrow_pointer_export(ptr, dst) |
| expect_identical(convert_array(ptr), data.frame(a = 1L, b = 2)) |
| |
| nanoarrow_pointer_release(dst$children[[1]]) |
| expect_identical(convert_array(ptr), data.frame(a = 1L, b = 2)) |
| |
| nanoarrow_pointer_release(dst$children[[2]]) |
| expect_identical(convert_array(ptr), data.frame(a = 1L, b = 2)) |
| |
| nanoarrow_pointer_release(dst) |
| expect_identical(convert_array(ptr), data.frame(a = 1L, b = 2)) |
| }) |
| |
| test_that("nanoarrow_pointer_export() works for array_stream", { |
| ptr <- as_nanoarrow_array_stream(data.frame(a = integer())) |
| dst <- nanoarrow_allocate_array_stream() |
| nanoarrow_pointer_export(ptr, dst) |
| expect_false(nanoarrow_pointer_is_valid(ptr)) |
| expect_true(nanoarrow_pointer_is_valid(dst)) |
| |
| expect_identical(convert_array_stream(dst), data.frame(a = integer())) |
| |
| expect_error( |
| nanoarrow_pointer_export(ptr, dst), |
| "`ptr_dst` is a valid struct ArrowArrayStream" |
| ) |
| |
| expect_error( |
| nanoarrow_pointer_export(nanoarrow_allocate_array_stream(), ptr), |
| "has already been released" |
| ) |
| }) |
| |
| test_that("nanoarrow_pointer_export() works for wrapped array_stream", { |
| some_dependent_object <- list() |
| ptr <- as_nanoarrow_array_stream(data.frame(a = integer())) |
| nanoarrow_pointer_set_protected(ptr, some_dependent_object) |
| |
| dst <- nanoarrow_allocate_array_stream() |
| nanoarrow_pointer_export(ptr, dst) |
| expect_false(nanoarrow_pointer_is_valid(ptr)) |
| expect_true(nanoarrow_pointer_is_valid(dst)) |
| |
| expect_identical(convert_array_stream(dst), data.frame(a = integer())) |
| }) |
| |
| test_that("nanoarrow_pointer_set_protected() errors appropriately", { |
| expect_error( |
| nanoarrow_pointer_set_protected(NULL), |
| "must inherit from 'nanoarrow_schema', 'nanoarrow_array', or 'nanoarrow_array_stream'" |
| ) |
| |
| dst <- nanoarrow_allocate_array_stream() |
| nanoarrow_pointer_set_protected(dst, 1234) |
| expect_error( |
| nanoarrow_pointer_set_protected(dst, 5678), |
| "External pointer protected value has already been set" |
| ) |
| }) |
| |
| test_that("nanoarrow_pointer_export() errors for unknown object", { |
| expect_error(nanoarrow_pointer_export(NULL), "must inherit from") |
| }) |
| |
| test_that("pointer address getters work", { |
| schema <- na_int32() |
| expect_match(nanoarrow_pointer_addr_chr(schema), "^[0-9]+$") |
| expect_match(nanoarrow_pointer_addr_pretty(schema), "^(0x)?[0-9a-fA-F]+$") |
| }) |