Пример #1
0
        public async Task PlotError() {
            await InitializeGraphicsDevice();
            await ExecuteAndWaitForPlotsAsync(new string[] {
                "plot(state.area)",
            });

            // This is a plot statement that does not successfully generates a plot.
            // Right now the graphics device doesn't send a plot when a
            // new plot cannot be rendered, so don't wait for one.
            await ExecuteAndDoNotWaitForPlotsAsync(new string[] {
                "plot(state.name)",
            });

            await ExecuteAndWaitForPlotsAsync(new string[] {
                "plot(state.region)",
            });

            var deviceVC = _workflow.Plots.GetPlotVisualComponent(_workflow.Plots.ActiveDevice);
            var deviceCommands = new RPlotDeviceCommands(_workflow, deviceVC);

            // Navigating to a plot in the history that cannot be rendered
            // will send a plot with zero-file size, which translate into an error message.
            deviceCommands.PreviousPlot.Should().BeEnabled();
            var plotReceivedTask = EventTaskSources.IRPlotDevice.PlotAddedOrUpdated.Create(_workflow.Plots.ActiveDevice);
            await deviceCommands.PreviousPlot.InvokeAsync();
            await plotReceivedTask;

            _workflow.Plots.ActiveDevice.ActivePlot.Image.Should().BeNull();

            deviceCommands.PreviousPlot.Should().BeEnabled();
            plotReceivedTask = EventTaskSources.IRPlotDevice.PlotAddedOrUpdated.Create(_workflow.Plots.ActiveDevice);
            await deviceCommands.PreviousPlot.InvokeAsync();
            await plotReceivedTask;

            _workflow.Plots.ActiveDevice.ActivePlot.Image.Should().NotBeNull();

            deviceCommands.PreviousPlot.Should().BeDisabled();
        }
Пример #2
0
        public async Task LocatorCommand() {
            _plotDeviceVisualComponentContainerFactory.DeviceProperties = new PlotDeviceProperties(360, 360, 96);

            await InitializeGraphicsDevice();

            await ExecuteAndWaitForPlotsAsync(new [] {
                "plot(0:10)",
            });

            var deviceVC = _workflow.Plots.GetPlotVisualComponent(_workflow.Plots.ActiveDevice);
            var deviceCommands = new RPlotDeviceCommands(_workflow, deviceVC);
            deviceVC.LocatorMode.Should().BeFalse();

            deviceCommands.EndLocator.Should().BeInvisibleAndDisabled();

            var firstLocatorModeTask = EventTaskSources.IRPlotDevice.LocatorModeChanged.Create(_workflow.Plots.ActiveDevice);
            var locatorTask = ExecuteAndDoNotWaitForPlotsAsync(new [] {
                "res <- locator()",
            });
            await firstLocatorModeTask;

            var points = new Point[] {
                new Point(10, 10),
                new Point(100, 50),
                new Point(290, 90),
            };

            // R's high-level locator() function enters a loop that calls into
            // the graphics device low-level locator() API, which calls back into VS
            // to set locator mode and waits for either:
            // - a result with a click point
            // - a not clicked result
            // The high-level locator() function stops its loop when it gets
            // the not clicked result.
            foreach (var point in points) {
                deviceVC.LocatorMode.Should().BeTrue();
                deviceCommands.EndLocator.Should().BeEnabled();

                // Send a result with a click point, which will causes
                // locator mode to end and immediately start again
                var locatorModeTask = EventTaskSources.IRPlotDevice.LocatorModeChanged.Create(_workflow.Plots.ActiveDevice);
                deviceVC.ClickPlot((int)point.X, (int)point.Y);
                await locatorModeTask;

                deviceVC.LocatorMode.Should().BeFalse();
                deviceCommands.EndLocator.Should().BeInvisibleAndDisabled();

                locatorModeTask = EventTaskSources.IRPlotDevice.LocatorModeChanged.Create(_workflow.Plots.ActiveDevice);
                await locatorModeTask;
            }

            // Send a result with a not clicked result, which causes
            // locator mode to end, and the high-level locator() function
            // call will return.
            var lastLocatorModeTask = EventTaskSources.IRPlotDevice.LocatorModeChanged.Create(_workflow.Plots.ActiveDevice);
            await deviceCommands.EndLocator.InvokeAsync();
            await lastLocatorModeTask;

            deviceVC.LocatorMode.Should().BeFalse();
            deviceCommands.EndLocator.Should().BeInvisibleAndDisabled();

            string outputFilePath = _testFiles.GetDestinationPath("LocatorResult.csv");
            await ExecuteAndDoNotWaitForPlotsAsync(new[] {
                $"write.csv(res, {outputFilePath.ToRPath().ToRStringLiteral()})"
            });

            var x = new double[] { -2.48008095952895, 1.55378525638498, 10.0697250455366 };
            var y = new double[] { 14.4476461865435, 12.091623959219, 9.73560173189449 };
            CheckLocatorResult(outputFilePath, x, y);

            await locatorTask;
        }
