public void FindPath()
        {
            var obj = new TestTraversableObject {
                ["A"] = 1,
                ["B"] = ImmutableArray.Create(new TestTraversableObject {
                    ["C"] = "lol",
                    ["D"] = 1
                }),
                ["X"] = 2
            };

            Assert.Equal(
                new [] { "X" },
                TraversableObject.FindObjects(obj, (int a) => a == 2).Select(x => string.Join(".", x))
                );
            Assert.Equal(
                new [] { "A", "B.0.D" },
                TraversableObject.FindObjects(obj, (int a) => a == 1).Select(x => string.Join(".", x))
                );
            Assert.Equal(
                new [] { "B.0.C" },
                TraversableObject.FindObjects(obj, (string a) => a == "lol").Select(x => string.Join(".", x))
                );
            Assert.Equal(
                new [] { "A", "B", "X" },
                TraversableObject.FindObjects(obj, (object a) => true).Select(x => string.Join(".", x))
                );
            Assert.Equal(
                new [] { "A", "B", "B.0", "B.0.C", "B.0.D", "X" },
                TraversableObject.FindObjects(obj, (object a) => true, true).Select(x => string.Join(".", x))
                );
        }
        public void GetArrayProperty()
        {
            var list = ImmutableArray.Create(1, 2, 3);
            var obj  = new TestTraversableObject {
                ["A"] = 1,
                ["B"] = list
            };

            Assert.Equal(1, TraversableObject.GetValue(obj, "A"));
            Assert.Equal(2, TraversableObject.GetValue(TraversableObject.GetValue(obj, "B"), "1"));

            Assert.ThrowsAny <Exception>(() => TraversableObject.GetValue(list, "3"));
        }
        public void GetObjectProperty()
        {
            var obj = new TestTraversableObject {
                ["A"] = 1,
                ["B"] = new TestTraversableObject {
                    ["C"] = "lol"
                }
            };

            Assert.Equal(1, TraversableObject.GetValue(obj, "A"));
            Assert.Equal("lol", TraversableObject.GetValue(TraversableObject.GetValue(obj, "B"), "C"));

            var exception = Assert.ThrowsAny <Exception>(() => TraversableObject.GetValue(obj, "no-property"));

            Assert.Contains("no-property", exception.Message);
        }