*/ namespace Whoops\Exception; use Whoops\Exception\FrameCollection; use Whoops\TestCase; use Mockery as m; class FrameCollectionTest extends TestCase { /** * Stupid little counter for tagging frames * with a unique but predictable id * @var int */ private $frameIdCounter = 0; /** * @return array */ public function getFrameData() { $id = ++$this->frameIdCounter; return array( 'file' => __DIR__ . '/../../fixtures/frame.lines-test.php', 'line' => $id, 'function' => 'test-' . $id, 'class' => 'MyClass', 'args' => array(true, 'hello') ); } /** * @param int $total * @return array */ public function getFrameDataList($total) { $total = max((int) $total, 1); $self = $this; $frames = array_map(function() use($self) { return $self->getFrameData(); }, range(1, $total)); return $frames; } /** * @param array $frames * @return Whoops\Exception\FrameCollection */ private function getFrameCollectionInstance($frames = null) { if($frames === null) { $frames = $this->getFrameDataList(10); } return new FrameCollection($frames); } /** * @covers Whoops\Exception\FrameCollection::offsetExists */ public function testArrayAccessExists() { $collection = $this->getFrameCollectionInstance(); $this->assertTrue(isset($collection[0])); } /** * @covers Whoops\Exception\FrameCollection::offsetGet */ public function testArrayAccessGet() { $collection = $this->getFrameCollectionInstance(); $this->assertInstanceOf('Whoops\\Exception\\Frame', $collection[0]); } /** * @covers Whoops\Exception\FrameCollection::offsetSet * @expectedException Exception */ public function testArrayAccessSet() { $collection = $this->getFrameCollectionInstance(); $collection[0] = 'foo'; } /** * @covers Whoops\Exception\FrameCollection::offsetUnset * @expectedException Exception */ public function testArrayAccessUnset() { $collection = $this->getFrameCollectionInstance(); unset($collection[0]); } /** * @covers Whoops\Exception\FrameCollection::filter * @covers Whoops\Exception\FrameCollection::count */ public function testFilterFrames() { $frames = $this->getFrameCollectionInstance(); // Filter out all frames with a line number under 6 $frames->filter(function($frame) { return $frame->getLine() <= 5; }); $this->assertCount(5, $frames); } /** * @covers Whoops\Exception\FrameCollection::map */ public function testMapFrames() { $frames = $this->getFrameCollectionInstance(); // Filter out all frames with a line number under 6 $frames->map(function($frame) { $frame->addComment("This is cool", "test"); return $frame; }); $this->assertCount(10, $frames); } /** * @covers Whoops\Exception\FrameCollection::map * @expectedException UnexpectedValueException */ public function testMapFramesEnforceType() { $frames = $this->getFrameCollectionInstance(); // Filter out all frames with a line number under 6 $frames->map(function($frame) { return "bajango"; }); } /** * @covers Whoops\Exception\FrameCollection::getArray */ public function testGetArray() { $frames = $this->getFrameCollectionInstance(); $frames = $frames->getArray(); $this->assertCount(10, $frames); foreach($frames as $frame) { $this->assertInstanceOf('Whoops\\Exception\\Frame', $frame); } } /** * @covers Whoops\Exception\FrameCollection::getArray */ public function testGetArrayImmutable() { $frames = $this->getFrameCollectionInstance(); $arr = $frames->getArray(); $arr[0] = 'foobar'; $newCopy = $frames->getArray(); $this->assertFalse($arr[0] === $newCopy); } /** * @covers Whoops\Exception\FrameCollection::getIterator */ public function testCollectionIsIterable() { $frames = $this->getFrameCollectionInstance(); foreach($frames as $frame) { $this->assertInstanceOf('Whoops\\Exception\\Frame', $frame); } } /** * @covers Whoops\Exception\FrameCollection::serialize * @covers Whoops\Exception\FrameCollection::unserialize */ public function testCollectionIsSerializable() { $frames = $this->getFrameCollectionInstance(); $serializedFrames = serialize($frames); $newFrames = unserialize($serializedFrames); foreach($newFrames as $frame) { $this->assertInstanceOf('Whoops\\Exception\\Frame', $frame); } } /** * @covers Whoops\Exception\FrameCollection::topDiff */ public function testTopDiff(){ $commonFrameTail = $this->getFrameDataList(3); $diffFrame = array('line' => $this->frameIdCounter) + $this->getFrameData(); $frameCollection1 = new FrameCollection(array_merge(array( $diffFrame ), $commonFrameTail)); $frameCollection2 = new FrameCollection(array_merge(array( $this->getFrameData() ), $commonFrameTail)); $diff = $frameCollection1->topDiff($frameCollection2); $this->assertCount(1, $diff); } }