Skip to content

Commit a82faff

Browse files
committed
bugfix: {h5,nc}exists: ensure names exactly match. Improve test coverage
1 parent 42af42d commit a82faff

File tree

5 files changed

+63
-47
lines changed

5 files changed

+63
-47
lines changed

+hdf5nc/+tests/test_hdf5.m

Lines changed: 29 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
% test our custom high-level HDF5 interface
2+
import hdf5nc.*
23

34
A0 = 42.;
45
A1 = [42.; 43.];
@@ -7,37 +8,44 @@
78
A3(:,:,2) = 2*A3;
89
A4(:,:,:,5) = A3;
910

10-
basic = [tempname, '.h5'];
11+
basic = tempname + ".h5";
1112
% create test data first, so that parallel tests works
12-
hdf5nc.h5save(basic, '/A0', A0)
13-
hdf5nc.h5save(basic, '/A1', A1)
14-
hdf5nc.h5save(basic, '/A2', A2)
15-
hdf5nc.h5save(basic, '/A3', A3)
16-
hdf5nc.h5save(basic, '/A4', A4)
13+
h5save(basic, '/A0', A0)
14+
h5save(basic, '/A1', A1)
15+
h5save(basic, '/A2', A2)
16+
h5save(basic, '/A3', A3)
17+
h5save(basic, '/A4', A4)
1718
%% test_auto_chunk_size
18-
assert(isequal(hdf5nc.auto_chunk_size([1500,2500,1000,500,100]), [12,20,8,8,2]), '5D chunk fail')
19-
assert(isequal(hdf5nc.auto_chunk_size([15,250,100]), [2,32,25]), '3D chunk fail')
20-
assert(isequal(hdf5nc.auto_chunk_size([15,250]), [15,250]), '2D small chunk fail')
19+
assert(isequal(auto_chunk_size([1500,2500,1000,500,100]), [12,20,8,8,2]), '5D chunk fail')
20+
assert(isequal(auto_chunk_size([15,250,100]), [2,32,25]), '3D chunk fail')
21+
assert(isequal(auto_chunk_size([15,250]), [15,250]), '2D small chunk fail')
2122
%% test_get_variables
22-
vars = hdf5nc.h5variables(basic);
23+
vars = h5variables(basic);
2324
assert(isequal(sort(vars),{'A0', 'A1', 'A2', 'A3', 'A4'}), 'missing variables')
2425
%% test_exists
25-
assert(hdf5nc.h5exists(basic, '/A3'), 'A3 exists')
26-
assert(~hdf5nc.h5exists(basic, '/oops'), 'oops not exist')
26+
e0 = h5exists(basic, '/A3');
27+
assert(isscalar(e0))
28+
assert(e0, 'A3 exists')
29+
30+
assert(~h5exists(basic, '/oops'), 'oops not exist')
31+
32+
e1 = h5exists(basic, ["A3", "oops"]);
33+
assert(isrow(e1))
34+
assert(all(e1 == [true, false]), 'h5exists array')
2735
%% test_size
28-
s = hdf5nc.h5size(basic, '/A0');
36+
s = h5size(basic, '/A0');
2937
assert(isscalar(s) && s==1, 'A0 shape')
3038

31-
s = hdf5nc.h5size(basic, '/A1');
39+
s = h5size(basic, '/A1');
3240
assert(isscalar(s) && s==2, 'A1 shape')
3341

34-
s = hdf5nc.h5size(basic, '/A2');
42+
s = h5size(basic, '/A2');
3543
assert(isvector(s) && isequal(s, [4,4]), 'A2 shape')
3644

37-
s = hdf5nc.h5size(basic, '/A3');
45+
s = h5size(basic, '/A3');
3846
assert(isvector(s) && isequal(s, [4,3,2]), 'A3 shape')
3947

