public void TestPatientAgeTag() { string filename = Path.Combine(TestContext.CurrentContext.TestDirectory, "test.dcm"); var dataset = new DicomDataset(); dataset.Add(DicomTag.SOPInstanceUID, "123.123.123"); dataset.Add(DicomTag.SOPClassUID, "123.123.123"); dataset.Add(new DicomAgeString(DicomTag.PatientAge, "009Y")); var cSharpValue = DicomTypeTranslaterReader.GetCSharpValue(dataset, DicomTag.PatientAge); Assert.AreEqual("009Y", cSharpValue); var file = new DicomFile(dataset); file.Save(filename); var source = new DicomFileCollectionSource(); source.FilenameField = "Path"; source.PreInitialize(new ExplicitListDicomFileWorklist(new[] { filename }), new ThrowImmediatelyDataLoadEventListener()); var chunk = source.GetChunk(new ThrowImmediatelyDataLoadEventListener(), new GracefulCancellationToken()); Assert.AreEqual("009Y", chunk.Rows[0]["PatientAge"]); }
public void AssembleDataTableFromFileArchive() { var zip = Path.Combine(TestContext.CurrentContext.TestDirectory, "TestData.zip"); var dir = Path.Combine(TestContext.CurrentContext.TestDirectory, "TestData"); if (File.Exists(zip)) { File.Delete(zip); } ZipFile.CreateFromDirectory(dir, zip); var fileCount = Directory.GetFiles(dir, "*.dcm").Count(); var source = new DicomFileCollectionSource(); source.FilenameField = "RelativeFileArchiveURI"; source.PreInitialize(new FlatFileToLoadDicomFileWorklist(new FlatFileToLoad(new FileInfo(zip))), new ThrowImmediatelyDataLoadEventListener()); var toMemory = new ToMemoryDataLoadEventListener(true); var result = source.GetChunk(toMemory, new GracefulCancellationToken()); //processed every file once Assert.AreEqual(fileCount, toMemory.LastProgressRecieivedByTaskName.Single().Value.Progress.Value); Assert.Greater(result.Columns.Count, 0); }
public void AssembleDataTableFromFolder() { var file1 = new FileInfo(Path.Combine(TestContext.CurrentContext.TestDirectory, "TestData/FileWithLotsOfTags.dcm")); var file2 = new FileInfo(Path.Combine(TestContext.CurrentContext.TestDirectory, "TestData/IM-0001-0013.dcm")); var controlFile = new FileInfo(Path.Combine(TestContext.CurrentContext.TestDirectory, "list.txt")); File.WriteAllText(controlFile.FullName, file1.FullName + Environment.NewLine + file2.FullName); var source = new DicomFileCollectionSource { FilenameField = "RelativeFileArchiveURI" }; source.PreInitialize(new FlatFileToLoadDicomFileWorklist(new FlatFileToLoad(controlFile)), new ThrowImmediatelyDataLoadEventListener()); var toMemory = new ToMemoryDataLoadEventListener(true); var result = source.GetChunk(toMemory, new GracefulCancellationToken()); Assert.AreEqual(1, result.Rows.Count); result = source.GetChunk(toMemory, new GracefulCancellationToken()); Assert.AreEqual(1, result.Rows.Count); Assert.AreEqual(null, source.GetChunk(toMemory, new GracefulCancellationToken())); }
public void Test_Linux_Root() { var source = new DicomFileCollectionSource { ArchiveRoot = "/" }; Assert.AreEqual("/", source.ArchiveRoot); }
[TestCase(@"./bob/", @"./bob/fish.dcm", @"./fish.dcm")] //if the "root" is relative then we can still express this relative to it public void Test_ApplyArchiveRootToMakeRelativePath(string root, string inputPath, string expectedRelativePath) { var source = new DicomFileCollectionSource { ArchiveRoot = root }; var result = source.ApplyArchiveRootToMakeRelativePath(inputPath); Assert.AreEqual(expectedRelativePath, result); }
public void TestRelativeUri_RelativeInput(string root) { var source = new DicomFileCollectionSource(); source.ArchiveRoot = root; var result = source.ApplyArchiveRootToMakeRelativePath(@"\fish\1.dcm"); Assert.AreEqual(@"\fish\1.dcm", result); result = source.ApplyArchiveRootToMakeRelativePath(@"fish\1.dcm"); Assert.AreEqual(@"fish\1.dcm", result); }
public void AssembleDataTableFromFile() { var source = new DicomFileCollectionSource(); source.FilenameField = "RelativeFileArchiveURI"; var f = Path.Combine(TestContext.CurrentContext.TestDirectory, @"TestData\IM-0001-0013.dcm"); source.PreInitialize(new FlatFileToLoadDicomFileWorklist(new FlatFileToLoad(new FileInfo(f))), new ThrowImmediatelyDataLoadEventListener()); var result = source.GetChunk(new ThrowImmediatelyDataLoadEventListener(), new GracefulCancellationToken()); Assert.AreEqual("IM00010013", result.TableName); Assert.Greater(result.Columns.Count, 0); Assert.IsNull(source.GetChunk(new ThrowImmediatelyDataLoadJob(), new GracefulCancellationToken())); }
public void Test_SingleFile(bool expressRelative) { var db = GetCleanedServer(DatabaseType.MicrosoftSQLServer); var source = new DicomFileCollectionSource { FilenameField = "RelativeFileArchiveURI" }; if (expressRelative) { source.ArchiveRoot = TestContext.CurrentContext.TestDirectory; } var f = new FlatFileToLoad(new FileInfo(Path.Combine(TestContext.CurrentContext.TestDirectory, @"TestData/IM-0001-0013.dcm"))); source.PreInitialize(new FlatFileToLoadDicomFileWorklist(f), new ThrowImmediatelyDataLoadEventListener()); var tbl = source.GetChunk(new ThrowImmediatelyDataLoadEventListener(), new GracefulCancellationToken()); var destination = new DataTableUploadDestination(); destination.PreInitialize(db, new ThrowImmediatelyDataLoadEventListener()); destination.AllowResizingColumnsAtUploadTime = true; destination.ProcessPipelineData(tbl, new ThrowImmediatelyDataLoadEventListener(), new GracefulCancellationToken()); destination.Dispose(new ThrowImmediatelyDataLoadEventListener(), null); var finalTable = db.ExpectTable(destination.TargetTableName); using (var dt = finalTable.GetDataTable()) { //should be 1 row in the final table Assert.AreEqual(1, dt.Rows.Count); //the path referenced should be the file read in relative/absolute format Assert.AreEqual(expressRelative ? "./TestData/IM-0001-0013.dcm": f.File.FullName.Replace('\\', '/') , dt.Rows[0]["RelativeFileArchiveURI"]); } Assert.IsTrue(finalTable.Exists()); finalTable.Drop(); }
public void PipelineTest() { var source = new DicomFileCollectionSource(); source.FilenameField = "RelativeFileArchiveURI"; var f = new FlatFileToLoad(new FileInfo(Path.Combine(TestContext.CurrentContext.TestDirectory, @"TestData\IM-0001-0013.dcm"))); source.PreInitialize(new FlatFileToLoadDicomFileWorklist(f), new ThrowImmediatelyDataLoadEventListener()); var tbl = source.GetChunk(new ThrowImmediatelyDataLoadEventListener(), new GracefulCancellationToken()); var destination = new DataTableUploadDestination(); destination.PreInitialize(DiscoveredDatabaseICanCreateRandomTablesIn, new ThrowImmediatelyDataLoadEventListener()); destination.AllowResizingColumnsAtUploadTime = true; destination.ProcessPipelineData(tbl, new ThrowImmediatelyDataLoadEventListener(), new GracefulCancellationToken()); destination.Dispose(new ThrowImmediatelyDataLoadEventListener(), null); var finalTable = DiscoveredDatabaseICanCreateRandomTablesIn.ExpectTable(destination.TargetTableName); Assert.IsTrue(finalTable.Exists()); finalTable.Drop(); }
public void Test_ElevationXmlLoading() { #region xml values const string validXml1 = @"<TagElevationRequestCollection> <TagElevationRequest> <ColumnName>CodeValueCol</ColumnName> <ElevationPathway>ProcedureCodeSequence->CodeValue</ElevationPathway> </TagElevationRequest> </TagElevationRequestCollection>"; const string validXml2 = @"<TagElevationRequestCollection> <TagElevationRequest> <ColumnName>CodeValueCol2</ColumnName> <ElevationPathway>ProcedureCodeSequence->CodeValue</ElevationPathway> </TagElevationRequest> </TagElevationRequestCollection>"; /// <summary> /// Invalid because the pathway should be sequence->non sequence /// </summary> const string invalidXml = @"<TagElevationRequestCollection> <TagElevationRequest> <ColumnName>CodeValueCol</ColumnName> <ElevationPathway>CodeValue->CodeValue</ElevationPathway> </TagElevationRequest> </TagElevationRequestCollection>"; #endregion var source = new DicomFileCollectionSource(); var file = Path.Combine(TestContext.CurrentContext.WorkDirectory, "me.xml"); //no elevation to start with Assert.IsNull(source.LoadElevationRequestsFile()); //illegal file File.WriteAllText(file, "<lolz>"); source.TagElevationConfigurationFile = new FileInfo(file); var ex = Assert.Throws <XmlException>(() => source.LoadElevationRequestsFile()); StringAssert.Contains("Unexpected end of file", ex.Message); File.WriteAllText(file, invalidXml); var ex2 = Assert.Throws <TagNavigationException>(() => source.LoadElevationRequestsFile()); StringAssert.Contains("Navigation Token CodeValue was not the final token in the pathway", ex2.Message); File.WriteAllText(file, validXml1); Assert.AreEqual("CodeValueCol", source.LoadElevationRequestsFile().Requests.Single().ColumnName); //Setting the xml property will override the file xml source.TagElevationConfigurationXml = new DicomSource.TagElevationXml() { xml = "<lolz>" }; var ex3 = Assert.Throws <XmlException>(() => source.LoadElevationRequestsFile()); StringAssert.Contains("Unexpected end of file", ex3.Message); source.TagElevationConfigurationXml = new DicomSource.TagElevationXml() { xml = invalidXml }; var ex4 = Assert.Throws <TagNavigationException>(() => source.LoadElevationRequestsFile()); StringAssert.Contains("Navigation Token CodeValue was not the final token in the pathway", ex4.Message); source.TagElevationConfigurationXml = new DicomSource.TagElevationXml() { xml = validXml2 }; Assert.AreEqual("CodeValueCol2", source.LoadElevationRequestsFile().Requests.Single().ColumnName); //now we go back to the file one (by setting the xml one to null) source.TagElevationConfigurationXml = null; Assert.AreEqual("CodeValueCol", source.LoadElevationRequestsFile().Requests.Single().ColumnName); source.TagElevationConfigurationXml = new DicomSource.TagElevationXml() { xml = "" }; Assert.AreEqual("CodeValueCol", source.LoadElevationRequestsFile().Requests.Single().ColumnName); source.TagElevationConfigurationXml = new DicomSource.TagElevationXml() { xml = " \r\n " }; Assert.AreEqual("CodeValueCol", source.LoadElevationRequestsFile().Requests.Single().ColumnName); }
public void Test_ZipFile(bool expressRelative) { //get a clean database to upload to var db = GetCleanedServer(DatabaseType.MicrosoftSQLServer); //create a folder in which to generate some dicoms var dirToLoad = new DirectoryInfo(Path.Combine(TestContext.CurrentContext.TestDirectory, nameof(Test_ZipFile))); if (dirToLoad.Exists) { dirToLoad.Delete(true); } dirToLoad.Create(); //generate some random dicoms var r = new Random(999); DicomDataGenerator generator = new DicomDataGenerator(r, dirToLoad, "CT") { MaximumImages = 5 }; var people = new PersonCollection(); people.GeneratePeople(1, r); generator.GenerateTestDataFile(people, new FileInfo("./inventory.csv"), 1); //This generates // Test_ZipFile // 2015 // 3 // 18 // 751140 2.25.166922918107154891877498685128076062226.dcm // 751140 2.25.179610809676265137473873365625829826423.dcm // 751140 2.25.201969634959506849065133495434871450465.dcm // 751140 2.25.237492679533001779093365416814254319890.dcm // 751140 2.25.316241631782653383510844072713132248731.dcm var yearDir = dirToLoad.GetDirectories().Single(); StringAssert.IsMatch("\\d{4}", yearDir.Name); //zip them up FileInfo zip = new FileInfo(Path.Combine(TestContext.CurrentContext.TestDirectory, nameof(Test_ZipFile) + ".zip")); Path.Combine(TestContext.CurrentContext.TestDirectory, nameof(Test_ZipFile) + ".zip"); if (zip.Exists) { zip.Delete(); } ZipFile.CreateFromDirectory(dirToLoad.FullName, zip.FullName); //tell the source to load the zip var f = new FlatFileToLoad(zip); var source = new DicomFileCollectionSource { FilenameField = "RelativeFileArchiveURI" }; if (expressRelative) { source.ArchiveRoot = TestContext.CurrentContext.TestDirectory; } source.PreInitialize(new FlatFileToLoadDicomFileWorklist(f), new ThrowImmediatelyDataLoadEventListener()); var tbl = source.GetChunk(new ThrowImmediatelyDataLoadEventListener(), new GracefulCancellationToken()); var destination = new DataTableUploadDestination(); destination.PreInitialize(db, new ThrowImmediatelyDataLoadEventListener()); destination.AllowResizingColumnsAtUploadTime = true; destination.ProcessPipelineData(tbl, new ThrowImmediatelyDataLoadEventListener(), new GracefulCancellationToken()); destination.Dispose(new ThrowImmediatelyDataLoadEventListener(), null); var finalTable = db.ExpectTable(destination.TargetTableName); using (var dt = finalTable.GetDataTable()) { //should be 5 rows in the final table (5 images) Assert.AreEqual(5, dt.Rows.Count); string pathInDbToDicomFile = (string)dt.Rows[0]["RelativeFileArchiveURI"]; //We expect either something like: // E:/RdmpDicom/Rdmp.Dicom.Tests/bin/Debug/netcoreapp2.2/Test_ZipFile.zip!2015/3/18/2.25.160787663560951826149226183314694084702.dcm // ./Test_ZipFile.zip!2015/3/18/2.25.105592977437473375573190160334447272386.dcm //the path referenced should be the file read in relative/absolute format StringAssert.IsMatch( expressRelative ? $@"./{zip.Name}![\d./]*.dcm": $@"{Regex.Escape(zip.FullName.Replace('\\','/'))}![\d./]*.dcm", pathInDbToDicomFile); StringAssert.Contains(yearDir.Name, pathInDbToDicomFile, "Expected zip file to have subdirectories and for them to be loaded correctly"); //confirm we can read that out again using (var pool = new ZipPool()) { var path = new AmbiguousFilePath(TestContext.CurrentContext.TestDirectory, pathInDbToDicomFile); Assert.IsNotNull(path.GetDataset(pool)); } } Assert.IsTrue(finalTable.Exists()); finalTable.Drop(); }
public void Test_ZipFileNotation(bool expressRelative) { //get a clean database to upload to var db = GetCleanedServer(DatabaseType.MicrosoftSQLServer); //create a folder in which to generate some dicoms var dirToLoad = new DirectoryInfo(Path.Combine(TestContext.CurrentContext.TestDirectory, nameof(Test_ZipFileNotation))); if (dirToLoad.Exists) { dirToLoad.Delete(true); } dirToLoad.Create(); //generate some random dicoms var r = new Random(999); DicomDataGenerator generator = new DicomDataGenerator(r, dirToLoad, "CT") { MaximumImages = 5 }; var people = new PersonCollection(); people.GeneratePeople(1, r); generator.GenerateTestDataFile(people, new FileInfo("./inventory.csv"), 1); //This generates // Test_ZipFile // 2015 // 3 // 18 // 751140 2.25.166922918107154891877498685128076062226.dcm // 751140 2.25.179610809676265137473873365625829826423.dcm // 751140 2.25.201969634959506849065133495434871450465.dcm // 751140 2.25.237492679533001779093365416814254319890.dcm // 751140 2.25.316241631782653383510844072713132248731.dcm var yearDir = dirToLoad.GetDirectories().Single(); StringAssert.IsMatch("\\d{4}", yearDir.Name); //should be 5 images in the zip file var dicomFiles = yearDir.GetFiles("*.dcm", SearchOption.AllDirectories); Assert.AreEqual(5, dicomFiles.Length); //e.g. \2015\3\18\2.25.223398837779449245317520567111874824918.dcm //e.g. \2015\3\18\2.25.179610809676265137473873365625829826423.dcm var relativePathWithinZip1 = dicomFiles[0].FullName.Substring(dirToLoad.FullName.Length); var relativePathWithinZip2 = dicomFiles[1].FullName.Substring(dirToLoad.FullName.Length); //zip them up FileInfo zip = new FileInfo(Path.Combine(TestContext.CurrentContext.TestDirectory, nameof(Test_ZipFile) + ".zip")); Path.Combine(TestContext.CurrentContext.TestDirectory, nameof(Test_ZipFile) + ".zip"); if (zip.Exists) { zip.Delete(); } ZipFile.CreateFromDirectory(dirToLoad.FullName, zip.FullName); //e.g. E:\RdmpDicom\Rdmp.Dicom.Tests\bin\Debug\netcoreapp2.2\Test_ZipFile.zip!\2015\3\18\2.25.223398837779449245317520567111874824918.dcm string pathToLoad1 = zip.FullName + "!" + relativePathWithinZip1; string pathToLoad2 = zip.FullName + "!" + relativePathWithinZip2; var loadMeTextFile = new FileInfo(Path.Combine(dirToLoad.FullName, "LoadMe.txt")); //tell the source to load the zip File.WriteAllText(loadMeTextFile.FullName, string.Join(Environment.NewLine, pathToLoad1, pathToLoad2)); var f = new FlatFileToLoad(loadMeTextFile); //Setup source var source = new DicomFileCollectionSource { FilenameField = "RelativeFileArchiveURI" }; if (expressRelative) { source.ArchiveRoot = TestContext.CurrentContext.TestDirectory; } var worklist = new FlatFileToLoadDicomFileWorklist(f); //Setup destination var destination = new DataTableUploadDestination { AllowResizingColumnsAtUploadTime = true }; //setup pipeline var contextFactory = new DataFlowPipelineContextFactory <DataTable>(); var context = contextFactory.Create(PipelineUsage.FixedDestination | PipelineUsage.FixedDestination); //run pipeline var pipe = new DataFlowPipelineEngine <DataTable>(context, source, destination, new ThrowImmediatelyDataLoadEventListener()); pipe.Initialize(db, worklist); pipe.ExecutePipeline(new GracefulCancellationToken()); var finalTable = db.ExpectTable(destination.TargetTableName); using (var dt = finalTable.GetDataTable()) { //should be 2 rows (since we told it to only load 2 files out of the zip) Assert.AreEqual(2, dt.Rows.Count); string pathInDbToDicomFile = (string)dt.Rows[0]["RelativeFileArchiveURI"]; //We expect either something like: // E:/RdmpDicom/Rdmp.Dicom.Tests/bin/Debug/netcoreapp2.2/Test_ZipFile.zip!2015/3/18/2.25.160787663560951826149226183314694084702.dcm // ./Test_ZipFile.zip!2015/3/18/2.25.105592977437473375573190160334447272386.dcm //the path referenced should be the file read in relative/absolute format StringAssert.IsMatch( expressRelative ? $@"./{zip.Name}![\d./]*.dcm": $@"{Regex.Escape(zip.FullName.Replace('\\','/'))}![\d./]*.dcm", pathInDbToDicomFile); StringAssert.Contains(yearDir.Name, pathInDbToDicomFile, "Expected zip file to have subdirectories and for them to be loaded correctly"); //confirm we can read that out again using (var pool = new ZipPool()) { var path = new AmbiguousFilePath(TestContext.CurrentContext.TestDirectory, pathInDbToDicomFile); Assert.IsNotNull(path.GetDataset(pool)); } } Assert.IsTrue(finalTable.Exists()); finalTable.Drop(); }