Example #1
0
        public void ModList_WithInstalledModules_DoesNotContainThem()
        {
            var list  = new List <string>();
            var mod_a = generator.GeneratorRandomModule();

            list.Add(mod_a.identifier);
            AddToRegistry(mod_a);
            registry.Installed().Add(mod_a.identifier, mod_a.version);

            var relationship_resolver = new RelationshipResolver(list, null, options, registry, null);

            CollectionAssert.IsEmpty(relationship_resolver.ModList());
        }
Example #2
0
        public void ReasonFor_WithUserAddedMods_GivesReasonUserAdded()
        {
            var list = new List <string>();
            var mod  = generator.GeneratorRandomModule();

            list.Add(mod.identifier);
            registry.AddAvailable(mod);
            AddToRegistry(mod);

            var relationship_resolver = new RelationshipResolver(list, null, options, registry, null);
            var reason = relationship_resolver.ReasonFor(mod);

            Assert.That(reason, Is.AssignableTo <SelectionReason.UserRequested>());
        }
Example #3
0
        public void ReasonFor_WithModsNotInList_ThrowsArgumentException()
        {
            var list = new List <string>();
            var mod  = generator.GeneratorRandomModule();

            list.Add(mod.identifier);
            registry.AddAvailable(mod);
            AddToRegistry(mod);
            var relationship_resolver = new RelationshipResolver(list, null, options, registry, null);

            var mod_not_in_resolver_list = generator.GeneratorRandomModule();

            CollectionAssert.DoesNotContain(relationship_resolver.ModList(), mod_not_in_resolver_list);
            Assert.Throws <ArgumentException>(() => relationship_resolver.ReasonFor(mod_not_in_resolver_list));
        }
Example #4
0
        public void Constructor_WithSuggests_HasSugestedInModlist()
        {
            options.with_all_suggests = true;
            var list     = new List <string>();
            var sugested = generator.GeneratorRandomModule();
            var sugester = generator.GeneratorRandomModule(depends: new List <ModDependency>
            {
                new ModDependency($"? {sugested.identifier}")
            });

            list.Add(sugester.identifier);
            AddToRegistry(sugester, sugested);

            var modList = list.Select(p => new CfanModuleIdAndVersion(p));
            var relationship_resolver = new RelationshipResolver(modList, options, registry, null);

            Assert.True(relationship_resolver.ModList().Any(p => p.ToString() == sugested.ToString()));
        }
Example #5
0
        public void Constructor_WithSuggests_HasSuggestedInModlist()
        {
            options.with_all_suggests = true;
            var list      = new List <string>();
            var suggested = generator.GeneratorRandomModule();
            var suggester = generator.GeneratorRandomModule(suggests: new List <RelationshipDescriptor>
            {
                new ModuleRelationshipDescriptor {
                    name = suggested.identifier
                }
            });

            list.Add(suggester.identifier);
            AddToRegistry(suggester, suggested);

            var relationship_resolver = new RelationshipResolver(list, null, options, registry, null);

            CollectionAssert.Contains(relationship_resolver.ModList(), suggested);
        }
Example #6
0
        public void Constructor_ReverseDependencyDoesntMatchLatest_ChoosesOlderVersion()
        {
            // Arrange
            CkanModule depender = CkanModule.FromJson(@"{
                ""identifier"": ""depender"",
                ""version"":    ""1.0"",
                ""download"":   ""https://kerbalstuff.com/mod/269/Dogecoin%20Flag/download/1.01"",
                ""depends"": [ { ""name"": ""dependency"" } ]
            }");

            CkanModule olderDependency = CkanModule.FromJson(@"{
                ""identifier"": ""dependency"",
                ""version"":    ""1.0"",
                ""download"":   ""https://kerbalstuff.com/mod/269/Dogecoin%20Flag/download/1.01"",
                ""depends"": [ {
                    ""name"":        ""depender"",
                    ""min_version"": ""1.0""
                } ]
            }");

            CkanModule newerDependency = CkanModule.FromJson(@"{
                ""identifier"": ""dependency"",
                ""version"":    ""2.0"",
                ""download"":   ""https://kerbalstuff.com/mod/269/Dogecoin%20Flag/download/1.01"",
                ""depends"": [ {
                    ""name"":        ""depender"",
                    ""min_version"": ""2.0""
                } ]
            }");

            AddToRegistry(olderDependency, newerDependency, depender);

            // Act
            RelationshipResolver rr = new RelationshipResolver(
                new CkanModule[] { depender }, null,
                options, registry, null
                );

            // Assert
            CollectionAssert.Contains(rr.ModList(), olderDependency);
            CollectionAssert.DoesNotContain(rr.ModList(), newerDependency);
        }
