Skip to content

Commit 81581aa

Browse files
committed
CompositeExpression is working
1 parent bb59c5f commit 81581aa

File tree

2 files changed

+78
-0
lines changed

2 files changed

+78
-0
lines changed

src/Microsoft.OpenApi/Expressions/CompositeExpression.cs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,44 @@
22
using System.Collections.Generic;
33
using System.Linq;
44
using System.Text;
5+
using System.Text.RegularExpressions;
56
using System.Threading.Tasks;
67

78
namespace Microsoft.OpenApi.Expressions
89
{
10+
/// <summary>
11+
/// String literal with embedded expressions
12+
/// </summary>
913
public class CompositeExpression : RuntimeExpression
1014
{
1115
private string template;
16+
private Regex expressionPattern = new Regex("{(?<exp>[^}]+)");
17+
/// <summary>
18+
/// Expressions embedded into string literal
19+
/// </summary>
20+
public List<RuntimeExpression> ContainedExpressions = new List<RuntimeExpression>();
1221

22+
/// <summary>
23+
/// Create a composite expression from a string literal with an embedded expression
24+
/// </summary>
25+
/// <param name="expression"></param>
1326
public CompositeExpression(string expression)
1427
{
1528
template = expression;
1629

1730
// Extract subexpressions and convert to RuntimeExpressions
31+
var matches = expressionPattern.Matches(expression);
1832

33+
foreach (var item in matches.Cast<Match>())
34+
{
35+
var value = item.Groups["exp"].Captures.Cast<Capture>().First().Value;
36+
ContainedExpressions.Add(RuntimeExpression.Build(value));
37+
}
1938
}
2039

40+
/// <summary>
41+
/// Return original string literal with embedded expression
42+
/// </summary>
2143
public override string Expression => template;
2244
}
2345
}

test/Microsoft.OpenApi.Tests/Expressions/RuntimeExpressionTests.cs

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using Microsoft.OpenApi.Expressions;
66
using Microsoft.OpenApi.Properties;
77
using System;
8+
using System.Linq;
89
using Xunit;
910

1011
namespace Microsoft.OpenApi.Tests.Writers
@@ -171,5 +172,60 @@ public void CompareRuntimeExpressionWorks(string expression)
171172
Assert.NotSame(runtimeExpression1, runtimeExpression2);
172173
Assert.Equal(runtimeExpression1, runtimeExpression2);
173174
}
175+
176+
177+
[Fact]
178+
public void CompositeRuntimeExpressionContainsExpression()
179+
{
180+
// Arrange
181+
string expression = "This is a composite expression {$url} yay";
182+
183+
// Act
184+
var runtimeExpression = RuntimeExpression.Build(expression);
185+
186+
// Assert
187+
Assert.NotNull(runtimeExpression);
188+
var response = Assert.IsType<CompositeExpression>(runtimeExpression);
189+
Assert.Equal(expression, response.Expression);
190+
191+
var compositeExpression = runtimeExpression as CompositeExpression;
192+
Assert.Single(compositeExpression.ContainedExpressions);
193+
194+
}
195+
196+
[Fact]
197+
public void CompositeRuntimeExpressionContainsMultipleExpressions()
198+
{
199+
// Arrange
200+
string expression = "This is a composite expression {$url} yay and {$request.header.foo}";
201+
202+
// Act
203+
var runtimeExpression = RuntimeExpression.Build(expression);
204+
205+
// Assert
206+
Assert.NotNull(runtimeExpression);
207+
var response = Assert.IsType<CompositeExpression>(runtimeExpression);
208+
Assert.Equal(expression, response.Expression);
209+
210+
var compositeExpression = runtimeExpression as CompositeExpression;
211+
Assert.Equal(2,compositeExpression.ContainedExpressions.Count);
212+
213+
Assert.IsType<UrlExpression>(compositeExpression.ContainedExpressions.First());
214+
Assert.IsType<RequestExpression>(compositeExpression.ContainedExpressions.Last());
215+
}
216+
217+
[Theory]
218+
[InlineData("This is a composite expression yay and {} and {$sddsd}")]
219+
[InlineData("This is a composite expression {url} yay and {} and {$url}")]
220+
public void CompositeRuntimeExpressionContainsInvalidExpressions(string expression)
221+
{
222+
// Arrange
223+
224+
// Act
225+
Action test = () => RuntimeExpression.Build(expression);
226+
227+
// Assert
228+
Assert.Throws<OpenApiException>(test);
229+
}
174230
}
175231
}

0 commit comments

Comments
 (0)