コード例 #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 CanUpdatePartReferences ()
        {
            // given
            var obj = new KspObject ("OBJ")
                .AddChild (new KspPartObject ().AddProperty (new KspStringProperty ("name", "part1")))
                .AddChild (new KspPartObject ().AddProperty (new KspStringProperty ("name", "part2")))
                .AddChild (new KspPartObject ().AddProperty (new KspStringProperty ("name", "part3")));

            var parts = obj.Children<KspPartObject> ().ToArray ();

            var part = obj.Children [0]
                .AddProperty (new KspStringProperty ("not-a-link", "not-a-link"))
                .AddProperty (new KspPartLinkProperty (KspPartLinkProperty.Types.Link, "top", parts [0], false))
                .AddProperty (new KspPartLinkProperty (KspPartLinkProperty.Types.Parent, "top", parts [0], false))
                .AddProperty (new KspPartLinkProperty (KspPartLinkProperty.Types.Parent, "top", parts [1], false)) as KspPartObject;

            var newParentLink = new KspPartLinkProperty (KspPartLinkProperty.Types.Parent, "bottom", parts [1], false);

            var expectedProperties = new [] {
                part.Properties [0],
                part.Properties [1],
                part.Properties [2],
                newParentLink
            };

            // when
            part.UpdatePartLinks (KspPartLinkProperty.Types.Parent, new[] { newParentLink });

            // then
            Assert.That (part.Properties, Is.EqualTo (expectedProperties));
        }
コード例 #3
0
 private static void ReadStringProperties (KspObject obj, List<KeyValuePair<String, String>> attributes)
 {
     foreach (var attribute in attributes) {
         if (IsStringAttribute (obj, attribute)) {
             obj.InsertProperty (attributes.IndexOf (attribute), new KspStringProperty (attribute.Key, attribute.Value));
         }
     }
 }
コード例 #4
0
 private static void ReadPartLinkProperties (KspObject obj, List<KeyValuePair<String, String>> attributes)
 {
     foreach (var attribute in attributes) {
         if (IsPartLinkAttribute (obj, attribute)) {
             obj.InsertProperty (attributes.IndexOf (attribute), ReadPartLinkProperty (obj, attribute));
         }
     }
 }
コード例 #5
0
        public static void SaveToFile (String filePath, KspObject kspObjTree)
        {
            var craftToken = KspObjectWriter.WriteObject (kspObjTree);
            var craftString = KspTokenWriter.WriteToken (craftToken, new StringBuilder ()).ToString ();

            using (var textWriter = new StreamWriter (File.Create (filePath), Encoding.UTF8)) {
                textWriter.Write (craftString);
            }
        }
コード例 #6
0
        public static KspToken WriteObject (KspObject obj)
        {
            var attributes = obj.Properties.Select (p => PropertyToAttribute (obj, p)).ToList ();
            var tokens = obj.Children.Select (WriteObject).ToList ();

            return obj.IsGlobalObject
                ? KspTokenGlobalExtension.CreateGlobalToken (attributes, tokens)
                : new KspToken (obj.Type, attributes, tokens);
        }
コード例 #7
0
        private static IEnumerable<KspObject> FlattenObjectTree (KspObject objTree)
        {
            yield return objTree;

            foreach (var child in objTree.Children) {
                foreach (var obj in FlattenObjectTree (child)) {
                    yield return obj;
                }
            }
        }
コード例 #8
0
        public static TChild Child <TChild> (this KspObject obj, int id) where TChild : KspObject
        {
            if (id < 0)
            {
                return(null);
            }

            var children = obj.Children <TChild> ().ToList();

            return((children.Count > id) ? children [id] : null);
        }
コード例 #9
0
 public void CanFindPropertiesOfAnObjectByName ()
 {
     // given
     var obj = new KspObject ("OBJ")
         .AddProperty (new KspStringProperty ("property", "value1"))
         .AddProperty (new KspStringProperty ("anotherProperty", "value2"))
         .AddProperty (new KspStringProperty ("property", "value3"));
     
     // when / then
     Assert.That (obj.Properties<KspProperty> ("property"), Is.EqualTo (new[] {
         obj.Properties [0],
         obj.Properties [2]
     }));
 }
コード例 #10
0
        public void PrintsInfoHeaderIfSilentSwitchIsNotOn ()
        {
            // given
            var inputCrafts = new KspObject ("GAME");
            var inputText = KspObjToString (inputCrafts);

            // when
            File.WriteAllText (TestFilePath, inputText);
            var returnCode = Program.Main ("list-crafts", "-i", TestFilePath);

            // then
            Assert.That (StdOutput.ToString (), Is.StringStarting ("KSPPartRemover v"));
            Assert.That (returnCode, Is.EqualTo (0));
        }
