Skip to content

Commit 67c0a37

Browse files
committed
New test for h5ex_tutr.
1 parent 94683c8 commit 67c0a37

28 files changed

Lines changed: 315 additions & 4 deletions

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,5 +41,6 @@ hdf5/*/*.h5
4141
/src/main/resources/h5ex_t/*.h5
4242
/src/main/resources/h5ex_t/att/*.h5
4343
/src/main/resources/h5ex_tutr/*.h5
44+
/src/main/resources/h5ex_tutr/att/*.h5
4445
/src/main/resources/h5ex_d/*.h5
4546
/src/main/resources/h5ex_d/*.data

src/main/java/org/hdf5javalib/dataclass/reference/HdfObjectReference.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,8 @@ public HdfObjectReference(byte[] bytes, ReferenceDatatype dt, boolean external)
9191
break;
9292
}
9393
}
94+
} else {
95+
9496
}
9597
this.dataspaceSelectionInstance = dataspaceSelectionReference.get();
9698
this.hdfDataObject = localHdfDataObject.get();
@@ -104,7 +106,7 @@ public HdfObjectReference(byte[] bytes, ReferenceDatatype dt, boolean external)
104106
currentNode = currentNode.getParent().getDataObject();
105107
}
106108
Collections.reverse(parents);
107-
String objectPathString = '/' + String.join("/", parents);
109+
String objectPathString = '/' + currentNode.getObjectName() + String.join("/", parents);
108110
this.hdfDataHolder = HdfDataHolder.ofScalar(
109111
new HdfString(objectPathString, new StringDatatype(
110112
StringDatatype.createClassAndVersion(),

src/main/java/org/hdf5javalib/examples/HDF5Examples/ReferenceRead.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ private void run() {
5858
// }
5959
try {
6060
// Path filePath = getResourcePath("HDF5Examples/h5ex_t_cpxcmpd.h5");
61-
Path filePath = getResourcePath("HDF5Examples/h5ex_t_cpxcmpd.h5");
61+
Path filePath = getResourcePath("h5ex_tutr/refer_deprec.h5");
6262
System.out.println(filePath.toFile().getAbsolutePath());
6363
try (SeekableByteChannel channel = Files.newByteChannel(filePath, StandardOpenOption.READ)) {
6464
HdfFileReader reader = new HdfFileReader(channel).readFile();

src/main/java/org/hdf5javalib/hdffile/dataobjects/messages/DataLayoutMessage.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -471,7 +471,7 @@ public HdfBTreeV1 getBTree() {
471471
@Override
472472
public String toString() {
473473
return "ChunkedStorage{" +
474-
", chunkedDataAddress=" + chunkedDataAddress +
474+
", chunkedDataAddress=" + (chunkedDataAddress.isUndefined()? HdfDisplayUtils.UNDEFINED :chunkedDataAddress) +
475475
", dimensionSizes=" + Arrays.toString(dimensionSizes) +
476476
", datasetElementSize=" + datasetElementSize +
477477
", bTree=" + bTree +

src/main/java/org/hdf5javalib/hdfjava/HdfFileReader.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -244,7 +244,7 @@ public <T extends HdfDataObject> Optional<T> getHdfDataObject(String path, Class
244244
return Optional.empty();
245245
} else if (compIndex == components.length && clazz.isAssignableFrom(child.get().getDataObject().getClass())) {
246246
return child.map(clazz::cast);
247-
} else if ( compIndex < components.length - 1 && HdfGroup.class.isAssignableFrom(child.get().getDataObject().getClass()) ) {
247+
} else if ( compIndex < components.length && HdfGroup.class.isAssignableFrom(child.get().getDataObject().getClass()) ) {
248248
currentGroup = (HdfGroup) child.get();
249249
} else {
250250
currentGroup = null;
Lines changed: 308 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,308 @@
1+
package org.hdf5javalib.examples.h5ex_tutr;
2+
3+
import org.hdf5javalib.dataclass.HdfData;
4+
import org.hdf5javalib.datasource.TypedDataSource;
5+
import org.hdf5javalib.datatype.FixedPointDatatype;
6+
import org.hdf5javalib.examples.ResourceLoader;
7+
import org.hdf5javalib.hdfjava.HdfDataset;
8+
import org.hdf5javalib.hdfjava.HdfFileReader;
9+
10+
import java.nio.channels.SeekableByteChannel;
11+
import java.util.Arrays;
12+
import java.util.function.IntBinaryOperator;
13+
14+
import static org.junit.jupiter.api.Assertions.assertArrayEquals;
15+
16+
import org.junit.jupiter.api.Test;
17+
18+
public class H5exTutrReadTest {
19+
20+
private int[][] toIntMatrix(HdfData[][] data) {
21+
int[][] res = new int[data.length][data[0].length];
22+
for (int i = 0; i < data.length; i++) {
23+
for (int j = 0; j < data[i].length; j++) {
24+
res[i][j] = data[i][j].getInstance(Long.class).intValue();
25+
}
26+
}
27+
return res;
28+
}
29+
30+
private double[][] toDoubleMatrix(HdfData[][] data) {
31+
double[][] res = new double[data.length][data[0].length];
32+
for (int i = 0; i < data.length; i++) {
33+
for (int j = 0; j < data[i].length; j++) {
34+
res[i][j] = data[i][j].getInstance(Double.class);
35+
}
36+
}
37+
return res;
38+
}
39+
40+
private int[] toIntArray(HdfData[] data) {
41+
int[] res = new int[data.length];
42+
for (int i = 0; i < data.length; i++) {
43+
res[i] = data[i].getInstance(Long.class).intValue();
44+
}
45+
return res;
46+
}
47+
48+
// private double[] toMixedArray(HdfData[] data) {
49+
// double[] res = new double[data.length];
50+
// for (int i = 0; i < data.length; i++) {
51+
// HdfData d = data[i];
52+
// if (d instanceof FixedPointDatatype) {
53+
// res[i] = d.getInstance(Long.class).doubleValue();
54+
// } else if (d.getDatatype() instanceof org.hdf5javalib.hdfjava.datatype.FloatingPointDatatype) {
55+
// res[i] = d.getInstance(Double.class);
56+
// }
57+
// }
58+
// return res;
59+
// }
60+
61+
private String[] toStringArray(HdfData[] data) {
62+
String[] res = new String[data.length];
63+
for (int i = 0; i < data.length; i++) {
64+
res[i] = data[i].getInstance(String.class);
65+
}
66+
return res;
67+
}
68+
69+
private int[][] generateExpectedIntMatrix(int rows, int cols, IntBinaryOperator op) {
70+
int[][] exp = new int[rows][cols];
71+
for (int i = 0; i < rows; i++) {
72+
for (int j = 0; j < cols; j++) {
73+
exp[i][j] = op.applyAsInt(i, j);
74+
}
75+
}
76+
return exp;
77+
}
78+
79+
@Test
80+
void testCmprss() throws Exception {
81+
try (SeekableByteChannel channel = ResourceLoader.loadResourceAsChannel("h5ex_tutr/cmprss.h5")) {
82+
HdfFileReader reader = new HdfFileReader(channel).readFile();
83+
HdfDataset dataSet = reader.getDataset("/Compressed_Data").orElseThrow();
84+
TypedDataSource<HdfData> dataSource = new TypedDataSource<>(channel, reader, dataSet, HdfData.class);
85+
HdfData[][] data = dataSource.readMatrix();
86+
int[][] expected = generateExpectedIntMatrix(100, 20, (i, j) -> i + j);
87+
assertArrayEquals(expected, toIntMatrix(data));
88+
}
89+
}
90+
91+
@Test
92+
void testDset() throws Exception {
93+
try (SeekableByteChannel channel = ResourceLoader.loadResourceAsChannel("h5ex_tutr/dset.h5")) {
94+
HdfFileReader reader = new HdfFileReader(channel).readFile();
95+
HdfDataset dataSet = reader.getDataset("/dset").orElseThrow();
96+
TypedDataSource<HdfData> dataSource = new TypedDataSource<>(channel, reader, dataSet, HdfData.class);
97+
HdfData[][] data = dataSource.readMatrix();
98+
int[][] expected = generateExpectedIntMatrix(4, 6, (i, j) -> i * 6 + j + 1);
99+
assertArrayEquals(expected, toIntMatrix(data));
100+
}
101+
}
102+
103+
@Test
104+
void testExtend() throws Exception {
105+
try (SeekableByteChannel channel = ResourceLoader.loadResourceAsChannel("h5ex_tutr/extend.h5")) {
106+
HdfFileReader reader = new HdfFileReader(channel).readFile();
107+
HdfDataset dataSet = reader.getDataset("/ExtendibleArray").orElseThrow();
108+
TypedDataSource<HdfData> dataSource = new TypedDataSource<>(channel, reader, dataSet, HdfData.class);
109+
HdfData[][] data = dataSource.readMatrix();
110+
int[][] expected = new int[10][3];
111+
for (int i = 0; i < 3; i++) {
112+
Arrays.fill(expected[i], 1);
113+
}
114+
for (int i = 3; i < 10; i++) {
115+
expected[i][0] = 2;
116+
expected[i][1] = 3;
117+
expected[i][2] = 4;
118+
}
119+
assertArrayEquals(expected, toIntMatrix(data));
120+
}
121+
}
122+
123+
@Test
124+
void testGroups() throws Exception {
125+
try (SeekableByteChannel channel = ResourceLoader.loadResourceAsChannel("h5ex_tutr/groups.h5")) {
126+
HdfFileReader reader = new HdfFileReader(channel).readFile();
127+
HdfDataset dataSet = reader.getDataset("/MyGroup/Group_A/dset2").orElseThrow();
128+
TypedDataSource<HdfData> dataSource = new TypedDataSource<>(channel, reader, dataSet, HdfData.class);
129+
HdfData[][] data = dataSource.readMatrix();
130+
int[][] expected = generateExpectedIntMatrix(2, 10, (i, j) -> j + 1);
131+
assertArrayEquals(expected, toIntMatrix(data));
132+
133+
dataSet = reader.getDataset("/MyGroup/dset1").orElseThrow();
134+
dataSource = new TypedDataSource<>(channel, reader, dataSet, HdfData.class);
135+
data = dataSource.readMatrix();
136+
expected = generateExpectedIntMatrix(3, 3, (i, j) -> j + 1);
137+
assertArrayEquals(expected, toIntMatrix(data));
138+
}
139+
}
140+
141+
@Test
142+
void testMount2() throws Exception {
143+
try (SeekableByteChannel channel = ResourceLoader.loadResourceAsChannel("h5ex_tutr/mount2.h5")) {
144+
HdfFileReader reader = new HdfFileReader(channel).readFile();
145+
HdfDataset dataSet = reader.getDataset("/D").orElseThrow();
146+
TypedDataSource<HdfData> dataSource = new TypedDataSource<>(channel, reader, dataSet, HdfData.class);
147+
HdfData[][] data = dataSource.readMatrix();
148+
int[][] expected = generateExpectedIntMatrix(4, 5, (i, j) -> i + j);
149+
assertArrayEquals(expected, toIntMatrix(data));
150+
}
151+
}
152+
153+
@Test
154+
void testRefere() throws Exception {
155+
try (SeekableByteChannel channel = ResourceLoader.loadResourceAsChannel("h5ex_tutr/refere.h5")) {
156+
HdfFileReader reader = new HdfFileReader(channel).readFile();
157+
HdfDataset dataSet = reader.getDataset("/B").orElseThrow();
158+
// TypedDataSource<HdfData> dataSource = new TypedDataSource<>(channel, reader, dataSet, HdfData.class);
159+
// HdfData[][] data = dataSource.readMatrix();
160+
// int[][] intData = toIntMatrix(data);
161+
// int[][] expected = {
162+
// {1, 1, 2, 3, 3, 4, 5, 5, 6},
163+
// {1, 2, 2, 3, 4, 4, 5, 6, 6}
164+
// };
165+
// assertArrayEquals(expected, intData);
166+
167+
dataSet = reader.getDataset("/R").orElseThrow();
168+
TypedDataSource<HdfData> dataSource = new TypedDataSource<>(channel, reader, dataSet, HdfData.class);
169+
HdfData[] data1 = dataSource.readVector();
170+
String[] actual = toStringArray(data1);
171+
assertArrayEquals(new String[]{"/A", "/B"}, actual);
172+
}
173+
}
174+
175+
@Test
176+
void testReferDeprec() throws Exception {
177+
try (SeekableByteChannel channel = ResourceLoader.loadResourceAsChannel("h5ex_tutr/refer_deprec.h5")) {
178+
HdfFileReader reader = new HdfFileReader(channel).readFile();
179+
HdfDataset dataSet = reader.getDataset("/dataset1").orElseThrow();
180+
TypedDataSource<HdfData> dataSource = new TypedDataSource<>(channel, reader, dataSet, HdfData.class);
181+
HdfData[] data = dataSource.readVector();
182+
int[] expected = {0, 1, 2, 3};
183+
assertArrayEquals(expected, toIntArray(data));
184+
185+
dataSet = reader.getDataset("/references").orElseThrow();
186+
dataSource = new TypedDataSource<>(channel, reader, dataSet, HdfData.class);
187+
data = dataSource.readVector();
188+
String[] actual = toStringArray(data);
189+
assertArrayEquals(new String[]{"/dataset1"}, actual);
190+
}
191+
}
192+
193+
@Test
194+
void testReferExtern1() throws Exception {
195+
try (SeekableByteChannel channel = ResourceLoader.loadResourceAsChannel("h5ex_tutr/refer_extern1.h5")) {
196+
HdfFileReader reader = new HdfFileReader(channel).readFile();
197+
HdfDataset dataSet = reader.getDataset("/dataset1").orElseThrow();
198+
TypedDataSource<HdfData> dataSource = new TypedDataSource<>(channel, reader, dataSet, HdfData.class);
199+
HdfData[] data = dataSource.readVector();
200+
int[] expected = {0, 1, 2, 3};
201+
assertArrayEquals(expected, toIntArray(data));
202+
}
203+
}
204+
205+
@Test
206+
void testRefReg() throws Exception {
207+
try (SeekableByteChannel channel = ResourceLoader.loadResourceAsChannel("h5ex_tutr/REF_REG.h5")) {
208+
HdfFileReader reader = new HdfFileReader(channel).readFile();
209+
HdfDataset dataSet = reader.getDataset("/MATRIX").orElseThrow();
210+
TypedDataSource<HdfData> dataSource = new TypedDataSource<>(channel, reader, dataSet, HdfData.class);
211+
HdfData[][] data = dataSource.readMatrix();
212+
int[][] expected = {
213+
{1, 1, 2, 3, 3, 4, 5, 5, 6},
214+
{1, 2, 2, 3, 4, 4, 5, 6, 6}
215+
};
216+
assertArrayEquals(expected, toIntMatrix(data));
217+
218+
// For /REGION_REFERENCES, assuming the library returns specific structures
219+
// Skipping detailed assertion for region references as the exact structure is unknown
220+
// Can add if more information is available
221+
}
222+
}
223+
224+
@Test
225+
void testSDS() throws Exception {
226+
try (SeekableByteChannel channel = ResourceLoader.loadResourceAsChannel("h5ex_tutr/SDS.h5")) {
227+
HdfFileReader reader = new HdfFileReader(channel).readFile();
228+
HdfDataset dataSet = reader.getDataset("/IntArray").orElseThrow();
229+
TypedDataSource<HdfData> dataSource = new TypedDataSource<>(channel, reader, dataSet, HdfData.class);
230+
HdfData[][] data = dataSource.readMatrix();
231+
int[][] expected = generateExpectedIntMatrix(5, 6, (i, j) -> i + j);
232+
assertArrayEquals(expected, toIntMatrix(data));
233+
}
234+
}
235+
236+
// @Test
237+
// void testSDScompound() throws Exception {
238+
// try (SeekableByteChannel channel = ResourceLoader.loadResourceAsChannel("h5ex_tutr/SDScompound.h5")) {
239+
// HdfFileReader reader = new HdfFileReader(channel).readFile();
240+
// HdfDataset dataSet = reader.getDataset("/ArrayOfStructures").orElseThrow();
241+
// TypedDataSource<HdfData> dataSource = new TypedDataSource<>(channel, reader, dataSet, HdfData.class);
242+
// HdfData[] data = dataSource.readVector();
243+
// double[] expected = {0, 1.0, 0.0, 1, 0.5, 1.0, 2, 1.0/3, 4.0, 3, 1.0/4, 9.0, 4, 1.0/5, 16.0, 5, 1.0/6, 25.0, 6, 1.0/7, 36.0, 7, 1.0/8, 49.0, 8, 1.0/9, 64.0, 9, 1.0/10, 81.0};
244+
// assertArrayEquals(expected, toMixedArray(data), 1e-5);
245+
// }
246+
// }
247+
248+
@Test
249+
void testSDSextendible() throws Exception {
250+
try (SeekableByteChannel channel = ResourceLoader.loadResourceAsChannel("h5ex_tutr/SDSextendible.h5")) {
251+
HdfFileReader reader = new HdfFileReader(channel).readFile();
252+
HdfDataset dataSet = reader.getDataset("/ExtendibleArray").orElseThrow();
253+
TypedDataSource<HdfData> dataSource = new TypedDataSource<>(channel, reader, dataSet, HdfData.class);
254+
HdfData[][] data = dataSource.readMatrix();
255+
int[][] expected = new int[10][5];
256+
for (int i = 0; i < 2; i++) {
257+
expected[i] = new int[]{1, 1, 1, 3, 3};
258+
}
259+
expected[2] = new int[]{1, 1, 1, 0, 0};
260+
for (int i = 3; i < 10; i++) {
261+
expected[i] = new int[]{2, 0, 0, 0, 0};
262+
}
263+
assertArrayEquals(expected, toIntMatrix(data));
264+
}
265+
}
266+
267+
@Test
268+
void testSelect() throws Exception {
269+
try (SeekableByteChannel channel = ResourceLoader.loadResourceAsChannel("h5ex_tutr/Select.h5")) {
270+
HdfFileReader reader = new HdfFileReader(channel).readFile();
271+
HdfDataset dataSet = reader.getDataset("/Matrix in file").orElseThrow();
272+
TypedDataSource<HdfData> dataSource = new TypedDataSource<>(channel, reader, dataSet, HdfData.class);
273+
HdfData[][] data = dataSource.readMatrix();
274+
int[][] expected = {
275+
{53, 1, 2, 0, 3, 4, 0, 5, 6, 0, 7, 8},
276+
{0, 9, 10, 0, 11, 12, 0, 13, 14, 0, 15, 16},
277+
{0, 17, 18, 0, 19, 20, 0, 21, 22, 0, 23, 24},
278+
{0, 0, 0, 59, 0, 61, 0, 0, 0, 0, 0, 0},
279+
{0, 25, 26, 0, 27, 28, 0, 29, 30, 0, 31, 32},
280+
{0, 33, 34, 0, 35, 36, 67, 37, 38, 0, 39, 40},
281+
{0, 41, 42, 0, 43, 44, 0, 45, 46, 0, 47, 48},
282+
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
283+
};
284+
assertArrayEquals(expected, toIntMatrix(data));
285+
}
286+
}
287+
288+
@Test
289+
void testSubset() throws Exception {
290+
try (SeekableByteChannel channel = ResourceLoader.loadResourceAsChannel("h5ex_tutr/subset.h5")) {
291+
HdfFileReader reader = new HdfFileReader(channel).readFile();
292+
HdfDataset dataSet = reader.getDataset("/IntArray").orElseThrow();
293+
TypedDataSource<HdfData> dataSource = new TypedDataSource<>(channel, reader, dataSet, HdfData.class);
294+
HdfData[][] data = dataSource.readMatrix();
295+
int[][] expected = {
296+
{1, 1, 1, 1, 1, 2, 2, 2, 2, 2},
297+
{1, 1, 5, 5, 5, 5, 2, 2, 2, 2},
298+
{1, 1, 5, 5, 5, 5, 2, 2, 2, 2},
299+
{1, 1, 5, 5, 5, 5, 2, 2, 2, 2},
300+
{1, 1, 1, 1, 1, 2, 2, 2, 2, 2},
301+
{1, 1, 1, 1, 1, 2, 2, 2, 2, 2},
302+
{1, 1, 1, 1, 1, 2, 2, 2, 2, 2},
303+
{1, 1, 1, 1, 1, 2, 2, 2, 2, 2}
304+
};
305+
assertArrayEquals(expected, toIntMatrix(data));
306+
}
307+
}
308+
}
6.09 KB
Binary file not shown.
2.12 KB
Binary file not shown.
2.16 KB
Binary file not shown.
4.12 KB
Binary file not shown.

0 commit comments

Comments
 (0)