|
|
@@ -5,6 +5,7 @@ using System.Collections;
|
|
|
using System.Collections.Generic;
|
|
|
using System.Globalization;
|
|
|
using System.Text.Json;
|
|
|
+using System.Text.Json.Nodes;
|
|
|
using Xunit;
|
|
|
|
|
|
namespace Microsoft.AspNetCore.JsonPatch.SystemTextJson.Internal;
|
|
|
@@ -484,7 +485,7 @@ public class ListAdapterTest
|
|
|
{
|
|
|
// Arrange
|
|
|
var serializerOptions = JsonSerializerOptions.Default;
|
|
|
- var targetObject = new List<int>() { 10, 20 };
|
|
|
+ var targetObject = new JsonArray { 10, 20 };
|
|
|
var listAdapter = new ListAdapter();
|
|
|
var expectedErrorMessage = "The index value provided by path segment '2' is out of bounds of the array size.";
|
|
|
|
|
|
@@ -495,4 +496,116 @@ public class ListAdapterTest
|
|
|
Assert.False(testStatus);
|
|
|
Assert.Equal(expectedErrorMessage, errorMessage);
|
|
|
}
|
|
|
+
|
|
|
+ [Theory]
|
|
|
+ [InlineData(new int[] { }, "0")]
|
|
|
+ [InlineData(new int[] { 10, 20 }, "-1")]
|
|
|
+ [InlineData(new int[] { 10, 20 }, "2")]
|
|
|
+ public void TryTraverse_IndexOutOfBounds_ReturnsFalse(int[] input, string segment)
|
|
|
+ {
|
|
|
+ // Arrange
|
|
|
+ var serializerOptions = JsonSerializerOptions.Default;
|
|
|
+ var targetObject = new List<int>(input);
|
|
|
+ var listAdapter = new ListAdapter();
|
|
|
+
|
|
|
+ // Act
|
|
|
+ var success = listAdapter.TryTraverse(targetObject, segment, serializerOptions, out var value, out var message);
|
|
|
+
|
|
|
+ // Assert
|
|
|
+ Assert.False(success);
|
|
|
+ Assert.Null(value);
|
|
|
+ Assert.Equal($"The index value provided by path segment '{segment}' is out of bounds of the array size.", message);
|
|
|
+ }
|
|
|
+
|
|
|
+ [Fact]
|
|
|
+ public void TryTraverse_JsonArray_ValidNumericIndex_ReturnsElement()
|
|
|
+ {
|
|
|
+ // Arrange
|
|
|
+ var serializerOptions = JsonSerializerOptions.Default;
|
|
|
+ var targetObject = new JsonArray() {10, 20, 30};
|
|
|
+ var expectedValue = 20;
|
|
|
+ var segment = "1";
|
|
|
+ var listAdapter = new ListAdapter();
|
|
|
+
|
|
|
+ // Act
|
|
|
+ var success = listAdapter.TryTraverse(targetObject, segment, serializerOptions, out var value, out var message);
|
|
|
+
|
|
|
+ // Assert
|
|
|
+ Assert.True(success);
|
|
|
+ var jsonValue = Assert.IsAssignableFrom<JsonValue>(value);
|
|
|
+ Assert.Equal(expectedValue, jsonValue.GetValue<int>());
|
|
|
+ Assert.Null(message);
|
|
|
+ }
|
|
|
+
|
|
|
+ [Theory]
|
|
|
+ [InlineData("-")]
|
|
|
+ [InlineData("abc")]
|
|
|
+ [InlineData("3.14")]
|
|
|
+ [InlineData("")]
|
|
|
+ public void TryTraverse_InvalidSegmentFormat_ReturnsFalse(string segment)
|
|
|
+ {
|
|
|
+ // Arrange
|
|
|
+ var serializerOptions = JsonSerializerOptions.Default;
|
|
|
+ var targetObject = new List<string> { "a", "b", "c" };
|
|
|
+ var listAdapter = new ListAdapter();
|
|
|
+
|
|
|
+ // Act
|
|
|
+ var success = listAdapter.TryTraverse(targetObject, segment, serializerOptions, out var value, out var message);
|
|
|
+
|
|
|
+ // Assert
|
|
|
+ Assert.False(success);
|
|
|
+ Assert.Null(value);
|
|
|
+ Assert.Equal($"The path segment '{segment}' is invalid for an array index.", message);
|
|
|
+ }
|
|
|
+
|
|
|
+ [Fact]
|
|
|
+ public void TryTraverse_JsonArray_OnEmptyList_WithValidIndex_ReturnsFalse()
|
|
|
+ {
|
|
|
+ // Arrange
|
|
|
+ var serializerOptions = JsonSerializerOptions.Default;
|
|
|
+ var targetObject = new JsonArray();
|
|
|
+ var listAdapter = new ListAdapter();
|
|
|
+ var segment = "0";
|
|
|
+ // Act
|
|
|
+ var success = listAdapter.TryTraverse( targetObject, segment, serializerOptions, out var value, out var message);
|
|
|
+
|
|
|
+ // Assert
|
|
|
+ Assert.False(success);
|
|
|
+ Assert.Null(value);
|
|
|
+ Assert.Equal($"The index value provided by path segment '{segment}' is out of bounds of the array size.", message);
|
|
|
+ }
|
|
|
+
|
|
|
+ [Fact]
|
|
|
+ public void TryTraverse_NonGenericList_Fails()
|
|
|
+ {
|
|
|
+ // Arrange
|
|
|
+ var serializerOptions = JsonSerializerOptions.Default;
|
|
|
+ var targetObject = new ArrayList { 10, 20, 30 };
|
|
|
+ var listAdapter = new ListAdapter();
|
|
|
+
|
|
|
+ // Act
|
|
|
+ var success = listAdapter.TryTraverse(targetObject, "1", serializerOptions, out var value, out var message);
|
|
|
+
|
|
|
+ // Assert
|
|
|
+ Assert.False(success);
|
|
|
+ Assert.Null(value);
|
|
|
+ Assert.Equal($"The type '{targetObject.GetType().FullName}' which is a non generic list is not supported for json patch operations. Only generic list types are supported.", message);
|
|
|
+ }
|
|
|
+
|
|
|
+ [Fact]
|
|
|
+ public void TryTraverse_Array_Fails()
|
|
|
+ {
|
|
|
+ // Arrange
|
|
|
+ var serializerOptions = JsonSerializerOptions.Default;
|
|
|
+ var targetObject = new[] { 100, 200, 300 };
|
|
|
+ var listAdapter = new ListAdapter();
|
|
|
+
|
|
|
+ // Act
|
|
|
+ var success = listAdapter.TryTraverse(targetObject, "0", serializerOptions, out var value, out var message);
|
|
|
+
|
|
|
+ // Assert
|
|
|
+ Assert.False(success);
|
|
|
+ Assert.Null(value);
|
|
|
+ Assert.Equal($"The type '{targetObject.GetType().FullName}' which is an array is not supported for json patch operations as it has a fixed size.", message);
|
|
|
+ }
|
|
|
}
|