public void Builder()
        {
            NestedCollections n;

            NestedCollectionsBuilder b = new NestedCollectionsBuilder();

            b.mixed = new List <Dictionary <string, List <SimpleRecord> > >()
            {
                new Dictionary <string, List <SimpleRecord> >()
                {
                    { "one",
                      new List <SimpleRecord>()
                      {
                          new SimpleRecord(new Dictionary <string, object>()
                            {
                                { "stringField", "0, one, 0" }
                            }),
                          new SimpleRecord(new Dictionary <string, object>()
                            {
                                { "stringField", "0, one, 1" }
                            })
                      } },
                    { "extra",
                      new List <SimpleRecord>()
                      {
                          new SimpleRecord(new Dictionary <string, object>()
                            {
                                { "stringField", "0, extra, 0" }
                            })
                      } }
                }
            };

            n = b.Build();

            Assert.IsFalse(n.hasCollectionWithDefault);
            Assert.IsFalse(n.hasNestedArray);
            Assert.IsFalse(n.hasNestedMap);
            Assert.IsTrue(n.hasMixed);
            Assert.AreEqual("0, one, 0", n.mixed[0]["one"][0].stringField);
            Assert.AreEqual("0, one, 1", n.mixed[0]["one"][1].stringField);
            Assert.AreEqual("0, extra, 0", n.mixed[0]["extra"][0].stringField);
        }
        public void FullCycle()
        {
            NestedCollections n;

            NestedCollectionsBuilder b = new NestedCollectionsBuilder();

            b.mixed = new List <Dictionary <string, List <SimpleRecord> > >()
            {
                new Dictionary <string, List <SimpleRecord> >()
                {
                    { "one",
                      new List <SimpleRecord>()
                      {
                          new SimpleRecord(new Dictionary <string, object>()
                            {
                                { "stringField", "0, one, 0" }
                            }),
                          new SimpleRecord(new Dictionary <string, object>()
                            {
                                { "stringField", "0, one, 1" }
                            })
                      } },
                    { "extra",
                      new List <SimpleRecord>()
                      {
                          new SimpleRecord(new Dictionary <string, object>()
                            {
                                { "stringField", "0, extra, 0" }
                            })
                      } }
                }
            };
            b.nestedMap = new Dictionary <string, Dictionary <string, SimpleRecordProjection> >()
            {
                { "one",
                  new Dictionary <string, SimpleRecordProjection>()
                  {
                      { "two",
                            new SimpleRecordProjection(new Dictionary <string, object>()
                            {
                                { "stringField", "one, two" }
                            }) },
                      { "extra",
                            new SimpleRecordProjection(new Dictionary <string, object>()
                            {
                                { "stringField", "one, extra" }
                            }) }
                  } }
            };

            n = b.Build();

            NestedCollections reclaimed = new NestedCollections(n.Data());

            Assert.AreNotSame(n, reclaimed);
            Assert.IsFalse(n.hasCollectionWithDefault || reclaimed.hasCollectionWithDefault);
            Assert.IsFalse(n.hasNestedArray || reclaimed.hasNestedArray);
            Assert.IsTrue(n.hasNestedMap && reclaimed.hasNestedMap);
            Assert.IsTrue(n.hasMixed && reclaimed.hasMixed);
            Assert.AreEqual(n.nestedMap["one"]["two"].stringField, reclaimed.nestedMap["one"]["two"].stringField);
            Assert.AreEqual(n.nestedMap["one"]["extra"].stringField, reclaimed.nestedMap["one"]["extra"].stringField);
            Assert.AreEqual(n.mixed[0]["one"][0].stringField, reclaimed.mixed[0]["one"][0].stringField);
            Assert.AreEqual(n.mixed[0]["one"][1].stringField, reclaimed.mixed[0]["one"][1].stringField);
            Assert.AreEqual(n.mixed[0]["extra"][0].stringField, reclaimed.mixed[0]["extra"][0].stringField);
        }