예제 #1
0
        public void SaveProjectAs_ValidPathToLockedFile_ThrowsUpdateStorageException()
        {
            // Setup
            string         tempProjectFilePath = Path.Combine(workingDirectory, nameof(SaveProjectAs_ValidPathToLockedFile_ThrowsUpdateStorageException));
            RiskeerProject project             = CreateProject();
            var            storage             = new StorageSqLite();

            storage.StageProject(project);

            using (var fileDisposeHelper = new FileDisposeHelper(tempProjectFilePath))
            {
                try
                {
                    fileDisposeHelper.LockFiles();

                    // Call
                    void Call() => storage.SaveProjectAs(tempProjectFilePath);

                    // Assert
                    var exception = Assert.Throws <StorageException>(Call);

                    Assert.IsInstanceOf <Exception>(exception);
                    Assert.IsInstanceOf <IOException>(exception.InnerException);
                    Assert.IsInstanceOf <Exception>(exception);
                    Assert.AreEqual("Het doelbestand is momenteel in gebruik.", exception.Message);
                }
                finally
                {
                    CallGarbageCollector();
                }
            }
        }
예제 #2
0
        /// <summary>
        /// Reads the <see cref="ProjectEntity"/> and use the information to construct a <see cref="RiskeerProject"/>.
        /// </summary>
        /// <param name="entity">The <see cref="ProjectEntity"/> to create <see cref="RiskeerProject"/> for.</param>
        /// <param name="collector">The object keeping track of read operations.</param>
        /// <returns>A new <see cref="RiskeerProject"/>.</returns>
        /// <exception cref="ArgumentNullException">Thrown when <paramref name="collector"/> is <c>null</c>.</exception>
        /// <exception cref="EntityReadException">Thrown when <paramref name="entity"/> could not be read successfully.</exception>
        internal static RiskeerProject Read(this ProjectEntity entity, ReadConversionCollector collector)
        {
            if (collector == null)
            {
                throw new ArgumentNullException(nameof(collector));
            }

            int nrOfAssessmentSectionEntities = entity.AssessmentSectionEntities.Count;

            if (nrOfAssessmentSectionEntities > 1)
            {
                throw new EntityReadException(Resources.ProjectEntityReadExtensions_Read_ProjectEntity_contains_more_than_one_AssessmentSection);
            }

            if (nrOfAssessmentSectionEntities == 0)
            {
                throw new EntityReadException(Resources.ProjectEntityReadExtensions_Read_ProjectEntity_contains_no_AssessmentSection);
            }

            AssessmentSection assessmentSection = ReadAssessmentSection(entity, collector);
            var project = new RiskeerProject(assessmentSection)
            {
                Description = entity.Description
            };

            return(project);
        }
예제 #3
0
        public void LoadProject_ReadProjectThrowsEntityReadException_ThrowsStorageException()
        {
            // Setup
            string tempProjectFilePath = Path.Combine(workingDirectory, nameof(LoadProject_ReadProjectThrowsEntityReadException_ThrowsStorageException));
            var    storage             = new StorageSqLite();

            RiskeerProject project = CreateProject();

            // Precondition
            void Precondition()
            {
                SqLiteDatabaseHelper.CreateValidProjectDatabase(tempProjectFilePath, project);
                SqLiteDatabaseHelper.SetInvalidNumberOfAssessmentSectionEntities(tempProjectFilePath);
            }

            Assert.DoesNotThrow(Precondition);

            // Call
            void Call() => storage.LoadProject(tempProjectFilePath);

            // Assert
            var       exception      = Assert.Throws <StorageException>(Call);
            Exception innerException = exception.InnerException;

            Assert.IsInstanceOf <EntityReadException>(innerException);

            var expectedMessage = $"Fout bij het lezen van bestand '{tempProjectFilePath}': {innerException.Message.FirstToLower()}";

            Assert.AreEqual(expectedMessage, exception.Message);
        }
예제 #4
0
        public void Create_PersistenceRegistryNull_ThrowsArgumentNullException()
        {
            // Setup
            var project = new RiskeerProject(new AssessmentSection(AssessmentSectionComposition.Dike));

            // Call
            TestDelegate test = () => project.Create(null);

            // Assert
            string parameterName = Assert.Throws <ArgumentNullException>(test).ParamName;

            Assert.AreEqual("registry", parameterName);
        }
