|  | @@ -32,11 +32,9 @@
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  #import <XCTest/XCTest.h>
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +#import "GPBTestUtilities.h"
 | 
	
		
			
				|  |  |  #import "google/protobuf/AnyTest.pbobjc.h"
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -// A basically random interval into the future for testing with.
 | 
	
		
			
				|  |  | -static const NSTimeInterval kFutureOffsetInterval = 15000;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  // Nanosecond time accuracy
 | 
	
		
			
				|  |  |  static const NSTimeInterval kTimeAccuracy = 1e-9;
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -46,59 +44,117 @@ static const NSTimeInterval kTimeAccuracy = 1e-9;
 | 
	
		
			
				|  |  |  @implementation WellKnownTypesTest
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  - (void)testTimeStamp {
 | 
	
		
			
				|  |  | -  // Test Creation.
 | 
	
		
			
				|  |  | -  NSDate *date = [NSDate date];
 | 
	
		
			
				|  |  | -  GPBTimestamp *timeStamp = [[GPBTimestamp alloc] initWithDate:date];
 | 
	
		
			
				|  |  | -  NSDate *timeStampDate = timeStamp.date;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  // Comparing timeIntervals instead of directly comparing dates because date
 | 
	
		
			
				|  |  | -  // equality requires the time intervals to be exactly the same, and the
 | 
	
		
			
				|  |  | -  // timeintervals go through a bit of floating point error as they are
 | 
	
		
			
				|  |  | -  // converted back and forth from the internal representation.
 | 
	
		
			
				|  |  | -  XCTAssertEqualWithAccuracy(date.timeIntervalSince1970,
 | 
	
		
			
				|  |  | -                             timeStampDate.timeIntervalSince1970,
 | 
	
		
			
				|  |  | -                             kTimeAccuracy);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  NSTimeInterval time = [date timeIntervalSince1970];
 | 
	
		
			
				|  |  | -  GPBTimestamp *timeStamp2 =
 | 
	
		
			
				|  |  | -      [[GPBTimestamp alloc] initWithTimeIntervalSince1970:time];
 | 
	
		
			
				|  |  | -  NSTimeInterval durationTime = timeStamp2.timeIntervalSince1970;
 | 
	
		
			
				|  |  | -  XCTAssertEqualWithAccuracy(time, durationTime, kTimeAccuracy);
 | 
	
		
			
				|  |  | -  [timeStamp release];
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  // Test Mutation.
 | 
	
		
			
				|  |  | -  date = [NSDate dateWithTimeIntervalSinceNow:kFutureOffsetInterval];
 | 
	
		
			
				|  |  | -  timeStamp2.date = date;
 | 
	
		
			
				|  |  | -  timeStampDate = timeStamp2.date;
 | 
	
		
			
				|  |  | -  XCTAssertEqualWithAccuracy(date.timeIntervalSince1970,
 | 
	
		
			
				|  |  | -                             timeStampDate.timeIntervalSince1970,
 | 
	
		
			
				|  |  | -                             kTimeAccuracy);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  time = date.timeIntervalSince1970;
 | 
	
		
			
				|  |  | -  timeStamp2.timeIntervalSince1970 = time;
 | 
	
		
			
				|  |  | -  durationTime = timeStamp2.timeIntervalSince1970;
 | 
	
		
			
				|  |  | -  XCTAssertEqualWithAccuracy(time, durationTime, kTimeAccuracy);
 | 
	
		
			
				|  |  | -  [timeStamp2 release];
 | 
	
		
			
				|  |  | +  // Test negative and positive values.
 | 
	
		
			
				|  |  | +  NSTimeInterval values[] = {
 | 
	
		
			
				|  |  | +      -428027599.483999967, -1234567.0, -0.5, 0, 0.75, 54321.0, 2468086,483999967
 | 
	
		
			
				|  |  | +  };
 | 
	
		
			
				|  |  | +  for (size_t i = 0; i < GPBARRAYSIZE(values); ++i) {
 | 
	
		
			
				|  |  | +    NSTimeInterval value = values[i];
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    // Test Creation - date.
 | 
	
		
			
				|  |  | +    NSDate *date = [NSDate dateWithTimeIntervalSince1970:value];
 | 
	
		
			
				|  |  | +    GPBTimestamp *timeStamp = [[GPBTimestamp alloc] initWithDate:date];
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    XCTAssertGreaterThanOrEqual(timeStamp.nanos, 0,
 | 
	
		
			
				|  |  | +                                @"Offset %f - Date: %@", (double)value, date);
 | 
	
		
			
				|  |  | +    XCTAssertLessThan(timeStamp.nanos, 1e9,
 | 
	
		
			
				|  |  | +                      @"Offset %f - Date: %@", (double)value, date);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    // Comparing timeIntervals instead of directly comparing dates because date
 | 
	
		
			
				|  |  | +    // equality requires the time intervals to be exactly the same, and the
 | 
	
		
			
				|  |  | +    // timeintervals go through a bit of floating point error as they are
 | 
	
		
			
				|  |  | +    // converted back and forth from the internal representation.
 | 
	
		
			
				|  |  | +    XCTAssertEqualWithAccuracy(value, timeStamp.date.timeIntervalSince1970,
 | 
	
		
			
				|  |  | +                               kTimeAccuracy,
 | 
	
		
			
				|  |  | +                               @"Offset %f - Date: %@", (double)value, date);
 | 
	
		
			
				|  |  | +    [timeStamp release];
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    // Test Creation - timeIntervalSince1970.
 | 
	
		
			
				|  |  | +    timeStamp = [[GPBTimestamp alloc] initWithTimeIntervalSince1970:value];
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    XCTAssertGreaterThanOrEqual(timeStamp.nanos, 0,
 | 
	
		
			
				|  |  | +                                @"Offset %f - Date: %@", (double)value, date);
 | 
	
		
			
				|  |  | +    XCTAssertLessThan(timeStamp.nanos, 1e9,
 | 
	
		
			
				|  |  | +                      @"Offset %f - Date: %@", (double)value, date);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    XCTAssertEqualWithAccuracy(value, timeStamp.timeIntervalSince1970,
 | 
	
		
			
				|  |  | +                               kTimeAccuracy,
 | 
	
		
			
				|  |  | +                               @"Offset %f - Date: %@", (double)value, date);
 | 
	
		
			
				|  |  | +    [timeStamp release];
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    // Test Mutation - date.
 | 
	
		
			
				|  |  | +    timeStamp = [[GPBTimestamp alloc] init];
 | 
	
		
			
				|  |  | +    timeStamp.date = date;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    XCTAssertGreaterThanOrEqual(timeStamp.nanos, 0,
 | 
	
		
			
				|  |  | +                                @"Offset %f - Date: %@", (double)value, date);
 | 
	
		
			
				|  |  | +    XCTAssertLessThan(timeStamp.nanos, 1e9,
 | 
	
		
			
				|  |  | +                      @"Offset %f - Date: %@", (double)value, date);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    XCTAssertEqualWithAccuracy(value, timeStamp.date.timeIntervalSince1970,
 | 
	
		
			
				|  |  | +                               kTimeAccuracy,
 | 
	
		
			
				|  |  | +                               @"Offset %f - Date: %@", (double)value, date);
 | 
	
		
			
				|  |  | +    [timeStamp release];
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    // Test Mutation - timeIntervalSince1970.
 | 
	
		
			
				|  |  | +    timeStamp = [[GPBTimestamp alloc] init];
 | 
	
		
			
				|  |  | +    timeStamp.timeIntervalSince1970 = value;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    XCTAssertGreaterThanOrEqual(timeStamp.nanos, 0,
 | 
	
		
			
				|  |  | +                                @"Offset %f - Date: %@", (double)value, date);
 | 
	
		
			
				|  |  | +    XCTAssertLessThan(timeStamp.nanos, 1e9,
 | 
	
		
			
				|  |  | +                      @"Offset %f - Date: %@", (double)value, date);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    XCTAssertEqualWithAccuracy(value, timeStamp.date.timeIntervalSince1970,
 | 
	
		
			
				|  |  | +                               kTimeAccuracy,
 | 
	
		
			
				|  |  | +                               @"Offset %f - Date: %@", (double)value, date);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    [timeStamp release];
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  - (void)testDuration {
 | 
	
		
			
				|  |  | -  // Test Creation.
 | 
	
		
			
				|  |  | -  NSTimeInterval time = [[NSDate date] timeIntervalSince1970];
 | 
	
		
			
				|  |  | -  GPBDuration *duration =
 | 
	
		
			
				|  |  | -      [[GPBDuration alloc] initWithTimeIntervalSince1970:time];
 | 
	
		
			
				|  |  | -  NSTimeInterval durationTime = duration.timeIntervalSince1970;
 | 
	
		
			
				|  |  | -  XCTAssertEqualWithAccuracy(time, durationTime, kTimeAccuracy);
 | 
	
		
			
				|  |  | -  [duration release];
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  // Test Mutation.
 | 
	
		
			
				|  |  | -  GPBDuration *duration2 =
 | 
	
		
			
				|  |  | -      [[GPBDuration alloc] initWithTimeIntervalSince1970:time];
 | 
	
		
			
				|  |  | -  NSDate *date = [NSDate dateWithTimeIntervalSinceNow:kFutureOffsetInterval];
 | 
	
		
			
				|  |  | -  time = date.timeIntervalSince1970;
 | 
	
		
			
				|  |  | -  duration2.timeIntervalSince1970 = time;
 | 
	
		
			
				|  |  | -  durationTime = duration2.timeIntervalSince1970;
 | 
	
		
			
				|  |  | -  XCTAssertEqualWithAccuracy(time, durationTime, kTimeAccuracy);
 | 
	
		
			
				|  |  | -  [duration2 release];
 | 
	
		
			
				|  |  | +  // Test negative and positive values.
 | 
	
		
			
				|  |  | +  NSTimeInterval values[] = { -1000.0001, -500.0, -0.5, 0, 0.75, 1000.0, 2000.0002 };
 | 
	
		
			
				|  |  | +  for (size_t i = 0; i < GPBARRAYSIZE(values); ++i) {
 | 
	
		
			
				|  |  | +    NSTimeInterval value = values[i];
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    // Test Creation.
 | 
	
		
			
				|  |  | +    GPBDuration *duration =
 | 
	
		
			
				|  |  | +        [[GPBDuration alloc] initWithTimeInterval:value];
 | 
	
		
			
				|  |  | +    XCTAssertEqualWithAccuracy(value, duration.timeInterval, kTimeAccuracy,
 | 
	
		
			
				|  |  | +                               @"For interval %f", (double)value);
 | 
	
		
			
				|  |  | +    if (value > 0) {
 | 
	
		
			
				|  |  | +      XCTAssertGreaterThanOrEqual(duration.seconds, 0,
 | 
	
		
			
				|  |  | +                                  @"For interval %f", (double)value);
 | 
	
		
			
				|  |  | +      XCTAssertGreaterThanOrEqual(duration.nanos, 0,
 | 
	
		
			
				|  |  | +                                  @"For interval %f", (double)value);
 | 
	
		
			
				|  |  | +    } else {
 | 
	
		
			
				|  |  | +      XCTAssertLessThanOrEqual(duration.seconds, 0,
 | 
	
		
			
				|  |  | +                               @"For interval %f", (double)value);
 | 
	
		
			
				|  |  | +      XCTAssertLessThanOrEqual(duration.nanos, 0,
 | 
	
		
			
				|  |  | +                               @"For interval %f", (double)value);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    [duration release];
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    // Test Mutation.
 | 
	
		
			
				|  |  | +    duration = [[GPBDuration alloc] init];
 | 
	
		
			
				|  |  | +    duration.timeInterval = value;
 | 
	
		
			
				|  |  | +    XCTAssertEqualWithAccuracy(value, duration.timeInterval, kTimeAccuracy,
 | 
	
		
			
				|  |  | +                               @"For interval %f", (double)value);
 | 
	
		
			
				|  |  | +    if (value > 0) {
 | 
	
		
			
				|  |  | +      XCTAssertGreaterThanOrEqual(duration.seconds, 0,
 | 
	
		
			
				|  |  | +                                  @"For interval %f", (double)value);
 | 
	
		
			
				|  |  | +      XCTAssertGreaterThanOrEqual(duration.nanos, 0,
 | 
	
		
			
				|  |  | +                                  @"For interval %f", (double)value);
 | 
	
		
			
				|  |  | +    } else {
 | 
	
		
			
				|  |  | +      XCTAssertLessThanOrEqual(duration.seconds, 0,
 | 
	
		
			
				|  |  | +                               @"For interval %f", (double)value);
 | 
	
		
			
				|  |  | +      XCTAssertLessThanOrEqual(duration.nanos, 0,
 | 
	
		
			
				|  |  | +                               @"For interval %f", (double)value);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    [duration release];
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  - (void)testAnyHelpers {
 |