e3b69731577da30cf3342ee85cefa256bc69b753
[platform/upstream/dotnet/runtime.git] /
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.
4
5 using Xunit;
6
7 namespace System.Text.Json.Serialization.Tests
8 {
9     public abstract partial class ConstructorTests
10     {
11         [Fact]
12         public void NonPublicCtors_NotSupported()
13         {
14             void RunTest<T>()
15             {
16                 NotSupportedException ex = Assert.Throws<NotSupportedException>(() => Serializer.Deserialize<T>("{}"));
17                 Assert.Contains("JsonConstructorAttribute", ex.ToString());
18             }
19
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>();
29         }
30
31         [Fact]
32         public void SinglePublicParameterizedCtor_SingleParameterlessCtor_NoAttribute_Supported_UseParameterlessCtor()
33         {
34             var obj1 = Serializer.Deserialize<SinglePublicParameterizedCtor>(@"{""MyInt"":1,""MyString"":""1""}");
35             Assert.Equal(@"{""MyInt"":0,""MyString"":null}", JsonSerializer.Serialize(obj1));
36         }
37
38         [Fact]
39         public void MultiplePublicParameterizedCtors_SingleParameterlessCtor_NoAttribute_Supported_UseParameterlessCtor()
40         {
41             void RunTest<T>()
42             {
43                 var obj1 = Serializer.Deserialize<T>(@"{""MyInt"":1,""MyString"":""1""}");
44                 Assert.Equal(@"{""MyInt"":0,""MyString"":null}", JsonSerializer.Serialize(obj1));
45             }
46
47             RunTest<SingleParameterlessCtor_MultiplePublicParameterizedCtor>();
48             RunTest<SingleParameterlessCtor_MultiplePublicParameterizedCtor_Struct>();
49         }
50
51         [Fact]
52         public void SinglePublicParameterizedCtor_NoPublicParameterlessCtor_NoAttribute_Supported()
53         {
54             void RunTest<T>()
55             {
56                 var obj1 = Serializer.Deserialize<T>(@"{""MyInt"":1}");
57                 Assert.Equal(@"{""MyInt"":1}", JsonSerializer.Serialize(obj1));
58             }
59
60             RunTest<PublicParameterizedCtor>();
61             RunTest<PrivateParameterlessConstructor_PublicParameterizedCtor>();
62         }
63
64         [Fact]
65         public void SinglePublicParameterizedCtor_NoPublicParameterlessCtor_WithAttribute_Supported()
66         {
67             void RunTest<T>()
68             {
69                 var obj1 = Serializer.Deserialize<T>(@"{""MyInt"":1}");
70                 Assert.Equal(@"{""MyInt"":1}", JsonSerializer.Serialize(obj1));
71             }
72
73             RunTest<PublicParameterizedCtor_WithAttribute>();
74             RunTest<Struct_PublicParameterizedConstructor_WithAttribute>();
75             RunTest<PrivateParameterlessConstructor_PublicParameterizedCtor_WithAttribute>();
76         }
77
78         [Fact]
79         public void Class_MultiplePublicParameterizedCtors_NoPublicParameterlessCtor_NoAttribute_NotSupported()
80         {
81             Assert.Throws<NotSupportedException>(() => Serializer.Deserialize<MultiplePublicParameterizedCtor>(@"{""MyInt"":1,""MyString"":""1""}"));
82         }
83
84         [Fact]
85         public void Struct_MultiplePublicParameterizedCtors_NoPublicParameterlessCtor_NoAttribute_Supported_UseParameterlessCtor()
86         {
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));
91         }
92
93         [Fact]
94         public void NoPublicParameterlessCtor_MultiplePublicParameterizedCtors_WithAttribute_Supported()
95         {
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));
100
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));
105         }
106
107         [Fact]
108         public void PublicParameterlessCtor_MultiplePublicParameterizedCtors_WithAttribute_Supported()
109         {
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));
114         }
115
116         [Fact]
117         public void MultipleAttributes_NotSupported()
118         {
119             void RunTest<T>()
120             {
121                 Assert.Throws<InvalidOperationException>(() => Serializer.Deserialize<T>("{}"));
122             }
123
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>();
133         }
134
135         [Fact]
136         public void AttributeIgnoredOnIEnumerable()
137         {
138             void RunTest<T>()
139             {
140                 Assert.Throws<NotSupportedException>(() => Serializer.Deserialize<T>("[]"));
141             }
142
143             RunTest<Parameterized_StackWrapper>();
144             RunTest<Parameterized_WrapperForICollection>();
145         }
146
147         [Fact]
148         public void Struct_Use_DefaultCtor_ByDefault()
149         {
150             string json = @"{""X"":1,""Y"":2}";
151
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);
156
157             var point2 = Serializer.Deserialize<Point_2D_Struct_WithAttribute>(json);
158             Assert.Equal(1, point2.X);
159             Assert.Equal(2, point2.Y);
160         }
161     }
162 }