internal void CheckUpperLimitAlwaysRequired(string command, IEnumerable <Bundle> bundles)
        {
            var    parseResult     = CommandLineConfigs.UninstallRootCommand.Parse(command);
            Action filteringAction = () => CommandBundleFilter.GetFilteredBundles(bundles, parseResult);

            filteringAction.Should().Throw <UninstallationNotAllowedException>();
        }
        internal void TestRequiredUninstallableWhenExplicitlyAdded(string command, string[] expectedUninstallableSdk, string[] expectedUninstallableRuntime)
        {
            var bundles = new List <Bundle>();

            foreach (string v in versions)
            {
                bundles.Add(new Bundle <SdkVersion>(new SdkVersion(v), new BundleArch(), string.Empty, v));
                bundles.Add(new Bundle <RuntimeVersion>(new RuntimeVersion(v), new BundleArch(), string.Empty, v));
            }

            var parseResult          = CommandLineConfigs.UninstallRootCommand.Parse(command);
            var uninstallableBundles = CommandBundleFilter.GetFilteredBundles(bundles, parseResult);

            var uninstallableSdks     = uninstallableBundles.Where(b => b.Version is SdkVersion).Select(b => b.DisplayName);
            var requiredSdks          = bundles.Except(uninstallableBundles).Where(b => b.Version is SdkVersion).Select(b => b.DisplayName);
            var uninstallableRuntimes = uninstallableBundles.Where(b => b.Version is RuntimeVersion).Select(b => b.DisplayName);
            var requiredRuntimes      = bundles.Except(uninstallableBundles).Where(b => b.Version is RuntimeVersion).Select(b => b.DisplayName);

            (uninstallableSdks.Count() + requiredSdks.Count()).Should().Be(versions.Length);
            uninstallableSdks.ToHashSet().Should().BeEquivalentTo(expectedUninstallableSdk.ToHashSet());
            requiredSdks.Should().BeEquivalentTo(versions.Where(v => !expectedUninstallableSdk.Contains(v)));

            (uninstallableRuntimes.Count() + requiredRuntimes.Count()).Should().Be(versions.Length);
            uninstallableRuntimes.ToHashSet().Should().BeEquivalentTo(expectedUninstallableRuntime.ToHashSet());
            requiredRuntimes.Should().BeEquivalentTo(versions.Where(v => !expectedUninstallableRuntime.Contains(v)));
        }
        internal void TestRequiredUninstallableWhenExplicitlyAdded(IEnumerable <Bundle> bundles, string command, string[] expectedUninstallableSdk, string[] expectedUninstallableRuntime)
        {
            var parseResult          = CommandLineConfigs.UninstallRootCommand.Parse(command);
            var uninstallableBundles = CommandBundleFilter.GetFilteredBundles(bundles, parseResult);

            var uninstallableSdks     = uninstallableBundles.Where(b => b.Version is SdkVersion).Select(b => b.DisplayName);
            var requiredSdks          = bundles.Except(uninstallableBundles).Where(b => b.Version is SdkVersion).Select(b => b.DisplayName);
            var uninstallableRuntimes = uninstallableBundles.Where(b => b.Version is RuntimeVersion).Select(b => b.DisplayName);
            var requiredRuntimes      = bundles.Except(uninstallableBundles).Where(b => b.Version is RuntimeVersion).Select(b => b.DisplayName);

            bundles = bundles.Where(bundle => command.Contains(bundle.UninstallCommand)); // Only check bundles of type specified (SDK, Runtime, etc)
            (uninstallableSdks.Count() + requiredSdks.Count()).Should().Be(bundles.Count());
            uninstallableSdks.ToHashSet().Should().BeEquivalentTo(expectedUninstallableSdk.ToHashSet());
            requiredSdks.Should().BeEquivalentTo(bundles.Select(bundle => bundle.DisplayName).Where(v => !expectedUninstallableSdk.Contains(v)));

            (uninstallableRuntimes.Count() + requiredRuntimes.Count()).Should().Be(bundles.Count());
            uninstallableRuntimes.ToHashSet().Should().BeEquivalentTo(expectedUninstallableRuntime.ToHashSet());
            requiredRuntimes.Should().BeEquivalentTo(bundles.Select(bundle => bundle.DisplayName).Where(v => !expectedUninstallableRuntime.Contains(v)));
        }