🏡 index : VBASync.git

using NUnit.Framework;
using System;
using VBASync.Model;
using VBASync.Tests.Mocks;

namespace VBASync.Tests.UnitTests
{
    [TestFixture]
    public class StartupTests
    {
        [Test]
        public void StartupAllArgsExtract()
        {
            var startup = new Startup(MakeWindowsHook, s => ThrowUnexpectedIniRequest());
            startup.ProcessArgs(new[] { "-x", "-f", @"C:\Path\To\File", "-d", @"C:\Path\To\Folder",
                "-r", "-a", "-i", "-h", @"MyAwesomeHook.bat ""{TargetDir}""" });

            Assert.That(startup.Action, Is.EqualTo(ActionType.Extract));
            Assert.That(startup.AddNewDocumentsToFile, Is.EqualTo(true));
            Assert.That(startup.AfterExtractHook.Content, Is.EqualTo(@"MyAwesomeHook.bat ""{TargetDir}"""));
            Assert.That(startup.AutoRun, Is.EqualTo(true));
            Assert.That(startup.FilePath, Is.EqualTo(@"C:\Path\To\File"));
            Assert.That(startup.FolderPath, Is.EqualTo(@"C:\Path\To\Folder"));
            Assert.That(startup.IgnoreEmpty, Is.EqualTo(true));
        }

        [Test]
        public void StartupAllArgsPublish()
        {
            var startup = new Startup(MakeWindowsHook, s => ThrowUnexpectedIniRequest());
            startup.ProcessArgs(new[] { "-p", "-f", @"C:\Path\To\File", "-d", @"C:\Path\To\Folder",
                "-r", "-a", "-i", "-h", @"MyAwesomeHook.bat ""{TargetDir}""" });

            Assert.That(startup.Action, Is.EqualTo(ActionType.Publish));
            Assert.That(startup.AddNewDocumentsToFile, Is.EqualTo(true));
            Assert.That(startup.BeforePublishHook.Content, Is.EqualTo(@"MyAwesomeHook.bat ""{TargetDir}"""));
            Assert.That(startup.AutoRun, Is.EqualTo(true));
            Assert.That(startup.FilePath, Is.EqualTo(@"C:\Path\To\File"));
            Assert.That(startup.FolderPath, Is.EqualTo(@"C:\Path\To\Folder"));
            Assert.That(startup.IgnoreEmpty, Is.EqualTo(true));
        }

        [Test]
        public void StartupAutoExtract()
        {
            var startup = new Startup(MakeWindowsHook, s => ThrowUnexpectedIniRequest());

            var generalIni = new AppIniFile();
            generalIni.PumpValue("General", "Language", "en");
            generalIni.PumpValue("General", "ActionType", "Extract");
            generalIni.PumpValue("General", "FolderPath", @"C:\Path\To\LastFolder");
            generalIni.PumpValue("General", "FilePath", @"C:\Path\To\LastFile");
            generalIni.PumpValue("DiffTool", "Path", @"C:\Path\To\DiffTool");
            startup.ProcessIni(generalIni, false);

            var sessionIni = new AppIniFile();
            sessionIni.PumpValue("General", "ActionType", "Publish");
            sessionIni.PumpValue("General", "FolderPath", @"C:\Path\To\RealFolder");
            sessionIni.PumpValue("General", "FilePath", @"C:\Path\To\RealFile");
            startup.ProcessIni(sessionIni, true);

            startup.ProcessArgs(new[] { "-r", "-x" });

            Assert.That(startup.Language, Is.EqualTo("en"));
            Assert.That(startup.Action, Is.EqualTo(ActionType.Extract));
            Assert.That(startup.FolderPath, Is.EqualTo(@"C:\Path\To\RealFolder"));
            Assert.That(startup.FilePath, Is.EqualTo(@"C:\Path\To\RealFile"));
            Assert.That(startup.DiffTool, Is.EqualTo(@"C:\Path\To\DiffTool"));
            Assert.That(startup.RecentFiles.Count, Is.EqualTo(0));
            Assert.That(startup.AutoRun, Is.EqualTo(true));
        }

        [Test]
        public void StartupAutoPublishDueIniOverride()
        {
            var startup = new Startup(MakeWindowsHook, AllowOnlyPublisherIniRequest);

            var generalIni = new AppIniFile();
            generalIni.PumpValue("General", "Language", "en");
            generalIni.PumpValue("General", "ActionType", "Extract");
            generalIni.PumpValue("General", "FolderPath", @"C:\Path\To\LastFolder");
            generalIni.PumpValue("General", "FilePath", @"C:\Path\To\LastFile");
            generalIni.PumpValue("DiffTool", "Path", @"C:\Path\To\DiffTool");
            startup.ProcessIni(generalIni, false);

            var sessionIni = new AppIniFile();
            sessionIni.PumpValue("General", "ActionType", "Publish");
            sessionIni.PumpValue("General", "FolderPath", @"C:\Path\To\RealFolder");
            sessionIni.PumpValue("General", "FilePath", @"C:\Path\To\RealFile");
            startup.ProcessIni(sessionIni, true);

            startup.ProcessArgs(new[] { "-r", "-x", "Publisher.ini" });

            Assert.That(startup.Language, Is.EqualTo("en"));
            Assert.That(startup.Action, Is.EqualTo(ActionType.Publish));
            Assert.That(startup.FolderPath, Is.EqualTo(@"C:\Path\To\RealFolder"));
            Assert.That(startup.FilePath, Is.EqualTo(@"C:\Path\To\RealFile"));
            Assert.That(startup.DiffTool, Is.EqualTo(@"C:\Path\To\DiffTool"));
            Assert.That(startup.RecentFiles.Count, Is.EqualTo(0));
            Assert.That(startup.AutoRun, Is.EqualTo(true));
        }

