public function authenticateDelegatesAuthenticationToTheCorrectProvidersInTheCorrectOrder()
{
$mockProvider1 = $this->createMock(AuthenticationProviderInterface::class);
$mockProvider2 = $this->createMock(AuthenticationProviderInterface::class);
$mockToken1 = $this->createMock(TokenInterface::class);
$mockToken2 = $this->createMock(TokenInterface::class);
$mockToken1->expects($this->atLeastOnce())->method('isAuthenticated')->will($this->returnValue(true));
$mockToken2->expects($this->atLeastOnce())->method('isAuthenticated')->will($this->returnValue(true));
$mockToken1->expects($this->any())->method('getAuthenticationStatus')->will($this->returnValue(TokenInterface::AUTHENTICATION_NEEDED));
$mockToken2->expects($this->any())->method('getAuthenticationStatus')->will($this->returnValue(TokenInterface::AUTHENTICATION_NEEDED));
$mockProvider1->expects($this->atLeastOnce())->method('canAuthenticate')->will($this->onConsecutiveCalls(true, false));
$mockProvider2->expects($this->atLeastOnce())->method('canAuthenticate')->will($this->returnValue(true));
$mockProvider1->expects($this->once())->method('authenticate')->with($mockToken1);
$mockProvider2->expects($this->once())->method('authenticate')->with($mockToken2);
$this->mockSecurityContext->expects($this->atLeastOnce())->method('getAuthenticationStrategy')->will($this->returnValue(Context::AUTHENTICATE_ALL_TOKENS));
$this->mockSecurityContext->expects($this->atLeastOnce())->method('getAuthenticationTokens')->will($this->returnValue([$mockToken1, $mockToken2]));
$this->inject($this->authenticationProviderManager, 'providers', [$mockProvider1, $mockProvider2]);
$this->authenticationProviderManager->authenticate();
}