Пример #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}";