1 //Licensed to the.NET Foundation under one or more agreements.
2 //The.NET Foundation licenses this file to you under the MIT license.
3 //See the LICENSE file in the project root for more information.
7 namespace System.Text.Json.Serialization.Tests
9 public abstract partial class ConstructorTests
12 public void NonPublicCtors_NotSupported()
16 NotSupportedException ex = Assert.Throws<NotSupportedException>(() => Serializer.Deserialize<T>("{}"));
17 Assert.Contains("JsonConstructorAttribute", ex.ToString());
20 RunTest<PrivateParameterlessCtor>();
21 RunTest<InternalParameterlessCtor>();
22 RunTest<ProtectedParameterlessCtor>();
23 RunTest<PrivateParameterizedCtor>();
24 RunTest<InternalParameterizedCtor>();
25 RunTest<ProtectedParameterizedCtor>();
26 RunTest<PrivateParameterizedCtor_WithAttribute>();
27 RunTest<InternalParameterizedCtor_WithAttribute>();
28 RunTest<ProtectedParameterizedCtor_WithAttribute>();
32 public void SinglePublicParameterizedCtor_SingleParameterlessCtor_NoAttribute_Supported_UseParameterlessCtor()
34 var obj1 = Serializer.Deserialize<SinglePublicParameterizedCtor>(@"{""MyInt"":1,""MyString"":""1""}");
35 Assert.Equal(@"{""MyInt"":0,""MyString"":null}", JsonSerializer.Serialize(obj1));
39 public void MultiplePublicParameterizedCtors_SingleParameterlessCtor_NoAttribute_Supported_UseParameterlessCtor()
43 var obj1 = Serializer.Deserialize<T>(@"{""MyInt"":1,""MyString"":""1""}");
44 Assert.Equal(@"{""MyInt"":0,""MyString"":null}", JsonSerializer.Serialize(obj1));
47 RunTest<SingleParameterlessCtor_MultiplePublicParameterizedCtor>();
48 RunTest<SingleParameterlessCtor_MultiplePublicParameterizedCtor_Struct>();
52 public void SinglePublicParameterizedCtor_NoPublicParameterlessCtor_NoAttribute_Supported()
56 var obj1 = Serializer.Deserialize<T>(@"{""MyInt"":1}");
57 Assert.Equal(@"{""MyInt"":1}", JsonSerializer.Serialize(obj1));
60 RunTest<PublicParameterizedCtor>();
61 RunTest<PrivateParameterlessConstructor_PublicParameterizedCtor>();
65 public void SinglePublicParameterizedCtor_NoPublicParameterlessCtor_WithAttribute_Supported()
69 var obj1 = Serializer.Deserialize<T>(@"{""MyInt"":1}");
70 Assert.Equal(@"{""MyInt"":1}", JsonSerializer.Serialize(obj1));
73 RunTest<PublicParameterizedCtor_WithAttribute>();
74 RunTest<Struct_PublicParameterizedConstructor_WithAttribute>();
75 RunTest<PrivateParameterlessConstructor_PublicParameterizedCtor_WithAttribute>();
79 public void Class_MultiplePublicParameterizedCtors_NoPublicParameterlessCtor_NoAttribute_NotSupported()
81 Assert.Throws<NotSupportedException>(() => Serializer.Deserialize<MultiplePublicParameterizedCtor>(@"{""MyInt"":1,""MyString"":""1""}"));
85 public void Struct_MultiplePublicParameterizedCtors_NoPublicParameterlessCtor_NoAttribute_Supported_UseParameterlessCtor()
87 var obj = Serializer.Deserialize<MultiplePublicParameterizedCtor_Struct>(@"{""myInt"":1,""myString"":""1""}");
88 Assert.Equal(0, obj.MyInt);
89 Assert.Null(obj.MyString);
90 Assert.Equal(@"{""MyInt"":0,""MyString"":null}", JsonSerializer.Serialize(obj));
94 public void NoPublicParameterlessCtor_MultiplePublicParameterizedCtors_WithAttribute_Supported()
96 var obj1 = Serializer.Deserialize<MultiplePublicParameterizedCtor_WithAttribute>(@"{""MyInt"":1,""MyString"":""1""}");
97 Assert.Equal(1, obj1.MyInt);
98 Assert.Null(obj1.MyString);
99 Assert.Equal(@"{""MyInt"":1,""MyString"":null}", JsonSerializer.Serialize(obj1));
101 var obj2 = Serializer.Deserialize<MultiplePublicParameterizedCtor_WithAttribute_Struct>(@"{""MyInt"":1,""MyString"":""1""}");
102 Assert.Equal(1, obj2.MyInt);
103 Assert.Equal("1", obj2.MyString);
104 Assert.Equal(@"{""MyInt"":1,""MyString"":""1""}", JsonSerializer.Serialize(obj2));
108 public void PublicParameterlessCtor_MultiplePublicParameterizedCtors_WithAttribute_Supported()
110 var obj = Serializer.Deserialize<ParameterlessCtor_MultiplePublicParameterizedCtor_WithAttribute>(@"{""MyInt"":1,""MyString"":""1""}");
111 Assert.Equal(1, obj.MyInt);
112 Assert.Null(obj.MyString);
113 Assert.Equal(@"{""MyInt"":1,""MyString"":null}", JsonSerializer.Serialize(obj));
117 public void MultipleAttributes_NotSupported()
121 Assert.Throws<InvalidOperationException>(() => Serializer.Deserialize<T>("{}"));
124 RunTest<MultiplePublicParameterizedCtor_WithMultipleAttributes>();
125 RunTest<PublicParameterlessConstructor_PublicParameterizedCtor_WithMultipleAttributes>();
126 RunTest<PrivateParameterlessCtor_InternalParameterizedCtor_WithMultipleAttributes>();
127 RunTest<ProtectedParameterlessCtor_PrivateParameterizedCtor_WithMultipleAttributes>();
128 RunTest<PublicParameterlessCtor_PrivateParameterizedCtor_WithMultipleAttributes>();
129 RunTest<PublicParameterizedCtor_PublicParameterizedCtor_WithMultipleAttributes>();
130 RunTest<Struct_PublicParameterizedCtor_PrivateParameterizedCtor_WithMultipleAttributes>();
131 RunTest<Point_2D_Struct_WithMultipleAttributes>();
132 RunTest<Point_2D_Struct_WithMultipleAttributes_OneNonPublic>();
136 public void AttributeIgnoredOnIEnumerable()
140 Assert.Throws<NotSupportedException>(() => Serializer.Deserialize<T>("[]"));
143 RunTest<Parameterized_StackWrapper>();
144 RunTest<Parameterized_WrapperForICollection>();
148 public void Struct_Use_DefaultCtor_ByDefault()
150 string json = @"{""X"":1,""Y"":2}";
152 // By default, serializer uses default ctor to deserializer structs
153 var point1 = Serializer.Deserialize<Point_2D_Struct>(json);
154 Assert.Equal(0, point1.X);
155 Assert.Equal(0, point1.Y);
157 var point2 = Serializer.Deserialize<Point_2D_Struct_WithAttribute>(json);
158 Assert.Equal(1, point2.X);
159 Assert.Equal(2, point2.Y);