# 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("vctrs extension type can roundtrip built-in vector types", { skip_if_not_installed("tibble") # Arrow tibbleifies everything, so we do here too # Lists aren't automatically handled in nanoarrow conversion, so they # aren't listed here yet. vectors <- list( lgl = c(FALSE, TRUE, NA), int = c(0L, 1L, NA_integer_), dbl = c(0, 1, NA_real_), chr = c("a", NA_character_), posixct = as.POSIXct("2000-01-01 12:23", tz = "UTC"), posixlt = as.POSIXlt("2000-01-01 12:23", tz = "UTC"), date = as.Date("2000-01-01"), difftime = as.difftime(123, units = "secs"), data_frame_simple = tibble::tibble(x = 1:5), data_frame_nested = tibble::tibble(x = 1:5, y = tibble::tibble(z = letters[1:5])) ) for (nm in names(vectors)) { vctr <- vectors[[nm]] ptype <- vctrs::vec_ptype(vctr) schema <- na_vctrs(vctr) array <- as_nanoarrow_array(vctr, schema = schema) array_schema <- infer_nanoarrow_schema(array) # Roundtrip through convert_array() expect_true(nanoarrow_schema_identical(array_schema, schema)) expect_identical(infer_nanoarrow_ptype(array), ptype) expect_identical(convert_array(array), vctr) # Roundtrip with an empty array stream stream <- basic_array_stream(list(), schema = schema) expect_identical(convert_array_stream(stream), ptype) # Roundtrip with multiple chunks stream <- basic_array_stream(list(array, array)) expect_identical(convert_array_stream(stream), vctrs::vec_rep(vctr, 2)) if (requireNamespace("arrow", quietly = TRUE)) { # Roundtrip from nanoarrow -> arrow -> R arrow_array <- arrow::as_arrow_array(array) expect_s3_class(arrow_array, "ExtensionArray") expect_identical(arrow_array$type$ptype(), ptype) expect_identical(arrow_array$as_vector(), vctr) # Roundtrip from arrow -> nanoarrow -> R arrow_array <- arrow::vctrs_extension_array(vctr) array <- as_nanoarrow_array(vctr, schema = schema) expect_identical(infer_nanoarrow_ptype(array), ptype) expect_identical(convert_array(array), vctr) } } }) test_that("vctrs extension type respects `to` in convert_array()", { skip_if_not_installed("vctrs") vctr <- as.Date("2000-01-01") array <- as_nanoarrow_array(vctr, schema = na_vctrs(vctr)) expect_identical(convert_array(array), vctr) expect_identical( convert_array(array, to = as.POSIXct(character())), vctrs::vec_cast(vctr, as.POSIXct(character())) ) })