예제 #5
0
        public void DefaultConstructor_ExpectedValue()
        {
            // Setup
            AssessmentSection assessmentSection = CreateAssessmentSection();

            // Call
            var project = new RiskeerProject(assessmentSection);

            // Assert
            Assert.IsInstanceOf <IProject>(project);
            Assert.AreEqual("Project", project.Name);
            Assert.AreEqual("", project.Description);
            Assert.AreSame(assessmentSection, project.AssessmentSection);
        }
예제 #6
0
        public void NameConstructor_SetNameAndInitializeOtherProperties()
        {
            // Setup
            const string      someName          = "<Some name>";
            AssessmentSection assessmentSection = CreateAssessmentSection();

            // Call
            var project = new RiskeerProject(someName, assessmentSection);

            // Assert
            Assert.IsInstanceOf <IProject>(project);
            Assert.AreEqual(someName, project.Name);
            Assert.AreEqual("", project.Description);
            Assert.AreSame(assessmentSection, project.AssessmentSection);
        }
예제 #7
0
        public void GivenProjectEntity_WhenGeneratingFingerprintMultipleTime_ThenHashRemainsEqual()
        {
            // Given
            RiskeerProject project = RiskeerProjectTestHelper.GetFullTestProject();
            ProjectEntity  entity  = project.Create(new PersistenceRegistry());

            // When
            byte[] hash1 = FingerprintHelper.Get(entity);
            byte[] hash2 = FingerprintHelper.Get(entity);

            // Then
            Assert.IsNotNull(hash1);
            CollectionAssert.IsNotEmpty(hash1);
            CollectionAssert.AreEqual(hash1, hash2);
        }
예제 #8
0
        /// <summary>
        /// Creates a <see cref="ProjectEntity"/> based on the information of the <see cref="RiskeerProject"/>.
        /// </summary>
        /// <param name="project">The project to create a database entity for.</param>
        /// <param name="registry">The object keeping track of create operations.</param>
        /// <returns>A new <see cref="ProjectEntity"/>.</returns>
        /// <exception cref="ArgumentNullException">Thrown when <paramref name="registry"/> is <c>null</c>.</exception>
        internal static ProjectEntity Create(this RiskeerProject project, PersistenceRegistry registry)
        {
            if (registry == null)
            {
                throw new ArgumentNullException(nameof(registry));
            }

            var entity = new ProjectEntity
            {
                Description = project.Description.DeepClone()
            };

            entity.AssessmentSectionEntities.Add(project.AssessmentSection.Create(registry));

            return(entity);
        }
예제 #9
0
        public void GivenProjectEntity_WhenComparingFingerprintsBeforeAndAfterChange_ThenHashDifferent()
        {
            // Given
            RiskeerProject project = RiskeerProjectTestHelper.GetFullTestProject();
            ProjectEntity  entity  = project.Create(new PersistenceRegistry());

            // When
            byte[] hash1 = FingerprintHelper.Get(entity);
            entity.AssessmentSectionEntities.First().Name = "Something completely different";
            byte[] hash2 = FingerprintHelper.Get(entity);

            // Then
            Assert.IsNotNull(hash1);
            CollectionAssert.IsNotEmpty(hash1);
            CollectionAssert.AreNotEqual(hash1, hash2);
        }
예제 #10
0
        public void GetRootData_RiskeerProject_ReturnsExpectedRootData()
        {
            // Setup
            var assessmentSection = new AssessmentSection(AssessmentSectionComposition.Dike);
            var project           = new RiskeerProject(assessmentSection);

            // Call
            object rootData = info.GetRootData(project);

            // Assert
            Assert.IsNotNull(rootData);
            Assert.IsInstanceOf <AssessmentSectionStateRootContext>(rootData);

            var assessmentSectionStateRootContext = (AssessmentSectionStateRootContext)rootData;

            Assert.AreSame(assessmentSection, assessmentSectionStateRootContext.WrappedData);
        }
예제 #11
0
        public void GivenProjectEntity_WhenGeneratingFingerprintEqualData_ThenHashRemainsEqual()
        {
            // Setup
            RiskeerProject project1 = RiskeerProjectTestHelper.GetFullTestProject();
            RiskeerProject project2 = RiskeerProjectTestHelper.GetFullTestProject();
            ProjectEntity  entity1  = project1.Create(new PersistenceRegistry());
            ProjectEntity  entity2  = project2.Create(new PersistenceRegistry());

            // Call
            byte[] hash1 = FingerprintHelper.Get(entity1);
            byte[] hash2 = FingerprintHelper.Get(entity2);

            // Assert
            Assert.IsNotNull(hash1);
            CollectionAssert.IsNotEmpty(hash1);
            CollectionAssert.AreEqual(hash1, hash2);
        }
