diff --git a/Classes/Core/OMDeferred.h b/Classes/Core/OMDeferred.h index 22a1687..718a754 100644 --- a/Classes/Core/OMDeferred.h +++ b/Classes/Core/OMDeferred.h @@ -2,7 +2,7 @@ // OMPromise.h // OMPromises // -// Copyright (C) 2013,2014 Oliver Mader +// Copyright (C) 2013-2015 Oliver Mader // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -76,7 +76,7 @@ /** Finalizes the deferred by settings its state to OMPromiseStateFulfilled. - Implicitly sets the progress to 1. + Implicitly sets the progress to 1.0f. @param result Result to set and propagate. @see fail: @@ -93,7 +93,7 @@ /** Update the progress. The new progress has to be higher than the previous one. Equal values are skipped, - but lower values raise an exception. + but lower values raise an exception. The progress must be less than or equal to 1.0f. @param progress Higher progress to set and propagate. */ diff --git a/Classes/Core/OMDeferred.m b/Classes/Core/OMDeferred.m index 4aee602..02dd5d6 100644 --- a/Classes/Core/OMDeferred.m +++ b/Classes/Core/OMDeferred.m @@ -2,7 +2,7 @@ // OMPromise.h // OMPromises // -// Copyright (C) 2013,2014 Oliver Mader +// Copyright (C) 2013-2015 Oliver Mader // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -88,9 +88,10 @@ - (void)progress:(float)progress { @synchronized (self) { NSAssert(self.state == OMPromiseStateUnfulfilled, @"Can only progress while being Unfulfilled"); NSAssert(self.progress <= progress + FLT_EPSILON, @"Progress must not decrease"); + NSAssert(progress <= 1.0f + FLT_EPSILON, @"Progress must be in range (0, 1]"); if (self.progress < progress - FLT_EPSILON) { - self.progress = progress; + self.progress = MIN(1.0f, progress); progressHandlers = self.progressHandlers; } diff --git a/Classes/HTTP/OMHTTPRequest.m b/Classes/HTTP/OMHTTPRequest.m index a88e79a..f6be9cc 100644 --- a/Classes/HTTP/OMHTTPRequest.m +++ b/Classes/HTTP/OMHTTPRequest.m @@ -103,8 +103,8 @@ - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { [self.data appendData:data]; if (self.expectedContentLength > 0) { - [self progress:self.lookup + (1 - self.lookup) * - (float)self.data.length / self.expectedContentLength]; + [self progress:MIN(1.0f, self.lookup + (1 - self.lookup) * + (float)self.data.length / self.expectedContentLength)]; } } diff --git a/Tests/Core/OMDeferredTests.m b/Tests/Core/OMDeferredTests.m index 6e3241d..9dee054 100644 --- a/Tests/Core/OMDeferredTests.m +++ b/Tests/Core/OMDeferredTests.m @@ -90,6 +90,8 @@ - (void)testProgress { XCTAssertThrows([deferred progress:.1f], @"Must not decrease progress"); XCTAssertEqualWithAccuracy(deferred.progress, .2f, FLT_EPSILON, @"Progress shouldn't have changed"); + + XCTAssertThrows([deferred progress:1.1f], @"Progress must not exceed 1.0f"); } - (void)testProgressPrecision { @@ -97,7 +99,7 @@ - (void)testProgressPrecision { __block int called = 0; [deferred.promise progressed:^(float progress) { - float values[] = {.1f, .1 + 2.f*FLT_EPSILON}; + float values[] = {.1f, .1 + 2.f*FLT_EPSILON, 1.0f}; XCTAssertEqualWithAccuracy(values[called], progress, FLT_EPSILON, @"Unexpected progress"); called += 1; }]; @@ -113,6 +115,9 @@ - (void)testProgressPrecision { [deferred progress:.1f + 2.f*FLT_EPSILON]; XCTAssertEqual(called, 2, @"Finally we progress if the change is large enough"); + + [deferred progress:1.0f + FLT_EPSILON]; + XCTAssertEqual(deferred.progress, 1.0f); } - (void)testTryFulfil {