Beispiel #1
0
        public void ToVersionRangeWorksCorrectly(KspVersion version, KspVersionRange expectedRange)
        {
            // Act
            var result = version.ToVersionRange();

            // Assert
            Assert.AreEqual(expectedRange, result);
        }
Beispiel #2
0
        public void IntersectWithWorksCorrectly(KspVersionRange left, KspVersionRange right, KspVersionRange expected)
        {
            // Act
            var result = left.IntersectWith(right);

            // Assert
            Assert.That(result, Is.EqualTo(expected));
        }
Beispiel #3
0
        public void ToStringWorksCorrectly(KspVersionRange vr, string expected)
        {
            // Act
            var result = vr.ToString();

            // Assert
            Assert.That(result, Is.EqualTo(expected));
        }
Beispiel #4
0
        public void IsSupersetOfWorksCorrectly(KspVersionRange left, KspVersionRange right, bool expected)
        {
            // Act
            var result = left.IsSupersetOf(right);

            // Assert
            Assert.That(result, Is.EqualTo(expected));
        }
Beispiel #5
0
        public void IsSupersetOfThrowsOnNullParameter()
        {
            // Arrange
            var sut = new KspVersionRange(new KspVersionBound(), new KspVersionBound());

            // Act
            TestDelegate act = () => sut.IsSupersetOf(null);

            // Assert
            Assert.That(act, Throws.Exception);
        }
Beispiel #6
0
        public void VersionSpan_AllVersions_CorrectString()
        {
            // Arrange
            KspVersion min = KspVersion.Any;
            KspVersion max = KspVersion.Any;
            // Act
            string s = KspVersionRange.VersionSpan(min, max);

            // Assert
            Assert.AreEqual("KSP all versions", s);
        }
Beispiel #7
0
        public void VersionSpan_MaxOnly_CorrectString()
        {
            // Arrange
            KspVersion min = KspVersion.Any;
            KspVersion max = new KspVersion(1, 0, 0);
            // Act
            string s = KspVersionRange.VersionSpan(min, max);

            // Assert
            Assert.AreEqual("KSP 1.0.0 and earlier", s);
        }
Beispiel #8
0
        public void VersionSpan_OneOnly_CorrectString()
        {
            // Arrange
            KspVersion min = new KspVersion(1, 0, 0);
            KspVersion max = new KspVersion(1, 0, 0);
            // Act
            string s = KspVersionRange.VersionSpan(min, max);

            // Assert
            Assert.AreEqual("KSP 1.0.0", s);
        }
Beispiel #9
0
        public void VersionSpan_FiniteRange_CorrectString()
        {
            // Arrange
            KspVersion min = new KspVersion(1, 0, 0);
            KspVersion max = new KspVersion(1, 1, 1);
            // Act
            string s = KspVersionRange.VersionSpan(min, max);

            // Assert
            Assert.AreEqual("KSP 1.0.0 - 1.1.1", s);
        }
Beispiel #10
0
        /// <summary>
        /// Generate a string describing the range of game versions
        /// compatible with the given module.
        /// </summary>
        /// <param name="identifier">Mod name to findDependencyShallow</param>
        /// <returns>
        /// String describing range of compatible game versions.
        /// </returns>
        public static string CompatibleGameVersions(this IRegistryQuerier querier, CkanModule module)
        {
            ModuleVersion minMod = null, maxMod = null;
            KspVersion    minKsp = null, maxKsp = null;

            Registry.GetMinMaxVersions(
                new CkanModule[] { module },
                out minMod, out maxMod,
                out minKsp, out maxKsp
                );
            return(KspVersionRange.VersionSpan(minKsp, maxKsp));
        }
Beispiel #11
0
        /// <summary>
        /// Generate a string describing the range of game versions
        /// compatible with the given module.
        /// </summary>
        /// <param name="identifier">Mod name to findDependencyShallow</param>
        /// <returns>
        /// String describing range of compatible game versions.
        /// </returns>
        public static string CompatibleGameVersions(this IRegistryQuerier querier, string identifier)
        {
            List <CkanModule> releases = querier.AvailableByIdentifier(identifier).ToList();

            if (releases != null && releases.Count > 0)
            {
                ModuleVersion minMod = null, maxMod = null;
                KspVersion    minKsp = null, maxKsp = null;
                Registry.GetMinMaxVersions(releases, out minMod, out maxMod, out minKsp, out maxKsp);
                return(KspVersionRange.VersionSpan(minKsp, maxKsp));
            }
            return("");
        }
