Skip to content

Commit e3b9d3f

Browse files
author
djjsdtc
committed
Simplify the code logic, and add unit tests.
1 parent 56f3638 commit e3b9d3f

File tree

2 files changed

+164
-62
lines changed

2 files changed

+164
-62
lines changed

src/Swashbuckle.AspNetCore.SwaggerGen/SwaggerGenerator/OpenApiAnyFactory.cs

Lines changed: 35 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -11,32 +11,7 @@ public static IOpenApiAny CreateFromJson(string json)
1111
{
1212
var jsonElement = JsonSerializer.Deserialize<JsonElement>(json);
1313

14-
if (jsonElement.ValueKind == JsonValueKind.True || jsonElement.ValueKind == JsonValueKind.False)
15-
return new OpenApiBoolean(jsonElement.GetBoolean());
16-
17-
if (jsonElement.ValueKind == JsonValueKind.Number)
18-
{
19-
if (jsonElement.TryGetInt32(out int intValue))
20-
return new OpenApiInteger(intValue);
21-
22-
if (jsonElement.TryGetInt64(out long longValue))
23-
return new OpenApiLong(longValue);
24-
25-
if (jsonElement.TryGetSingle(out float floatValue) && !float.IsInfinity(floatValue))
26-
return new OpenApiFloat(floatValue);
27-
28-
if (jsonElement.TryGetDouble(out double doubleValue))
29-
return new OpenApiDouble(doubleValue);
30-
}
31-
32-
if (jsonElement.ValueKind == JsonValueKind.String)
33-
return new OpenApiString(jsonElement.ToString());
34-
35-
if (jsonElement.ValueKind == JsonValueKind.Array)
36-
return CreateOpenApiArray(jsonElement);
37-
38-
if (jsonElement.ValueKind == JsonValueKind.Object)
39-
return CreateOpenApiObject(jsonElement);
14+
return CreateFromJsonElement(jsonElement);
4015
}
4116
catch { }
4217

@@ -49,24 +24,7 @@ private static IOpenApiAny CreateOpenApiArray(JsonElement jsonElement)
4924

5025
foreach (var item in jsonElement.EnumerateArray())
5126
{
52-
string json;
53-
switch (item.ValueKind)
54-
{
55-
case JsonValueKind.String:
56-
json = $"\"{item}\"";
57-
break;
58-
case JsonValueKind.True:
59-
json = "true";
60-
break;
61-
case JsonValueKind.False:
62-
json = "false";
63-
break;
64-
default:
65-
json = item.ToString();
66-
break;
67-
}
68-
69-
openApiArray.Add(CreateFromJson(json));
27+
openApiArray.Add(CreateFromJsonElement(item));
7028
}
7129

7230
return openApiArray;
@@ -78,27 +36,42 @@ private static IOpenApiAny CreateOpenApiObject(JsonElement jsonElement)
7836

7937
foreach (var property in jsonElement.EnumerateObject())
8038
{
81-
string valueAsJson;
82-
switch (property.Value.ValueKind)
83-
{
84-
case JsonValueKind.String:
85-
valueAsJson = $"\"{property.Value}\"";
86-
break;
87-
case JsonValueKind.True:
88-
valueAsJson = "true";
89-
break;
90-
case JsonValueKind.False:
91-
valueAsJson = "false";
92-
break;
93-
default:
94-
valueAsJson = property.Value.ToString();
95-
break;
96-
}
97-
98-
openApiObject.Add(property.Name, CreateFromJson(valueAsJson));
39+
openApiObject.Add(property.Name, CreateFromJsonElement(property.Value));
9940
}
10041

