Files
sbox-public/engine/Sandbox.Test/System/Json/Pointer.cs
s&box team 71f266059a Open source release
This commit imports the C# engine code and game files, excluding C++ source code.

[Source-Commit: ceb3d758046e50faa6258bc3b658a30c97743268]
2025-11-24 09:05:18 +00:00

203 lines
4.8 KiB
C#

using System;
using System.Text.Json.Nodes;
namespace TestSystem.JsonTests;
[TestClass]
public class JsonPointerTests
{
[TestMethod]
public void Parse_EmptyPath_ReturnsRoot()
{
var pointer = new Json.Pointer( "" );
Assert.AreEqual( "/", pointer.ToString() );
Assert.AreEqual( 0, pointer.ReferenceTokens.Length );
}
[TestMethod]
[ExpectedException( typeof( ArgumentException ) )]
public void Parse_InvalidPath_ThrowsArgumentException()
{
new Json.Pointer( "invalid" ); // Missing leading '/'
}
[TestMethod]
public void Parse_ValidPath_ReturnsCorrectPointer()
{
var pointer = new Json.Pointer( "/a/0/b/1" );
Assert.AreEqual( "/a/0/b/1", pointer.ToString() );
}
[TestMethod]
public void Parse_EscapedCharacters_HandlesCorrectly()
{
var pointer = new Json.Pointer( "/~1path~1to~1resource/~0tilde" );
Assert.AreEqual( "/~1path~1to~1resource/~0tilde", pointer.ToString() );
var tokens = pointer.ReferenceTokens;
Assert.AreEqual( 2, tokens.Length );
Assert.AreEqual( "/path/to/resource", tokens[0] );
Assert.AreEqual( "~tilde", tokens[1] );
}
[TestMethod]
public void Append_Field_CreatesNewPointer()
{
var pointer = new Json.Pointer( "/" );
pointer = pointer.Append( "a" ).Append( "b" );
Assert.AreEqual( "/a/b", pointer.ToString() );
}
[TestMethod]
public void Append_Index_CreatesNewPointer()
{
var pointer = new Json.Pointer( "/" );
pointer = pointer.Append( "arr" ).Append( "0" ).Append( "1" );
Assert.AreEqual( "/arr/0/1", pointer.ToString() );
}
[TestMethod]
public void GetParent_ReturnsCorrectPointer()
{
var pointer = new Json.Pointer( "/a/b/c" );
var parent = pointer.GetParent();
Assert.AreEqual( "/a/b", parent.ToString() );
}
[TestMethod]
public void GetParent_OnRoot_ReturnsRoot()
{
var pointer = new Json.Pointer( "/" );
var parent = pointer.GetParent();
Assert.AreEqual( "/", parent.ToString() );
}
[TestMethod]
public void Evaluate_SimpleObject_ReturnsCorrectElement()
{
var json = JsonNode.Parse(
"""
{"a":{"b":"value"}}
""" );
var pointer = new Json.Pointer( "/a/b" );
var result = pointer.Evaluate( json );
Assert.AreEqual( "value", result.ToString() );
}
[TestMethod]
public void Evaluate_Array_ReturnsCorrectElement()
{
var json = JsonNode.Parse(
"""
{"arr":["first","second"]}
""" );
var pointer = new Json.Pointer( "/arr/1" );
var result = pointer.Evaluate( json );
Assert.AreEqual( "second", result.ToString() );
}
[TestMethod]
[ExpectedException( typeof( InvalidOperationException ) )]
public void Evaluate_InvalidArrayIndex_ThrowsException()
{
var json = JsonNode.Parse(
"""
{"arr":["first","second"]}
""" );
var pointer = new Json.Pointer( "/arr/2" );
pointer.Evaluate( json );
}
[TestMethod]
[ExpectedException( typeof( InvalidOperationException ) )]
public void Evaluate_MissingProperty_ThrowsException()
{
var json = JsonNode.Parse(
"""
{"a":{"b":"value"}}
""" );
var pointer = new Json.Pointer( "/a/c" );
pointer.Evaluate( json );
}
[TestMethod]
public void Evaluate_ComplexPath_ReturnsCorrectElement()
{
var json = JsonNode.Parse(
"""
{
"foo": {
"bar": {
"baz": [
{"qux": "value"},
{"qux": "target"}
]
}
}
}
""" );
var pointer = new Json.Pointer( "/foo/bar/baz/1/qux" );
var result = pointer.Evaluate( json );
Assert.AreEqual( "target", result.ToString() );
}
[TestMethod]
public void Evaluate_NumericObjectKeys_ReturnsCorrectElement()
{
var json = JsonNode.Parse(
"""
{
"obj": {
"0": "zero as string key",
"1": {
"42": "nested numeric key",
"arr": [
"array element"
]
}
},
"arr": [
"first",
"second"
]
}
""" );
// Test numeric key in object (should not be treated as array index)
var pointer1 = new Json.Pointer( "/obj/0" );
var result1 = pointer1.Evaluate( json );
Assert.AreEqual( "zero as string key", result1.ToString() );
// Test nested numeric key
var pointer2 = new Json.Pointer( "/obj/1/42" );
var result2 = pointer2.Evaluate( json );
Assert.AreEqual( "nested numeric key", result2.ToString() );
// Test array index after numeric object keys
var pointer3 = new Json.Pointer( "/obj/1/arr/0" );
var result3 = pointer3.Evaluate( json );
Assert.AreEqual( "array element", result3.ToString() );
// Test actual array index for comparison
var pointer4 = new Json.Pointer( "/arr/0" );
var result4 = pointer4.Evaluate( json );
Assert.AreEqual( "first", result4.ToString() );
}
[TestMethod]
public void Evaluate_EscapedCharacters_ReturnsCorrectElement()
{
var json = JsonNode.Parse(
"""
{
"~tilde": {
"slash/path": "value"
}
}
""" );
var pointer = new Json.Pointer( "/~0tilde/slash~1path" );
var result = pointer.Evaluate( json );
Assert.AreEqual( "value", result.ToString() );
}
}