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"));
        }
Esempio n. 4
0
        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;
        }
Esempio n. 6
0
        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));
        }
Esempio n. 8
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 ();
        }
Esempio n. 9
0
 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));
        }
Esempio n. 11
0
        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));
        }
Esempio n. 12
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));
        }
Esempio n. 13
0
 public PartLookup (KspCraftObject craft)
 {
     this.craft = craft;
 }
Esempio n. 14
0
 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 ();
 }
Esempio n. 15
0
 public static String PartObjectToString (KspCraftObject craft, KspPartObject part) => $"[{craft.IdOfChild (part)}]{part.Name}";
Esempio n. 16
0
 public static String CraftObjectToString (KspCraftObject craft) => $"{craft.Name}";