public void CreateDelegate_AttributeForDynamicObject_MatchesExpected()
        {
            var entityDefinition = new DataAnnotationsDefinitionProvider().Resolve <OverriddenColumnNameRow>();
            var databaseContext  = new Mock <IDatabaseContext>();

            databaseContext.Setup(context => context.GetValueMapper(It.IsAny <Type>(), It.IsAny <Type>())).Returns((IValueMapper)null);
            var expected = new OverriddenColumnNameRow
            {
                OverriddenColumnNameId = 12,
                Description            = "my desc",
                EntryTime      = DateTimeOffset.Now,
                Name           = "name",
                RelatedRowId   = 234,
                RelatedRowName = "relatedName"
            };

            using (var dataReader = expected.MockDataReader(entityDefinition.DirectAttributes).Object)
            {
                dataReader.Read();
                var dataRequest = new PocoDataRequest(dataReader, entityDefinition, databaseContext.Object);
                var func        = FlatPocoFactory.CreateDelegate <dynamic>(dataRequest).MappingDelegate as Func <IDataReader, dynamic>;
                Assert.IsNotNull(func);

                var actual = func(dataReader);

                foreach (var definition in entityDefinition.DirectAttributes)
                {
                    Assert.AreEqual(definition.GetValueDelegate.DynamicInvoke(expected), ((IDictionary <string, object>)actual)[definition.ReferenceName]);
                }
            }
        }
        public void CreateDelegate_RaisedPocoFactoryForFlatComplexRow_DelegateSetsPocoAsExpected()
        {
            var definitionProvider = new DataAnnotationsDefinitionProvider();
            var entityDefinition   = definitionProvider.Resolve <ComplexFlatRow>();
            var databaseContext    = new Mock <IDatabaseContext>();

            databaseContext.Setup(context => context.GetValueMapper(It.IsAny <Type>(), It.IsAny <Type>())).Returns((IValueMapper)null);

            using (var target = new RaisedPocoFactory(definitionProvider))
            {
                var            stopwatch = new Stopwatch();
                var            expected  = Generate.CreateFakeComplexRow();
                ComplexFlatRow actual;

                using (var reader = expected.MockDataReader(entityDefinition.ReturnableAttributes).Object)
                {
                    reader.Read();
                    var pocoDataRequest = new PocoDataRequest(reader, entityDefinition, databaseContext.Object);

                    stopwatch.Start();
                    actual = target.CreatePoco <ComplexFlatRow>(pocoDataRequest);
                }

                Trace.TraceInformation($"{stopwatch.Elapsed} Invoke delegate #1");
                stopwatch.Reset();

                Assert.IsNotNull(actual);
                Assert.AreEqual(expected.FakeComplexEntityId, actual.FakeComplexEntityId);
                Assert.AreEqual(expected, actual, string.Join(Environment.NewLine, expected.GetDifferences(actual)));

                using (var reader = expected.MockDataReader(entityDefinition.ReturnableAttributes).Object)
                {
                    reader.Read();
                    var pocoDataRequest = new PocoDataRequest(reader, entityDefinition, databaseContext.Object);

                    stopwatch.Start();
                    target.CreatePoco <ComplexFlatRow>(pocoDataRequest);
                }

                Trace.TraceInformation($"{stopwatch.Elapsed} Invoke delegate #2");
                stopwatch.Reset();

                using (var reader = expected.MockDataReader(entityDefinition.ReturnableAttributes).Object)
                {
                    reader.Read();
                    var pocoDataRequest = new PocoDataRequest(reader, entityDefinition, databaseContext.Object);

                    stopwatch.Start();
                    target.CreatePoco <ComplexFlatRow>(pocoDataRequest);
                }

                Trace.TraceInformation($"{stopwatch.Elapsed} Invoke delegate #3");
                stopwatch.Reset();
            }
        }
        public void CreateDelegate_FlatPocoFactoryForComplexRow_IsNotNull()
        {
            var fakeComplexRow   = Generate.CreateFakeComplexRow();
            var entityDefinition = new DataAnnotationsDefinitionProvider().Resolve <ComplexFlatRow>();
            var databaseContext  = new Mock <IDatabaseContext>();

            databaseContext.Setup(context => context.GetValueMapper(It.IsAny <Type>(), It.IsAny <Type>())).Returns((IValueMapper)null);

            PocoDelegateInfo actual;

            using (var reader = fakeComplexRow.MockDataReader(entityDefinition.ReturnableAttributes).Object)
            {
                reader.Read();
                var pocoDataRequest = new PocoDataRequest(reader, entityDefinition, databaseContext.Object);
                actual = FlatPocoFactory.CreateDelegate <ComplexFlatRow>(pocoDataRequest);
            }

            Assert.IsNotNull(actual);
        }
        public void CreateDelegate_RaisedPocoFactoryForRaisedComplexRow_IsNotNull()
        {
            var definitionProvider = new DataAnnotationsDefinitionProvider();
            var entityDefinition   = definitionProvider.Resolve <ComplexRaisedRow>();
            var databaseContext    = new Mock <IDatabaseContext>();

            databaseContext.Setup(context => context.GetValueMapper(It.IsAny <Type>(), It.IsAny <Type>())).Returns((IValueMapper)null);

            using (var target = new RaisedPocoFactory(definitionProvider))
            {
                var expected = Generate.CreateFakeRaisedComplexRow(true);

                using (var reader = expected.MockDataReader(entityDefinition.ReturnableAttributes).Object)
                {
                    reader.Read();
                    var pocoDataRequest = new PocoDataRequest(reader, entityDefinition, databaseContext.Object);
                    var actual          = target.CreatePoco <ComplexRaisedRow>(pocoDataRequest);
                    Assert.IsNotNull(actual);
                }
            }
        }
        public void CreateDelegate_FlatPocoFactoryForDynamic_DelegateSetsPocoAsExpected()
        {
            var expected           = Generate.CreateFakeComplexRow();
            var definitionProvider = new DataAnnotationsDefinitionProvider();
            var entityDefinition   = definitionProvider.Resolve <ComplexFlatRow>();
            var databaseContext    = new Mock <IDatabaseContext>();

            databaseContext.Setup(context => context.GetValueMapper(It.IsAny <Type>(), It.IsAny <Type>())).Returns((IValueMapper)null);

            Expression <Func <ComplexFlatRow, object> > expression1 = row => row.FakeComplexEntityId;
            Expression <Func <ComplexFlatRow, object> > expression2 = row => row.FakeDependentEntityDependentIntegerValue;
            Expression <Func <ComplexFlatRow, object> > expression3 = row => row.FakeSubSubEntityUniqueName;

            var attributes = new[]
            {
                expression1,
                expression2,
                expression3
            }.Select(entityDefinition.Find)
            .ToList();

            dynamic actual;

            // Set up the data reader with all attributes to ensure that the process is only getting the ones we want.
            using (var reader = expected.MockDataReader(attributes).Object)
            {
                reader.Read();
                var pocoDataRequest = new PocoDataRequest(reader, attributes, databaseContext.Object);

                var pocoDelegate = FlatPocoFactory.CreateDelegate <dynamic>(pocoDataRequest).MappingDelegate as Func <IDataReader, dynamic>;
                Assert.IsNotNull(pocoDelegate);
                actual = pocoDelegate.Invoke(reader);
            }

            Assert.IsNotNull(actual);
            Assert.AreEqual(expected.FakeComplexEntityId, actual.FakeComplexEntityId);
            Assert.AreEqual(expected.FakeDependentEntityDependentIntegerValue, actual.FakeDependentEntityDependentIntegerValue);
            Assert.AreEqual(expected.FakeSubSubEntityUniqueName, actual.FakeSubSubEntityUniqueName);
            Assert.ThrowsException <RuntimeBinderException>(() => Assert.IsNull(actual.Description));
        }
        public void CreateDelegate_RaisedPocoFactoryForRaisedDynamic_DelegateSetsPocoAsExpected()
        {
            var definitionProvider = new DataAnnotationsDefinitionProvider();
            var expected           = Generate.CreateFakeRaisedComplexRow(true);
            var databaseContext    = new Mock <IDatabaseContext>();

            databaseContext.Setup(context => context.GetValueMapper(It.IsAny <Type>(), It.IsAny <Type>())).Returns((IValueMapper)null);

            using (var target = new RaisedPocoFactory(definitionProvider))
            {
                var entityDefinition = definitionProvider.Resolve <ComplexRaisedRow>();

                Expression <Func <ComplexRaisedRow, object> > expression1 = row => row.ComplexEntityId;
                Expression <Func <ComplexRaisedRow, object> > expression2 = row => row.DependentEntity.DependentIntegerValue;
                Expression <Func <ComplexRaisedRow, object> > expression3 = row => row.SubEntity.SubSubEntity.UniqueName;

                var attributes = new[]
                {
                    expression1,
                    expression2,
                    expression3
                }.Select(entityDefinition.Find)
                .ToList();

                dynamic actual;

                using (var reader = expected.MockDataReader(attributes).Object)
                {
                    reader.Read();
                    var pocoDataRequest = new PocoDataRequest(reader, attributes, databaseContext.Object);
                    actual = target.CreatePoco <dynamic>(pocoDataRequest);
                }

                Assert.IsNotNull(actual);
                Assert.AreEqual(expected.ComplexEntityId, actual.ComplexEntityId);
                Assert.AreEqual(expected.DependentEntity.DependentIntegerValue, actual.DependentEntityDependentIntegerValue);
                Assert.AreEqual(expected.SubEntity.SubSubEntity.UniqueName, actual.SubSubEntityUniqueName);
                Assert.ThrowsException <RuntimeBinderException>(() => Assert.IsNull(actual.Description));
            }
        }
        public void CreateDelegate_FlatPocoFactoryForPhysicalNameOverriddenRow_DelegateSetsPocoAsExpected()
        {
            var expected = new OverriddenColumnNameRow
            {
                OverriddenColumnNameId = 43,
                Name           = "OcnName",
                Description    = "OcnDescription",
                EntryTime      = DateTimeOffset.Now,
                RelatedRowId   = 3433,
                RelatedRowName = "RelatedName"
            };

            var entityDefinition = new DataAnnotationsDefinitionProvider().Resolve <OverriddenColumnNameRow>();
            var databaseContext  = new Mock <IDatabaseContext>();

            databaseContext.Setup(context => context.GetValueMapper(It.IsAny <Type>(), It.IsAny <Type>())).Returns((IValueMapper)null);
            Stopwatch stopwatch;

            OverriddenColumnNameRow actual;

            using (var reader = expected.MockDataReader(entityDefinition.ReturnableAttributes).Object)
            {
                reader.Read();
                var pocoDataRequest = new PocoDataRequest(reader, entityDefinition, databaseContext.Object);

                stopwatch = Stopwatch.StartNew();
                var pocoDelegate =
                    FlatPocoFactory.CreateDelegate <OverriddenColumnNameRow>(pocoDataRequest).MappingDelegate as Func <IDataReader, OverriddenColumnNameRow>;

                Trace.TraceInformation($"{stopwatch.Elapsed} Create delegate");
                stopwatch.Reset();

                Assert.IsNotNull(pocoDelegate);

                stopwatch.Start();
                actual = pocoDelegate.Invoke(pocoDataRequest.DataReader);
            }

            Trace.TraceInformation($"{stopwatch.Elapsed} Invoke delegate #1");
            stopwatch.Reset();

            Assert.IsNotNull(actual);
            Assert.AreEqual(expected.OverriddenColumnNameId, actual.OverriddenColumnNameId);
            Assert.AreEqual(expected, actual, string.Join(Environment.NewLine, expected.GetDifferences(actual)));

            using (var reader = expected.MockDataReader(entityDefinition.ReturnableAttributes).Object)
            {
                reader.Read();
                var pocoDelegate =
                    FlatPocoFactory.CreateDelegate <OverriddenColumnNameRow>(new PocoDataRequest(reader, entityDefinition, databaseContext.Object)).MappingDelegate as
                    Func <IDataReader, OverriddenColumnNameRow>;

                Assert.IsNotNull(pocoDelegate);
                stopwatch.Start();
                pocoDelegate.Invoke(reader);
            }

            Trace.TraceInformation($"{stopwatch.Elapsed} Invoke delegate #2");
            stopwatch.Reset();

            using (var reader = expected.MockDataReader(entityDefinition.ReturnableAttributes).Object)
            {
                reader.Read();
                var pocoDelegate =
                    FlatPocoFactory.CreateDelegate <OverriddenColumnNameRow>(new PocoDataRequest(reader, entityDefinition, databaseContext.Object)).MappingDelegate as
                    Func <IDataReader, OverriddenColumnNameRow>;

                Assert.IsNotNull(pocoDelegate);
                stopwatch.Start();
                pocoDelegate.Invoke(reader);
            }

            Trace.TraceInformation($"{stopwatch.Elapsed} Invoke delegate #3");
            stopwatch.Reset();
        }
        public void CreateDelegate_RaisedPocoFactoryForRaisedPhysicalNameOverriddenRow_DelegateSetsPocoAsExpected()
        {
            var stopwatch          = new Stopwatch();
            var definitionProvider = new DataAnnotationsDefinitionProvider();
            var entityDefinition   = definitionProvider.Resolve <RaisedOverriddenColumnNameRow>();
            var databaseContext    = new Mock <IDatabaseContext>();

            databaseContext.Setup(context => context.GetValueMapper(It.IsAny <Type>(), It.IsAny <Type>())).Returns((IValueMapper)null);

            using (var target = new RaisedPocoFactory(definitionProvider))
            {
                var expected = new RaisedOverriddenColumnNameRow
                {
                    OverriddenColumnNameId = 345,
                    Name         = "RaisedName",
                    Description  = "RaisedDescription",
                    EntryTime    = DateTimeOffset.Now,
                    RelatedRowId = 344,
                    RelatedRow   = new RelatedRow {
                        RelatedRowId = 344, Name = "RelatedName"
                    }
                };

                RaisedOverriddenColumnNameRow actual;

                using (var reader = expected.MockDataReader(entityDefinition.ReturnableAttributes).Object)
                {
                    stopwatch.Start();
                    reader.Read();
                    var pocoDataRequest = new PocoDataRequest(reader, entityDefinition, databaseContext.Object);

                    stopwatch.Reset();
                    actual = target.CreatePoco <RaisedOverriddenColumnNameRow>(pocoDataRequest);
                    Trace.TraceInformation($"{stopwatch.Elapsed} Invoke delegate #1");
                }

                stopwatch.Reset();

                Assert.IsNotNull(actual);
                Assert.AreEqual(expected.OverriddenColumnNameId, actual.OverriddenColumnNameId);

                Assert.AreEqual(expected, actual, string.Join(Environment.NewLine, expected.GetDifferences(actual)));

                using (var reader = expected.MockDataReader(entityDefinition.ReturnableAttributes).Object)
                {
                    stopwatch.Start();
                    reader.Read();
                    var pocoDataRequest = new PocoDataRequest(reader, entityDefinition, databaseContext.Object);

                    stopwatch.Reset();
                    target.CreatePoco <RaisedOverriddenColumnNameRow>(pocoDataRequest);
                    Trace.TraceInformation($"{stopwatch.Elapsed} Invoke delegate #2");
                }

                stopwatch.Reset();

                using (var reader = expected.MockDataReader(entityDefinition.ReturnableAttributes).Object)
                {
                    stopwatch.Start();
                    reader.Read();
                    var pocoDataRequest = new PocoDataRequest(reader, entityDefinition, databaseContext.Object);

                    stopwatch.Reset();
                    target.CreatePoco <RaisedOverriddenColumnNameRow>(pocoDataRequest);
                }

                Trace.TraceInformation($"{stopwatch.Elapsed} Invoke delegate #3");
                stopwatch.Reset();
            }
        }
        public void CreateDelegate_RaisedPocoFactoryForRaisedDuplicateAttributeRow_DelegateSetsPocoAsExpected()
        {
            // It is vitally important that we use separate (duplicate) POCOs when creating this test object so that any failure to
            // update one of the instance properties is caught.
            var expected = new InstanceSection
            {
                InstanceSectionId = 234,
                EndDate           = DateTimeOffset.MaxValue,
                InstanceId        = 45873,
                Instance          =
                    new Instance
                {
                    InstanceId        = 45873,
                    Name              = "MyInstance",
                    OwnerId           = 4875,
                    TemplateVersionId = 43,
                    TemplateVersion   =
                        new TemplateVersion
                    {
                        TemplateVersionId     = 43,
                        TemplateId            = 87,
                        Revision              = 3,
                        FakeSubSubEntityId    = 56,
                        FakeSubSubUniqueName  = "FakeSubSubUniqueName",
                        OtherEntityUniqueName = "OtherEntityUniqueName",
                        Description           = "TemplateVersion",
                        Template              =
                            new Template
                        {
                            TemplateId = 87,
                            Name       = "Template"
                        }
                    }
                },
                FakeDependentId = 345,
                FakeDependentEntityDependentTimeValue = DateTimeOffset.MinValue.AddYears(2000),
                SomeEntityUniqueName = "SomeEntityUniqueName",
                InstanceExtension    = new InstanceExtension {
                    InstanceExtensionId = 234, Enabled = true
                },
                OwnerId           = 7458,
                StartDate         = DateTimeOffset.Now,
                TemplateSectionId = 48753,
                TemplateSection   =
                    new TemplateSection
                {
                    TemplateSectionId = 48753,
                    Header            = "My Section Header",
                    Order             = 2,
                    TemplateVersionId = 43,
                    TemplateVersion   =
                        new TemplateVersion
                    {
                        TemplateVersionId    = 43,
                        TemplateId           = 87,
                        Revision             = 3,
                        FakeSubSubEntityId   = 56,
                        FakeSubSubUniqueName =
                            "FakeSubSubUniqueName",
                        OtherEntityUniqueName =
                            "OtherEntityUniqueName",
                        Description = "TemplateVersion",
                        Template    =
                            new Template
                        {
                            Name       = "Template",
                            TemplateId = 87
                        }
                    }
                }
            };

            var stopwatch          = new Stopwatch();
            var definitionProvider = new DataAnnotationsDefinitionProvider();
            var entityDefinition   = definitionProvider.Resolve <InstanceSection>();
            var databaseContext    = new Mock <IDatabaseContext>();

            databaseContext.Setup(context => context.GetValueMapper(It.IsAny <Type>(), It.IsAny <Type>())).Returns((IValueMapper)null);
            stopwatch.Reset();

            using (var target = new RaisedPocoFactory(definitionProvider))
            {
                InstanceSection actual;

                using (var reader = expected.MockDataReader(entityDefinition.ReturnableAttributes).Object)
                {
                    stopwatch.Start();
                    reader.Read();
                    var pocoDataRequest = new PocoDataRequest(reader, entityDefinition, databaseContext.Object);
                    Trace.TraceInformation($"{stopwatch.Elapsed} Create data request");
                    stopwatch.Reset();
                    actual = target.CreatePoco <InstanceSection>(pocoDataRequest);
                }

                Trace.TraceInformation($"{stopwatch.Elapsed} Invoke delegate #1");
                stopwatch.Reset();

                Assert.IsNotNull(actual);
                Assert.AreEqual(expected.InstanceSectionId, actual.InstanceSectionId);

                Assert.AreEqual(
                    expected.Instance.TemplateVersion,
                    actual.Instance.TemplateVersion,
                    string.Join(Environment.NewLine, expected.Instance.TemplateVersion.GetDifferences(actual.Instance.TemplateVersion)));

                Assert.AreEqual(
                    expected.Instance,
                    actual.Instance,
                    string.Join(Environment.NewLine, expected.Instance.GetDifferences(actual.Instance)));

                Assert.AreEqual(
                    expected.TemplateSection,
                    actual.TemplateSection,
                    string.Join(Environment.NewLine, expected.TemplateSection.GetDifferences(actual.TemplateSection)));

                Assert.AreEqual(expected, actual, string.Join(Environment.NewLine, expected.GetDifferences(actual)));

                using (var reader = expected.MockDataReader(entityDefinition.ReturnableAttributes).Object)
                {
                    stopwatch.Start();
                    reader.Read();
                    var pocoDataRequest = new PocoDataRequest(reader, entityDefinition, databaseContext.Object);
                    target.CreatePoco <InstanceSection>(pocoDataRequest);
                }

                Trace.TraceInformation($"{stopwatch.Elapsed} Invoke delegate #2");
                stopwatch.Reset();

                using (var reader = expected.MockDataReader(entityDefinition.ReturnableAttributes).Object)
                {
                    stopwatch.Start();
                    reader.Read();
                    var pocoDataRequest = new PocoDataRequest(reader, entityDefinition, databaseContext.Object);
                    target.CreatePoco <InstanceSection>(pocoDataRequest);
                }

                Trace.TraceInformation($"{stopwatch.Elapsed} Invoke delegate #3");
                stopwatch.Reset();
            }
        }