public void FromLambdaExpressionPropertyExpressionFromClosureValue()
        {
            // Arrange
            Mock <ModelMetadataProvider> provider = new Mock <ModelMetadataProvider>();
            DummyContactModel            model    = new DummyContactModel {
                FirstName = "Test"
            };
            ViewDataDictionary <object> viewData = new ViewDataDictionary <object>();

            provider.Setup(p => p.GetMetadataForProperty(It.IsAny <Func <object> >(), It.IsAny <Type>(), It.IsAny <string>()))
            .Callback <Func <object>, Type, string>((accessor, type, propertyName) =>
            {
                Assert.Equal("Test", accessor());
                Assert.Equal(typeof(DummyContactModel), type);
                Assert.Equal("FirstName", propertyName);
            })
            .Returns(() => null)
            .Verifiable();

            // Act
            ModelMetadata.FromLambdaExpression <object, string>(m => model.FirstName, viewData, provider.Object);

            // Assert
            provider.Verify();
        }
        public void FromLambdaExpressionPropertyExpressionFromParameter()
        {
            using (MockModelMetadataProvider provider = new MockModelMetadataProvider()) {
                // Arrange
                DummyContactModel model = new DummyContactModel {
                    FirstName = "Test"
                };
                ViewDataDictionary <DummyContactModel> viewData = new ViewDataDictionary <DummyContactModel>(model);
                provider.Setup(p => p.GetMetadataForProperty(It.IsAny <Func <object> >(), It.IsAny <Type>(), It.IsAny <string>()))
                .Callback <Func <object>, Type, string>((accessor, type, propertyName) =>
                {
                    Assert.AreEqual("Test", accessor());
                    Assert.AreEqual(typeof(DummyContactModel), type);
                    Assert.AreEqual("FirstName", propertyName);
                })
                .Returns(() => null)
                .Verifiable();

                // Act
                ModelMetadata.FromLambdaExpression <DummyContactModel, string>(m => m.FirstName, viewData);

                // Assert
                provider.Verify();
            }
        }
Example #3
0
        public void FromLambdaExpressionSingleDimensionArrayIndex()
        {
            // Arrange
            Mock <ModelMetadataProvider> provider = new Mock <ModelMetadataProvider>();
            DummyContactModel            model    = new DummyContactModel
            {
                Array = new[] { 4, 8, 15, 16, 23, 42 }
            };
            ViewDataDictionary <DummyContactModel> viewData =
                new ViewDataDictionary <DummyContactModel>(model);

            provider
            .Setup(p => p.GetMetadataForType(It.IsAny <Func <object> >(), It.IsAny <Type>()))
            .Callback <Func <object>, Type>(
                (accessor, type) =>
            {
                Assert.Equal(16, accessor());
                Assert.Equal(typeof(int), type);
            }
                )
            .Returns(() => null)
            .Verifiable();

            // Act
            ModelMetadata.FromLambdaExpression <DummyContactModel, int>(
                m => m.Array[3],
                viewData,
                provider.Object
                );

            // Assert
            provider.Verify();
        }
Example #4
0
        public void FromLambdaExpressionSingleParameterClassIndexer()
        {
            // Arrange
            Mock <ModelMetadataProvider>           provider = new Mock <ModelMetadataProvider>();
            DummyContactModel                      model    = new DummyContactModel();
            ViewDataDictionary <DummyContactModel> viewData =
                new ViewDataDictionary <DummyContactModel>(model);

            provider
            .Setup(p => p.GetMetadataForType(It.IsAny <Func <object> >(), It.IsAny <Type>()))
            .Callback <Func <object>, Type>(
                (accessor, type) =>
            {
                Assert.Equal("Indexed into 42", accessor());
                Assert.Equal(typeof(string), type);
            }
                )
            .Returns(() => null)
            .Verifiable();

            // Act
            ModelMetadata.FromLambdaExpression <DummyContactModel, string>(
                m => m[42],
                viewData,
                provider.Object
                );

            // Assert
            provider.Verify();
        }
