Skip to content

Commit ab97efc

Browse files
RazorProjectEngineTestBase: Remove CreateEngine()
There's a RazorProjectEngineTestBase.CreateEngine() method that returns a RazorEngine and is only used by a handful of tests. These tests should be using RazorProjectEngine to create RazorCodeDocuments. So, this change updates those tests and removes CreateEngine(). In addition, several helper methods have been moved to MS.ANC.Razor.Test.Common as extension methods to prepare for further test clean up.
1 parent ae96df5 commit ab97efc

File tree

6 files changed

+218
-149
lines changed

6 files changed

+218
-149
lines changed
Lines changed: 55 additions & 96 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
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;
@@ -13,27 +11,36 @@ public class InjectDirectiveTest : RazorProjectEngineTestBase
1311
{
1412
protected override RazorLanguageVersion Version => RazorLanguageVersion.Version_3_0;
1513

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+
1624
[Fact]
1725
public void InjectDirectivePass_Execute_DefinesProperty()
1826
{
1927
// Arrange
20-
var codeDocument = CreateDocument(@"
28+
var projectEngine = CreateProjectEngine();
29+
30+
var codeDocument = projectEngine.CreateCodeDocument(@"
2131
@inject PropertyType PropertyName
2232
");
33+
var runner = RazorProjectEngineRunner.From(projectEngine, codeDocument);
2334

24-
var engine = CreateEngine();
25-
var pass = new InjectDirective.Pass()
26-
{
27-
Engine = engine,
28-
};
29-
30-
var irDocument = CreateIRDocument(engine, codeDocument);
35+
runner.RunPhasesTo<IRazorDocumentClassifierPhase>();
3136

3237
// Act
33-
pass.Execute(codeDocument, irDocument);
38+
runner.ExecutePass<InjectDirective.Pass>();
39+
40+
var documentNode = codeDocument.GetDocumentIntermediateNode();
3441

3542
// Assert
36-
var @class = FindClassNode(irDocument);
43+
var @class = documentNode.FindClassNode();
3744
Assert.NotNull(@class);
3845
Assert.Equal(2, @class.Children.Count);
3946

@@ -46,24 +53,24 @@ @inject PropertyType PropertyName
4653
public void InjectDirectivePass_Execute_DedupesPropertiesByName()
4754
{
4855
// Arrange
49-
var codeDocument = CreateDocument(@"
56+
var projectEngine = CreateProjectEngine();
57+
58+
var codeDocument = projectEngine.CreateCodeDocument(@"
5059
@inject PropertyType PropertyName
5160
@inject PropertyType2 PropertyName
5261
");
5362

54-
var engine = CreateEngine();
55-
var pass = new InjectDirective.Pass()
56-
{
57-
Engine = engine,
58-
};
63+
var runner = RazorProjectEngineRunner.From(projectEngine, codeDocument);
5964

60-
var irDocument = CreateIRDocument(engine, codeDocument);
65+
runner.RunPhasesTo<IRazorDocumentClassifierPhase>();
6166

6267
// Act
63-
pass.Execute(codeDocument, irDocument);
68+
runner.ExecutePass<InjectDirective.Pass>();
69+
70+
var documentNode = codeDocument.GetDocumentIntermediateNode();
6471

6572
// Assert
66-
var @class = FindClassNode(irDocument);
73+
var @class = documentNode.FindClassNode();
6774
Assert.NotNull(@class);
6875
Assert.Equal(2, @class.Children.Count);
6976

@@ -76,23 +83,23 @@ @inject PropertyType2 PropertyName
7683
public void InjectDirectivePass_Execute_ExpandsTModel_WithDynamic()
7784
{
7885
// Arrange
79-
var codeDocument = CreateDocument(@"
86+
var projectEngine = CreateProjectEngine();
87+
88+
var codeDocument = projectEngine.CreateCodeDocument(@"
8089
@inject PropertyType<TModel> PropertyName
8190
");
8291

83-
var engine = CreateEngine();
84-
var pass = new InjectDirective.Pass()
85-
{
86-
Engine = engine,
87-
};
92+
var runner = RazorProjectEngineRunner.From(projectEngine, codeDocument);
8893

89-
var irDocument = CreateIRDocument(engine, codeDocument);
94+
runner.RunPhasesTo<IRazorDocumentClassifierPhase>();
9095

9196
// Act
92-
pass.Execute(codeDocument, irDocument);
97+
runner.ExecutePass<InjectDirective.Pass>();
98+
99+
var documentNode = codeDocument.GetDocumentIntermediateNode();
93100

94101
// Assert
95-
var @class = FindClassNode(irDocument);
102+
var @class = documentNode.FindClassNode();
96103
Assert.NotNull(@class);
97104
Assert.Equal(2, @class.Children.Count);
98105

@@ -105,24 +112,24 @@ @inject PropertyType<TModel> PropertyName
105112
public void InjectDirectivePass_Execute_ExpandsTModel_WithModelTypeFirst()
106113
{
107114
// Arrange
108-
var codeDocument = CreateDocument(@"
115+
var projectEngine = CreateProjectEngine();
116+
117+
var codeDocument = projectEngine.CreateCodeDocument(@"
109118
@model ModelType
110119
@inject PropertyType<TModel> PropertyName
111120
");
112121

113-
var engine = CreateEngine();
114-
var pass = new InjectDirective.Pass()
115-
{
116-
Engine = engine,
117-
};
122+
var runner = RazorProjectEngineRunner.From(projectEngine, codeDocument);
118123

119-
var irDocument = CreateIRDocument(engine, codeDocument);
124+
runner.RunPhasesTo<IRazorDocumentClassifierPhase>();
120125

121126
// Act
122-
pass.Execute(codeDocument, irDocument);
127+
runner.ExecutePass<InjectDirective.Pass>();
128+
129+
var documentNode = codeDocument.GetDocumentIntermediateNode();
123130

124131
// Assert
125-
var @class = FindClassNode(irDocument);
132+
var @class = documentNode.FindClassNode();
126133
Assert.NotNull(@class);
127134
Assert.Equal(2, @class.Children.Count);
128135

@@ -135,77 +142,29 @@ @inject PropertyType<TModel> PropertyName
135142
public void InjectDirectivePass_Execute_ExpandsTModel_WithModelType()
136143
{
137144
// Arrange
138-
var codeDocument = CreateDocument(@"
145+
var projectEngine = CreateProjectEngine();
146+
147+
var codeDocument = projectEngine.CreateCodeDocument(@"
139148
@inject PropertyType<TModel> PropertyName
140149
@model ModelType
141150
");
142151

143-
var engine = CreateEngine();
144-
var pass = new InjectDirective.Pass()
145-
{
146-
Engine = engine,
147-
};
152+
var runner = RazorProjectEngineRunner.From(projectEngine, codeDocument);
148153

149-
var irDocument = CreateIRDocument(engine, codeDocument);
154+
runner.RunPhasesTo<IRazorDocumentClassifierPhase>();
150155

151156
// Act
152-
pass.Execute(codeDocument, irDocument);
157+
runner.ExecutePass<InjectDirective.Pass>();
158+
159+
var documentNode = codeDocument.GetDocumentIntermediateNode();
153160

154161
// Assert
155-
var @class = FindClassNode(irDocument);
162+
var @class = documentNode.FindClassNode();
156163
Assert.NotNull(@class);
157164
Assert.Equal(2, @class.Children.Count);
158165

159166
var node = Assert.IsType<InjectIntermediateNode>(@class.Children[1]);
160167
Assert.Equal("PropertyType<ModelType>", node.TypeName);
161168
Assert.Equal("PropertyName", node.MemberName);
162169
}
163-
164-
private RazorCodeDocument CreateDocument(string content)
165-
{
166-
var source = RazorSourceDocument.Create(content, "test.cshtml");
167-
return RazorCodeDocument.Create(source);
168-
}
169-
170-
private ClassDeclarationIntermediateNode FindClassNode(IntermediateNode node)
171-
{
172-
var visitor = new ClassNodeVisitor();
173-
visitor.Visit(node);
174-
return visitor.Node;
175-
}
176-
177-
protected override void ConfigureProjectEngine(RazorProjectEngineBuilder builder)
178-
{
179-
// Notice we're not registering the InjectDirective.Pass here so we can run it on demand.
180-
builder.AddDirective(InjectDirective.Directive);
181-
builder.AddDirective(ModelDirective.Directive);
182-
183-
builder.Features.Add(new RazorPageDocumentClassifierPass());
184-
builder.Features.Add(new MvcViewDocumentClassifierPass());
185-
}
186-
187-
private DocumentIntermediateNode CreateIRDocument(RazorEngine engine, RazorCodeDocument codeDocument)
188-
{
189-
foreach (var phase in engine.Phases)
190-
{
191-
phase.Execute(codeDocument);
192-
193-
if (phase is IRazorDocumentClassifierPhase)
194-
{
195-
break;
196-
}
197-
}
198-
199-
return codeDocument.GetDocumentIntermediateNode();
200-
}
201-
202-
private class ClassNodeVisitor : IntermediateNodeWalker
203-
{
204-
public ClassDeclarationIntermediateNode Node { get; set; }
205-
206-
public override void VisitClassDeclaration(ClassDeclarationIntermediateNode node)
207-
{
208-
Node = node;
209-
}
210-
}
211170
}
Lines changed: 16 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
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.Intermediate;
75
using Xunit;
86
using static Microsoft.AspNetCore.Razor.Language.Intermediate.IntermediateNodeAssert;
@@ -17,75 +15,48 @@ public class InheritsDirectivePassTest : RazorProjectEngineTestBase
1715
public void Execute_SkipsDocumentWithNoClassNode()
1816
{
1917
// Arrange
20-
var engine = CreateEngine();
21-
var pass = new InheritsDirectivePass()
22-
{
23-
Engine = engine,
24-
};
25-
26-
var sourceDocument = TestRazorSourceDocument.Create("@inherits Hello<World[]>");
27-
var codeDocument = RazorCodeDocument.Create(sourceDocument);
18+
var projectEngine = CreateProjectEngine();
19+
var codeDocument = projectEngine.CreateCodeDocument("@inherits Hello<World[]>");
20+
var runner = RazorProjectEngineRunner.From(projectEngine, codeDocument);
2821

29-
var irDocument = new DocumentIntermediateNode();
30-
irDocument.Children.Add(new DirectiveIntermediateNode() { Directive = FunctionsDirective.Directive, });
22+
var documentNode = new DocumentIntermediateNode();
23+
documentNode.Children.Add(new DirectiveIntermediateNode() { Directive = FunctionsDirective.Directive, });
3124

3225
// Act
33-
pass.Execute(codeDocument, irDocument);
26+
runner.ExecutePass<InheritsDirectivePass>(documentNode);
3427

3528
// Assert
3629
Children(
37-
irDocument,
30+
documentNode,
3831
node => Assert.IsType<DirectiveIntermediateNode>(node));
3932
}
4033

4134
[Fact]
4235
public void Execute_Inherits_SetsClassDeclarationBaseType()
4336
{
4437
// Arrange
45-
var engine = CreateEngine();
46-
var pass = new InheritsDirectivePass()
47-
{
48-
Engine = engine,
49-
};
50-
51-
var content = "@inherits Hello<World[]>";
52-
var sourceDocument = TestRazorSourceDocument.Create(content);
53-
var codeDocument = RazorCodeDocument.Create(sourceDocument);
38+
var projectEngine = CreateProjectEngine();
39+
var codeDocument = projectEngine.CreateCodeDocument("@inherits Hello<World[]>");
40+
var runner = RazorProjectEngineRunner.From(projectEngine, codeDocument);
5441

55-
var irDocument = Lower(codeDocument, engine);
42+
runner.RunPhasesTo<IRazorDocumentClassifierPhase>();
5643

5744
// Act
58-
pass.Execute(codeDocument, irDocument);
45+
runner.ExecutePass<InheritsDirectivePass>();
46+
47+
var documentNode = codeDocument.GetDocumentIntermediateNode();
5948

6049
// Assert
6150
Children(
62-
irDocument,
51+
documentNode,
6352
node => Assert.IsType<NamespaceDeclarationIntermediateNode>(node));
6453

65-
var @namespace = irDocument.Children[0];
54+
var @namespace = documentNode.Children[0];
6655
Children(
6756
@namespace,
6857
node => Assert.IsType<ClassDeclarationIntermediateNode>(node));
6958

7059
var @class = (ClassDeclarationIntermediateNode)@namespace.Children[0];
7160
Assert.Equal("Hello<World[]>", @class.BaseType.BaseType.Content);
7261
}
73-
74-
private static DocumentIntermediateNode Lower(RazorCodeDocument codeDocument, RazorEngine engine)
75-
{
76-
foreach (var phase in engine.Phases)
77-
{
78-
phase.Execute(codeDocument);
79-
80-
if (phase is IRazorDocumentClassifierPhase)
81-
{
82-
break;
83-
}
84-
}
85-
86-
var irDocument = codeDocument.GetDocumentIntermediateNode();
87-
Assert.NotNull(irDocument);
88-
89-
return irDocument;
90-
}
9162
}

0 commit comments

Comments
 (0)