public void TestConstruction()
        {
            var model = new AnalysisPageViewModel(_id, _template, _analyser.Object, _analysisStorage.Object, _pluginRegistry);

            model.Name.Should().NotBeEmpty();
            model.PageLayout.Should().Be(PageLayout.WrapHorizontal);
            model.Layout.Should().NotBeNull();
            model.Layout.Should().BeOfType <HorizontalWidgetLayoutViewModel>();
        }
        public void TestCtor()
        {
            var model = new AnalysisPageViewModel(_template, _analyser.Object);

            model.Name.Should().NotBeEmpty();
            model.PageLayout.Should().Be(PageLayout.WrapHorizontal);
            model.Layout.Should().NotBeNull();
            model.Layout.Should().BeOfType <HorizontalWidgetLayoutViewModel>();
        }
        public void TestOnTemplateModified()
        {
            var model  = new AnalysisPageViewModel(_id, _template, _analyser.Object, _analysisStorage.Object, _pluginRegistry);
            var widget = AddWidget(model);

            _analysisStorage.Verify(x => x.SaveAsync(It.Is <AnalysisId>(y => y == _id)), Times.Once, "because we've added a new widget");

            widget.Raise(x => x.TemplateModified += null);
            _analysisStorage.Verify(x => x.SaveAsync(It.Is <AnalysisId>(y => y == _id)), Times.Exactly(2), "because the new widget has requested another save");

            widget.Raise(x => x.TemplateModified += null);
            _analysisStorage.Verify(x => x.SaveAsync(It.Is <AnalysisId>(y => y == _id)), Times.Exactly(3), "because the new widget has requested another save");
        }
        private Mock <IWidgetViewModel> AddWidget(AnalysisPageViewModel model)
        {
            var widget  = new Mock <IWidgetViewModel>();
            var factory = new Mock <IWidgetPlugin>();

            factory.Setup(x => x.CreateViewModel(It.IsAny <IWidgetTemplate>(), It.IsAny <IDataSourceAnalyser>()))
            .Returns(widget.Object);

            var layout = (HorizontalWrapWidgetLayoutViewModel)model.Layout;

            layout.RaiseRequestAdd(factory.Object);

            return(widget);
        }
        public void TestRequestAddWidget1()
        {
            var model  = new AnalysisPageViewModel(_template, _analyser.Object);
            var layout = (HorizontalWidgetLayoutViewModel)model.Layout;

            var widget  = new Mock <IWidgetViewModel>().Object;
            var factory = new Mock <IWidgetPlugin>();

            factory.Setup(x => x.CreateViewModel(It.IsAny <IWidgetTemplate>(), It.IsAny <IDataSourceAnalyser>()))
            .Returns(widget);

            layout.Widgets.Should().NotContain(widget);

            layout.RaiseRequestAdd(factory.Object);
            layout.Widgets.Should().Contain(widget);
        }
        public void TestRequestAddWidget4()
        {
            var model  = new AnalysisPageViewModel(_id, _template, _analyser.Object, _analysisStorage.Object, _pluginRegistry);
            var layout = (HorizontalWrapWidgetLayoutViewModel)model.Layout;

            var widget  = new Mock <IWidgetViewModel>().Object;
            var factory = new Mock <IWidgetPlugin>();

            factory.Setup(x => x.CreateViewModel(It.IsAny <IWidgetTemplate>(), It.IsAny <IDataSourceAnalyser>()))
            .Returns(widget);


            _analysisStorage.Verify(x => x.SaveAsync(It.IsAny <AnalysisId>()), Times.Never);

            layout.RaiseRequestAdd(factory.Object);
            _analysisStorage.Verify(x => x.SaveAsync(_id), Times.Once,
                                    "because the page should've saved the analysis now that a widget's been added");
        }
        public void TestRemoveWidget()
        {
            var model  = new AnalysisPageViewModel(_template, _analyser.Object);
            var layout = (HorizontalWidgetLayoutViewModel)model.Layout;

            var widget  = new Mock <IWidgetViewModel>();
            var factory = new Mock <IWidgetPlugin>();

            factory.Setup(x => x.CreateViewModel(It.IsAny <IWidgetTemplate>(), It.IsAny <IDataSourceAnalyser>()))
            .Returns(widget.Object);

            layout.RaiseRequestAdd(factory.Object);
            layout.Widgets.Should().Contain(widget.Object);

            widget.Raise(x => x.OnDelete += null, widget.Object);
            layout.Widgets.Should().BeEmpty();
            _analyser.Verify(x => x.Remove(It.IsAny <IDataSourceAnalyser>()), Times.Once,
                             "because the analyser created with that widget should've been removed again");
        }
        public void TestChangeLayout()
        {
            var model = new AnalysisPageViewModel(_id, _template, _analyser.Object, _analysisStorage.Object, _pluginRegistry);

            model.PageLayout = PageLayout.Columns;
            model.Layout.Should().BeOfType <ColumnWidgetLayoutViewModel>();
            _template.Layout.Should().BeOfType <ColumnWidgetLayoutTemplate>("because the template should have been modified");
            _analysisStorage.Verify(x => x.SaveAsync(It.Is <AnalysisId>(y => y == _id)), Times.Once);

            model.PageLayout = PageLayout.Rows;
            model.Layout.Should().BeOfType <RowWidgetLayoutViewModel>();
            _template.Layout.Should().BeOfType <RowWidgetLayoutTemplate>("because the template should have been modified");
            _analysisStorage.Verify(x => x.SaveAsync(It.Is <AnalysisId>(y => y == _id)), Times.Exactly(2));

            model.PageLayout = PageLayout.WrapHorizontal;
            model.Layout.Should().BeOfType <HorizontalWrapWidgetLayoutViewModel>();
            _template.Layout.Should().BeOfType <HorizontalWidgetLayoutTemplate>("because the template should have been modified");
            _analysisStorage.Verify(x => x.SaveAsync(It.Is <AnalysisId>(y => y == _id)), Times.Exactly(3));
        }
        public void TestRequestAddWidget3()
        {
            var model  = new AnalysisPageViewModel(_id, _template, _analyser.Object, _analysisStorage.Object, _pluginRegistry);
            var layout = (HorizontalWrapWidgetLayoutViewModel)model.Layout;

            var widget  = new Mock <IWidgetViewModel>().Object;
            var factory = new Mock <IWidgetPlugin>();

            factory.Setup(x => x.CreateViewModel(It.IsAny <IWidgetTemplate>(), It.IsAny <IDataSourceAnalyser>()))
            .Returns(widget);

            layout.RaiseRequestAdd(factory.Object);

            model.PageLayout = PageLayout.None;
            model.PageLayout = PageLayout.WrapHorizontal;

            model.Layout.Should().NotBeSameAs(layout);
            ((HorizontalWrapWidgetLayoutViewModel)model.Layout).Widgets.Should().Contain(x => x.InnerViewModel == widget);
        }
        public void TestRequestAddWidget2()
        {
            var model = new AnalysisPageViewModel(_template, _analyser.Object);

            var factory = new Mock <IWidgetPlugin>();

            factory.Setup(x => x.CreateViewModel(It.IsAny <IWidgetTemplate>(), It.IsAny <IDataSourceAnalyser>()))
            .Returns((IWidgetTemplate template, IDataSourceAnalyser analyser) =>
            {
                var widget = new Mock <IWidgetViewModel>();
                widget.Setup(x => x.Template).Returns(template);
                return(widget.Object);
            });

            var layout = (HorizontalWidgetLayoutViewModel)model.Layout;

            layout.RaiseRequestAdd(factory.Object);

            _template.Widgets.Should().HaveCount(1);
            _template.Widgets.First().Should().NotBeNull();
        }
        public void TestRemoveWidget1()
        {
            var model  = new AnalysisPageViewModel(_id, _template, _analyser.Object, _analysisStorage.Object, _pluginRegistry);
            var layout = (HorizontalWrapWidgetLayoutViewModel)model.Layout;

            var widget  = new Mock <IWidgetViewModel>();
            var factory = new Mock <IWidgetPlugin>();

            factory.Setup(x => x.CreateViewModel(It.IsAny <IWidgetTemplate>(), It.IsAny <IDataSourceAnalyser>()))
            .Returns(widget.Object);

            layout.RaiseRequestAdd(factory.Object);
            var viewModel = layout.Widgets.FirstOrDefault(x => x.InnerViewModel == widget.Object);

            viewModel.Should().NotBeNull();
            viewModel.DeleteCommand.Execute(null);

            layout.Widgets.Should().BeEmpty();
            _analyser.Verify(x => x.Remove(It.IsAny <IDataSourceAnalyser>()), Times.Once,
                             "because the analyser created with that widget should've been removed again");
        }
        public void TestRemoveWidget2()
        {
            var model  = new AnalysisPageViewModel(_id, _template, _analyser.Object, _analysisStorage.Object, _pluginRegistry);
            var layout = (HorizontalWidgetLayoutViewModel)model.Layout;

            var widget  = new Mock <IWidgetViewModel>();
            var factory = new Mock <IWidgetPlugin>();

            factory.Setup(x => x.CreateViewModel(It.IsAny <IWidgetTemplate>(), It.IsAny <IDataSourceAnalyser>()))
            .Returns(widget.Object);

            _analysisStorage.Verify(x => x.Save(It.IsAny <AnalysisId>()), Times.Never);

            layout.RaiseRequestAdd(factory.Object);
            _analysisStorage.Verify(x => x.Save(_id), Times.Once);

            layout.Widgets.Should().Contain(widget.Object);
            widget.Raise(x => x.OnDelete += null, widget.Object);
            _analysisStorage.Verify(x => x.Save(_id), Times.Exactly(2),
                                    "because the page should've saved the analysis now that a widget's been removed");
        }
        public void TestRemoveWidget2()
        {
            var model  = new AnalysisPageViewModel(_id, _template, _analyser.Object, _analysisStorage.Object, _pluginRegistry);
            var layout = (HorizontalWrapWidgetLayoutViewModel)model.Layout;

            var widget  = new Mock <IWidgetViewModel>();
            var factory = new Mock <IWidgetPlugin>();

            factory.Setup(x => x.CreateViewModel(It.IsAny <IWidgetTemplate>(), It.IsAny <IDataSourceAnalyser>()))
            .Returns(widget.Object);

            _analysisStorage.Verify(x => x.SaveAsync(It.IsAny <AnalysisId>()), Times.Never);

            layout.RaiseRequestAdd(factory.Object);
            _analysisStorage.Verify(x => x.SaveAsync(_id), Times.Once);

            var viewModel = layout.Widgets.FirstOrDefault(x => x.InnerViewModel == widget.Object);

            viewModel.Should().NotBeNull();
            viewModel.DeleteCommand.Execute(null);
            _analysisStorage.Verify(x => x.SaveAsync(_id), Times.Exactly(2),
                                    "because the page should've saved the analysis now that a widget's been removed");
        }