Beispiel #12
0
        public void CtorWorksCorrectly()
        {
            // Arrange
            var lower = new KspVersionBound(new KspVersion(1, 2, 3, 4), false);
            var upper = new KspVersionBound(new KspVersion(5, 6, 7, 8), true);

            // Act
            var result = new KspVersionRange(lower, upper);

            // Assert
            Assert.That(result.Lower, Is.EqualTo(lower));
            Assert.That(result.Upper, Is.EqualTo(upper));
        }
Beispiel #13
0
        public void ReferenceEqualityWorksCorrectly()
        {
            // Arrange
            var sut = new KspVersionRange(new KspVersionBound(), new KspVersionBound());

            // Act
            var genericEquals    = sut.Equals(sut);
            var nonGenericEquals = sut.Equals((object)sut);

            // Assert
            Assert.IsTrue(genericEquals);
            Assert.IsTrue(nonGenericEquals);
        }
Beispiel #14
0
        public void LaunchKSP()
        {
            var split = configuration.CommandLineArguments.Split(' ');

            if (split.Length == 0)
            {
                return;
            }

            var registry = RegistryManager.Instance(CurrentInstance).registry;
            var incomp   = registry.IncompatibleInstalled(CurrentInstance.VersionCriteria());

            if (incomp.Any())
            {
                // Warn that it might not be safe to run KSP with incompatible modules installed
                string incompatDescrip = incomp
                                         .Select(m => $"{m.Module} ({registry.CompatibleGameVersions(m.Module)})")
                                         .Aggregate((a, b) => $"{a}, {b}");
                if (!YesNoDialog(string.Format(Properties.Resources.MainLaunchWithIncompatible, incompatDescrip),
                                 Properties.Resources.MainLaunch,
                                 Properties.Resources.MainGoBack))
                {
                    return;
                }
            }

            // -single-instance crashes KSP 1.8 to KSP 1.9 on Linux
            // https://issuetracker.unity3d.com/issues/linux-segmentation-fault-when-running-a-built-project-with-single-instance-argument
            if (Platform.IsUnix)
            {
                var brokenVersionRange = new KspVersionRange(
                    new KspVersion(1, 8),
                    new KspVersion(1, 11)
                    );
                split = filterCmdLineArgs(split, brokenVersionRange, "-single-instance");
            }

            var binary = split[0];
            var args   = string.Join(" ", split.Skip(1));

            try
            {
                Directory.SetCurrentDirectory(CurrentInstance.GameDir());
                Process.Start(binary, args);
            }
            catch (Exception exception)
            {
                currentUser.RaiseError(Properties.Resources.MainLaunchFailed, exception.Message);
            }
        }
Beispiel #15
0
        /// <summary>
        /// If the installed game version is in the given range,
        /// return the given array without the given parameter,
        /// otherwise return the array as-is.
        /// </summary>
        /// <param name="args">Command line parameters to check</param>
        /// <param name="crashyKspRange">Game versions that should not use this parameter</param>
        /// <param name="parameter">The parameter to remove on version match</param>
        /// <returns>
        /// args or args minus parameter
        /// </returns>
        private string[] filterCmdLineArgs(string[] args, KspVersionRange crashyKspRange, string parameter)
        {
            var installedRange = Main.Instance.CurrentInstance.Version().ToVersionRange();

            if (crashyKspRange.IntersectWith(installedRange) != null &&
                args.Contains(parameter))
            {
                log.DebugFormat(
                    "Parameter {0} found on incompatible KSP version {1}, pruning",
                    parameter,
                    Main.Instance.CurrentInstance.Version().ToString());
                return(args.Where(s => s != parameter).ToArray());
            }
            return(args);
        }
