|
| 1 | +@testset "Dataspaces" begin |
| 2 | + hsize_t = HDF5.hsize_t |
| 3 | + # Reference objects without using high-level API |
| 4 | + ds_null = HDF5.Dataspace(HDF5.h5s_create(HDF5.H5S_NULL)) |
| 5 | + ds_scalar = HDF5.Dataspace(HDF5.h5s_create(HDF5.H5S_SCALAR)) |
| 6 | + ds_zerosz = HDF5.Dataspace(HDF5.h5s_create_simple(1, hsize_t[0], hsize_t[0])) |
| 7 | + ds_vector = HDF5.Dataspace(HDF5.h5s_create_simple(1, hsize_t[5], hsize_t[5])) |
| 8 | + ds_matrix = HDF5.Dataspace(HDF5.h5s_create_simple(2, hsize_t[7, 5], hsize_t[7, 5])) |
| 9 | + ds_maxdim = HDF5.Dataspace(HDF5.h5s_create_simple(2, hsize_t[7, 5], hsize_t[20, 20])) |
| 10 | + ds_unlim = HDF5.Dataspace(HDF5.h5s_create_simple(1, hsize_t[1], [HDF5.H5S_UNLIMITED])) |
| 11 | + |
| 12 | + # Testing basic property accessors of dataspaces |
| 13 | + |
| 14 | + @test isvalid(ds_scalar) |
| 15 | + |
| 16 | + @test ndims(ds_null) === 0 |
| 17 | + @test ndims(ds_scalar) === 0 |
| 18 | + @test ndims(ds_zerosz) === 1 |
| 19 | + @test ndims(ds_vector) === 1 |
| 20 | + @test ndims(ds_matrix) === 2 |
| 21 | + |
| 22 | + # Test that properties of existing datasets can be extracted. |
| 23 | + # Note: Julia reverses the order of dimensions when using the high-level API versus |
| 24 | + # the dimensions used above to create the reference objects. |
| 25 | + @test size(ds_null) === () |
| 26 | + @test size(ds_scalar) === () |
| 27 | + @test size(ds_zerosz) === (0,) |
| 28 | + @test size(ds_vector) === (5,) |
| 29 | + @test size(ds_matrix) === (5, 7) |
| 30 | + @test size(ds_maxdim) === (5, 7) |
| 31 | + |
| 32 | + @test size(ds_null, 5) === 1 |
| 33 | + @test size(ds_scalar, 5) === 1 |
| 34 | + @test size(ds_zerosz, 5) === 1 |
| 35 | + @test size(ds_vector, 5) === 1 |
| 36 | + @test size(ds_matrix, 5) === 1 |
| 37 | + @test size(ds_maxdim, 5) === 1 |
| 38 | + @test_throws ArgumentError("invalid dimension d; must be positive integer") size(ds_null, 0) |
| 39 | + @test_throws ArgumentError("invalid dimension d; must be positive integer") size(ds_scalar, -1) |
| 40 | + |
| 41 | + @test length(ds_null) === 0 |
| 42 | + @test length(ds_scalar) === 1 |
| 43 | + @test length(ds_zerosz) === 0 |
| 44 | + @test length(ds_vector) === 5 |
| 45 | + @test length(ds_matrix) === 35 |
| 46 | + @test length(ds_maxdim) === 35 |
| 47 | + |
| 48 | + @test isempty(ds_null) |
| 49 | + @test !isempty(ds_scalar) |
| 50 | + @test isempty(ds_zerosz) |
| 51 | + @test !isempty(ds_vector) |
| 52 | + |
| 53 | + @test HDF5.isnull(ds_null) |
| 54 | + @test !HDF5.isnull(ds_scalar) |
| 55 | + @test !HDF5.isnull(ds_zerosz) |
| 56 | + @test !HDF5.isnull(ds_vector) |
| 57 | + |
| 58 | + @test HDF5.get_dims(ds_null) === ((), ()) |
| 59 | + @test HDF5.get_dims(ds_scalar) === ((), ()) |
| 60 | + @test HDF5.get_dims(ds_zerosz) === ((0,), (0,)) |
| 61 | + @test HDF5.get_dims(ds_vector) === ((5,), (5,)) |
| 62 | + @test HDF5.get_dims(ds_matrix) === ((5, 7), (5, 7)) |
| 63 | + @test HDF5.get_dims(ds_maxdim) === ((5, 7), (20, 20)) |
| 64 | + @test HDF5.get_dims(ds_unlim) === ((1,), (-1,)) |
| 65 | + |
| 66 | + # Can create new copies |
| 67 | + ds_tmp = copy(ds_maxdim) |
| 68 | + ds_tmp2 = HDF5.Dataspace(ds_tmp.id) # copy of ID, but new Julia object |
| 69 | + @test ds_tmp.id == ds_tmp2.id != ds_maxdim.id |
| 70 | + # Equality and hashing |
| 71 | + @test ds_tmp == ds_maxdim |
| 72 | + @test ds_tmp !== ds_maxdim |
| 73 | + @test hash(ds_tmp) != hash(ds_maxdim) |
| 74 | + @test ds_tmp == ds_tmp2 |
| 75 | + @test ds_tmp !== ds_tmp2 |
| 76 | + @test hash(ds_tmp) == hash(ds_tmp2) |
| 77 | + |
| 78 | + # Behavior of closing dataspace objects |
| 79 | + close(ds_tmp) |
| 80 | + @test ds_tmp.id == -1 |
| 81 | + @test !isvalid(ds_tmp) |
| 82 | + @test !isvalid(ds_tmp2) |
| 83 | + |
| 84 | + # Validity checking in high-level operations |
| 85 | + @test_throws ErrorException("File or object has been closed") copy(ds_tmp) |
| 86 | + @test_throws ErrorException("File or object has been closed") ndims(ds_tmp) |
| 87 | + @test_throws ErrorException("File or object has been closed") size(ds_tmp) |
| 88 | + @test_throws ErrorException("File or object has been closed") size(ds_tmp, 1) |
| 89 | + @test_throws ErrorException("File or object has been closed") length(ds_tmp) |
| 90 | + @test_throws ErrorException("File or object has been closed") ds_tmp == ds_tmp2 |
| 91 | + @test close(ds_tmp) === nothing # no error |
| 92 | + |
| 93 | + # Test ability to create explicitly-sized dataspaces |
| 94 | + |
| 95 | + @test dataspace(()) == ds_scalar |
| 96 | + @test dataspace((5,)) == ds_vector |
| 97 | + @test dataspace((5, 7)) == ds_matrix != ds_maxdim |
| 98 | + @test dataspace((5, 7), max_dims = (20, 20)) == ds_maxdim != ds_matrix |
| 99 | + @test dataspace((1,), max_dims = (-1,)) == ds_unlim |
| 100 | + # for ≥ 2 numbers, same as single tuple argument |
| 101 | + @test dataspace(5, 7) == ds_matrix |
| 102 | + @test dataspace(5, 7, 1) == dataspace((5, 7, 1)) |
| 103 | + |
| 104 | + # Test dataspaces derived from data |
| 105 | + |
| 106 | + @test dataspace(nothing) == ds_null |
| 107 | + @test dataspace(HDF5.EmptyArray{Bool}()) == ds_null |
| 108 | + |
| 109 | + @test dataspace(fill(1.0)) == ds_scalar |
| 110 | + @test dataspace(1) == ds_scalar |
| 111 | + @test dataspace(1 + 1im) == ds_scalar |
| 112 | + @test dataspace("string") == ds_scalar |
| 113 | + |
| 114 | + @test dataspace(zeros(0)) == ds_zerosz |
| 115 | + @test dataspace(zeros(0, 0)) != ds_zerosz |
| 116 | + @test dataspace(zeros(5, 7)) == ds_matrix |
| 117 | + @test dataspace(HDF5.VLen([[1]])) == dataspace((1,)) |
| 118 | + @test dataspace(HDF5.VLen([[1], [2]])) == dataspace((2,)) |
| 119 | + |
| 120 | + # Constructing dataspace for/from HDF5 dataset or attribute |
| 121 | + |
| 122 | + mktemp() do path, io |
| 123 | + close(io) |
| 124 | + h5open(path, "w") do hid |
| 125 | + dset = create_dataset(hid, "dset", datatype(Int), ds_matrix) |
| 126 | + attr = create_attribute(dset, "attr", datatype(Bool), ds_vector) |
| 127 | + @test dataspace(dset) == ds_matrix |
| 128 | + @test dataspace(dset) !== ds_matrix |
| 129 | + @test dataspace(attr) == ds_vector |
| 130 | + @test dataspace(attr) !== ds_vector |
| 131 | + close(dset) |
| 132 | + close(attr) |
| 133 | + @test_throws ErrorException("File or object has been closed") dataspace(dset) |
| 134 | + @test_throws ErrorException("File or object has been closed") dataspace(attr) |
| 135 | + end |
| 136 | + end |
| 137 | +end |
0 commit comments