예제 #12
0
 /// <summary>
 /// Converts the <paramref name="project"/> into a new project database file.
 /// </summary>
 /// <param name="databaseFilePath">Path to database file.</param>
 /// <param name="project"><see cref="RiskeerProject"/> to save.</param>
 public static void CreateValidProjectDatabase(string databaseFilePath, RiskeerProject project)
 {
     try
     {
         var storageSqLite = new StorageSqLite();
         storageSqLite.StageProject(project);
         storageSqLite.SaveProjectAs(databaseFilePath);
     }
     catch (Exception exception)
     {
         Assert.Fail("Precondition failed: creating database file failed due to {0}", exception);
     }
     finally
     {
         SQLiteConnection.ClearAllPools();
     }
 }
예제 #13
0
        public void AutomaticProperties_SetAndGettingValue_ShouldReturnSetValue()
        {
            // Setup
            const string niceProjectName  = "Nice project name";
            const string nicerDescription = "Nicer description";

            // Call
            var project = new RiskeerProject(CreateAssessmentSection())
            {
                Name        = niceProjectName,
                Description = nicerDescription
            };

            // Assert
            Assert.AreEqual(niceProjectName, project.Name);
            Assert.AreEqual(nicerDescription, project.Description);
        }
예제 #14
0
        public void Create_StringPropertiesDoNotShareReference()
        {
            // Setup
            const string testdescription = "original description";
            var          project         = new RiskeerProject(new AssessmentSection(AssessmentSectionComposition.Dike))
            {
                Description = testdescription
            };
            var registry = new PersistenceRegistry();

            // Call
            ProjectEntity entity = project.Create(registry);

            // Assert
            Assert.AreNotSame(testdescription, entity.Description);
            Assert.AreEqual(testdescription, entity.Description);
        }
예제 #15
0
        public void SaveProjectAs_ValidPathToExistingFile_DoesNotThrowException()
        {
            // Setup
            string         tempProjectFilePath = Path.Combine(workingDirectory, nameof(SaveProjectAs_ValidPathToExistingFile_DoesNotThrowException));
            RiskeerProject project             = CreateProject();
            var            storage             = new StorageSqLite();

            storage.StageProject(project);

            using (File.Create(tempProjectFilePath)) {}

            // Call
            void Call() => storage.SaveProjectAs(tempProjectFilePath);

            // Assert
            Assert.DoesNotThrow(Call);
        }
예제 #16
0
        public void SaveProjectAs_InvalidPath_ThrowsArgumentException(string invalidPath)
        {
            // Setup
            RiskeerProject project = CreateProject();

            var storage = new StorageSqLite();

            storage.StageProject(project);

            // Call
            void Call() => storage.SaveProjectAs(invalidPath);

            // Assert
            var exception = Assert.Throws <ArgumentException>(Call);

            Assert.AreEqual($"Fout bij het lezen van bestand '{invalidPath}': bestandspad mag niet "
                            + "leeg of ongedefinieerd zijn.", exception.Message);
        }
예제 #17
0
        public void Create_WithRegistry_ReturnsProjectEntityWithDescription()
        {
            // Setup
            const string testDescription = "testDescription";
            var          project         = new RiskeerProject(new AssessmentSection(AssessmentSectionComposition.Dike))
            {
                Description = testDescription
            };
            var registry = new PersistenceRegistry();

            // Call
            ProjectEntity entity = project.Create(registry);

            // Assert
            Assert.NotNull(entity);
            Assert.AreEqual(testDescription, entity.Description);
            Assert.AreEqual(1, entity.AssessmentSectionEntities.Count);
        }
예제 #18
0
        public void HasStagedProjectChanges_ValidProjectLoaded_ReturnsFalse()
        {
            // Setup
            var            storageSqLite       = new StorageSqLite();
            RiskeerProject storedProject       = CreateProject();
            string         tempProjectFilePath = Path.Combine(workingDirectory, nameof(HasStagedProjectChanges_ValidProjectLoaded_ReturnsFalse));

            SqLiteDatabaseHelper.CreateValidProjectDatabase(tempProjectFilePath, storedProject);
            IProject loadedProject = storageSqLite.LoadProject(tempProjectFilePath);

            storageSqLite.StageProject(loadedProject);

            // Call
            bool hasChanges = storageSqLite.HasStagedProjectChanges(tempProjectFilePath);

            // Assert
            Assert.IsFalse(hasChanges);
        }
