private static KspObject ReadObjectTree(KspToken token, Action <KspObject, KspToken> addTokenMapping) { KspObject obj; // Treat global tokens as craft object -> needed for .craft file support var type = token.IsGlobalToken() ? KspCraftObject.TypeId : token.Name; switch (type) { case KspCraftObject.TypeId: obj = new KspCraftObject(token.IsGlobalToken()); break; case KspPartObject.TypeId: obj = new KspPartObject(token.IsGlobalToken()); break; default: obj = new KspObject(token.Name, token.IsGlobalToken()); break; } foreach (var t in token.Tokens) { obj.AddChild(ReadObjectTree(t, addTokenMapping)); } addTokenMapping(obj, token); return(obj); }
public void CanRemovePartByIdAndOutputResult() { // given var inputCraft = new KspCraftObject(isGlobalObject: true).AddProperty(new KspStringProperty("name", "test")) .AddChild(new KspObject("NOT_A_PART").AddProperty(new KspStringProperty("name", "fuelTank"))) .AddChild(new KspPartObject().AddProperty(new KspStringProperty("name", "fuelTank"))) .AddChild(new KspPartObject().AddProperty(new KspStringProperty("name", "strut"))) .AddChild(new KspPartObject().AddProperty(new KspStringProperty("name", "fuelTank"))); var expectedCraft = new KspCraftObject(isGlobalObject: true).AddProperty(new KspStringProperty("name", "test")) .AddChild(new KspObject("NOT_A_PART").AddProperty(new KspStringProperty("name", "fuelTank"))) .AddChild(new KspPartObject().AddProperty(new KspStringProperty("name", "strut"))) .AddChild(new KspPartObject().AddProperty(new KspStringProperty("name", "fuelTank"))); var inputText = KspObjToString(inputCraft); var expectedResult = KspObjToString(expectedCraft); // when File.WriteAllText(TestFilePath, inputText); var returnCode = Program.Main("remove-parts", "-p", "0", "-i", TestFilePath, "-s"); // then Assert.That(File.ReadAllText(TestFilePath), Is.EqualTo(expectedResult)); Assert.That(returnCode, Is.EqualTo(0)); }
private List <KspPartObject> FindRemovedAndDependentParts(KspCraftObject craft, RegexFilter filter) { ui.DisplayUserMessage($"Entering craft '{craft.Name}'..."); var partLookup = new PartLookup(craft); var removedParts = partLookup.LookupParts(filter).ToList(); ui.DisplayUserMessage($"Found {removedParts.Count} parts to be removed"); var dependentParts = new HashSet <KspPartObject> (); Parallel.ForEach(removedParts, removedPart => { foreach (var part in partLookup.LookupHardDependencies(removedPart).Except(removedParts)) { lock (dependentParts) { dependentParts.Add(part); } } }); ui.DisplayUserMessage($"Found {dependentParts.Count} dependent parts"); return(removedParts.Concat(dependentParts).ToList()); }
public void CanRetrieveNameOfCraftFromNameProperty() { // given var craft = new KspCraftObject() .AddProperty(new KspStringProperty("name", "someCraft")) as KspCraftObject; // when / then Assert.That(craft.Name, Is.EqualTo("someCraft")); }
public void CanRetrieveNameOfCraftFromShipProperty() { // given var craft = new KspCraftObject() .AddProperty(new KspStringProperty("name", "thisIsIgnoredIfShipPropertyIsFound")) .AddProperty(new KspStringProperty("ship", "someCraft")) as KspCraftObject; // when / then Assert.That(craft.Name, Is.EqualTo("someCraft")); }
private List <KspPartObject> FindParts(KspCraftObject craft, RegexFilter filter) { ui.DisplayUserMessage($"Entering craft '{craft.Name}'..."); var partLookup = new PartLookup(craft); var parts = partLookup.LookupParts(filter).ToList(); ui.DisplayUserMessage($"Found {parts.Count} matching parts"); return(parts); }
public static String PartLinkPropertyToString(KspCraftObject craft, KspPartLinkProperty property) { var sb = new StringBuilder(); sb.Append($"{PartObjectToString (craft, property.Part)}"); sb.Append($"[{property.Name}"); if (property.Prefix != null) { sb.Append($"({property.Prefix})"); } sb.Append("]"); return(sb.ToString()); }
public void PrintsAndReturnsErrorIfPartNameToRemoveIsNotFound() { // given var inputCraft = new KspCraftObject(isGlobalObject: true).AddProperty(new KspStringProperty("name", "test")) .AddChild(new KspObject("NOT_A_PART").AddProperty(new KspStringProperty("name", "notAPart"))) .AddChild(new KspPartObject().AddProperty(new KspStringProperty("name", "somePart"))) .AddChild(new KspPartObject().AddProperty(new KspStringProperty("name", "anotherPart"))); var inputText = KspObjToString(inputCraft); // when File.WriteAllText(TestFilePath, inputText); var returnCode = Program.Main("remove-parts", "-p", "nonExistingPart", "-i", TestFilePath, "-s"); // then Assert.That(StdOutput.ToString(), Is.EqualTo("ERROR: No parts removed\n")); Assert.That(returnCode, Is.LessThan(0)); }
private static KspCraftObject createTestCraft() { var craft = new KspCraftObject() .AddChild(new KspPartObject().AddProperty(new KspStringProperty("name", "part1"))) .AddChild(new KspPartObject().AddProperty(new KspStringProperty("name", "part2"))) .AddChild(new KspPartObject().AddProperty(new KspStringProperty("name", "part3"))) .AddChild(new KspPartObject().AddProperty(new KspStringProperty("name", "part4"))) .AddChild(new KspPartObject().AddProperty(new KspStringProperty("name", "part5"))) .AddChild(new KspPartObject().AddProperty(new KspStringProperty("name", "part6"))) .AddChild(new KspPartObject().AddProperty(new KspStringProperty("name", "part7"))) .AddChild(new KspPartObject().AddProperty(new KspStringProperty("name", "part8"))) .AddChild(new KspPartObject().AddProperty(new KspStringProperty("name", "part9"))) as KspCraftObject; var parts = craft.Children <KspPartObject> ().ToArray(); parts [1] .AddProperty(new KspPartLinkProperty(KspPartLinkProperty.Types.Parent, "", parts [2])); // parent is [2] parts [3] .AddProperty(new KspPartLinkProperty(KspPartLinkProperty.Types.SrfN, "srfAttach", parts [0])) // srfN to [0] .AddProperty(new KspPartLinkProperty(KspPartLinkProperty.Types.SrfN, "srfAttach", parts [1])); // srfN to [1] parts [4] .AddProperty(new KspPartLinkProperty(KspPartLinkProperty.Types.AttN, "top", null)) // attN to nirvana .AddProperty(new KspPartLinkProperty(KspPartLinkProperty.Types.AttN, "bottom", parts [3])); // attN to [3] parts [5] .AddProperty(new KspPartLinkProperty(KspPartLinkProperty.Types.Sym, "bottom", parts [1])); // sym to [1] parts [6] .AddProperty(new KspPartLinkProperty(KspPartLinkProperty.Types.Link, "bottom", parts [0])); // link to [0] parts [7] .AddProperty(new KspPartLinkProperty(KspPartLinkProperty.Types.SrfN, "srfAttach", parts [6])) // srfN to [6] .AddProperty(new KspPartLinkProperty(KspPartLinkProperty.Types.SrfN, "srfAttach", parts [0])); // srfN to [0] parts [8] .AddProperty(new KspPartLinkProperty(KspPartLinkProperty.Types.AttN, "top", parts [0])) // attN to [0] .AddProperty(new KspPartLinkProperty(KspPartLinkProperty.Types.AttN, "bottom", parts [7])) // attN to [7] .AddProperty(new KspPartLinkProperty(KspPartLinkProperty.Types.Link, "bottom", parts [1])); // link to [1] return(craft); }
private bool RemoveMatchingParts(KspCraftObject craft, RegexFilter partFilter) { var toBeRemoved = FindRemovedAndDependentParts(craft, partFilter); if (toBeRemoved.Count <= 0) { return(false); } ui.DisplayUserList("Removed Parts", toBeRemoved.Select(part => ProgramUI.PartObjectToString(craft, part))); var removeConfirmed = ui.AskYesNoQuestion("Remove the listed parts?"); if (removeConfirmed) { craft.Edit().RemoveParts(toBeRemoved); ui.DisplayUserMessage($"{toBeRemoved.Count} parts removed"); } return(removeConfirmed); }
public static CraftEditor Edit(this KspCraftObject obj) => new CraftEditor(obj);
public static String PartObjectToString(KspCraftObject craft, KspPartObject part) => $"[{craft.IdOfChild (part)}]{part.Name}";
private Dictionary <KspPartObject, List <KspPartLinkProperty> > FindPartDependencies(KspCraftObject craft, RegexFilter filter) { ui.DisplayUserMessage($"Entering craft '{craft.Name}'..."); var partLookup = new PartLookup(craft); var dependencies = partLookup.LookupParts(filter).ToList(); var dependentParts = new HashSet <KspPartObject> (); Parallel.ForEach(dependencies, dependency => { foreach (var part in partLookup.LookupSoftDependencies(dependency)) { lock (dependentParts) { dependentParts.Add(part); } } }); ui.DisplayUserMessage($"Found {dependentParts.Count} dependent parts"); return(dependentParts.ToDictionary(part => part, part => FindPartLinks(part, dependencies))); }
public void RemovesPartsAndCorrespondingLinks() { // given var craft = new KspCraftObject() .AddChild(new KspPartObject().AddProperty(new KspStringProperty("name", "part1"))) .AddChild(new KspPartObject().AddProperty(new KspStringProperty("name", "part2"))) .AddChild(new KspPartObject().AddProperty(new KspStringProperty("name", "part3"))) .AddChild(new KspPartObject().AddProperty(new KspStringProperty("name", "part4"))) as KspCraftObject; var parts = craft.Children <KspPartObject> ().ToArray(); parts [0] .AddProperty(new KspPartLinkProperty(KspPartLinkProperty.Types.Link, "", parts [1])) .AddProperty(new KspPartLinkProperty(KspPartLinkProperty.Types.Link, "", parts [2])) .AddProperty(new KspPartLinkProperty(KspPartLinkProperty.Types.Link, "", parts [3])) .AddProperty(new KspPartLinkProperty(KspPartLinkProperty.Types.Parent, "", parts [1])) .AddProperty(new KspPartLinkProperty(KspPartLinkProperty.Types.Parent, "", parts [2])) .AddProperty(new KspPartLinkProperty(KspPartLinkProperty.Types.Parent, "", parts [3])) .AddProperty(new KspPartLinkProperty(KspPartLinkProperty.Types.Sym, "top", parts [1])) .AddProperty(new KspPartLinkProperty(KspPartLinkProperty.Types.Sym, "bottom", parts [2])) .AddProperty(new KspPartLinkProperty(KspPartLinkProperty.Types.Sym, "left", parts [3])) .AddProperty(new KspPartLinkProperty(KspPartLinkProperty.Types.SrfN, "srfAttach", parts [1])) .AddProperty(new KspPartLinkProperty(KspPartLinkProperty.Types.SrfN, "srfAttach", parts [2])) .AddProperty(new KspPartLinkProperty(KspPartLinkProperty.Types.SrfN, "srfAttach", parts [3])) .AddProperty(new KspPartLinkProperty(KspPartLinkProperty.Types.AttN, "left", parts [1])) .AddProperty(new KspPartLinkProperty(KspPartLinkProperty.Types.AttN, "bottom", parts [2])) .AddProperty(new KspPartLinkProperty(KspPartLinkProperty.Types.AttN, "top", parts [3])); parts [3] .AddProperty(new KspPartLinkProperty(KspPartLinkProperty.Types.Link, "", parts [1])) .AddProperty(new KspPartLinkProperty(KspPartLinkProperty.Types.Link, "", parts [2])) .AddProperty(new KspPartLinkProperty(KspPartLinkProperty.Types.Link, "", parts [0])) .AddProperty(new KspPartLinkProperty(KspPartLinkProperty.Types.Parent, "", parts [1])) .AddProperty(new KspPartLinkProperty(KspPartLinkProperty.Types.Parent, "", parts [2])) .AddProperty(new KspPartLinkProperty(KspPartLinkProperty.Types.Parent, "", parts [0])) .AddProperty(new KspPartLinkProperty(KspPartLinkProperty.Types.Sym, "top", parts [1])) .AddProperty(new KspPartLinkProperty(KspPartLinkProperty.Types.Sym, "bottom", parts [2])) .AddProperty(new KspPartLinkProperty(KspPartLinkProperty.Types.Sym, "left", parts [0])) .AddProperty(new KspPartLinkProperty(KspPartLinkProperty.Types.SrfN, "srfAttach", parts [1])) .AddProperty(new KspPartLinkProperty(KspPartLinkProperty.Types.SrfN, "srfAttach", parts [2])) .AddProperty(new KspPartLinkProperty(KspPartLinkProperty.Types.SrfN, "srfAttach", parts [0])) .AddProperty(new KspPartLinkProperty(KspPartLinkProperty.Types.AttN, "left", parts [1])) .AddProperty(new KspPartLinkProperty(KspPartLinkProperty.Types.AttN, "bottom", parts [2])) .AddProperty(new KspPartLinkProperty(KspPartLinkProperty.Types.AttN, "top", parts [0])); var partsToRemove = new[] { parts [1], parts [2] }; var expectedRemainingParts = new[] { parts [0], parts [3] }; var expectedPropertiesPart1 = new KspProperty[] { parts [0].Properties [0], parts [0].Properties [3], parts [0].Properties [6], parts [0].Properties [9], parts [0].Properties [12], parts [0].Properties [15] }; var expectedPropertiesPart2 = new KspProperty[] { parts [3].Properties [0], parts [3].Properties [3], parts [3].Properties [6], parts [3].Properties [9], parts [3].Properties [12], parts [3].Properties [15] }; // when craft.Edit().RemoveParts(partsToRemove); var remainingParts = craft.Children <KspPartObject> ().ToArray(); // then Assert.That(remainingParts, Is.EqualTo(expectedRemainingParts)); Assert.That(remainingParts [0].Properties, Is.EqualTo(expectedPropertiesPart1)); Assert.That(remainingParts [1].Properties, Is.EqualTo(expectedPropertiesPart2)); }
public CraftEditor(KspCraftObject craft) { this.Craft = craft; }
public PartLookup(KspCraftObject craft) { this.craft = craft; }
public static String CraftObjectToString(KspCraftObject craft) => $"{craft.Name}";