| 
<?php
 require_once 'ComplexityAnalyzer.php';
 require_once 'DummyClass.php';
 require_once 'DummyClassTest.php';
 
 /**
 * Test class for ComplexityAnalyzer.
 * Generated by PHPUnit on 2011-12-30 at 16:16:39.
 */
 class ComplexityAnalyzerTest extends PHPUnit_Framework_TestCase
 {
 /**
 * @var ComplexityAnalyzer
 */
 protected $object;
 /**
 * @var ComplexityAnalyzer ReflectionClass
 */
 protected $testclass;
 
 /**
 * This method is called before a test is executed.
 * I started writing tests applying ComplexityAnalyzer to itself
 * but that gets mindboggling at times, like reading
 * Derrida's writing about writing, where the text is about itself
 * When I could not take it anymore, I stopped doing that and introduced
 * the external DummyClass - much easier.
 */
 protected function setUp()
 {
 $this->object = new ComplexityAnalyzer('ComplexityAnalyzer', 'ComplexityAnalyzer.php');
 $this->testclass = new ReflectionClass('ComplexityAnalyzer');
 }
 
 /**
 * @covers ComplexityAnalyzer::__construct
 */
 public function test__construct(){
 $this->assertTrue(isset($this->object)); // result of call without testclass
 // now check with testclass
 $ca = new ComplexityAnalyzer('DummyClass', 'DummyClass.php');
 $this->assertTrue(isset($ca));
 // now check with bad path
 try{
 $ca = new ComplexityAnalyzer('DummyClass', 'BADDummyClass.php');
 }
 catch(Exception $e){
 return;
 }
 $this->fail();
 }
 
 
 /**
 * @covers ComplexityAnalyzer::getMethods
 */
 public function testGetMethods()
 {
 $methods = $this->object->getMethods();
 $this->assertTrue(count($methods)>5); //some not-too-small number
 $this->assertTrue($methods[0] instanceof ReflectionMethod);
 }
 
 /**
 * @covers ComplexityAnalyzer::getMethodSource
 */
 public function testGetMethodSource()
 {
 $method = $this->object->getClassMethod('getClassMethod');
 $methodsource = $this->object->getMethodSource($method);
 $this->assertRegExp('/getClassMethod\s*\([^)]*\)\s*{.*}/s', $methodsource);
 }
 
 /**
 * @covers ComplexityAnalyzer::getClassMethod
 */
 public function testGetClassMethod()
 {
 $method = $this->object->getClassMethod('getClassMethod');
 $this->assertTrue($method instanceof ReflectionMethod);
 $this->assertEquals($method->name, 'getClassMethod');
 }
 
 /**
 * @covers ComplexityAnalyzer::getNumberOfParentheses
 */
 public function testGetNumberOfParentheses()
 {
 $numparens = $this->object->getNumberOfParentheses('getClassMethod');
 $this->assertEquals($numparens, 2); // 1 paren for arg list, 1 within body
 }
 /**
 * @covers ComplexityAnalyzer::renderTodoList
 */
 public function testRenderTodoList()
 {
 $list = array('a', 'b', 'c');
 $renderedlist = $this->object->renderTodoList($list);
 $this->assertRegExp('/3: c/', $renderedlist); // 1 paren for arg list, 1 within body
 }
 /**
 * @covers ComplexityAnalyzer::convertToTestMethodName
 */
 public function testConvertToTestMethodName()
 {
 $name = 'someName';
 $expectedname = 'testSomeName';
 $this->assertEquals($this->object->convertToTestMethodName($name), $expectedname);
 }
 /**
 * @covers ComplexityAnalyzer::convertToMethodName
 */
 public function testConvertToMethodName()
 {
 $name = 'testSomeName';
 $expectedname = 'someName';
 $this->assertEquals($this->object->convertToMethodName($name), $expectedname);
 }
 /**
 * @covers ComplexityAnalyzer::convertToMethodName
 */
 public function testConvertToMethodName_withBadArg()
 {
 $name = 'someBadName';
 $expectedname = '';
 $this->assertEquals($this->object->convertToMethodName($name), $expectedname);
 }
 
 /**
 * @covers ComplexityAnalyzer::getMethodDependencies
 */
 public function testGetMethodDependencies()
 {
 $dependencies = $this->object->getMethodDependencies();
 $expectedmethods = array('getClassMethod', 'getMethodSource');
 //print_r($dependencies['getCalledMethods']);
 $this->assertEmpty(array_diff($expectedmethods, $dependencies['getNumberOfParentheses']));
 }
 /**
 * @covers ComplexityAnalyzer::makeToDoList
 */
 public function testMakeToDoList()
 {
 $dependencies = array('a'=>5, 'b'=>10, 'c'=>15);
 $incompletemethods = array('z', 'c', 'a');
 $list = $this->object->makeToDoList($dependencies, $incompletemethods);
 $this->assertEquals($list, array('a', 'c'));
 }
 
 /**
 * @covers ComplexityAnalyzer::getMethodDependencyScores
 */
 public function testGetMethodDependencyScores()
 {
 $ca = new ComplexityAnalyzer('DummyClass', 'DummyClass.php');
 $dependencyScores = $ca->getMethodDependencyScores();
 //print_r($dependencyScores);
 $expected = array(
 'levelOneA'=>1, // 1 paren
 'levelOneB'=>2, // 2 parens
 'levelTwo'=>3,  // 2 parens + levelOneA's score
 'levelThree'=>5 // 2 parens + levelTwo's score
 );
 $this->assertEquals($dependencyScores, $expected);
 
 }
 /**
 * @covers ComplexityAnalyzer::getCompositeScore
 */
 public function testGetCompositeScore()
 {
 $ca = new ComplexityAnalyzer('DummyClass', 'DummyClass.php');
 $dependencies = $ca->getMethodDependencies();
 $score = $ca->getCompositeScore($dependencies, 'levelOneA');
 $this->assertEquals($score, 1);
 $score = $ca->getCompositeScore($dependencies, 'levelTwo');
 $this->assertEquals($score, 3);
 $score = $ca->getCompositeScore($dependencies, 'levelThree');
 $this->assertEquals($score, 5);
 // check on recursion:
 $seen = array('levelThree'=>123);
 $score = $ca->getCompositeScore($dependencies, 'levelThree', $seen);
 $this->assertEquals($score, 123);
 
 }
 
 /**
 * @covers ComplexityAnalyzer::getCalledMethods
 */
 public function testGetCalledMethods()
 {
 $this->object = new ComplexityAnalyzer('DummyClass', 'DummyClass.php');
 $this->testclass = new ReflectionClass('DummyClass');
 $method = $this->getMethod('levelTwo');
 $calledmethods = $this->object->getCalledMethods($method);
 $this->assertEquals($calledmethods, array('levelOneA'));
 }
 
 /**
 * @covers ComplexityAnalyzer::getIncompleteMethods
 */
 public function testGetIncompleteMethods()
 {
 $ca = new ComplexityAnalyzer('DummyClass', 'DummyClass.php');
 $caTest = new ComplexityAnalyzer('DummyClassTest', 'DummyClassTest.php');
 $testmethods = $caTest->getMethods();
 $incompletemethods = $ca->getIncompleteMethods($testmethods, $caTest);
 $expected = array('levelOneA', 'levelOneB', 'levelTwo');
 $this->assertEquals($incompletemethods, $expected);
 }
 
 
 /**
 * @covers ComplexityAnalyzer::getToDoList
 */
 public function testGetToDoList()
 {
 $ca = new ComplexityAnalyzer('DummyClass', 'DummyClass.php');
 $caTest = new ComplexityAnalyzer('DummyClassTest', 'DummyClassTest.php');
 $testmethods = $caTest->getMethods();
 $dependencyScores = $ca->getMethodDependencyScores();
 $expected = array('levelOneA', 'levelOneB', 'levelTwo');
 $todolist = $ca->getToDoList($dependencyScores, $testmethods, $caTest);
 //print_r($todolist);
 $this->assertEquals($todolist, $expected);
 }
 /**
 * retrieves method by name and allows to use it
 * even if it is not public
 * @return a "publicized" ReflectionMethod
 */
 protected function getMethod($name) {
 $method = $this->testclass->getMethod($name);
 $method->setAccessible(true);
 return $method;
 }
 /**
 * retrieves value of class property even if the class
 * property is not public
 * @return a "publicized" property
 */
 protected function getProperty($name) {
 $property = $this->testclass->getProperty($name);
 $property->setAccessible(true);
 return $property->getValue($this->object);
 }
 }
 ?>
 
 |