Example #7
0
        public void ModList_WithInstalledModulesSugested_DoesNotContainThem()
        {
            options.with_all_suggests = true;
            var list     = new List <string>();
            var sugested = generator.GeneratorRandomModule();
            var sugester = generator.GeneratorRandomModule(sugests: new List <RelationshipDescriptor>
            {
                new RelationshipDescriptor {
                    name = sugested.identifier
                }
            });

            list.Add(sugester.identifier);
            AddToRegistry(sugester, sugested);
            registry.Installed().Add(sugested.identifier, sugested.version);

            var relationship_resolver = new RelationshipResolver(list, options, registry, null);

            CollectionAssert.Contains(relationship_resolver.ModList(), sugested);
        }
Example #8
0
        public void ReasonFor_WithSugestedMods_GivesCorrectParent()
        {
            var list     = new List <string>();
            var sugested = generator.GeneratorRandomModule();
            var mod      = generator.GeneratorRandomModule(sugests: new List <RelationshipDescriptor> {
                new RelationshipDescriptor {
                    name = sugested.identifier
                }
            });

            list.Add(mod.identifier);
            AddToRegistry(mod, sugested);

            options.with_all_suggests = true;
            var relationship_resolver = new RelationshipResolver(list, options, registry, null);
            var reason = relationship_resolver.ReasonFor(sugested);

            Assert.That(reason, Is.AssignableTo <Relationship.Suggested>());
            Assert.That(reason.Parent, Is.EqualTo(mod));
        }
Example #9
0
        public void AutodetectedCanSatisfyRelationships()
        {
            using (var ksp = new DisposableKSP())
            {
                registry.RegisterDll(ksp.KSP, Path.Combine(ksp.KSP.GameData(), "ModuleManager.dll"));

                var depends = new List <CKAN.RelationshipDescriptor>();
                depends.Add(new CKAN.RelationshipDescriptor {
                    name = "ModuleManager"
                });

                CkanModule mod = generator.GeneratorRandomModule(depends: depends);

                new RelationshipResolver(
                    new CkanModule[] { mod },
                    RelationshipResolver.DefaultOpts(),
                    registry,
                    new KspVersionCriteria(KspVersion.Parse("1.0.0"))
                    );
            }
        }
Example #10
0
        public void ReasonFor_WithTreeOfMods_GivesCorrectParents()
        {
            var list         = new List <string>();
            var suggested    = generator.GeneratorRandomModule();
            var recommendedA = generator.GeneratorRandomModule();
            var recommendedB = generator.GeneratorRandomModule();
            var mod          = generator.GeneratorRandomModule(
                suggests: new List <RelationshipDescriptor>
            {
                new ModuleRelationshipDescriptor {
                    name = suggested.identifier
                }
            }
                );

            list.Add(mod.identifier);
            suggested.recommends = new List <RelationshipDescriptor>
            {
                new ModuleRelationshipDescriptor {
                    name = recommendedA.identifier
                },
                new ModuleRelationshipDescriptor {
                    name = recommendedB.identifier
                }
            };

            AddToRegistry(mod, suggested, recommendedA, recommendedB);

            options.with_all_suggests = true;
            options.with_recommends   = true;
            var relationship_resolver = new RelationshipResolver(list, null, options, registry, null);
            var reason = relationship_resolver.ReasonFor(recommendedA);

            Assert.That(reason, Is.AssignableTo <SelectionReason.Recommended>());
            Assert.That(reason.Parent, Is.EqualTo(suggested));

            reason = relationship_resolver.ReasonFor(recommendedB);
            Assert.That(reason, Is.AssignableTo <SelectionReason.Recommended>());
            Assert.That(reason.Parent, Is.EqualTo(suggested));
        }