10142
return openApiObject;
10243
}
44+
45+
private static IOpenApiAny CreateFromJsonElement(JsonElement jsonElement)
46+
{
47+
if (jsonElement.ValueKind == JsonValueKind.True || jsonElement.ValueKind == JsonValueKind.False)
48+
return new OpenApiBoolean(jsonElement.GetBoolean());
49+
50+
if (jsonElement.ValueKind == JsonValueKind.Number)
51+
{
52+
if (jsonElement.TryGetInt32(out int intValue))
53+
return new OpenApiInteger(intValue);
54+
55+
if (jsonElement.TryGetInt64(out long longValue))
56+
return new OpenApiLong(longValue);
57+
58+
if (jsonElement.TryGetSingle(out float floatValue) && !float.IsInfinity(floatValue))
59+
return new OpenApiFloat(floatValue);
60+
61+
if (jsonElement.TryGetDouble(out double doubleValue))
62+
return new OpenApiDouble(doubleValue);
63+
}
64+
65+
if (jsonElement.ValueKind == JsonValueKind.String)
66+
return new OpenApiString(jsonElement.ToString());
67+
68+
if (jsonElement.ValueKind == JsonValueKind.Array)
69+
return CreateOpenApiArray(jsonElement);
70+
71+
if (jsonElement.ValueKind == JsonValueKind.Object)
72+
return CreateOpenApiObject(jsonElement);
73+
74+
throw new System.ArgumentException($"Unsupported value kind {jsonElement.ValueKind}");
75+
}
10376
}
10477
}
Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
namespace Swashbuckle.AspNetCore.SwaggerGen.Test
2+
{
3+
using System;
4+
using System.Text.Json;
5+
using Microsoft.OpenApi.Any;
6+
using Xunit;
7+
8+
public class OpenApiAnyFactoryTests
9+
{
10+
[Theory]
11+
[InlineData("1", typeof(OpenApiInteger), 1)]
12+
[InlineData("4294877294", typeof(OpenApiLong), 4294877294L)]
13+
[InlineData("1.5", typeof(OpenApiFloat), 1.5f)]
14+
[InlineData("1.5e308", typeof(OpenApiDouble), 1.5e308)]
15+
[InlineData("\"abc\"", typeof(OpenApiString), "abc")]
16+
[InlineData("true", typeof(OpenApiBoolean), true)]
17+
[InlineData("false", typeof(OpenApiBoolean), false)]
18+
public void CreateFromJson_SimpleType(string json, Type expectedType, object expectedValue)
19+
{
20+
var openApiAnyObject = OpenApiAnyFactory.CreateFromJson(json);
21+
Assert.NotNull(openApiAnyObject);
22+
Assert.Equal(expectedType, openApiAnyObject.GetType());
23+
Assert.Equal(AnyType.Primitive, openApiAnyObject.AnyType);
24+
var valueProperty = expectedType.GetProperty("Value");
25+
var actualValue = valueProperty.GetValue(openApiAnyObject);
26+
Assert.Equal(expectedValue, actualValue);
27+
}
28+
29+
[Theory]
30+
[InlineData("[1,2]", typeof(OpenApiInteger), 1, 2)]
31+
[InlineData("[4294877294,4294877295]", typeof(OpenApiLong), 4294877294L, 4294877295L)]
32+
[InlineData("[1.5,-1.5]", typeof(OpenApiFloat), 1.5f, -1.5f)]
33+
[InlineData("[1.5e308,-1.5e308]", typeof(OpenApiDouble), 1.5e308, -1.5e308)]
34+
[InlineData("[\"abc\",\"def\"]", typeof(OpenApiString), "abc", "def")]
35+
[InlineData("[true,false]", typeof(OpenApiBoolean), true, false)]
36+
[InlineData("[{\"a\":1,\"b\":2},{\"a\":3,\"b\":4}]", typeof(OpenApiObject))]
37+
[InlineData("[[1,2],[3,4]]", typeof(OpenApiArray))]
38+
public void CreateFromJson_Array(string json, Type expectedType, params object[] expectedValues)
39+
{
40+
var openApiAnyObject = OpenApiAnyFactory.CreateFromJson(json);
41+
Assert.NotNull(openApiAnyObject);
42+
Assert.Equal(typeof(OpenApiArray), openApiAnyObject.GetType());
43+
Assert.Equal(AnyType.Array, openApiAnyObject.AnyType);
44+
var array = (OpenApiArray)openApiAnyObject;
45+
for (var i = 0; i < array.Count; i++)
46+
{
47+
Assert.NotNull(array[i]);
48+
Assert.Equal(expectedType, array[i].GetType());
49+
if (expectedValues.Length > 0)
50+
{
51+
var valueProperty = expectedType.GetProperty("Value");
52+
var expectedValue = expectedValues[i];
53+
var actualValue = valueProperty.GetValue(array[i]);
54+
Assert.Equal(expectedValue, actualValue);
55+
}
56+
}
57+
}
58+
59+
[Fact]
60+
public void CreateFromJson_Object()
61+
{
62+
var json = JsonSerializer.Serialize(new
63+
{
64+
int_value = 1,
65+
long_value = 4294877294L,
66+
float_value = 1.5f,
67+
double_value = 1.5e308,
68+
string_value = "abc",
69+
true_value = true,
70+
false_value = false,
71+
array_value = new[] {1,2},
72+
object_value = new
73+
{
74+
a = 1,
75+
b = 2
76+
}
77+
});
78+
79+
var openApiAnyObject = OpenApiAnyFactory.CreateFromJson(json);
80+
Assert.NotNull(openApiAnyObject);
81+
Assert.Equal(typeof(OpenApiObject), openApiAnyObject.GetType());
82+
Assert.Equal(AnyType.Object, openApiAnyObject.AnyType);
83+
var obj = (OpenApiObject)openApiAnyObject;
84+
85+
Assert.NotNull(obj["int_value"]);
86+
Assert.Equal(typeof(OpenApiInteger), obj["int_value"].GetType());
87+
Assert.Equal(AnyType.Primitive, obj["int_value"].AnyType);
88+
Assert.Equal(1, ((OpenApiInteger) obj["int_value"]).Value);
89+
90+
Assert.NotNull(obj["long_value"]);
91+
Assert.Equal(typeof(OpenApiLong), obj["long_value"].GetType());
92+
Assert.Equal(AnyType.Primitive, obj["long_value"].AnyType);
93+
Assert.Equal(4294877294L, ((OpenApiLong)obj["long_value"]).Value);
94+
95+
Assert.NotNull(obj["float_value"]);
96+
Assert.Equal(typeof(OpenApiFloat), obj["float_value"].GetType());
97+
Assert.Equal(AnyType.Primitive, obj["float_value"].AnyType);
98+
Assert.Equal(1.5f, ((OpenApiFloat)obj["float_value"]).Value);
99+
100+
Assert.NotNull(obj["double_value"]);
101+
Assert.Equal(typeof(OpenApiDouble), obj["double_value"].GetType());
102+
Assert.Equal(AnyType.Primitive, obj["double_value"].AnyType);
103+
Assert.Equal(1.5e308, ((OpenApiDouble)obj["double_value"]).Value);
104+
105+
Assert.NotNull(obj["string_value"]);
106+
Assert.Equal(typeof(OpenApiString), obj["string_value"].GetType());
107+
Assert.Equal(AnyType.Primitive, obj["string_value"].AnyType);
108+
Assert.Equal("abc", ((OpenApiString)obj["string_value"]).Value);
109+
110+
Assert.NotNull(obj["true_value"]);
111+
Assert.Equal(typeof(OpenApiBoolean), obj["true_value"].GetType());
112+
Assert.Equal(AnyType.Primitive, obj["true_value"].AnyType);
113+
Assert.True(((OpenApiBoolean)obj["true_value"]).Value);
114+
115+
Assert.NotNull(obj["false_value"]);
116+
Assert.Equal(typeof(OpenApiBoolean), obj["false_value"].GetType());
117+
Assert.Equal(AnyType.Primitive, obj["false_value"].AnyType);
118+
Assert.False(((OpenApiBoolean)obj["false_value"]).Value);
119+
120+
Assert.NotNull(obj["array_value"]);
121+
Assert.Equal(typeof(OpenApiArray), obj["array_value"].GetType());
122+
Assert.Equal(AnyType.Array, obj["array_value"].AnyType);
123+
124+
Assert.NotNull(obj["object_value"]);
125+
Assert.Equal(typeof(OpenApiObject), obj["object_value"].GetType());
126+
Assert.Equal(AnyType.Object, obj["object_value"].AnyType);
127+
}
128+
}
129+
}

0 commit comments

Comments
 (0)