Files
nappMATLAB-toolbox/utils/h5tools-matlab-main/test/DatasetTest.m
T

406 lines
16 KiB
Matlab

classdef DatasetTest < matlab.unittest.TestCase
% HDFTEST
%
% Description:
% Tests MATLAB datatype I/O to HDF5
%
% Parent:
% matlab.unittest.TestCase
%
% Use:
% result = runtests('DatasetTest.m')
%
% Datatypes tested
% - double (scalar, 2D, 3D)
% - uint8 (scalar)
% - logical (true, false)
% - string (scalar, 2D)
% - char
% - enum
%
% See also:
% runH5toolsTestSuite
% -------------------------------------------------------------------------
properties
FILE = [fullfile(cd, 'Dataset.h5')];
end
methods (TestClassSetup)
function createFile(testCase)
h5tools.createFile(testCase.FILE, true);
end
end
% MATLAB text datatypes
methods (Test, TestTags=["String", "Text"])
function StringScalar(testCase)
input = "abc";
h5tools.write(testCase.FILE, '/', 'StringScalar', input);
output = h5tools.read(testCase.FILE, '/', 'StringScalar');
testCase.verifyEqual(output, input);
end
function StringArray(testCase)
input = ["abc", "def", "ghi"];
h5tools.write(testCase.FILE, '/', 'StringArray', input);
output = h5tools.read(testCase.FILE, '/', 'StringArray');
testCase.verifyEqual(output, input);
end
end
methods (Test, TestTags=["Char", "Text"])
function Char(testCase)
input = 'abcdefghi';
h5tools.write(testCase.FILE, '/', 'Char', input);
output = h5tools.read(testCase.FILE, '/', 'Char');
testCase.verifyEqual(output, input);
end
end
methods (Test, TestTags=["CellStr", "Text"])
function CellstrRow(testCase)
input = {'abc', 'def', 'ghi'};
h5tools.write(testCase.FILE, '/', 'CellstrRow', input);
output = h5tools.read(testCase.FILE, '/', 'CellstrRow');
testCase.verifyEqual(output, input);
end
function CellstrCol(testCase)
input = {'abc', 'def', 'ghi'}';
h5tools.write(testCase.FILE, '/', 'CellstrCol', input);
output = h5tools.read(testCase.FILE, '/', 'CellstrCol');
testCase.verifyEqual(output, input);
end
function CellstrScalar(testCase)
input = {'abc'};
h5tools.write(testCase.FILE, '/', 'CellstrScalar', input);
output = h5tools.read(testCase.FILE, '/', 'CellstrScalar');
testCase.verifyEqual(output, input);
end
function Cellstr2D(testCase)
input = {'abc', 'def', 'ghi'; 'jkl', 'mno', 'pqr'};
h5tools.write(testCase.FILE, '/', 'Cellstr2D', input);
output = h5tools.read(testCase.FILE, '/', 'Cellstr2D');
testCase.verifyEqual(output, input);
end
end
methods (Test, TestTags={'Boolean'})
function LogicalScalar(testCase)
h5tools.datasets.makeLogicalDataset(testCase.FILE, '/', 'LogicalFalse', 0);
testCase.verifyFalse(h5tools.datasets.readEnumTypeDataset(...
testCase.FILE, '/', 'LogicalFalse'));
h5tools.datasets.makeLogicalDataset(testCase.FILE, '/', 'LogicalTrue', 1);
testCase.verifyTrue(h5tools.datasets.readEnumTypeDataset(...
testCase.FILE, '/', 'LogicalTrue'));
end
function Logical2D(testCase)
input = [false, true, false; true, true, false];
h5tools.datasets.makeLogicalDataset(testCase.FILE, '/', 'Logical2D', input);
output = h5tools.datasets.readEnumTypeDataset(testCase.FILE, '/', 'Logical2D');
testCase.verifyEqual(output, input);
end
end
methods (Test, TestTags=["Datetime"])
function DatetimeScalar(testCase)
input = datetime('now', 'Format', 'yyyyMMdd');
h5tools.write(testCase.FILE, '/', 'Datetime', input);
output = h5tools.read(testCase.FILE, '/', 'Datetime');
testCase.verifyTrue(isdatetime(output));
test.verifyDatesEqual(testCase, output, input);
end
function DatetimeVector(testCase)
input = datetime('now', 'Format', 'yyyyMMdd');
input = repmat(input, [2, 1]);
h5tools.write(testCase.FILE, '/', 'DatetimeColumn', input);
output = h5tools.read(testCase.FILE, '/', 'DatetimeColumn');
testCase.verifyTrue(isdatetime(output));
test.verifyDatesEqual(testCase, output, input);
end
end
methods (Test, TestTags=["Numeric", "Float"])
function DoubleScalar(testCase)
input = 2;
h5tools.write(testCase.FILE, '/', 'DoubleScalar', input);
output = h5tools.read(testCase.FILE, '/', 'DoubleScalar');
testCase.verifyEqual(output, input);
end
function Double2D(testCase)
input = [1.5 2.5 3.5; 4.2 3.2 1.2];
h5tools.write(testCase.FILE, '/', 'Double2D', input);
output = h5tools.read(testCase.FILE, '/', 'Double2D');
testCase.verifyEqual(output, input);
end
function Double3D(testCase)
input = cat(3, [1 2 3; 4 5 6], [7 8 9; 10 11 12]);
h5tools.write(testCase.FILE, '/', 'Double3D', input);
output = h5tools.read(testCase.FILE, '/', 'Double3D');
testCase.verifyEqual(output, input);
end
function SingleArray(testCase)
input = single(magic(5));
%input = double(magic(5));
h5tools.write(testCase.FILE, '/', 'SingleArray', input);
output = h5tools.read(testCase.FILE, '/', 'SingleArray');
testCase.verifyEqual(output, input);
end
end
methods (Test, TestTags=["Numeric", "Integer"])
function Uint8Scalar(testCase)
input = uint8(1);
h5tools.write(testCase.FILE, '/', 'UInt8', input);
output = h5tools.read(testCase.FILE, '/', 'UInt8');
testCase.verifyEqual(output, input);
end
function Uint8Array(testCase)
input = uint8(magic(5));
h5tools.write(testCase.FILE, '/', 'UInt8Array', input);
output = h5tools.read(testCase.FILE, '/', 'UInt8Array');
testCase.verifyEqual(output, input);
end
function Int8Array(testCase)
input = int8(magic(5));
h5tools.write(testCase.FILE, '/', 'Int8Array', input);
output = h5tools.read(testCase.FILE, '/', 'Int8Array');
testCase.verifyEqual(output, input);
end
function Int16Array(testCase)
input = int16(magic(5));
h5tools.write(testCase.FILE, '/', 'Int16Array', input);
output = h5tools.read(testCase.FILE, '/', 'Int16Array');
testCase.verifyEqual(output, input);
end
function UInt16Array(testCase)
input = uint16(magic(5));
h5tools.write(testCase.FILE, '/', 'UInt16Array', input);
output = h5tools.read(testCase.FILE, '/', 'UInt16Array');
testCase.verifyEqual(output, input);
end
function Int32Array(testCase)
input = int32(magic(5));
h5tools.write(testCase.FILE, '/', 'Int32Array', input);
output = h5tools.read(testCase.FILE, '/', 'Int32Array');
testCase.verifyEqual(output, input);
end
function UInt32Array(testCase)
input = uint32(magic(5));
h5tools.write(testCase.FILE, '/', 'UInt32Array', input);
output = h5tools.read(testCase.FILE, '/', 'UInt32Array');
testCase.verifyEqual(output, input);
end
function Int64Array(testCase)
input = int64(magic(5));
h5tools.write(testCase.FILE, '/', 'Int64Array', input);
output = h5tools.read(testCase.FILE, '/', 'Int64Array');
testCase.verifyEqual(output, input);
end
function UInt64Array(testCase)
input = uint64(magic(5));
h5tools.write(testCase.FILE, '/', 'UInt64Array', input);
output = h5tools.read(testCase.FILE, '/', 'UInt64Array');
testCase.verifyEqual(output, input);
end
end
methods (Test, TestTags={'Struct'})
function ScalarStruct(testCase)
input = struct('A', 1, 'B', 2);
h5tools.write(testCase.FILE, '/', 'ScalarStruct', input);
output = h5tools.read(testCase.FILE, '/', 'ScalarStruct');
testCase.verifyEqual(output, input);
end
function ScalarStructMultiType(testCase)
input = struct('A', 1, 'B', "hello");
h5tools.write(testCase.FILE, '/', 'ScalarStructMulti', input);
output = h5tools.read(testCase.FILE, '/', 'ScalarStructMulti');
testCase.verifyEqual(output, input);
end
function UnequalStruct(testCase)
import matlab.unittest.constraints.Throws
input = struct('A', (1:3)', 'B', 2);
h5tools.write(testCase.FILE, '/', 'UnequalStruct', input);
output = h5tools.read(testCase.FILE, '/', 'UnequalStruct');
testCase.verifyEqual(output, input);
end
end
methods (Test, TestTags=["Table"])
function testTable(testCase)
input = table(...
rangeCol(1,4), {'a'; 'b'; 'c'; 'd'}, ["a", "b", "c", "d"]', uint8(1:4)',...
'VariableNames', {'Numbers', 'Characters', 'Strings', 'Integers'});
h5tools.write(testCase.FILE, '/', 'Table', input);
output = h5tools.read(testCase.FILE, '/', 'Table');
testCase.verifyEqual(output, input);
end
function testTableIntegers(testCase)
input = table(...
int8(1:3)', int16(1:3)', int32(1:3)', int64(1:3)',...
'VariableNames', {'Int8', 'Int16', 'Int32', 'Int64'});
h5tools.write(testCase.FILE, '/', 'IntTable', input);
output = h5tools.read(testCase.FILE, '/', 'IntTable');
testCase.verifyEqual(output, input);
input = table(...
single(1:3)', uint16(1:3)', uint32(1:3)', uint64(1:3)',...
'VariableNames', {'Int8', 'Int16', 'Int32', 'Int64'});
h5tools.write(testCase.FILE, '/', 'IntTable2', input);
output = h5tools.read(testCase.FILE, '/', 'IntTable2');
testCase.verifyEqual(output, input);
end
function testTableMetadata(testCase)
input = table((1:3)', (4:6)',...
'RowNames', {'A', 'B', 'C'});
input.Properties.VariableUnits = {'pA', 'mV'};
h5tools.write(testCase.FILE, '/', 'TableWithMetadata', input);
output = h5tools.read(testCase.FILE, '/', 'TableWithMetadata');
testCase.verifyEqual(input, output);
assignin('base', 'tablemetadata', output);
end
function testTimeTable(testCase)
input = timetable(...
seconds(1:4)', {'a'; 'b'; 'c'; 'd'}, ["a", "b", "c", "d"]',...
'VariableNames', {'Characters', 'Strings'});
h5tools.write(testCase.FILE, '/', 'TimeTable', input);
output = h5tools.read(testCase.FILE, '/', 'TimeTable');
testCase.verifyEqual(output, input);
end
end
methods (Test, TestTags={'Enum'})
function EnumScalar(testCase)
input = test.EnumClass.GROUPTWO;
h5tools.write(testCase.FILE, '/', 'EnumScalar', input);
output = h5tools.read(testCase.FILE, '/', 'EnumScalar');
testCase.verifyEqual(output, input);
end
function EnumArray(testCase)
input = [test.EnumClass.GROUPONE, test.EnumClass.GROUPONE; ...
test.EnumClass.GROUPTWO, test.EnumClass.GROUPTHREE];
h5tools.write(testCase.FILE, '/', 'EnumArray', input);
output = h5tools.read(testCase.FILE, '/', 'EnumArray');
testCase.verifyEqual(output, input);
end
function EnumOffPath(testCase)
import matlab.unittest.constraints.Throws
import matlab.unittest.constraints.IssuesWarnings
% fakeEnum = 'NotAnEnum.GROUPONE';
h5tools.datasets.makeCharDataset(testCase.FILE, '/', 'EnumOffPath', 'GROUPONE');
h5tools.writeatt(testCase.FILE, '/EnumOffPath', 'Class', 'enum',...
'EnumClass', 'NotAnEnum');
testCase.verifyThat(...
@() h5tools.datasets.readDatasetByType(testCase.FILE, '/', 'EnumOffPath'),...
IssuesWarnings("read:UnknownEnumerationClass"));
end
function EnumBadType(testCase)
import matlab.unittest.constraints.Throws
import matlab.unittest.constraints.IssuesWarnings
% fakeEnum = 'EnumClass.GROUPFOUR';
h5tools.datasets.makeCharDataset(testCase.FILE, '/', 'EnumBadType', 'GROUPFOUR');
h5tools.writeatt(testCase.FILE, '/EnumBadType', 'Class', 'enum',...
'EnumClass', class(test.EnumClass.GROUPONE));
testCase.verifyThat(...
@() h5tools.datasets.readDatasetByType(testCase.FILE, '/', 'EnumBadType'),...
IssuesWarnings("read:UnknownEnumerationType"));
end
end
methods (Test, TestTags={'Duration'})
function Seconds2D(testCase)
input = seconds(1:5);
h5tools.write(testCase.FILE, '/', 'Seconds2D', input);
output = h5tools.read(testCase.FILE, '/', 'Seconds2D');
testCase.verifyEqual(output, input);
end
end
methods (Test, TestTags=["Misc"])
function Imref2d(testCase)
input = imref2d([242, 360]);
h5tools.write(testCase.FILE, '/', 'Imref2d', input);
output = h5tools.read(testCase.FILE, '/', 'Imref2d');
testCase.verifyEqual(output, input);
end
function Simtform2d(testCase)
input = simtform2d(3, 30, [10 20.5]);
h5tools.write(testCase.FILE, '/', 'Simtform2d', input);
output = h5tools.read(testCase.FILE, '/', 'Simtform2d');
testCase.verifyEqual(output, input);
end
function Affine2d(testCase)
input = affine2d(eye(3));
h5tools.write(testCase.FILE, '/', 'Affine2d', input);
output = h5tools.read(testCase.FILE, '/', 'Affine2d');
testCase.verifyEqual(output, input);
end
end
methods (Test, TestTags=["Group"])
function AutoCreateGroup(testCase)
% Test auto creation of parent group
h5tools.write(testCase.FILE, '/NewGroup', 'Dataset', magic(5));
groupNames = h5tools.collectGroups(testCase.FILE);
testCase.verifyEqual(nnz(endsWith(groupNames, 'NewGroup')), 1);
end
end
methods (Test, TestTags=["Dataset", "Numeric", "Append"])
function AppendToDataset(testCase)
% Two datasets [N x 10]
data1 = randn(3, 10); data2 = randn(2, 10);
% Write the first dataset
h5tools.write(testCase.FILE, '/', 'DatasetToAppend', data1,...
[Inf, size(data1,2)], 'ChunkSize', [1, size(data1, 2)]);
% Append the second dataset
h5tools.write(testCase.FILE, '/', 'DatasetToAppend', data2);
output = h5tools.read(testCase.FILE, '/', 'DatasetToAppend');
testCase.verifyEqual(output, [data1; data2]);
end
end
methods (Test, TestTags=["Dataset", "Deletion"])
function DeleteDataset(testCase)
% Create a dataset and then delete it
h5tools.write(testCase.FILE, '/', 'DatasetToDelete', magic(5));
testCase.verifyTrue(ismember("/DatasetToDelete", h5tools.collectDatasets(testCase.FILE)));
h5tools.deleteObject(testCase.FILE, '/DatasetToDelete');
testCase.verifyFalse(ismember("/DatasetToDelete", h5tools.collectDatasets(testCase.FILE)));
end
end
end