Skip to content

Commit af82c75

Browse files
committed
test: Add tests for multi-dimensional array schema resolution
refactor: Remove unused using directive in PerformanceTests feat: Enhance JsonSchema to support multi-dimensional array types
1 parent 45d0bff commit af82c75

4 files changed

Lines changed: 105 additions & 2 deletions

File tree

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
using com.IvanMurzak.ReflectorNet.Utils;
2+
using Xunit.Abstractions;
3+
4+
namespace com.IvanMurzak.ReflectorNet.Tests.SchemaTests
5+
{
6+
public class MultiDimensionalArrayTests : SchemaTestBase
7+
{
8+
public MultiDimensionalArrayTests(ITestOutputHelper output) : base(output) { }
9+
10+
[Fact]
11+
public void GetSchema_TwoDimensionalArray_ShouldReturnArrayOfArrays()
12+
{
13+
var reflector = new Reflector();
14+
var type = typeof(int[,]);
15+
var schema = reflector.GetSchema(type);
16+
17+
_output.WriteLine(schema.ToString());
18+
19+
Assert.Equal(JsonSchema.Array, schema[JsonSchema.Type]?.ToString());
20+
21+
var items = schema[JsonSchema.Items];
22+
Assert.NotNull(items);
23+
24+
// Current behavior (likely): items type is integer
25+
// Desired behavior: items type is array (of integers)
26+
27+
Assert.Equal(JsonSchema.Array, items[JsonSchema.Type]?.ToString());
28+
29+
var innerItems = items[JsonSchema.Items];
30+
Assert.NotNull(innerItems);
31+
Assert.Equal(JsonSchema.Integer, innerItems[JsonSchema.Type]?.ToString());
32+
}
33+
34+
[Fact]
35+
public void GetSchema_ThreeDimensionalArray_ShouldReturnArrayOfArrayOfArrays()
36+
{
37+
var reflector = new Reflector();
38+
var type = typeof(int[,,]);
39+
var schema = reflector.GetSchema(type);
40+
41+
_output.WriteLine(schema.ToString());
42+
43+
Assert.Equal(JsonSchema.Array, schema[JsonSchema.Type]?.ToString());
44+
45+
var items1 = schema[JsonSchema.Items]; // Rank 2 array
46+
Assert.NotNull(items1);
47+
Assert.Equal(JsonSchema.Array, items1[JsonSchema.Type]?.ToString());
48+
49+
var items2 = items1[JsonSchema.Items]; // Rank 1 array
50+
Assert.NotNull(items2);
51+
Assert.Equal(JsonSchema.Array, items2[JsonSchema.Type]?.ToString());
52+
53+
var items3 = items2[JsonSchema.Items]; // Element
54+
Assert.NotNull(items3);
55+
Assert.Equal(JsonSchema.Integer, items3[JsonSchema.Type]?.ToString());
56+
}
57+
58+
[Fact]
59+
public void GetSchema_FourDimensionalArray_ShouldReturnArrayOfArrayOfArrayOfArrays()
60+
{
61+
var reflector = new Reflector();
62+
var type = typeof(int[,,,]);
63+
var schema = reflector.GetSchema(type);
64+
65+
_output.WriteLine(schema.ToString());
66+
67+
Assert.Equal(JsonSchema.Array, schema[JsonSchema.Type]?.ToString());
68+
69+
var items1 = schema[JsonSchema.Items]; // Rank 3 array
70+
Assert.NotNull(items1);
71+
Assert.Equal(JsonSchema.Array, items1[JsonSchema.Type]?.ToString());
72+
73+
var items2 = items1[JsonSchema.Items]; // Rank 2 array
74+
Assert.NotNull(items2);
75+
Assert.Equal(JsonSchema.Array, items2[JsonSchema.Type]?.ToString());
76+
77+
var items3 = items2[JsonSchema.Items]; // Rank 1 array
78+
Assert.NotNull(items3);
79+
Assert.Equal(JsonSchema.Array, items3[JsonSchema.Type]?.ToString());
80+
81+
var items4 = items3[JsonSchema.Items]; // Element
82+
Assert.NotNull(items4);
83+
Assert.Equal(JsonSchema.Integer, items4[JsonSchema.Type]?.ToString());
84+
}
85+
}
86+
}

ReflectorNet.Tests/src/SchemaTests/PerformanceTests.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
using com.IvanMurzak.ReflectorNet;
21
using com.IvanMurzak.ReflectorNet.Tests.Model;
32
using Xunit.Abstractions;
43
using System;

ReflectorNet/ReflectorNet.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010
<!-- NuGet Package Information -->
1111
<PackageId>com.IvanMurzak.ReflectorNet</PackageId>
12-
<Version>3.1.0</Version>
12+
<Version>3.1.1</Version>
1313
<Authors>Ivan Murzak</Authors>
1414
<Copyright>Copyright © Ivan Murzak 2025</Copyright>
1515
<Description>ReflectorNet is an advanced .NET reflection toolkit designed for AI-driven scenarios. Effortlessly search for C# methods using natural language queries, invoke any method by supplying arguments as JSON, and receive results as JSON. The library also provides a powerful API to inspect, modify, and manage in-memory object instances dynamically via JSON data. Ideal for automation, testing, and AI integration workflows.</Description>

ReflectorNet/src/Utils/Json/JsonSchema.Internal.cs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,24 @@ JsonNode GenerateSchemaFromType(Reflector reflector, Type type, JsonObject defin
108108
// Handle generic collections, arrays and IEnumerable (T[], List<T>, IEnumerable<T>, etc.)
109109
if (TypeUtils.IsIEnumerable(type))
110110
{
111+
if (type.IsArray && type.GetArrayRank() > 1)
112+
{
113+
var rank = type.GetArrayRank();
114+
var elementType = type.GetElementType();
115+
if (elementType != null)
116+
{
117+
var innerType = rank == 2
118+
? elementType.MakeArrayType()
119+
: elementType.MakeArrayType(rank - 1);
120+
121+
return new JsonObject
122+
{
123+
[Type] = Array,
124+
[Items] = GetSchema(reflector, innerType, defines: defines)
125+
};
126+
}
127+
}
128+
111129
var itemType = TypeUtils.GetEnumerableItemType(type);
112130
if (itemType != null)
113131
{

0 commit comments

Comments
 (0)