. * * For more information, contact Colosa Inc, 2566 Le Jeune Rd., * Coral Gables, FL, 33134, USA, or email info@colosa.com. * */ /* Dependencies: class.ymlDomain.php; class.testTools.php * +----------------------------+ * | STRUCTURE for ymlTestFile. | * +----------------------------+ * TestCasesGroup1: * - Un caso de prueba. * Input: * FIELD_A: "Value_Field_A" * FIELD_B[]: "Domain_Field_A" * Output: * Type: "TypeOfResult" Type of data that should be the result. * Value: "a:0{}" This node must contain a value that will be serialized compared with the test result. * - Another test case. * ... * TestCasesGroup2: * ... */ /** * @package gulliver.system */ class ymlTestCases { var $testCaseFile; var $testCases=array(); /** * function TestCases * * @access public * @param string $testCaseFile * @param string $testDomain * @param string $testLime * @return void */ function ymlTestCases( $testCaseFile, &$testDomain, &$testLime ) { $this->testDomain =& $testDomain; $this->testLime =& $testLime; if (basename($testCaseFile)===$testCaseFile) $testCaseFile = PATH_FIXTURES . $testCaseFile; $this->testCaseFile=$testCaseFile; } /** * function load * * @access public * @param string $inputTestCasesIndex * @param array $fields * @return array */ function load( $inputTestCasesIndex = 'TestCases', $fields=array() ) { $testCases=array(); $input = sfYAML::Load( /*PATH_FIXTURES .*/ $this->testCaseFile ); foreach($input[$inputTestCasesIndex] as $preTestCase){ $testFunctionInputs=array(); foreach($preTestCase['Input'] as $inputArgument => $value ){ if (substr($inputArgument,-2,2)==='[]'){ //DOMAIN $inputArgument=substr($inputArgument,0,strlen($inputArgument)-2); if (!isset($testFunctionInputs[$inputArgument])) $testFunctionInputs[$inputArgument]=array(); //var_dump($this->testDomain->global,$this->testDomain->get( $value ), $value ); ymlDomain::arrayAppend( $testFunctionInputs[$inputArgument], $this->testDomain->get( $value ) ); } else{ //SPECIFIC VALUE if (!isset($testFunctionInputs[$inputArgument])){ $testFunctionInputs[$inputArgument]=array(); } ymlDomain::arrayAppend( $testFunctionInputs[$inputArgument], array($value) ); } } /* Start Block: "Explode" all the posible test cases defined in the yml * using domains and single values */ //Initialize $index key values for the first test case (5.2 array_fill_keys(array_keys($testFunctionInputs),0)) $index=array_combine(array_keys($testFunctionInputs),array_fill(0,count($testFunctionInputs),0)); //array_product() $prod=1; foreach($testFunctionInputs as $values) $prod*=count($values); $lastCase=($prod==0); while(!$lastCase){ //foreach($index as $v) echo($v);echo("\n"); /* Put in $aux one test case */ $aux=array(); foreach($testFunctionInputs as $key => $values){ $aux[$key]=$values[$index[$key]]; } /* CREATE TEST CASE: Put $aux test case in $testCases array */ $i=count($testCases); $testCases[$i] = $preTestCase; $testCases[$i]['Input']=$aux; /* Increse the $index key values to the next test case */ $lastCase=true; foreach($testFunctionInputs as $key => $values){ $index[$key]++; if ($index[$key]>=count($values)){ $index[$key]=0; } else{ $lastCase=false; break; } } } /*End Block */ } /* Start Block: Replace @@ tags variables */ foreach($testCases as $key => $testCase){ $testCases[$key]=testTools::replaceVariables( $testCases[$key] ); $testCases[$key]['Input']=testTools::replaceVariables( $testCases[$key]['Input'], $fields ); if (isset($testCase['Output'])){ if (isset($testCase['Output']['Value'])) { /*$testCases[$key]['Output']['Value'] = unserialize($testCases[$key]['Output']['Value']);*/ } } } /* End Block */ $this->testCases = $testCases; return $testCases; } /** * function load * Increase the number of "planned" tests. * @access public * @param int $count * @param int $start * @return void */ function addToPlan( $count=-1, $start=0 ) { foreach($this->testCases as $testCase){ if (($start==0) && ($count!=0)){ if (isset($testCase['TODO'])){ $this->testLime->plan++; } else{ if(isset($testCase['Output'])){ if ( isset($testCase['Output']['Type']) || isset($testCase['Output']['Value']) ) $this->testLime->plan++; } } } else{ $start--; if ($count>0) $count--; } } } /** * function run * @access public * @param object $testerObject * @param array $fields * @param int $count * @param int $start * @return array */ function run( &$testerObject, $fields=array(), $count=-1, $start=0 ) { $results=array(); //$this->addToPlan( $count, $start ); $functions=get_class_methods( get_class($testerObject) ); foreach($functions as $id=>$fn) $functions[$id]=strtolower($fn); foreach($this->testCases as $index => $testCase){ if (($start==0) && ($count!=0)){ if (isset($testCase['TODO'])){ $this->testLime->todo($testCase['TODO']); } else{ if (isset($testCase['Function'])){ if (array_search(strtolower($testCase['Function']),$functions)!==FALSE){ $testCase['Input'] = G::array_merges( $testCase['Input'] , $fields ); $result = eval('return $testerObject->'.$testCase['Function'].'($testCase, $testCase["Input"]);'); $results[]=$result; /* Start Block: Test the $result */ if (isset($testCase['Output'])){ if (isset($testCase['Output']['Value'])){ //$this->testLime->is( $result, $testCase['Output']['Value'], $testCase['Title'] ); $this->testLime->todo( ($testCase['Output']['Type']) ); $this->testLime->diag("/processmaker/trunk/gulliver/system/class.ymlTestCases.php at line 204"); } elseif (isset($testCase['Output']['Type'])){ // $this->testLime->isa_ok( $result, $testCase['Output']['Type'], $testCase['Title'] ); $this->testLime->todo( ($testCase['Output']['Type']) ); $this->testLime->diag("/processmaker/trunk/gulliver/system/class.ymlTestCases.php at line 204"); } } /* End Block */ } else{ $this->testLime->fail( 'Case #'.$index.': Test function (Function) is not present in tester object.' ); } } else{ $this->testLime->fail( 'Case #'.$index.' doesn\'t have a test function (Function) defined.' ); } } } else{ $start--; if ($count>0) $count--; } } return $results; } /** * function runSingle * @access public * @param object $testerObject * @param array $fields * @return array */ function runSingle( &$testerObject, $fields=array() ) { $results = $this->run( $testerObject, $fields, 1, 0 ); return $results[0]; } /** * function runMultiple * @access public * @param object $testerObject * @param array $fields * @param int $count * @param int $start * @return array */ function runMultiple( &$testerObject, $fields=array(), $count = -1, $start=0) { return $this->run( $testerObject, $fields, $count, $start ); } }