diff --git a/src/Progressable.php b/src/Progressable.php index 389fd98..f3cd5c0 100644 --- a/src/Progressable.php +++ b/src/Progressable.php @@ -252,7 +252,19 @@ public function isComplete(): bool { * Check if the overall progress is complete (100%). */ public function isOverallComplete(): bool { - return $this->getOverallProgress(0) >= 100; + $progressData = $this->getOverallProgressData(); + + if (empty($progressData)) { + return false; + } + + foreach ($progressData as $data) { + if (($data['progress'] ?? 0) < 100) { + return false; + } + } + + return true; } /** diff --git a/tests/IsOverallCompleteBugTest.php b/tests/IsOverallCompleteBugTest.php new file mode 100644 index 0000000..601ad79 --- /dev/null +++ b/tests/IsOverallCompleteBugTest.php @@ -0,0 +1,33 @@ +setOverallUniqueName('test-overall-complete-bug'); + $a->setLocalKey('a'); + $a->setLocalProgress(100); + + $b = new DummyProgressableOverallComplete(); + $b->setOverallUniqueName('test-overall-complete-bug'); + $b->setLocalKey('b'); + $b->setLocalProgress(99.4); + + // Before the fix, this evaluates to true because getOverallProgress(0) rounds 99.7 to 100. + $this->assertFalse($a->isOverallComplete(), 'isOverallComplete should return false when not all processes are 100% complete.'); + + $b->setLocalProgress(100); + + $this->assertTrue($a->isOverallComplete(), 'isOverallComplete should return true when all processes are 100% complete.'); + } +}