public void TestSliceInformationValidation()
        {
            ushort highBit      = 15;
            var    dicomDataset = CreateValidDicomDatasetSlice(5, 5, 1, 1, new Point3D(), DicomUID.CTImageStorage, highBit);

            // Valid DICOM slice.
            DicomSeriesInformationValidator.ValidateSliceInformation(SliceInformation.Create(dicomDataset), new[] { dicomDataset.InternalTransferSyntax });

            // Invalid supported transfer syntax
            Assert.Throws <ArgumentException>(() => DicomSeriesInformationValidator.ValidateSliceInformation(SliceInformation.Create(dicomDataset), new[] { DicomTransferSyntax.DeflatedExplicitVRLittleEndian }));

            // Add LUT Sequence
            dicomDataset.Add(new DicomSequence(DicomTag.ModalityLUTSequence, new DicomDataset[0]));
            Assert.Throws <ArgumentException>(() => DicomSeriesInformationValidator.ValidateSliceInformation(SliceInformation.Create(dicomDataset)));

            // Remove LUT Sequence and set bits allocated to not 16
            dicomDataset.Remove(DicomTag.ModalityLUTSequence);
            DicomSeriesInformationValidator.ValidateSliceInformation(SliceInformation.Create(dicomDataset));
            dicomDataset.AddOrUpdate(new DicomUnsignedShort(DicomTag.BitsAllocated, 12));
            Assert.Throws <ArgumentException>(() => DicomSeriesInformationValidator.ValidateSliceInformation(SliceInformation.Create(dicomDataset)));

            // Set bits allocated to 16, and updated photometric interpation to not MONOCHROME2
            dicomDataset.AddOrUpdate(new DicomUnsignedShort(DicomTag.BitsAllocated, 16));
            DicomSeriesInformationValidator.ValidateSliceInformation(SliceInformation.Create(dicomDataset));
            dicomDataset.AddOrUpdate(new DicomCodeString(DicomTag.PhotometricInterpretation, "INVALID"));
            Assert.Throws <ArgumentException>(() => DicomSeriesInformationValidator.ValidateSliceInformation(SliceInformation.Create(dicomDataset)));

            // Set photometric interpation to MONOCHROME2 and change expected samples per pixel
            dicomDataset.AddOrUpdate(new DicomCodeString(DicomTag.PhotometricInterpretation, DicomSeriesInformationValidator.ExpectedPhotometricInterpretation));
            DicomSeriesInformationValidator.ValidateSliceInformation(SliceInformation.Create(dicomDataset));
            dicomDataset.AddOrUpdate(new DicomUnsignedShort(DicomTag.SamplesPerPixel, DicomSeriesInformationValidator.ExpectedSamplesPerPixel + 1));
            Assert.Throws <ArgumentException>(() => DicomSeriesInformationValidator.ValidateSliceInformation(SliceInformation.Create(dicomDataset)));

            // Set samples per pixel to 1 and change the modality to not CT
            dicomDataset.AddOrUpdate(new DicomUnsignedShort(DicomTag.SamplesPerPixel, DicomSeriesInformationValidator.ExpectedSamplesPerPixel));
            DicomSeriesInformationValidator.ValidateSliceInformation(SliceInformation.Create(dicomDataset));
            dicomDataset.AddOrUpdate(DicomTag.Modality, DicomConstants.MRModality);
            Assert.Throws <ArgumentException>(() => DicomSeriesInformationValidator.ValidateSliceInformation(SliceInformation.Create(dicomDataset)));

            // Set modality to CT and change the bits stored to highbit + 2
            dicomDataset.AddOrUpdate(DicomTag.Modality, DicomConstants.CTModality);
            DicomSeriesInformationValidator.ValidateSliceInformation(SliceInformation.Create(dicomDataset));
            dicomDataset.AddOrUpdate(new DicomUnsignedShort(DicomTag.BitsStored, (ushort)(highBit + 2)));
            Assert.Throws <ArgumentException>(() => DicomSeriesInformationValidator.ValidateSliceInformation(SliceInformation.Create(dicomDataset)));
        }
        public void TestVolumeInformationValidation()
        {
            var dicomDatasets  = CreateValidDicomDatasetVolume(5, 5, 5, 1, 1, 3, new Point3D(), DicomUID.CTImageStorage, 16);
            var acceptanceTest = new ModerateGeometricAcceptanceTest("Blah1", "Blah2");

            // Valid DICOM slice.
            DicomSeriesInformationValidator.ValidateVolumeInformation(
                VolumeInformation.Create(dicomDatasets),
                acceptanceTest,
                new[] { dicomDatasets[0].InternalTransferSyntax });

            // Inconsistent slice information.
            var dicomDatasets2 = CreateValidDicomDatasetVolume(5, 5, 5, 1, 1, 3, new Point3D(), DicomUID.CTImageStorage, 16);

            dicomDatasets2[dicomDatasets2.Length - 2].AddOrUpdate(new DicomUnsignedShort(DicomTag.Rows, 234));
            var exception = Assert.Throws <ArgumentException>(() => DicomSeriesInformationValidator.ValidateVolumeInformation(
                                                                  VolumeInformation.Create(dicomDatasets2),
                                                                  acceptanceTest));

            Assert.IsTrue(exception.Message.Contains("Slice at position '9' has an inconsistent height. Expected: '5', Actual: '234'."));

            // Invalid supported transfer syntax
            Assert.Throws <ArgumentException>(() => DicomSeriesInformationValidator.ValidateVolumeInformation(
                                                  VolumeInformation.Create(dicomDatasets),
                                                  acceptanceTest,
                                                  new[] { DicomTransferSyntax.DeflatedExplicitVRLittleEndian }));

            // Failing acceptance test
            Assert.Throws <ArgumentException>(() => DicomSeriesInformationValidator.ValidateVolumeInformation(
                                                  VolumeInformation.Create(dicomDatasets),
                                                  new FailingAcceptanceTest()));

            // Exception testing
            Assert.Throws <ArgumentNullException>(() => DicomSeriesInformationValidator.ValidateVolumeInformation(
                                                      VolumeInformation.Create(dicomDatasets),
                                                      null));

            Assert.Throws <ArgumentNullException>(() => DicomSeriesInformationValidator.ValidateVolumeInformation(
                                                      null,
                                                      acceptanceTest));
        }