コード例 #11
0
 public void CanFindChildrenOfAnObjectByType ()
 {
     // given
     var obj = new KspObject ("OBJ")
         .AddChild (new KspPartObject () // found
             .AddChild (new KspPartObject ())) // not found
         .AddChild (new KspObject (KspPartObject.TypeId) // not found
             .AddChild (new KspPartObject ())) // not found
         .AddChild (new KspPartObject () // found
             .AddChild (new KspObject (KspPartObject.TypeId))); // not found
     
     // when / then
     Assert.That (obj.Children<KspPartObject> (), Is.EqualTo (new[] { obj.Children [0], obj.Children [2] }));
 }
コード例 #12
0
        private static KeyValuePair<String, String> PropertyToAttribute (KspObject obj, KspProperty property)
        {
            var value = "<KSPPR_NOT_SUPPORTED>";

            var stringProperty = property as KspStringProperty;
            if (stringProperty != null) {
                value = stringProperty.Text;
            }

            var partLinkProperty = property as KspPartLinkProperty;
            if (partLinkProperty != null) {
                value = ResolvePartLinkString (obj, partLinkProperty);
            }

            return new KeyValuePair<String, String> (property.Name, value);
        }
コード例 #13
0
        public void CanAddChildren ()
        {
            // given
            var children = new[] {
                new KspObject ("child1"),
                new KspObject ("child2"),
                new KspObject ("child3")
            };

            // when
            var obj = new KspObject ("OBJ")
                .AddChild (children [0])
                .AddChild (children [1])
                .AddChild (children [2]);

            // when / then
            Assert.That (obj.Children, Is.EqualTo (children));
        }
コード例 #14
0
        public void CanAddProperties ()
        {
            // given
            var properties = new[] {
                new KspStringProperty ("property1", "property1Text"),
                new KspStringProperty ("property2", "property2Text"),
                new KspStringProperty ("property3", "property3Text")
            };

            // when
            var obj = new KspObject ("OBJ")
                .AddProperty (properties [0])
                .AddProperty (properties [1])
                .AddProperty (properties [2]);
            
            // when / then
            Assert.That (obj.Properties, Is.EqualTo (properties));
        }
コード例 #15
0
        private static String ResolvePartLinkString (KspObject obj, KspPartLinkProperty property)
        {
            var craft = obj.Parent as KspCraftObject;

            var sb = new StringBuilder ();

            if (property.Prefix != null) {
                sb.Append (property.Prefix);
                sb.Append (", ");
            }

            if (property.IsIdReference) {
                sb.Append (craft.IdOfChild (property.Part));
            } else {
                sb.Append (property.Part.Name);
            }

            return sb.ToString ();
        }
コード例 #16
0
        public void CanRetrievePartReferences ()
        {
            // given
            var obj = new KspObject ("OBJ")
                .AddChild (new KspPartObject ().AddProperty (new KspStringProperty ("name", "part1")))
                .AddChild (new KspPartObject ().AddProperty (new KspStringProperty ("name", "part2")))
                .AddChild (new KspPartObject ().AddProperty (new KspStringProperty ("name", "part3")));

            var parts = obj.Children<KspPartObject> ().ToArray ();

            var part = obj.Children [0]
                .AddProperty (new KspStringProperty ("not-a-link", "not-a-link"))
                .AddProperty (new KspPartLinkProperty (KspPartLinkProperty.Types.Link, "top", parts [0], false))
                .AddProperty (new KspPartLinkProperty (KspPartLinkProperty.Types.Parent, "top", parts [0], false))
                .AddProperty (new KspPartLinkProperty (KspPartLinkProperty.Types.Parent, "top", parts [1], false)) as KspPartObject;
            
            // when / then
            Assert.That (part.PartLinks (KspPartLinkProperty.Types.Parent), Is.EqualTo (new[] { part.Properties [3], part.Properties [4] }));
        }