Example #11
0
        public void ReasonFor_WithSugestedMods_GivesCorrectParent()
        {
            var list     = new List <string>();
            var sugested = generator.GeneratorRandomModule();
            var mod      = generator.GeneratorRandomModule(
                depends: new List <ModDependency>
            {
                new ModDependency($"? {sugested.identifier}")
            }
                );

            list.Add(mod.identifier);
            AddToRegistry(mod, sugested);

            options.with_all_suggests = true;
            var modList = list.Select(p => new CfanModuleIdAndVersion(p));
            var relationship_resolver = new RelationshipResolver(modList, options, registry, null);
            var reason = relationship_resolver.ReasonFor(sugested);

            Assert.That(reason, Is.AssignableTo <SelectionReason.Suggested>());
            Assert.That(reason.Parent, Is.EqualTo(mod));
        }
Example #12
0
        public void Constructor_WithDependantVersionMinMax_ChooseCorrectly(string ver, string dep_min, string dep_max, string other)
        {
            var list            = new List <string>();
            var dependant       = generator.GeneratorRandomModule(version: new Version(ver));
            var other_dependant = generator.GeneratorRandomModule(identifier: dependant.identifier, version: new Version(other));

            var depender = generator.GeneratorRandomModule(depends: new List <ModDependency>
            {
                new ModDependency($"{dependant.identifier}>={dep_min}<={dep_max}")
            });

            list.Add(depender.identifier);
            AddToRegistry(depender, dependant, other_dependant);

            var modList = list.Select(p => new CfanModuleIdAndVersion(p));
            var relationship_resolver = new RelationshipResolver(modList, options, registry, null);

            CollectionAssert.AreEquivalent(relationship_resolver.ModList(), new List <CfanModule>
            {
                dependant,
                depender
            });
        }
Example #13
0
        public void Constructor_WithDependantVersionMinMax_ChooseCorrectly(string ver, string dep_min, string dep_max, string other)
        {
            var list            = new List <string>();
            var dependant       = generator.GeneratorRandomModule(version: new ModuleVersion(ver));
            var other_dependant = generator.GeneratorRandomModule(identifier: dependant.identifier, version: new ModuleVersion(other));

            var depender = generator.GeneratorRandomModule(depends: new List <RelationshipDescriptor>
            {
                new ModuleRelationshipDescriptor {
                    name = dependant.identifier, min_version = new ModuleVersion(dep_min), max_version = new ModuleVersion(dep_max)
                }
            });

            list.Add(depender.identifier);
            AddToRegistry(depender, dependant, other_dependant);

            var relationship_resolver = new RelationshipResolver(list, null, options, registry, null);

            CollectionAssert.AreEquivalent(relationship_resolver.ModList(), new List <CkanModule>
            {
                dependant,
                depender
            });
        }