Пример #3
0
        public async Task ExportAsImageUnsupportedExtension() {
            await InitializeGraphicsDevice();
            await ExecuteAndWaitForPlotsAsync(new string[] {
                "plot(1:10)",
            });

            // The file extension of the file the user selected in the save
            // dialog is what determines the image format. When it's an
            // unsupported format, we show an error msg.
            var outputFilePath = _testFiles.GetDestinationPath("ExportedPlot.unsupportedextension");
            FileDialog.SaveFilePath = outputFilePath;

            var deviceVC = _workflow.Plots.GetPlotVisualComponent(_workflow.Plots.ActiveDevice);
            var deviceCommands = new RPlotDeviceCommands(_workflow, deviceVC);

            deviceCommands.ExportAsImage.Should().BeEnabled();
            await deviceCommands.ExportAsImage.InvokeAsync();

            File.Exists(FileDialog.SaveFilePath).Should().BeFalse();
            CoreShell.LastShownErrorMessage.Should().Contain(".unsupportedextension");
        }
Пример #4
0
        public async Task PlotBuiltinDatasets() {
            // Note that the following are not included, as they cause various errors:
            //   Harman23.cor, Harman74.cor, ability.cov, state.abb, state.name
            // Since the test waits for each plot to be received before moving on to
            // the next dataset, we don't execute statements that don't generate plots.
            string[] scripts = new string[] {
                "plot(AirPassengers)",
                "plot(BJsales)",
                "plot(BJsales.lead)",
                "plot(BOD)",
                "plot(CO2)",
                "plot(ChickWeight)",
                "plot(DNase)",
                "plot(EuStockMarkets)",
                "plot(Formaldehyde)",
                "plot(HairEyeColor)",
                "plot(Indometh)",
                "plot(InsectSprays)",
                "plot(JohnsonJohnson)",
                "plot(LakeHuron)",
                "plot(LifeCycleSavings)",
                "plot(Loblolly)",
                "plot(Nile)",
                "plot(Orange)",
                "plot(OrchardSprays)",
                "plot(PlantGrowth)",
                "plot(Puromycin)",
                "plot(Seatbelts)",
                "plot(Theoph)",
                "plot(Titanic)",
                "plot(ToothGrowth)",
                "plot(UCBAdmissions)",
                "plot(UKDriverDeaths)",
                "plot(UKgas)",
                "plot(USAccDeaths)",
                "plot(USArrests)",
                "plot(USJudgeRatings)",
                "plot(USPersonalExpenditure)",
                "plot(UScitiesD)",
                "plot(VADeaths)",
                "plot(WWWusage)",
                "plot(WorldPhones)",
                "plot(airmiles)",
                "plot(airquality)",
                "plot(anscombe)",
                "plot(attenu)",
                "plot(attitude)",
                "plot(austres)",
                "plot(beaver1)",
                "plot(beaver2)",
                "plot(cars)",
                "plot(chickwts)",
                "plot(co2)",
                "plot(crimtab)",
                "plot(discoveries)",
                "plot(esoph)",
                "plot(euro)",
                "plot(euro.cross)",
                "plot(eurodist)",
                "plot(faithful)",
                "plot(fdeaths)",
                "plot(freeny)",
                "plot(freeny.x)",
                "plot(freeny.y)",
                "plot(infert)",
                "plot(iris)",
                "plot(iris3)",
                "plot(islands)",
                "plot(ldeaths)",
                "plot(lh)",
                "plot(longley)",
                "plot(lynx)",
                "plot(mdeaths)",
                "plot(morley)",
                "plot(mtcars)",
                "plot(nhtemp)",
                "plot(nottem)",
                "plot(npk)",
                "plot(occupationalStatus)",
                "plot(precip)",
                "plot(presidents)",
                "plot(pressure)",
                "plot(quakes)",
                "plot(randu)",
                "plot(rivers)",
                "plot(rock)",
                "plot(sleep)",
                "plot(stack.loss)",
                "plot(stack.x)",
                "plot(stackloss)",
                "plot(state.area)",
                "plot(state.center)",
                "plot(state.division)",
                "plot(state.region)",
                "plot(state.x77)",
                "plot(sunspot.month)",
                "plot(sunspot.year)",
                "plot(sunspots)",
                "plot(swiss)",
                "plot(treering)",
                "plot(trees)",
                "plot(uspop)",
                "plot(volcano)",
                "plot(warpbreaks)",
                "plot(women)",
            };

            await InitializeGraphicsDevice();
            await ExecuteAndWaitForPlotsAsync(scripts);

            var deviceVC = _workflow.Plots.GetPlotVisualComponent(_workflow.Plots.ActiveDevice);
            var deviceCommands = new RPlotDeviceCommands(_workflow, deviceVC);

            for (int i = 0; i < scripts.Length - 1; i++) {
                deviceCommands.PreviousPlot.Should().BeEnabled();
                var plotReceivedTask = EventTaskSources.IRPlotDevice.PlotAddedOrUpdated.Create(_workflow.Plots.ActiveDevice);
                await deviceCommands.PreviousPlot.InvokeAsync();
                await plotReceivedTask;
            }

            deviceCommands.PreviousPlot.Should().BeDisabled();

            for (int i = 0; i < scripts.Length - 1; i++) {
                deviceCommands.NextPlot.Should().BeEnabled();
                var plotReceivedTask = EventTaskSources.IRPlotDevice.PlotAddedOrUpdated.Create(_workflow.Plots.ActiveDevice);
                await deviceCommands.NextPlot.InvokeAsync();
                await plotReceivedTask;
            }

            deviceCommands.NextPlot.Should().BeDisabled();
        }
