Skip to content

Commit 9c6216f

Browse files
committed
Allow LongCodeValue and URNCodeValue, add tests
1 parent 5cb0529 commit 9c6216f

2 files changed

Lines changed: 85 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: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -444,6 +444,8 @@ 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 = 'https://browser.ihtsdotools.org/?perspective=full&conceptId1=373098007&edition=MAIN/SNOMEDCT-US/2023-03-01&release=&languages=en'
447449
self._meaning = 'Mean Value of population'
448450
self._scheme_designator = 'SCT'
449451

@@ -506,6 +508,81 @@ def test_construction_args_optional(self):
506508
assert c.CodeMeaning == self._meaning
507509
assert c.CodingSchemeVersion == version
508510

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

0 commit comments

Comments
 (0)