3
3
4
4
using System ;
5
5
using System . Collections . Generic ;
6
+ using System . Globalization ;
6
7
using Newtonsoft . Json ;
7
8
using Newtonsoft . Json . Converters ;
8
9
using Newtonsoft . Json . Linq ;
@@ -13,38 +14,47 @@ namespace UnitsNet.Serialization.JsonNet.Tests
13
14
{
14
15
public sealed class UnitsNetBaseJsonConverterTest
15
16
{
16
- private TestConverter _sut ;
17
+ private readonly TestConverter _sut ;
17
18
18
19
public UnitsNetBaseJsonConverterTest ( )
19
20
{
20
21
_sut = new TestConverter ( ) ;
21
22
}
22
23
23
24
[ Fact ]
24
- public void UnitsNetBaseJsonConverter_ConvertIQuantity_works_as_expected ( )
25
+ public void UnitsNetBaseJsonConverter_ConvertIQuantity_works_with_double_type ( )
25
26
{
26
- var result = _sut . Test_ConvertIQuantity ( Power . FromWatts ( 10.2365D ) ) ;
27
+ var result = _sut . Test_ConvertDoubleIQuantity ( Length . FromMeters ( 10.2365 ) ) ;
28
+
29
+ Assert . Equal ( "LengthUnit.Meter" , result . Unit ) ;
30
+ Assert . Equal ( 10.2365 , result . Value ) ;
31
+ }
32
+
33
+ [ Fact ]
34
+ public void UnitsNetBaseJsonConverter_ConvertIQuantity_works_with_decimal_type ( )
35
+ {
36
+ var result = _sut . Test_ConvertDecimalIQuantity ( Power . FromWatts ( 10.2365m ) ) ;
27
37
28
38
Assert . Equal ( "PowerUnit.Watt" , result . Unit ) ;
29
- Assert . Equal ( 10.2365D , result . Value ) ;
39
+ Assert . Equal ( 10.2365m , result . Value ) ;
30
40
}
31
41
32
42
[ Fact ]
33
43
public void UnitsNetBaseJsonConverter_ConvertIQuantity_throws_ArgumentNullException_when_quantity_is_NULL ( )
34
44
{
35
- var result = Assert . Throws < ArgumentNullException > ( ( ) => _sut . Test_ConvertIQuantity ( null ) ) ;
45
+ var result = Assert . Throws < ArgumentNullException > ( ( ) => _sut . Test_ConvertDoubleIQuantity ( null ) ) ;
36
46
37
47
Assert . Equal ( "Value cannot be null.\r \n Parameter name: quantity" , result . Message ) ;
38
48
}
39
49
40
50
[ Fact ]
41
51
public void UnitsNetBaseJsonConverter_ConvertValueUnit_works_as_expected ( )
42
52
{
43
- var result = _sut . Test_ConvertValueUnit ( "PowerUnit.Watt" , 10.2365D ) ;
53
+ var result = _sut . Test_ConvertDecimalValueUnit ( "PowerUnit.Watt" , 10.2365m ) ;
44
54
45
55
Assert . NotNull ( result ) ;
46
56
Assert . IsType < Power > ( result ) ;
47
- Assert . True ( Power . FromWatts ( 10.2365D ) . Equals ( ( Power ) result , 1E-5 , ComparisonType . Absolute ) ) ;
57
+ Assert . True ( Power . FromWatts ( 10.2365m ) . Equals ( ( Power ) result , 1E-5 , ComparisonType . Absolute ) ) ;
48
58
49
59
}
50
60
@@ -59,7 +69,7 @@ public void UnitsNetBaseJsonConverter_ConvertValueUnit_works_with_NULL_value()
59
69
[ Fact ]
60
70
public void UnitsNetBaseJsonConverter_ConvertValueUnit_throws_UnitsNetException_when_unit_does_not_exist ( )
61
71
{
62
- var result = Assert . Throws < UnitsNetException > ( ( ) => _sut . Test_ConvertValueUnit ( "SomeImaginaryUnit.Watt" , 10.2365D ) ) ;
72
+ var result = Assert . Throws < UnitsNetException > ( ( ) => _sut . Test_ConvertDoubleValueUnit ( "SomeImaginaryUnit.Watt" , 10.2365D ) ) ;
63
73
64
74
Assert . Equal ( "Unable to find enum type." , result . Message ) ;
65
75
Assert . True ( result . Data . Contains ( "type" ) ) ;
@@ -69,7 +79,7 @@ public void UnitsNetBaseJsonConverter_ConvertValueUnit_throws_UnitsNetException_
69
79
[ Fact ]
70
80
public void UnitsNetBaseJsonConverter_ConvertValueUnit_throws_UnitsNetException_when_unit_is_in_unexpected_format ( )
71
81
{
72
- var result = Assert . Throws < UnitsNetException > ( ( ) => _sut . Test_ConvertValueUnit ( "PowerUnit Watt" , 10.2365D ) ) ;
82
+ var result = Assert . Throws < UnitsNetException > ( ( ) => _sut . Test_ConvertDecimalValueUnit ( "PowerUnit Watt" , 10.2365m ) ) ;
73
83
74
84
Assert . Equal ( "\" PowerUnit Watt\" is not a valid unit." , result . Message ) ;
75
85
Assert . True ( result . Data . Contains ( "type" ) ) ;
@@ -85,7 +95,7 @@ public void UnitsNetBaseJsonConverter_CreateLocalSerializer_works_as_expected()
85
95
TypeNameHandling = TypeNameHandling . Arrays ,
86
96
Converters = new List < JsonConverter > ( )
87
97
{
88
-
98
+
89
99
new BinaryConverter ( ) ,
90
100
_sut ,
91
101
new DataTableConverter ( )
@@ -104,26 +114,56 @@ public void UnitsNetBaseJsonConverter_CreateLocalSerializer_works_as_expected()
104
114
}
105
115
106
116
[ Fact ]
107
- public void UnitsNetBaseJsonConverter_ReadValueUnit_work_as_expected ( )
117
+ public void UnitsNetBaseJsonConverter_ReadValueUnit_works_with_double_quantity ( )
108
118
{
109
- var token = new JObject ( ) ;
119
+ var token = new JObject { { "Unit" , "LengthUnit.Meter" } , { "Value" , 10.2365 } } ;
110
120
111
- token . Add ( "Unit" , "PowerUnit.Watt" ) ;
112
- token . Add ( "Value" , 10.2365D ) ;
121
+ var result = _sut . Test_ReadDoubleValueUnit ( token ) ;
122
+
123
+ Assert . NotNull ( result ) ;
124
+ Assert . Equal ( "LengthUnit.Meter" , result ? . Unit ) ;
125
+ Assert . Equal ( 10.2365 , result ? . Value ) ;
126
+ }
127
+
128
+ [ Fact ]
129
+ public void UnitsNetBaseJsonConverter_ReadValueUnit_works_with_decimal_quantity ( )
130
+ {
131
+ var token = new JObject { { "Unit" , "PowerUnit.Watt" } , { "Value" , 10.2365m } , { "ValueString" , "10.2365" } , { "ValueType" , "decimal" } } ;
113
132
114
- var result = _sut . Test_ReadValueUnit ( token ) ;
133
+ var result = _sut . Test_ReadDecimalValueUnit ( token ) ;
115
134
116
135
Assert . NotNull ( result ) ;
117
136
Assert . Equal ( "PowerUnit.Watt" , result ? . Unit ) ;
118
- Assert . Equal ( 10.2365D , result ? . Value ) ;
137
+ Assert . Equal ( 10.2365m , result ? . Value ) ;
138
+ }
139
+
140
+ [ Fact ]
141
+ public void UnitsNetBaseJsonConverter_ReadValueUnit_returns_null_when_value_is_a_string ( )
142
+ {
143
+ var token = new JObject { { "Unit" , "PowerUnit.Watt" } , { "Value" , "10.2365" } } ;
144
+
145
+ var result = _sut . Test_ReadDecimalValueUnit ( token ) ;
146
+
147
+ Assert . Null ( result ) ;
148
+ }
149
+
150
+ [ Fact ]
151
+ public void UnitsNetBaseJsonConverter_ReadValueUnit_returns_null_when_value_type_is_not_a_string ( )
152
+ {
153
+ var token = new JObject { { "Unit" , "PowerUnit.Watt" } , { "Value" , 10.2365 } , { "ValueType" , 123 } } ;
154
+
155
+ var result = _sut . Test_ReadDecimalValueUnit ( token ) ;
156
+
157
+ Assert . Null ( result ) ;
119
158
}
120
159
160
+
121
161
[ Fact ]
122
- public void UnitsNetBaseJsonConverter_ReadValueUnit_works_with_empty_token ( )
162
+ public void UnitsNetBaseJsonConverter_ReadDoubleValueUnit_works_with_empty_token ( )
123
163
{
124
164
var token = new JObject ( ) ;
125
165
126
- var result = _sut . Test_ReadValueUnit ( token ) ;
166
+ var result = _sut . Test_ReadDoubleValueUnit ( token ) ;
127
167
128
168
Assert . Null ( result ) ;
129
169
}
@@ -142,32 +182,40 @@ public void UnitsNetBaseJsonConverter_ReadValueUnit_returns_null_when_unit_or_va
142
182
143
183
if ( withValue )
144
184
{
145
- token . Add ( "Value" , 10.2365D ) ;
185
+ token . Add ( "Value" , 10.2365m ) ;
146
186
}
147
187
148
- var result = _sut . Test_ReadValueUnit ( token ) ;
188
+ var result = _sut . Test_ReadDecimalValueUnit ( token ) ;
149
189
150
190
Assert . Null ( result ) ;
151
191
}
152
192
153
193
[ Theory ]
154
- [ InlineData ( "Unit" , "Value" ) ]
155
- [ InlineData ( "unit" , "Value" ) ]
156
- [ InlineData ( "Unit" , "value" ) ]
157
- [ InlineData ( "unit" , "value" ) ]
158
- [ InlineData ( "unIT" , "vAlUe" ) ]
159
- public void UnitsNetBaseJsonConverter_ReadValueUnit_works_case_insensitive ( string unitPropertyName , string valuePropertyName )
194
+ [ InlineData ( "Unit" , "Value" , "ValueString" , "ValueType" ) ]
195
+ [ InlineData ( "unit" , "Value" , "ValueString" , "ValueType" ) ]
196
+ [ InlineData ( "Unit" , "value" , "valueString" , "valueType" ) ]
197
+ [ InlineData ( "unit" , "value" , "valueString" , "valueType" ) ]
198
+ [ InlineData ( "unIT" , "vAlUe" , "vAlUeString" , "vAlUeType" ) ]
199
+ public void UnitsNetBaseJsonConverter_ReadValueUnit_works_case_insensitive (
200
+ string unitPropertyName ,
201
+ string valuePropertyName ,
202
+ string valueStringPropertyName ,
203
+ string valueTypePropertyName )
160
204
{
161
- var token = new JObject ( ) ;
205
+ var token = new JObject
206
+ {
207
+ { unitPropertyName , "PowerUnit.Watt" } ,
208
+ { valuePropertyName , 10.2365m } ,
209
+ { valueStringPropertyName , 10.2365m . ToString ( CultureInfo . InvariantCulture ) } ,
210
+ { valueTypePropertyName , "decimal" }
211
+ } ;
162
212
163
- token . Add ( unitPropertyName , "PowerUnit.Watt" ) ;
164
- token . Add ( valuePropertyName , 10.2365D ) ;
165
213
166
- var result = _sut . Test_ReadValueUnit ( token ) ;
214
+ var result = _sut . Test_ReadDecimalValueUnit ( token ) ;
167
215
168
216
Assert . NotNull ( result ) ;
169
217
Assert . Equal ( "PowerUnit.Watt" , result ? . Unit ) ;
170
- Assert . Equal ( 10.2365D , result ? . Value ) ;
218
+ Assert . Equal ( 10.2365m , result ? . Value ) ;
171
219
}
172
220
173
221
/// <summary>
@@ -180,30 +228,58 @@ private class TestConverter : UnitsNetBaseJsonConverter<string>
180
228
public override void WriteJson ( JsonWriter writer , string value , JsonSerializer serializer ) => throw new NotImplementedException ( ) ;
181
229
public override string ReadJson ( JsonReader reader , Type objectType , string existingValue , bool hasExistingValue , JsonSerializer serializer ) => throw new NotImplementedException ( ) ;
182
230
183
- public ( string Unit , double Value ) Test_ConvertIQuantity ( IQuantity value )
231
+ public ( string Unit , double Value ) Test_ConvertDoubleIQuantity ( IQuantity value )
184
232
{
185
233
var result = ConvertIQuantity ( value ) ;
186
-
187
234
return ( result . Unit , result . Value ) ;
188
235
}
189
236
190
- public IQuantity Test_ConvertValueUnit ( string unit , double value ) => Test_ConvertValueUnit ( new ValueUnit ( ) { Unit = unit , Value = value } ) ;
237
+ public ( string Unit , decimal Value ) Test_ConvertDecimalIQuantity ( IQuantity value )
238
+ {
239
+ var result = ConvertIQuantity ( value ) ;
240
+ if ( result is ExtendedValueUnit { ValueType : "decimal" } decimalResult )
241
+ {
242
+ return ( result . Unit , decimal . Parse ( decimalResult . ValueString ) ) ;
243
+ }
244
+
245
+ throw new ArgumentException ( "The quantity does not have a decimal value" , nameof ( value ) ) ;
246
+ }
247
+
248
+ public IQuantity Test_ConvertDoubleValueUnit ( string unit , double value ) => Test_ConvertValueUnit ( new ValueUnit { Unit = unit , Value = value } ) ;
249
+
250
+ public IQuantity Test_ConvertDecimalValueUnit ( string unit , decimal value ) => Test_ConvertValueUnit ( new ExtendedValueUnit
251
+ {
252
+ Unit = unit , Value = ( double ) value , ValueString = value . ToString ( CultureInfo . InvariantCulture ) , ValueType = "decimal"
253
+ } ) ;
254
+
191
255
public IQuantity Test_ConvertValueUnit ( ) => Test_ConvertValueUnit ( null ) ;
192
256
private IQuantity Test_ConvertValueUnit ( ValueUnit valueUnit ) => ConvertValueUnit ( valueUnit ) ;
193
257
194
258
public JsonSerializer Test_CreateLocalSerializer ( JsonSerializer serializer ) => CreateLocalSerializer ( serializer , this ) ;
195
259
196
- public ( string Unit , double Value ) ? Test_ReadValueUnit ( JToken jsonToken )
260
+ public ( string Unit , double Value ) ? Test_ReadDoubleValueUnit ( JToken jsonToken )
197
261
{
198
262
var result = ReadValueUnit ( jsonToken ) ;
199
-
200
263
if ( result == null )
201
264
{
202
265
return null ;
203
266
}
204
267
205
268
return ( result . Unit , result . Value ) ;
206
269
}
270
+
271
+ public ( string Unit , decimal Value ) ? Test_ReadDecimalValueUnit ( JToken jsonToken )
272
+ {
273
+ var result = ReadValueUnit ( jsonToken ) ;
274
+
275
+ if ( result is ExtendedValueUnit { ValueType : "decimal" } decimalResult )
276
+ {
277
+ return ( result . Unit , decimal . Parse ( decimalResult . ValueString ) ) ;
278
+ }
279
+
280
+ return null ;
281
+ }
282
+
207
283
}
208
284
}
209
285
}
0 commit comments