when($result = new SUT('foo')) ->then ->object($result) ->isInstanceOf('Hoa\Exception\Exception') ->isInstanceOf('ArrayAccess') ->isInstanceOf('IteratorAggregate') ->isInstanceOf('Countable'); } public function case_constructor() { $this ->given( $message = 'foo %s %d %s', $code = 7, $arguments = ['arg', 42, null], $previous = new SUT('previous') ) ->when($result = new SUT($message, $code, $arguments, $previous), $line = __LINE__) ->then ->string($result->getMessage()) ->isEqualTo('foo arg 42 (null)') ->integer($result->getCode()) ->isEqualTo(7) ->array($result->getArguments()) ->isEqualTo(['arg', 42, '(null)']) ->object($result->getPreviousThrow()) ->isIdenticalTo($previous) ->boolean($result->hasUncommittedExceptions()) ->isFalse(); } public function case_raise_zero_exception() { $this ->given($group = new SUT('foo'), $line = __LINE__) ->when($result = $group->raise()) ->then ->string($result) ->isEqualTo( __METHOD__ . '(): (0) foo' . "\n" . 'in ' . __FILE__ . ' at line ' . $line . '.' ); } public function case_raise_one_exception() { $this ->given( $exception1 = new SUT('bar'), $barLine = __LINE__, $group = new SUT('foo'), $fooLine = __LINE__, $group[] = $exception1 ) ->when($result = $group->raise()) ->then ->string($result) ->isEqualTo( __METHOD__ . '(): (0) foo' . "\n" . 'in ' . __FILE__ . ' at line ' . $fooLine . '.' . "\n\n" . 'Contains the following exceptions:' . "\n\n" . ' • ' . __METHOD__ . '(): (0) bar' . "\n" . ' in ' . __FILE__ . ' at line ' . $barLine . '.' ); } public function case_raise_more_exceptions() { $this ->given( $exception1 = new SUT('bar'), $barLine = __LINE__, $exception2 = new SUT('baz'), $bazLine = __LINE__, $group = new SUT('foo'), $fooLine = __LINE__, $group[] = $exception1, $group[] = $exception2 ) ->when($result = $group->raise()) ->then ->string($result) ->isEqualTo( __METHOD__ . '(): (0) foo' . "\n" . 'in ' . __FILE__ . ' at line ' . $fooLine . '.' . "\n\n" . 'Contains the following exceptions:' . "\n\n" . ' • ' . __METHOD__ . '(): (0) bar' . "\n" . ' in ' . __FILE__ . ' at line ' . $barLine . '.' . "\n\n" . ' • ' . __METHOD__ . '(): (0) baz' . "\n" . ' in ' . __FILE__ . ' at line ' . $bazLine . '.' ); } public function case_begin_transaction() { $this ->given( $group = new SUT('foo'), $oldStackSize = $group->getStackSize() ) ->when( $result = $group->beginTransaction(), $stackSize = $group->getStackSize() ) ->then ->integer($oldStackSize) ->isEqualTo(1) ->object($result) ->isIdenticalTo($group) ->integer($stackSize) ->isEqualTo($oldStackSize + 1); } public function case_rollback_transaction_with_an_empty_stack() { $this ->given( $group = new SUT('foo'), $oldStackSize = $group->getStackSize() ) ->when( $result = $group->rollbackTransaction(), $stackSize = $group->getStackSize() ) ->then ->integer($oldStackSize) ->isEqualTo(1) ->object($result) ->isIdenticalTo($group) ->integer($stackSize) ->isEqualTo($oldStackSize); } public function case_rollback_transaction() { $this ->given( $group = new SUT('foo'), $group->beginTransaction(), $group->beginTransaction(), $oldStackSize = $group->getStackSize(), $group->rollbackTransaction() ) ->when( $result = $group->rollbackTransaction(), $stackSize = $group->getStackSize() ) ->then ->integer($oldStackSize) ->isEqualTo(3) ->object($result) ->isIdenticalTo($group) ->integer($stackSize) ->isEqualTo($oldStackSize - 2); } public function case_commit_transaction_with_an_empty_stack() { $this ->given( $group = new SUT('foo'), $group->beginTransaction(), $oldCount = count($group), $oldStackSize = $group->getStackSize() ) ->when( $result = $group->commitTransaction(), $count = count($group), $stackSize = $group->getStackSize() ) ->then ->integer($oldCount) ->isEqualTo(0) ->integer($oldStackSize) ->isEqualTo(2) ->object($result) ->isIdenticalTo($group) ->integer($count) ->isEqualTo($oldCount) ->integer($stackSize) ->isEqualTo($oldStackSize - 1); } public function case_commit_transaction() { $this ->given( $group = new SUT('foo'), $group->beginTransaction(), $exception1 = new SUT('bar'), $exception2 = new SUT('baz'), $group[] = $exception1, $group[] = $exception2, $oldCount = count($group), $oldStackSize = $group->getStackSize() ) ->when( $result = $group->commitTransaction(), $count = count($group), $stackSize = $group->getStackSize() ) ->then ->integer($oldCount) ->isEqualTo(0) ->integer($oldStackSize) ->isEqualTo(2) ->object($result) ->isIdenticalTo($group) ->integer($count) ->isEqualTo($oldCount + 2) ->integer($stackSize) ->isEqualTo($oldStackSize - 1) ->array(iterator_to_array($group->getIterator())) ->isEqualTo([ 0 => $exception1, 1 => $exception2 ]); } public function case_has_uncommitted_exceptions() { $this ->given( $group = new SUT('foo'), $group->beginTransaction(), $group[] = new SUT('bar') ) ->when($result = $group->hasUncommittedExceptions()) ->then ->boolean($result) ->isTrue(); } public function case_has_no_uncommitted_exceptions() { $this ->given( $group = new SUT('foo'), $group->beginTransaction() ) ->when($result = $group->hasUncommittedExceptions()) ->then ->boolean($result) ->isFalse(); } public function case_has_no_uncommitted_exceptions_with_empty_stack() { $this ->given( $group = new SUT('foo'), $group[] = new SUT('bar') ) ->when($result = $group->hasUncommittedExceptions()) ->then ->boolean($result) ->isFalse(); } public function case_offset_exists_with_no_uncommited_exceptions() { $this ->given( $group = new SUT('foo'), $group['bar'] = new SUT('bar') ) ->when($result = $group->offsetExists('bar')) ->then ->boolean($result) ->isTrue(); } public function case_offset_does_not_exist_with_no_uncommited_exceptions() { $this ->given( $group = new SUT('foo'), $group['bar'] = new SUT('bar') ) ->when($result = $group->offsetExists('baz')) ->then ->boolean($result) ->isFalse(); } public function case_offset_exists() { $this ->given( $group = new SUT('foo'), $group->beginTransaction(), $group->beginTransaction(), $group['bar'] = new SUT('bar') ) ->when($result = $group->offsetExists('bar')) ->then ->boolean($result) ->isTrue(); } public function case_offset_does_not_exist() { $this ->given( $group = new SUT('foo'), $group->beginTransaction(), $group->beginTransaction(), $group['bar'] = new SUT('bar') ) ->when($result = $group->offsetExists('baz')) ->then ->boolean($result) ->isFalse(); } public function case_offset_get_with_no_uncommited_exceptions() { $this ->given( $group = new SUT('foo'), $exception1 = new SUT('bar'), $group['bar'] = $exception1 ) ->when($result = $group->offsetGet('bar')) ->then ->object($result) ->isIdenticalTo($exception1); } public function case_offset_get_does_not_exist_with_no_uncommited_exceptions() { $this ->given( $group = new SUT('foo'), $exception1 = new SUT('bar'), $group['bar'] = $exception1 ) ->when($result = $group->offsetGet('baz')) ->then ->variable($result) ->isNull(); } public function case_offset_get() { $this ->given( $group = new SUT('foo'), $group->beginTransaction(), $group->beginTransaction(), $exception1 = new SUT('bar'), $group['bar'] = $exception1 ) ->when($result = $group->offsetGet('bar')) ->then ->object($result) ->isIdenticalTo($exception1); } public function case_offset_get_does_not_exist() { $this ->given( $group = new SUT('foo'), $group->beginTransaction(), $group->beginTransaction(), $exception1 = new SUT('bar'), $group['bar'] = $exception1 ) ->when($result = $group->offsetGet('baz')) ->then ->variable($result) ->isNull(); } public function case_offset_set_not_an_exception() { $this ->given($group = new SUT('foo')) ->when($group->offsetSet('bar', new \StdClass())) ->then ->boolean($group->offsetExists('bar')) ->isFalse(); } public function case_offset_set() { $this ->given( $group = new SUT('foo'), $exception1 = new SUT('bar') ) ->when($result = $group->offsetExists('bar')) ->then ->boolean($result) ->isFalse() ->when($group->offsetSet('bar', $exception1)) ->then ->boolean($group->offsetExists('bar')) ->isTrue() ->object($group->offsetGet('bar')) ->isIdenticalTo($exception1); } public function case_offset_set_with_a_null_index() { $this ->given( $group = new SUT('foo'), $exception1 = new SUT('bar') ) ->when($group->offsetSet(null, $exception1)) ->then ->boolean($group->offsetExists(0)) ->isTrue() ->object($group->offsetGet(0)) ->isIdenticalTo($exception1); } public function case_offset_set_with_an_integer_index() { $this ->given( $group = new SUT('foo'), $exception1 = new SUT('bar') ) ->when($group->offsetSet(42, $exception1)) ->then ->boolean($group->offsetExists(42)) ->isFalse() ->boolean($group->offsetExists(0)) ->isTrue() ->object($group->offsetGet(0)) ->isIdenticalTo($exception1); } public function case_offset_unset_with_no_uncommited_exceptions() { $this ->given( $group = new SUT('foo'), $group['bar'] = new SUT('bar') ) ->when($group->offsetUnset('bar')) ->then ->boolean($group->offsetExists('bar')) ->isFalse(); } public function case_offset_unset_does_not_exist_with_no_uncommited_exceptions() { $this ->given($group = new SUT('foo')) ->when($group->offsetUnset('bar')) ->then ->boolean($group->offsetExists('bar')) ->isFalse(); } public function case_offset_unset() { $this ->given( $group = new SUT('foo'), $group->beginTransaction(), $group->beginTransaction(), $group['bar'] = new SUT('bar') ) ->when($result = $group->offsetUnset('bar')) ->then ->boolean($group->offsetExists('bar')) ->isFalse(); } public function case_offset_unset_does_not_exist() { $this ->given( $group = new SUT('foo'), $group->beginTransaction(), $group->beginTransaction() ) ->when($result = $group->offsetUnset('bar')) ->then ->boolean($group->offsetExists('bar')) ->isFalse(); } public function case_get_exceptions() { $this ->given( $group = new SUT('foo'), $exception1 = new SUT('bar'), $exception2 = new SUT('baz'), $group['bar'] = $exception1, $group->beginTransaction(), $group['baz'] = $exception2 ) ->when($result = $group->getExceptions()) ->then ->object($result) ->isInstanceOf('ArrayObject') ->object($result['bar']) ->isIdenticalTo($exception1); } public function case_get_iterator() { $this ->given( $group = new SUT('foo'), $exception1 = new SUT('bar'), $group['bar'] = $exception1 ) ->when($result = $group->getIterator()) ->then ->object($result) ->isInstanceOf('ArrayIterator') ->array(iterator_to_array($result)) ->isEqualTo([ 'bar' => $exception1 ]); } public function case_count() { $this ->given( $group = new SUT('foo'), $exception1 = new SUT('bar'), $exception2 = new SUT('baz'), $group['bar'] = $exception1, $group->beginTransaction(), $group['baz'] = $exception2 ) ->when($result = count($group)) ->then ->integer($result) ->isEqualTo(1); } public function get_get_stack_size() { $this ->given( $group = new SUT('foo'), $exception1 = new SUT('bar'), $exception2 = new SUT('baz'), $group['bar'] = $exception1, $group->beginTransaction(), $group['baz'] = $exception2 ) ->when($result = $group->getStackSize()) ->then ->integer($result) ->isEqualTo(2); } }