public void OpenDocument_Existing_ShouldBeOpened()
        {
            // Arrange / act
            using var wrapper = new MainWindowViewModelWrapper();
            var doc = wrapper.OpenDocument(_sourceFile);

            // Assert
            Assert.AreEqual("Blank.xlsx", doc.Name);
        }
        public void CloseDocument_PartWasInserted_ShouldGiveWarningMessage()
        {
            // Arrange
            using var wrapper = new MainWindowViewModelWrapper();
            var doc = wrapper.OpenDocument(_sourceFile);

            wrapper.ViewModel.InsertXml12Command.Execute();

            // Act / assert
            wrapper.AssertMessage(wrapper.ViewModel.CloseDocumentCommand.Execute, MessageBoxImage.Warning, MessageBoxResult.Cancel, "Insert XML not detected as change");
        }
        public void InsertXml12_PartAlreadyExists_ShouldNotBeInserted()
        {
            // Arrange
            using var wrapper = new MainWindowViewModelWrapper();
            var(doc, _)       = wrapper.OpenAndInsertPart(_sourceFile, XmlPart.RibbonX12, false);

            // Act
            wrapper.ViewModel.InsertXml12Command.Execute();

            // Assert
            Assert.AreEqual(1, doc.Children.Count, "Part was inserted twice");
        }
        public void Remove_PartSelected_ShouldBeRemoved()
        {
            // Arrange
            using var wrapper = new MainWindowViewModelWrapper();
            var(doc, _)       = wrapper.OpenAndInsertPart(_sourceFile);

            // Act
            wrapper.ViewModel.RemoveCommand.Execute();

            // Assert
            Assert.IsEmpty(doc.Children, "Part was not removed");
        }
        public void InsertIcons_SingleChosen_ShouldBeInserted()
        {
            // Arrange
            using var wrapper = new MainWindowViewModelWrapper();
            var(_, part)      = wrapper.OpenAndInsertPart(_sourceFile);

            // Act
            wrapper.InsertIcons(part, _undoIcon);

            // Assert
            Assert.AreEqual(1, part.Children.Count);
            Assert.AreEqual("undo", ((IconViewModel)part.Children[0]).Name);
        }
        public void InsertXml14_PartShouldBeInserted()
        {
            // Arrange
            using var wrapper = new MainWindowViewModelWrapper();
            var doc = wrapper.OpenDocument(_sourceFile);

            // Act
            wrapper.ViewModel.InsertXml14Command.Execute();

            // Assert
            Assert.AreEqual(1, doc.Children.Count);
            Assert.IsInstanceOf <OfficePartViewModel>(doc.Children[0]);
            Assert.AreEqual(XmlPart.RibbonX14, ((OfficePartViewModel)doc.Children[0]).Part !.PartType);
        }
        public void SaveAs_CorrectPath_ShouldBeSaved()
        {
            // Arrange
            using var wrapper = new MainWindowViewModelWrapper();
            var doc = wrapper.OpenDocument(_sourceFile);

            using var folder = new TempFolder();
            var destination = Path.Combine(folder.FullName, "Saved.xlsx");

            // Act
            wrapper.SaveAs(doc, destination);

            // Assert
            Assert.IsTrue(File.Exists(destination), "File was not saved");
        }
        public void RemovePart_ShouldGiveWarningMessage()
        {
            // Arrange
            using var wrapper = new MainWindowViewModelWrapper();
            var doc = wrapper.OpenDocument(_sourceFile);

            wrapper.ViewModel.InsertXml12Command.Execute();
            var part = doc.Children.FirstOrDefault(p => p is OfficePartViewModel);

            Assume.That(part, Is.Not.Null, "No Office part available");
            wrapper.ViewModel.SelectedItem = part;

            // Act / assert
            wrapper.AssertMessage(wrapper.ViewModel.RemoveCommand.Execute, MessageBoxImage.Warning, MessageBoxResult.Yes);
        }
        public void Remove_IconSelected_ShouldBeRemoved()
        {
            // Arrange
            using var wrapper = new MainWindowViewModelWrapper();
            var(_, part)      = wrapper.OpenAndInsertPart(_sourceFile);
            wrapper.InsertIcons(part, _undoIcon);
            Assume.That(part.Children, Is.Not.Empty, "Icon was not inserted");
            wrapper.ViewModel.SelectedItem = part.Children[0];

            // Act
            wrapper.ViewModel.RemoveCommand.Execute();

            // Assert
            Assert.IsEmpty(part.Children, "Icon was not removed");
        }
        public void CloseDocument_PartWasRemoved_GiveWarningMessage()
        {
            // Arrange
            using var wrapper = new MainWindowViewModelWrapper();
            var doc = wrapper.OpenDocument(_sourceFile);

            wrapper.ViewModel.InsertXml12Command.Execute();
            var part = doc.Children.FirstOrDefault(p => p is OfficePartViewModel);

            Assume.That(part, Is.Not.Null, "No Office part available");
            wrapper.ViewModel.SelectedItem = part;

            // Act
            wrapper.ViewModel.RemoveCommand.Execute();

            // Assert
            Assert.IsTrue(doc.HasUnsavedChanges, "No unsaved changes detected after removing a part");
            wrapper.AssertMessage(wrapper.ViewModel.CloseDocumentCommand.Execute, MessageBoxImage.Warning, MessageBoxResult.Cancel);
        }
        public void ValidateXml_ShouldProduceExpectedResult()
        {
            using var wrapper = new MainWindowViewModelWrapper();
            var doc = wrapper.OpenDocument(_sourceFile);

            Assume.That(wrapper.ViewModel.SelectedItem?.CanHaveContents, Is.False);

            wrapper.ViewModel.InsertXml12Command.Execute();
            wrapper.ViewModel.SelectedItem = doc.Children[0];
            Assert.IsTrue(wrapper.ViewModel.SelectedItem.CanHaveContents);

            var tmp = wrapper.ViewModel.OpenPartTab();

            Assert.NotNull(tmp);
            var tab = tmp !;

            void AssertIsValid(bool expected, string?message = null)
            {
                var actual = true;

                void Handler(object?o, DataEventArgs <IResultCollection> e)
                {
                    actual = e.Data?.IsEmpty ?? false;
                }

                tab.ShowResults += Handler;
                wrapper.ViewModel.ValidateCommand.Execute();
                tab.ShowResults -= Handler;

                Assert.AreEqual(expected, actual, message);
            }

            AssertIsValid(false);
            tab.Part.Contents = "asd";
            AssertIsValid(false);

            tab.Part.Contents = @"<customUI xmlns=""http://schemas.microsoft.com/office/2006/01/customui""><ribbon></ribbon></customUI>";
            AssertIsValid(true);

            tab.Part.Contents = @"<customUI xmlns=""http://schemas.microsoft.com/office/2006/01/customui""><ribbon><tabs></tabs></ribbon></customUI>";
            AssertIsValid(false);
        }
        public void GenerateCallbacks_ShouldProduceExpectedCallback()
        {
            using var wrapper = new MainWindowViewModelWrapper();
            var doc = wrapper.OpenDocument(_sourceFile);

            wrapper.ViewModel.InsertXml12Command.Execute();
            var part = doc.Children[0];

            wrapper.ViewModel.SelectedItem = part;

            var tab = wrapper.ViewModel.OpenPartTab();

            Assert.NotNull(tab);

            // This should show a message saying there are no callbacks to be generated
            part.Contents = @"<customUI xmlns=""http://schemas.microsoft.com/office/2006/01/customui""><ribbon></ribbon></customUI>";
            wrapper.AssertMessage(wrapper.ViewModel.GenerateCallbacksCommand.Execute, MessageBoxImage.Information);

            // This should contain a single callback for the onLoad event
            part.Contents = @"<customUI onLoad=""CustomLoad"" xmlns=""http://schemas.microsoft.com/office/2006/01/customui""><ribbon></ribbon></customUI>";
        public void CloseDocument_IconsRemoved_ShouldShowWarning()
        {
            using var wrapper = new MainWindowViewModelWrapper();
            var(doc, part)    = wrapper.OpenAndInsertPart(_sourceFile);

            // Insert an icon and save the document
            wrapper.InsertIcons(part, _redoIcon);

            using var folder = new TempFolder();
            var destination = Path.Combine(folder.FullName, "Output.xlsx");

            wrapper.SaveAs(doc, destination);
            Assert.IsFalse(doc.HasUnsavedChanges, "The icon insertion was apparently not saved");

            // Remove it and do the appropriate checks
            wrapper.ViewModel.SelectedItem = doc.Children.FirstOrDefault(c => c is OfficePartViewModel)?.Children.FirstOrDefault(c => c is IconViewModel);
            Assert.IsNotNull(wrapper.ViewModel.SelectedItem, "Icon was apparently not created");
            wrapper.AssertMessage(wrapper.ViewModel.RemoveCommand.Execute, MessageBoxImage.Warning, MessageBoxResult.Yes);
            Assert.IsTrue(doc.HasUnsavedChanges, "No unsaved changes detected after removing a part");
            wrapper.AssertMessage(wrapper.ViewModel.CloseDocumentCommand.Execute, MessageBoxImage.Warning, MessageBoxResult.Cancel);
        }