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 ;
9
7
10
8
namespace Microsoft . AspNetCore . Mvc . Razor . Extensions . Version1_X ;
11
9
12
- public class InjectDirectiveTest
10
+ public class InjectDirectiveTest : RazorProjectEngineTestBase
13
11
{
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
+
14
29
[ Fact ]
15
30
public void InjectDirectivePass_Execute_DefinesProperty ( )
16
31
{
17
32
// Arrange
18
- var codeDocument = CreateDocument ( @"
33
+ var processor = CreateAndInitializeCodeDocument ( @"
19
34
@inject PropertyType PropertyName
20
35
" ) ;
21
36
22
- var engine = CreateEngine ( ) ;
23
- var pass = new InjectDirective . Pass ( )
24
- {
25
- Engine = engine ,
26
- } ;
27
-
28
- var irDocument = CreateIRDocument ( engine , codeDocument ) ;
29
-
30
37
// Act
31
- pass . Execute ( codeDocument , irDocument ) ;
38
+ processor . ExecutePass < InjectDirective . Pass > ( ) ;
39
+ var documentNode = processor . GetDocumentNode ( ) ;
32
40
33
41
// Assert
34
- var @class = FindClassNode ( irDocument ) ;
42
+ var @class = documentNode . FindClassNode ( ) ;
35
43
Assert . NotNull ( @class ) ;
36
44
Assert . Equal ( 2 , @class . Children . Count ) ;
37
45
@@ -44,24 +52,17 @@ @inject PropertyType PropertyName
44
52
public void InjectDirectivePass_Execute_DedupesPropertiesByName ( )
45
53
{
46
54
// Arrange
47
- var codeDocument = CreateDocument ( @"
55
+ var processor = CreateAndInitializeCodeDocument ( @"
48
56
@inject PropertyType PropertyName
49
57
@inject PropertyType2 PropertyName
50
58
" ) ;
51
59
52
- var engine = CreateEngine ( ) ;
53
- var pass = new InjectDirective . Pass ( )
54
- {
55
- Engine = engine ,
56
- } ;
57
-
58
- var irDocument = CreateIRDocument ( engine , codeDocument ) ;
59
-
60
60
// Act
61
- pass . Execute ( codeDocument , irDocument ) ;
61
+ processor . ExecutePass < InjectDirective . Pass > ( ) ;
62
+ var documentNode = processor . GetDocumentNode ( ) ;
62
63
63
64
// Assert
64
- var @class = FindClassNode ( irDocument ) ;
65
+ var @class = documentNode . FindClassNode ( ) ;
65
66
Assert . NotNull ( @class ) ;
66
67
Assert . Equal ( 2 , @class . Children . Count ) ;
67
68
@@ -74,23 +75,16 @@ @inject PropertyType2 PropertyName
74
75
public void InjectDirectivePass_Execute_ExpandsTModel_WithDynamic ( )
75
76
{
76
77
// Arrange
77
- var codeDocument = CreateDocument ( @"
78
+ var processor = CreateAndInitializeCodeDocument ( @"
78
79
@inject PropertyType<TModel> PropertyName
79
80
" ) ;
80
81
81
- var engine = CreateEngine ( ) ;
82
- var pass = new InjectDirective . Pass ( )
83
- {
84
- Engine = engine ,
85
- } ;
86
-
87
- var irDocument = CreateIRDocument ( engine , codeDocument ) ;
88
-
89
82
// Act
90
- pass . Execute ( codeDocument , irDocument ) ;
83
+ processor . ExecutePass < InjectDirective . Pass > ( ) ;
84
+ var documentNode = processor . GetDocumentNode ( ) ;
91
85
92
86
// Assert
93
- var @class = FindClassNode ( irDocument ) ;
87
+ var @class = documentNode . FindClassNode ( ) ;
94
88
Assert . NotNull ( @class ) ;
95
89
Assert . Equal ( 2 , @class . Children . Count ) ;
96
90
@@ -103,24 +97,17 @@ @inject PropertyType<TModel> PropertyName
103
97
public void InjectDirectivePass_Execute_ExpandsTModel_WithModelTypeFirst ( )
104
98
{
105
99
// Arrange
106
- var codeDocument = CreateDocument ( @"
100
+ var processor = CreateAndInitializeCodeDocument ( @"
107
101
@model ModelType
108
102
@inject PropertyType<TModel> PropertyName
109
103
" ) ;
110
104
111
- var engine = CreateEngine ( ) ;
112
- var pass = new InjectDirective . Pass ( )
113
- {
114
- Engine = engine ,
115
- } ;
116
-
117
- var irDocument = CreateIRDocument ( engine , codeDocument ) ;
118
-
119
105
// Act
120
- pass . Execute ( codeDocument , irDocument ) ;
106
+ processor . ExecutePass < InjectDirective . Pass > ( ) ;
107
+ var documentNode = processor . GetDocumentNode ( ) ;
121
108
122
109
// Assert
123
- var @class = FindClassNode ( irDocument ) ;
110
+ var @class = documentNode . FindClassNode ( ) ;
124
111
Assert . NotNull ( @class ) ;
125
112
Assert . Equal ( 2 , @class . Children . Count ) ;
126
113
@@ -133,81 +120,22 @@ @inject PropertyType<TModel> PropertyName
133
120
public void InjectDirectivePass_Execute_ExpandsTModel_WithModelType ( )
134
121
{
135
122
// Arrange
136
- var codeDocument = CreateDocument ( @"
123
+ var processor = CreateAndInitializeCodeDocument ( @"
137
124
@inject PropertyType<TModel> PropertyName
138
125
@model ModelType
139
126
" ) ;
140
127
141
- var engine = CreateEngine ( ) ;
142
- var pass = new InjectDirective . Pass ( )
143
- {
144
- Engine = engine ,
145
- } ;
146
-
147
- var irDocument = CreateIRDocument ( engine , codeDocument ) ;
148
-
149
128
// Act
150
- pass . Execute ( codeDocument , irDocument ) ;
129
+ processor . ExecutePass < InjectDirective . Pass > ( ) ;
130
+ var documentNode = processor . GetDocumentNode ( ) ;
151
131
152
132
// Assert
153
- var @class = FindClassNode ( irDocument ) ;
133
+ var @class = documentNode . FindClassNode ( ) ;
154
134
Assert . NotNull ( @class ) ;
155
135
Assert . Equal ( 2 , @class . Children . Count ) ;
156
136
157
137
var node = Assert . IsType < InjectIntermediateNode > ( @class . Children [ 1 ] ) ;
158
138
Assert . Equal ( "PropertyType<ModelType>" , node . TypeName ) ;
159
139
Assert . Equal ( "PropertyName" , node . MemberName ) ;
160
140
}
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
- }
213
141
}
0 commit comments