Пример #5
0
        public async Task ExportAsPdf() {
            await InitializeGraphicsDevice();
            await ExecuteAndWaitForPlotsAsync(new string[] {
                "plot(1:10)",
            });

            var outputFilePath = _testFiles.GetDestinationPath("ExportedPlot.pdf");
            FileDialog.SaveFilePath = outputFilePath;

            var deviceVC = _workflow.Plots.GetPlotVisualComponent(_workflow.Plots.ActiveDevice);
            var deviceCommands = new RPlotDeviceCommands(_workflow, deviceVC);

            deviceCommands.ExportAsPdf.Should().BeEnabled();
            await deviceCommands.ExportAsPdf.InvokeAsync();

            File.Exists(outputFilePath).Should().BeTrue();
            CoreShell.LastShownErrorMessage.Should().BeNullOrEmpty();
        }
Пример #6
0
        public async Task ExportAsImage() {
            await InitializeGraphicsDevice();
            await ExecuteAndWaitForPlotsAsync(new string[] {
                "plot(1:10)",
            });

            foreach (var ext in new string[] { "bmp", "jpg", "jpeg", "png", "tif", "tiff" }) {
                var outputFilePath = _testFiles.GetDestinationPath("ExportedPlot." + ext);
                FileDialog.SaveFilePath = outputFilePath;

                var deviceVC = _workflow.Plots.GetPlotVisualComponent(_workflow.Plots.ActiveDevice);
                var deviceCommands = new RPlotDeviceCommands(_workflow, deviceVC);

                deviceCommands.ExportAsImage.Should().BeEnabled();
                await deviceCommands.ExportAsImage.InvokeAsync();

                File.Exists(outputFilePath).Should().BeTrue();
                CoreShell.LastShownErrorMessage.Should().BeNullOrEmpty();

                var image = BitmapImageFactory.Load(outputFilePath);
                image.PixelWidth.Should().Be(600);
                image.PixelHeight.Should().Be(500);
                ((int)Math.Round(image.DpiX)).Should().Be(96);
                ((int)Math.Round(image.DpiY)).Should().Be(96);
            }
        }
