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 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; }
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; }
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)); }
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 CraftEditor (KspCraftObject craft) { this.Craft = craft; }
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 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)); }
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)); }
public PartLookup (KspCraftObject craft) { this.craft = craft; }
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 static String PartObjectToString (KspCraftObject craft, KspPartObject part) => $"[{craft.IdOfChild (part)}]{part.Name}";
public static String CraftObjectToString (KspCraftObject craft) => $"{craft.Name}";