blob: a332f91da72b0f8ebe733d24846689ccffe0c4e1 [file] [log] [blame] [edit]
//
// Copyright 2018 Google Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
#import "Measure/Sources/EDONumericMeasure.h"
#import <XCTest/XCTest.h>
@interface EDONumericMeasureTest : XCTestCase
@end
@implementation EDONumericMeasureTest
- (void)testFreshMeasure {
EDONumericMeasure *measure = [EDONumericMeasure measure];
XCTAssertEqual(measure.measureCount, 0U);
XCTAssertThrows(measure.average);
XCTAssertTrue([measure complete]);
XCTAssertEqual(measure.average, 0);
XCTAssertEqual(measure.maximum, DBL_MIN);
XCTAssertEqual(measure.minimum, DBL_MAX);
XCTAssertFalse([measure complete]);
}
- (void)testMeasureWithOneValue {
EDONumericMeasure *measure = [EDONumericMeasure measure];
[measure addSingleValue:100];
XCTAssertTrue([measure complete]);
XCTAssertEqual(measure.measureCount, 1U);
XCTAssertEqualWithAccuracy(measure.average, 100, DBL_EPSILON);
XCTAssertEqualWithAccuracy(measure.minimum, 100, DBL_EPSILON);
XCTAssertEqualWithAccuracy(measure.maximum, 100, DBL_EPSILON);
}
- (void)testMeasureIgnoredAfterCompletion {
EDONumericMeasure *measure = [EDONumericMeasure measure];
[measure addSingleValue:50];
XCTAssertTrue([measure complete]);
[measure addSingleValue:100];
XCTAssertEqual(measure.measureCount, 1U);
XCTAssertEqualWithAccuracy(measure.average, 50, DBL_EPSILON);
XCTAssertEqualWithAccuracy(measure.minimum, 50, DBL_EPSILON);
XCTAssertEqualWithAccuracy(measure.maximum, 50, DBL_EPSILON);
}
- (void)testMeasureWithMultipleValues {
EDONumericMeasure *measure = [EDONumericMeasure measure];
for (NSNumber *value in @[ @10, @20, @30, @40 ]) {
[measure addSingleValue:value.doubleValue];
}
XCTAssertTrue([measure complete]);
XCTAssertEqual(measure.measureCount, 4U);
XCTAssertEqualWithAccuracy(measure.average, 25, DBL_EPSILON);
XCTAssertEqualWithAccuracy(measure.minimum, 10, DBL_EPSILON);
XCTAssertEqualWithAccuracy(measure.maximum, 40, DBL_EPSILON);
}
- (void)testMeasureWithMultipleQueues {
EDONumericMeasure *measure = [EDONumericMeasure measure];
dispatch_queue_t concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0);
for (int i = 1; i <= 100; ++i) {
dispatch_async(concurrentQueue, ^{
for (NSNumber *value in @[ @(10 * i), @(20 * i), @(30 * i), @(40 * i) ]) {
[measure addSingleValue:value.doubleValue];
}
});
}
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"measureCount == 400"];
XCTNSPredicateExpectation *expect = [[XCTNSPredicateExpectation alloc] initWithPredicate:predicate
object:measure];
[self waitForExpectations:@[ expect ] timeout:4];
XCTAssertTrue([measure complete]);
// Use a broader tolerance as this seems to produce more errors on some machines.
XCTAssertEqualWithAccuracy(measure.average, 1262.5, 0.1);
XCTAssertEqualWithAccuracy(measure.minimum, 10, DBL_EPSILON);
XCTAssertEqualWithAccuracy(measure.maximum, 4000, DBL_EPSILON);
}
@end