|
11 | 11 | // REQUIRES: objc_interop
|
12 | 12 |
|
13 | 13 | import Foundation
|
| 14 | +import CoreGraphics |
14 | 15 |
|
15 | 16 | #if FOUNDATION_XCTEST
|
16 | 17 | import XCTest
|
@@ -57,12 +58,21 @@ func expectRoundTripEquality<T : Codable>(of value: T, encode: (T) throws -> Dat
|
57 | 58 | }
|
58 | 59 |
|
59 | 60 | func expectRoundTripEqualityThroughJSON<T : Codable>(for value: T) where T : Equatable {
|
| 61 | + let inf = "INF", negInf = "-INF", nan = "NaN" |
60 | 62 | let encode = { (_ value: T) throws -> Data in
|
61 |
| - return try JSONEncoder().encode(value) |
| 63 | + let encoder = JSONEncoder() |
| 64 | + encoder.nonConformingFloatEncodingStrategy = .convertToString(positiveInfinity: inf, |
| 65 | + negativeInfinity: negInf, |
| 66 | + nan: nan) |
| 67 | + return try encoder.encode(value) |
62 | 68 | }
|
63 | 69 |
|
64 | 70 | let decode = { (_ data: Data) throws -> T in
|
65 |
| - return try JSONDecoder().decode(T.self, from: data) |
| 71 | + let decoder = JSONDecoder() |
| 72 | + decoder.nonConformingFloatDecodingStrategy = .convertFromString(positiveInfinity: inf, |
| 73 | + negativeInfinity: negInf, |
| 74 | + nan: nan) |
| 75 | + return try decoder.decode(T.self, from: data) |
66 | 76 | }
|
67 | 77 |
|
68 | 78 | expectRoundTripEquality(of: value, encode: encode, decode: decode)
|
@@ -186,6 +196,151 @@ class TestCodable : TestCodableSuper {
|
186 | 196 | }
|
187 | 197 | }
|
188 | 198 |
|
| 199 | + // MARK: - CGAffineTransform |
| 200 | + lazy var cg_affineTransformValues: [CGAffineTransform] = { |
| 201 | + var values = [ |
| 202 | + CGAffineTransform.identity, |
| 203 | + CGAffineTransform(), |
| 204 | + CGAffineTransform(translationX: 2.0, y: 2.0), |
| 205 | + CGAffineTransform(scaleX: 2.0, y: 2.0), |
| 206 | + CGAffineTransform(a: 1.0, b: 2.5, c: 66.2, d: 40.2, tx: -5.5, ty: 3.7), |
| 207 | + CGAffineTransform(a: -55.66, b: 22.7, c: 1.5, d: 0.0, tx: -22, ty: -33), |
| 208 | + CGAffineTransform(a: 4.5, b: 1.1, c: 0.025, d: 0.077, tx: -0.55, ty: 33.2), |
| 209 | + CGAffineTransform(a: 7.0, b: -2.3, c: 6.7, d: 0.25, tx: 0.556, ty: 0.99), |
| 210 | + CGAffineTransform(a: 0.498, b: -0.284, c: -0.742, d: 0.3248, tx: 12, ty: 44) |
| 211 | + ] |
| 212 | + |
| 213 | + if #available(OSX 10.13, iOS 11.0, watchOS 4.0, tvOS 11.0, *) { |
| 214 | + values.append(CGAffineTransform(rotationAngle: .pi / 2)) |
| 215 | + } |
| 216 | + |
| 217 | + return values |
| 218 | + }() |
| 219 | + |
| 220 | + func test_CGAffineTransform_JSON() { |
| 221 | + for transform in cg_affineTransformValues { |
| 222 | + expectRoundTripEqualityThroughJSON(for: transform) |
| 223 | + } |
| 224 | + } |
| 225 | + |
| 226 | + func test_CGAffineTransform_Plist() { |
| 227 | + for transform in cg_affineTransformValues { |
| 228 | + expectRoundTripEqualityThroughPlist(for: transform) |
| 229 | + } |
| 230 | + } |
| 231 | + |
| 232 | + // MARK: - CGPoint |
| 233 | + lazy var cg_pointValues: [CGPoint] = { |
| 234 | + var values = [ |
| 235 | + CGPoint.zero, |
| 236 | + CGPoint(x: 10, y: 20) |
| 237 | + ] |
| 238 | + |
| 239 | + if #available(OSX 10.13, iOS 11.0, watchOS 4.0, tvOS 11.0, *) { |
| 240 | + // Limit on magnitude in JSON. See rdar://problem/12717407 |
| 241 | + values.append(CGPoint(x: CGFloat.greatestFiniteMagnitude, |
| 242 | + y: CGFloat.greatestFiniteMagnitude)) |
| 243 | + } |
| 244 | + |
| 245 | + return values |
| 246 | + }() |
| 247 | + |
| 248 | + func test_CGPoint_JSON() { |
| 249 | + for point in cg_pointValues { |
| 250 | + expectRoundTripEqualityThroughJSON(for: point) |
| 251 | + } |
| 252 | + } |
| 253 | + |
| 254 | + func test_CGPoint_Plist() { |
| 255 | + for point in cg_pointValues { |
| 256 | + expectRoundTripEqualityThroughPlist(for: point) |
| 257 | + } |
| 258 | + } |
| 259 | + |
| 260 | + // MARK: - CGSize |
| 261 | + lazy var cg_sizeValues: [CGSize] = { |
| 262 | + var values = [ |
| 263 | + CGSize.zero, |
| 264 | + CGSize(width: 30, height: 40) |
| 265 | + ] |
| 266 | + |
| 267 | + if #available(OSX 10.13, iOS 11.0, watchOS 4.0, tvOS 11.0, *) { |
| 268 | + // Limit on magnitude in JSON. See rdar://problem/12717407 |
| 269 | + values.append(CGSize(width: CGFloat.greatestFiniteMagnitude, |
| 270 | + height: CGFloat.greatestFiniteMagnitude)) |
| 271 | + } |
| 272 | + |
| 273 | + return values |
| 274 | + }() |
| 275 | + |
| 276 | + func test_CGSize_JSON() { |
| 277 | + for size in cg_sizeValues { |
| 278 | + expectRoundTripEqualityThroughJSON(for: size) |
| 279 | + } |
| 280 | + } |
| 281 | + |
| 282 | + func test_CGSize_Plist() { |
| 283 | + for size in cg_sizeValues { |
| 284 | + expectRoundTripEqualityThroughPlist(for: size) |
| 285 | + } |
| 286 | + } |
| 287 | + |
| 288 | + // MARK: - CGRect |
| 289 | + lazy var cg_rectValues: [CGRect] = { |
| 290 | + var values = [ |
| 291 | + CGRect.zero, |
| 292 | + CGRect.null, |
| 293 | + CGRect(x: 10, y: 20, width: 30, height: 40) |
| 294 | + ] |
| 295 | + |
| 296 | + if #available(OSX 10.13, iOS 11.0, watchOS 4.0, tvOS 11.0, *) { |
| 297 | + // Limit on magnitude in JSON. See rdar://problem/12717407 |
| 298 | + values.append(CGRect.infinite) |
| 299 | + } |
| 300 | + |
| 301 | + return values |
| 302 | + }() |
| 303 | + |
| 304 | + func test_CGRect_JSON() { |
| 305 | + for rect in cg_rectValues { |
| 306 | + expectRoundTripEqualityThroughJSON(for: rect) |
| 307 | + } |
| 308 | + } |
| 309 | + |
| 310 | + func test_CGRect_Plist() { |
| 311 | + for rect in cg_rectValues { |
| 312 | + expectRoundTripEqualityThroughPlist(for: rect) |
| 313 | + } |
| 314 | + } |
| 315 | + |
| 316 | + // MARK: - CGVector |
| 317 | + lazy var cg_vectorValues: [CGVector] = { |
| 318 | + var values = [ |
| 319 | + CGVector.zero, |
| 320 | + CGVector(dx: 0.0, dy: -9.81) |
| 321 | + ] |
| 322 | + |
| 323 | + if #available(OSX 10.13, iOS 11.0, watchOS 4.0, tvOS 11.0, *) { |
| 324 | + // Limit on magnitude in JSON. See rdar://problem/12717407 |
| 325 | + values.append(CGVector(dx: CGFloat.greatestFiniteMagnitude, |
| 326 | + dy: CGFloat.greatestFiniteMagnitude)) |
| 327 | + } |
| 328 | + |
| 329 | + return values |
| 330 | + }() |
| 331 | + |
| 332 | + func test_CGVector_JSON() { |
| 333 | + for vector in cg_vectorValues { |
| 334 | + expectRoundTripEqualityThroughJSON(for: vector) |
| 335 | + } |
| 336 | + } |
| 337 | + |
| 338 | + func test_CGVector_Plist() { |
| 339 | + for vector in cg_vectorValues { |
| 340 | + expectRoundTripEqualityThroughPlist(for: vector) |
| 341 | + } |
| 342 | + } |
| 343 | + |
189 | 344 | // MARK: - DateComponents
|
190 | 345 | lazy var dateComponents: Set<Calendar.Component> = [
|
191 | 346 | .era, .year, .month, .day, .hour, .minute, .second, .nanosecond,
|
@@ -458,6 +613,16 @@ CodableTests.test("test_Calendar_JSON") { TestCodable().test_Calendar_JSON() }
|
458 | 613 | CodableTests.test("test_Calendar_Plist") { TestCodable().test_Calendar_Plist() }
|
459 | 614 | CodableTests.test("test_CharacterSet_JSON") { TestCodable().test_CharacterSet_JSON() }
|
460 | 615 | CodableTests.test("test_CharacterSet_Plist") { TestCodable().test_CharacterSet_Plist() }
|
| 616 | +CodableTests.test("test_CGAffineTransform_JSON") { TestCodable().test_CGAffineTransform_JSON() } |
| 617 | +CodableTests.test("test_CGAffineTransform_Plist") { TestCodable().test_CGAffineTransform_Plist() } |
| 618 | +CodableTests.test("test_CGPoint_JSON") { TestCodable().test_CGPoint_JSON() } |
| 619 | +CodableTests.test("test_CGPoint_Plist") { TestCodable().test_CGPoint_Plist() } |
| 620 | +CodableTests.test("test_CGSize_JSON") { TestCodable().test_CGSize_JSON() } |
| 621 | +CodableTests.test("test_CGSize_Plist") { TestCodable().test_CGSize_Plist() } |
| 622 | +CodableTests.test("test_CGRect_JSON") { TestCodable().test_CGRect_JSON() } |
| 623 | +CodableTests.test("test_CGRect_Plist") { TestCodable().test_CGRect_Plist() } |
| 624 | +CodableTests.test("test_CGVector_JSON") { TestCodable().test_CGVector_JSON() } |
| 625 | +CodableTests.test("test_CGVector_Plist") { TestCodable().test_CGVector_Plist() } |
461 | 626 | CodableTests.test("test_DateComponents_JSON") { TestCodable().test_DateComponents_JSON() }
|
462 | 627 | CodableTests.test("test_DateComponents_Plist") { TestCodable().test_DateComponents_Plist() }
|
463 | 628 |
|
|
0 commit comments