Пример #7
0
        public async Task DeviceRemoveCurrent() {
            var plot1to10 = await GetExpectedImageAsync("bmp", 600, 500, 96, "plot1-10", "plot(1:10)");
            var plot2to10 = await GetExpectedImageAsync("bmp", 600, 500, 96, "plot2-10", "plot(2:10)");

            await InitializeGraphicsDevice();
            await ExecuteAndWaitForPlotsAsync(new string[] {
                "plot(1:10)",
                "plot(1:20)",
            });

            var device1 = _workflow.Plots.ActiveDevice;
            var device1VC = _workflow.Plots.GetPlotVisualComponent(device1);
            var device1Commands = new RPlotDeviceCommands(_workflow, device1VC);
            var plot1 = device1.ActivePlot;

            await InitializeGraphicsDevice();
            await ExecuteAndWaitForPlotsAsync(new string[] {
                "plot(2:10)",
            });

            var device2 = _workflow.Plots.ActiveDevice;
            var device2VC = _workflow.Plots.GetPlotVisualComponent(device2);
            var plot2 = device2.ActivePlot;

            // Remove plot 1:20 from device 1, leaving plot 1:10 as active
            device1Commands.RemoveCurrentPlot.Should().BeEnabled();
            var plotRemovedTask = EventTaskSources.IRPlotDevice.PlotRemoved.Create(device1);
            await device1Commands.RemoveCurrentPlot.InvokeAsync();
            await plotRemovedTask;

            // Deleting the plot from device 1 should not have changed the active device
            _workflow.Plots.ActiveDevice.Should().Be(device2);

            CoreShell.LastShownErrorMessage.Should().BeNullOrEmpty();

            device1.ActivePlot.Image.Should().HaveSamePixels(plot1to10);
            device2.ActivePlot.Image.Should().HaveSamePixels(plot2to10);
        }
Пример #8
0
        public async Task SomeCommandsEnabledForFirstPlot() {
            var plot1to10 = await GetExpectedImageAsync("png", 600, 500, 96, "plot1-10", "plot(1:10)");

            await InitializeGraphicsDevice();
            await ExecuteAndWaitForPlotsAsync(new string[] {
                "plot(1:10)",
                "plot(10:20)",
            });

            var deviceVC = _workflow.Plots.GetPlotVisualComponent(_workflow.Plots.ActiveDevice);
            var deviceCommands = new RPlotDeviceCommands(_workflow, deviceVC);

            var plotReceivedTask = EventTaskSources.IRPlotDevice.PlotAddedOrUpdated.Create(_workflow.Plots.ActiveDevice);
            await deviceCommands.PreviousPlot.InvokeAsync();
            await plotReceivedTask;

            _workflow.Plots.ActiveDevice.ActivePlot.Image.Should().HaveSamePixels(plot1to10);

            CheckEnabledCommands(deviceVC, isFirst: true, isLast: false, anyPlot: true);
        }
Пример #9
0
        public async Task DeviceCut() {
            var plot1to10 = await GetExpectedImageAsync("bmp", 600, 500, 96, "plot1-10", "plot(1:10)");
            var plot2to10 = await GetExpectedImageAsync("bmp", 600, 500, 96, "plot2-10", "plot(2:10)");

            await InitializeGraphicsDevice();
            await ExecuteAndWaitForPlotsAsync(new string[] {
                "plot(1:10)",
            });

            var device1 = _workflow.Plots.ActiveDevice;
            var device1VC = _workflow.Plots.GetPlotVisualComponent(device1);
            var device1Commands = new RPlotDeviceCommands(_workflow, device1VC);
            var plot1 = device1.ActivePlot;

            await InitializeGraphicsDevice();
            await ExecuteAndWaitForPlotsAsync(new string[] {
                "plot(2:10)",
            });

            var device2 = _workflow.Plots.ActiveDevice;
            var device2VC = _workflow.Plots.GetPlotVisualComponent(device2);
            var device2Commands = new RPlotDeviceCommands(_workflow, device2VC);
            var plot2 = device2.ActivePlot;

            device1Commands.Cut.Should().BeEnabled();
            await device1Commands.Cut.InvokeAsync();

            CoreShell.LastShownErrorMessage.Should().BeNullOrEmpty();

            device2Commands.Paste.Should().BeEnabled();
            var plotReceivedTask = EventTaskSources.IRPlotDevice.PlotAddedOrUpdated.Create(device2);
            var plotRemovedTask = EventTaskSources.IRPlotDevice.PlotRemoved.Create(device1);
            await device2Commands.Paste.InvokeAsync();
            await plotReceivedTask;
            await plotRemovedTask;

            CoreShell.LastShownErrorMessage.Should().BeNullOrEmpty();

            device1.ActivePlot.Should().BeNull();
            device2.ActivePlot.Should().NotBeNull();
            device2.ActivePlot.Image.Should().HaveSamePixels(plot1to10);
        }
