public async void DownloadImages_ProperMethodsAreCalled()
        {
            // Arrange
            MockProvider mockProvider = new MockProvider();

            var downloader = mockProvider.GetDicomDownloaderForStudiesFake();
            StudyInfoProvider studyInfoProvider = new StudyInfoProvider(mockProvider.GetDicomQueryProviderForStudiesFake(), downloader);
            InfoIdentifier studyIdentifier = new InfoIdentifier("1.2.3");
            StudyInfo studyInfo = new StudyInfo
            {
                StudyInstanceUID = studyIdentifier
            };

            // Act
            await studyInfoProvider.DownloadImagesAsync(studyInfo);

            // Assert
            Assert.That(() => downloader.Received(1).DownloadAsync(studyIdentifier, Arg.Any<Func<InfoIdentifier, InfoIdentifier, Stream>>()), Throws.Nothing);
        }
        public async void DownloadAsync_NullDownloadAction_DefaultActionIsUsed()
        {
            // Arrange
            var mockProvider = new MockProvider();
            var serverFactory = mockProvider.GetDicomServerFactoryFake();
            var clientFactory = mockProvider.GetDicomClientFactoryFake();
            var requestFactory = mockProvider.GetDicomRequestFactoryFake();

            var dicomDownloader = new DicomDownloader<TestInfo>(serverFactory, clientFactory, requestFactory);
            var identifier = new InfoIdentifier("identifier");

            serverFactory.When(c=>c.CreateDicomServer(Arg.Any<Func<InfoIdentifier, InfoIdentifier, Stream>>())).Do(c =>
            {
                var input = c.Arg<Func<InfoIdentifier, InfoIdentifier, Stream>>();
                input(identifier, new InfoIdentifier("test")).Dispose();
            });

            // Act
            await dicomDownloader.DownloadAsync(identifier);

            // Assert
            Assert.That(File.Exists("./DICOM/identifier/test.dcm"), Is.True);
        }
        public void CreateDicomMoveRequest_CorrectRequestIsCreated()
        {
            // Arrange
            var mockProvider = new MockProvider();
            var settingsProvider = mockProvider.GetSettingsProviderFake();
            settingsProvider.DestinationApplicationEntity.Returns("DestinationAE");
            var identifier = new InfoIdentifier("identifier");

            var dicomRequestFactory = new DicomRequestFactory(settingsProvider);

            // Act
            var request = dicomRequestFactory.CreateDicomMoveRequest(identifier);

            // Assert
            Assert.That(request.DestinationAE, Is.EqualTo("DestinationAE"));
            Assert.That(request.Identifier, Is.SameAs(identifier));
        }
 //protected bool Equals(InfoIdentifier other)
 //{
 //    return string.Equals(StringRepresentation, other.StringRepresentation);
 //}
 protected bool Equals(InfoIdentifier other)
 {
     return string.Equals(StringRepresentation, other.StringRepresentation);
 }
        public async void DownloadAsync_MoveRequestIsAddedAndSent()
        {
            // Arrange
            var mockProvider = new MockProvider();
            var serverFactory = mockProvider.GetDicomServerFactoryFake();
            var clientFactory = mockProvider.GetDicomClientFactoryFake();
            var requestFactory = mockProvider.GetDicomRequestFactoryFake();

            var client = Substitute.For<IDicomClient<TestInfo>>();
            clientFactory.CreateDicomClient().Returns(client);

            var moveRequest = Substitute.For<IDicomMoveRequest>();
            requestFactory.CreateDicomMoveRequest(Arg.Any<InfoIdentifier>()).Returns(moveRequest);

            var dicomDownloader = new DicomDownloader<TestInfo>(serverFactory, clientFactory, requestFactory);
            var identifier = new InfoIdentifier("identifier");
            
            // Act
            await dicomDownloader.DownloadAsync(identifier, GetDownloadActionFake());

            // Assert
            Assert.That(() => requestFactory.Received(1).CreateDicomMoveRequest(identifier), Throws.Nothing);
            Assert.That(() => client.Received(1).AddMoveRequest(moveRequest), Throws.Nothing);
            Assert.That(() => client.Received(1).SendAsync(), Throws.Nothing);
        }
        public void DownloadAsync_SeveralRequest_OnlyOneServerIsRunning()
        {
            // Arrange
            var mockProvider = new MockProvider();
            var serverFactory = mockProvider.GetDicomServerFactoryFake();
            var clientFactory = mockProvider.GetDicomClientFactoryFake();
            var requestFactory = mockProvider.GetDicomRequestFactoryFake();

            var client = Substitute.For<IDicomClient<TestInfo>>();
            clientFactory.CreateDicomClient().Returns(client);

            client.When(c=>c.SendAsync()).Do(c=> Thread.Sleep(100));

            var dicomDownloader = new DicomDownloader<TestInfo>(serverFactory, clientFactory, requestFactory);
            var identifier = new InfoIdentifier("identifier");

            // Act
            Task.WaitAll(
                Task.Factory.StartNew(() => dicomDownloader.DownloadAsync(identifier, GetDownloadActionFake())),
                Task.Factory.StartNew(() => dicomDownloader.DownloadAsync(identifier, GetDownloadActionFake())),
                Task.Factory.StartNew(() => dicomDownloader.DownloadAsync(identifier, GetDownloadActionFake()))
            );
            
            // Assert
            Assert.That(() => serverFactory.Received(1).CreateDicomServer(Arg.Any<Func<InfoIdentifier, InfoIdentifier, Stream>>()), Throws.Nothing);
       }