Beispiel #16
0
        public void RangeFromVersionsEqualsRangeFromBounds()
        {
            // Arrange
            var lowerBound   = new KspVersionBound(new KspVersion(1, 2, 0, 0), true);
            var upperBound   = new KspVersionBound(new KspVersion(2, 4, 7, 0), false);
            var lowerVersion = new KspVersion(1, 2);
            var upperVersion = new KspVersion(2, 4, 6);

            // Act
            var resultFromBounds   = new KspVersionRange(lowerBound, upperBound);
            var resultFromVersions = new KspVersionRange(lowerVersion, upperVersion);

            // Assert
            Assert.That(resultFromBounds.Lower, Is.EqualTo(resultFromVersions.Lower));
            Assert.That(resultFromBounds.Upper, Is.EqualTo(resultFromVersions.Upper));
        }
Beispiel #17
0
        public override bool SingleVersionsCompatible(KspVersion gameVersion, CkanModule module)
        {
            var gameVersionRange = gameVersion.ToVersionRange();

            var moduleRange = KspVersionRange.Any;

            if (module.ksp_version != null)
            {
                moduleRange = module.ksp_version.ToVersionRange();
            }
            else if (module.ksp_version_min != null || module.ksp_version_max != null)
            {
                if (module.ksp_version_min != null && module.ksp_version_max != null)
                {
                    var minRange = module.ksp_version_min.ToVersionRange();
                    var maxRange = module.ksp_version_max.ToVersionRange();
                    if (minRange.Lower.Value <= maxRange.Upper.Value)
                    {
                        moduleRange = new KspVersionRange(minRange.Lower, maxRange.Upper);
                    }
                    else
                    {
                        log.WarnFormat("{0} is not less or equal to {1}",
                                       module.ksp_version_min, module.ksp_version_max);
                        return(false);
                    }
                }
                else if (module.ksp_version_min != null)
                {
                    var minRange = module.ksp_version_min.ToVersionRange();

                    moduleRange = new KspVersionRange(minRange.Lower, KspVersionBound.Unbounded);
                }
                else if (module.ksp_version_max != null)
                {
                    var maxRange = module.ksp_version_max.ToVersionRange();

                    moduleRange = new KspVersionRange(KspVersionBound.Unbounded, maxRange.Upper);
                }
            }
            else
            {
                return(true);
            }

            return(gameVersionRange.IntersectWith(moduleRange) != null);
        }
Beispiel #18
0
        public bool Compatible(KspVersion gameVersion, CkanModule module)
        {
            var gameVersionRange = gameVersion.ToVersionRange();

            var moduleRange = KspVersionRange.Any;

            if (module.ksp_version != null)
            {
                moduleRange = module.ksp_version.ToVersionRange();
            }
            else if (module.ksp_version_min != null || module.ksp_version_max != null)
            {
                if (module.ksp_version_min != null && module.ksp_version_max != null)
                {
                    if (module.ksp_version_min <= module.ksp_version_max)
                    {
                        var minRange = module.ksp_version_min.ToVersionRange();
                        var maxRange = module.ksp_version_max.ToVersionRange();

                        moduleRange = new KspVersionRange(minRange.Lower, maxRange.Upper);
                    }
                    else
                    {
                        return(false);
                    }
                }
                else if (module.ksp_version_min != null)
                {
                    var minRange = module.ksp_version_min.ToVersionRange();

                    moduleRange = new KspVersionRange(minRange.Lower, KspVersionBound.Unbounded);
                }
                else if (module.ksp_version_max != null)
                {
                    var maxRange = module.ksp_version_max.ToVersionRange();

                    moduleRange = new KspVersionRange(KspVersionBound.Unbounded, maxRange.Upper);
                }
            }
            else
            {
                return(true);
            }

            return(moduleRange.IsSupersetOf(gameVersionRange));
        }
Beispiel #19
0
        public void EqualityWorksCorrectly(KspVersionRange vr1, KspVersionRange vr2, bool areEqual)
        {
            // Act
            var genericEquals            = vr1.Equals(vr2);
            var nonGenericEquals         = vr1.Equals((object)vr2);
            var equalsOperator           = vr1 == vr2;
            var notEqualsOperator        = vr1 != vr2;
            var reverseEqualsOperator    = vr2 == vr1;
            var reverseNotEqualsOperator = vr2 != vr1;

            // Assert
            Assert.AreEqual(areEqual, genericEquals);
            Assert.AreEqual(areEqual, nonGenericEquals);
            Assert.AreEqual(areEqual, equalsOperator);
            Assert.AreNotEqual(areEqual, notEqualsOperator);
            Assert.AreEqual(areEqual, reverseEqualsOperator);
            Assert.AreNotEqual(areEqual, reverseNotEqualsOperator);
        }