コード例 #17
0
        public void CanFindChildById ()
        {
            // given
            var obj = new KspObject ("OBJ")
                .AddChild (new KspCraftObject ())
                .AddChild (new KspPartObject ())
                .AddChild (new KspPartObject ())
                .AddChild (new KspPartObject ())
                .AddChild (new KspCraftObject ());

            // when / then
            Assert.That (obj.Child<KspCraftObject> (-1), Is.Null);
            Assert.That (obj.Child<KspCraftObject> (0), Is.EqualTo (obj.Children [0])); // Ids are per object-type
            Assert.That (obj.Child<KspCraftObject> (1), Is.EqualTo (obj.Children [4]));
            Assert.That (obj.Child<KspCraftObject> (2), Is.Null);

            Assert.That (obj.Child<KspPartObject> (0), Is.EqualTo (obj.Children [1]));
            Assert.That (obj.Child<KspPartObject> (1), Is.EqualTo (obj.Children [2]));
            Assert.That (obj.Child<KspPartObject> (2), Is.EqualTo (obj.Children [3]));
        }
コード例 #18
0
        public static IEnumerable <TChild> Children <TChild> (this KspObject obj, bool recursive = false) where TChild : KspObject
        {
            foreach (var child in obj.Children)
            {
                var match = child as TChild;
                if (match != null)
                {
                    yield return(match);
                }

                if (recursive)
                {
                    var childResults = child.Children <TChild> (recursive);
                    foreach (var childResult in childResults)
                    {
                        yield return(childResult);
                    }
                }
            }
        }
コード例 #19
0
 public KspObject AddChild(KspObject child)
 {
     child.Parent = this;
     ((List <KspObject>)Children).Add(child);
     return(this);
 }
コード例 #20
0
 public CraftLookup (KspObject kspObjTree)
 {
     this.kspObjTree = kspObjTree;
 }
コード例 #21
0
 public KspObject AddChild (KspObject child)
 {
     child.Parent = this;
     ((List<KspObject>)Children).Add (child);
     return this;
 }
コード例 #22
0
 public KspObject RemoveChild (KspObject child)
 {
     ((List<KspObject>)Children).Remove (child);
     return this;
 }
コード例 #23
0
 private String KspObjToString (KspObject obj)
 {
     var token = KspObjectWriter.WriteObject (obj);
     return KspTokenWriter.WriteToken (token, new StringBuilder ()).ToString ();
 }
コード例 #24
0
        public void CanPrintPartDependencies ()
        {
            // given
            var inputCrafts = new KspObject ("GAME")
                .AddChild (new KspCraftObject ().AddProperty (new KspStringProperty ("name", "someCraft"))
                    .AddChild (new KspPartObject ().AddProperty (new KspStringProperty ("name", "fuelTank1")))
                    .AddChild (new KspPartObject ().AddProperty (new KspStringProperty ("name", "strut"))))
                .AddChild (new KspCraftObject ().AddProperty (new KspStringProperty ("name", "anotherCraft"))
                    .AddChild (new KspPartObject ().AddProperty (new KspStringProperty ("name", "strut")))
                    .AddChild (new KspPartObject ().AddProperty (new KspStringProperty ("name", "fuelTank2"))))
                .AddChild (new KspCraftObject ().AddProperty (new KspStringProperty ("name", "ignored"))
                    .AddChild (new KspPartObject ().AddProperty (new KspStringProperty ("name", "somePart"))));

            var craft1 = inputCrafts.Children [0];
            var craft2 = inputCrafts.Children [1];

            craft1.Children [0].AddProperty (new KspPartLinkProperty (KspPartLinkProperty.Types.Link, null, (KspPartObject)craft1.Children [1], true));
            craft1.Children [1].AddProperty (new KspPartLinkProperty (KspPartLinkProperty.Types.Parent, null, (KspPartObject)craft1.Children [0], false));
            craft1.Children [1].AddProperty (new KspPartLinkProperty (KspPartLinkProperty.Types.Sym, "top", (KspPartObject)craft1.Children [0], false));
            craft2.Children [0].AddProperty (new KspPartLinkProperty (KspPartLinkProperty.Types.AttN, "bottom", (KspPartObject)craft2.Children [1], false));

            var inputText = KspObjToString (inputCrafts);

            var expectedResult =
                "someCraft:" + Environment.NewLine +
                "\t[1]strut:" + Environment.NewLine +
                "\t\t[0]fuelTank1[parent]" + Environment.NewLine +
                "\t\t[0]fuelTank1[sym(top)]" + Environment.NewLine +
                "anotherCraft:" + Environment.NewLine +
                "\t[0]strut:" + Environment.NewLine +
                "\t\t[1]fuelTank2[attN(bottom)]" + Environment.NewLine;
            
            // when
            File.WriteAllText (TestFilePath, inputText);
            var returnCode = Program.Main ("list-partdeps", "-p", ".*uelTank.*", "-c", ".*Craft", "-i", TestFilePath);

            // then
            Assert.That (StdOutput.ToString (), Is.StringEnding (expectedResult));
            Assert.That (returnCode, Is.EqualTo (0));
        }
