public void TestClassAttributeSort()
        {
            var builder     = new TypeMetadataBuilder <object>();
            var attrBuilder = builder.NewAttribute();

            IAttributeMetadata <object>[] expected = new IAttributeMetadata <object>[]
            {
                attrBuilder.SetVersion(0).SetIndex(0).SetName("c").Build(),
                attrBuilder.SetVersion(0).SetIndex(1).SetName("a").Build(),
                attrBuilder.SetVersion(0).SetIndex(2).SetName("b").Build(),
                attrBuilder.SetVersion(1).SetIndex(3).SetName("e").Build(),
                attrBuilder.SetVersion(1).SetIndex(-1).SetName("d").Build(),
                attrBuilder.SetVersion(1).SetIndex(-1).SetName("f").Build()
            };

            builder.AddAttribute(expected[3]);
            builder.AddAttribute(expected[1]);
            builder.AddAttribute(expected[5]);
            builder.AddAttribute(expected[0]);
            builder.AddAttribute(expected[4]);
            builder.AddAttribute(expected[2]);

            TypeMetadata <object> cmd = builder.Build();

            Assert.AreEqual(0, cmd.GetAttribute("c").Index);
            Assert.AreEqual(1, cmd.GetAttribute("a").Index);
            Assert.AreEqual(2, cmd.GetAttribute("b").Index);
            Assert.AreEqual(3, cmd.GetAttribute("e").Index);
            Assert.AreEqual(4, cmd.GetAttribute("d").Index);
            Assert.AreEqual(5, cmd.GetAttribute("f").Index);
        }
        public void TestImplyIndicies()
        {
            TypeMetadataBuilder <PoffedImpliedIndicies>             builder = new TypeMetadataBuilder <PoffedImpliedIndicies>();
            IVisitor <TypeMetadataBuilder <PoffedImpliedIndicies> > visitor = new AnnotationVisitor <TypeMetadataBuilder <PoffedImpliedIndicies>, PoffedImpliedIndicies>(true);

            builder.SetTypeId(1002);
            builder.Accept(visitor, typeof(PoffedImpliedIndicies));

            ITypeMetadata <PoffedImpliedIndicies> tmd = builder.Build();

            Assert.AreEqual(1002, tmd.Key.TypeId);
            Assert.AreEqual(2, tmd.GetAttribute("lastName").Index);
            Assert.AreEqual(1, tmd.GetAttribute("firstName").Index);
            Assert.AreEqual(0, tmd.GetAttribute("age").Index);
        }
        public void TestVisit()
        {
            TypeMetadataBuilder <Poffed>             builder = new TypeMetadataBuilder <Poffed>();
            IVisitor <TypeMetadataBuilder <Poffed> > visitor = new AnnotationVisitor <TypeMetadataBuilder <Poffed>, Poffed>();

            builder.SetTypeId(1001);
            builder.Accept(visitor, typeof(Poffed));

            ITypeMetadata <Poffed> tmd = builder.Build();

            Assert.AreEqual(1001, tmd.Key.TypeId);
            Assert.AreEqual(0, tmd.GetAttribute("lastName").Index);
            Assert.AreEqual(1, tmd.GetAttribute("age").Index);
            Assert.AreEqual(2, tmd.GetAttribute("firstName").Index);
        }
        public void TestAccessorAnnotations()
        {
            TypeMetadataBuilder <PoffedMethodInspection>             builder = new TypeMetadataBuilder <PoffedMethodInspection>();
            IVisitor <TypeMetadataBuilder <PoffedMethodInspection> > visitor = new AnnotationVisitor <TypeMetadataBuilder <PoffedMethodInspection>, PoffedMethodInspection>(true);

            builder.SetTypeId(1005);
            builder.Accept(visitor, typeof(PoffedMethodInspection));

            ITypeMetadata <PoffedMethodInspection> tmd = builder.Build();

            Assert.AreEqual(1005, tmd.Key.TypeId);
            Assert.AreEqual(0, tmd.GetAttribute("adult").Index);
            Assert.AreEqual(1, tmd.GetAttribute("age").Index);
            Assert.AreEqual(2, tmd.GetAttribute("firstName").Index);
            Assert.AreEqual(3, tmd.GetAttribute("lastName").Index);
        }
        public void TestCustomCodec()
        {
            TypeMetadataBuilder <PoffedCustomCodec>             builder = new TypeMetadataBuilder <PoffedCustomCodec>();
            IVisitor <TypeMetadataBuilder <PoffedCustomCodec> > visitor = new AnnotationVisitor <TypeMetadataBuilder <PoffedCustomCodec>, PoffedCustomCodec>(true);

            builder.SetTypeId(1004);
            builder.Accept(visitor, typeof(PoffedCustomCodec));

            ITypeMetadata <PoffedCustomCodec> tmd = builder.Build();

            Assert.AreEqual(1004, tmd.Key.TypeId);
            Assert.AreEqual(0, tmd.GetAttribute("age").Index);
            Assert.AreEqual(1, tmd.GetAttribute("aliases").Index);
            Assert.AreEqual(2, tmd.GetAttribute("firstName").Index);
            Assert.AreEqual(3, tmd.GetAttribute("lastName").Index);
            Assert.IsInstanceOf(typeof(LinkedListCodec <string>), tmd.GetAttribute("aliases").Codec);
        }
        public void Builder()
        {
            var builder = new TypeMetadataBuilder <object>();
            ITypeMetadata <object> tmd = builder.SetType(typeof(object))
                                         .SetHash("TestDomain".GetHashCode())
                                         .SetTypeId(1234)
                                         .AddAttribute(builder.NewAttribute()
                                                       .SetIndex(0)
                                                       .SetName("normal")
                                                       .SetVersion(0).Build()).Build();

            Assert.AreEqual(1234, tmd.Key.TypeId);
            Assert.IsTrue(tmd.Key.Hash != 0);
            Assert.IsNotNull(tmd.GetAttribute("normal"));
            Assert.AreEqual("normal", tmd.GetAttribute("normal").Name);
            Assert.AreEqual(0, tmd.GetAttribute("normal").Index);
            Assert.AreEqual(0, tmd.GetAttribute("normal").VersionId);
        }
        public void TestClassMetadata()
        {
            MethodInfo method = typeof(ClassMetadataDescribable).GetMethod("GetName");

            var builder = new TypeMetadataBuilder <ClassMetadataDescribable>();
            ITypeMetadata <ClassMetadataDescribable> tmd = builder.SetType(typeof(ClassMetadataDescribable))
                                                           .SetHash("TestDomain".GetHashCode())
                                                           .SetTypeId(1234)
                                                           .AddAttribute(builder.NewAttribute()
                                                                         .SetIndex(0)
                                                                         .SetName("name")
                                                                         .SetCodec(Codecs.DEFAULT_CODEC)
                                                                         .SetInvocationStrategy(new InvocationStrategies.MethodInvocationStrategy <ClassMetadataDescribable>(method))
                                                                         .SetVersion(0).Build()).Build();

            ITypeMetadata <ClassMetadataDescribable> tmd2 = builder.SetType(typeof(ClassMetadataDescribable))
                                                            .SetHash("TestDomain".GetHashCode())
                                                            .SetTypeId(1234)
                                                            .AddAttribute(builder.NewAttribute()
                                                                          .SetIndex(0)
                                                                          .SetName("name")
                                                                          .SetCodec(Codecs.DEFAULT_CODEC)
                                                                          .SetInvocationStrategy(new InvocationStrategies.MethodInvocationStrategy <ClassMetadataDescribable>(method))
                                                                          .SetVersion(0).Build()).Build();

            Assert.AreEqual(1234, tmd.Key.TypeId);
            Assert.IsTrue(tmd.Key.Hash != 0);
            Assert.IsNotNull(tmd.GetAttribute("name"));
            Assert.AreEqual("name", tmd.GetAttribute("name").Name);
            Assert.AreEqual(0, tmd.GetAttribute("name").Index);
            Assert.AreEqual(0, tmd.GetAttribute("name").VersionId);
            Assert.AreEqual(tmd, tmd2);
            Assert.AreEqual(tmd.GetHashCode(), tmd2.GetHashCode());

            ClassMetadataDescribable cmdd = new ClassMetadataDescribable("augusta");

            Assert.AreEqual("augusta", tmd.GetAttribute("name").Get(cmdd));
            tmd.GetAttribute("name").Set(cmdd, "ada");
            Assert.AreEqual("ada", tmd.GetAttribute("name").Get(cmdd));
            Assert.IsInstanceOf(typeof(Codecs.DefaultCodec), tmd.GetAttribute("name").Codec);
            Assert.IsTrue(tmd.GetAttributes().MoveNext());
            Assert.IsInstanceOf(typeof(ClassMetadataDescribable), tmd.NewInstance());
        }