diff --git a/DICOM [Unit Tests]/DICOM [Unit Tests].csproj b/DICOM [Unit Tests]/DICOM [Unit Tests].csproj index 71e33273e..51dbb5942 100644 --- a/DICOM [Unit Tests]/DICOM [Unit Tests].csproj +++ b/DICOM [Unit Tests]/DICOM [Unit Tests].csproj @@ -71,6 +71,7 @@ + diff --git a/DICOM [Unit Tests]/DicomDatasetTest.cs b/DICOM [Unit Tests]/DicomDatasetTest.cs index 82435b922..2ecb927b6 100644 --- a/DICOM [Unit Tests]/DicomDatasetTest.cs +++ b/DICOM [Unit Tests]/DicomDatasetTest.cs @@ -16,55 +16,61 @@ public class DicomDatasetTest [Fact] public void Add_OtherDoubleElement_Succeeds() { + var tag = DicomTag.DoubleFloatPixelData; var dataset = new DicomDataset(); - dataset.Add(DicomTag.DoubleFloatPixelData, 3.45); - Assert.IsType(typeof(DicomOtherDouble), dataset.First()); + dataset.Add(tag, 3.45); + Assert.IsType(dataset.First(item => item.Tag.Equals(tag))); } [Fact] public void Add_OtherDoubleElementWithMultipleDoubles_Succeeds() { + var tag = DicomTag.DoubleFloatPixelData; var dataset = new DicomDataset(); - dataset.Add(DicomTag.DoubleFloatPixelData, 3.45, 6.78, 9.01); - Assert.IsType(typeof(DicomOtherDouble), dataset.First()); - Assert.Equal(3, dataset.Get(DicomTag.DoubleFloatPixelData).Length); + dataset.Add(tag, 3.45, 6.78, 9.01); + Assert.IsType(dataset.First(item => item.Tag.Equals(tag))); + Assert.Equal(3, dataset.Get(tag).Length); } [Fact] public void Add_UnlimitedCharactersElement_Succeeds() { + var tag = DicomTag.LongCodeValue; var dataset = new DicomDataset(); - dataset.Add(DicomTag.LongCodeValue, "abc"); - Assert.IsType(typeof(DicomUnlimitedCharacters), dataset.First()); - Assert.Equal("abc", dataset.Get(DicomTag.LongCodeValue)); + dataset.Add(tag, "abc"); + Assert.IsType(dataset.First(item => item.Tag.Equals(tag))); + Assert.Equal("abc", dataset.Get(tag)); } [Fact] public void Add_UnlimitedCharactersElementWithMultipleStrings_Succeeds() { + var tag = DicomTag.LongCodeValue; var dataset = new DicomDataset(); - dataset.Add(DicomTag.LongCodeValue, "a", "b", "c"); - Assert.IsType(typeof(DicomUnlimitedCharacters), dataset.First()); - Assert.Equal("c", dataset.Get(DicomTag.LongCodeValue, 2)); + dataset.Add(tag, "a", "b", "c"); + Assert.IsType(dataset.First(item => item.Tag.Equals(tag))); + Assert.Equal("c", dataset.Get(tag, 2)); } [Fact] public void Add_UniversalResourceElement_Succeeds() { + var tag = DicomTag.URNCodeValue; var dataset = new DicomDataset(); - dataset.Add(DicomTag.URNCodeValue, "abc"); - Assert.IsType(typeof(DicomUniversalResource), dataset.First()); - Assert.Equal("abc", dataset.Get(DicomTag.URNCodeValue)); + dataset.Add(tag, "abc"); + Assert.IsType(dataset.First(item => item.Tag.Equals(tag))); + Assert.Equal("abc", dataset.Get(tag)); } [Fact] public void Add_UniversalResourceElementWithMultipleStrings_OnlyFirstValueIsUsed() { + var tag = DicomTag.URNCodeValue; var dataset = new DicomDataset(); - dataset.Add(DicomTag.URNCodeValue, "a", "b", "c"); - Assert.IsType(typeof(DicomUniversalResource), dataset.First()); + dataset.Add(tag, "a", "b", "c"); + Assert.IsType(dataset.First(item => item.Tag.Equals(tag))); - var data = dataset.Get(DicomTag.URNCodeValue); + var data = dataset.Get(tag); Assert.Equal(1, data.Length); Assert.Equal("a", data.First()); } @@ -72,15 +78,16 @@ public void Add_UniversalResourceElementWithMultipleStrings_OnlyFirstValueIsUsed [Fact] public void Add_PersonName_MultipleNames_YieldsMultipleValues() { + var tag = DicomTag.PerformingPhysicianName; var dataset = new DicomDataset(); dataset.Add( - DicomTag.PerformingPhysicianName, + tag, "Gustafsson^Anders^L", "Yates^Ian", "Desouky^Hesham", "Horn^Chris"); - var data = dataset.Get(DicomTag.PerformingPhysicianName); + var data = dataset.Get(tag); Assert.Equal(4, data.Length); Assert.Equal("Desouky^Hesham", data[2]); } @@ -92,7 +99,7 @@ public void Add_MultiVMStringTags_YieldsMultipleValues(DicomTag tag, string[] va var dataset = new DicomDataset(); dataset.Add(tag, values); - Assert.IsType(expectedType, dataset.First()); + Assert.IsType(expectedType, dataset.First(item => item.Tag.Equals(tag))); var data = dataset.Get(tag); Assert.Equal(values.Length, data.Length); diff --git a/DICOM [Unit Tests]/DicomOtherByteTest.cs b/DICOM [Unit Tests]/DicomOtherByteTest.cs new file mode 100644 index 000000000..2f5558f13 --- /dev/null +++ b/DICOM [Unit Tests]/DicomOtherByteTest.cs @@ -0,0 +1,105 @@ +// Copyright (c) 2012-2015 fo-dicom contributors. +// Licensed under the Microsoft Public License (MS-PL). + +namespace Dicom +{ + using System; + using System.Linq; + + using Xunit; + + public class DicomOtherByteTest + { + #region Unit tests + + [Fact] + public void Get_Short_ReturnsCorrectValue() + { + Get_SingleItem_ReturnsCorrectValue(63, (short)0x7f7e); + } + + [Fact] + public void Get_ShortArray_ReturnsCorrectValue() + { + Get_Array_ReturnsCorrectValue(31, (short)0x3f3e, 128); + } + + [Fact] + public void Get_UShort_ReturnsCorrectValue() + { + Get_SingleItem_ReturnsCorrectValue(63, (ushort)0x7f7e); + } + + [Fact] + public void Get_UShortArray_ReturnsCorrectValue() + { + Get_Array_ReturnsCorrectValue(31, (ushort)0x3f3e, 128); + } + + [Fact] + public void Get_Byte_ReturnsCorrectValue() + { + Get_SingleItem_ReturnsCorrectValue(63, (byte)0x3f); + } + + [Fact] + public void Get_ByteArray_ReturnsCorrectValue() + { + Get_Array_ReturnsCorrectValue(31, (byte)0x1f, 256); + } + + [Fact] + public void Get_UInt_ReturnsCorrectValue() + { + Get_SingleItem_ReturnsCorrectValue(63, (uint)0xfffefdfc); + } + + [Fact] + public void Get_UIntArray_ReturnsCorrectValue() + { + Get_Array_ReturnsCorrectValue(31, (uint)0x7f7e7d7c, 64); + } + + [Fact] + public void Get_Double_ReturnsCorrectValue() + { + var doubles = new double[1]; + Buffer.BlockCopy(new byte[] { 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f }, 0, doubles, 0, 8); + Get_SingleItem_ReturnsCorrectValue(7, doubles[0]); + } + + [Fact] + public void Get_DoubleArray_ReturnsCorrectValue() + { + var doubles = new double[1]; + Buffer.BlockCopy(new byte[] { 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f }, 0, doubles, 0, 8); + Get_Array_ReturnsCorrectValue(15, doubles[0], 32); + } + + #endregion + + #region Helper methods + + public static void Get_SingleItem_ReturnsCorrectValue(int index, T expected) + { + var element = new DicomOtherByte( + DicomTag.PixelData, + Enumerable.Range(0, 256).Select(i => (byte)i).ToArray()); + var actual = element.Get(index); + Assert.Equal(expected, actual); + } + + public static void Get_Array_ReturnsCorrectValue(int index, T expected, int expectedLength) + { + var element = new DicomOtherByte( + DicomTag.PixelData, + Enumerable.Range(0, 256).Select(i => (byte)i).ToArray()); + var actual = element.Get(); + + Assert.Equal(expectedLength, actual.Length); + Assert.Equal(expected, actual[index]); + } + + #endregion + } +} \ No newline at end of file diff --git a/DICOM/DicomElement.cs b/DICOM/DicomElement.cs index 5247f306a..c229ac75b 100644 --- a/DICOM/DicomElement.cs +++ b/DICOM/DicomElement.cs @@ -445,7 +445,7 @@ public IEnumerable Values if (_values == null) { var values = new List(); - var parts = ByteBufferEnumerator.Create(Buffer).ToArray(); + var parts = ByteConverter.ToArray(Buffer); for (int i = 0; i < parts.Length; i += 2) { var group = parts[i + 0]; @@ -965,29 +965,29 @@ public override T Get(int item = -1) { if (!typeof(T).IsArray && item == -1) item = 0; - if (typeof(T) == typeof(short)) return (T)(object)ByteBufferEnumerator.Create(Buffer).ToArray().GetValue(item); + if (typeof(T) == typeof(short)) return (T)(object)ByteConverter.Get(Buffer, item); - if (typeof(T) == typeof(short[])) return (T)(object)ByteBufferEnumerator.Create(Buffer).ToArray(); + if (typeof(T) == typeof(short[])) return (T)(object)ByteConverter.ToArray(Buffer); - if (typeof(T) == typeof(ushort)) return (T)(object)ByteBufferEnumerator.Create(Buffer).ToArray().GetValue(item); + if (typeof(T) == typeof(ushort)) return (T)(object)ByteConverter.Get(Buffer, item); - if (typeof(T) == typeof(ushort[])) return (T)(object)ByteBufferEnumerator.Create(Buffer).ToArray(); + if (typeof(T) == typeof(ushort[])) return (T)(object)ByteConverter.ToArray(Buffer); - if (typeof(T) == typeof(int)) return (T)(object)ByteBufferEnumerator.Create(Buffer).ToArray().GetValue(item); + if (typeof(T) == typeof(int)) return (T)(object)ByteConverter.Get(Buffer, item); - if (typeof(T) == typeof(int[])) return (T)(object)ByteBufferEnumerator.Create(Buffer).ToArray(); + if (typeof(T) == typeof(int[])) return (T)(object)ByteConverter.ToArray(Buffer); - if (typeof(T) == typeof(uint)) return (T)(object)ByteBufferEnumerator.Create(Buffer).ToArray().GetValue(item); + if (typeof(T) == typeof(uint)) return (T)(object)ByteConverter.Get(Buffer, item); - if (typeof(T) == typeof(uint[])) return (T)(object)ByteBufferEnumerator.Create(Buffer).ToArray(); + if (typeof(T) == typeof(uint[])) return (T)(object)ByteConverter.ToArray(Buffer); - if (typeof(T) == typeof(float)) return (T)(object)ByteBufferEnumerator.Create(Buffer).ToArray().GetValue(item); + if (typeof(T) == typeof(float)) return (T)(object)ByteConverter.Get(Buffer, item); - if (typeof(T) == typeof(float[])) return (T)(object)ByteBufferEnumerator.Create(Buffer).ToArray(); + if (typeof(T) == typeof(float[])) return (T)(object)ByteConverter.ToArray(Buffer); - if (typeof(T) == typeof(double)) return (T)(object)ByteBufferEnumerator.Create(Buffer).ToArray().GetValue(item); + if (typeof(T) == typeof(double)) return (T)(object)ByteConverter.Get(Buffer, item); - if (typeof(T) == typeof(double[])) return (T)(object)ByteBufferEnumerator.Create(Buffer).ToArray(); + if (typeof(T) == typeof(double[])) return (T)(object)ByteConverter.ToArray(Buffer); return base.Get(item); } diff --git a/DICOM/Imaging/DicomOverlayData.cs b/DICOM/Imaging/DicomOverlayData.cs index 870e3e21b..181068b94 100644 --- a/DICOM/Imaging/DicomOverlayData.cs +++ b/DICOM/Imaging/DicomOverlayData.cs @@ -399,7 +399,7 @@ private IByteBuffer Load() if (pixels.BitsAllocated == 8) { - var data = ByteBufferEnumerator.Create(frame).ToArray(); + var data = IO.ByteConverter.ToArray(frame); for (int y = oy; y < oh; y++) { @@ -416,7 +416,7 @@ private IByteBuffer Load() else if (pixels.BitsAllocated == 16) { // we don't really care if the pixel data is signed or not - var data = ByteBufferEnumerator.Create(frame).ToArray(); + var data = IO.ByteConverter.ToArray(frame); for (int y = oy; y < oh; y++) {