コード例 #25
0
        public void PrintsAndReturnsErrorIfNoCraftWithMatchingCraftNameIsFound ()
        {
            // given
            var inputCrafts = new KspObject ("GAME")
                .AddChild (new KspCraftObject ().AddProperty (new KspStringProperty ("name", "someCraft")))
                .AddChild (new KspCraftObject ().AddProperty (new KspStringProperty ("name", "anotherCraft")));
            
            var inputText = KspObjToString (inputCrafts);

            // when
            File.WriteAllText (TestFilePath, inputText);
            var returnCode = Program.Main ("remove-parts", "-p", "somePart", "--craft", "nonExistingCraft", "-i", TestFilePath, "-s");

            // then
            Assert.That (StdOutput.ToString (), Is.EqualTo ("ERROR: No craft matching 'nonExistingCraft' found, aborting" + Environment.NewLine));
            Assert.That (returnCode, Is.LessThan (0));
        }
コード例 #26
0
        public void CanRemovePartsOfMultipleCraftsAndOutputResult ()
        {
            // given
            var inputCrafts = new KspObject ("GAME")
                .AddChild (new KspCraftObject ().AddProperty (new KspStringProperty ("name", "craft1"))
                    .AddChild (new KspPartObject ().AddProperty (new KspStringProperty ("name", "fuelTank")))
                    .AddChild (new KspPartObject ().AddProperty (new KspStringProperty ("name", "strut")))
                    .AddChild (new KspPartObject ().AddProperty (new KspStringProperty ("name", "fuelTank"))))
                .AddChild (new KspCraftObject ().AddProperty (new KspStringProperty ("name", "craft2"))
                    .AddChild (new KspPartObject ().AddProperty (new KspStringProperty ("name", "fuelTank")))
                    .AddChild (new KspPartObject ().AddProperty (new KspStringProperty ("name", "strut")))
                    .AddChild (new KspPartObject ().AddProperty (new KspStringProperty ("name", "fuelTank"))))
                .AddChild (new KspCraftObject ().AddProperty (new KspStringProperty ("name", "craft3"))
                    .AddChild (new KspPartObject ().AddProperty (new KspStringProperty ("name", "fuelTank")))
                    .AddChild (new KspPartObject ().AddProperty (new KspStringProperty ("name", "strut")))
                    .AddChild (new KspPartObject ().AddProperty (new KspStringProperty ("name", "fuelTank"))))
                .AddChild (new KspCraftObject ().AddProperty (new KspStringProperty ("name", "craft4")));

            var expectedCrafts = new KspObject ("GAME")
                .AddChild (new KspCraftObject ().AddProperty (new KspStringProperty ("name", "craft1"))
                    .AddChild (new KspPartObject ().AddProperty (new KspStringProperty ("name", "strut"))))
                .AddChild (new KspCraftObject ().AddProperty (new KspStringProperty ("name", "craft2"))
                    .AddChild (new KspPartObject ().AddProperty (new KspStringProperty ("name", "fuelTank")))
                    .AddChild (new KspPartObject ().AddProperty (new KspStringProperty ("name", "strut")))
                    .AddChild (new KspPartObject ().AddProperty (new KspStringProperty ("name", "fuelTank"))))
                .AddChild (new KspCraftObject ().AddProperty (new KspStringProperty ("name", "craft3"))
                    .AddChild (new KspPartObject ().AddProperty (new KspStringProperty ("name", "strut"))))
                .AddChild (new KspCraftObject ().AddProperty (new KspStringProperty ("name", "craft4")));
            
            var inputText = KspObjToString (inputCrafts);
            var expectedResult = KspObjToString (expectedCrafts);

            // when
            File.WriteAllText (TestFilePath, inputText);
            var returnCode = Program.Main ("remove-parts", "-p", "fuelTank", "-c", "!craft2", "-i", TestFilePath, "-o", TestFilePath, "-s");

            // then
            Assert.That (File.ReadAllText (TestFilePath), Is.EqualTo (expectedResult));
            Assert.That (returnCode, Is.EqualTo (0));
        }