Beispiel #20
0
        private void addVersionBox(int l, int t, int r, int b, Func<string> title, Func<ConsoleColor> color, bool doubleLine, List<CkanModule> releases)
        {
            AddObject(new ConsoleFrame(
                l, t, r, b,
                title,
                color,
                doubleLine
            ));

            if (releases != null && releases.Count > 0) {

                ModuleVersion minMod = null, maxMod = null;
                KspVersion    minKsp = null, maxKsp = null;
                Registry.GetMinMaxVersions(releases, out minMod, out maxMod, out minKsp, out maxKsp);
                AddObject(new ConsoleLabel(
                    l + 2, t + 1, r - 2,
                    () => minMod == maxMod
                        ? $"{ModuleInstaller.WithAndWithoutEpoch(minMod?.ToString() ?? "???")}"
                        : $"{ModuleInstaller.WithAndWithoutEpoch(minMod?.ToString() ?? "???")} - {ModuleInstaller.WithAndWithoutEpoch(maxMod?.ToString() ?? "???")}",
                    null,
                    color
                ));
                AddObject(new ConsoleLabel(
                    l + 2, t + 2, r - 2,
                    () => "Compatible with:",
                    null,
                    () => ConsoleTheme.Current.DimLabelFg
                ));
                AddObject(new ConsoleLabel(
                    l + 4, t + 3, r - 2,
                    () => KspVersionRange.VersionSpan(minKsp, maxKsp),
                    null,
                    color
                ));

            }
        }
Beispiel #21
0
        public void NullEqualityWorksCorrectly()
        {
            // Arrange
            var sut = new KspVersionRange(new KspVersionBound(), new KspVersionBound());

            // Act
            // ReSharper disable ConditionIsAlwaysTrueOrFalse
            var genericEquals              = sut.Equals(null);
            var nonGenericEquals           = sut.Equals((object)null);
            var equalsOperatorNullLeft     = null == sut;
            var equalsOperatorNullRight    = sut == null;
            var notEqualsOperatorNullLeft  = null != sut;
            var notEqualsOperatorNullRight = sut != null;

            // ReSharper restore ConditionIsAlwaysTrueOrFalse

            // ASsert
            Assert.IsFalse(genericEquals);
            Assert.IsFalse(nonGenericEquals);
            Assert.IsFalse(equalsOperatorNullLeft);
            Assert.IsFalse(equalsOperatorNullRight);
            Assert.IsTrue(notEqualsOperatorNullLeft);
            Assert.IsTrue(notEqualsOperatorNullRight);
        }
Beispiel #22
0
        public void Validate(Metadata metadata)
        {
            var mod = CkanModule.FromJson(metadata.Json().ToString());

            if (!mod.IsCompatibleKSP(new KspVersionCriteria(null, buildMap.KnownVersions)))
            {
                KspVersion minKsp = null, maxKsp = null;
                Registry.GetMinMaxVersions(new List <CkanModule>()
                {
                    mod
                }, out _, out _, out minKsp, out maxKsp);
                throw new Kraken($"{metadata.Identifier} doesn't match any valid game version: {KspVersionRange.VersionSpan(minKsp, maxKsp)}");
            }
        }
Beispiel #23
0
        private bool VersionsNeedManualReview(Metadata metadata, out string reason)
        {
            JObject json   = metadata.Json();
            var     minStr = json["ksp_version_min"] ?? json["ksp_version"];
            var     maxStr = json["ksp_version_max"] ?? json["ksp_version"];
            var     minVer = minStr == null ? KspVersion.Any : KspVersion.Parse((string)minStr);
            var     maxVer = maxStr == null ? KspVersion.Any : KspVersion.Parse((string)maxStr);

            if (currentRelease.IntersectWith(new KspVersionRange(minVer, maxVer)) == null)
            {
                reason = $"Hard-coded game versions not compatible with current release: {KspVersionRange.VersionSpan(minVer, maxVer)}\r\nPlease check that they match the forum thread.";
                return(true);
            }
            else
            {
                // Compatible with latest release, no manual review needed
                reason = "";
                return(false);
            }
        }