@@ -103,6 +103,118 @@ public void RoundTripNamedValueTuple(JsonSerializer addSerializers, JsonSerializ
103
103
Assert . Equal ( "abc" , obj . Y ) ;
104
104
}
105
105
106
+ [ Fact ]
107
+ public void RoundTripValueTupleList ( )
108
+ {
109
+ List < ( int , string ) > source = [ ( 1 , "a" ) , ( 2 , "b" ) ] ;
110
+ var clone = RoundTrip ( source , """[{"Item1":1,"Item2":"a"},{"Item1":2,"Item2":"b"}]"""u8 , JsonSerializer . FieldEnabled ) ;
111
+ Assert . Equal ( source , clone ) ;
112
+ }
113
+
114
+ [ Fact ]
115
+ public void RoundTripValueTupleArray ( )
116
+ {
117
+ ( int , string ) [ ] source = [ ( 1 , "a" ) , ( 2 , "b" ) ] ;
118
+ var clone = RoundTrip ( source , """[{"Item1":1,"Item2":"a"},{"Item1":2,"Item2":"b"}]"""u8 , JsonSerializer . FieldEnabled ) ;
119
+ Assert . Equal ( source , clone ) ;
120
+ }
121
+
122
+ [ Fact ]
123
+ public void RoundTripTupleList ( )
124
+ {
125
+ List < Tuple < int , string > > source = [ Tuple . Create ( 1 , "a" ) , Tuple . Create ( 2 , "b" ) ] ;
126
+ var clone = RoundTrip ( source , """[{"Item1":1,"Item2":"a"},{"Item1":2,"Item2":"b"}]"""u8 , JsonSerializer . Default ) ;
127
+ Assert . Equal ( source , clone ) ;
128
+ }
129
+
130
+ [ Fact ]
131
+ public void RoundTripTupleArray ( )
132
+ {
133
+ Tuple < int , string > [ ] source = [ Tuple . Create ( 1 , "a" ) , Tuple . Create ( 2 , "b" ) ] ;
134
+ var clone = RoundTrip ( source , """[{"Item1":1,"Item2":"a"},{"Item1":2,"Item2":"b"}]"""u8 , JsonSerializer . Default ) ;
135
+ Assert . Equal ( source , clone ) ;
136
+ }
137
+
138
+ [ Fact ]
139
+ public void RoundTripFieldOnlyPoco ( )
140
+ {
141
+ var source = new FieldOnlyPoco { X = 1 , Y = "a" } ;
142
+ var clone = RoundTrip ( source , """{"X":1,"Y":"a"}"""u8 , JsonSerializer . FieldEnabled ) ;
143
+ Assert . Equal ( 1 , clone . X ) ;
144
+ Assert . Equal ( "a" , clone . Y ) ;
145
+ }
146
+
147
+ [ Fact ]
148
+ public void RoundTripPropertyOnlyPoco ( )
149
+ {
150
+ var source = new PropertyOnlyPoco { X = 1 , Y = "a" } ;
151
+ var clone = RoundTrip ( source , """{"X":1,"Y":"a"}"""u8 , JsonSerializer . Default ) ;
152
+ Assert . Equal ( 1 , clone . X ) ;
153
+ Assert . Equal ( "a" , clone . Y ) ;
154
+ }
155
+
156
+ [ Fact ]
157
+ public void RoundTripMixedPoco ( )
158
+ {
159
+ // this is the self-inflicted scenario; intent isn't obvious, so: we defer to STJ conventions,
160
+ // which means we lose the field
161
+ var source = new MixedFieldPropertyPoco { X = 1 , Y = "a" } ;
162
+ var clone = RoundTrip ( source , """{"Y":"a"}"""u8 , JsonSerializer . Default ) ;
163
+ Assert . Equal ( 0 , clone . X ) ; // <== drop
164
+ Assert . Equal ( "a" , clone . Y ) ;
165
+ }
166
+
167
+ [ Fact ]
168
+ public void RoundTripTree ( )
169
+ {
170
+ NodeA < string > source = new NodeA < string >
171
+ {
172
+ Value = "abc" ,
173
+ Next = new ( )
174
+ {
175
+ Value = "def"
176
+ }
177
+ } ;
178
+
179
+ var clone = RoundTrip ( source , """{"Next":{"Next":null,"Value":"def"},"Value":"abc"}"""u8 , JsonSerializer . Default ) ;
180
+ Assert . Equal ( "abc" , clone . Value ) ;
181
+ Assert . NotNull ( clone . Next ) ;
182
+ Assert . Equal ( "def" , clone . Next . Value ) ;
183
+ Assert . Null ( clone . Next . Next ) ;
184
+ }
185
+
186
+ public class FieldOnlyPoco
187
+ {
188
+ public int X ;
189
+ public string ? Y ;
190
+ }
191
+
192
+ public class PropertyOnlyPoco
193
+ {
194
+ public int X { get ; set ; }
195
+ public string ? Y { get ; set ; }
196
+ }
197
+
198
+ public class MixedFieldPropertyPoco
199
+ {
200
+ public int X ; // field
201
+ public string ? Y { get ; set ; } // property
202
+ }
203
+
204
+ public class NodeA < T >
205
+ {
206
+ public NodeB < T > ? Next { get ; set ; }
207
+
208
+ public T ? Value { get ; set ; }
209
+ }
210
+
211
+ public class NodeB < T >
212
+ {
213
+ public NodeA < T > ? Next { get ; set ; }
214
+
215
+ public T ? Value { get ; set ; }
216
+ }
217
+
106
218
private static T RoundTrip < T > ( T value , ReadOnlySpan < byte > expectedBytes , JsonSerializer expectedJsonOptions , JsonSerializer addSerializers = JsonSerializer . None , bool binary = false )
107
219
{
108
220
var services = new ServiceCollection ( ) ;
0 commit comments