public void Update()
        {
            var packageOptions = new PackageOptions();
            var package        = new Package(ExtractPath, "Test");
            var viewModel      = new PackageUpdateViewModel(package.Object, package.Object, packageOptions.Object, false);
            var install        = new InstallService(ExtractPath, package, package, package);
            var selfUpdate     = new SelfUpdateService(false, null);

            var command = new UpdateCommand(install.Object, selfUpdate.Object);

            Assert.IsTrue(command.CanExecute(viewModel));

            command.ExecuteAsync(viewModel).Wait();

            Assert.IsFalse(selfUpdate.IsSelfUpdateCalled);
            Assert.IsFalse(selfUpdate.RunNewInstanceCalled);
            Assert.IsTrue(install.UninstallCalled);
            Assert.IsTrue(install.InstallCalled);
        }
        public void UpdateAll()
        {
            var packageOptions = new PackageOptions();
            var packageA       = new Package(ExtractPath, "A");
            var packageB       = new Package(ExtractPath, "B");
            var packageC       = new Package(ExtractPath, "C");

            PackageUpdateViewModel ToUpdate(Package package) => new PackageUpdateViewModel(package.Object, package.Object, packageOptions.Object, false);

            var install = new InstallService(ExtractPath, packageA, packageA, packageA);

            install.InstallPackages.Add(packageB.Object);
            install.InstallPackages.Add(packageC.Object);
            install.UninstallPackages.Add(packageB.Object);
            install.UninstallPackages.Add(packageC.Object);
            install.IsInstalledPackages.Add(packageB.Object);
            install.IsInstalledPackages.Add(packageC.Object);

            var selfUpdate = new SelfUpdateService(false, packageA);

            selfUpdate.UpdatePackages.Add(packageB.Object);
            selfUpdate.UpdatePackages.Add(packageC.Object);

            var innerCommand = new UpdateCommand(install.Object, selfUpdate.Object);

            var viewModel = new UpdateAllCommandViewModel(innerCommand, new List <PackageUpdateViewModel>()
            {
                ToUpdate(packageA), ToUpdate(packageB), ToUpdate(packageC)
            });
            var command = new UpdateAllCommand(viewModel.Object);

            Assert.IsTrue(command.CanExecute());

            command.ExecuteAsync().Wait();

            Assert.AreEqual(3, install.InstallCalled);
            Assert.AreEqual(3, install.UninstallCalled);
            Assert.AreEqual(3, install.IsInstalledCalled);

            Assert.AreEqual(0, selfUpdate.IsSelfUpdateCalled);
        }