public void InitTest()
        {
            // Arrange.
            var model = new ProcessReportEditStub();

            model.SecurityConfigurations.Add(new ProcessReportSecurityConfigurationEditStub(111));
            model.SecurityConfigurations.Add(new ProcessReportSecurityConfigurationEditStub(222));

            var parent = Mock.Create<IProcessReportsViewModel>();

            var securityConfigurationViewModelFactory = new ExportFactory<IReportSecurityConfigurationViewModel>(
                () =>
                    {
                        var configViewModel = Mock.Create<IReportSecurityConfigurationViewModel>();
                        Mock.Arrange(() => configViewModel.Init(Arg.IsAny<ProcessReportSecurityConfigurationEdit>()))
                            .DoInstead<ProcessReportSecurityConfigurationEdit>(config => Mock.Arrange(() => configViewModel.Model).Returns(config));

                        return Tuple.Create<IReportSecurityConfigurationViewModel, Action>(configViewModel, () => { });
                    });

            var vm = new ProcessReportViewModel
                         {
                             SecurityConfigurationViewModelFactory = securityConfigurationViewModelFactory
                         };

            // Act.
            vm.Init(model, parent);

            // Assert.
            Assert.AreSame(model, vm.Model);
            Assert.AreSame(parent, vm.Parent);
            Assert.AreEqual(2, vm.SecurityConfigurations.Count);
            Assert.IsTrue(new[] { 111, 222 }.SequenceEqual(vm.SecurityConfigurations.Select(x => x.Model.Id)));
        }
        public void AddSecurityConfigurationTest()
        {
            // Arrange.
            var model = new ProcessReportEditStub();
            var parent = Mock.Create<IProcessReportsViewModel>();

            var securityConfigurationViewModelFactory = new ExportFactory<IReportSecurityConfigurationViewModel>(
                () =>
                    {
                        var configViewModel = Mock.Create<IReportSecurityConfigurationViewModel>();
                        Mock.Arrange(() => configViewModel.Init(Arg.IsAny<ProcessReportSecurityConfigurationEdit>()))
                            .DoInstead<ProcessReportSecurityConfigurationEdit>(config => Mock.Arrange(() => configViewModel.Model).Returns(config));

                        return Tuple.Create<IReportSecurityConfigurationViewModel, Action>(configViewModel, () => { });
                    });

            var vm = new ProcessReportViewModel
            {
                SecurityConfigurationViewModelFactory = securityConfigurationViewModelFactory
            };

            vm.Init(model, parent);

            // Act.
            var configuration1 = vm.AddSecurityConfiguration(1, 2, "Test");

            // Assert.
            Assert.AreEqual(1, vm.SecurityConfigurations.Count);
            Assert.IsTrue(vm.SecurityConfigurations.Contains(configuration1));
            Assert.AreEqual(1, model.SecurityConfigurations.Count);
            Assert.IsTrue(model.SecurityConfigurations.Contains(configuration1.Model));

            // Act - try to add an existing configuration.
            var configuration2 = vm.AddSecurityConfiguration(1, 2, "Test");

            // Assert - existing configuration is returned.
            Assert.AreEqual(1, vm.SecurityConfigurations.Count);
            Assert.AreEqual(1, model.SecurityConfigurations.Count);
            Assert.AreSame(configuration1, configuration2);
        }
        public void RemoveSecurityConfigurationTest()
        {
            // Arrange.
            var model = new ProcessReportEditStub();

            model.SecurityConfigurations.Add(new ProcessReportSecurityConfigurationEditStub(111));
            model.SecurityConfigurations.Add(new ProcessReportSecurityConfigurationEditStub(222));

            var parent = Mock.Create<IProcessReportsViewModel>();

            var securityConfigurationViewModelFactory = new ExportFactory<IReportSecurityConfigurationViewModel>(
                () =>
                    {
                        var configViewModel = Mock.Create<IReportSecurityConfigurationViewModel>();
                        Mock.Arrange(() => configViewModel.Init(Arg.IsAny<ProcessReportSecurityConfigurationEdit>()))
                            .DoInstead<ProcessReportSecurityConfigurationEdit>(config => Mock.Arrange(() => configViewModel.Model).Returns(config));

                        return Tuple.Create<IReportSecurityConfigurationViewModel, Action>(configViewModel, () => { });
                    });

            var vm = new ProcessReportViewModel
                         {
                             SecurityConfigurationViewModelFactory = securityConfigurationViewModelFactory
                         };

            vm.Init(model, parent);

            // Act.
            var configuration = vm.SecurityConfigurations[0];
            vm.RemoveSecurityConfiguration(configuration);

            // Assert.
            Assert.AreEqual(1, vm.SecurityConfigurations.Count);
            Assert.IsFalse(vm.SecurityConfigurations.Contains(configuration));
            Assert.AreEqual(1, model.SecurityConfigurations.Count);
            Assert.IsFalse(model.SecurityConfigurations.Contains(configuration.Model));
        }