예제 #19
0
        public void NotifyObservers_WithObserverAttached_ObserverIsNotified()
        {
            // Setup
            var mockRepository = new MockRepository();
            var observer       = mockRepository.StrictMock <IObserver>();

            observer.Expect(o => o.UpdateObserver());
            mockRepository.ReplayAll();

            var project = new RiskeerProject(CreateAssessmentSection());

            project.Attach(observer);

            // Call
            project.NotifyObservers();

            // Assert
            mockRepository.VerifyAll();
        }
예제 #20
0
        public void HasStagedProjectChanges_ValidProjectLoadedWithAffectedChange_ReturnsTrue()
        {
            // Setup
            var            storageSqLite       = new StorageSqLite();
            RiskeerProject storedProject       = RiskeerProjectTestHelper.GetFullTestProject();
            const string   changedDescription  = "some description";
            string         tempProjectFilePath = Path.Combine(workingDirectory, nameof(HasStagedProjectChanges_ValidProjectLoadedWithAffectedChange_ReturnsTrue));

            SqLiteDatabaseHelper.CreateValidProjectDatabase(tempProjectFilePath, storedProject);
            IProject loadedProject = storageSqLite.LoadProject(tempProjectFilePath);

            loadedProject.Description = changedDescription;
            storageSqLite.StageProject(loadedProject);

            // Call
            bool hasChanges = storageSqLite.HasStagedProjectChanges(tempProjectFilePath);

            // Assert
            Assert.IsTrue(hasChanges);
        }
        public void Read_WithAssessmentSection_ReturnsNewProjectWithAssessmentSection()
        {
            // Setup
            AssessmentSectionEntity assessmentSectionEntity = CreateAssessmentSectionEntity(1);
            var entity = new ProjectEntity
            {
                Description = "testName",
                AssessmentSectionEntities =
                {
                    assessmentSectionEntity
                }
            };

            // Call
            RiskeerProject project = entity.Read(new ReadConversionCollector());

            // Assert
            Assert.AreEqual(entity.Description, project.Description);
            Assert.AreEqual(assessmentSectionEntity.Name, project.AssessmentSection.Name);
        }
예제 #22
0
        public void LoadProject_ValidDatabase_ReturnsProject()
        {
            // Setup
            string tempProjectFilePath = Path.Combine(workingDirectory, nameof(LoadProject_ValidDatabase_ReturnsProject));
            string projectName         = Path.GetFileNameWithoutExtension(tempProjectFilePath);
            var    storage             = new StorageSqLite();

            RiskeerProject project = CreateProject();

            project.Description = "<some description>";

            // Precondition
            SqLiteDatabaseHelper.CreateValidProjectDatabase(tempProjectFilePath, project);

            // Call
            IProject loadedProject = storage.LoadProject(tempProjectFilePath);

            // Assert
            Assert.IsInstanceOf <RiskeerProject>(loadedProject);
            Assert.AreEqual(projectName, loadedProject.Name);
            Assert.AreEqual(project.Description, loadedProject.Description);
        }
예제 #23
0
        public void LoadAssessmentSection_LoadingProjectSuccessful_ReturnsRiskeerProject()
        {
            // Setup
            RiskeerProject project = CreateProject();

            var mocks        = new MockRepository();
            var storeProject = mocks.StrictMock <IStoreProject>();

            storeProject.Expect(sp => sp.LoadProject(null))
            .IgnoreArguments()
            .Return(project);
            mocks.ReplayAll();

            var service = new LoadAssessmentSectionService(storeProject);

            // Call
            AssessmentSection assessmentSection = service.LoadAssessmentSection(string.Empty);

            // Assert
            Assert.AreSame(project.AssessmentSection, assessmentSection);
            mocks.VerifyAll();
        }
예제 #24
0
        public void HasStagedProjectChanges_SavedToEmptyDatabaseFile_ReturnsFalse()
        {
            // Setup
            var    storage             = new StorageSqLite();
            string tempProjectFilePath = Path.Combine(workingDirectory, nameof(HasStagedProjectChanges_SavedToEmptyDatabaseFile_ReturnsFalse));

            RiskeerProject project = CreateProject();

            // Precondition, required to set the connection string
            storage.StageProject(project);
            void Precondition() => storage.SaveProjectAs(tempProjectFilePath);

            Assert.DoesNotThrow(Precondition, "Precondition failed: creating database file failed");

            storage.StageProject(project);

            // Call
            bool hasChanges = storage.HasStagedProjectChanges(tempProjectFilePath);

            // Assert
            Assert.IsFalse(hasChanges);
        }
예제 #25
0
 public StagedProject(RiskeerProject projectModel, ProjectEntity projectEntity)
 {
     Model  = projectModel;
     Entity = projectEntity;
 }