1
1
// Licensed to the .NET Foundation under one or more agreements.
2
2
// The .NET Foundation licenses this file to you under the MIT license.
3
3
4
- #nullable disable
5
-
6
4
using Microsoft . AspNetCore . Razor . Language ;
7
5
using Microsoft . AspNetCore . Razor . Language . Intermediate ;
8
6
using Xunit ;
@@ -13,27 +11,36 @@ public class InjectDirectiveTest : RazorProjectEngineTestBase
13
11
{
14
12
protected override RazorLanguageVersion Version => RazorLanguageVersion . Version_3_0 ;
15
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
+
16
24
[ Fact ]
17
25
public void InjectDirectivePass_Execute_DefinesProperty ( )
18
26
{
19
27
// Arrange
20
- var codeDocument = CreateDocument ( @"
28
+ var projectEngine = CreateProjectEngine ( ) ;
29
+
30
+ var codeDocument = projectEngine . CreateCodeDocument ( @"
21
31
@inject PropertyType PropertyName
22
32
" ) ;
33
+ var runner = RazorProjectEngineRunner . From ( projectEngine , codeDocument ) ;
23
34
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 > ( ) ;
31
36
32
37
// Act
33
- pass . Execute ( codeDocument , irDocument ) ;
38
+ runner . ExecutePass < InjectDirective . Pass > ( ) ;
39
+
40
+ var documentNode = codeDocument . GetDocumentIntermediateNode ( ) ;
34
41
35
42
// Assert
36
- var @class = FindClassNode ( irDocument ) ;
43
+ var @class = documentNode . FindClassNode ( ) ;
37
44
Assert . NotNull ( @class ) ;
38
45
Assert . Equal ( 2 , @class . Children . Count ) ;
39
46
@@ -46,24 +53,24 @@ @inject PropertyType PropertyName
46
53
public void InjectDirectivePass_Execute_DedupesPropertiesByName ( )
47
54
{
48
55
// Arrange
49
- var codeDocument = CreateDocument ( @"
56
+ var projectEngine = CreateProjectEngine ( ) ;
57
+
58
+ var codeDocument = projectEngine . CreateCodeDocument ( @"
50
59
@inject PropertyType PropertyName
51
60
@inject PropertyType2 PropertyName
52
61
" ) ;
53
62
54
- var engine = CreateEngine ( ) ;
55
- var pass = new InjectDirective . Pass ( )
56
- {
57
- Engine = engine ,
58
- } ;
63
+ var runner = RazorProjectEngineRunner . From ( projectEngine , codeDocument ) ;
59
64
60
- var irDocument = CreateIRDocument ( engine , codeDocument ) ;
65
+ runner . RunPhasesTo < IRazorDocumentClassifierPhase > ( ) ;
61
66
62
67
// Act
63
- pass . Execute ( codeDocument , irDocument ) ;
68
+ runner . ExecutePass < InjectDirective . Pass > ( ) ;
69
+
70
+ var documentNode = codeDocument . GetDocumentIntermediateNode ( ) ;
64
71
65
72
// Assert
66
- var @class = FindClassNode ( irDocument ) ;
73
+ var @class = documentNode . FindClassNode ( ) ;
67
74
Assert . NotNull ( @class ) ;
68
75
Assert . Equal ( 2 , @class . Children . Count ) ;
69
76
@@ -76,23 +83,23 @@ @inject PropertyType2 PropertyName
76
83
public void InjectDirectivePass_Execute_ExpandsTModel_WithDynamic ( )
77
84
{
78
85
// Arrange
79
- var codeDocument = CreateDocument ( @"
86
+ var projectEngine = CreateProjectEngine ( ) ;
87
+
88
+ var codeDocument = projectEngine . CreateCodeDocument ( @"
80
89
@inject PropertyType<TModel> PropertyName
81
90
" ) ;
82
91
83
- var engine = CreateEngine ( ) ;
84
- var pass = new InjectDirective . Pass ( )
85
- {
86
- Engine = engine ,
87
- } ;
92
+ var runner = RazorProjectEngineRunner . From ( projectEngine , codeDocument ) ;
88
93
89
- var irDocument = CreateIRDocument ( engine , codeDocument ) ;
94
+ runner . RunPhasesTo < IRazorDocumentClassifierPhase > ( ) ;
90
95
91
96
// Act
92
- pass . Execute ( codeDocument , irDocument ) ;
97
+ runner . ExecutePass < InjectDirective . Pass > ( ) ;
98
+
99
+ var documentNode = codeDocument . GetDocumentIntermediateNode ( ) ;
93
100
94
101
// Assert
95
- var @class = FindClassNode ( irDocument ) ;
102
+ var @class = documentNode . FindClassNode ( ) ;
96
103
Assert . NotNull ( @class ) ;
97
104
Assert . Equal ( 2 , @class . Children . Count ) ;
98
105
@@ -105,24 +112,24 @@ @inject PropertyType<TModel> PropertyName
105
112
public void InjectDirectivePass_Execute_ExpandsTModel_WithModelTypeFirst ( )
106
113
{
107
114
// Arrange
108
- var codeDocument = CreateDocument ( @"
115
+ var projectEngine = CreateProjectEngine ( ) ;
116
+
117
+ var codeDocument = projectEngine . CreateCodeDocument ( @"
109
118
@model ModelType
110
119
@inject PropertyType<TModel> PropertyName
111
120
" ) ;
112
121
113
- var engine = CreateEngine ( ) ;
114
- var pass = new InjectDirective . Pass ( )
115
- {
116
- Engine = engine ,
117
- } ;
122
+ var runner = RazorProjectEngineRunner . From ( projectEngine , codeDocument ) ;
118
123
119
- var irDocument = CreateIRDocument ( engine , codeDocument ) ;
124
+ runner . RunPhasesTo < IRazorDocumentClassifierPhase > ( ) ;
120
125
121
126
// Act
122
- pass . Execute ( codeDocument , irDocument ) ;
127
+ runner . ExecutePass < InjectDirective . Pass > ( ) ;
128
+
129
+ var documentNode = codeDocument . GetDocumentIntermediateNode ( ) ;
123
130
124
131
// Assert
125
- var @class = FindClassNode ( irDocument ) ;
132
+ var @class = documentNode . FindClassNode ( ) ;
126
133
Assert . NotNull ( @class ) ;
127
134
Assert . Equal ( 2 , @class . Children . Count ) ;
128
135
@@ -135,77 +142,29 @@ @inject PropertyType<TModel> PropertyName
135
142
public void InjectDirectivePass_Execute_ExpandsTModel_WithModelType ( )
136
143
{
137
144
// Arrange
138
- var codeDocument = CreateDocument ( @"
145
+ var projectEngine = CreateProjectEngine ( ) ;
146
+
147
+ var codeDocument = projectEngine . CreateCodeDocument ( @"
139
148
@inject PropertyType<TModel> PropertyName
140
149
@model ModelType
141
150
" ) ;
142
151
143
- var engine = CreateEngine ( ) ;
144
- var pass = new InjectDirective . Pass ( )
145
- {
146
- Engine = engine ,
147
- } ;
152
+ var runner = RazorProjectEngineRunner . From ( projectEngine , codeDocument ) ;
148
153
149
- var irDocument = CreateIRDocument ( engine , codeDocument ) ;
154
+ runner . RunPhasesTo < IRazorDocumentClassifierPhase > ( ) ;
150
155
151
156
// Act
152
- pass . Execute ( codeDocument , irDocument ) ;
157
+ runner . ExecutePass < InjectDirective . Pass > ( ) ;
158
+
159
+ var documentNode = codeDocument . GetDocumentIntermediateNode ( ) ;
153
160
154
161
// Assert
155
- var @class = FindClassNode ( irDocument ) ;
162
+ var @class = documentNode . FindClassNode ( ) ;
156
163
Assert . NotNull ( @class ) ;
157
164
Assert . Equal ( 2 , @class . Children . Count ) ;
158
165
159
166
var node = Assert . IsType < InjectIntermediateNode > ( @class . Children [ 1 ] ) ;
160
167
Assert . Equal ( "PropertyType<ModelType>" , node . TypeName ) ;
161
168
Assert . Equal ( "PropertyName" , node . MemberName ) ;
162
169
}
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
- }
211
170
}
0 commit comments