Skip to content
This repository has been archived by the owner on Dec 14, 2018. It is now read-only.

Commit

Permalink
Upgrade Roslyn dependency to 2.0.0.
Browse files Browse the repository at this point in the history
- Added C# 7 unit and functional test to validate features work end-to-end.

#6149
  • Loading branch information
NTaylorMullen committed Apr 21, 2017
1 parent 025870e commit 83faaeb
Show file tree
Hide file tree
Showing 8 changed files with 116 additions and 6 deletions.
2 changes: 1 addition & 1 deletion build/dependencies.props
Expand Up @@ -8,7 +8,7 @@
<JsonNetBsonVersion>1.0.1</JsonNetBsonVersion>
<MoqVersion>4.7.1</MoqVersion>
<NetStandardImplicitPackageVersion>1.6.1</NetStandardImplicitPackageVersion>
<RoslynVersion>1.3.0</RoslynVersion>
<RoslynVersion>2.0.0</RoslynVersion>
<RuntimeFrameworkVersion>2.0.0-*</RuntimeFrameworkVersion>
<TestSdkVersion>15.0.0</TestSdkVersion>
<WebApiClientVersion>5.2.2</WebApiClientVersion>
Expand Down
Expand Up @@ -16,7 +16,7 @@ namespace Microsoft.AspNetCore.Mvc.Razor
/// </summary>
public class RazorViewEngineOptions
{
private CSharpParseOptions _parseOptions = new CSharpParseOptions(LanguageVersion.CSharp6);
private CSharpParseOptions _parseOptions = new CSharpParseOptions(LanguageVersion.CSharp7);
private CSharpCompilationOptions _compilationOptions =
new CSharpCompilationOptions(CodeAnalysis.OutputKind.DynamicallyLinkedLibrary);
private Action<RoslynCompilationContext> _compilationCallback = c => { };
Expand Down
24 changes: 24 additions & 0 deletions test/Microsoft.AspNetCore.Mvc.FunctionalTests/BasicTests.cs
Expand Up @@ -30,6 +30,30 @@ public BasicTests(MvcTestFixture<BasicWebSite.Startup> fixture)

public HttpClient Client { get; }

[Fact]
public async Task CanRender_CSharp7Views()
{
// Arrange
var expectedMediaType = MediaTypeHeaderValue.Parse("text/html; charset=utf-8");
var outputFile = "compiler/resources/BasicWebSite.Home.CSharp7View.html";
var expectedContent =
await ResourceFile.ReadResourceAsync(_resourcesAssembly, outputFile, sourceFile: false);

// Act
var response = await Client.GetAsync("Home/CSharp7View");
var responseContent = await response.Content.ReadAsStringAsync();

// Assert
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
Assert.Equal(expectedMediaType, response.Content.Headers.ContentType);

#if GENERATE_BASELINES
ResourceFile.UpdateFile(_resourcesAssembly, outputFile, expectedContent, responseContent);
#else
Assert.Equal(expectedContent, responseContent, ignoreLineEndingDifferences: true);
#endif
}

[Fact]
public async Task CanRender_ViewComponentWithArgumentsFromController()
{
Expand Down
@@ -0,0 +1,19 @@

<p>
<strong>John Doe's</strong> favorite number is

<em>
(double) 6.02214085774747E&#x2B;23 </em>
</p>
<p>
<strong>John Smith's</strong> favorite number is

<em>
(long) 100000000000 </em>
</p>
<p>
<strong>Someone Nice's</strong> favorite number is

<em>
(decimal) 1.6180339887498948482045868344 </em>
</p>
Expand Up @@ -2,9 +2,7 @@
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.

using System;
using System.IO;
using System.Reflection;
using System.Text;
using Microsoft.AspNetCore.Mvc.ApplicationParts;
using Microsoft.AspNetCore.Mvc.Razor.Compilation;
using Microsoft.AspNetCore.Razor.Language;
Expand All @@ -19,6 +17,38 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Internal
{
public class DefaultRoslynCompilationServiceTest
{
[Fact]
public void Compile_SucceedsForCSharp7()
{
// Arrange
var content = @"
public class MyTestType
{
private string _name;
public string Name
{
get => _name;
set => _name = value ?? throw new System.ArgumentNullException(nameof(value));
}
}";
var compilationService = GetRoslynCompilationService();

var codeDocument = RazorCodeDocument.Create(RazorSourceDocument.Create("Hello world", "test.cshtml"));

var csharpDocument = new RazorCSharpDocument()
{
GeneratedCode = content
};

// Act
var result = compilationService.Compile(codeDocument, csharpDocument);

// Assert
Assert.Equal("MyTestType", result.CompiledType.Name);
Assert.Null(result.CompilationFailures);
}

[Fact]
public void Compile_ReturnsCompilationResult()
{
Expand Down Expand Up @@ -219,7 +249,7 @@ public void Compile_RunsCallback()
RoslynCompilationContext usedCompilation = null;
var options = GetOptions(c => usedCompilation = c);
var compilationService = GetRoslynCompilationService(options: options);

var codeDocument = RazorCodeDocument.Create(RazorSourceDocument.Create("Hello world", "some-relative-path"));

var csharpDocument = new RazorCSharpDocument()
Expand Down
Expand Up @@ -99,7 +99,7 @@ public void Configure_UsesDefaultCompilationOptions()
});

Assert.Empty(parseOptions.PreprocessorSymbolNames);
Assert.Equal(LanguageVersion.CSharp6, parseOptions.LanguageVersion);
Assert.Equal(LanguageVersion.CSharp7, parseOptions.LanguageVersion);
}

[Fact]
Expand Down
13 changes: 13 additions & 0 deletions test/WebSites/BasicWebSite/Controllers/HomeController.cs
@@ -1,6 +1,7 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.

using System.Collections.Generic;
using System.Threading.Tasks;
using BasicWebSite.Models;
using Microsoft.AspNetCore.Http;
Expand All @@ -16,6 +17,18 @@ public IActionResult Index()
return View();
}

public IActionResult CSharp7View()
{
var people = new List<(string FirstName, string LastName, object FavoriteNumber)>()
{
("John", "Doe", 6.022_140_857_747_474e23),
("John", "Smith", 100_000_000_000),
("Someone", "Nice", (decimal)1.618_033_988_749_894_848_204_586_834_365_638_117_720_309_179M),
};

return View(people);
}

// Keep the return type as object to ensure that we don't
// wrap IActionResult instances into ObjectResults.
public object PlainView()
Expand Down
24 changes: 24 additions & 0 deletions test/WebSites/BasicWebSite/Views/Home/CSharp7View.cshtml
@@ -0,0 +1,24 @@
@model IEnumerable<(string FirstName, string LastName, object FavoriteNumber)>

@foreach (var person in Model)
{
<p>
<strong>@person.FirstName @person.LastName's</strong> favorite number is

<em>
@switch (person.FavoriteNumber)
{
case double doubleVal:
<text>(double) @doubleVal</text>
break;
case long longVal:
<text>(long) @longVal</text>
break;
case decimal longVal:
<text>(decimal) @longVal</text>
break;

}
</em>
</p>
}

0 comments on commit 83faaeb

Please sign in to comment.