Example #14
0
        public void UninstallingConflictingModule_InstallingRecursiveDependencies_ResolvesSuccessfully()
        {
            using (var ksp = new DisposableKSP())
            {
                // Arrange: create dummy modules that resemble the relationship entanglement, and make them available
                var eve = generator.GeneratorRandomModule(
                    identifier: "EnvironmentalVisualEnhancements",
                    depends: new List <RelationshipDescriptor>
                {
                    new ModuleRelationshipDescriptor {
                        name = "EnvironmentalVisualEnhancements-Config"
                    }
                }
                    );
                var eveDefaultConfig = generator.GeneratorRandomModule(
                    identifier: "EnvironmentalVisualEnhancements-Config-stock",
                    provides: new List <string> {
                    "EnvironmentalVisualEnhancements-Config"
                },
                    conflicts: new List <RelationshipDescriptor>
                {
                    new ModuleRelationshipDescriptor {
                        name = "EnvironmentalVisualEnhancements-Config"
                    }
                }
                    );
                var avp = generator.GeneratorRandomModule(
                    identifier: "AstronomersVisualPack",
                    provides: new List <string> {
                    "EnvironmentalVisualEnhancements-Config"
                },
                    depends: new List <RelationshipDescriptor>
                {
                    new ModuleRelationshipDescriptor {
                        name = "AVP-Textures"
                    },
                    new ModuleRelationshipDescriptor {
                        name = "EnvironmentalVisualEnhancements"
                    }
                },
                    conflicts: new List <RelationshipDescriptor>
                {
                    new ModuleRelationshipDescriptor {
                        name = "EnvironmentalVisualEnhancements-Config"
                    }
                }
                    );
                var avp2kTextures = generator.GeneratorRandomModule(
                    identifier: "AVP-2kTextures",
                    provides: new List <string> {
                    "AVP-Textures"
                },
                    depends: new List <RelationshipDescriptor>
                {
                    new ModuleRelationshipDescriptor {
                        name = "AstronomersVisualPack"
                    }
                },
                    conflicts: new List <RelationshipDescriptor>
                {
                    new ModuleRelationshipDescriptor {
                        name = "AVP-Textures"
                    }
                }
                    );

                AddToRegistry(eve, eveDefaultConfig, avp, avp2kTextures);

                // Start with eve and eveDefaultConfig installed
                registry.RegisterModule(eve, new string[0], ksp.KSP, false);
                registry.RegisterModule(eveDefaultConfig, new string[0], ksp.KSP, false);

                Assert.DoesNotThrow(() => registry.CheckSanity());

                List <CkanModule>    modulesToInstall;
                List <CkanModule>    modulesToRemove;
                RelationshipResolver resolver;

                // Act and assert: play through different possible user interactions
                // Scenario 1 - Try installing AVP, expect an exception for proceed_with_inconsistencies=false

                modulesToInstall = new List <CkanModule> {
                    avp
                };
                modulesToRemove = new List <CkanModule>();

                options.proceed_with_inconsistencies = false;
                Assert.Throws <InconsistentKraken>(() =>
                {
                    resolver = new RelationshipResolver(modulesToInstall, modulesToRemove, options, registry, null);
                });

                // Scenario 2 - Try installing AVP, expect no exception for proceed_with_inconsistencies=true, but a conflict list

                resolver = null;
                options.proceed_with_inconsistencies = true;
                Assert.DoesNotThrow(() =>
                {
                    resolver = new RelationshipResolver(modulesToInstall, modulesToRemove, options, registry, null);
                });
                CollectionAssert.AreEquivalent(new List <CkanModule> {
                    avp, eveDefaultConfig
                }, resolver.ConflictList.Keys);

                // Scenario 3 - Try uninstalling eveDefaultConfig and installing avp, should work and result in no conflicts

                modulesToInstall = new List <CkanModule> {
                    avp
                };
                modulesToRemove = new List <CkanModule> {
                    eveDefaultConfig
                };

                resolver = null;
                options.proceed_with_inconsistencies = false;
                Assert.DoesNotThrow(() =>
                {
                    resolver = new RelationshipResolver(modulesToInstall, modulesToRemove, options, registry, null);
                });
                Assert.IsEmpty(resolver.ConflictList);
                CollectionAssert.AreEquivalent(new List <CkanModule> {
                    avp, avp2kTextures
                }, resolver.ModList());
            }
        }