        [Test]
        public void StartupDefaultDiffToolParameters()
        {
            var startup = new Startup();
            Assert.That(startup.DiffToolParameters, Is.EqualTo(@"""{OldFile}"" ""{NewFile}"""));
        }

        [Test]
        public void StartupInteractiveNoSessionIni()
        {
            var startup = new Startup(MakeWindowsHook, s => ThrowUnexpectedIniRequest());

            var ini = new AppIniFile();
            ini.PumpValue("General", "Language", "en");
            ini.PumpValue("General", "ActionType", "Extract");
            ini.PumpValue("General", "FolderPath", @"C:\Path\To\LastFolder");
            ini.PumpValue("General", "FilePath", @"C:\Path\To\LastFile");
            ini.PumpValue("DiffTool", "Path", @"C:\Path\To\DiffTool");
            ini.PumpValue("RecentFiles", "1", @"C:\Path\To\RecentFile1");
            ini.PumpValue("RecentFiles", "2", @"C:\Path\To\RecentFile2");
            startup.ProcessIni(ini, false);

            startup.ProcessIni(new AppIniFile(), true);

            startup.ProcessArgs(new string[0]);

            Assert.That(startup.Language, Is.EqualTo("en"));
            Assert.That(startup.Action, Is.EqualTo(ActionType.Extract));
            Assert.That(startup.FolderPath, Is.Null);
            Assert.That(startup.FilePath, Is.Null);
            Assert.That(startup.DiffTool, Is.EqualTo(@"C:\Path\To\DiffTool"));
            Assert.That(startup.RecentFiles.Count, Is.EqualTo(2));
            Assert.That(startup.RecentFiles[0], Is.EqualTo(@"C:\Path\To\RecentFile1"));
            Assert.That(startup.RecentFiles[1], Is.EqualTo(@"C:\Path\To\RecentFile2"));
            Assert.That(startup.AutoRun, Is.EqualTo(false));
        }

        [Test]
        public void StartupInteractiveWithSessionIni()
        {
            var startup = new Startup(MakeWindowsHook, s => ThrowUnexpectedIniRequest());

            var generalIni = new AppIniFile();
            generalIni.PumpValue("General", "Language", "en");
            generalIni.PumpValue("General", "ActionType", "Extract");
            generalIni.PumpValue("General", "FolderPath", @"C:\Path\To\LastFolder");
            generalIni.PumpValue("General", "FilePath", @"C:\Path\To\LastFile");
            generalIni.PumpValue("DiffTool", "Path", @"C:\Path\To\DiffTool");
            startup.ProcessIni(generalIni, false);

            var sessionIni = new AppIniFile();
            sessionIni.PumpValue("General", "ActionType", "Publish");
            sessionIni.PumpValue("General", "FolderPath", @"C:\Path\To\RealFolder");
            sessionIni.PumpValue("General", "FilePath", @"C:\Path\To\RealFile");
            startup.ProcessIni(sessionIni, true);

            startup.ProcessArgs(new string[0]);

            Assert.That(startup.Language, Is.EqualTo("en"));
            Assert.That(startup.Action, Is.EqualTo(ActionType.Publish));
            Assert.That(startup.FolderPath, Is.EqualTo(@"C:\Path\To\RealFolder"));
            Assert.That(startup.FilePath, Is.EqualTo(@"C:\Path\To\RealFile"));
            Assert.That(startup.DiffTool, Is.EqualTo(@"C:\Path\To\DiffTool"));
            Assert.That(startup.RecentFiles.Count, Is.EqualTo(0));
            Assert.That(startup.AutoRun, Is.EqualTo(false));
        }

        private AppIniFile AllowOnlyPublisherIniRequest(string path)
        {
            if (string.Equals(path, "Publisher.ini", StringComparison.InvariantCultureIgnoreCase))
            {
                var ini = new AppIniFile();
                ini.PumpValue("General", "ActionType", "Publish");
                return ini;
            }
            return ThrowUnexpectedIniRequest();
        }

        private Hook MakeWindowsHook(string content) => new Hook(new WindowsFakeSystemOperations(), content);

        private AppIniFile ThrowUnexpectedIniRequest()
        {
            throw new ApplicationException("Encountered an unexpected request for a .ini file!");
        }
    }
}