Extract the tracking of transaction states to a separate class.

The Predis\Transaction\MultiExecState class is actually quite dummy as
it does not work as a finite-state machine, but is used to track state
using flags. It basically replicates the same behaviour of when it was
part of the Predis\Transaction\MultiExec code and it will do for now.
This commit is contained in:
Daniele Alessandri
2013-11-17 12:18:34 +01:00
parent c047c4992a
commit 84e0f5af7a
3 changed files with 391 additions and 79 deletions
@@ -0,0 +1,202 @@
<?php
/*
* This file is part of the Predis package.
*
* (c) Daniele Alessandri <suppakilla@gmail.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Predis\Transaction;
use PHPUnit_Framework_TestCase as StandardTestCase;
/**
* @group realm-transaction
*/
class MultiExecStateTest extends StandardTestCase
{
/**
* @group disconnected
*/
public function testFlagsValues()
{
$this->assertSame(1, MultiExecState::INITIALIZED);
$this->assertSame(2, MultiExecState::INSIDEBLOCK);
$this->assertSame(4, MultiExecState::DISCARDED);
$this->assertSame(8, MultiExecState::CAS);
$this->assertSame(16, MultiExecState::WATCH);
}
/**
* @group disconnected
*/
public function testStateConstructorStartsWithResetState()
{
$state = new MultiExecState();
$this->assertSame(0, $state->get());
$this->assertTrue($state->isReset());
}
/**
* @group disconnected
*/
public function testCanCheckOneOrMoreStateFlags()
{
$flags = MultiExecState::INITIALIZED | MultiExecState::CAS;
$state = new MultiExecState();
$state->set($flags);
$this->assertSame($flags, $state->get());
$this->assertFalse($state->check(MultiExecState::INSIDEBLOCK));
$this->assertTrue($state->check(MultiExecState::INITIALIZED));
$this->assertTrue($state->check(MultiExecState::CAS));
$this->assertTrue($state->check($flags));
$this->assertFalse($state->check($flags | MultiExecState::INSIDEBLOCK));
}
/**
* @group disconnected
*/
public function testSettingAndGettingWholeFlags()
{
$flags = MultiExecState::INITIALIZED | MultiExecState::CAS;
$state = new MultiExecState();
$state->set($flags);
$this->assertFalse($state->check(MultiExecState::INSIDEBLOCK));
$this->assertTrue($state->check(MultiExecState::INITIALIZED));
$this->assertTrue($state->check(MultiExecState::CAS));
$this->assertSame($flags, $state->get());
}
/**
* @group disconnected
*/
public function testCanFlagSingleStates()
{
$flags = MultiExecState::INITIALIZED | MultiExecState::CAS;
$state = new MultiExecState();
$state->flag(MultiExecState::INITIALIZED);
$this->assertTrue($state->check(MultiExecState::INITIALIZED));
$this->assertFalse($state->check(MultiExecState::CAS));
$state->flag(MultiExecState::CAS);
$this->assertTrue($state->check(MultiExecState::INITIALIZED));
$this->assertTrue($state->check(MultiExecState::CAS));
$this->assertSame($flags, $state->get());
}
/**
* @group disconnected
*/
public function testCanUnflagSingleStates()
{
$state = new MultiExecState();
$state->set(MultiExecState::INITIALIZED | MultiExecState::CAS);
$this->assertTrue($state->check(MultiExecState::INITIALIZED));
$this->assertTrue($state->check(MultiExecState::CAS));
$state->unflag(MultiExecState::CAS);
$this->assertTrue($state->check(MultiExecState::INITIALIZED));
$this->assertFalse($state->check(MultiExecState::CAS));
$state->unflag(MultiExecState::INITIALIZED);
$this->assertFalse($state->check(MultiExecState::INITIALIZED));
$this->assertFalse($state->check(MultiExecState::CAS));
$this->assertTrue($state->isReset());
}
/**
* @group disconnected
*/
public function testIsInitializedMethod()
{
$state = new MultiExecState();
$this->assertFalse($state->isInitialized());
$state->set(MultiExecState::INITIALIZED);
$this->assertTrue($state->isInitialized());
}
/**
* @group disconnected
*/
public function testIsExecuting()
{
$state = new MultiExecState();
$this->assertFalse($state->isExecuting());
$state->set(MultiExecState::INSIDEBLOCK);
$this->assertTrue($state->isExecuting());
}
/**
* @group disconnected
*/
public function testIsCAS()
{
$state = new MultiExecState();
$this->assertFalse($state->isCAS());
$state->set(MultiExecState::CAS);
$this->assertTrue($state->isCAS());
}
/**
* @group disconnected
*/
public function testIsWatchAllowed()
{
$state = new MultiExecState();
$this->assertFalse($state->isWatchAllowed());
$state->flag(MultiExecState::INITIALIZED);
$this->assertTrue($state->isWatchAllowed());
$state->flag(MultiExecState::CAS);
$this->assertFalse($state->isWatchAllowed());
$state->unflag(MultiExecState::CAS);
$this->assertTrue($state->isWatchAllowed());
}
/**
* @group disconnected
*/
public function testIsWatching()
{
$state = new MultiExecState();
$this->assertFalse($state->isWatching());
$state->set(MultiExecState::WATCH);
$this->assertTrue($state->isWatching());
}
/**
* @group disconnected
*/
public function testIsDiscarded()
{
$state = new MultiExecState();
$this->assertFalse($state->isDiscarded());
$state->set(MultiExecState::DISCARDED);
$this->assertTrue($state->isDiscarded());
}
}