using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using Microsoft.VisualStudio.TestTools.UnitTesting; using RainmeterStudio.Core.Model; namespace RainmeterStudio.Tests.Business { /// /// Tests the project item operations for the project manager /// /// /// Initial project structure: /// root /// + folder1 /// | + sub1 /// | | + file2.png /// | | + file3.txt /// | + file1.txt /// + folder2 /// + file1.txt /// + sub1 /// [TestClass] public class ProjectManagerProjectItemOperationsTest : ProjectManagerTestBase { private Reference Root { get { return ProjectManager.ActiveProject.Root; } } /// /// Sets up test /// public override void OnInitialize() { // Create a new project string projectName = "test"; string projectPath = projectName + ".rsproj"; ProjectManager.CreateProject(projectName, projectPath, ProjectTemplate); // Create a project structure var root = ProjectManager.ActiveProject.Root; ProjectManager.CreateFolder("folder1", root); ProjectManager.CreateFolder("folder2", root); ProjectManager.CreateFolder("sub1", root.Children[0]); ProjectManager.CreateFolder("sub1", root); File.Create("file1.txt").Close(); File.Create("folder1\\file1.txt").Close(); File.Create("folder1\\sub1\\file2.png").Close(); File.Create("folder1\\sub1\\file3.txt").Close(); root.Add(new Reference("file1.txt", "file1.txt")); root.Children[0].Add(new Reference("file1.txt", "folder1\\file1.txt")); root.Children[0].Children[0].Add(new Reference("file2.png", "folder1\\sub1\\file2.png")); root.Children[0].Children[0].Add(new Reference("file3.txt", "folder1\\sub1\\file3.txt")); } #region Cut & paste for files [TestMethod] public void ProjectManagerCutPasteFileTest() { var folder1 = Root.GetReference("test/folder1"); var folder2 = Root.GetReference("test/folder2"); var file1 = Root.GetReference("test/folder1/file1.txt"); var file2 = Root.GetReference("test/folder1/sub1/file2.png"); // Initial state Assert.AreEqual(2, folder1.Count); Assert.AreEqual(0, folder2.Count); Assert.AreEqual(folder1, file1.Parent); // Cut ProjectManager.ProjectItemCutClipboard(file1); // The item should be in the clipboard, but state unchanged Assert.IsTrue(ProjectManager.HaveProjectItemInClipboard()); Assert.AreEqual(2, folder1.Count); Assert.AreEqual(0, folder2.Count); Assert.AreEqual(folder1, file1.Parent); // Paste in folder 2 ProjectManager.ProjectItemPasteClipboard(folder2); Assert.IsFalse(ProjectManager.HaveProjectItemInClipboard()); Assert.AreEqual(1, folder1.Count); Assert.AreEqual(1, folder2.Count); Assert.AreEqual(folder2, file1.Parent); // Cut and paste in root ProjectManager.ProjectItemCutClipboard(file2); ProjectManager.ProjectItemPasteClipboard(Root); Assert.AreEqual(Root, file2.Parent); } [TestMethod] public void ProjectManagerCutPasteFileNameConflictTest() { var folder1 = Root.GetReference("test/folder1"); var file1 = Root.GetReference("test/folder1/file1.txt"); // Initial state Assert.AreEqual(2, folder1.Count); Assert.AreEqual(4, Root.Count); Assert.AreEqual(folder1, file1.Parent); // Cut ProjectManager.ProjectItemCutClipboard(file1); // The item should be in the clipboard, but state unchanged Assert.IsTrue(ProjectManager.HaveProjectItemInClipboard()); Assert.AreEqual(2, folder1.Count); Assert.AreEqual(4, Root.Count); Assert.AreEqual(folder1, file1.Parent); // Paste in root try { ProjectManager.ProjectItemPasteClipboard(Root); Assert.Fail("File should already exist, should not overwrite."); } catch (IOException) { } // Item shouldn't be in clipboard any more, but state should remain the same Assert.IsTrue(ProjectManager.HaveProjectItemInClipboard()); Assert.AreEqual(2, folder1.Count); Assert.AreEqual(4, Root.Count); Assert.AreEqual(folder1, file1.Parent); } [TestMethod] public void ProjectManagerCutPasteFileSameDirectoryTest() { var folder1 = Root.GetReference("test/folder1"); var file1 = Root.GetReference("test/folder1/file1.txt"); // Initial state Assert.AreEqual(2, folder1.Count); Assert.AreEqual(folder1, file1.Parent); // Cut ProjectManager.ProjectItemCutClipboard(file1); // The item should be in the clipboard, but state unchanged Assert.IsTrue(ProjectManager.HaveProjectItemInClipboard()); Assert.AreEqual(2, folder1.Count); Assert.AreEqual(folder1, file1.Parent); // Paste in root ProjectManager.ProjectItemPasteClipboard(folder1); // Item shouldn't be in clipboard any more, but state should remain the same Assert.IsFalse(ProjectManager.HaveProjectItemInClipboard()); Assert.AreEqual(2, folder1.Count); Assert.AreEqual(folder1, file1.Parent); } #endregion #region Cut & paste for directories [TestMethod] public void ProjectManagerCutPasteDirectoryTest() { var folder1 = Root.GetReference("test/folder1"); var folder2 = Root.GetReference("test/folder2"); var sub1 = Root.GetReference("test/folder1/sub1"); // Initial state Assert.AreEqual(2, folder1.Count); Assert.AreEqual(0, folder2.Count); Assert.AreEqual(2, sub1.Count); Assert.IsFalse(sub1.Children.Any(x => !File.Exists(x.StoragePath))); Assert.AreEqual(folder1, sub1.Parent); Assert.AreEqual("test/folder1/sub1/file2.png", sub1.Children[0].QualifiedName); Assert.AreEqual("folder1\\sub1\\file2.png", sub1.Children[0].StoragePath); // Cut ProjectManager.ProjectItemCutClipboard(sub1); // The item should be in the clipboard, but state unchanged Assert.IsTrue(ProjectManager.HaveProjectItemInClipboard()); Assert.AreEqual(2, folder1.Count); Assert.AreEqual(0, folder2.Count); Assert.AreEqual(2, sub1.Count); Assert.IsFalse(sub1.Children.Any(x => !File.Exists(x.StoragePath))); Assert.AreEqual(folder1, sub1.Parent); // Paste in folder 2 ProjectManager.ProjectItemPasteClipboard(folder2); Assert.IsFalse(ProjectManager.HaveProjectItemInClipboard()); Assert.AreEqual(1, folder1.Count); Assert.AreEqual(1, folder2.Count); Assert.AreEqual(2, sub1.Count); Assert.IsFalse(sub1.Children.Any(x => !File.Exists(x.StoragePath))); Assert.AreEqual(folder2, sub1.Parent); Assert.AreEqual("test/folder2/sub1/file2.png", sub1.Children[0].QualifiedName); Assert.AreEqual("folder2\\sub1\\file2.png", sub1.Children[0].StoragePath); } [TestMethod] public void ProjectManagerCutPasteDirectoryNameConflictTest() { var folder1 = Root.GetReference("test/folder1"); var sub1 = Root.GetReference("test/folder1/sub1"); // Initial state Assert.AreEqual(2, folder1.Count); Assert.AreEqual(4, Root.Count); Assert.AreEqual(2, sub1.Count); Assert.IsFalse(sub1.Children.Any(x => !File.Exists(x.StoragePath))); Assert.AreEqual(folder1, sub1.Parent); Assert.AreEqual("test/folder1/sub1/file2.png", sub1.Children[0].QualifiedName); Assert.AreEqual("folder1\\sub1\\file2.png", sub1.Children[0].StoragePath); // Cut ProjectManager.ProjectItemCutClipboard(sub1); // The item should be in the clipboard, but state unchanged Assert.IsTrue(ProjectManager.HaveProjectItemInClipboard()); Assert.AreEqual(2, folder1.Count); Assert.AreEqual(4, Root.Count); Assert.AreEqual(2, sub1.Count); Assert.IsFalse(sub1.Children.Any(x => !File.Exists(x.StoragePath))); Assert.AreEqual(folder1, sub1.Parent); // Paste in root try { ProjectManager.ProjectItemPasteClipboard(Root); Assert.Fail("Directory already exists, should not overwrite."); } catch (IOException) { } // Object remains in clipboard, state unchanged Assert.IsTrue(ProjectManager.HaveProjectItemInClipboard()); Assert.AreEqual(2, folder1.Count); Assert.AreEqual(4, Root.Count); Assert.AreEqual(2, sub1.Count); Assert.IsFalse(sub1.Children.Any(x => !File.Exists(x.StoragePath))); Assert.AreEqual(folder1, sub1.Parent); Assert.AreEqual("test/folder1/sub1/file2.png", sub1.Children[0].QualifiedName); Assert.AreEqual("folder1\\sub1\\file2.png", sub1.Children[0].StoragePath); } [TestMethod] public void ProjectManagerCutPasteDirectorySameDirectoryTest() { var folder1 = Root.GetReference("test/folder1"); var sub1 = Root.GetReference("test/folder1/sub1"); // Initial state Assert.AreEqual(2, folder1.Count); Assert.AreEqual(2, sub1.Count); Assert.IsFalse(sub1.Children.Any(x => !File.Exists(x.StoragePath))); Assert.AreEqual(folder1, sub1.Parent); Assert.AreEqual("test/folder1/sub1/file2.png", sub1.Children[0].QualifiedName); Assert.AreEqual("folder1\\sub1\\file2.png", sub1.Children[0].StoragePath); // Cut ProjectManager.ProjectItemCutClipboard(sub1); // The item should be in the clipboard, but state unchanged Assert.IsTrue(ProjectManager.HaveProjectItemInClipboard()); Assert.AreEqual(2, folder1.Count); Assert.AreEqual(2, sub1.Count); Assert.IsFalse(sub1.Children.Any(x => !File.Exists(x.StoragePath))); Assert.AreEqual(folder1, sub1.Parent); // Paste in folder 2 try { ProjectManager.ProjectItemPasteClipboard(folder1); Assert.Fail("Directory is same."); } catch (IOException) { } Assert.IsTrue(ProjectManager.HaveProjectItemInClipboard()); Assert.AreEqual(2, folder1.Count); Assert.AreEqual(2, sub1.Count); Assert.IsFalse(sub1.Children.Any(x => !File.Exists(x.StoragePath))); Assert.AreEqual(folder1, sub1.Parent); Assert.AreEqual("test/folder1/sub1/file2.png", sub1.Children[0].QualifiedName); Assert.AreEqual("folder1\\sub1\\file2.png", sub1.Children[0].StoragePath); } #endregion #region Copy & paste for files [TestMethod] public void ProjectManagerCopyPasteFileTest() { var folder1 = Root.GetReference("test/folder1"); var folder2 = Root.GetReference("test/folder2"); var file1 = Root.GetReference("test/folder1/file1.txt"); // Initial state Assert.AreEqual(2, folder1.Count); Assert.AreEqual(0, folder2.Count); Assert.AreEqual(folder1, file1.Parent); // Copy ProjectManager.ProjectItemCopyClipboard(file1); // The item should be in the clipboard, but state unchanged Assert.IsTrue(ProjectManager.HaveProjectItemInClipboard()); Assert.AreEqual(2, folder1.Count); Assert.AreEqual(0, folder2.Count); Assert.AreEqual(folder1, file1.Parent); // Paste in folder 2 ProjectManager.ProjectItemPasteClipboard(folder2); Assert.IsTrue(ProjectManager.HaveProjectItemInClipboard()); Assert.AreEqual(2, folder1.Count); Assert.AreEqual(1, folder2.Count); Assert.AreEqual(folder1, file1.Parent); } [TestMethod] public void ProjectManagerCopyPasteFileNameConflictTest() { Reference folder1 = Root.GetReference("test/folder1"); Reference file1 = Root.GetReference("test/folder1/file1.txt"); Reference copy; // Initial state Assert.AreEqual(2, folder1.Count); Assert.AreEqual(4, Root.Count); Assert.AreEqual(folder1, file1.Parent); // Copy ProjectManager.ProjectItemCopyClipboard(file1); // The item should be in the clipboard, but state unchanged Assert.IsTrue(ProjectManager.HaveProjectItemInClipboard()); Assert.AreEqual(2, folder1.Count); Assert.AreEqual(4, Root.Count); Assert.AreEqual(folder1, file1.Parent); // Paste in root ProjectManager.ProjectItemPasteClipboard(Root); Assert.IsTrue(ProjectManager.HaveProjectItemInClipboard()); Assert.AreEqual(2, folder1.Count); Assert.AreEqual(5, Root.Count); Assert.AreEqual(folder1, file1.Parent); Assert.IsTrue(Root.TryGetReference("test/file1_2.txt", out copy)); // Paste again in root ProjectManager.ProjectItemPasteClipboard(Root); Assert.IsTrue(ProjectManager.HaveProjectItemInClipboard()); Assert.AreEqual(2, folder1.Count); Assert.AreEqual(6, Root.Count); Assert.AreEqual(folder1, file1.Parent); Assert.IsTrue(Root.TryGetReference("test/file1_3.txt", out copy)); } [TestMethod] public void ProjectManagerCopyPasteFileSameDirectoryTest() { var folder1 = Root.GetReference("test/folder1"); var file1 = Root.GetReference("test/folder1/file1.txt"); // Initial state Assert.AreEqual(2, folder1.Count); Assert.AreEqual(folder1, file1.Parent); // Copy ProjectManager.ProjectItemCopyClipboard(file1); // The item should be in the clipboard, but state unchanged Assert.IsTrue(ProjectManager.HaveProjectItemInClipboard()); Assert.AreEqual(2, folder1.Count); Assert.AreEqual(folder1, file1.Parent); // Paste in root ProjectManager.ProjectItemPasteClipboard(folder1); Assert.IsTrue(ProjectManager.HaveProjectItemInClipboard()); Assert.AreEqual(3, folder1.Count); Assert.AreEqual(folder1, file1.Parent); Assert.IsTrue(Root.TryGetReference("test/folder1/file1_2.txt", out file1)); // Past again in root ProjectManager.ProjectItemPasteClipboard(folder1); Assert.IsTrue(ProjectManager.HaveProjectItemInClipboard()); Assert.AreEqual(4, folder1.Count); Assert.AreEqual(folder1, file1.Parent); Assert.IsTrue(Root.TryGetReference("test/folder1/file1_3.txt", out file1)); } #endregion #region Copy & paste for directories [TestMethod] public void ProjectManagerCopyPasteDirectoryTest() { var folder1 = Root.GetReference("test/folder1"); var folder2 = Root.GetReference("test/folder2"); var sub1 = Root.GetReference("test/folder1/sub1"); // Initial state Assert.AreEqual(2, folder1.Count); Assert.AreEqual(0, folder2.Count); Assert.AreEqual(2, sub1.Count); Assert.IsFalse(sub1.Children.Any(x => !File.Exists(x.StoragePath))); Assert.AreEqual(folder1, sub1.Parent); Assert.AreEqual("test/folder1/sub1/file2.png", sub1.Children[0].QualifiedName); Assert.AreEqual("folder1\\sub1\\file2.png", sub1.Children[0].StoragePath); // Copy ProjectManager.ProjectItemCopyClipboard(sub1); // The item should be in the clipboard, but state unchanged Assert.IsTrue(ProjectManager.HaveProjectItemInClipboard()); Assert.AreEqual(2, folder1.Count); Assert.AreEqual(0, folder2.Count); Assert.AreEqual(2, sub1.Count); Assert.IsFalse(sub1.Children.Any(x => !File.Exists(x.StoragePath))); Assert.AreEqual(folder1, sub1.Parent); // Paste in folder 2 ProjectManager.ProjectItemPasteClipboard(folder2); Reference sub2; Assert.IsTrue(Root.TryGetReference("test/folder2/sub1", out sub2)); Assert.IsTrue(ProjectManager.HaveProjectItemInClipboard()); Assert.AreEqual(2, folder1.Count); Assert.AreEqual(1, folder2.Count); Assert.AreEqual(2, sub1.Count); Assert.AreEqual(2, sub2.Count); Assert.IsFalse(sub1.Children.Any(x => !File.Exists(x.StoragePath))); Assert.IsFalse(sub2.Children.Any(x => !File.Exists(x.StoragePath))); Assert.AreEqual(folder1, sub1.Parent); Assert.AreEqual(folder2, sub2.Parent); Assert.AreEqual("test/folder1/sub1/file2.png", sub1.Children[0].QualifiedName); Assert.AreEqual("folder1\\sub1\\file2.png", sub1.Children[0].StoragePath); Assert.AreEqual("test/folder2/sub1/file2.png", sub2.Children[0].QualifiedName); Assert.AreEqual("folder2\\sub1\\file2.png", sub2.Children[0].StoragePath); } [TestMethod] public void ProjectManagerCopyPasteDirectoryNameConflictTest() { var folder1 = Root.GetReference("test/folder1"); var sub1 = Root.GetReference("test/folder1/sub1"); // Initial state Assert.AreEqual(2, folder1.Count); Assert.AreEqual(4, Root.Count); Assert.AreEqual(2, sub1.Count); Assert.IsFalse(sub1.Children.Any(x => !File.Exists(x.StoragePath))); Assert.AreEqual(folder1, sub1.Parent); Assert.AreEqual("test/folder1/sub1/file2.png", sub1.Children[0].QualifiedName); Assert.AreEqual("folder1\\sub1\\file2.png", sub1.Children[0].StoragePath); // Copy ProjectManager.ProjectItemCopyClipboard(sub1); // The item should be in the clipboard, but state unchanged Assert.IsTrue(ProjectManager.HaveProjectItemInClipboard()); Assert.AreEqual(2, folder1.Count); Assert.AreEqual(4, Root.Count); Assert.AreEqual(2, sub1.Count); Assert.IsFalse(sub1.Children.Any(x => !File.Exists(x.StoragePath))); Assert.AreEqual(folder1, sub1.Parent); // Paste in root try { ProjectManager.ProjectItemPasteClipboard(Root); Assert.Fail("Directory already exists, should not overwrite."); } catch (IOException) { } // Object remains in clipboard, state unchanged Assert.IsTrue(ProjectManager.HaveProjectItemInClipboard()); Assert.AreEqual(2, folder1.Count); Assert.AreEqual(4, Root.Count); Assert.AreEqual(2, sub1.Count); Assert.IsFalse(sub1.Children.Any(x => !File.Exists(x.StoragePath))); Assert.AreEqual(folder1, sub1.Parent); Assert.AreEqual("test/folder1/sub1/file2.png", sub1.Children[0].QualifiedName); Assert.AreEqual("folder1\\sub1\\file2.png", sub1.Children[0].StoragePath); } [TestMethod] public void ProjectManagerCopyPasteDirectorySameDirectoryTest() { var folder1 = Root.GetReference("test/folder1"); var sub1 = Root.GetReference("test/folder1/sub1"); // Initial state Assert.AreEqual(2, folder1.Count); Assert.AreEqual(2, sub1.Count); Assert.IsFalse(sub1.Children.Any(x => !File.Exists(x.StoragePath))); Assert.AreEqual(folder1, sub1.Parent); Assert.AreEqual("test/folder1/sub1/file2.png", sub1.Children[0].QualifiedName); Assert.AreEqual("folder1\\sub1\\file2.png", sub1.Children[0].StoragePath); // Copy ProjectManager.ProjectItemCopyClipboard(sub1); // The item should be in the clipboard, but state unchanged Assert.IsTrue(ProjectManager.HaveProjectItemInClipboard()); Assert.AreEqual(2, folder1.Count); Assert.AreEqual(2, sub1.Count); Assert.IsFalse(sub1.Children.Any(x => !File.Exists(x.StoragePath))); Assert.AreEqual(folder1, sub1.Parent); // Paste in folder 2 try { ProjectManager.ProjectItemPasteClipboard(folder1); Assert.Fail("Directory is same."); } catch (IOException) { } Assert.IsTrue(ProjectManager.HaveProjectItemInClipboard()); Assert.AreEqual(2, folder1.Count); Assert.AreEqual(2, sub1.Count); Assert.IsFalse(sub1.Children.Any(x => !File.Exists(x.StoragePath))); Assert.AreEqual(folder1, sub1.Parent); Assert.AreEqual("test/folder1/sub1/file2.png", sub1.Children[0].QualifiedName); Assert.AreEqual("folder1\\sub1\\file2.png", sub1.Children[0].StoragePath); } #endregion } }