Skip to content

Commit 402085f

Browse files
authored
Merge pull request #226 from ImagingDataCommons/bugfix/long_code_values
Allow LongCodeValue and URNCodeValue, add tests
2 parents 5cb0529 + a7bf599 commit 402085f

2 files changed

Lines changed: 89 additions & 1 deletion

File tree

src/highdicom/sr/coding.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,14 @@ def from_dataset(
126126
raise TypeError(
127127
'Dataset must be a pydicom.dataset.Dataset.'
128128
)
129-
for kw in ['CodeValue', 'CodeMeaning', 'CodingSchemeDesignator']:
129+
code_value_kws = ['CodeValue', 'LongCodeValue', 'URNCodeValue']
130+
num_code_values = sum(hasattr(dataset, kw) for kw in code_value_kws)
131+
if num_code_values != 1:
132+
raise AttributeError(
133+
'Dataset should have exactly one of the following attributes: '
134+
f'{", ".join(code_value_kws)}.'
135+
)
136+
for kw in ['CodeMeaning', 'CodingSchemeDesignator']:
130137
if not hasattr(dataset, kw):
131138
raise AttributeError(
132139
'Dataset does not contain the following attribute '

tests/test_sr.py

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -444,6 +444,12 @@ class TestCodedConcept(unittest.TestCase):
444444
def setUp(self):
445445
super().setUp()
446446
self._value = '373098007'
447+
self._long_code_value = 'some_code_value_longer_than_sixteen_chars'
448+
self._urn_code_value = (
449+
'https://browser.ihtsdotools.org/?perspective=full&conceptId1='
450+
'373098007&edition=MAIN/SNOMEDCT-US/2023-03-01&release=&languages='
451+
'en'
452+
)
447453
self._meaning = 'Mean Value of population'
448454
self._scheme_designator = 'SCT'
449455

@@ -506,6 +512,81 @@ def test_construction_args_optional(self):
506512
assert c.CodeMeaning == self._meaning
507513
assert c.CodingSchemeVersion == version
508514

515+
def test_long_code_value(self):
516+
version = 'v1.0'
517+
c = CodedConcept(
518+
self._long_code_value,
519+
self._scheme_designator,
520+
self._meaning,
521+
version,
522+
)
523+
assert c.value == self._long_code_value
524+
assert c.scheme_designator == self._scheme_designator
525+
assert c.meaning == self._meaning
526+
assert c.scheme_version == version
527+
assert c.LongCodeValue == self._long_code_value
528+
assert not hasattr(c, 'CodeValue')
529+
assert c.CodingSchemeDesignator == self._scheme_designator
530+
assert c.CodeMeaning == self._meaning
531+
assert c.CodingSchemeVersion == version
532+
533+
def test_urn_code_value(self):
534+
version = 'v1.0'
535+
c = CodedConcept(
536+
self._urn_code_value,
537+
self._scheme_designator,
538+
self._meaning,
539+
version,
540+
)
541+
assert c.value == self._urn_code_value
542+
assert c.scheme_designator == self._scheme_designator
543+
assert c.meaning == self._meaning
544+
assert c.scheme_version == version
545+
assert c.URNCodeValue == self._urn_code_value
546+
assert not hasattr(c, 'CodeValue')
547+
assert c.CodingSchemeDesignator == self._scheme_designator
548+
assert c.CodeMeaning == self._meaning
549+
assert c.CodingSchemeVersion == version
550+
551+
def test_from_dataset(self):
552+
ds = Dataset()
553+
ds.CodeValue = self._value
554+
ds.CodeMeaning = self._meaning
555+
ds.CodingSchemeDesignator = self._scheme_designator
556+
c = CodedConcept.from_dataset(ds)
557+
assert c.value == self._value
558+
assert c.scheme_designator == self._scheme_designator
559+
assert c.meaning == self._meaning
560+
561+
def test_from_dataset_long_value(self):
562+
ds = Dataset()
563+
ds.LongCodeValue = self._long_code_value
564+
ds.CodeMeaning = self._meaning
565+
ds.CodingSchemeDesignator = self._scheme_designator
566+
c = CodedConcept.from_dataset(ds)
567+
assert c.value == self._long_code_value
568+
assert c.scheme_designator == self._scheme_designator
569+
assert c.meaning == self._meaning
570+
571+
def test_from_dataset_urn_value(self):
572+
ds = Dataset()
573+
ds.URNCodeValue = self._urn_code_value
574+
ds.CodeMeaning = self._meaning
575+
ds.CodingSchemeDesignator = self._scheme_designator
576+
c = CodedConcept.from_dataset(ds)
577+
assert c.value == self._urn_code_value
578+
assert c.scheme_designator == self._scheme_designator
579+
assert c.meaning == self._meaning
580+
581+
def test_from_dataset_multiple_value(self):
582+
ds = Dataset()
583+
ds.CodeValue = self._value
584+
ds.URNCodeValue = self._urn_code_value # two code values, invalid
585+
ds.CodeMeaning = self._meaning
586+
ds.CodingSchemeDesignator = self._scheme_designator
587+
with pytest.raises(AttributeError):
588+
CodedConcept.from_dataset(ds)
589+
509590
def test_equal(self):
510591
c1 = CodedConcept(self._value, self._scheme_designator, self._meaning)
511592
c2 = CodedConcept(self._value, self._scheme_designator, self._meaning)

0 commit comments

Comments
 (0)