コード例 #27
0
        public void CanPrintPartList ()
        {
            // given
            var inputCrafts = new KspObject ("GAME")
                .AddChild (new KspCraftObject ().AddProperty (new KspStringProperty ("name", "someCraft"))
                    .AddChild (new KspPartObject ().AddProperty (new KspStringProperty ("name", "fuelTank")))
                    .AddChild (new KspPartObject ().AddProperty (new KspStringProperty ("name", "strut"))))
                .AddChild (new KspCraftObject ().AddProperty (new KspStringProperty ("name", "anotherCraft"))
                    .AddChild (new KspPartObject ().AddProperty (new KspStringProperty ("name", "strut")))
                    .AddChild (new KspPartObject ().AddProperty (new KspStringProperty ("name", "fuelTank")))
                    .AddChild (new KspPartObject ().AddProperty (new KspStringProperty ("name", "ignored"))))
                .AddChild (new KspCraftObject ().AddProperty (new KspStringProperty ("name", "ignored"))
                    .AddChild (new KspPartObject ().AddProperty (new KspStringProperty ("name", "somePart"))));
            
            var inputText = KspObjToString (inputCrafts);

            var expectedResult =
                "someCraft:" + Environment.NewLine +
                "\t[0]fuelTank" + Environment.NewLine +
                "\t[1]strut" + Environment.NewLine +
                "anotherCraft:" + Environment.NewLine +
                "\t[0]strut" + Environment.NewLine +
                "\t[1]fuelTank" + Environment.NewLine;

            // when
            File.WriteAllText (TestFilePath, inputText);
            var returnCode = Program.Main ("list-parts", "-p", "[s,f].*", "-c", ".*Craft", "-i", TestFilePath);

            // then
            Assert.That (StdOutput.ToString (), Is.StringEnding (expectedResult));
            Assert.That (returnCode, Is.EqualTo (0));
        }
コード例 #28
0
        public void CanRetrieveIdOfChild ()
        {
            // given
            var obj = new KspObject ("OBJ")
                .AddChild (new KspCraftObject ())
                .AddChild (new KspPartObject ())
                .AddChild (new KspPartObject ())
                .AddChild (new KspPartObject ())
                .AddChild (new KspCraftObject ());

            // when / then
            Assert.That (obj.IdOfChild (obj.Children [0] as KspCraftObject), Is.EqualTo (0)); // Ids are per object-type
            Assert.That (obj.IdOfChild (obj.Children [4] as KspCraftObject), Is.EqualTo (1));

            Assert.That (obj.IdOfChild (obj.Children [1] as KspPartObject), Is.EqualTo (0));
            Assert.That (obj.IdOfChild (obj.Children [2] as KspPartObject), Is.EqualTo (1));
            Assert.That (obj.IdOfChild (obj.Children [3] as KspPartObject), Is.EqualTo (2));
        }
コード例 #29
0
        private static KspPartLinkProperty ReadPartLinkProperty (KspObject obj, KeyValuePair<String, String> attribute)
        {
            var prefixValue = attribute.Value.Split (',').Select (s => s.Trim ()).ToArray ();
            var prefix = (prefixValue.Length == 2) ? prefixValue [0] : null;
            var reference = (prefixValue.Length == 2) ? prefixValue [1] : attribute.Value;

            int id;
            var isIdReference = int.TryParse (reference, out id);

            var part = isIdReference
                ? obj.Parent.Child<KspPartObject> (id)
                : obj.Parent.Children<KspPartObject> ().FirstOrDefault (p => p.Name.Equals (reference));
            
            return new KspPartLinkProperty (attribute.Key, prefix, part, isIdReference);
        }
コード例 #30
0
 public static IEnumerable <TProp> Properties <TProp> (this KspObject obj, String name) where TProp : KspProperty =>
 obj.Properties.Where(property => property.Name.Equals(name)).OfType <TProp> ();
コード例 #31
0
        public static int IdOfChild <TChild> (this KspObject obj, TChild child) where TChild : KspObject
        {
            var children = obj.Children <TChild> ().ToList();

            return(children.IndexOf(child));
        }
コード例 #32
0
 private static bool IsStringAttribute (KspObject obj, KeyValuePair<String, String> attribute) => !IsPartLinkAttribute (obj, attribute);
コード例 #33
0
 public KspObject RemoveChild(KspObject child)
 {
     ((List <KspObject>)Children).Remove(child);
     return(this);
 }
コード例 #34
0
        private static bool IsPartLinkAttribute (KspObject obj, KeyValuePair<String, String> attribute)
        {
            if (!(obj.Parent is KspCraftObject)) {
                return false;
            }

            return
            attribute.Key.Equals (KspPartLinkProperty.Types.Link) ||
            attribute.Key.Equals (KspPartLinkProperty.Types.Parent) ||
            attribute.Key.Equals (KspPartLinkProperty.Types.Sym) ||
            attribute.Key.Equals (KspPartLinkProperty.Types.SrfN) ||
            attribute.Key.Equals (KspPartLinkProperty.Types.AttN);
        }