Skip to content

Commit

Permalink
added additional test for compound types
Browse files Browse the repository at this point in the history
  • Loading branch information
jreadey committed Oct 25, 2024
1 parent 87ef7a2 commit 00e20f1
Show file tree
Hide file tree
Showing 2 changed files with 128 additions and 1 deletion.
100 changes: 99 additions & 1 deletion tests/integ/value_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -4037,7 +4037,7 @@ def testCreateArrayDataset(self):
array_dims = [5]
num_arrays = 3

datatype = {
array_datatype = {
"class": "H5T_ARRAY",
"base": {
"class": "H5T_INTEGER",
Expand All @@ -4046,6 +4046,12 @@ def testCreateArrayDataset(self):
"dims": array_dims
}

fields = (
{"name": "temp", "type": array_datatype},
{"name": "pressure", "type": "H5T_IEEE_F16LE"},
)
datatype = {"class": "H5T_COMPOUND", "fields": fields}

payload = {
"type": datatype,
"shape": num_arrays,
Expand All @@ -4068,6 +4074,98 @@ def testCreateArrayDataset(self):
self.assertEqual(shape["class"], "H5S_SIMPLE")
self.assertEqual(shape["dims"], [num_arrays])

# write dataset values
value = []
for i in range(num_arrays):
value.append([[i * 10, i * 10 + 1, i * 10 + 2, i * 10 + 3, i * 10 + 4], i + 0.5])
payload = {"value": value}
req = self.endpoint + "/datasets/" + array_dset_uuid + "/value"
rsp = self.session.put(req, data=json.dumps(payload), headers=headers)
self.assertEqual(rsp.status_code, 200) # write value

# read the dataset values back
rsp = self.session.get(req, headers=headers)
self.assertEqual(rsp.status_code, 200)

rspJson = json.loads(rsp.text)
self.assertTrue("value" in rspJson)
self.assertEqual(rspJson["value"], value)

def testCreateArrayDatasetBinary(self):
headers = helper.getRequestHeaders(domain=self.base_domain)
headers_bin_req = helper.getRequestHeaders(domain=self.base_domain)
headers_bin_req["Content-Type"] = "application/octet-stream"
headers_bin_rsp = helper.getRequestHeaders(domain=self.base_domain)
headers_bin_rsp["accept"] = "application/octet-stream"

req = self.endpoint + "/"

# Get root uuid
rsp = self.session.get(req, headers=headers)
self.assertEqual(rsp.status_code, 200)
rspJson = json.loads(rsp.text)
root_uuid = rspJson["root"]
helper.validateId(root_uuid)

array_dims = [5]
num_arrays = 3

array_datatype = {
"class": "H5T_ARRAY",
"base": {
"class": "H5T_INTEGER",
"base": "H5T_STD_I64LE"
},
"dims": array_dims
}

fields = (
{"name": "temp", "type": array_datatype},
{"name": "pressure", "type": "H5T_IEEE_F16LE"},
)
datatype = {"class": "H5T_COMPOUND", "fields": fields}

payload = {
"type": datatype,
"shape": num_arrays,
}

req = self.endpoint + "/datasets"
rsp = self.session.post(req, data=json.dumps(payload), headers=headers)
self.assertEqual(rsp.status_code, 201) # create dataset

rspJson = json.loads(rsp.text)
array_dset_uuid = rspJson["id"]
self.assertTrue(helper.validateId(array_dset_uuid))

# verify the shape of the dataset
req = self.endpoint + "/datasets/" + array_dset_uuid
rsp = self.session.get(req, headers=headers)
self.assertEqual(rsp.status_code, 200) # get dataset
rspJson = json.loads(rsp.text)
shape = rspJson["shape"]
self.assertEqual(shape["class"], "H5S_SIMPLE")
self.assertEqual(shape["dims"], [num_arrays])

# create equivalent numpy dtype
dt = np.dtype([("temp", ("<i8", array_dims)), ("pressure", "<f2"),])
# create numpy array
arr = np.zeros((num_arrays,), dtype=dt)
for i in range(num_arrays):
row = arr[i]
for j in range(len(array_dims)):
row["temp"][j] = i * 10 + j
row["pressure"] = i + 0.5
data = arr.tobytes()
req = self.endpoint + "/datasets/" + array_dset_uuid + "/value"
rsp = self.session.put(req, data=data, headers=headers_bin_req)
self.assertEqual(rsp.status_code, 200) # write value

# read the dataset values back
rsp = self.session.get(req, headers=headers_bin_rsp)
self.assertEqual(rsp.status_code, 200)
self.assertEqual(rsp.content, data)

def testCreateNestedArrayDataset(self):
headers = helper.getRequestHeaders(domain=self.base_domain)
req = self.endpoint + "/"
Expand Down
29 changes: 29 additions & 0 deletions tests/unit/array_util_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -273,6 +273,35 @@ def testJsonToArray(self):
self.assertTrue(isinstance(e, tuple))
self.assertEqual(e, (id0, id1, id2))

# compound type with array field
dt = np.dtype([("a", ("i4", 3)), ("b", "S5")])
shape = [2, ]
data = [[[4, 8, 12], "four"], [[5, 10, 15], "five"]]
out = jsonToArray(shape, dt, data)
self.assertTrue(isinstance(out, np.ndarray))

self.assertEqual(out.shape, (2,))
self.assertTrue(isinstance(out[0], np.void))
e0 = out[0]
self.assertEqual(len(e0), 2)
e0a = e0[0]
self.assertTrue(isinstance(e0a, np.ndarray))
self.assertEqual(e0a[0], 4)
self.assertEqual(e0a[1], 8)
self.assertEqual(e0a[2], 12)
e0b = e0[1]
self.assertEqual(e0b, b"four")
self.assertTrue(isinstance(out[1], np.void))
e1 = out[1]
self.assertEqual(len(e1), 2)
e1a = e1[0]
self.assertTrue(isinstance(e1a, np.ndarray))
self.assertEqual(e1a[0], 5)
self.assertEqual(e1a[1], 10)
self.assertEqual(e1a[2], 15)
e1b = e1[1]
self.assertEqual(e1b, b"five")

def testToBytes(self):
# Simple array
dt = np.dtype("<i4")
Expand Down

0 comments on commit 00e20f1

Please sign in to comment.