284 lines
9.6 KiB
JavaScript
284 lines
9.6 KiB
JavaScript
/**
|
|
* Tests for the 'dicom/dicomWriter.js' file.
|
|
*/
|
|
/** @module tests/dicom */
|
|
// Do not warn if these variables were not defined before.
|
|
/* global QUnit */
|
|
QUnit.module("dicomWriter");
|
|
|
|
var dwv = dwv || {};
|
|
dwv.utils = dwv.utils || {};
|
|
dwv.utils.test = dwv.utils.test || {};
|
|
|
|
/**
|
|
* Tests for {@link dwv.dicom.DicomWriter} using simple DICOM data.
|
|
* Using remote file for CI integration.
|
|
* @function module:tests/dicom~dicomWriter
|
|
*/
|
|
QUnit.test("Test multiframe writer support.", function (assert) {
|
|
var done = assert.async();
|
|
|
|
var request = new XMLHttpRequest();
|
|
var urlRoot = "https://raw.githubusercontent.com/ivmartel/dwv/master";
|
|
var url = urlRoot + "/tests/data/multiframe-test1.dcm";
|
|
request.open('GET', url, true);
|
|
request.responseType = "arraybuffer";
|
|
request.onerror = function (event) {
|
|
console.log(event);
|
|
};
|
|
request.onload = function (/*event*/) {
|
|
assert.ok((this.response.byteLength!==0), "Got a response.");
|
|
|
|
// parse DICOM
|
|
var dicomParser = new dwv.dicom.DicomParser();
|
|
dicomParser.parse(this.response);
|
|
|
|
var numFrames = 16;
|
|
|
|
// raw tags
|
|
var rawTags = dicomParser.getRawDicomElements();
|
|
// check values
|
|
assert.equal(rawTags.x00280008.value[0], numFrames, "Number of frames");
|
|
// length of value array for pixel data
|
|
assert.equal(rawTags.x7FE00010.value.length, numFrames, "Length of value array for pixel data");
|
|
|
|
var dicomWriter = new dwv.dicom.DicomWriter();
|
|
var buffer = dicomWriter.getBuffer(rawTags);
|
|
|
|
dicomParser = new dwv.dicom.DicomParser();
|
|
dicomParser.parse(buffer);
|
|
|
|
rawTags = dicomParser.getRawDicomElements();
|
|
|
|
// check values
|
|
assert.equal(rawTags.x00280008.value[0], numFrames, "Number of frames");
|
|
// length of value array for pixel data
|
|
assert.equal(rawTags.x7FE00010.value.length, numFrames, "Length of value array for pixel data");
|
|
|
|
// finish async test
|
|
done();
|
|
};
|
|
request.send(null);
|
|
});
|
|
|
|
QUnit.test("Test patient anonymisation", function (assert) {
|
|
var done = assert.async();
|
|
|
|
var request = new XMLHttpRequest();
|
|
var urlRoot = "https://raw.githubusercontent.com/ivmartel/dwv/master";
|
|
var url = urlRoot + "/tests/data/dwv-test-anonymise.dcm";
|
|
request.open('GET', url, true);
|
|
request.responseType = "arraybuffer";
|
|
request.onerror = function (event) {
|
|
console.log(event);
|
|
};
|
|
request.onload = function (/*event*/) {
|
|
assert.ok((this.response.byteLength!==0), "Got a response.");
|
|
|
|
// parse DICOM
|
|
var dicomParser = new dwv.dicom.DicomParser();
|
|
dicomParser.parse(this.response);
|
|
|
|
var patientsNameAnonymised = 'anonymise-name';
|
|
var patientsIdAnonymised = 'anonymise-id';
|
|
var rules = {
|
|
'default': {action: 'copy', value: null },
|
|
'x00100010' : {action: 'replace', value: patientsNameAnonymised }, // tag
|
|
'PatientID': {action: 'replace', value: patientsIdAnonymised}, // tag name 'x00100020'
|
|
'Patient' : {action: 'remove', value: null }, // group name 'x0010'
|
|
};
|
|
|
|
var patientsName = 'dwv-patient-test';
|
|
var patientID = 'dwv-patient-id123';
|
|
var patientsBirthDate = '19830101';
|
|
var patientsSex = 'M';
|
|
|
|
// raw tags
|
|
var rawTags = dicomParser.getRawDicomElements();
|
|
// check values
|
|
assert.equal(rawTags.x00100010.value[0], patientsName, "patientsName");
|
|
assert.equal(rawTags.x00100020.value[0], patientID, "patientID");
|
|
assert.equal(rawTags.x00100030.value[0], patientsBirthDate, "patientsBirthDate");
|
|
assert.equal(rawTags.x00100040.value[0], patientsSex, "patientsSex");
|
|
|
|
var dicomWriter = new dwv.dicom.DicomWriter();
|
|
dicomWriter.rules = rules;
|
|
var buffer = dicomWriter.getBuffer(rawTags);
|
|
|
|
dicomParser = new dwv.dicom.DicomParser();
|
|
|
|
dicomParser.parse(buffer);
|
|
|
|
rawTags = dicomParser.getRawDicomElements();
|
|
|
|
// check values
|
|
assert.equal(rawTags.x00100010.value[0], patientsNameAnonymised, "patientName");
|
|
assert.equal(rawTags.x00100020.value[0], patientsIdAnonymised, "patientID");
|
|
assert.notOk(rawTags.x00100030, "patientsBirthDate");
|
|
assert.notOk(rawTags.x00100040, "patientsSex");
|
|
|
|
// finish async test
|
|
done();
|
|
};
|
|
request.send(null);
|
|
});
|
|
|
|
/**
|
|
* Get a string representation of an object.
|
|
* TypedArray.toString can return '[object Uint8Array]' on old browsers
|
|
* (such as in PhantomJs).
|
|
* @param {Object} obj The input object
|
|
* @return {String} The string.
|
|
*/
|
|
dwv.utils.test.toString = function ( obj ) {
|
|
var res = obj.toString();
|
|
if ( res.substr(0,7) === "[object" &&
|
|
res.substr((res.length - 6),6) === "Array]") {
|
|
res = "";
|
|
for ( var i = 0; i < obj.length; ++i ) {
|
|
res += obj[i];
|
|
if ( i !== obj.length - 1 ) {
|
|
res += ",";
|
|
}
|
|
}
|
|
}
|
|
return res;
|
|
};
|
|
|
|
/**
|
|
* Compare JSON tags and DICOM elements
|
|
* @param {Object} jsonTags The JSON tags.
|
|
* @param {Object} dicomElements The DICOM elements
|
|
* @param {String} name The name of the test.
|
|
* @param {Object} comaprator An object with an equal function (such as Qunit assert).
|
|
*/
|
|
dwv.utils.test.compare = function ( jsonTags, dicomElements, name, comparator ) {
|
|
// check content
|
|
if (jsonTags === null || jsonTags === 0) {
|
|
return;
|
|
}
|
|
var keys = Object.keys(jsonTags);
|
|
for ( var k = 0; k < keys.length; ++k ) {
|
|
var tag = keys[k];
|
|
var tagGE = dwv.dicom.getGroupElementFromName(tag);
|
|
var tagKey = dwv.dicom.getGroupElementKey(tagGE.group, tagGE.element);
|
|
var element = dicomElements.getDEFromKey(tagKey);
|
|
var value = dicomElements.getFromKey(tagKey, true);
|
|
if ( element.vr !== "SQ" ) {
|
|
comparator.equal(dwv.utils.test.toString(value), jsonTags[tag], name + " - " + tag);
|
|
} else {
|
|
// check content
|
|
if (jsonTags[tag] === null || jsonTags[tag] === 0) {
|
|
continue;
|
|
}
|
|
// supposing same order of subkeys and indices...
|
|
var subKeys = Object.keys(jsonTags[tag]);
|
|
var index = 0;
|
|
for ( var sk = 0; sk < subKeys.length; ++sk ) {
|
|
if ( subKeys[sk] !== "explicitLength" ) {
|
|
var wrap = new dwv.dicom.DicomElementsWrapper(value[index]);
|
|
dwv.utils.test.compare(jsonTags[tag][subKeys[sk]], wrap, name, comparator);
|
|
++index;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Test a JSON config.
|
|
* @param {Object} config A JSON config representing DICOM tags.
|
|
* @param {Object} assert A Qunit assert.
|
|
*/
|
|
dwv.utils.test.testConfig = function (config, assert) {
|
|
// convert JSON to DICOM element object
|
|
var res = dwv.dicom.getElementsFromJSONTags(config.tags);
|
|
var dicomElements = res.elements;
|
|
// pixels: small gradient square
|
|
dicomElements.x7FE00010 = dwv.dicom.generatePixelDataFromJSONTags(config.tags, res.offset);
|
|
|
|
// create DICOM buffer
|
|
var writer = new dwv.dicom.DicomWriter();
|
|
var dicomBuffer = null;
|
|
try {
|
|
dicomBuffer = writer.getBuffer(dicomElements);
|
|
} catch (error) {
|
|
assert.ok(false, "Caught error: "+error);
|
|
return;
|
|
}
|
|
|
|
// parse the buffer
|
|
var dicomParser = new dwv.dicom.DicomParser();
|
|
dicomParser.parse(dicomBuffer);
|
|
var elements = dicomParser.getDicomElements();
|
|
|
|
// compare contents
|
|
dwv.utils.test.compare(config.tags, elements, config.name, assert);
|
|
};
|
|
|
|
QUnit.test("Test synthetic dicom explicit", function (assert) {
|
|
var done = assert.async();
|
|
|
|
// get the list of configs
|
|
var request = new XMLHttpRequest();
|
|
var urlRoot = "https://raw.githubusercontent.com/ivmartel/dwv/master";
|
|
var url = urlRoot + "/tests/dicom/synthetic-data_explicit.json";
|
|
request.open('GET', url, true);
|
|
request.onerror = function (event) {
|
|
console.error(event);
|
|
};
|
|
request.onload = function (/*event*/) {
|
|
var configs = JSON.parse(this.responseText);
|
|
for (var i = 0; i < configs.length; ++i ) {
|
|
dwv.utils.test.testConfig(configs[i], assert);
|
|
}
|
|
// finish async test
|
|
done();
|
|
};
|
|
request.send(null);
|
|
});
|
|
|
|
QUnit.test("Test synthetic dicom implicit", function (assert) {
|
|
var done = assert.async();
|
|
|
|
// get the list of configs
|
|
var request = new XMLHttpRequest();
|
|
var urlRoot = "https://raw.githubusercontent.com/ivmartel/dwv/master";
|
|
var url = urlRoot + "/tests/dicom/synthetic-data_implicit.json";
|
|
request.open('GET', url, true);
|
|
request.onerror = function (event) {
|
|
console.error(event);
|
|
};
|
|
request.onload = function (/*event*/) {
|
|
var configs = JSON.parse(this.responseText);
|
|
for (var i = 0; i < configs.length; ++i ) {
|
|
dwv.utils.test.testConfig(configs[i], assert);
|
|
}
|
|
// finish async test
|
|
done();
|
|
};
|
|
request.send(null);
|
|
});
|
|
|
|
QUnit.test("Test synthetic dicom explicit big endian", function (assert) {
|
|
var done = assert.async();
|
|
|
|
// get the list of configs
|
|
var request = new XMLHttpRequest();
|
|
var urlRoot = "https://raw.githubusercontent.com/ivmartel/dwv/master";
|
|
var url = urlRoot + "/tests/dicom/synthetic-data_explicit_big-endian.json";
|
|
request.open('GET', url, true);
|
|
request.onerror = function (event) {
|
|
console.error(event);
|
|
};
|
|
request.onload = function (/*event*/) {
|
|
var configs = JSON.parse(this.responseText);
|
|
for (var i = 0; i < configs.length; ++i ) {
|
|
dwv.utils.test.testConfig(configs[i], assert);
|
|
}
|
|
// finish async test
|
|
done();
|
|
};
|
|
request.send(null);
|
|
});
|