A fast, safe, and efficient CBOR serialization library for Swift on any platform.
swiftpackageindex.com/thecoolwinter/CBOR/1.1.1/documentation/cbor
atproto
swift
cbor
1//
2// RoundTripTests.swift
3// CBOR
4//
5// Created by Khan Winter on 8/28/25.
6//
7
8import Testing
9#if canImport(FoundationEssentials)
10import FoundationEssentials
11#else
12import Foundation
13#endif
14@testable import CBOR
15
16@Suite
17struct RoundTripTests {
18 @Test
19 func int() throws {
20 for _ in 0..<10 {
21 let value = Int.random(in: 0..<Int.max)
22 let data = try CBOREncoder().encode(value)
23 let result = try CBORDecoder().decode(Int.self, from: data)
24 #expect(value == result)
25 }
26 }
27
28 @Test
29 func bool() throws {
30 var value = true
31 var data = try CBOREncoder().encode(value)
32 var result = try CBORDecoder().decode(Bool.self, from: data)
33 #expect(value == result)
34
35 value = false
36 data = try CBOREncoder().encode(value)
37 result = try CBORDecoder().decode(Bool.self, from: data)
38 #expect(value == result)
39 }
40
41 @Test
42 func float() throws {
43 for _ in 0..<10 {
44 let value = Float.random(in: -1000..<1000)
45 let data = try CBOREncoder().encode(value)
46 let result = try CBORDecoder().decode(Float.self, from: data)
47 #expect(value == result)
48 }
49 }
50
51 @Test
52 func double() throws {
53 for _ in 0..<10 {
54 let value = Double.random(in: -1000..<1000)
55 let data = try CBOREncoder().encode(value)
56 let result = try CBORDecoder().decode(Double.self, from: data)
57 #expect(value == result)
58 }
59 }
60
61 @Test
62 func data() throws {
63 let value = Data([0xde, 0xad, 0xbe, 0xef])
64 let encoded = try CBOREncoder().encode(value)
65 let decoded = try CBORDecoder().decode(Data.self, from: encoded)
66 #expect(value == decoded)
67 }
68
69 @Test
70 func emptyData() throws {
71 let value = Data()
72 let encoded = try CBOREncoder().encode(value)
73 let decoded = try CBORDecoder().decode(Data.self, from: encoded)
74 #expect(value == decoded)
75 }
76
77 @Test
78 func string() throws {
79 let value = "Hello, CBOR 👋"
80 let encoded = try CBOREncoder().encode(value)
81 let decoded = try CBORDecoder().decode(String.self, from: encoded)
82 #expect(value == decoded)
83 }
84
85 @Test
86 func emptyString() throws {
87 let value = ""
88 let encoded = try CBOREncoder().encode(value)
89 let decoded = try CBORDecoder().decode(String.self, from: encoded)
90 #expect(value == decoded)
91 }
92
93 @Test
94 func person() throws {
95 let value = Person.mock
96 let encoded = try CBOREncoder().encode(value)
97 let decoded = try CBORDecoder().decode(Person.self, from: encoded)
98 #expect(value.name == decoded.name)
99 #expect(value.age == decoded.age)
100 #expect(value.email == decoded.email)
101 #expect(value.isActive == decoded.isActive)
102 #expect(value.tags == decoded.tags)
103 }
104
105 @Test
106 func company() throws {
107 let value = Company.mock
108 let encoded = try CBOREncoder().encode(value)
109 let decoded = try CBORDecoder().decode(Company.self, from: encoded)
110 #expect(value.name == decoded.name)
111 #expect(value.founded == decoded.founded)
112 #expect(value.employees.count == decoded.employees.count)
113 #expect(value.metadata == decoded.metadata)
114
115 // sanity check one employee too
116 if let first = decoded.employees.first {
117 #expect(first.name == Person.mock.name)
118 }
119 }
120
121 @Test
122 func dateEpoch() throws {
123 let value = Date()
124 let encoded = try CBOREncoder().encode(value)
125 let decoded = try CBORDecoder().decode(Date.self, from: encoded)
126 #expect(decoded.timeIntervalSince1970.rounded(.down) == value.timeIntervalSince1970.rounded(.down))
127 }
128
129 @Test
130 func dateString() throws {
131 let value = Date()
132 let encoded = try CBOREncoder(dateEncodingStrategy: .string).encode(value)
133 let decoded = try CBORDecoder().decode(Date.self, from: encoded)
134 #expect(decoded.timeIntervalSince1970.rounded(.down) == value.timeIntervalSince1970.rounded(.down))
135 }
136
137 @Test
138 func uuid() throws {
139 let value = UUID()
140 let encoded = try CBOREncoder().encode(value)
141 let decoded = try CBORDecoder().decode(UUID.self, from: encoded)
142 #expect(decoded == value)
143 }
144
145 @Test
146 func map() throws {
147 let value = ["a": 0]
148 let encoded = try CBOREncoder().encode(value)
149 let decoded = try CBORDecoder().decode([String: Int].self, from: encoded)
150 #expect(decoded == value)
151 }
152}