Handle trailing semicolon after @inject.
- Made @inject handle trailing semicolons identical to @using; essentially ignores it. - Added parser, runtime/designtime codegen and functional tests. - Added Microsoft.AspNet.Mvc.Common.Test. - Transitioned pre-existing Microsoft.AspNet.Mvc.Common tests to the new test project. - Updated transitioned tests to also work in CoreCLR (except ones with moq). #1857
This commit is contained in:
parent
09928a2818
commit
14bd7dcd5e
17
Mvc.sln
17
Mvc.sln
|
|
@ -1,7 +1,7 @@
|
||||||
|
|
||||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
# Visual Studio 14
|
# Visual Studio 14
|
||||||
VisualStudioVersion = 14.0.22303.1
|
VisualStudioVersion = 14.0.22512.0
|
||||||
MinimumVisualStudioVersion = 10.0.40219.1
|
MinimumVisualStudioVersion = 10.0.40219.1
|
||||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "samples", "samples", "{DAAE4C74-D06F-4874-A166-33305D2643CE}"
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "samples", "samples", "{DAAE4C74-D06F-4874-A166-33305D2643CE}"
|
||||||
EndProject
|
EndProject
|
||||||
|
|
@ -122,6 +122,8 @@ Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "CustomRouteWebSite", "test\
|
||||||
EndProject
|
EndProject
|
||||||
Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "ResponseCacheWebSite", "test\WebSites\ResponseCacheWebSite\ResponseCacheWebSite.kproj", "{BDEEBE09-C0C4-433C-B0B8-8478C9776996}"
|
Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "ResponseCacheWebSite", "test\WebSites\ResponseCacheWebSite\ResponseCacheWebSite.kproj", "{BDEEBE09-C0C4-433C-B0B8-8478C9776996}"
|
||||||
EndProject
|
EndProject
|
||||||
|
Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Mvc.Common.Test", "test\Microsoft.AspNet.Mvc.Common.Test\Microsoft.AspNet.Mvc.Common.Test.kproj", "{0449D6D2-BE1B-4E29-8E1B-444420802C03}"
|
||||||
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
Debug|Any CPU = Debug|Any CPU
|
Debug|Any CPU = Debug|Any CPU
|
||||||
|
|
@ -682,6 +684,18 @@ Global
|
||||||
{BDEEBE09-C0C4-433C-B0B8-8478C9776996}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
{BDEEBE09-C0C4-433C-B0B8-8478C9776996}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
||||||
{BDEEBE09-C0C4-433C-B0B8-8478C9776996}.Release|x86.ActiveCfg = Release|Any CPU
|
{BDEEBE09-C0C4-433C-B0B8-8478C9776996}.Release|x86.ActiveCfg = Release|Any CPU
|
||||||
{BDEEBE09-C0C4-433C-B0B8-8478C9776996}.Release|x86.Build.0 = Release|Any CPU
|
{BDEEBE09-C0C4-433C-B0B8-8478C9776996}.Release|x86.Build.0 = Release|Any CPU
|
||||||
|
{0449D6D2-BE1B-4E29-8E1B-444420802C03}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{0449D6D2-BE1B-4E29-8E1B-444420802C03}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{0449D6D2-BE1B-4E29-8E1B-444420802C03}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
|
||||||
|
{0449D6D2-BE1B-4E29-8E1B-444420802C03}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
|
||||||
|
{0449D6D2-BE1B-4E29-8E1B-444420802C03}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||||
|
{0449D6D2-BE1B-4E29-8E1B-444420802C03}.Debug|x86.Build.0 = Debug|Any CPU
|
||||||
|
{0449D6D2-BE1B-4E29-8E1B-444420802C03}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{0449D6D2-BE1B-4E29-8E1B-444420802C03}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{0449D6D2-BE1B-4E29-8E1B-444420802C03}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
|
||||||
|
{0449D6D2-BE1B-4E29-8E1B-444420802C03}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
||||||
|
{0449D6D2-BE1B-4E29-8E1B-444420802C03}.Release|x86.ActiveCfg = Release|Any CPU
|
||||||
|
{0449D6D2-BE1B-4E29-8E1B-444420802C03}.Release|x86.Build.0 = Release|Any CPU
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
||||||
|
|
@ -741,5 +755,6 @@ Global
|
||||||
{AF210F69-9D31-43AF-AC3A-CD366E252218} = {16703B76-C9F7-4C75-AE6C-53D92E308E3C}
|
{AF210F69-9D31-43AF-AC3A-CD366E252218} = {16703B76-C9F7-4C75-AE6C-53D92E308E3C}
|
||||||
{364EC3C6-C9DB-45E0-A0F2-1EE61E4B429B} = {16703B76-C9F7-4C75-AE6C-53D92E308E3C}
|
{364EC3C6-C9DB-45E0-A0F2-1EE61E4B429B} = {16703B76-C9F7-4C75-AE6C-53D92E308E3C}
|
||||||
{BDEEBE09-C0C4-433C-B0B8-8478C9776996} = {16703B76-C9F7-4C75-AE6C-53D92E308E3C}
|
{BDEEBE09-C0C4-433C-B0B8-8478C9776996} = {16703B76-C9F7-4C75-AE6C-53D92E308E3C}
|
||||||
|
{0449D6D2-BE1B-4E29-8E1B-444420802C03} = {3BA657BF-28B1-42DA-B5B0-1C4601FCF7B1}
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
EndGlobal
|
EndGlobal
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,7 @@
|
||||||
|
// 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.Runtime.CompilerServices;
|
||||||
|
|
||||||
|
[assembly: InternalsVisibleTo("Microsoft.AspNet.Mvc.Common.Test")]
|
||||||
|
[assembly: InternalsVisibleTo("Microsoft.AspNet.Mvc.Razor.Host")]
|
||||||
|
|
@ -0,0 +1,58 @@
|
||||||
|
// 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.Linq;
|
||||||
|
|
||||||
|
namespace Microsoft.AspNet.Mvc
|
||||||
|
{
|
||||||
|
internal static class StringHelper
|
||||||
|
{
|
||||||
|
public static string TrimSpacesAndChars(string value, params char[] chars)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrWhiteSpace(value))
|
||||||
|
{
|
||||||
|
return string.Empty;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (chars == null || chars.Length == 0)
|
||||||
|
{
|
||||||
|
return value.Trim();
|
||||||
|
}
|
||||||
|
|
||||||
|
var firstIndex = 0;
|
||||||
|
for (; firstIndex < value.Length; firstIndex++)
|
||||||
|
{
|
||||||
|
var currentChar = value[firstIndex];
|
||||||
|
if (!char.IsWhiteSpace(currentChar) && !chars.Any(compareChar => compareChar == currentChar))
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// We trimmed all the way
|
||||||
|
if (firstIndex == value.Length)
|
||||||
|
{
|
||||||
|
return string.Empty;
|
||||||
|
}
|
||||||
|
|
||||||
|
var lastIndex = value.Length - 1;
|
||||||
|
for (; lastIndex > firstIndex; lastIndex--)
|
||||||
|
{
|
||||||
|
var currentChar = value[lastIndex];
|
||||||
|
if (!char.IsWhiteSpace(currentChar) && !chars.Any(compareChar => compareChar == currentChar))
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (firstIndex == 0 && lastIndex == value.Length - 1)
|
||||||
|
{
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return value.Substring(firstIndex, lastIndex - firstIndex + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -127,8 +127,9 @@ namespace Microsoft.AspNet.Mvc.Razor
|
||||||
.Value
|
.Value
|
||||||
.Substring(typeName.Length);
|
.Substring(typeName.Length);
|
||||||
|
|
||||||
Span.CodeGenerator = new InjectParameterGenerator(typeName.Trim(),
|
// ';' is optional
|
||||||
propertyName.Trim());
|
propertyName = StringHelper.TrimSpacesAndChars(propertyName, ';');
|
||||||
|
Span.CodeGenerator = new InjectParameterGenerator(typeName.Trim(), propertyName);
|
||||||
|
|
||||||
// Output the span and finish the block
|
// Output the span and finish the block
|
||||||
CompleteBlock();
|
CompleteBlock();
|
||||||
|
|
|
||||||
|
|
@ -3,13 +3,16 @@
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
#if !ASPNETCORE50
|
||||||
using Moq;
|
using Moq;
|
||||||
|
#endif
|
||||||
using Xunit;
|
using Xunit;
|
||||||
|
|
||||||
namespace Microsoft.AspNet.Mvc.Core
|
namespace Microsoft.AspNet.Mvc
|
||||||
{
|
{
|
||||||
public class CopyOnWriteDictionaryTest
|
public class CopyOnWriteDictionaryTest
|
||||||
{
|
{
|
||||||
|
#if !ASPNETCORE50
|
||||||
[Fact]
|
[Fact]
|
||||||
public void ReadOperation_DelegatesToSourceDictionary_IfNoMutationsArePerformed()
|
public void ReadOperation_DelegatesToSourceDictionary_IfNoMutationsArePerformed()
|
||||||
{
|
{
|
||||||
|
|
@ -49,6 +52,7 @@ namespace Microsoft.AspNet.Mvc.Core
|
||||||
Assert.False(copyOnWriteDictionary.TryGetValue("different-key", out value));
|
Assert.False(copyOnWriteDictionary.TryGetValue("different-key", out value));
|
||||||
sourceDictionary.Verify();
|
sourceDictionary.Verify();
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public void ReadOperation_DoesNotDelegateToSourceDictionary_OnceAValueIsChanged()
|
public void ReadOperation_DoesNotDelegateToSourceDictionary_OnceAValueIsChanged()
|
||||||
|
|
@ -0,0 +1,17 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<PropertyGroup>
|
||||||
|
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">14.0</VisualStudioVersion>
|
||||||
|
<VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VSToolsPath)\AspNet\Microsoft.Web.AspNet.Props" Condition="'$(VSToolsPath)' != ''" />
|
||||||
|
<PropertyGroup Label="Globals">
|
||||||
|
<ProjectGuid>0449d6d2-be1b-4e29-8e1b-444420802c03</ProjectGuid>
|
||||||
|
<BaseIntermediateOutputPath Condition="'$(BaseIntermediateOutputPath)'=='' ">..\..\artifacts\obj\$(MSBuildProjectName)</BaseIntermediateOutputPath>
|
||||||
|
<OutputPath Condition="'$(OutputPath)'=='' ">..\..\artifacts\bin\$(MSBuildProjectName)\</OutputPath>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup>
|
||||||
|
<SchemaVersion>2.0</SchemaVersion>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VSToolsPath)\AspNet\Microsoft.Web.AspNet.targets" Condition="'$(VSToolsPath)' != ''" />
|
||||||
|
</Project>
|
||||||
|
|
@ -16,10 +16,10 @@ namespace Microsoft.AspNet.Mvc
|
||||||
{
|
{
|
||||||
// Arrange
|
// Arrange
|
||||||
var anonymous = new { foo = "bar" };
|
var anonymous = new { foo = "bar" };
|
||||||
PropertyInfo property = anonymous.GetType().GetProperties().First();
|
var property = PropertyHelper.GetProperties(anonymous.GetType()).First().Property;
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
PropertyHelper helper = new PropertyHelper(property);
|
var helper = new PropertyHelper(property);
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
Assert.Equal("foo", property.Name);
|
Assert.Equal("foo", property.Name);
|
||||||
|
|
@ -31,10 +31,10 @@ namespace Microsoft.AspNet.Mvc
|
||||||
{
|
{
|
||||||
// Arrange
|
// Arrange
|
||||||
var anonymous = new { bar = "baz" };
|
var anonymous = new { bar = "baz" };
|
||||||
PropertyInfo property = anonymous.GetType().GetProperties().First();
|
var property = PropertyHelper.GetProperties(anonymous.GetType()).First().Property;
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
PropertyHelper helper = new PropertyHelper(property);
|
var helper = new PropertyHelper(property);
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
Assert.Equal("bar", helper.Name);
|
Assert.Equal("bar", helper.Name);
|
||||||
|
|
@ -46,7 +46,7 @@ namespace Microsoft.AspNet.Mvc
|
||||||
{
|
{
|
||||||
// Arrange
|
// Arrange
|
||||||
var anonymous = new { foo = 32 };
|
var anonymous = new { foo = 32 };
|
||||||
var property = anonymous.GetType().GetProperties().First();
|
var property = PropertyHelper.GetProperties(anonymous.GetType()).First().Property;
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
var helper = new PropertyHelper(property);
|
var helper = new PropertyHelper(property);
|
||||||
|
|
@ -0,0 +1,97 @@
|
||||||
|
// 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 Xunit;
|
||||||
|
|
||||||
|
namespace Microsoft.AspNet.Mvc
|
||||||
|
{
|
||||||
|
public class StringHelperTest
|
||||||
|
{
|
||||||
|
public static TheoryData TrimSpacesAndCharsData
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
// input, trimCharacters, expectedOutput
|
||||||
|
return new TheoryData<string, char[], string>
|
||||||
|
{
|
||||||
|
{ "abcd", new char[] { }, "abcd" },
|
||||||
|
{ " /.", new char[] { '/', '.' }, string.Empty },
|
||||||
|
{ string.Empty, new char[] { }, string.Empty },
|
||||||
|
{ " ", new char[] { }, string.Empty },
|
||||||
|
{ " ", new char[] { }, string.Empty },
|
||||||
|
{ " / ", new char[] { '/' }, string.Empty },
|
||||||
|
{ " \t ", new char[] { '/' }, string.Empty },
|
||||||
|
{ " ", new char[] { '/' }, string.Empty },
|
||||||
|
{ " ", new char[] { '/' }, string.Empty },
|
||||||
|
{ "/", new char[] { '/' }, string.Empty },
|
||||||
|
{ "//", new char[] { '/' }, string.Empty },
|
||||||
|
{ "// ", new char[] { '/' }, string.Empty },
|
||||||
|
{ "/ ", new char[] { '/' }, string.Empty },
|
||||||
|
{ " a ", new char[] { }, "a" },
|
||||||
|
{ " a", new char[] { }, "a" },
|
||||||
|
{ "a ", new char[] { }, "a" },
|
||||||
|
{ " a ", new char[] { }, "a" },
|
||||||
|
{ " a \n\r", new char[] { }, "a" },
|
||||||
|
{ "\t\r a ", new char[] { }, "a" },
|
||||||
|
{ "\ta ", new char[] { }, "a" },
|
||||||
|
{ " a a ", new char[] { }, "a a" },
|
||||||
|
{ " a ", new char[] { '/' }, "a" },
|
||||||
|
{ " a", new char[] { '/' }, "a" },
|
||||||
|
{ "a ", new char[] { '/' }, "a" },
|
||||||
|
{ " a ", new char[] { '/' }, "a" },
|
||||||
|
{ " a \n\r", new char[] { '/' }, "a" },
|
||||||
|
{ "\t\r a ", new char[] { '/' }, "a" },
|
||||||
|
{ "\ta ", new char[] { '/' }, "a" },
|
||||||
|
{ " a a ", new char[] { '/' }, "a a" },
|
||||||
|
{ " a ", new char[] { '/', ' ' }, "a" },
|
||||||
|
{ " a", new char[] { '/', ' ' }, "a" },
|
||||||
|
{ "a ", new char[] { '/', ' ' }, "a" },
|
||||||
|
{ " a ", new char[] { '/', ' ' }, "a" },
|
||||||
|
{ " a \n\r", new char[] { '/', ' ' }, "a" },
|
||||||
|
{ "\t\r a ", new char[] { '/', ' ' }, "a" },
|
||||||
|
{ "\ta ", new char[] { '/', ' ' }, "a" },
|
||||||
|
{ " a a ", new char[] { '/', ' ' }, "a a" },
|
||||||
|
{ "/ a ", new char[] { '/' }, "a" },
|
||||||
|
{ " / a", new char[] { '/' }, "a" },
|
||||||
|
{ "a / /", new char[] { '/' }, "a" },
|
||||||
|
{ " a // //", new char[] { '/' }, "a" },
|
||||||
|
{ " a \n\r//", new char[] { '/' }, "a" },
|
||||||
|
{ "////\t\r a ", new char[] { '/' }, "a" },
|
||||||
|
{ "\ta /", new char[] { '/' }, "a" },
|
||||||
|
{ " a/ a ", new char[] { '/' }, "a/ a" },
|
||||||
|
{ "/ a ", new char[] { '/', ' ' }, "a" },
|
||||||
|
{ " / a", new char[] { '/', ' ' }, "a" },
|
||||||
|
{ "a / /", new char[] { '/', ' ' }, "a" },
|
||||||
|
{ " a // //", new char[] { '/', ' ' }, "a" },
|
||||||
|
{ " a \n\r//", new char[] { '/', ' ' }, "a" },
|
||||||
|
{ "////\t\r a ", new char[] { '/', ' ' }, "a" },
|
||||||
|
{ "\ta /", new char[] { '/', ' ' }, "a" },
|
||||||
|
{ " a/ a ", new char[] { '/', ' ' }, "a/ a" },
|
||||||
|
{ " a /.", new char[] { '/', '.' }, "a" },
|
||||||
|
{ " a", new char[] { '/', '.' }, "a" },
|
||||||
|
{ "/. ./a ", new char[] { '/', '.' }, "a" },
|
||||||
|
{ " a ", new char[] { '/', '.' }, "a" },
|
||||||
|
{ " a \n\r", new char[] { '/', '.' }, "a" },
|
||||||
|
{ "\t\r a ", new char[] { '/', '.' }, "a" },
|
||||||
|
{ "\ta ", new char[] { '/', '.' }, "a" },
|
||||||
|
{ "///..a/./a /. ./....", new char[] { '/', '.' }, "a/./a" },
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[Theory]
|
||||||
|
[MemberData(nameof(TrimSpacesAndCharsData))]
|
||||||
|
public void TrimSpacesAndChars_GeneratesExpectedOutput(
|
||||||
|
string input,
|
||||||
|
char[] trimCharacters,
|
||||||
|
string expectedOutput)
|
||||||
|
{
|
||||||
|
// Arrange & Act
|
||||||
|
var output = StringHelper.TrimSpacesAndChars(input, trimCharacters);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.Equal(expectedOutput, output, StringComparer.Ordinal);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -5,7 +5,7 @@ using System;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Xunit;
|
using Xunit;
|
||||||
|
|
||||||
namespace Microsoft.AspNet.Mvc.Internal
|
namespace Microsoft.AspNet.Mvc
|
||||||
{
|
{
|
||||||
public class TaskHelperTest
|
public class TaskHelperTest
|
||||||
{
|
{
|
||||||
|
|
@ -7,7 +7,7 @@ using Xunit;
|
||||||
|
|
||||||
namespace Microsoft.AspNet.Mvc
|
namespace Microsoft.AspNet.Mvc
|
||||||
{
|
{
|
||||||
public class TypeExtensionTests
|
public class TypeExtensionsTest
|
||||||
{
|
{
|
||||||
[Theory]
|
[Theory]
|
||||||
[InlineData(typeof(decimal))]
|
[InlineData(typeof(decimal))]
|
||||||
|
|
@ -0,0 +1,21 @@
|
||||||
|
{
|
||||||
|
"compilationOptions": {
|
||||||
|
"warningsAsErrors": "true"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"Microsoft.AspNet.Mvc.Common": "6.0.0-*",
|
||||||
|
"xunit.runner.kre": "1.0.0-*",
|
||||||
|
"Microsoft.AspNet.Testing": "1.0.0-*"
|
||||||
|
},
|
||||||
|
"commands": {
|
||||||
|
"test": "xunit.runner.kre"
|
||||||
|
},
|
||||||
|
"frameworks": {
|
||||||
|
"aspnet50": {
|
||||||
|
"dependencies": {
|
||||||
|
"Moq": "4.2.1312.1622"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"aspnetcore50": { }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -272,6 +272,50 @@ namespace Microsoft.AspNet.Mvc.Razor
|
||||||
Assert.Empty(errors);
|
Assert.Empty(errors);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Theory]
|
||||||
|
[InlineData("IMyService Service;", "IMyService", "Service")]
|
||||||
|
[InlineData("IMyService Service;;", "IMyService", "Service")]
|
||||||
|
[InlineData(" Microsoft.AspNet.Mvc.IHtmlHelper<MyNullableModel[]?> MyHelper; ",
|
||||||
|
"Microsoft.AspNet.Mvc.IHtmlHelper<MyNullableModel[]?>", "MyHelper")]
|
||||||
|
[InlineData(" Microsoft.AspNet.Mvc.IHtmlHelper<MyNullableModel[]?> MyHelper; ; ",
|
||||||
|
"Microsoft.AspNet.Mvc.IHtmlHelper<MyNullableModel[]?>", "MyHelper")]
|
||||||
|
[InlineData(" TestService @class; ; ", "TestService", "@class")]
|
||||||
|
[InlineData("IMyService Service ;", "IMyService", "Service")]
|
||||||
|
[InlineData("IMyService Service ; ;", "IMyService", "Service")]
|
||||||
|
[InlineData(" Microsoft.AspNet.Mvc.IHtmlHelper<MyNullableModel[]?> MyHelper ; ",
|
||||||
|
"Microsoft.AspNet.Mvc.IHtmlHelper<MyNullableModel[]?>", "MyHelper")]
|
||||||
|
[InlineData(" Microsoft.AspNet.Mvc.IHtmlHelper<MyNullableModel[]?> MyHelper ; ; ",
|
||||||
|
"Microsoft.AspNet.Mvc.IHtmlHelper<MyNullableModel[]?>", "MyHelper")]
|
||||||
|
[InlineData(" TestService @class ; ", "TestService", "@class")]
|
||||||
|
[InlineData(" TestService @class ; ; ", "TestService", "@class")]
|
||||||
|
public void ParseInjectKeyword_AllowsOptionalTrailingSemicolon(
|
||||||
|
string injectStatement,
|
||||||
|
string expectedService,
|
||||||
|
string expectedPropertyName)
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var documentContent = "@inject " + injectStatement;
|
||||||
|
var factory = SpanFactory.CreateCsHtml();
|
||||||
|
var errors = new List<RazorError>();
|
||||||
|
var expectedSpans = new Span[]
|
||||||
|
{
|
||||||
|
factory.EmptyHtml(),
|
||||||
|
factory.CodeTransition(SyntaxConstants.TransitionString)
|
||||||
|
.Accepts(AcceptedCharacters.None),
|
||||||
|
factory.MetaCode("inject ")
|
||||||
|
.Accepts(AcceptedCharacters.None),
|
||||||
|
factory.Code(injectStatement)
|
||||||
|
.As(new InjectParameterGenerator(expectedService, expectedPropertyName))
|
||||||
|
};
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var spans = ParseDocument(documentContent, errors);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.Equal(expectedSpans, spans);
|
||||||
|
Assert.Empty(errors);
|
||||||
|
}
|
||||||
|
|
||||||
[Theory]
|
[Theory]
|
||||||
[InlineData("IMyService Service ", "IMyService", "Service")]
|
[InlineData("IMyService Service ", "IMyService", "Service")]
|
||||||
[InlineData(" TestService @namespace ", "TestService", "@namespace")]
|
[InlineData(" TestService @namespace ", "TestService", "@namespace")]
|
||||||
|
|
|
||||||
|
|
@ -79,6 +79,7 @@ namespace Microsoft.AspNet.Mvc.Razor
|
||||||
[InlineData("Basic")]
|
[InlineData("Basic")]
|
||||||
[InlineData("Inject")]
|
[InlineData("Inject")]
|
||||||
[InlineData("InjectWithModel")]
|
[InlineData("InjectWithModel")]
|
||||||
|
[InlineData("InjectWithSemicolon")]
|
||||||
[InlineData("Model")]
|
[InlineData("Model")]
|
||||||
[InlineData("ModelExpressionTagHelper")]
|
[InlineData("ModelExpressionTagHelper")]
|
||||||
public void MvcRazorHost_ParsesAndGeneratesCodeForBasicScenarios(string scenarioName)
|
public void MvcRazorHost_ParsesAndGeneratesCodeForBasicScenarios(string scenarioName)
|
||||||
|
|
@ -129,6 +130,28 @@ namespace Microsoft.AspNet.Mvc.Razor
|
||||||
RunDesignTimeTest(host, "InjectWithModel", expectedLineMappings);
|
RunDesignTimeTest(host, "InjectWithModel", expectedLineMappings);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void InjectVisitorWithSemicolon_GeneratesCorrectLineMappings()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var host = new MvcRazorHost(new TestFileProvider())
|
||||||
|
{
|
||||||
|
DesignTimeMode = true
|
||||||
|
};
|
||||||
|
host.NamespaceImports.Clear();
|
||||||
|
var expectedLineMappings = new[]
|
||||||
|
{
|
||||||
|
BuildLineMapping(7, 0, 7, 222, 6, 7, 7),
|
||||||
|
BuildLineMapping(24, 1, 8, 729, 26, 8, 20),
|
||||||
|
BuildLineMapping(58, 2, 8, 941, 34, 8, 23),
|
||||||
|
BuildLineMapping(93, 3, 8, 1156, 42, 8, 21),
|
||||||
|
BuildLineMapping(129, 4, 8, 1369, 50, 8, 24),
|
||||||
|
};
|
||||||
|
|
||||||
|
// Act and Assert
|
||||||
|
RunDesignTimeTest(host, "InjectWithSemicolon", expectedLineMappings);
|
||||||
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public void ModelVisitor_GeneratesCorrectLineMappings()
|
public void ModelVisitor_GeneratesCorrectLineMappings()
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,5 @@
|
||||||
|
@model MyModel
|
||||||
|
@inject MyApp MyPropertyName;
|
||||||
|
@inject MyService<TModel> Html;
|
||||||
|
@inject MyApp MyPropertyName2 ;
|
||||||
|
@inject MyService<TModel> Html2 ;
|
||||||
|
|
@ -0,0 +1,69 @@
|
||||||
|
namespace Asp
|
||||||
|
{
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
public class ASPV_TestFiles_Input_InjectWithSemicolon_cshtml : Microsoft.AspNet.Mvc.Razor.RazorPage<
|
||||||
|
#line 1 "TestFiles/Input/InjectWithSemicolon.cshtml"
|
||||||
|
MyModel
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
>
|
||||||
|
{
|
||||||
|
private static object @__o;
|
||||||
|
private void @__RazorDesignTimeHelpers__()
|
||||||
|
{
|
||||||
|
#pragma warning disable 219
|
||||||
|
#pragma warning restore 219
|
||||||
|
}
|
||||||
|
#line hidden
|
||||||
|
public ASPV_TestFiles_Input_InjectWithSemicolon_cshtml()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
#line hidden
|
||||||
|
[Microsoft.AspNet.Mvc.ActivateAttribute]
|
||||||
|
public
|
||||||
|
#line 2 "TestFiles/Input/InjectWithSemicolon.cshtml"
|
||||||
|
MyApp MyPropertyName
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
{ get; private set; }
|
||||||
|
[Microsoft.AspNet.Mvc.ActivateAttribute]
|
||||||
|
public
|
||||||
|
#line 3 "TestFiles/Input/InjectWithSemicolon.cshtml"
|
||||||
|
MyService<MyModel> Html
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
{ get; private set; }
|
||||||
|
[Microsoft.AspNet.Mvc.ActivateAttribute]
|
||||||
|
public
|
||||||
|
#line 4 "TestFiles/Input/InjectWithSemicolon.cshtml"
|
||||||
|
MyApp MyPropertyName2
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
{ get; private set; }
|
||||||
|
[Microsoft.AspNet.Mvc.ActivateAttribute]
|
||||||
|
public
|
||||||
|
#line 5 "TestFiles/Input/InjectWithSemicolon.cshtml"
|
||||||
|
MyService<MyModel> Html2
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
{ get; private set; }
|
||||||
|
[Microsoft.AspNet.Mvc.ActivateAttribute]
|
||||||
|
public Microsoft.AspNet.Mvc.IViewComponentHelper Component { get; private set; }
|
||||||
|
[Microsoft.AspNet.Mvc.ActivateAttribute]
|
||||||
|
public Microsoft.AspNet.Mvc.IUrlHelper Url { get; private set; }
|
||||||
|
|
||||||
|
#line hidden
|
||||||
|
|
||||||
|
#pragma warning disable 1998
|
||||||
|
public override async Task ExecuteAsync()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
#pragma warning restore 1998
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,45 @@
|
||||||
|
#pragma checksum "TestFiles/Input/InjectWithSemicolon.cshtml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "b753615982659a9805e6213ceced76ba06782038"
|
||||||
|
namespace Asp
|
||||||
|
{
|
||||||
|
using System;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using Microsoft.AspNet.Mvc;
|
||||||
|
using Microsoft.AspNet.Mvc.Rendering;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
public class ASPV_TestFiles_Input_InjectWithSemicolon_cshtml : Microsoft.AspNet.Mvc.Razor.RazorPage<
|
||||||
|
#line 1 "TestFiles/Input/InjectWithSemicolon.cshtml"
|
||||||
|
MyModel
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
>
|
||||||
|
{
|
||||||
|
#line hidden
|
||||||
|
public ASPV_TestFiles_Input_InjectWithSemicolon_cshtml()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
#line hidden
|
||||||
|
[Microsoft.AspNet.Mvc.ActivateAttribute]
|
||||||
|
public MyApp MyPropertyName { get; private set; }
|
||||||
|
[Microsoft.AspNet.Mvc.ActivateAttribute]
|
||||||
|
public MyService<MyModel> Html { get; private set; }
|
||||||
|
[Microsoft.AspNet.Mvc.ActivateAttribute]
|
||||||
|
public MyApp MyPropertyName2 { get; private set; }
|
||||||
|
[Microsoft.AspNet.Mvc.ActivateAttribute]
|
||||||
|
public MyService<MyModel> Html2 { get; private set; }
|
||||||
|
[Microsoft.AspNet.Mvc.ActivateAttribute]
|
||||||
|
public Microsoft.AspNet.Mvc.IViewComponentHelper Component { get; private set; }
|
||||||
|
[Microsoft.AspNet.Mvc.ActivateAttribute]
|
||||||
|
public Microsoft.AspNet.Mvc.IUrlHelper Url { get; private set; }
|
||||||
|
|
||||||
|
#line hidden
|
||||||
|
|
||||||
|
#pragma warning disable 1998
|
||||||
|
public override async Task ExecuteAsync()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
#pragma warning restore 1998
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue