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,35 @@ 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 ) ;
113
122
114
- var result = _sut . Test_ReadValueUnit ( token ) ;
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" } } ;
132
+
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 ) ;
119
138
}
120
139
121
140
[ Fact ]
122
141
public void UnitsNetBaseJsonConverter_ReadValueUnit_works_with_empty_token ( )
123
142
{
124
143
var token = new JObject ( ) ;
125
144
126
- var result = _sut . Test_ReadValueUnit ( token ) ;
145
+ var result = _sut . Test_ReadDoubleValueUnit ( token ) ;
127
146
128
147
Assert . Null ( result ) ;
129
148
}
@@ -142,32 +161,40 @@ public void UnitsNetBaseJsonConverter_ReadValueUnit_returns_null_when_unit_or_va
142
161
143
162
if ( withValue )
144
163
{
145
- token . Add ( "Value" , 10.2365D ) ;
164
+ token . Add ( "Value" , 10.2365m ) ;
146
165
}
147
166
148
- var result = _sut . Test_ReadValueUnit ( token ) ;
167
+ var result = _sut . Test_ReadDecimalValueUnit ( token ) ;
149
168
150
169
Assert . Null ( result ) ;
151
170
}
152
171
153
172
[ 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 )
173
+ [ InlineData ( "Unit" , "Value" , "ValueString" , "ValueType" ) ]
174
+ [ InlineData ( "unit" , "Value" , "ValueString" , "ValueType" ) ]
175
+ [ InlineData ( "Unit" , "value" , "valueString" , "valueType" ) ]
176
+ [ InlineData ( "unit" , "value" , "valueString" , "valueType" ) ]
177
+ [ InlineData ( "unIT" , "vAlUe" , "vAlUeString" , "vAlUeType" ) ]
178
+ public void UnitsNetBaseJsonConverter_ReadValueUnit_works_case_insensitive (
179
+ string unitPropertyName ,
180
+ string valuePropertyName ,
181
+ string valueStringPropertyName ,
182
+ string valueTypePropertyName )
160
183
{
161
- var token = new JObject ( ) ;
184
+ var token = new JObject
185
+ {
186
+ { unitPropertyName , "PowerUnit.Watt" } ,
187
+ { valuePropertyName , 10.2365m } ,
188
+ { valueStringPropertyName , 10.2365m . ToString ( CultureInfo . InvariantCulture ) } ,
189
+ { valueTypePropertyName , "decimal" }
190
+ } ;
162
191
163
- token . Add ( unitPropertyName , "PowerUnit.Watt" ) ;
164
- token . Add ( valuePropertyName , 10.2365D ) ;
165
192
166
- var result = _sut . Test_ReadValueUnit ( token ) ;
193
+ var result = _sut . Test_ReadDecimalValueUnit ( token ) ;
167
194
168
195
Assert . NotNull ( result ) ;
169
196
Assert . Equal ( "PowerUnit.Watt" , result ? . Unit ) ;
170
- Assert . Equal ( 10.2365D , result ? . Value ) ;
197
+ Assert . Equal ( 10.2365m , result ? . Value ) ;
171
198
}
172
199
173
200
/// <summary>
@@ -180,30 +207,60 @@ private class TestConverter : UnitsNetBaseJsonConverter<string>
180
207
public override void WriteJson ( JsonWriter writer , string value , JsonSerializer serializer ) => throw new NotImplementedException ( ) ;
181
208
public override string ReadJson ( JsonReader reader , Type objectType , string existingValue , bool hasExistingValue , JsonSerializer serializer ) => throw new NotImplementedException ( ) ;
182
209
183
- public ( string Unit , double Value ) Test_ConvertIQuantity ( IQuantity value )
210
+ public ( string Unit , double Value ) Test_ConvertDoubleIQuantity ( IQuantity value )
184
211
{
185
212
var result = ConvertIQuantity ( value ) ;
186
-
187
213
return ( result . Unit , result . Value ) ;
214
+
215
+ throw new ArgumentException ( "The quantity does not have a double value" , nameof ( value ) ) ;
216
+ }
217
+
218
+ public ( string Unit , decimal Value ) Test_ConvertDecimalIQuantity ( IQuantity value )
219
+ {
220
+ var result = ConvertIQuantity ( value ) ;
221
+ if ( result is ExtendedValueUnit { ValueType : "decimal" } decimalResult )
222
+ {
223
+ return ( result . Unit , decimal . Parse ( decimalResult . ValueString ) ) ;
224
+ }
225
+
226
+ throw new ArgumentException ( "The quantity does not have a decimal value" , nameof ( value ) ) ;
188
227
}
189
228
190
- public IQuantity Test_ConvertValueUnit ( string unit , double value ) => Test_ConvertValueUnit ( new ValueUnit ( ) { Unit = unit , Value = value } ) ;
229
+ public IQuantity Test_ConvertDoubleValueUnit ( string unit , double value ) => Test_ConvertValueUnit ( new ValueUnit { Unit = unit , Value = value } ) ;
230
+
231
+ public IQuantity Test_ConvertDecimalValueUnit ( string unit , decimal value ) => Test_ConvertValueUnit ( new ExtendedValueUnit
232
+ {
233
+ Unit = unit , Value = ( double ) value , ValueString = value . ToString ( CultureInfo . InvariantCulture ) , ValueType = "decimal"
234
+ } ) ;
235
+
191
236
public IQuantity Test_ConvertValueUnit ( ) => Test_ConvertValueUnit ( null ) ;
192
237
private IQuantity Test_ConvertValueUnit ( ValueUnit valueUnit ) => ConvertValueUnit ( valueUnit ) ;
193
238
194
239
public JsonSerializer Test_CreateLocalSerializer ( JsonSerializer serializer ) => CreateLocalSerializer ( serializer , this ) ;
195
240
196
- public ( string Unit , double Value ) ? Test_ReadValueUnit ( JToken jsonToken )
241
+ public ( string Unit , double Value ) ? Test_ReadDoubleValueUnit ( JToken jsonToken )
197
242
{
198
243
var result = ReadValueUnit ( jsonToken ) ;
199
-
200
244
if ( result == null )
201
245
{
202
246
return null ;
203
247
}
204
248
205
249
return ( result . Unit , result . Value ) ;
206
250
}
251
+
252
+ public ( string Unit , decimal Value ) ? Test_ReadDecimalValueUnit ( JToken jsonToken )
253
+ {
254
+ var result = ReadValueUnit ( jsonToken ) ;
255
+
256
+ if ( result is ExtendedValueUnit { ValueType : "decimal" } decimalResult )
257
+ {
258
+ return ( result . Unit , decimal . Parse ( decimalResult . ValueString ) ) ;
259
+ }
260
+
261
+ return null ;
262
+ }
263
+
207
264
}
208
265
}
209
266
}
0 commit comments