Skip to content

Commit

Permalink
Add test and fix for cpd type with isodatetime
Browse files Browse the repository at this point in the history
  • Loading branch information
rly committed Jan 12, 2024
1 parent 2f74d58 commit abf78b8
Show file tree
Hide file tree
Showing 2 changed files with 59 additions and 11 deletions.
5 changes: 4 additions & 1 deletion src/hdmf/validate/validator.py
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,10 @@ def check_type(expected, received, string_format=None):
rec = received[i]
if exp == "isodatetime": # short circuit for isodatetime
sub_string_format = string_format[i]
return rec in ("utf", "ascii") and sub_string_format == "isodatetime"
return (
rec in __allowable[exp] or
rec in ("utf", "ascii") and sub_string_format == "isodatetime"
)
if rec not in __allowable[exp]:
return False
return True
Expand Down
65 changes: 55 additions & 10 deletions tests/unit/validator_tests/test_validate.py
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,18 @@ def getSpecs(self):
),
DatasetSpec('an example time dataset', 'isodatetime', name='datetime'),
DatasetSpec('an example time dataset', 'isodatetime', name='date', quantity='?'),
DatasetSpec('an array of times', 'isodatetime', name='time_array', dims=('num_times',), shape=(None,))
DatasetSpec('an array of times', 'isodatetime', name='time_array', dims=('num_times',), shape=(None,)),
DatasetSpec(
doc='an array with compound dtype that includes an isodatetime',
dtype=[
DtypeSpec('x', doc='x', dtype='int'),
DtypeSpec('y', doc='y', dtype='isodatetime'),
],
name='cpd_array',
dims=('num_times',),
shape=(None,),
quantity="?",
),
],
attributes=[AttributeSpec('attr1', 'an example string attribute', 'text')])
return ret,
Expand All @@ -129,7 +140,15 @@ def test_valid_isodatetime(self):
DatasetBuilder('data', 100, attributes={'attr2': 10}),
DatasetBuilder('datetime', datetime(2017, 5, 1, 12, 0, 0)),
DatasetBuilder('date', date(2017, 5, 1)),
DatasetBuilder('time_array', [datetime(2017, 5, 1, 12, 0, 0, tzinfo=tzlocal())])
DatasetBuilder('time_array', [datetime(2017, 5, 1, 12, 0, 0, tzinfo=tzlocal())]),
DatasetBuilder(
name='cpd_array',
data=[(1, datetime(2017, 5, 1, 12, 0, 0, tzinfo=tzlocal()))],
dtype=[
DtypeSpec('x', doc='x', dtype='int'),
DtypeSpec('y', doc='y', dtype='isodatetime'),
],
),
]
)
validator = self.vmap.get_validator('Bar')
Expand All @@ -143,7 +162,7 @@ def test_invalid_isodatetime(self):
datasets=[
DatasetBuilder('data', 100, attributes={'attr2': 10}),
DatasetBuilder('datetime', 100),
DatasetBuilder('time_array', [datetime(2017, 5, 1, 12, 0, 0, tzinfo=tzlocal())])
DatasetBuilder('time_array', [datetime(2017, 5, 1, 12, 0, 0, tzinfo=tzlocal())]),
]
)
validator = self.vmap.get_validator('Bar')
Expand All @@ -152,18 +171,44 @@ def test_invalid_isodatetime(self):
self.assertValidationError(result[0], DtypeError, name='Bar/datetime')

def test_invalid_isodatetime_array(self):
builder = GroupBuilder('my_bar',
attributes={'data_type': 'Bar', 'attr1': 'a string attribute'},
datasets=[DatasetBuilder('data', 100, attributes={'attr2': 10}),
DatasetBuilder('datetime',
datetime(2017, 5, 1, 12, 0, 0, tzinfo=tzlocal())),
DatasetBuilder('time_array',
datetime(2017, 5, 1, 12, 0, 0, tzinfo=tzlocal()))])
builder = GroupBuilder(
'my_bar',
attributes={'data_type': 'Bar', 'attr1': 'a string attribute'},
datasets=[
DatasetBuilder('data', 100, attributes={'attr2': 10}),
DatasetBuilder('datetime', datetime(2017, 5, 1, 12, 0, 0, tzinfo=tzlocal())),
DatasetBuilder('time_array', datetime(2017, 5, 1, 12, 0, 0, tzinfo=tzlocal())),
],
)
validator = self.vmap.get_validator('Bar')
result = validator.validate(builder)
self.assertEqual(len(result), 1)
self.assertValidationError(result[0], ExpectedArrayError, name='Bar/time_array')

def test_invalid_cpd_isodatetime_array(self):
builder = GroupBuilder(
'my_bar',
attributes={'data_type': 'Bar', 'attr1': 'a string attribute'},
datasets=[
DatasetBuilder('data', 100, attributes={'attr2': 10}),
DatasetBuilder('datetime', datetime(2017, 5, 1, 12, 0, 0)),
DatasetBuilder('date', date(2017, 5, 1)),
DatasetBuilder('time_array', [datetime(2017, 5, 1, 12, 0, 0, tzinfo=tzlocal())]),
DatasetBuilder(
name='cpd_array',
data=[(1, "wrong")],
dtype=[
DtypeSpec('x', doc='x', dtype='int'),
DtypeSpec('y', doc='y', dtype='isodatetime'),
],
),
],
)
validator = self.vmap.get_validator('Bar')
result = validator.validate(builder)
self.assertEqual(len(result), 1)
self.assertValidationError(result[0], DtypeError, name='Bar/cpd_array')


class TestNestedTypes(ValidatorTestBase):

Expand Down

0 comments on commit abf78b8

Please sign in to comment.