@@ -312,4 +312,76 @@ 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 - Duration( secondsComponent: 123 , attosecondsComponent: 123_456_789_000_000_001 )
362
+ let pd = Google_Protobuf_Duration ( rounding: sd, rule: . towardZero)
363
+ XCTAssertEqual ( pd. seconds, - 123 )
364
+ XCTAssertEqual ( pd. nanos, - 123_456_789 )
365
+ }
366
+ do {
367
+ let sd = . zero - Duration( secondsComponent: 123 , attosecondsComponent: 123_456_789_000_000_001 )
368
+ let pd = Google_Protobuf_Duration ( rounding: sd, rule: . awayFromZero)
369
+ XCTAssertEqual ( pd. seconds, - 123 )
370
+ XCTAssertEqual ( pd. nanos, - 123_456_790 )
371
+ }
372
+ }
373
+
374
+ func testConvertToStdlibDuration( ) throws {
375
+ do {
376
+ let pd = Google_Protobuf_Duration ( seconds: 123 , nanos: 123_456_789 )
377
+ let sd = Duration ( pd)
378
+ XCTAssertEqual ( sd, . seconds( 123 ) + . nanoseconds( 123_456_789 ) )
379
+ }
380
+ // Negative duration
381
+ do {
382
+ let pd = Google_Protobuf_Duration ( seconds: - 123 , nanos: - 123_456_789 )
383
+ let sd = Duration ( pd)
384
+ XCTAssertEqual ( sd, . zero - ( . seconds( 123 ) + . nanoseconds( 123_456_789 ) ) )
385
+ }
386
+ }
315
387
}
0 commit comments