Skip to content

Commit ff5c526

Browse files
Clean up Version1_X tests
Update all "pass" tests in MS.ANC.Mvc.Razor.Extensions.Version1_X to create code documents from a project engine to ensure that options flow correctly. Note: ModelDirectiveTest contains a tweak to a couple of test assertions to be correct, now that design-time code paths are taken.
1 parent 4d5954c commit ff5c526

File tree

9 files changed

+734
-833
lines changed

9 files changed

+734
-833
lines changed
Lines changed: 38 additions & 110 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,45 @@
11
// Licensed to the .NET Foundation under one or more agreements.
22
// The .NET Foundation licenses this file to you under the MIT license.
33

4-
#nullable disable
5-
64
using Microsoft.AspNetCore.Razor.Language;
75
using Microsoft.AspNetCore.Razor.Language.Intermediate;
86
using Xunit;
97

108
namespace Microsoft.AspNetCore.Mvc.Razor.Extensions.Version1_X;
119

12-
public class InjectDirectiveTest
10+
public class InjectDirectiveTest : RazorProjectEngineTestBase
1311
{
12+
protected override RazorLanguageVersion Version => RazorLanguageVersion.Version_1_1;
13+
14+
protected override void ConfigureProjectEngine(RazorProjectEngineBuilder builder)
15+
{
16+
// Notice we're not registering the InjectDirective.Pass here so we can run it on demand.
17+
builder.AddDirective(InjectDirective.Directive);
18+
builder.AddDirective(ModelDirective.Directive);
19+
20+
builder.Features.Add(new RazorPageDocumentClassifierPass());
21+
builder.Features.Add(new MvcViewDocumentClassifierPass());
22+
}
23+
24+
protected override void ConfigureProcessor(RazorCodeDocumentProcessor processor)
25+
{
26+
processor.RunPhasesTo<IRazorDocumentClassifierPhase>();
27+
}
28+
1429
[Fact]
1530
public void InjectDirectivePass_Execute_DefinesProperty()
1631
{
1732
// Arrange
18-
var codeDocument = CreateDocument(@"
33+
var processor = CreateAndInitializeCodeDocument(@"
1934
@inject PropertyType PropertyName
2035
");
2136

22-
var engine = CreateEngine();
23-
var pass = new InjectDirective.Pass()
24-
{
25-
Engine = engine,
26-
};
27-
28-
var irDocument = CreateIRDocument(engine, codeDocument);
29-
3037
// Act
31-
pass.Execute(codeDocument, irDocument);
38+
processor.ExecutePass<InjectDirective.Pass>();
39+
var documentNode = processor.GetDocumentNode();
3240

3341
// Assert
34-
var @class = FindClassNode(irDocument);
42+
var @class = documentNode.FindClassNode();
3543
Assert.NotNull(@class);
3644
Assert.Equal(2, @class.Children.Count);
3745

@@ -44,24 +52,17 @@ @inject PropertyType PropertyName
4452
public void InjectDirectivePass_Execute_DedupesPropertiesByName()
4553
{
4654
// Arrange
47-
var codeDocument = CreateDocument(@"
55+
var processor = CreateAndInitializeCodeDocument(@"
4856
@inject PropertyType PropertyName
4957
@inject PropertyType2 PropertyName
5058
");
5159

52-
var engine = CreateEngine();
53-
var pass = new InjectDirective.Pass()
54-
{
55-
Engine = engine,
56-
};
57-
58-
var irDocument = CreateIRDocument(engine, codeDocument);
59-
6060
// Act
61-
pass.Execute(codeDocument, irDocument);
61+
processor.ExecutePass<InjectDirective.Pass>();
62+
var documentNode = processor.GetDocumentNode();
6263

6364
// Assert
64-
var @class = FindClassNode(irDocument);
65+
var @class = documentNode.FindClassNode();
6566
Assert.NotNull(@class);
6667
Assert.Equal(2, @class.Children.Count);
6768

@@ -74,23 +75,16 @@ @inject PropertyType2 PropertyName
7475
public void InjectDirectivePass_Execute_ExpandsTModel_WithDynamic()
7576
{
7677
// Arrange
77-
var codeDocument = CreateDocument(@"
78+
var processor = CreateAndInitializeCodeDocument(@"
7879
@inject PropertyType<TModel> PropertyName
7980
");
8081

81-
var engine = CreateEngine();
82-
var pass = new InjectDirective.Pass()
83-
{
84-
Engine = engine,
85-
};
86-
87-
var irDocument = CreateIRDocument(engine, codeDocument);
88-
8982
// Act
90-
pass.Execute(codeDocument, irDocument);
83+
processor.ExecutePass<InjectDirective.Pass>();
84+
var documentNode = processor.GetDocumentNode();
9185

9286
// Assert
93-
var @class = FindClassNode(irDocument);
87+
var @class = documentNode.FindClassNode();
9488
Assert.NotNull(@class);
9589
Assert.Equal(2, @class.Children.Count);
9690

@@ -103,24 +97,17 @@ @inject PropertyType<TModel> PropertyName
10397
public void InjectDirectivePass_Execute_ExpandsTModel_WithModelTypeFirst()
10498
{
10599
// Arrange
106-
var codeDocument = CreateDocument(@"
100+
var processor = CreateAndInitializeCodeDocument(@"
107101
@model ModelType
108102
@inject PropertyType<TModel> PropertyName
109103
");
110104

111-
var engine = CreateEngine();
112-
var pass = new InjectDirective.Pass()
113-
{
114-
Engine = engine,
115-
};
116-
117-
var irDocument = CreateIRDocument(engine, codeDocument);
118-
119105
// Act
120-
pass.Execute(codeDocument, irDocument);
106+
processor.ExecutePass<InjectDirective.Pass>();
107+
var documentNode = processor.GetDocumentNode();
121108

122109
// Assert
123-
var @class = FindClassNode(irDocument);
110+
var @class = documentNode.FindClassNode();
124111
Assert.NotNull(@class);
125112
Assert.Equal(2, @class.Children.Count);
126113

@@ -133,81 +120,22 @@ @inject PropertyType<TModel> PropertyName
133120
public void InjectDirectivePass_Execute_ExpandsTModel_WithModelType()
134121
{
135122
// Arrange
136-
var codeDocument = CreateDocument(@"
123+
var processor = CreateAndInitializeCodeDocument(@"
137124
@inject PropertyType<TModel> PropertyName
138125
@model ModelType
139126
");
140127

141-
var engine = CreateEngine();
142-
var pass = new InjectDirective.Pass()
143-
{
144-
Engine = engine,
145-
};
146-
147-
var irDocument = CreateIRDocument(engine, codeDocument);
148-
149128
// Act
150-
pass.Execute(codeDocument, irDocument);
129+
processor.ExecutePass<InjectDirective.Pass>();
130+
var documentNode = processor.GetDocumentNode();
151131

152132
// Assert
153-
var @class = FindClassNode(irDocument);
133+
var @class = documentNode.FindClassNode();
154134
Assert.NotNull(@class);
155135
Assert.Equal(2, @class.Children.Count);
156136

157137
var node = Assert.IsType<InjectIntermediateNode>(@class.Children[1]);
158138
Assert.Equal("PropertyType<ModelType>", node.TypeName);
159139
Assert.Equal("PropertyName", node.MemberName);
160140
}
161-
162-
private RazorCodeDocument CreateDocument(string content)
163-
{
164-
var source = RazorSourceDocument.Create(content, "test.cshtml");
165-
return RazorCodeDocument.Create(source);
166-
}
167-
168-
private ClassDeclarationIntermediateNode FindClassNode(IntermediateNode node)
169-
{
170-
var visitor = new ClassNodeVisitor();
171-
visitor.Visit(node);
172-
return visitor.Node;
173-
}
174-
175-
private RazorEngine CreateEngine()
176-
{
177-
var configuration = new RazorConfiguration(RazorLanguageVersion.Version_1_1, "test", Extensions: []);
178-
return RazorProjectEngine.Create(configuration, RazorProjectFileSystem.Empty, b =>
179-
{
180-
// Notice we're not registering the InjectDirective.Pass here so we can run it on demand.
181-
b.AddDirective(InjectDirective.Directive);
182-
b.AddDirective(ModelDirective.Directive);
183-
184-
b.Features.Add(new RazorPageDocumentClassifierPass());
185-
b.Features.Add(new MvcViewDocumentClassifierPass());
186-
}).Engine;
187-
}
188-
189-
private DocumentIntermediateNode CreateIRDocument(RazorEngine engine, RazorCodeDocument codeDocument)
190-
{
191-
foreach (var phase in engine.Phases)
192-
{
193-
phase.Execute(codeDocument);
194-
195-
if (phase is IRazorDocumentClassifierPhase)
196-
{
197-
break;
198-
}
199-
}
200-
201-
return codeDocument.GetDocumentIntermediateNode();
202-
}
203-
204-
private class ClassNodeVisitor : IntermediateNodeWalker
205-
{
206-
public ClassDeclarationIntermediateNode Node { get; set; }
207-
208-
public override void VisitClassDeclaration(ClassDeclarationIntermediateNode node)
209-
{
210-
Node = node;
211-
}
212-
}
213141
}

0 commit comments

Comments
 (0)