diff --git a/test/Microsoft.AspNet.Mvc.Core.Test/Microsoft.AspNet.Mvc.Core.Test.kproj b/test/Microsoft.AspNet.Mvc.Core.Test/Microsoft.AspNet.Mvc.Core.Test.kproj
index 0c51eb1351..448c9a3636 100644
--- a/test/Microsoft.AspNet.Mvc.Core.Test/Microsoft.AspNet.Mvc.Core.Test.kproj
+++ b/test/Microsoft.AspNet.Mvc.Core.Test/Microsoft.AspNet.Mvc.Core.Test.kproj
@@ -94,8 +94,10 @@
+
+
diff --git a/test/Microsoft.AspNet.Mvc.Core.Test/Rendering/HtmlHelperDisplayTextTest.cs b/test/Microsoft.AspNet.Mvc.Core.Test/Rendering/HtmlHelperDisplayTextTest.cs
new file mode 100644
index 0000000000..7df2f7e1c2
--- /dev/null
+++ b/test/Microsoft.AspNet.Mvc.Core.Test/Rendering/HtmlHelperDisplayTextTest.cs
@@ -0,0 +1,284 @@
+// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System.Globalization;
+using Microsoft.AspNet.Mvc.ModelBinding;
+using Xunit;
+
+namespace Microsoft.AspNet.Mvc.Core
+{
+ ///
+ /// Test the and methods.
+ ///
+ public class HtmlHelperDisplayTextTest
+ {
+ [Fact]
+ public void DisplayText_ReturnsEmpty_IfValueNull()
+ {
+ // Arrange
+ var helper = DefaultTemplatesUtilities.GetHtmlHelper(model: null);
+
+ // Act
+ var result = helper.DisplayText("");
+
+ // Assert
+ Assert.Empty(result);
+ }
+
+ [Fact]
+ public void DisplayTextFor_ReturnsEmpty_IfValueNull()
+ {
+ // Arrange
+ var helper = DefaultTemplatesUtilities.GetHtmlHelper(model: null);
+
+ // Act
+ var result = helper.DisplayTextFor(m => m);
+
+ // Assert
+ Assert.Empty(result);
+ }
+
+ [Fact]
+ public void DisplayText_ReturnsNullDisplayText_IfSetAndValueNull()
+ {
+ // Arrange
+ var helper = DefaultTemplatesUtilities.GetHtmlHelper(model: null);
+ helper.ViewData.ModelMetadata.NullDisplayText = "Null display Text";
+
+ // Act
+ var result = helper.DisplayText("");
+
+ // Assert
+ Assert.Equal("Null display Text", result);
+ }
+
+ [Fact]
+ public void DisplayTextFor_ReturnsNullDisplayText_IfSetAndValueNull()
+ {
+ // Arrange
+ var helper = DefaultTemplatesUtilities.GetHtmlHelper(model: null);
+ helper.ViewData.ModelMetadata.NullDisplayText = "Null display Text";
+
+ // Act
+ var result = helper.DisplayTextFor(m => m);
+
+ // Assert
+ Assert.Equal("Null display Text", result);
+ }
+
+ [Fact]
+ public void DisplayText_ReturnsValue_IfNameEmpty()
+ {
+ // Arrange
+ var model = new OverriddenToStringModel("Model value");
+ var helper = DefaultTemplatesUtilities.GetHtmlHelper(model);
+
+ // Act
+ var result = helper.DisplayText("");
+
+ // Assert
+ Assert.Equal("Model value", result);
+ }
+
+ [Fact]
+ public void DisplayText_ReturnsEmpty_IfNameNotFound()
+ {
+ // Arrange
+ var model = new OverriddenToStringModel("Model value");
+ var helper = DefaultTemplatesUtilities.GetHtmlHelper(model);
+
+ // Act
+ var result = helper.DisplayText("NonExistentProperty");
+
+ // Assert
+ Assert.Empty(result);
+ }
+
+ [Fact]
+ public void DisplayTextFor_ReturnsValue_IfIdentityExpression()
+ {
+ // Arrange
+ var model = new OverriddenToStringModel("Model value");
+ var helper = DefaultTemplatesUtilities.GetHtmlHelper(model);
+
+ // Act
+ var result = helper.DisplayTextFor(m => m);
+
+ // Assert
+ Assert.Equal("Model value", result);
+ }
+
+ [Fact]
+ public void DisplayText_ReturnsSimpleDisplayText_IfSetAndValueNonNull()
+ {
+ // Arrange
+ var model = new OverriddenToStringModel("Ignored text");
+ var helper = DefaultTemplatesUtilities.GetHtmlHelper(model);
+ helper.ViewData.ModelMetadata.SimpleDisplayText = "Simple display text";
+
+ // Act
+ var result = helper.DisplayText("");
+
+ // Assert
+ Assert.Equal("Simple display text", result);
+ }
+
+ [Fact]
+ public void DisplayTextFor_ReturnsSimpleDisplayText_IfSetAndValueNonNull()
+ {
+ // Arrange
+ var model = new OverriddenToStringModel("Ignored text");
+ var helper = DefaultTemplatesUtilities.GetHtmlHelper(model);
+ helper.ViewData.ModelMetadata.SimpleDisplayText = "Simple display text";
+
+ // Act
+ var result = helper.DisplayTextFor(m => m);
+
+ // Assert
+ Assert.Equal("Simple display text", result);
+ }
+
+ [Fact]
+ public void DisplayText_ReturnsPropertyValue_IfNameFound()
+ {
+ // Arrange
+ var model = new OverriddenToStringModel("Ignored text")
+ {
+ Name = "Property value",
+ };
+ var helper = DefaultTemplatesUtilities.GetHtmlHelper(model);
+ helper.ViewData.ModelMetadata.SimpleDisplayText = "Simple display text";
+
+ // Act
+ var result = helper.DisplayText("Name");
+
+ // Assert
+ Assert.Equal("Property value", result);
+ }
+
+ [Fact]
+ public void DisplayTextFor_ReturnsPropertyValue_IfPropertyExpression()
+ {
+ // Arrange
+ var model = new OverriddenToStringModel("ignored text")
+ {
+ Name = "Property value",
+ };
+ var helper = DefaultTemplatesUtilities.GetHtmlHelper(model);
+
+ // Act
+ var result = helper.DisplayTextFor(m => m.Name);
+
+ // Assert
+ Assert.Equal("Property value", result);
+ }
+
+ [Fact]
+ public void DisplayText_ReturnsViewDataEntry()
+ {
+ // Arrange
+ var model = new OverriddenToStringModel("Model value")
+ {
+ Name = "Property value",
+ };
+ var helper = DefaultTemplatesUtilities.GetHtmlHelper(model);
+ helper.ViewData["Name"] = "View data dictionary value";
+
+ // Act
+ var result = helper.DisplayText("Name");
+
+ // Assert
+ Assert.Equal("View data dictionary value", result);
+ }
+
+ [Fact]
+ public void DisplayTextFor_IgnoresViewDataEntry()
+ {
+ // Arrange
+ var model = new OverriddenToStringModel("Model value")
+ {
+ Name = "Property value",
+ };
+ var helper = DefaultTemplatesUtilities.GetHtmlHelper(model);
+ helper.ViewData["Name"] = "View data dictionary value";
+
+ // Act
+ var result = helper.DisplayTextFor(m => m.Name);
+
+ // Assert
+ Assert.Equal("Property value", result);
+ }
+
+ [Fact]
+ public void DisplayText_ReturnsModelStateEntry()
+ {
+ // Arrange
+ var model = new OverriddenToStringModel("Model value")
+ {
+ Name = "Property value",
+ };
+ var helper = DefaultTemplatesUtilities.GetHtmlHelper(model);
+ var viewData = helper.ViewData;
+ viewData["Name"] = "View data dictionary value";
+ viewData.TemplateInfo.HtmlFieldPrefix = "FieldPrefix";
+
+ var modelState = new ModelState();
+ modelState.Value = new ValueProviderResult(
+ rawValue: new string[] { "Attempted name value" },
+ attemptedValue: "Attempted name value",
+ culture: CultureInfo.InvariantCulture);
+ viewData.ModelState["FieldPrefix.Name"] = modelState;
+
+ // Act
+ var result = helper.DisplayText("Name");
+
+ // Assert
+ Assert.Equal("View data dictionary value", result);
+ }
+
+ [Fact]
+ public void DisplayTextFor_IgnoresModelStateEntry()
+ {
+ // Arrange
+ var model = new OverriddenToStringModel("Model value")
+ {
+ Name = "Property value",
+ };
+ var helper = DefaultTemplatesUtilities.GetHtmlHelper(model);
+ var viewData = helper.ViewData;
+ viewData["Name"] = "View data dictionary value";
+ viewData.TemplateInfo.HtmlFieldPrefix = "FieldPrefix";
+
+ var modelState = new ModelState();
+ modelState.Value = new ValueProviderResult(
+ rawValue: new string[] { "Attempted name value" },
+ attemptedValue: "Attempted name value",
+ culture: CultureInfo.InvariantCulture);
+ viewData.ModelState["FieldPrefix.Name"] = modelState;
+
+ // Act
+ var result = helper.DisplayTextFor(m => m.Name);
+
+ // Assert
+ Assert.Equal("Property value", result);
+ }
+
+ // ModelMetadata.SimpleDisplayText returns ToString() result if that method has been overridden.
+ private sealed class OverriddenToStringModel
+ {
+ private readonly string _simpleDisplayText;
+
+ public OverriddenToStringModel(string simpleDisplayText)
+ {
+ _simpleDisplayText = simpleDisplayText;
+ }
+
+ public string Name { get; set; }
+
+ public override string ToString()
+ {
+ return _simpleDisplayText;
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/test/Microsoft.AspNet.Mvc.Core.Test/Rendering/HtmlHelperValueExtensionsTest.cs b/test/Microsoft.AspNet.Mvc.Core.Test/Rendering/HtmlHelperValueExtensionsTest.cs
new file mode 100644
index 0000000000..e8dbdfd082
--- /dev/null
+++ b/test/Microsoft.AspNet.Mvc.Core.Test/Rendering/HtmlHelperValueExtensionsTest.cs
@@ -0,0 +1,169 @@
+// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using Microsoft.AspNet.Testing;
+using Microsoft.AspNet.Mvc.ModelBinding;
+using Microsoft.AspNet.Mvc.Rendering;
+using Moq;
+using Xunit;
+
+namespace Microsoft.AspNet.Mvc.Core
+{
+ ///
+ /// Test the class.
+ ///
+ public class HtmlHelperValueExtensionsTest
+ {
+ // Value
+
+ [Fact]
+ public void ValueGetsValueFromViewData()
+ {
+ // Arrange
+ var helper = GetHtmlHelper();
+
+ // Act
+ var html = helper.Value("StringProperty");
+
+ // Assert
+ Assert.Equal("ViewDataValue", html);
+ }
+
+ // ValueFor
+
+ [Fact]
+ public void ValueForGetsExpressionValueFromViewDataModel()
+ {
+ // Arrange
+ var helper = GetHtmlHelper();
+
+ // Act
+ var html = helper.ValueFor(m => m.StringProperty);
+
+ // Assert
+ Assert.Equal("ModelStringPropertyValue", html);
+ }
+
+ // All Value Helpers including ValueForModel
+
+ [Fact]
+ public void ValueHelpersWithErrorsGetValueFromModelState()
+ {
+ // Arrange
+ var model = new TestModel()
+ {
+ StringProperty = "ModelStringPropertyValue",
+ ObjectProperty = "ModelObjectPropertyValue",
+ };
+ var helper = DefaultTemplatesUtilities.GetHtmlHelper(model);
+ var viewData = helper.ViewData;
+ viewData["StringProperty"] = "ViewDataValue";
+ viewData.TemplateInfo.HtmlFieldPrefix = "FieldPrefix";
+
+ var modelState = new ModelState();
+ modelState.Value = new ValueProviderResult(
+ rawValue: new string[] { "StringPropertyRawValue" },
+ attemptedValue: "StringPropertyAttemptedValue",
+ culture: CultureInfo.InvariantCulture);
+ viewData.ModelState["FieldPrefix.StringProperty"] = modelState;
+
+ modelState = new ModelState();
+ modelState.Value = new ValueProviderResult(
+ rawValue: new string[] { "ModelRawValue" },
+ attemptedValue: "ModelAttemptedValue",
+ culture: CultureInfo.InvariantCulture);
+ viewData.ModelState["FieldPrefix"] = modelState;
+
+ // Act & Assert
+ Assert.Equal("StringPropertyRawValue", helper.Value("StringProperty"));
+ Assert.Equal("StringPropertyRawValue", helper.ValueFor(m => m.StringProperty));
+ Assert.Equal("ModelRawValue", helper.ValueForModel());
+ }
+
+ [Fact]
+ [ReplaceCulture]
+ public void ValueHelpersWithEmptyNameConvertModelValueUsingCurrentCulture()
+ {
+ // Arrange
+ var helper = GetHtmlHelper();
+ var expectedModelValue =
+ "{ StringProperty = ModelStringPropertyValue, ObjectProperty = 01/01/1900 00:00:00 }";
+
+ // Act & Assert
+ Assert.Equal(expectedModelValue, helper.Value(name: string.Empty));
+ Assert.Equal(expectedModelValue, helper.ValueFor(m => m));
+ Assert.Equal(expectedModelValue, helper.ValueForModel());
+ }
+
+ [Fact]
+ [ReplaceCulture]
+ public void ValueHelpersFormatValue()
+ {
+ // Arrange
+ var helper = GetHtmlHelper();
+ var expectedModelValue =
+ "-{ StringProperty = ModelStringPropertyValue, ObjectProperty = 01/01/1900 00:00:00 }-";
+ var expectedObjectPropertyValue = "-01/01/1900 00:00:00-";
+
+ // Act & Assert
+ Assert.Equal(expectedModelValue, helper.ValueForModel("-{0}-"));
+ Assert.Equal(expectedObjectPropertyValue, helper.Value("ObjectProperty", "-{0}-"));
+ Assert.Equal(expectedObjectPropertyValue, helper.ValueFor(m => m.ObjectProperty, "-{0}-"));
+ }
+
+ [Fact]
+ public void ValueHelpersDoNotEncodeValue()
+ {
+ // Arrange
+ var model = new TestModel { StringProperty = "ModelStringPropertyValue <\"\">" };
+ var helper = DefaultTemplatesUtilities.GetHtmlHelper(model);
+ var viewData = helper.ViewData;
+ viewData["StringProperty"] = "ViewDataValue <\"\">";
+
+ var modelState = new ModelState();
+ modelState.Value = new ValueProviderResult(
+ rawValue: new string[] { "ObjectPropertyRawValue <\"\">" },
+ attemptedValue: "ObjectPropertyAttemptedValue <\"\">",
+ culture: CultureInfo.InvariantCulture);
+ viewData.ModelState["ObjectProperty"] = modelState;
+
+ // Act & Assert
+ Assert.Equal(
+ "<{ StringProperty = ModelStringPropertyValue <\"\">, ObjectProperty = (null) }>",
+ helper.ValueForModel("<{0}>"));
+ Assert.Equal(">", helper.Value("StringProperty", "<{0}>"));
+ Assert.Equal(">", helper.ValueFor(m => m.StringProperty, "<{0}>"));
+ Assert.Equal("ObjectPropertyRawValue <\"\">", helper.ValueFor(m => m.ObjectProperty));
+ }
+
+ private sealed class TestModel
+ {
+ public string StringProperty { get; set; }
+ public object ObjectProperty { get; set; }
+
+ public override string ToString()
+ {
+ return string.Format(
+ "{{ StringProperty = {0}, ObjectProperty = {1} }}",
+ StringProperty ?? "(null)",
+ ObjectProperty ?? "(null)");
+ }
+ }
+
+ private static HtmlHelper GetHtmlHelper()
+ {
+ var model = new TestModel
+ {
+ StringProperty = "ModelStringPropertyValue",
+ ObjectProperty = new DateTime(1900, 1, 1, 0, 0, 0),
+ };
+ var helper = DefaultTemplatesUtilities.GetHtmlHelper(model);
+ helper.ViewData["StringProperty"] = "ViewDataValue";
+
+ return helper;
+ }
+ }
+}
\ No newline at end of file