Пример #10
0
        public async Task DeviceRemoveAll() {
            await InitializeGraphicsDevice();
            await ExecuteAndWaitForPlotsAsync(new string[] {
                "plot(1:10)",
                "plot(1:20)",
            });

            var device1 = _workflow.Plots.ActiveDevice;
            var device1VC = _workflow.Plots.GetPlotVisualComponent(device1);
            var device1Commands = new RPlotDeviceCommands(_workflow, device1VC);
            var plot1 = device1.ActivePlot;

            await InitializeGraphicsDevice();
            await ExecuteAndWaitForPlotsAsync(new string[] {
                "plot(2:10)",
            });

            var device2 = _workflow.Plots.ActiveDevice;
            var device2VC = _workflow.Plots.GetPlotVisualComponent(device2);
            var plot2 = device2.ActivePlot;

            // Remove all plots from device 1
            device1Commands.RemoveAllPlots.Should().BeEnabled();
            var plotClearedTask = EventTaskSources.IRPlotDevice.Cleared.Create(device1);
            await device1Commands.RemoveAllPlots.InvokeAsync();
            await plotClearedTask;

            // Deleting the plots from device 1 should not have changed the active device
            _workflow.Plots.ActiveDevice.Should().Be(device2);

            CoreShell.LastShownErrorMessage.Should().BeNullOrEmpty();

            device1.ActivePlot.Should().BeNull();
            device2.ActivePlot.Should().NotBeNull();
        }
Пример #11
0
        public async Task DeviceCopyAsMetafile() {
            await InitializeGraphicsDevice();
            await ExecuteAndWaitForPlotsAsync(new string[] {
                "plot(1:10)",
            });

            var device1 = _workflow.Plots.ActiveDevice;
            var device1VC = _workflow.Plots.GetPlotVisualComponent(device1);
            var device1Commands = new RPlotDeviceCommands(_workflow, device1VC);
            var plot1 = device1.ActivePlot;

            await InitializeGraphicsDevice();
            await ExecuteAndWaitForPlotsAsync(new string[] {
                "plot(2:10)",
            });

            var device2 = _workflow.Plots.ActiveDevice;

            Clipboard.Clear();

            var deviceCommands = new RPlotDeviceCommands(_workflow, device1VC);

            deviceCommands.CopyAsMetafile.Should().BeEnabled();
            await deviceCommands.CopyAsMetafile.InvokeAsync();

            // Exporting plot from device 1 should not have changed the active device
            _workflow.Plots.ActiveDevice.Should().Be(device2);

            Clipboard.ContainsData(DataFormats.EnhancedMetafile).Should().BeTrue();
            CoreShell.LastShownErrorMessage.Should().BeNullOrEmpty();
        }
Пример #12
0
        public async Task DeviceResize() {
            var plot1to10 = await GetExpectedImageAsync("bmp", 600, 500, 96, "plot1-10", "plot(1:10)");
            var plot1to10larger = await GetExpectedImageAsync("bmp", 650, 550, 96, "plot1-10larger", "plot(1:10)");

            await InitializeGraphicsDevice();
            await ExecuteAndWaitForPlotsAsync(new string[] {
                "plot(1:10)",
            });

            var device1 = _workflow.Plots.ActiveDevice;
            var device1VC = _workflow.Plots.GetPlotVisualComponent(device1);
            var device1Commands = new RPlotDeviceCommands(_workflow, device1VC);
            var plot1 = device1.ActivePlot;

            await InitializeGraphicsDevice();
            await ExecuteAndWaitForPlotsAsync(new string[] {
                "plot(2:10)",
            });

            var device2 = _workflow.Plots.ActiveDevice;

            var plotReceivedTask = EventTaskSources.IRPlotDevice.PlotAddedOrUpdated.Create(device1);

            await device1VC.ResizePlotAsync(650, 550, 96);
            await plotReceivedTask;

            // Resizing device 1 should not have changed the active device
            _workflow.Plots.ActiveDevice.Should().Be(device2);

            device1.ActivePlot.Image.Should().HaveSamePixels(plot1to10larger);
        }
