Skip to content

Commit ff584c7

Browse files
authored
Merge pull request #611 from peteraritchie/vnext
Made OpenApiVisitorBase Enter() and Exit() virtual, plus test
2 parents c147547 + 387a256 commit ff584c7

File tree

3 files changed

+350
-4
lines changed

3 files changed

+350
-4
lines changed

src/Microsoft.OpenApi/Services/OpenApiVisitorBase.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,15 @@ public abstract class OpenApiVisitorBase
2525
/// Allow Rule to indicate validation error occured at a deeper context level.
2626
/// </summary>
2727
/// <param name="segment">Identifier for context</param>
28-
public void Enter(string segment)
28+
public virtual void Enter(string segment)
2929
{
3030
this._path.Push(segment);
3131
}
3232

3333
/// <summary>
3434
/// Exit from path context elevel. Enter and Exit calls should be matched.
3535
/// </summary>
36-
public void Exit()
36+
public virtual void Exit()
3737
{
3838
this._path.Pop();
3939
}

test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -984,8 +984,8 @@ namespace Microsoft.OpenApi.Services
984984
protected OpenApiVisitorBase() { }
985985
public Microsoft.OpenApi.Services.CurrentKeys CurrentKeys { get; }
986986
public string PathString { get; }
987-
public void Enter(string segment) { }
988-
public void Exit() { }
987+
public virtual void Enter(string segment) { }
988+
public virtual void Exit() { }
989989
public virtual void Visit(Microsoft.OpenApi.Interfaces.IOpenApiExtensible openApiExtensible) { }
990990
public virtual void Visit(Microsoft.OpenApi.Interfaces.IOpenApiExtension openApiExtension) { }
991991
public virtual void Visit(Microsoft.OpenApi.Interfaces.IOpenApiReferenceable referenceable) { }
Lines changed: 346 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,346 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Runtime.CompilerServices;
5+
using System.Text;
6+
using System.Threading.Tasks;
7+
using Microsoft.OpenApi.Interfaces;
8+
using Microsoft.OpenApi.Models;
9+
using Microsoft.OpenApi.Services;
10+
using Xunit;
11+
12+
namespace Microsoft.OpenApi.Tests.Visitors
13+
{
14+
public class InheritanceTests
15+
{
16+
[Fact]
17+
public void ExpectedVirtualsInvolved()
18+
{
19+
OpenApiVisitorBase visitor = null;
20+
21+
visitor = new TestVisitor();
22+
23+
visitor.Enter(default(string));
24+
visitor.Visit(default(OpenApiDocument));
25+
visitor.Visit(default(OpenApiInfo));
26+
visitor.Visit(default(OpenApiContact));
27+
visitor.Visit(default(OpenApiLicense));
28+
visitor.Visit(default(IList<OpenApiServer>));
29+
visitor.Visit(default(OpenApiServer));
30+
visitor.Visit(default(OpenApiPaths));
31+
visitor.Visit(default(OpenApiPathItem));
32+
visitor.Visit(default(OpenApiServerVariable));
33+
visitor.Visit(default(IDictionary<OperationType, OpenApiOperation>));
34+
visitor.Visit(default(OpenApiOperation));
35+
visitor.Visit(default(IList<OpenApiParameter>));
36+
visitor.Visit(default(OpenApiParameter));
37+
visitor.Visit(default(OpenApiRequestBody));
38+
visitor.Visit(default(IDictionary<string, OpenApiHeader>));
39+
visitor.Visit(default(IDictionary<string, OpenApiCallback>));
40+
visitor.Visit(default(OpenApiResponse));
41+
visitor.Visit(default(OpenApiResponses));
42+
visitor.Visit(default(IDictionary<string, OpenApiMediaType>));
43+
visitor.Visit(default(OpenApiMediaType));
44+
visitor.Visit(default(OpenApiEncoding));
45+
visitor.Visit(default(IDictionary<string, OpenApiExample>));
46+
visitor.Visit(default(OpenApiComponents));
47+
visitor.Visit(default(OpenApiExternalDocs));
48+
visitor.Visit(default(OpenApiSchema));
49+
visitor.Visit(default(IDictionary<string, OpenApiLink>));
50+
visitor.Visit(default(OpenApiLink));
51+
visitor.Visit(default(OpenApiCallback));
52+
visitor.Visit(default(OpenApiTag));
53+
visitor.Visit(default(OpenApiHeader));
54+
visitor.Visit(default(OpenApiOAuthFlow));
55+
visitor.Visit(default(OpenApiSecurityRequirement));
56+
visitor.Visit(default(OpenApiSecurityScheme));
57+
visitor.Visit(default(OpenApiExample));
58+
visitor.Visit(default(IList<OpenApiTag>));
59+
visitor.Visit(default(IList<OpenApiSecurityRequirement>));
60+
visitor.Visit(default(IOpenApiExtensible));
61+
visitor.Visit(default(IOpenApiExtension));
62+
visitor.Visit(default(IList<OpenApiExample>));
63+
visitor.Visit(default(IDictionary<string, OpenApiServerVariable>));
64+
visitor.Visit(default(IDictionary<string, OpenApiEncoding>));
65+
visitor.Visit(default(IOpenApiReferenceable));
66+
visitor.Exit();
67+
Assert.True(42 < ((TestVisitor)visitor).CallStack.Count());
68+
}
69+
70+
internal protected class TestVisitor : OpenApiVisitorBase
71+
{
72+
public Stack<string> CallStack { get; } = new Stack<string>();
73+
74+
private string EncodeCall([CallerMemberName] string name="", [CallerLineNumber]int lineNumber = 0)
75+
{
76+
var encoding = $"{name}:{lineNumber}";
77+
CallStack.Push(encoding);
78+
return encoding;
79+
}
80+
81+
public override void Enter(string segment)
82+
{
83+
EncodeCall();
84+
base.Enter(segment);
85+
}
86+
87+
public override void Exit()
88+
{
89+
EncodeCall();
90+
base.Exit();
91+
}
92+
93+
public override void Visit(OpenApiDocument doc)
94+
{
95+
EncodeCall();
96+
base.Visit(doc);
97+
}
98+
99+
public override void Visit(OpenApiInfo info)
100+
{
101+
EncodeCall();
102+
base.Visit(info);
103+
}
104+
105+
public override void Visit(OpenApiContact contact)
106+
{
107+
EncodeCall();
108+
base.Visit(contact);
109+
}
110+
111+
public override void Visit(OpenApiLicense license)
112+
{
113+
EncodeCall();
114+
base.Visit(license);
115+
}
116+
117+
public override void Visit(IList<OpenApiServer> servers)
118+
{
119+
EncodeCall();
120+
base.Visit(servers);
121+
}
122+
123+
public override void Visit(OpenApiServer server)
124+
{
125+
EncodeCall();
126+
base.Visit(server);
127+
}
128+
129+
public override void Visit(OpenApiPaths paths)
130+
{
131+
EncodeCall();
132+
base.Visit(paths);
133+
}
134+
135+
public override void Visit(OpenApiPathItem pathItem)
136+
{
137+
EncodeCall();
138+
base.Visit(pathItem);
139+
}
140+
141+
public override void Visit(OpenApiServerVariable serverVariable)
142+
{
143+
EncodeCall();
144+
base.Visit(serverVariable);
145+
}
146+
147+
public override void Visit(IDictionary<OperationType, OpenApiOperation> operations)
148+
{
149+
EncodeCall();
150+
base.Visit(operations);
151+
}
152+
153+
public override void Visit(OpenApiOperation operation)
154+
{
155+
EncodeCall();
156+
base.Visit(operation);
157+
}
158+
159+
public override void Visit(IList<OpenApiParameter> parameters)
160+
{
161+
EncodeCall();
162+
base.Visit(parameters);
163+
}
164+
165+
public override void Visit(OpenApiParameter parameter)
166+
{
167+
EncodeCall();
168+
base.Visit(parameter);
169+
}
170+
171+
public override void Visit(OpenApiRequestBody requestBody)
172+
{
173+
EncodeCall();
174+
base.Visit(requestBody);
175+
}
176+
177+
public override void Visit(IDictionary<string, OpenApiHeader> headers)
178+
{
179+
EncodeCall();
180+
base.Visit(headers);
181+
}
182+
183+
public override void Visit(IDictionary<string, OpenApiCallback> callbacks)
184+
{
185+
EncodeCall();
186+
base.Visit(callbacks);
187+
}
188+
189+
public override void Visit(OpenApiResponse response)
190+
{
191+
EncodeCall();
192+
base.Visit(response);
193+
}
194+
195+
public override void Visit(OpenApiResponses response)
196+
{
197+
EncodeCall();
198+
base.Visit(response);
199+
}
200+
201+
public override void Visit(IDictionary<string, OpenApiMediaType> content)
202+
{
203+
EncodeCall();
204+
base.Visit(content);
205+
}
206+
207+
public override void Visit(OpenApiMediaType mediaType)
208+
{
209+
EncodeCall();
210+
base.Visit(mediaType);
211+
}
212+
213+
public override void Visit(OpenApiEncoding encoding)
214+
{
215+
EncodeCall();
216+
base.Visit(encoding);
217+
}
218+
219+
public override void Visit(IDictionary<string, OpenApiExample> examples)
220+
{
221+
EncodeCall();
222+
base.Visit(examples);
223+
}
224+
225+
public override void Visit(OpenApiComponents components)
226+
{
227+
EncodeCall();
228+
base.Visit(components);
229+
}
230+
231+
public override void Visit(OpenApiExternalDocs externalDocs)
232+
{
233+
EncodeCall();
234+
base.Visit(externalDocs);
235+
}
236+
237+
public override void Visit(OpenApiSchema schema)
238+
{
239+
EncodeCall();
240+
base.Visit(schema);
241+
}
242+
243+
public override void Visit(IDictionary<string, OpenApiLink> links)
244+
{
245+
EncodeCall();
246+
base.Visit(links);
247+
}
248+
249+
public override void Visit(OpenApiLink link)
250+
{
251+
EncodeCall();
252+
base.Visit(link);
253+
}
254+
255+
public override void Visit(OpenApiCallback callback)
256+
{
257+
EncodeCall();
258+
base.Visit(callback);
259+
}
260+
261+
public override void Visit(OpenApiTag tag)
262+
{
263+
EncodeCall();
264+
base.Visit(tag);
265+
}
266+
267+
public override void Visit(OpenApiHeader tag)
268+
{
269+
EncodeCall();
270+
base.Visit(tag);
271+
}
272+
273+
public override void Visit(OpenApiOAuthFlow openApiOAuthFlow)
274+
{
275+
EncodeCall();
276+
base.Visit(openApiOAuthFlow);
277+
}
278+
279+
public override void Visit(OpenApiSecurityRequirement securityRequirement)
280+
{
281+
EncodeCall();
282+
base.Visit(securityRequirement);
283+
}
284+
285+
public override void Visit(OpenApiSecurityScheme securityScheme)
286+
{
287+
EncodeCall();
288+
base.Visit(securityScheme);
289+
}
290+
291+
public override void Visit(OpenApiExample example)
292+
{
293+
EncodeCall();
294+
base.Visit(example);
295+
}
296+
297+
public override void Visit(IList<OpenApiTag> openApiTags)
298+
{
299+
EncodeCall();
300+
base.Visit(openApiTags);
301+
}
302+
303+
public override void Visit(IList<OpenApiSecurityRequirement> openApiSecurityRequirements)
304+
{
305+
EncodeCall();
306+
base.Visit(openApiSecurityRequirements);
307+
}
308+
309+
public override void Visit(IOpenApiExtensible openApiExtensible)
310+
{
311+
EncodeCall();
312+
base.Visit(openApiExtensible);
313+
}
314+
315+
public override void Visit(IOpenApiExtension openApiExtension)
316+
{
317+
EncodeCall();
318+
base.Visit(openApiExtension);
319+
}
320+
321+
public override void Visit(IList<OpenApiExample> example)
322+
{
323+
EncodeCall();
324+
base.Visit(example);
325+
}
326+
327+
public override void Visit(IDictionary<string, OpenApiServerVariable> serverVariables)
328+
{
329+
EncodeCall();
330+
base.Visit(serverVariables);
331+
}
332+
333+
public override void Visit(IDictionary<string, OpenApiEncoding> encodings)
334+
{
335+
EncodeCall();
336+
base.Visit(encodings);
337+
}
338+
339+
public override void Visit(IOpenApiReferenceable referenceable)
340+
{
341+
EncodeCall();
342+
base.Visit(referenceable);
343+
}
344+
}
345+
}
346+
}

0 commit comments

Comments
 (0)