diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-21 11:54:28 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-21 11:54:28 +0000 |
commit | e6918187568dbd01842d8d1d2c808ce16a894239 (patch) | |
tree | 64f88b554b444a49f656b6c656111a145cbbaa28 /src/arrow/matlab/test | |
parent | Initial commit. (diff) | |
download | ceph-e6918187568dbd01842d8d1d2c808ce16a894239.tar.xz ceph-e6918187568dbd01842d8d1d2c808ce16a894239.zip |
Adding upstream version 18.2.2.upstream/18.2.2
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/arrow/matlab/test')
-rwxr-xr-x | src/arrow/matlab/test/tfeather.m | 232 | ||||
-rw-r--r-- | src/arrow/matlab/test/tfeathermex.m | 76 | ||||
-rw-r--r-- | src/arrow/matlab/test/util/createTable.m | 68 | ||||
-rw-r--r-- | src/arrow/matlab/test/util/createVariablesAndMetadataStructs.m | 97 | ||||
-rw-r--r-- | src/arrow/matlab/test/util/featherMEXRoundTrip.m | 22 | ||||
-rw-r--r-- | src/arrow/matlab/test/util/featherRoundTrip.m | 22 |
6 files changed, 517 insertions, 0 deletions
diff --git a/src/arrow/matlab/test/tfeather.m b/src/arrow/matlab/test/tfeather.m new file mode 100755 index 000000000..625a3a525 --- /dev/null +++ b/src/arrow/matlab/test/tfeather.m @@ -0,0 +1,232 @@ +classdef tfeather < matlab.unittest.TestCase + % Tests for MATLAB featherread and featherwrite. + + % 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. + + methods(TestClassSetup) + + function addFeatherFunctionsToMATLABPath(testCase) + import matlab.unittest.fixtures.PathFixture + % Add Feather test utilities to the MATLAB path. + testCase.applyFixture(PathFixture('util')); + % Add featherread and featherwrite to the MATLAB path. + testCase.applyFixture(PathFixture(fullfile('..', 'src'))); + % featherreadmex must be on the MATLAB path. + testCase.assertTrue(~isempty(which('featherreadmex')), ... + '''featherreadmex'' must be on the MATLAB path. Use ''addpath'' to add folders to the MATLAB path.'); + % featherwritemex must be on the MATLAB path. + testCase.assertTrue(~isempty(which('featherwritemex')), ... + '''featherwritemex'' must be on to the MATLAB path. Use ''addpath'' to add folders to the MATLAB path.'); + end + + end + + methods(TestMethodSetup) + + function setupTempWorkingDirectory(testCase) + import matlab.unittest.fixtures.WorkingFolderFixture; + testCase.applyFixture(WorkingFolderFixture); + end + + end + + methods(Test) + + function NumericDatatypesNoNulls(testCase) + filename = fullfile(pwd, 'temp.feather'); + + actualTable = createTable; + expectedTable = featherRoundTrip(filename, actualTable); + testCase.verifyEqual(actualTable, expectedTable); + end + + function NumericDatatypesWithNaNRow(testCase) + filename = fullfile(pwd, 'temp.feather'); + + t = createTable; + + variableNames = {'single', ... + 'double', ... + 'int8', ... + 'int16', ... + 'int32', ... + 'int64', ... + 'uint8', ... + 'uint16', ... + 'uint32', ... + 'uint64'}; + variableTypes = repmat({'double'}, 10, 1)'; + numRows = 1; + numVariables = 10; + + addRow = table('Size', [numRows, numVariables], ... + 'VariableTypes', variableTypes, ... + 'VariableNames', variableNames); + addRow(1,:) = {NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN}; + actualTable = [t; addRow]; + expectedTable = featherRoundTrip(filename, actualTable); + testCase.verifyEqual(actualTable, expectedTable); + end + + function NumericDatatypesWithNaNColumns(testCase) + filename = fullfile(pwd, 'temp.feather'); + + actualTable = createTable; + actualTable.double = [NaN; NaN; NaN]; + actualTable.int64 = [NaN; NaN; NaN]; + + expectedTable = featherRoundTrip(filename, actualTable); + testCase.verifyEqual(actualTable, expectedTable); + end + + function NumericDatatypesWithExpInfSciNotation(testCase) + filename = fullfile(pwd, 'temp.feather'); + + actualTable = createTable; + actualTable.single(2) = 1.0418e+06; + + actualTable.double(1) = Inf; + actualTable.double(2) = exp(9); + + actualTable.int64(2) = 1.0418e+03; + + expectedTable = featherRoundTrip(filename, actualTable); + testCase.verifyEqual(actualTable, expectedTable); + end + + function IgnoreRowVarNames(testCase) + filename = fullfile(pwd, 'temp.feather'); + + actualTable = createTable; + time = {'day1', 'day2', 'day3'}; + actualTable.Properties.RowNames = time; + expectedTable = featherRoundTrip(filename, actualTable); + actualTable = createTable; + testCase.verifyEqual(actualTable, expectedTable); + end + + function NotFeatherExtension(testCase) + filename = fullfile(pwd, 'temp.txt'); + + actualTable = createTable; + expectedTable = featherRoundTrip(filename, actualTable); + testCase.verifyEqual(actualTable, expectedTable); + end + + function EmptyTable(testCase) + filename = fullfile(pwd, 'temp.feather'); + + actualTable = table; + expectedTable = featherRoundTrip(filename, actualTable); + testCase.verifyEqual(actualTable, expectedTable); + end + + function zeroByNTable(testCase) + filename = fullfile(pwd, 'temp.feather'); + + actualTable = createTable; + actualTable([1, 2], :) = []; + expectedTable = featherRoundTrip(filename, actualTable); + testCase.verifyEqual(actualTable, expectedTable); + end + + % %%%%%%%%%%%%%%%%%%% + % Negative test cases + % %%%%%%%%%%%%%%%%%%% + + function ErrorIfUnableToOpenFile(testCase) + filename = fullfile(pwd, 'temp.feather'); + + testCase.verifyError(@() featherread(filename), 'MATLAB:arrow:UnableToOpenFile'); + end + + function ErrorIfCorruptedFeatherFile(testCase) + filename = fullfile(pwd, 'temp.feather'); + + t = createTable; + featherwrite(filename, t); + + fileID = fopen(filename, 'w'); + fwrite(fileID, [1; 5]); + fclose(fileID); + + testCase.verifyError(@() featherread(filename), 'MATLAB:arrow:status:Invalid'); + end + + function ErrorIfInvalidFilenameDatatype(testCase) + filename = fullfile(pwd, 'temp.feather'); + + t = createTable; + + testCase.verifyError(@() featherwrite({filename}, t), 'MATLAB:arrow:InvalidFilenameDatatype'); + testCase.verifyError(@() featherread({filename}), 'MATLAB:arrow:InvalidFilenameDatatype'); + end + + function ErrorIfTooManyInputs(testCase) + filename = fullfile(pwd, 'temp.feather'); + + t = createTable; + + testCase.verifyError(@() featherwrite(filename, t, 'SomeValue', 'SomeOtherValue'), 'MATLAB:TooManyInputs'); + testCase.verifyError(@() featherread(filename, 'SomeValue', 'SomeOtherValue'), 'MATLAB:TooManyInputs'); + end + + function ErrorIfTooFewInputs(testCase) + testCase.verifyError(@() featherwrite(), 'MATLAB:narginchk:notEnoughInputs'); + testCase.verifyError(@() featherread(), 'MATLAB:narginchk:notEnoughInputs'); + end + + function ErrorIfMultiColVarExist(testCase) + filename = fullfile(pwd, 'temp.feather'); + + age = [38; 43; 38; 40; 49]; + smoker = logical([1; 0; 1; 0; 1]); + height = [71; 69; 64; 67; 64]; + weight = [176; 163; 131; 133; 119]; + bloodPressure = [124, 93; 109, 77; 125, 83; 117, 75; 122, 80]; + + t = table(age, smoker, height, weight, bloodPressure); + + testCase.verifyError(@() featherwrite(filename, t), 'MATLAB:arrow:UnsupportedVariableType'); + end + + function UnsupportedMATLABDatatypes(testCase) + filename = fullfile(pwd, 'temp.feather'); + + actualTable = createTable; + calendarDurationVariable = [calendarDuration(1, 7, 9); ... + calendarDuration(2, 1, 1); ... + calendarDuration(5, 3, 2)]; + actualTable = addvars(actualTable, calendarDurationVariable); + + testCase.verifyError(@() featherwrite(filename, actualTable) ,'MATLAB:arrow:UnsupportedVariableType'); + end + + function NumericComplexUnsupported(testCase) + filename = fullfile(pwd, 'temp.feather'); + + actualTable = createTable; + actualTable.single(1) = 1.0418 + 2i; + actualTable.double(2) = exp(9) + 5i; + actualTable.int64(2) = 1.0418e+03; + + expectedTable = featherRoundTrip(filename, actualTable); + testCase.verifyNotEqual(actualTable, expectedTable); + end + + end + +end diff --git a/src/arrow/matlab/test/tfeathermex.m b/src/arrow/matlab/test/tfeathermex.m new file mode 100644 index 000000000..77070ad14 --- /dev/null +++ b/src/arrow/matlab/test/tfeathermex.m @@ -0,0 +1,76 @@ +classdef tfeathermex < matlab.unittest.TestCase + % Tests for MATLAB featherreadmex and featherwritemex. + + % 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. + + methods(TestClassSetup) + + function addFeatherFunctionsToMATLABPath(testCase) + import matlab.unittest.fixtures.PathFixture + % Add Feather test utilities to the MATLAB path. + testCase.applyFixture(PathFixture('util')); + % Add featherread and featherwrite to the MATLAB path. + testCase.applyFixture(PathFixture(fullfile('..', 'src'))); + % featherreadmex must be on the MATLAB path. + testCase.assertTrue(~isempty(which('featherreadmex')), ... + '''featherreadmex'' must be on the MATLAB path. Use ''addpath'' to add folders to the MATLAB path.'); + % featherwritemex must be on the MATLAB path. + testCase.assertTrue(~isempty(which('featherwritemex')), ... + '''featherwritemex'' must be on to the MATLAB path. Use ''addpath'' to add folders to the MATLAB path.'); + end + + end + + methods(TestMethodSetup) + + function setupTempWorkingDirectory(testCase) + import matlab.unittest.fixtures.WorkingFolderFixture; + testCase.applyFixture(WorkingFolderFixture); + end + + end + + methods(Test) + + function NumericDatatypesNulls(testCase) + filename = fullfile(pwd, 'temp.feather'); + + [expectedVariables, expectedMetadata] = createVariablesAndMetadataStructs(); + [actualVariables, ~] = featherMEXRoundTrip(filename, expectedVariables, expectedMetadata); + testCase.verifyEqual([actualVariables.Valid], [expectedVariables.Valid]); + end + + function InvalidMATLABTableVariableNames(testCase) + filename = fullfile(pwd, 'temp.feather'); + + % Create a table with an invalid MATLAB table variable name. + invalidVariable = mlarrow.util.createVariableStruct('double', 1, true, '@'); + validVariable = mlarrow.util.createVariableStruct('double', 1, true, 'Valid'); + variables = [invalidVariable, validVariable]; + metadata = mlarrow.util.createMetadataStruct(1, 2); + featherwritemex(filename, variables, metadata); + t = featherread(filename); + + testCase.verifyEqual(t.Properties.VariableNames{1}, 'x_'); + testCase.verifyEqual(t.Properties.VariableNames{2}, 'Valid'); + + testCase.verifyEqual(t.Properties.VariableDescriptions{1}, 'Original variable name: ''@'''); + testCase.verifyEqual(t.Properties.VariableDescriptions{2}, ''); + end + + end + +end diff --git a/src/arrow/matlab/test/util/createTable.m b/src/arrow/matlab/test/util/createTable.m new file mode 100644 index 000000000..2bf67c68c --- /dev/null +++ b/src/arrow/matlab/test/util/createTable.m @@ -0,0 +1,68 @@ +function t = createTable() +% CREATETABLE Helper function for creating test table. + +% 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. + +variableNames = {'uint8', ... + 'uint16', ... + 'uint32', ... + 'uint64', ... + 'int8', ... + 'int16', ... + 'int32', ... + 'int64', ... + 'single', ... + 'double'}; + +variableTypes = {'uint8', ... + 'uint16', ... + 'uint32', ... + 'uint64', ... + 'int8', ... + 'int16', ... + 'int32', ... + 'int64', ... + 'single', ... + 'double'}; + +uint8Data = uint8([1; 2; 3]); +uint16Data = uint16([1; 2; 3]); +uint32Data = uint32([1; 2; 3]); +uint64Data = uint64([1; 2; 3]); +int8Data = int8([1; 2; 3]); +int16Data = int16([1; 2; 3]); +int32Data = int32([1; 2; 3]); +int64Data = int64([1; 2; 3]); +singleData = single([1/2; 1/4; 1/8]); +doubleData = double([1/10; 1/100; 1/1000]); + +numRows = 3; +numVariables = 10; + +t = table('Size', [numRows, numVariables], 'VariableTypes', variableTypes, 'VariableNames', variableNames); + +t.uint8 = uint8Data; +t.uint16 = uint16Data; +t.uint32 = uint32Data; +t.uint64 = uint64Data; +t.int8 = int8Data; +t.int16 = int16Data; +t.int32 = int32Data; +t.int64 = int64Data; +t.single = singleData; +t.double = doubleData; + +end
\ No newline at end of file diff --git a/src/arrow/matlab/test/util/createVariablesAndMetadataStructs.m b/src/arrow/matlab/test/util/createVariablesAndMetadataStructs.m new file mode 100644 index 000000000..0c60cbfbb --- /dev/null +++ b/src/arrow/matlab/test/util/createVariablesAndMetadataStructs.m @@ -0,0 +1,97 @@ +function [variables, metadata] = createVariablesAndMetadataStructs() +% CREATEVARIABLESANDMETADATASTRUCTS Helper function for creating +% Feather MEX variables and metadata structs. + +% 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. + +import mlarrow.util.*; + +type = 'uint8'; +data = uint8([1; 2; 3]); +valid = logical([0; 1; 0]); +name = 'uint8'; +uint8Variable = createVariableStruct(type, data, valid, name); + +type = 'uint16'; +data = uint16([1; 2; 3]); +valid = logical([0; 1; 0]); +name = 'uint16'; +uint16Variable = createVariableStruct(type, data, valid, name); + +type = 'uint32'; +data = uint32([1; 2; 3]); +valid = logical([0; 1; 0]); +name = 'uint32'; +uint32Variable = createVariableStruct(type, data, valid, name); + +type = 'uint64'; +data = uint64([1; 2; 3]); +valid = logical([0; 1; 0]); +name = 'uint64'; +uint64Variable = createVariableStruct(type, data, valid, name); + +type = 'int8'; +data = int8([1; 2; 3]); +valid = logical([0; 1; 0]); +name = 'int8'; +int8Variable = createVariableStruct(type, data, valid, name); + +type = 'int16'; +data = int16([1; 2; 3]); +valid = logical([0; 1; 0]); +name = 'int16'; +int16Variable = createVariableStruct(type, data, valid, name); + +type = 'int32'; +data = int32([1; 2; 3]); +valid = logical([0; 1; 0]); +name = 'int32'; +int32Variable = createVariableStruct(type, data, valid, name); + +type = 'int64'; +data = int64([1; 2; 3]); +valid = logical([0; 1; 0]); +name = 'int64'; +int64Variable = createVariableStruct(type, data, valid, name); + +type = 'single'; +data = single([1; 2; 3]); +valid = logical([0; 1; 0]); +name = 'single'; +singleVariable = createVariableStruct(type, data, valid, name); + +type = 'double'; +data = double([1; 2; 3]); +valid = logical([0; 1; 0]); +name = 'double'; +doubleVariable = createVariableStruct(type, data, valid, name); + +variables = [uint8Variable, ... + uint16Variable, ... + uint32Variable, ... + uint64Variable, ... + int8Variable, ... + int16Variable, ... + int32Variable, ... + int64Variable, ... + singleVariable, ... + doubleVariable]; + +numRows = 3; +numVariables = length(variables); + +metadata = createMetadataStruct(numRows, numVariables); +end diff --git a/src/arrow/matlab/test/util/featherMEXRoundTrip.m b/src/arrow/matlab/test/util/featherMEXRoundTrip.m new file mode 100644 index 000000000..49ab183ed --- /dev/null +++ b/src/arrow/matlab/test/util/featherMEXRoundTrip.m @@ -0,0 +1,22 @@ +function [variablesOut, metadataOut] = featherMEXRoundTrip(filename, variablesIn, metadataIn) +% FEATHERMEXROUNDTRIP Helper function for round tripping variables +% and metadata structs to a Feather file. + +% 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. + +featherwritemex(filename, variablesIn, metadataIn); +[variablesOut, metadataOut] = featherreadmex(filename); +end
\ No newline at end of file diff --git a/src/arrow/matlab/test/util/featherRoundTrip.m b/src/arrow/matlab/test/util/featherRoundTrip.m new file mode 100644 index 000000000..18f80562d --- /dev/null +++ b/src/arrow/matlab/test/util/featherRoundTrip.m @@ -0,0 +1,22 @@ +function tableOut = featherRoundTrip(filename, tableIn) +% FEATHERROUNDTRIP Helper function for round tripping a table +% to a Feather file. + +% 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. + +featherwrite(filename, tableIn); +tableOut = featherread(filename); +end
\ No newline at end of file |