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(); } }
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 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); }