/**
  * {@inheritdoc}
  */
 public function purge(array $options = [])
 {
     $versionsToPurge = [];
     $versionsPurgedCount = 0;
     $optionResolver = new OptionsResolver();
     $this->configureOptions($optionResolver);
     $options = $optionResolver->resolve($options);
     $versionsCursor = $this->versionRepository->findPotentiallyPurgeableBy($options);
     foreach ($versionsCursor as $version) {
         $this->eventDispatcher->dispatch(PurgeVersionEvents::PRE_ADVISEMENT, new PreAdvisementVersionEvent($version));
         if ($this->isVersionPurgeable($version, $options)) {
             $this->eventDispatcher->dispatch(PurgeVersionEvents::PRE_PURGE, new PrePurgeVersionEvent($version));
             $versionsPurgedCount++;
             $versionsToPurge[] = $version;
             if (count($versionsToPurge) >= self::BULK_THRESHOLD) {
                 $this->versionRemover->removeAll($versionsToPurge);
                 $this->objectDetacher->detachAll($versionsToPurge);
                 $versionsToPurge = [];
             }
         } else {
             $this->objectDetacher->detach($version);
         }
     }
     $this->versionRemover->removeAll($versionsToPurge);
     $this->objectDetacher->detachAll($versionsToPurge);
     return $versionsPurgedCount;
 }
 function it_purges_the_versions_according_to_an_advisor_and_returns_the_number_of_purged_versions(VersionRepositoryInterface $versionRepository, BulkRemoverInterface $versionRemover, BulkObjectDetacherInterface $objectDetacher, VersionPurgerAdvisorInterface $advisor, VersionInterface $versionToBePurged, VersionInterface $versionNotSupported, VersionInterface $versionToNotPurge)
 {
     $versionToBePurged->getResourceName()->willReturn('products');
     $versionToBePurged->getId()->willReturn(1);
     $versionNotSupported->getResourceName()->willReturn('products');
     $versionNotSupported->getId()->willReturn(2);
     $versionToNotPurge->getResourceName()->willReturn('products');
     $versionToNotPurge->getId()->willReturn(3);
     $versionRepository->findPotentiallyPurgeableBy(Argument::type('array'))->willReturn([$versionToBePurged, $versionNotSupported, $versionToNotPurge]);
     $advisor->supports($versionToBePurged)->shouldBeCalled()->willReturn(true);
     $advisor->isPurgeable($versionToBePurged, Argument::type('array'))->shouldBeCalled()->willReturn(true);
     $advisor->supports($versionNotSupported)->shouldBeCalled()->willReturn(false);
     $advisor->isPurgeable($versionNotSupported, Argument::type('array'))->shouldNotBeCalled();
     $advisor->supports($versionToNotPurge)->shouldBeCalled()->willReturn(true);
     $advisor->isPurgeable($versionToNotPurge, Argument::type('array'))->shouldBeCalled()->willReturn(false);
     $this->addVersionPurgerAdvisor($advisor);
     $versionRemover->removeAll([$versionToBePurged, $versionNotSupported])->shouldBeCalled();
     $objectDetacher->detachAll([$versionToBePurged, $versionNotSupported])->shouldBeCalled();
     $objectDetacher->detach($versionToNotPurge)->shouldBeCalled();
     $this->purge([])->shouldReturn(2);
 }