package org.dcm4che3.io; import static org.junit.Assert.assertEquals; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import org.dcm4che3.data.Tag; import org.dcm4che3.data.UID; import org.dcm4che3.data.Attributes; import org.dcm4che3.data.BulkData; import org.dcm4che3.data.Fragments; import org.dcm4che3.data.VR; import org.dcm4che3.io.DicomEncodingOptions; import org.dcm4che3.io.DicomInputStream; import org.dcm4che3.io.DicomOutputStream; import org.junit.After; import org.junit.Before; import org.junit.Test; /** * @author Gunter Zeilinger <gunterze@gmail.com> */ public class DicomOutputStreamTest { private File file; @Before public void setUp() throws IOException { file = File.createTempFile("test", ".dcm"); } @After public void cleanUp() throws IOException { file.delete(); } @Test public void testWriteCommand() throws IOException { DicomOutputStream out = new DicomOutputStream( new FileOutputStream(file), UID.ImplicitVRLittleEndian); try { out.writeCommand(cechorq()); } finally { out.close(); } assertEquals(4, readAttributes().size()); } private Attributes readAttributes() throws IOException { DicomInputStream in = new DicomInputStream(file); try { return in.readDataset(-1, -1); } finally { in.close(); } } private Attributes deserializeAttributes() throws Exception { ObjectInputStream in = new ObjectInputStream(new FileInputStream(file)); try { return (Attributes) in.readObject(); } finally { in.close(); } } private Attributes cechorq() { Attributes cechorq = new Attributes(); cechorq.setString(Tag.AffectedSOPClassUID, VR.UI, UID.VerificationSOPClass); cechorq.setInt(Tag.CommandField, VR.US, 0x0030); cechorq.setInt(Tag.MessageID, VR.US, 1); cechorq.setInt(Tag.CommandDataSetType, VR.US, 0x0101); return cechorq; } @Test public void testWriteDatasetWithoutFileMetaInformation() throws IOException { DicomOutputStream out = new DicomOutputStream(file); testWriteDataset(out, null); } @Test public void testWriteDataset() throws IOException { DicomOutputStream out = new DicomOutputStream(file); testWriteDataset(out, UID.ExplicitVRLittleEndian); } @Test public void testWriteDatasetWithGroupLength() throws IOException { DicomOutputStream out = new DicomOutputStream(file); out.setEncodingOptions( new DicomEncodingOptions(true, true, false, true, false)); testWriteDataset(out, UID.ExplicitVRLittleEndian); } @Test public void testWriteDatasetWithoutUndefLength() throws IOException { DicomOutputStream out = new DicomOutputStream(file); out.setEncodingOptions( new DicomEncodingOptions(false, false, false, false, false)); testWriteDataset(out, UID.ExplicitVRLittleEndian); } @Test public void testWriteDatasetWithUndefEmptyLength() throws IOException { DicomOutputStream out = new DicomOutputStream(file); out.setEncodingOptions( new DicomEncodingOptions(false, true, true, true, true)); testWriteDataset(out, UID.ExplicitVRLittleEndian); } @Test public void testWriteDatasetBigEndian() throws IOException { DicomOutputStream out = new DicomOutputStream(file); testWriteDataset(out, UID.ExplicitVRBigEndianRetired); } @Test public void testWriteDatasetDeflated() throws IOException { DicomOutputStream out = new DicomOutputStream(file); testWriteDataset(out, UID.DeflatedExplicitVRLittleEndian); } @Test public void testSerializeDataset() throws Exception { ObjectOutputStream out = new ObjectOutputStream( new FileOutputStream(file)); try { out.writeObject(dataset()); out.writeUTF("END"); } finally { out.close(); } deserializeAttributes(); } private void testWriteDataset(DicomOutputStream out, String tsuid) throws IOException { Attributes ds = dataset(); Attributes fmi = tsuid != null ? ds.createFileMetaInformation(tsuid) : null; try { out.writeDataset(fmi, ds); } finally { out.close(); } readAttributes(); } private Attributes dataset() { Attributes ds = new Attributes(); ds.setString(Tag.PatientName, VR.PN, "Simpson^Homer"); ds.setNull(Tag.ReferencedPatientSequence, VR.SQ); ds.newSequence(Tag.ReferencedVisitSequence, 0); ds.newSequence(Tag.ReferencedStudySequence, 1) .add(new Attributes()); ds.setNull(Tag.AccessionNumber, VR.SH); ds.newSequence(Tag.RequestAttributesSequence, 1) .add(requestAttributes()); ds.setString(Tag.SOPClassUID, VR.UI, "1.2.3.4"); ds.setString(Tag.SOPInstanceUID, VR.UI, "4.3.2.1"); BulkData bdl = new BulkData( uri("OT-PAL-8-face"), 1654, 307200, false); ds.setValue(Tag.PixelData, VR.OW, bdl); Fragments frags = ds.newFragments("DicomOutputStreamTest", 0x99990010, VR.OB, 3); frags.add(null); frags.add(new byte[] { 1, 2, 3, 4 }); frags.add(bdl); return ds; } private static String uri(String name) { ClassLoader cl = Thread.currentThread().getContextClassLoader(); return cl.getResource(name).toString(); } private Attributes requestAttributes() { Attributes item = new Attributes(); item.setString(Tag.RequestedProcedureID, VR.SH, "P1234"); item.setString(Tag.ScheduledProcedureStepID, VR.SH, "S1234"); item.setString(Tag.AccessionNumber, VR.SH, "A1234"); item.newSequence(Tag.IssuerOfAccessionNumberSequence, 1) .add(hl7v2HierarchicDesignator()); return item; } private Attributes hl7v2HierarchicDesignator() { Attributes item= new Attributes(); item.setString(Tag.LocalNamespaceEntityID, VR.UT, "E1234"); item.setString(Tag.UniversalEntityID, VR.UT, "ef9d7472-3364-4480-b362-fc2d2a47a0c5"); item.setString(Tag.UniversalEntityIDType, VR.CS, "UUID"); return item; } }