Example #5
0
        public void FromLambdaExpressionFieldExpressionFromClosureValue()
        {
            // Arrange
            Mock <ModelMetadataProvider> provider = new Mock <ModelMetadataProvider>();
            DummyContactModel            model    = new DummyContactModel();
            ViewDataDictionary <object>  viewData = new ViewDataDictionary <object>();

            provider
            .Setup(p => p.GetMetadataForType(It.IsAny <Func <object> >(), It.IsAny <Type>()))
            .Callback <Func <object>, Type>(
                (accessor, type) =>
            {
                Assert.Same(model, accessor());
                Assert.Equal(typeof(DummyContactModel), type);
            }
                )
            .Returns(() => null)
            .Verifiable();

            // Act
            ModelMetadata.FromLambdaExpression <object, DummyContactModel>(
                m => model,
                viewData,
                provider.Object
                );

            // Assert
            provider.Verify();
        }
        public void LambdaBasedExpressionTextTests()
        {
            // "Model" at the front of the expression is excluded (case insensitively)
            DummyContactModel Model = null;

            Assert.Equal(String.Empty, ExpressionHelper.GetExpressionText(Lambda <object, DummyContactModel>(m => Model)));
            Assert.Equal("FirstName", ExpressionHelper.GetExpressionText(Lambda <object, string>(m => Model.FirstName)));

            DummyContactModel mOdeL = null;

            Assert.Equal(String.Empty, ExpressionHelper.GetExpressionText(Lambda <object, DummyContactModel>(m => mOdeL)));
            Assert.Equal("FirstName", ExpressionHelper.GetExpressionText(Lambda <object, string>(m => mOdeL.FirstName)));

            // Model property of model is passed through
            Assert.Equal("Model", ExpressionHelper.GetExpressionText(Lambda <DummyModelContainer, DummyContactModel>(m => m.Model)));

            // "Model" in the middle of the expression is not excluded
            DummyModelContainer container = null;

            Assert.Equal("container.Model", ExpressionHelper.GetExpressionText(Lambda <object, DummyContactModel>(m => container.Model)));
            Assert.Equal("container.Model.FirstName", ExpressionHelper.GetExpressionText(Lambda <object, string>(m => container.Model.FirstName)));

            // The parameter is excluded
            Assert.Equal(String.Empty, ExpressionHelper.GetExpressionText(Lambda <DummyContactModel, DummyContactModel>(m => m)));
            Assert.Equal("FirstName", ExpressionHelper.GetExpressionText(Lambda <DummyContactModel, string>(m => m.FirstName)));

            // Integer indexer is included and properly computed from captured values
            int x = 2;

            Assert.Equal("container.Model[42].Length", ExpressionHelper.GetExpressionText(Lambda <object, int>(m => container.Model[x * 21].Length)));
            Assert.Equal("[42]", ExpressionHelper.GetExpressionText(Lambda <int[], int>(m => m[x * 21])));

            // String indexer is included and properly computed from captured values
            string y = "Hello world";

            Assert.Equal("container.Model[Hello].Length", ExpressionHelper.GetExpressionText(Lambda <object, int>(m => container.Model[y.Substring(0, 5)].Length)));

            // Back to back indexer is included
            Assert.Equal("container.Model[1024][2]", ExpressionHelper.GetExpressionText(Lambda <object, char>(m => container.Model[x * 512][x])));

            // Multi-parameter indexer is excluded
            Assert.Equal("Length", ExpressionHelper.GetExpressionText(Lambda <object, int>(m => container.Model[42, "Hello World"].Length)));

            // Single array indexer is included
            Assert.Equal("container.Model.Array[1024]", ExpressionHelper.GetExpressionText(Lambda <object, int>(m => container.Model.Array[x * 512])));

            // Double array indexer is excluded
            Assert.Equal("", ExpressionHelper.GetExpressionText(Lambda <object, int>(m => container.Model.DoubleArray[1, 2])));

            // Non-indexer method call is excluded
            Assert.Equal("Length", ExpressionHelper.GetExpressionText(Lambda <object, int>(m => container.Model.Method().Length)));

            // Lambda expression which involves indexer which references lambda parameter throws
            Assert.Throws <InvalidOperationException>(
                () => ExpressionHelper.GetExpressionText(Lambda <string, char>(s => s[s.Length - 4])),
                "The expression compiler was unable to evaluate the indexer expression '(s.Length - 4)' because it references the model parameter 's' which is unavailable.");
        }
        public void FromStringExpressionValueInModelProperty()
        {
            // Arrange
            DummyContactModel model = new DummyContactModel {
                FirstName = "John"
            };
            ViewDataDictionary viewData = new ViewDataDictionary(model);

            // Act
            ModelMetadata metadata = ModelMetadata.FromStringExpression("FirstName", viewData);

            // Assert
            Assert.Equal("John", metadata.Model);
        }
        public void FromStringExpressionValueInViewDataOverridesValueFromModelProperty()
        {
            // Arrange
            DummyContactModel model = new DummyContactModel {
                FirstName = "John"
            };
            ViewDataDictionary viewData = new ViewDataDictionary(model);

            viewData["FirstName"] = "Jim";

            // Act
            ModelMetadata metadata = ModelMetadata.FromStringExpression("FirstName", viewData);

            // Assert
            Assert.Equal("Jim", metadata.Model);
            Assert.Null(metadata.Container);
        }
        public void FromLambdaExpressionFieldExpressionFromFieldOfClosureValue()
        {
            using (MockModelMetadataProvider provider = new MockModelMetadataProvider()) {
                // Arrange
                DummyContactModel model = new DummyContactModel {
                    IntField = 42
                };
                ViewDataDictionary <object> viewData = new ViewDataDictionary <object>();
                provider.Setup(p => p.GetMetadataForType(It.IsAny <Func <object> >(), It.IsAny <Type>()))
                .Callback <Func <object>, Type>((accessor, type) =>
                {
                    Assert.AreEqual(42, accessor());
                    Assert.AreEqual(typeof(int), type);
                })
                .Returns(() => null)
                .Verifiable();

                // Act
                ModelMetadata.FromLambdaExpression <object, int>(m => model.IntField, viewData);

                // Assert
                provider.Verify();
            }
        }
        public void FromLambdaExpressionSingleDimensionArrayIndex()
        {
            // Arrange
            Mock<ModelMetadataProvider> provider = new Mock<ModelMetadataProvider>();
            DummyContactModel model = new DummyContactModel { Array = new[] { 4, 8, 15, 16, 23, 42 } };
            ViewDataDictionary<DummyContactModel> viewData = new ViewDataDictionary<DummyContactModel>(model);
            provider.Setup(p => p.GetMetadataForType(It.IsAny<Func<object>>(), It.IsAny<Type>()))
                .Callback<Func<object>, Type>((accessor, type) =>
                {
                    Assert.Equal(16, accessor());
                    Assert.Equal(typeof(int), type);
                })
                .Returns(() => null)
                .Verifiable();

            // Act
            ModelMetadata.FromLambdaExpression<DummyContactModel, int>(m => m.Array[3], viewData, provider.Object);

            // Assert
            provider.Verify();
        }
        public void FromLambdaExpressionSingleParameterClassIndexer()
        {
            // Arrange
            Mock<ModelMetadataProvider> provider = new Mock<ModelMetadataProvider>();
            DummyContactModel model = new DummyContactModel();
            ViewDataDictionary<DummyContactModel> viewData = new ViewDataDictionary<DummyContactModel>(model);
            provider.Setup(p => p.GetMetadataForType(It.IsAny<Func<object>>(), It.IsAny<Type>()))
                .Callback<Func<object>, Type>((accessor, type) =>
                {
                    Assert.Equal("Indexed into 42", accessor());
                    Assert.Equal(typeof(string), type);
                })
                .Returns(() => null)
                .Verifiable();

            // Act
            ModelMetadata.FromLambdaExpression<DummyContactModel, string>(m => m[42], viewData, provider.Object);

            // Assert
            provider.Verify();
        }
        public void FromLambdaExpressionFieldExpressionFromClosureValue()
        {
            // Arrange
            Mock<ModelMetadataProvider> provider = new Mock<ModelMetadataProvider>();
            DummyContactModel model = new DummyContactModel();
            ViewDataDictionary<object> viewData = new ViewDataDictionary<object>();
            provider.Setup(p => p.GetMetadataForType(It.IsAny<Func<object>>(), It.IsAny<Type>()))
                .Callback<Func<object>, Type>((accessor, type) =>
                {
                    Assert.Same(model, accessor());
                    Assert.Equal(typeof(DummyContactModel), type);
                })
                .Returns(() => null)
                .Verifiable();

            // Act
            ModelMetadata.FromLambdaExpression<object, DummyContactModel>(m => model, viewData, provider.Object);

            // Assert
            provider.Verify();
        }
        public void FromLambdaExpressionPropertyExpressionFromClosureValue()
        {
            // Arrange
            Mock<ModelMetadataProvider> provider = new Mock<ModelMetadataProvider>();
            DummyContactModel model = new DummyContactModel { FirstName = "Test" };
            ViewDataDictionary<object> viewData = new ViewDataDictionary<object>();
            provider.Setup(p => p.GetMetadataForProperty(It.IsAny<Func<object>>(), It.IsAny<Type>(), It.IsAny<string>()))
                .Callback<Func<object>, Type, string>((accessor, type, propertyName) =>
                {
                    Assert.Equal("Test", accessor());
                    Assert.Equal(typeof(DummyContactModel), type);
                    Assert.Equal("FirstName", propertyName);
                })
                .Returns(() => null)
                .Verifiable();

            // Act
            ModelMetadata.FromLambdaExpression<object, string>(m => model.FirstName, viewData, provider.Object);

            // Assert
            provider.Verify();
        }
        public void FromStringExpressionValueInViewDataOverridesValueFromModelProperty()
        {
            // Arrange
            DummyContactModel model = new DummyContactModel { FirstName = "John" };
            ViewDataDictionary viewData = new ViewDataDictionary(model);
            viewData["FirstName"] = "Jim";

            // Act
            ModelMetadata metadata = ModelMetadata.FromStringExpression("FirstName", viewData);

            // Assert
            Assert.Equal("Jim", metadata.Model);
        }