tests_dicom_dicomSegment.test.js

import {
  MaskSegment,
  isEqualSegment,
  getSegment,
  getDicomSegmentItem
} from '../../src/dicom/dicomSegment';
import {getElementsFromJSONTags} from '../../src/dicom/dicomWriter';
import {cielabToSrgb, uintLabToLab} from '../../src/utils/colour';

// doc imports
/* eslint-disable no-unused-vars */
import {DataElement} from '../../src/dicom/dataElement';
import {DicomCode} from '../../src/dicom/dicomCode';
/* eslint-enable no-unused-vars */

/**
 * Tests for the 'dicom/dicomSegment.js' file.
 */

/* global QUnit */
QUnit.module('dicom');

/**
 * Get a dicom code from simple dicom elements.
 *
 * @param {Object<string, DataElement>} simpleElements DICOM simple elements.
 * @returns {DicomCode} The corresponding DICOM code.
 */
function getCodeFromSimpleDicom(simpleElements) {
  return {
    meaning: simpleElements.CodeMeaning,
    value: simpleElements.CodeValue,
    schemeDesignator: simpleElements.CodingSchemeDesignator,
    longValue: simpleElements.LongCodeValue,
    urnValue: simpleElements.URNCodeValue
  };
}

/**
 * MaskSegment test: translate to element and back.
 *
 * @param {object} segment The segment as an object.
 * @param {object} assert The QUnit assert.
 * @param {string} testName The test name.
 */
function testSegment(segment, assert, testName) {
  // segment -> simple dicom element
  // (treat simple code as code)
  const segmentSimpleElements = getDicomSegmentItem(segment);
  // cielab to RGB
  const cielabElement = segmentSimpleElements.RecommendedDisplayCIELabValue;
  const rgb = cielabToSrgb(uintLabToLab({
    l: cielabElement[0],
    a: cielabElement[1],
    b: cielabElement[2]
  }));
  // translate to segment to be able to compare
  const segment1 = {
    number: segmentSimpleElements.SegmentNumber,
    label: segmentSimpleElements.SegmentLabel,
    algorithmType: segmentSimpleElements.SegmentAlgorithmType,
    displayRGBValue: rgb,
    propertyCategoryCode: getCodeFromSimpleDicom(
      segmentSimpleElements.SegmentedPropertyCategoryCodeSequence.value[0]),
    propertyTypeCode: getCodeFromSimpleDicom(
      segmentSimpleElements.SegmentedPropertyTypeCodeSequence.value[0]),
  };
  assert.ok(isEqualSegment(segment1, segment),
    testName + ' segment from simple element');

  // simple dicom element -> dicom element
  const segmentElements = getElementsFromJSONTags(segmentSimpleElements);
  // dicom element -> segment
  const segment2 = getSegment(segmentElements);
  // compare
  assert.ok(isEqualSegment(segment2, segment),
    testName + ' segment from element');
}

/**
 * Tests for {@link MaskSegment} using simple DICOM data.
 *
 * @function module:tests/dicom~dicom-segment-class
 */
QUnit.test('DICOM segment class', function (assert) {
  const number0 = 0;
  const label0 = 'Segment0';
  const algorithmType0 = 'MANUAL';
  const segment00 = new MaskSegment(number0, label0, algorithmType0);
  assert.equal(segment00.number, number0,
    'Test #00 number');
  assert.equal(segment00.label, label0,
    'Test #00 label');
  assert.equal(segment00.algorithmType, algorithmType0,
    'Test #00 algorithm type');

  const code01 = {
    meaning: 'Dimeglumine gadopentetate 469.01mg/mL inj soln 15mL pfld syr',
    value: '406400000',
    schemeDesignator: 'SCT',
    longValue: undefined,
    urnValue: undefined
  };

  const segment01 = {
    number: number0,
    label: label0,
    algorithmType: algorithmType0,
    displayRGBValue: {r: 255, g: 0, b: 0},
    propertyCategoryCode: code01,
    propertyTypeCode: code01,
    trackingId: '01234',
    trackingUid: '01234'
  };
  testSegment(segment01, assert, 'Test #01');
});