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()); }
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>()); }
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)); }
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())); }
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); }
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); }
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); }
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)); }
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")) ); } }
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)); }
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)); }
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 }); }
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 }); }
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()); } }