# 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("extension types can be registered and unregistered", { spec <- nanoarrow_extension_spec() register_nanoarrow_extension("some_ext", spec) expect_identical(resolve_nanoarrow_extension("some_ext"), spec) unregister_nanoarrow_extension("some_ext") expect_identical(resolve_nanoarrow_extension("some_ext"), NULL) }) test_that("infer_nanoarrow_ptype() dispatches on registered extension spec", { register_nanoarrow_extension( "some_ext", nanoarrow_extension_spec(subclass = "some_spec_class") ) on.exit(unregister_nanoarrow_extension("some_ext")) infer_nanoarrow_ptype_extension.some_spec_class <- function(spec, x, ...) { infer_nanoarrow_ptype_extension(NULL, x, ..., warn_unregistered = FALSE) } s3_register( "nanoarrow::infer_nanoarrow_ptype_extension", "some_spec_class", infer_nanoarrow_ptype_extension.some_spec_class ) expect_identical( infer_nanoarrow_ptype( na_extension(na_struct(list(some_name = na_int32())), "some_ext") ), data.frame(some_name = integer()) ) }) test_that("convert_array() dispatches on registered extension spec", { register_nanoarrow_extension( "some_ext", nanoarrow_extension_spec(subclass = "some_spec_class") ) on.exit(unregister_nanoarrow_extension("some_ext")) convert_array_extension.some_spec_class <- function(spec, array, to, ...) { convert_array_extension(NULL, array, to, ..., warn_unregistered = FALSE) } s3_register( "nanoarrow::convert_array_extension", "some_spec_class", convert_array_extension.some_spec_class ) expect_identical( convert_array( nanoarrow_extension_array(data.frame(some_name = 1:5), "some_ext") ), data.frame(some_name = 1:5) ) }) test_that("as_nanoarrow_array() dispatches on registered extension spec", { register_nanoarrow_extension( "some_ext", nanoarrow_extension_spec(subclass = "some_spec_class") ) on.exit(unregister_nanoarrow_extension("some_ext")) expect_error( as_nanoarrow_array( data.frame(some_name = 1:5), schema = na_extension( na_struct(list(some_name = na_int32())), "some_ext" ) ), "not implemented for extension" ) as_nanoarrow_array_extension.some_spec_class <- function(spec, x, ..., schema = NULL) { nanoarrow_extension_array(x, "some_ext") } s3_register( "nanoarrow::as_nanoarrow_array_extension", "some_spec_class", as_nanoarrow_array_extension.some_spec_class ) ext_array <- as_nanoarrow_array( data.frame(some_name = 1:5), schema = na_extension( na_struct(list(some_name = na_int32())), "some_ext" ) ) expect_identical( infer_nanoarrow_schema(ext_array)$metadata[["ARROW:extension:name"]], "some_ext" ) })