@@ -312,4 +312,78 @@ final class Test_Duration: XCTestCase, PBTestHelpers {
312
312
let t2 = Google_Protobuf_Duration ( seconds: 123 , nanos: 123_456_789 )
313
313
XCTAssertEqual ( t2. timeInterval, 123.123456789 )
314
314
}
315
+
316
+ func testConvertFromStdlibDuration( ) throws {
317
+ // Full precision
318
+ do {
319
+ let sd = Duration . seconds ( 123 ) + . nanoseconds( 123_456_789 )
320
+ let pd = Google_Protobuf_Duration ( rounding: sd)
321
+ XCTAssertEqual ( pd. seconds, 123 )
322
+ XCTAssertEqual ( pd. nanos, 123_456_789 )
323
+ }
324
+
325
+ // Default rounding (toNearestAwayFromZero)
326
+ do {
327
+ let sd = Duration ( secondsComponent: 123 , attosecondsComponent: 123_456_789_499_999_999 )
328
+ let pd = Google_Protobuf_Duration ( rounding: sd)
329
+ XCTAssertEqual ( pd. seconds, 123 )
330
+ XCTAssertEqual ( pd. nanos, 123_456_789 )
331
+ }
332
+ do {
333
+ let sd = Duration ( secondsComponent: 123 , attosecondsComponent: 123_456_789_500_000_000 )
334
+ let pd = Google_Protobuf_Duration ( rounding: sd)
335
+ XCTAssertEqual ( pd. seconds, 123 )
336
+ XCTAssertEqual ( pd. nanos, 123_456_790 )
337
+ }
338
+
339
+ // Other rounding rules
340
+ do {
341
+ let sd = Duration ( secondsComponent: 123 , attosecondsComponent: 123_456_789_499_999_999 )
342
+ let pd = Google_Protobuf_Duration ( rounding: sd, rule: . awayFromZero)
343
+ XCTAssertEqual ( pd. seconds, 123 )
344
+ XCTAssertEqual ( pd. nanos, 123_456_790 )
345
+ }
346
+ do {
347
+ let sd = Duration ( secondsComponent: 123 , attosecondsComponent: 123_456_789_999_999_999 )
348
+ let pd = Google_Protobuf_Duration ( rounding: sd, rule: . towardZero)
349
+ XCTAssertEqual ( pd. seconds, 123 )
350
+ XCTAssertEqual ( pd. nanos, 123_456_789 )
351
+ }
352
+
353
+ // Negative duration
354
+ do {
355
+ let sd = Duration . zero - . seconds( 123 ) - . nanoseconds( 123_456_789 )
356
+ let pd = Google_Protobuf_Duration ( rounding: sd)
357
+ XCTAssertEqual ( pd. seconds, - 123 )
358
+ XCTAssertEqual ( pd. nanos, - 123_456_789 )
359
+ }
360
+ do {
361
+ let sd = . zero
362
+ - Duration( secondsComponent: 123 , attosecondsComponent: 123_456_789_000_000_001 )
363
+ let pd = Google_Protobuf_Duration ( rounding: sd, rule: . towardZero)
364
+ XCTAssertEqual ( pd. seconds, - 123 )
365
+ XCTAssertEqual ( pd. nanos, - 123_456_789 )
366
+ }
367
+ do {
368
+ let sd = . zero
369
+ - Duration( secondsComponent: 123 , attosecondsComponent: 123_456_789_000_000_001 )
370
+ let pd = Google_Protobuf_Duration ( rounding: sd, rule: . awayFromZero)
371
+ XCTAssertEqual ( pd. seconds, - 123 )
372
+ XCTAssertEqual ( pd. nanos, - 123_456_790 )
373
+ }
374
+ }
375
+
376
+ func testConvertToStdlibDuration( ) throws {
377
+ do {
378
+ let pd = Google_Protobuf_Duration ( seconds: 123 , nanos: 123_456_789 )
379
+ let sd = Duration ( pd)
380
+ XCTAssertEqual ( sd, . seconds( 123 ) + . nanoseconds( 123_456_789 ) )
381
+ }
382
+ // Negative duration
383
+ do {
384
+ let pd = Google_Protobuf_Duration ( seconds: - 123 , nanos: - 123_456_789 )
385
+ let sd = Duration ( pd)
386
+ XCTAssertEqual ( sd, . zero - ( . seconds( 123 ) + . nanoseconds( 123_456_789 ) ) )
387
+ }
388
+ }
315
389
}
0 commit comments