-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSerializationTests.cs
More file actions
81 lines (68 loc) · 3.24 KB
/
Copy pathSerializationTests.cs
File metadata and controls
81 lines (68 loc) · 3.24 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
using AuroraScript.Runtime;
using AuroraScript.Runtime.Serialization;
using AuroraScript.Runtime.Types;
using System;
using Xunit;
namespace AuroraScript.Tests;
public sealed class SerializationTests
{
[Fact]
public void SerializesPrimitiveDatumsWithInvariantJsonRepresentation()
{
var serializer = ScriptJsonSerializer.Default;
Assert.Equal("null", serializer.Serialize(ScriptDatum.Null));
Assert.Equal("true", serializer.Serialize(ScriptDatum.FromBoolean(true)));
Assert.Equal("42.5", serializer.Serialize(ScriptDatum.FromNumber(42.5)));
Assert.Equal("\"Aurora\\nScript\"", serializer.Serialize(ScriptDatum.FromString("Aurora\nScript")));
}
[Fact]
public void SerializesNestedArraysAndObjectsAndSupportsIndentation()
{
var value = new ScriptObject();
value.Define("name", ScriptDatum.FromString("Aurora"));
value.Define("items", new ScriptArray([ScriptDatum.FromNumber(1), ScriptDatum.FromBoolean(true), ScriptDatum.Null]));
var compact = ScriptJsonSerializer.Default.Serialize(ScriptDatum.FromObject(value));
var indented = ScriptJsonSerializer.Default.Serialize(ScriptDatum.FromObject(value), indented: true);
Assert.Equal("{\"name\":\"Aurora\",\"items\":[1,true,null]}", compact);
Assert.Contains(Environment.NewLine, indented);
}
[Fact]
public void DeserializesEveryJsonValueKind()
{
var value = ScriptJsonSerializer.Default.Deserialize(
"{\"text\":\"x\",\"number\":2.5,\"yes\":true,\"no\":false,\"none\":null,\"items\":[1,2]}");
Assert.Equal("x", value.GetPropertyValue("text").ToString());
Assert.Equal("2.5", value.GetPropertyValue("number").ToString());
Assert.Same(BooleanValue.True, value.GetPropertyValue("yes"));
Assert.Same(BooleanValue.False, value.GetPropertyValue("no"));
Assert.Same(ScriptObject.Null, value.GetPropertyValue("none"));
Assert.Equal(2, Assert.IsType<ScriptArray>(value.GetPropertyValue("items")).Length);
}
[Fact]
public void StandardSerializerRejectsCircularObjectAndArrayGraphs()
{
var objectValue = new ScriptObject();
objectValue.Define("self", objectValue);
var arrayValue = new ScriptArray(1);
arrayValue.SetElement(0, ScriptDatum.FromObject(arrayValue));
Assert.Throws<AuroraRuntimeException>(() => ScriptJsonSerializer.Default.Serialize(ScriptDatum.FromObject(objectValue)));
Assert.Throws<AuroraRuntimeException>(() => ScriptJsonSerializer.Default.Serialize(ScriptDatum.FromObject(arrayValue)));
}
[Fact]
public void SerializesNonFiniteNumbersAsNull()
{
var serializer = ScriptJsonSerializer.Default;
Assert.Equal("null", serializer.Serialize(ScriptDatum.FromNumber(double.NaN)));
Assert.Equal("null", serializer.Serialize(ScriptDatum.FromNumber(double.PositiveInfinity)));
Assert.Equal("null", serializer.Serialize(ScriptDatum.FromNumber(double.NegativeInfinity)));
}
[Theory]
[InlineData("")]
[InlineData("{")]
[InlineData("not-json")]
[InlineData("[1,]")]
public void RejectsMalformedJson(string json)
{
Assert.ThrowsAny<Exception>(() => ScriptJsonSerializer.Default.Deserialize(json));
}
}