Skip to content

Commit bdbecda

Browse files
committed
Add JsonExtensionData support
1 parent bfe6a8f commit bdbecda

File tree

2 files changed

+290
-1
lines changed

2 files changed

+290
-1
lines changed
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
using System.Collections.Generic;
2+
using System.Text.Json.Serialization;
3+
using NUnit.Framework;
4+
5+
namespace Tomlyn.Tests;
6+
7+
public sealed class NewApiExtensionDataTests
8+
{
9+
private sealed class ExtensionDataModel
10+
{
11+
public int Known { get; set; }
12+
13+
[JsonExtensionData]
14+
public Dictionary<string, object?> Extra { get; set; } = new();
15+
}
16+
17+
private sealed class NullableExtensionDataModel
18+
{
19+
public int Known { get; set; }
20+
21+
[JsonExtensionData]
22+
public Dictionary<string, object?>? Extra { get; set; }
23+
}
24+
25+
[Test]
26+
public void Deserialize_StoresUnknownKeys_IntoExtensionData()
27+
{
28+
var model = TomlSerializer.Deserialize<ExtensionDataModel>("Known = 1\nUnknown = \"x\"\n");
29+
Assert.That(model, Is.Not.Null);
30+
Assert.That(model!.Known, Is.EqualTo(1));
31+
Assert.That(model.Extra.ContainsKey("Unknown"), Is.True);
32+
Assert.That(model.Extra["Unknown"], Is.EqualTo("x"));
33+
}
34+
35+
[Test]
36+
public void Serialize_MergesExtensionData_IntoSurroundingTable()
37+
{
38+
var model = new ExtensionDataModel
39+
{
40+
Known = 1,
41+
Extra = new Dictionary<string, object?> { ["Unknown"] = "x" },
42+
};
43+
44+
var toml = TomlSerializer.Serialize(model);
45+
Assert.That(toml, Does.Contain("Known"));
46+
Assert.That(toml, Does.Contain("Unknown"));
47+
}
48+
49+
[Test]
50+
public void Serialize_ThrowsOnExtensionDataKeyConflict()
51+
{
52+
var model = new ExtensionDataModel
53+
{
54+
Known = 1,
55+
Extra = new Dictionary<string, object?> { ["Known"] = 2 },
56+
};
57+
58+
Assert.Throws<TomlException>(() => TomlSerializer.Serialize(model));
59+
}
60+
61+
[Test]
62+
public void Deserialize_InitializesNullExtensionDataDictionary_WhenSettable()
63+
{
64+
var model = TomlSerializer.Deserialize<NullableExtensionDataModel>("Known = 1\nUnknown = 2\n");
65+
Assert.That(model, Is.Not.Null);
66+
Assert.That(model!.Extra, Is.Not.Null);
67+
Assert.That(model.Extra!.ContainsKey("Unknown"), Is.True);
68+
Assert.That(model.Extra["Unknown"], Is.EqualTo(2L));
69+
}
70+
}
71+

0 commit comments

Comments
 (0)