@@ -21,6 +21,40 @@ struct TopLevelObjectWrapper<T: Codable & Equatable>: Codable, Equatable {
21
21
22
22
class TestJSONEncoder : XCTestCase {
23
23
24
+ // MARK: - Encoding Top-Level fragments
25
+ func test_encodingTopLevelFragments( ) {
26
+
27
+ func _testFragment< T: Codable & Equatable > ( value: T , fragment: String ) {
28
+ let data : Data
29
+ let payload : String
30
+
31
+ do {
32
+ data = try JSONEncoder ( ) . encode ( value)
33
+ payload = try XCTUnwrap ( String . init ( decoding: data, as: UTF8 . self) )
34
+ XCTAssertEqual ( fragment, payload)
35
+ } catch {
36
+ XCTFail ( " Failed to encode \( T . self) to JSON: \( error) " )
37
+ return
38
+ }
39
+ do {
40
+ let decodedValue = try JSONDecoder ( ) . decode ( T . self, from: data)
41
+ XCTAssertEqual ( value, decodedValue)
42
+ } catch {
43
+ XCTFail ( " Failed to decode \( payload) to \( T . self) : \( error) " )
44
+ }
45
+ }
46
+
47
+ _testFragment ( value: 2 , fragment: " 2 " )
48
+ _testFragment ( value: false , fragment: " false " )
49
+ _testFragment ( value: true , fragment: " true " )
50
+ _testFragment ( value: Float ( 1 ) , fragment: " 1 " )
51
+ _testFragment ( value: Double ( 2 ) , fragment: " 2 " )
52
+ _testFragment ( value: Decimal ( Double . leastNormalMagnitude) , fragment: " 0.0000000000000000000000000000000000000000000000000002225073858507201792 " )
53
+ _testFragment ( value: " test " , fragment: " \" test \" " )
54
+ let v : Int ? = nil
55
+ _testFragment ( value: v, fragment: " null " )
56
+ }
57
+
24
58
// MARK: - Encoding Top-Level Empty Types
25
59
func test_encodingTopLevelEmptyStruct( ) {
26
60
let empty = EmptyStruct ( )
@@ -34,20 +68,20 @@ class TestJSONEncoder : XCTestCase {
34
68
35
69
// MARK: - Encoding Top-Level Single-Value Types
36
70
func test_encodingTopLevelSingleValueEnum( ) {
37
- _testEncodeFailure ( of: Switch . off)
38
- _testEncodeFailure ( of: Switch . on)
71
+ _testRoundTrip ( of: Switch . off)
72
+ _testRoundTrip ( of: Switch . on)
39
73
40
74
_testRoundTrip ( of: TopLevelArrayWrapper ( Switch . off) )
41
75
_testRoundTrip ( of: TopLevelArrayWrapper ( Switch . on) )
42
76
}
43
77
44
78
func test_encodingTopLevelSingleValueStruct( ) {
45
- _testEncodeFailure ( of: Timestamp ( 3141592653 ) )
79
+ _testRoundTrip ( of: Timestamp ( 3141592653 ) )
46
80
_testRoundTrip ( of: TopLevelArrayWrapper ( Timestamp ( 3141592653 ) ) )
47
81
}
48
82
49
83
func test_encodingTopLevelSingleValueClass( ) {
50
- _testEncodeFailure ( of: Counter ( ) )
84
+ _testRoundTrip ( of: Counter ( ) )
51
85
_testRoundTrip ( of: TopLevelArrayWrapper ( Counter ( ) ) )
52
86
}
53
87
@@ -492,6 +526,11 @@ class TestJSONEncoder : XCTestCase {
492
526
}
493
527
}
494
528
529
+ func test_codingOfNil( ) {
530
+ let x : Int ? = nil
531
+ test_codingOf ( value: x, toAndFrom: " null " )
532
+ }
533
+
495
534
func test_codingOfInt8( ) {
496
535
test_codingOf ( value: Int8 ( - 42 ) , toAndFrom: " -42 " )
497
536
}
@@ -1364,6 +1403,7 @@ fileprivate struct JSON: Equatable {
1364
1403
extension TestJSONEncoder {
1365
1404
static var allTests : [ ( String , ( TestJSONEncoder ) -> ( ) throws -> Void ) ] {
1366
1405
return [
1406
+ ( " test_encodingTopLevelFragments " , test_encodingTopLevelFragments) ,
1367
1407
( " test_encodingTopLevelEmptyStruct " , test_encodingTopLevelEmptyStruct) ,
1368
1408
( " test_encodingTopLevelEmptyClass " , test_encodingTopLevelEmptyClass) ,
1369
1409
( " test_encodingTopLevelSingleValueEnum " , test_encodingTopLevelSingleValueEnum) ,
@@ -1393,6 +1433,7 @@ extension TestJSONEncoder {
1393
1433
( " test_nestedContainerCodingPaths " , test_nestedContainerCodingPaths) ,
1394
1434
( " test_superEncoderCodingPaths " , test_superEncoderCodingPaths) ,
1395
1435
( " test_codingOfBool " , test_codingOfBool) ,
1436
+ ( " test_codingOfNil " , test_codingOfNil) ,
1396
1437
( " test_codingOfInt8 " , test_codingOfInt8) ,
1397
1438
( " test_codingOfUInt8 " , test_codingOfUInt8) ,
1398
1439
( " test_codingOfInt16 " , test_codingOfInt16) ,
0 commit comments