Пример #13
0
        public async Task DeviceCopyAsBitmap() {
            var plot1to10 = await GetExpectedImageAsync("bmp", 600, 500, 96, "plot1-10", "plot(1:10)");

            await InitializeGraphicsDevice();
            await ExecuteAndWaitForPlotsAsync(new string[] {
                "plot(1:10)",
            });

            var device1 = _workflow.Plots.ActiveDevice;
            var device1VC = _workflow.Plots.GetPlotVisualComponent(device1);
            var device1Commands = new RPlotDeviceCommands(_workflow, device1VC);
            var plot1 = device1.ActivePlot;

            await InitializeGraphicsDevice();
            await ExecuteAndWaitForPlotsAsync(new string[] {
                "plot(2:10)",
            });

            var device2 = _workflow.Plots.ActiveDevice;

            Clipboard.Clear();

            var deviceCommands = new RPlotDeviceCommands(_workflow, device1VC);

            deviceCommands.CopyAsBitmap.Should().BeEnabled();
            await deviceCommands.CopyAsBitmap.InvokeAsync();

            // Exporting plot from device 1 should not have changed the active device
            _workflow.Plots.ActiveDevice.Should().Be(device2);

            Clipboard.ContainsImage().Should().BeTrue();
            CoreShell.LastShownErrorMessage.Should().BeNullOrEmpty();

            var clipboardImage = Clipboard.GetImage();
            clipboardImage.Should().HaveSamePixels(plot1to10);
        }
Пример #14
0
        public async Task LocatorCommandNoClick() {
            await InitializeGraphicsDevice();

            await ExecuteAndWaitForPlotsAsync(new string[] {
                "plot(0:10)",
            });

            var deviceVC = _workflow.Plots.GetPlotVisualComponent(_workflow.Plots.ActiveDevice);
            var deviceCommands = new RPlotDeviceCommands(_workflow, deviceVC);

            deviceVC.LocatorMode.Should().BeFalse();

            deviceCommands.EndLocator.Should().BeInvisibleAndDisabled();

            var locatorModeTask = EventTaskSources.IRPlotDevice.LocatorModeChanged.Create(_workflow.Plots.ActiveDevice);
            var locatorTask = ExecuteAndDoNotWaitForPlotsAsync(new string[] {
                "res <- locator()",
            });
            await locatorModeTask;

            deviceVC.LocatorMode.Should().BeTrue();
            deviceCommands.EndLocator.Should().BeEnabled();

            locatorModeTask = EventTaskSources.IRPlotDevice.LocatorModeChanged.Create(_workflow.Plots.ActiveDevice);
            await deviceCommands.EndLocator.InvokeAsync();
            await locatorModeTask;

            deviceVC.LocatorMode.Should().BeFalse();
            deviceCommands.EndLocator.Should().BeInvisibleAndDisabled();

            string outputFilePath = _testFiles.GetDestinationPath("LocatorResultNoClick.csv");
            await ExecuteAndDoNotWaitForPlotsAsync(new string[] {
                $"write.csv(res, {outputFilePath.ToRPath().ToRStringLiteral()})"
            });

            string output = File.ReadAllText(outputFilePath);
            output.Trim().Should().Be("\"\"");

            await locatorTask;
        }
Пример #15
0
        public async Task ActivateDevice() {
            await InitializeGraphicsDevice();
            var device1 = _workflow.Plots.ActiveDevice;
            var device1VC = _workflow.Plots.GetPlotVisualComponent(device1);
            var device1Commands = new RPlotDeviceCommands(_workflow, device1VC);

            device1Commands.ActivatePlotDevice.Should().BeChecked();
            device1Commands.ActivatePlotDevice.Should().BeEnabled();

            await InitializeGraphicsDevice();
            var device2 = _workflow.Plots.ActiveDevice;
            var device2VC = _workflow.Plots.GetPlotVisualComponent(device2);
            var device2Commands = new RPlotDeviceCommands(_workflow, device2VC);

            device1Commands.ActivatePlotDevice.Should().BeUnchecked();
            device1Commands.ActivatePlotDevice.Should().BeEnabled();
            device2Commands.ActivatePlotDevice.Should().BeChecked();
            device2Commands.ActivatePlotDevice.Should().BeEnabled();

            var deviceChangedTask = EventTaskSources.IRPlotManager.ActiveDeviceChanged.Create(_workflow.Plots);
            await device1Commands.ActivatePlotDevice.InvokeAsync();
            await deviceChangedTask;

            _workflow.Plots.ActiveDevice.Should().Be(device1);
            device1Commands.ActivatePlotDevice.Should().BeChecked();
            device2Commands.ActivatePlotDevice.Should().BeUnchecked();

            deviceChangedTask = EventTaskSources.IRPlotManager.ActiveDeviceChanged.Create(_workflow.Plots);
            await device2Commands.ActivatePlotDevice.InvokeAsync();
            await deviceChangedTask;

            _workflow.Plots.ActiveDevice.Should().Be(device2);
            device1Commands.ActivatePlotDevice.Should().BeUnchecked();
            device2Commands.ActivatePlotDevice.Should().BeChecked();
        }
