Files
luos/gulliver/system/class.ymlTestCases.php
Ralph Asendeteufrer 5f5388e7b4 CODE STYLE
files modified:   class.form.php
                  class.functionTest.php
                  class.rbac.php
                  class.restClient.php
                  class.ymlTestCases.php
2012-10-18 09:27:23 -04:00

276 lines
10 KiB
PHP
Executable File

<?php
/**
* class.ymlTestCases.php
*
* @package gulliver.system
*
* ProcessMaker Open Source Edition
* Copyright (C) 2004 - 2011 Colosa Inc.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* 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
{
public $testCaseFile;
public $testCases = array ();
/**
* function TestCases
*
* @access public
* @param string $testCaseFile
* @param string $testDomain
* @param string $testLime
* @return void
*/
public 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
*/
public 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
*/
public 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
*/
public 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
*/
public 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
*/
public function runMultiple (&$testerObject, $fields = array(), $count = -1, $start = 0)
{
return $this->run( $testerObject, $fields, $count, $start );
}
}