@@ -87,5 +87,81 @@ public void Can_override_Guid_serialization_format()
87
87
Assert . That ( guid . ToJson ( ) . Trim ( '"' ) , Is . EqualTo ( "adfa988b-01f6-490d-b65b-63750f869496" ) ) ;
88
88
Assert . That ( guid . ToJsv ( ) , Is . EqualTo ( "adfa988b-01f6-490d-b65b-63750f869496" ) ) ;
89
89
}
90
+
91
+ public class Parent
92
+ {
93
+ public ICar Car { get ; set ; }
94
+ }
95
+
96
+ public interface ICar
97
+ {
98
+ string CarType { get ; }
99
+ }
100
+
101
+ public class LuxaryCar : ICar
102
+ {
103
+ public string Sunroof { get ; set ; }
104
+
105
+ public string CarType { get { return "Luxary" ; } }
106
+ }
107
+
108
+ public class CheapCar : ICar
109
+ {
110
+ public bool HasCupHolder { get ; set ; }
111
+
112
+ public string CarType { get { return "Cheap" ; } }
113
+ }
114
+
115
+ [ Test ]
116
+ public void Does_call_RawSerializeFn_for_toplevel_types ( )
117
+ {
118
+ JsConfig < ICar > . RawSerializeFn = SerializeCar ;
119
+
120
+ var luxaryParent = new Parent ( ) { Car = new LuxaryCar ( ) { Sunroof = "Big" } } ;
121
+ var cheapParent = new Parent ( ) { Car = new CheapCar ( ) { HasCupHolder = true } } ;
122
+
123
+ // Works when ICar is a child
124
+ var luxaryParentJson = luxaryParent . ToJson ( ) ;
125
+ var cheapParentJson = cheapParent . ToJson ( ) ;
126
+
127
+ Assert . That ( luxaryParentJson , Is . Not . StringContaining ( "__type" ) ) ;
128
+ Assert . That ( cheapParentJson , Is . Not . StringContaining ( "__type" ) ) ;
129
+
130
+ ICar luxary = new LuxaryCar ( ) { Sunroof = "Big" } ;
131
+ ICar cheap = new CheapCar ( ) { HasCupHolder = true } ;
132
+
133
+ // ToJson() loses runtime cast of interface type, to keep it we need to specify it on call-site
134
+ var luxaryJson = JsonSerializer . SerializeToString ( luxary , typeof ( ICar ) ) ;
135
+ var cheapJson = JsonSerializer . SerializeToString ( cheap , typeof ( ICar ) ) ;
136
+
137
+ Assert . That ( luxaryJson , Is . Not . StringContaining ( "__type" ) ) ;
138
+ Assert . That ( cheapJson , Is . Not . StringContaining ( "__type" ) ) ;
139
+
140
+ JsConfig . Reset ( ) ;
141
+ }
142
+
143
+ private static string SerializeCar ( ICar car )
144
+ {
145
+ var jsonObject = JsonObject . Parse ( car . ToJson ( ) ) ;
146
+
147
+ if ( jsonObject . ContainsKey ( "__type" ) )
148
+ jsonObject . Remove ( "__type" ) ;
149
+
150
+ return jsonObject . ToJson ( ) ;
151
+ }
152
+
153
+ [ Test ]
154
+ public void Does_call_RawSerializeFn_for_toplevel_concrete_type ( )
155
+ {
156
+ JsConfig < LuxaryCar > . RawSerializeFn = c => "{\" foo\" :1}" ;
157
+
158
+ ICar luxary = new LuxaryCar { Sunroof = "Big" } ;
159
+
160
+ var luxaryJson = luxary . ToJson ( ) ;
161
+
162
+ Assert . That ( luxaryJson , Is . StringContaining ( "foo" ) ) ;
163
+
164
+ JsConfig . Reset ( ) ;
165
+ }
90
166
}
91
167
}
0 commit comments