Пример #16
0
        public async Task HistoryCopy() {
            using (_workflow.Plots.GetOrCreateVisualComponent(_plotHistoryVisualComponentContainerFactory, 0)) {
                await InitializeGraphicsDevice();
                await ExecuteAndWaitForPlotsAsync(new string[] {
                    "plot(1:10)",
                });

                var historyVC = _workflow.Plots.HistoryVisualComponent;
                var historyCommands = new RPlotHistoryCommands(_workflow, historyVC);

                var device1 = _workflow.Plots.ActiveDevice;
                var device1VC = _workflow.Plots.GetPlotVisualComponent(device1);
                var plot1 = device1.ActivePlot;

                await InitializeGraphicsDevice();
                await ExecuteAndWaitForPlotsAsync(new string[] {
                    "plot(2:10)",
                });

                var device2 = _workflow.Plots.ActiveDevice;
                var device2VC = _workflow.Plots.GetPlotVisualComponent(device2);
                var device2Commands = new RPlotDeviceCommands(_workflow, device2VC);
                var plot2 = device2.ActivePlot;

                historyVC.SelectedPlot = plot1;

                historyCommands.Copy.Should().BeEnabled();
                await historyCommands.Copy.InvokeAsync();

                CoreShell.LastShownErrorMessage.Should().BeNullOrEmpty();

                device2Commands.Paste.Should().BeEnabled();
                var plotReceivedTask = EventTaskSources.IRPlotDevice.PlotAddedOrUpdated.Create(device2);
                await device2Commands.Paste.InvokeAsync();
                await plotReceivedTask;

                CoreShell.LastShownErrorMessage.Should().BeNullOrEmpty();

                device2.ActivePlot.Image.Should().HaveSamePixels(plot1.Image);
            }
        }
Пример #17
0
        private void CheckEnabledCommands(IRPlotDeviceVisualComponent visualComponent, bool isFirst, bool isLast, bool anyPlot) {
            var deviceCommands = new RPlotDeviceCommands(_workflow, visualComponent);

            deviceCommands.EndLocator.Should().BeDisabled();

            if (anyPlot) {
                deviceCommands.RemoveAllPlots.Should().BeEnabled();
                deviceCommands.RemoveCurrentPlot.Should().BeEnabled();
                deviceCommands.Cut.Should().BeEnabled();
                deviceCommands.Copy.Should().BeEnabled();
                deviceCommands.CopyAsBitmap.Should().BeEnabled();
                deviceCommands.CopyAsMetafile.Should().BeEnabled();
                deviceCommands.ExportAsImage.Should().BeEnabled();
                deviceCommands.ExportAsPdf.Should().BeEnabled();
            } else {
                deviceCommands.RemoveAllPlots.Should().BeDisabled();
                deviceCommands.RemoveCurrentPlot.Should().BeDisabled();
                deviceCommands.Cut.Should().BeDisabled();
                deviceCommands.Copy.Should().BeDisabled();
                deviceCommands.CopyAsBitmap.Should().BeDisabled();
                deviceCommands.CopyAsMetafile.Should().BeDisabled();
                deviceCommands.ExportAsImage.Should().BeDisabled();
                deviceCommands.ExportAsPdf.Should().BeDisabled();
            }

            if (isFirst || !anyPlot) {
                deviceCommands.PreviousPlot.Should().BeDisabled();
            } else {
                deviceCommands.PreviousPlot.Should().BeEnabled();
            }

            if (isLast || !anyPlot) {
                deviceCommands.NextPlot.Should().BeDisabled();
            } else {
                deviceCommands.NextPlot.Should().BeEnabled();
            }
        }