예제 #1
0
        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);
        }
예제 #2
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));
        }
예제 #3
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());
        }
예제 #4
0
        public void CanRetrieveNameOfCraftFromNameProperty()
        {
            // given
            var craft = new KspCraftObject()
                        .AddProperty(new KspStringProperty("name", "someCraft")) as KspCraftObject;

            // when / then
            Assert.That(craft.Name, Is.EqualTo("someCraft"));
        }
예제 #5
0
        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"));
        }
예제 #6
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);
        }
예제 #7
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());
        }
예제 #8
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));
        }
예제 #9
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);
        }
예제 #10
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);
        }
예제 #11
0
 public static CraftEditor Edit(this KspCraftObject obj) => new CraftEditor(obj);
예제 #12
0
 public static String PartObjectToString(KspCraftObject craft, KspPartObject part) => $"[{craft.IdOfChild (part)}]{part.Name}";
예제 #13
0
        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)));
        }
예제 #14
0
        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));
        }
예제 #15
0
 public CraftEditor(KspCraftObject craft)
 {
     this.Craft = craft;
 }
예제 #16
0
 public PartLookup(KspCraftObject craft)
 {
     this.craft = craft;
 }
예제 #17
0
 public static String CraftObjectToString(KspCraftObject craft) => $"{craft.Name}";