| % 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. |
| |
| -module(arrow_variable_binary_array_SUITE). |
| |
| -compile(export_all). |
| |
| -include_lib("common_test/include/ct.hrl"). |
| -include_lib("stdlib/include/assert.hrl"). |
| |
| -include("arrow_array.hrl"). |
| |
| all() -> |
| [ |
| valid_layout_on_from_erlang, |
| valid_type_on_from_erlang, |
| valid_len_on_from_erlang, |
| valid_element_len_on_from_erlang, |
| valid_null_count_on_from_erlang, |
| valid_validity_bitmap_on_from_erlang, |
| valid_offsets_on_from_erlang, |
| valid_data_on_from_erlang, |
| |
| %% Behaviour Adherence |
| from_erlang_callback |
| ]. |
| |
| valid_layout_on_from_erlang(_Config) -> |
| Array = arrow_variable_binary_array:from_erlang([<<1>>, <<2>>, <<3, 4>>]), |
| ?assertEqual(Array#array.layout, variable_binary). |
| |
| valid_type_on_from_erlang(_Config) -> |
| Array = arrow_variable_binary_array:from_erlang([<<1>>, <<2>>, <<3>>]), |
| ?assertEqual(Array#array.type, {bin, undefined}). |
| |
| valid_len_on_from_erlang(_Config) -> |
| Array1 = arrow_variable_binary_array:from_erlang([<<1, 2>>, <<3>>]), |
| ?assertEqual(Array1#array.len, 2), |
| |
| Array2 = arrow_variable_binary_array:from_erlang([<<1, 2>>, undefined, <<3>>]), |
| ?assertEqual(Array2#array.len, 3). |
| |
| valid_element_len_on_from_erlang(_Config) -> |
| Array = arrow_variable_binary_array:from_erlang([<<1>>, <<2>>, <<3>>]), |
| ?assertEqual(Array#array.element_len, undefined). |
| |
| valid_null_count_on_from_erlang(_Config) -> |
| Array1 = arrow_variable_binary_array:from_erlang([<<1, 2>>, <<3>>]), |
| ?assertEqual(Array1#array.null_count, 0), |
| |
| Array2 = arrow_variable_binary_array:from_erlang([<<1>>, undefined, <<2, 3>>]), |
| ?assertEqual(Array2#array.null_count, 1), |
| |
| Array3 = arrow_variable_binary_array:from_erlang([<<1>>, nil, <<2, 3>>]), |
| ?assertEqual(Array3#array.null_count, 1), |
| |
| Array4 = arrow_variable_binary_array:from_erlang([<<1>>, undefined, nil, <<2, 3>>]), |
| ?assertEqual(Array4#array.null_count, 2). |
| |
| valid_validity_bitmap_on_from_erlang(_Config) -> |
| %% Does not allocate bitmap on no nulls |
| Array1 = arrow_variable_binary_array:from_erlang([<<1, 2>>, <<3>>]), |
| ?assertEqual(Array1#array.validity_bitmap, undefined), |
| |
| %% Respects both Erlang's and Elixir's conventions |
| Array2 = arrow_variable_binary_array:from_erlang([<<1>>, undefined, <<2, 3>>]), |
| ?assertEqual( |
| Array2#array.validity_bitmap, |
| arrow_test_utils:byte_buffer(<<0:1, 0:1, 0:1, 0:1, 0:1, 1:1, 0:1, 1:1>>) |
| ), |
| |
| Array3 = arrow_variable_binary_array:from_erlang([<<1>>, nil, <<2, 3>>]), |
| ?assertEqual( |
| Array3#array.validity_bitmap, |
| arrow_test_utils:byte_buffer(<<0:1, 0:1, 0:1, 0:1, 0:1, 1:1, 0:1, 1:1>>) |
| ), |
| |
| Array4 = arrow_variable_binary_array:from_erlang([<<1>>, undefined, nil, <<2, 3>>]), |
| ?assertEqual( |
| Array4#array.validity_bitmap, |
| arrow_test_utils:byte_buffer(<<0:1, 0:1, 0:1, 0:1, 1:1, 0:1, 0:1, 1:1>>) |
| ), |
| |
| %% Correctly validates on input greater than 8 elements |
| Array5 = arrow_variable_binary_array:from_erlang([ |
| <<1>>, <<2>>, undefined, <<4>>, <<5>>, <<6>>, <<7>>, <<8>>, nil, <<10, 11, 12>> |
| ]), |
| ?assertEqual( |
| Array5#array.validity_bitmap, |
| arrow_test_utils:byte_buffer( |
| <<1:1, 1:1, 1:1, 1:1, 1:1, 0:1, 1:1, 1:1, 0:1, 0:1, 0:1, 0:1, 0:1, 0:1, 1:1, 0:1>> |
| ) |
| ). |
| |
| valid_offsets_on_from_erlang(_Config) -> |
| Array = arrow_variable_binary_array:from_erlang([ |
| <<1, 2>>, <<3>>, undefined, <<4>>, nil, <<5>> |
| ]), |
| Buffer = arrow_buffer:from_erlang([0, 2, 3, 3, 4, 4, 5], {s, 32}), |
| ?assertEqual(Array#array.offsets, Buffer). |
| |
| valid_data_on_from_erlang(_Config) -> |
| Array1 = arrow_variable_binary_array:from_erlang([<<1, 2>>, <<3>>, <<4>>, <<5>>]), |
| Buffer1 = binary_buffer(<<1, 2, 3, 4, 5>>), |
| ?assertEqual(Array1#array.data, Buffer1), |
| |
| Array2 = arrow_variable_binary_array:from_erlang([ |
| <<1, 2>>, <<3, 4, 5>>, undefined, <<6, 7, 8>>, nil, <<9, 10>> |
| ]), |
| Buffer2 = binary_buffer(<<1, 2, 3, 4, 5, 6, 7, 8, 9, 10>>), |
| ?assertEqual(Array2#array.data, Buffer2). |
| |
| %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
| %% Array Behaviour Adherence Tests %% |
| %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
| |
| from_erlang_callback(_Config) -> |
| Array = arrow_variable_binary_array:from_erlang([<<1>>, <<2>>]), |
| Callback = arrow_variable_binary_array:from_erlang([<<1>>, <<2>>], #{}), |
| ?assertEqual(Callback, Array). |
| |
| %%%%%%%%%%% |
| %% Utils %% |
| %%%%%%%%%%% |
| |
| binary_buffer(Bin) -> |
| arrow_buffer:from_erlang(Bin, {bin, undefined}). |