40-
s = hdf5nc.h5size(basic, '/A4');
48+
s = h5size(basic, '/A4');
4149
assert(isvector(s) && isequal(s, [4,3,2,5]), 'A4 shape')
4250
%% test_read
4351
s = h5read(basic, '/A0');
@@ -55,13 +63,13 @@
5563
s = h5read(basic, '/A4');
5664
assert(ndims(s)==4 && isequal(s, A4), 'A4 read')
5765
%% test_coerce
58-
hdf5nc.h5save(basic, '/int32', A0, [], 'int32')
59-
hdf5nc.h5save(basic, '/int64', A0, [], 'int64')
60-
hdf5nc.h5save(basic, '/float32', A0, [], 'float32')
66+
h5save(basic, '/int32', A0, [], 'int32')
67+
h5save(basic, '/int64', A0, [], 'int64')
68+
h5save(basic, '/float32', A0, [], 'float32')
6169

6270
assert(isa(h5read(basic, '/int32'), 'int32'), 'int32')
6371
assert(isa(h5read(basic, '/int64'), 'int64'), 'int64')
6472
assert(isa(h5read(basic, '/float32'), 'single'), 'float32')
6573
%% test_rewrite
66-
hdf5nc.h5save(basic, '/A2', 3*magic(4))
74+
h5save(basic, '/A2', 3*magic(4))
6775
assert(isequal(h5read(basic, '/A2'), 3*magic(4)), 'rewrite 2D fail')

+hdf5nc/+tests/test_netcdf.m

Lines changed: 26 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
% test our custom high-level NetCDF4 interface
2+
import hdf5nc.*
23

34
A0 = 42.;
45
A1 = [42.; 43.];
@@ -7,37 +8,41 @@
78
A3(:,:,2) = 2*A3;
89
A4(:,:,:,5) = A3;
910

10-
basic = [tempname, '.nc'];
11+
basic = tempname + ".nc";
1112

12-
if hdf5nc.isoctave
13-
pkg('load','netcdf')
14-
end
1513
% create test data first, so that parallel tests works
16-
hdf5nc.ncsave(basic, 'A0', A0)
17-
hdf5nc.ncsave(basic, 'A1', A1)
18-
hdf5nc.ncsave(basic, 'A2', A2, {'x2', size(A2,1), 'y2', size(A2,2)})
19-
hdf5nc.ncsave(basic, 'A3', A3, {'x3', size(A3,1), 'y3', size(A3,2), 'z3', size(A3,3)})
20-
hdf5nc.ncsave(basic, 'A4', A4, {'x4', size(A4,1), 'y4', size(A4,2), 'z4', size(A4,3), 'w4', size(A4,4)})
14+
ncsave(basic, 'A0', A0)
15+
ncsave(basic, 'A1', A1)
16+
ncsave(basic, 'A2', A2, {'x2', size(A2,1), 'y2', size(A2,2)})
17+
ncsave(basic, 'A3', A3, {'x3', size(A3,1), 'y3', size(A3,2), 'z3', size(A3,3)})
18+
ncsave(basic, 'A4', A4, {'x4', size(A4,1), 'y4', size(A4,2), 'z4', size(A4,3), 'w4', size(A4,4)})
2119
%% test_get_variables
22-
vars = hdf5nc.ncvariables(basic);
20+
vars = ncvariables(basic);
2321
assert(isequal(sort(vars),{'A0', 'A1', 'A2', 'A3', 'A4'}), 'missing variables')
2422
%% test_exists
25-
assert(hdf5nc.ncexists(basic, 'A3'), 'A3 exists')
26-
assert(~hdf5nc.ncexists(basic, 'oops'), 'oops not exist')
23+
e0 = ncexists(basic, 'A3');
24+
assert(isscalar(e0))
25+
assert(e0, 'A3 exists')
26+
27+
assert(~ncexists(basic, '/oops'), 'oops not exist')
28+
29+
e1 = ncexists(basic, ["A3", "oops"]);
30+
assert(isrow(e1))
31+
assert(all(e1 == [true, false]), 'ncexists array')
2732
%% test_size
28-
s = hdf5nc.ncsize(basic, 'A0');
33+
s = ncsize(basic, 'A0');
2934
assert(isscalar(s) && s==1, 'A0 shape')
3035

