summaryrefslogtreecommitdiffstats
path: root/src/arrow/matlab/test
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-21 11:54:28 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-21 11:54:28 +0000
commite6918187568dbd01842d8d1d2c808ce16a894239 (patch)
tree64f88b554b444a49f656b6c656111a145cbbaa28 /src/arrow/matlab/test
parentInitial commit. (diff)
downloadceph-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-xsrc/arrow/matlab/test/tfeather.m232
-rw-r--r--src/arrow/matlab/test/tfeathermex.m76
-rw-r--r--src/arrow/matlab/test/util/createTable.m68
-rw-r--r--src/arrow/matlab/test/util/createVariablesAndMetadataStructs.m97
-rw-r--r--src/arrow/matlab/test/util/featherMEXRoundTrip.m22
-rw-r--r--src/arrow/matlab/test/util/featherRoundTrip.m22
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