Skip to content

Commit a6751b6

Browse files
authored
Merge pull request #40 from merge-api/fern-bot/02-10-2025-0844PM
List functionality bug fixes
2 parents ced1437 + 21e8e58 commit a6751b6

File tree

1,478 files changed

+16978
-10120
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

1,478 files changed

+16978
-10120
lines changed

.gitignore

+484-484
Large diffs are not rendered by default.

reference.md

+8,166-1
Large diffs are not rendered by default.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
using System.Runtime.Serialization;
2+
using System.Text.Json;
3+
using System.Text.Json.Serialization;
4+
using Merge.Client.Core;
5+
using NUnit.Framework;
6+
7+
namespace Merge.Client.Test.Core;
8+
9+
[TestFixture]
10+
public class StringEnumSerializerTests
11+
{
12+
private static readonly JsonSerializerOptions JsonOptions = new() { WriteIndented = true };
13+
14+
private const DummyEnum KnownEnumValue2 = DummyEnum.KnownValue2;
15+
private const string KnownEnumValue2String = "known_value2";
16+
17+
private const string JsonWithKnownEnum2 = $$"""
18+
{
19+
"enum_property": "{{KnownEnumValue2String}}"
20+
}
21+
""";
22+
23+
[Test]
24+
public void ShouldParseKnownEnumValue2()
25+
{
26+
var obj = JsonSerializer.Deserialize<DummyObject>(JsonWithKnownEnum2, JsonOptions);
27+
Assert.That(obj, Is.Not.Null);
28+
Assert.That(obj.EnumProperty, Is.EqualTo(KnownEnumValue2));
29+
}
30+
31+
[Test]
32+
public void ShouldSerializeKnownEnumValue2()
33+
{
34+
var json = JsonSerializer.SerializeToElement(
35+
new DummyObject { EnumProperty = KnownEnumValue2 },
36+
JsonOptions
37+
);
38+
TestContext.Out.WriteLine("Serialized JSON: \n" + json);
39+
var enumString = json.GetProperty("enum_property").GetString();
40+
Assert.That(enumString, Is.Not.Null);
41+
Assert.That(enumString, Is.EqualTo(KnownEnumValue2String));
42+
}
43+
}
44+
45+
public class DummyObject
46+
{
47+
[JsonPropertyName("enum_property")]
48+
public DummyEnum EnumProperty { get; set; }
49+
}
50+
51+
[JsonConverter(typeof(EnumSerializer<DummyEnum>))]
52+
public enum DummyEnum
53+
{
54+
[EnumMember(Value = "known_value1")]
55+
KnownValue1,
56+
57+
[EnumMember(Value = "known_value2")]
58+
KnownValue2,
59+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,310 @@
1+
using System.Text.Json;
2+
using System.Text.Json.Serialization;
3+
using Merge.Client.Core;
4+
using NUnit.Framework;
5+
using OneOf;
6+
7+
namespace Merge.Client.Test.Core;
8+
9+
[TestFixture]
10+
public class OneOfSerializerTests
11+
{
12+
private class Foo
13+
{
14+
[JsonPropertyName("string_prop")]
15+
public required string StringProp { get; set; }
16+
}
17+
18+
private class Bar
19+
{
20+
[JsonPropertyName("int_prop")]
21+
public required int IntProp { get; set; }
22+
}
23+
24+
private static readonly OneOf<string, int, object, Foo, Bar> OneOf1 = OneOf<
25+
string,
26+
int,
27+
object,
28+
Foo,
29+
Bar
30+
>.FromT2(new { });
31+
private const string OneOf1String = "{}";
32+
33+
private static readonly OneOf<string, int, object, Foo, Bar> OneOf2 = OneOf<
34+
string,
35+
int,
36+
object,
37+
Foo,
38+
Bar
39+
>.FromT0("test");
40+
private const string OneOf2String = "\"test\"";
41+
42+
private static readonly OneOf<string, int, object, Foo, Bar> OneOf3 = OneOf<
43+
string,
44+
int,
45+
object,
46+
Foo,
47+
Bar
48+
>.FromT1(123);
49+
private const string OneOf3String = "123";
50+
51+
private static readonly OneOf<string, int, object, Foo, Bar> OneOf4 = OneOf<
52+
string,
53+
int,
54+
object,
55+
Foo,
56+
Bar
57+
>.FromT3(new Foo { StringProp = "test" });
58+
private const string OneOf4String = "{\n \"string_prop\": \"test\"\n}";
59+
60+
private static readonly OneOf<string, int, object, Foo, Bar> OneOf5 = OneOf<
61+
string,
62+
int,
63+
object,
64+
Foo,
65+
Bar
66+
>.FromT4(new Bar { IntProp = 5 });
67+
private const string OneOf5String = "{\n \"int_prop\": 5\n}";
68+
69+
[Test]
70+
public void Serialize_OneOfs_Should_Return_Expected_String()
71+
{
72+
(OneOf<string, int, object, Foo, Bar>, string)[] testData =
73+
[
74+
(OneOf1, OneOf1String),
75+
(OneOf2, OneOf2String),
76+
(OneOf3, OneOf3String),
77+
(OneOf4, OneOf4String),
78+
(OneOf5, OneOf5String),
79+
];
80+
Assert.Multiple(() =>
81+
{
82+
foreach (var (oneOf, expected) in testData)
83+
{
84+
var result = JsonUtils.Serialize(oneOf);
85+
Assert.That(result, Is.EqualTo(expected));
86+
}
87+
});
88+
}
89+
90+
[Test]
91+
public void OneOfs_Should_Deserialize_From_String()
92+
{
93+
(OneOf<string, int, object, Foo, Bar>, string)[] testData =
94+
[
95+
(OneOf1, OneOf1String),
96+
(OneOf2, OneOf2String),
97+
(OneOf3, OneOf3String),
98+
(OneOf4, OneOf4String),
99+
(OneOf5, OneOf5String),
100+
];
101+
Assert.Multiple(() =>
102+
{
103+
foreach (var (oneOf, json) in testData)
104+
{
105+
var result = JsonUtils.Deserialize<OneOf<string, int, object, Foo, Bar>>(json);
106+
Assert.That(result.Index, Is.EqualTo(oneOf.Index));
107+
Assert.That(json, Is.EqualTo(JsonUtils.Serialize(result.Value)));
108+
}
109+
});
110+
}
111+
112+
private static readonly OneOf<string, int, object, Foo, Bar>? NullableOneOf1 = null;
113+
private const string NullableOneOf1String = "null";
114+
115+
private static readonly OneOf<string, int, object, Foo, Bar>? NullableOneOf2 = OneOf<
116+
string,
117+
int,
118+
object,
119+
Foo,
120+
Bar
121+
>.FromT4(new Bar { IntProp = 5 });
122+
private const string NullableOneOf2String = "{\n \"int_prop\": 5\n}";
123+
124+
[Test]
125+
public void Serialize_NullableOneOfs_Should_Return_Expected_String()
126+
{
127+
(OneOf<string, int, object, Foo, Bar>?, string)[] testData =
128+
[
129+
(NullableOneOf1, NullableOneOf1String),
130+
(NullableOneOf2, NullableOneOf2String),
131+
];
132+
Assert.Multiple(() =>
133+
{
134+
foreach (var (oneOf, expected) in testData)
135+
{
136+
var result = JsonUtils.Serialize(oneOf);
137+
Assert.That(result, Is.EqualTo(expected));
138+
}
139+
});
140+
}
141+
142+
[Test]
143+
public void NullableOneOfs_Should_Deserialize_From_String()
144+
{
145+
(OneOf<string, int, object, Foo, Bar>?, string)[] testData =
146+
[
147+
(NullableOneOf1, NullableOneOf1String),
148+
(NullableOneOf2, NullableOneOf2String),
149+
];
150+
Assert.Multiple(() =>
151+
{
152+
foreach (var (oneOf, json) in testData)
153+
{
154+
var result = JsonUtils.Deserialize<OneOf<string, int, object, Foo, Bar>?>(json);
155+
Assert.That(result?.Index, Is.EqualTo(oneOf?.Index));
156+
Assert.That(json, Is.EqualTo(JsonUtils.Serialize(result?.Value)));
157+
}
158+
});
159+
}
160+
161+
private static readonly OneOf<string, int, Foo?> OneOfWithNullable1 = OneOf<
162+
string,
163+
int,
164+
Foo?
165+
>.FromT2(null);
166+
private const string OneOfWithNullable1String = "null";
167+
168+
private static readonly OneOf<string, int, Foo?> OneOfWithNullable2 = OneOf<
169+
string,
170+
int,
171+
Foo?
172+
>.FromT2(new Foo { StringProp = "test" });
173+
private const string OneOfWithNullable2String = "{\n \"string_prop\": \"test\"\n}";
174+
175+
private static readonly OneOf<string, int, Foo?> OneOfWithNullable3 = OneOf<
176+
string,
177+
int,
178+
Foo?
179+
>.FromT0("test");
180+
private const string OneOfWithNullable3String = "\"test\"";
181+
182+
[Test]
183+
public void Serialize_OneOfWithNullables_Should_Return_Expected_String()
184+
{
185+
(OneOf<string, int, Foo?>, string)[] testData =
186+
[
187+
(OneOfWithNullable1, OneOfWithNullable1String),
188+
(OneOfWithNullable2, OneOfWithNullable2String),
189+
(OneOfWithNullable3, OneOfWithNullable3String),
190+
];
191+
Assert.Multiple(() =>
192+
{
193+
foreach (var (oneOf, expected) in testData)
194+
{
195+
var result = JsonUtils.Serialize(oneOf);
196+
Assert.That(result, Is.EqualTo(expected));
197+
}
198+
});
199+
}
200+
201+
[Test]
202+
public void OneOfWithNullables_Should_Deserialize_From_String()
203+
{
204+
(OneOf<string, int, Foo?>, string)[] testData =
205+
[
206+
// (OneOfWithNullable1, OneOfWithNullable1String), // not possible with .NET's JSON serializer
207+
(OneOfWithNullable2, OneOfWithNullable2String),
208+
(OneOfWithNullable3, OneOfWithNullable3String),
209+
];
210+
Assert.Multiple(() =>
211+
{
212+
foreach (var (oneOf, json) in testData)
213+
{
214+
var result = JsonUtils.Deserialize<OneOf<string, int, Foo?>>(json);
215+
Assert.That(result.Index, Is.EqualTo(oneOf.Index));
216+
Assert.That(json, Is.EqualTo(JsonUtils.Serialize(result.Value)));
217+
}
218+
});
219+
}
220+
221+
[Test]
222+
public void Serialize_OneOfWithObjectLast_Should_Return_Expected_String()
223+
{
224+
var oneOfWithObjectLast = OneOf<string, int, Foo, Bar, object>.FromT4(
225+
new { random = "data" }
226+
);
227+
const string oneOfWithObjectLastString = "{\n \"random\": \"data\"\n}";
228+
229+
var result = JsonUtils.Serialize(oneOfWithObjectLast);
230+
Assert.That(result, Is.EqualTo(oneOfWithObjectLastString));
231+
}
232+
233+
[Test]
234+
public void OneOfWithObjectLast_Should_Deserialize_From_String()
235+
{
236+
const string oneOfWithObjectLastString = "{\n \"random\": \"data\"\n}";
237+
var result = JsonUtils.Deserialize<OneOf<string, int, Foo, Bar, object>>(
238+
oneOfWithObjectLastString
239+
);
240+
Assert.Multiple(() =>
241+
{
242+
Assert.That(result.Index, Is.EqualTo(4));
243+
Assert.That(result.Value, Is.InstanceOf<object>());
244+
Assert.That(JsonUtils.Serialize(result.Value), Is.EqualTo(oneOfWithObjectLastString));
245+
});
246+
}
247+
248+
[Test]
249+
public void Serialize_OneOfWithObjectNotLast_Should_Return_Expected_String()
250+
{
251+
var oneOfWithObjectNotLast = OneOf<string, object, int, Foo, Bar>.FromT1(
252+
new { random = "data" }
253+
);
254+
const string oneOfWithObjectNotLastString = "{\n \"random\": \"data\"\n}";
255+
256+
var result = JsonUtils.Serialize(oneOfWithObjectNotLast);
257+
Assert.That(result, Is.EqualTo(oneOfWithObjectNotLastString));
258+
}
259+
260+
[Test]
261+
public void OneOfWithObjectNotLast_Should_Deserialize_From_String()
262+
{
263+
const string oneOfWithObjectNotLastString = "{\n \"random\": \"data\"\n}";
264+
var result = JsonUtils.Deserialize<OneOf<string, object, int, Foo, Bar>>(
265+
oneOfWithObjectNotLastString
266+
);
267+
Assert.Multiple(() =>
268+
{
269+
Assert.That(result.Index, Is.EqualTo(1));
270+
Assert.That(result.Value, Is.InstanceOf<object>());
271+
Assert.That(
272+
JsonUtils.Serialize(result.Value),
273+
Is.EqualTo(oneOfWithObjectNotLastString)
274+
);
275+
});
276+
}
277+
278+
[Test]
279+
public void Serialize_OneOfSingleType_Should_Return_Expected_String()
280+
{
281+
var oneOfSingle = OneOf<string>.FromT0("single");
282+
const string oneOfSingleString = "\"single\"";
283+
284+
var result = JsonUtils.Serialize(oneOfSingle);
285+
Assert.That(result, Is.EqualTo(oneOfSingleString));
286+
}
287+
288+
[Test]
289+
public void OneOfSingleType_Should_Deserialize_From_String()
290+
{
291+
const string oneOfSingleString = "\"single\"";
292+
var result = JsonUtils.Deserialize<OneOf<string>>(oneOfSingleString);
293+
Assert.Multiple(() =>
294+
{
295+
Assert.That(result.Index, Is.EqualTo(0));
296+
Assert.That(result.Value, Is.EqualTo("single"));
297+
});
298+
}
299+
300+
[Test]
301+
public void Deserialize_InvalidData_Should_Throw_Exception()
302+
{
303+
const string invalidJson = "{\"invalid\": \"data\"}";
304+
305+
Assert.Throws<JsonException>(() =>
306+
{
307+
JsonUtils.Deserialize<OneOf<string, int>>(invalidJson);
308+
});
309+
}
310+
}

0 commit comments

Comments
 (0)