31-
s = hdf5nc.ncsize(basic, 'A1');
36+
s = ncsize(basic, 'A1');
3237
assert(isscalar(s) && s==2, 'A1 shape')
3338

34-
s = hdf5nc.ncsize(basic, 'A2');
39+
s = ncsize(basic, 'A2');
3540
assert(isvector(s) && isequal(s, [4,4]), 'A2 shape')
3641

37-
s = hdf5nc.ncsize(basic, 'A3');
42+
s = ncsize(basic, 'A3');
3843
assert(isvector(s) && isequal(s, [4,3,2]), 'A3 shape')
3944

40-
s = hdf5nc.ncsize(basic, 'A4');
45+
s = ncsize(basic, 'A4');
4146
assert(isvector(s) && isequal(s, [4,3,2,5]), 'A4 shape')
4247
%% test_read
4348
s = ncread(basic, '/A0');
@@ -55,13 +60,13 @@
5560
s = ncread(basic, '/A4');
5661
assert(ndims(s)==4 && isequal(s, A4), 'A4 read')
5762
%% test_coerce
58-
hdf5nc.ncsave(basic, 'int32', A0, [], 'int32')
59-
hdf5nc.ncsave(basic, 'int64', A0, [], 'int64')
60-
hdf5nc.ncsave(basic, 'float32', A0, [], 'float32')
63+
ncsave(basic, 'int32', A0, [], 'int32')
64+
ncsave(basic, 'int64', A0, [], 'int64')
65+
ncsave(basic, 'float32', A0, [], 'float32')
6166

6267
assert(isa(ncread(basic, 'int32'), 'int32'), 'int32')
6368
assert(isa(ncread(basic, 'int64'), 'int64'), 'int64')
6469
assert(isa(ncread(basic, 'float32'), 'single'), 'float32')
6570
%% test_rewrite
66-
hdf5nc.ncsave(basic, 'A2', 3*magic(4))
71+
ncsave(basic, 'A2', 3*magic(4))
6772
assert(isequal(ncread(basic, 'A2'), 3*magic(4)), 'rewrite 2D fail')

+hdf5nc/h5exists.m

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44
% filename: HDF5 filename
55
% varname: name of variable inside HDF5 file
66
%
7-
% exists: boolean
7+
% exists: boolean (scalar or vector)
8+
89
arguments
910
filename (1,1) string
1011
varnames (1,:) string
@@ -13,6 +14,6 @@
1314
i = startsWith(varnames, "/");
1415
varnames(i) = extractAfter(varnames(i), 1);
1516

16-
exists = contains(varnames, hdf5nc.h5variables(filename));
17+
exists = ismember(varnames, hdf5nc.h5variables(filename));
1718

1819
end % function

+hdf5nc/h5variables.m

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616

1717
if group ~= ""
1818
gs = finf.Groups;
19-
i = contains({gs(:).Name}, group);
19+
i = string({gs(:).Name}) == group;
2020
if ~any(i)
2121
return
2222
end

+hdf5nc/ncexists.m

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,14 @@
44
% filename: NetCDF4 filename
55
% varname: name of variable inside file
66
%
7-
% exists: boolean
7+
% exists: boolean (scalar or vector)
8+
89
arguments
910
filename (1,1) string
1011
varnames (1,:) string
1112
end
1213

13-
exists = contains(varnames, hdf5nc.ncvariables(filename));
14+
% NOT contains because we want exact string match
15+
exists = ismember(varnames, hdf5nc.ncvariables(filename));
1416

1517
end % function

0 commit comments

Comments
 (0)