Esempio n. 1
0
        public void Test1()
        {
            typeof(Foo).Config().DefaultEngine().OptOutNonPublic.NotSlots(mi => mi.Name == "Calc");
            typeof(IBar).GetProperty("Qux").Config().AfterDeserialize((Qux qux) => { qux.Value *= 10; return qux; });
            typeof(IBar).GetProperty("Qux").Config().BeforeSerialize((Qux qux) => { qux.Value /= 10; return qux; });
            Properties.Rule(pi => pi.DeclaringType == typeof(Foo)).AfterDeserialize((pi, o) => Log.WriteLine("AfterDeserialize Foo::{0}", pi.Name).Ignore());
            typeof(Foo).GetProperty("Ok").Config().Engine((pi, j) => { Log.WriteLine("Deserializing Foo::Ok"); return new DefaultEngine().Deserialize(pi.PropertyType, j); },
                (pi, o) => { Log.WriteLine("Serializing Foo::Ok"); return new DefaultEngine().Serialize(pi.PropertyType, o); });
            typeof(Foo).GetProperty("Ok").Config().AddValidator(_ => Log.WriteLine("Validating Foo::Ok"));
            typeof(Foo).Config().AddValidator(_ => Log.WriteLine("Validating Foo"));
            typeof(Foo).Config().AfterDeserialize(o => Log.WriteLine("AfterDeserialize Foo").Ignore());

            var s_json = InputText();
            var json = Json.Parse(s_json);
            Assert.AreEqual(new Json(false), json[0].ok);
            Assert.AreEqual(false, (bool)json[0].ok);
            Assert.AreEqual(new Json("e/*i,[{]}',[{]}\\,[{]}\",[{]}n//*/"), json[0].bars.ein[0].baz);
            Assert.AreEqual(2, (int)json[0].bars.ein[1].qux);
            Assert.AreEqual(new Json(new {}), json[0].foos[1].bars);
            Assert.AreEqual(new Json(null), json[0].bars.drei);
            Assert.AreEqual(null, (IList<IBar>)json[0].bars.drei);
            // todo. find out why this doesn't work
//            Assert.IsTrue(Seq.Equal(new []{0, 1}, json.Keys));
            Assert.IsTrue(Seq.Equal(new []{0, 1}, ((IEnumerable<Object>)json.Keys).Cast<int>()));
            Assert.IsTrue(Seq.Equal(new []{"ok", "bars", "foos"}, json[0].Keys));

            var anon = new Object[]
            {
                new
                {
                    ok = false, 
                    bars = new
                    {
                        ein = new []
                        {
                            new { qux = 1, baz = "e/*i,[{]}',[{]}\\,[{]}\",[{]}n//*/" },
                            new { qux = 2, baz = "" }
                        },
                        zwei = new []
                        {
                            new { qux = 1 },
                        },
                        drei = (Object)null
                    },
                    foos = new Object[]
                    {
                        new { ok = true },
                        new { ok = false, bars = new { } },
                    }
                },
                new
                {
                    ok = true
                }
            };
            Assert.AreEqual(anon.ToJson(), json);
            Assert.AreEqual(anon.ToJson(), ((Json)json).ToJson());
            Assert.AreEqual(anon.ToJson().ToCompactString(), json.ToCompactString());
            Assert.AreEqual(anon.ToJson().ToPrettyString(), json.ToPrettyString());

            var foos = (List<Foo>)json;
            Assert.AreEqual(2, foos.Count);
            var foo0 = foos[0];
                Assert.AreEqual(false, foo0.Ok);
                var foo0_bars = foo0.Bars;
                    var bar0 = foo0_bars.AsEnumerable().Nth(0);
                        Assert.AreEqual("ein", bar0.Key);
                        var bar0_value = bar0.Value;
                        Assert.AreEqual(2, bar0_value.Count);
                        var bar0_value0 = bar0_value[0];
                            Assert.AreEqual(new Qux(10), bar0_value0.Qux); // property adapter!
                            Assert.AreEqual("e/*i,[{]}',[{]}\\,[{]}\",[{]}n//*/", bar0_value0.Baz);
                        var bar0_value1 = bar0_value[1];
                            Assert.AreEqual(new Qux(20), bar0_value1.Qux); // property adapter!
                            Assert.AreEqual("", bar0_value1.Baz);
                    var bar1 = foo0_bars.AsEnumerable().Nth(1);
                        Assert.AreEqual("zwei", bar1.Key);
                        var bar1_value = bar1.Value;
                        Assert.AreEqual(1, bar1_value.Count);
                        var bar1_value0 = bar1_value[0];
                            Assert.AreEqual(new Qux(10), bar1_value0.Qux); // property adapter!
                            Assert.AreEqual("null", bar1_value0.Baz); // type adapter!
                    var bar2 = foo0_bars.AsEnumerable().Nth(2);
                        Assert.AreEqual("drei", bar2.Key);
                        Assert.AreEqual(null, bar2.Value);
                var foo0_foos = foo0.Foos;
                Assert.AreEqual(2, foo0_foos.Count);
                var foo0_foo0 = foo0_foos[0];
                    Assert.AreEqual(true, foo0_foo0.Ok);
                    Assert.AreEqual(null, foo0_foo0.Bars);
                    Assert.AreEqual(null, foo0_foo0.Foos);
                var foo0_foo1 = foo0_foos[1];
                    Assert.AreEqual(false, foo0_foo1.Ok);
                    Assert.AreEqual(0, foo0_foo1.Bars.Count);
                    Assert.AreEqual(null, foo0_foo1.Foos);
            var foo1 = foos[1];
                Assert.AreEqual(true, foo1.Ok);
                Assert.AreEqual(null, foo1.Bars);
                Assert.AreEqual(null, foo1.Foos);

            Log.WriteLine(Environment.NewLine + "FINAL RESULT:");
            Log.WriteLine(foos.ToJson().ToPrettyString());
            VerifyResult(Out.ToString());
        }