189 lines
5.0 KiB
PHP
189 lines
5.0 KiB
PHP
<?php
|
|
|
|
// Utility functions used by Behat steps
|
|
|
|
function assertEquals( $expected, $actual ) {
|
|
if ( $expected != $actual ) {
|
|
throw new Exception( "Actual value: " . var_export( $actual, true ) );
|
|
}
|
|
}
|
|
|
|
function assertNumeric( $actual ) {
|
|
if ( !is_numeric( $actual ) ) {
|
|
throw new Exception( "Actual value: " . var_export( $actual, true ) );
|
|
}
|
|
}
|
|
|
|
function assertNotNumeric( $actual ) {
|
|
if ( is_numeric( $actual ) ) {
|
|
throw new Exception( "Actual value: " . var_export( $actual, true ) );
|
|
}
|
|
}
|
|
|
|
function checkString( $output, $expected, $action, $message = false ) {
|
|
switch ( $action ) {
|
|
|
|
case 'be':
|
|
$r = $expected === rtrim( $output, "\n" );
|
|
break;
|
|
|
|
case 'contain':
|
|
$r = false !== strpos( $output, $expected );
|
|
break;
|
|
|
|
case 'not contain':
|
|
$r = false === strpos( $output, $expected );
|
|
break;
|
|
|
|
default:
|
|
throw new Behat\Behat\Exception\PendingException();
|
|
}
|
|
|
|
if ( !$r ) {
|
|
if ( false === $message )
|
|
$message = $output;
|
|
throw new Exception( $message );
|
|
}
|
|
}
|
|
|
|
function compareTables( $expected_rows, $actual_rows, $output ) {
|
|
// the first row is the header and must be present
|
|
if ( $expected_rows[0] != $actual_rows[0] ) {
|
|
throw new \Exception( $output );
|
|
}
|
|
|
|
unset( $actual_rows[0] );
|
|
unset( $expected_rows[0] );
|
|
|
|
$missing_rows = array_diff( $expected_rows, $actual_rows );
|
|
if ( !empty( $missing_rows ) ) {
|
|
throw new \Exception( $output );
|
|
}
|
|
}
|
|
|
|
function compareContents( $expected, $actual ) {
|
|
if ( gettype( $expected ) != gettype( $actual ) ) {
|
|
return false;
|
|
}
|
|
|
|
if ( is_object( $expected ) ) {
|
|
foreach ( get_object_vars( $expected ) as $name => $value ) {
|
|
if ( ! compareContents( $value, $actual->$name ) )
|
|
return false;
|
|
}
|
|
} else if ( is_array( $expected ) ) {
|
|
foreach ( $expected as $key => $value ) {
|
|
if ( ! compareContents( $value, $actual[$key] ) )
|
|
return false;
|
|
}
|
|
} else {
|
|
return $expected === $actual;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Compare two strings containing JSON to ensure that @a $actualJson contains at
|
|
* least what the JSON string @a $expectedJson contains.
|
|
*
|
|
* @return whether or not @a $actualJson contains @a $expectedJson
|
|
* @retval true @a $actualJson contains @a $expectedJson
|
|
* @retval false @a $actualJson does not contain @a $expectedJson
|
|
*
|
|
* @param[in] $actualJson the JSON string to be tested
|
|
* @param[in] $expectedJson the expected JSON string
|
|
*
|
|
* Examples:
|
|
* expected: {'a':1,'array':[1,3,5]}
|
|
*
|
|
* 1 )
|
|
* actual: {'a':1,'b':2,'c':3,'array':[1,2,3,4,5]}
|
|
* return: true
|
|
*
|
|
* 2 )
|
|
* actual: {'b':2,'c':3,'array':[1,2,3,4,5]}
|
|
* return: false
|
|
* element 'a' is missing from the root object
|
|
*
|
|
* 3 )
|
|
* actual: {'a':0,'b':2,'c':3,'array':[1,2,3,4,5]}
|
|
* return: false
|
|
* the value of element 'a' is not 1
|
|
*
|
|
* 4 )
|
|
* actual: {'a':1,'b':2,'c':3,'array':[1,2,4,5]}
|
|
* return: false
|
|
* the contents of 'array' does not include 3
|
|
*/
|
|
function checkThatJsonStringContainsJsonString( $actualJson, $expectedJson ) {
|
|
$actualValue = json_decode( $actualJson );
|
|
$expectedValue = json_decode( $expectedJson );
|
|
|
|
if ( !$actualValue ) {
|
|
return false;
|
|
}
|
|
|
|
return compareContents( $expectedValue, $actualValue );
|
|
}
|
|
|
|
/**
|
|
* Compare two strings to confirm $actualCSV contains $expectedCSV
|
|
* Both strings are expected to have headers for their CSVs.
|
|
* $actualCSV must match all data rows in $expectedCSV
|
|
*
|
|
* @param string A CSV string
|
|
* @param array A nested array of values
|
|
* @return bool Whether $actualCSV contains $expectedCSV
|
|
*/
|
|
function checkThatCsvStringContainsValues( $actualCSV, $expectedCSV ) {
|
|
$actualCSV = array_map( 'str_getcsv', explode( PHP_EOL, $actualCSV ) );
|
|
|
|
if ( empty( $actualCSV ) )
|
|
return false;
|
|
|
|
// Each sample must have headers
|
|
$actualHeaders = array_values( array_shift( $actualCSV ) );
|
|
$expectedHeaders = array_values( array_shift( $expectedCSV ) );
|
|
|
|
// Each expectedCSV must exist somewhere in actualCSV in the proper column
|
|
$expectedResult = 0;
|
|
foreach ( $expectedCSV as $expected_row ) {
|
|
$expected_row = array_combine( $expectedHeaders, $expected_row );
|
|
foreach ( $actualCSV as $actual_row ) {
|
|
|
|
if ( count( $actualHeaders ) != count( $actual_row ) )
|
|
continue;
|
|
|
|
$actual_row = array_intersect_key( array_combine( $actualHeaders, $actual_row ), $expected_row );
|
|
if ( $actual_row == $expected_row )
|
|
$expectedResult++;
|
|
}
|
|
}
|
|
|
|
return $expectedResult >= count( $expectedCSV );
|
|
}
|
|
|
|
/**
|
|
* Compare two strings containing YAML to ensure that @a $actualYaml contains at
|
|
* least what the YAML string @a $expectedYaml contains.
|
|
*
|
|
* @return whether or not @a $actualYaml contains @a $expectedJson
|
|
* @retval true @a $actualYaml contains @a $expectedJson
|
|
* @retval false @a $actualYaml does not contain @a $expectedJson
|
|
*
|
|
* @param[in] $actualYaml the YAML string to be tested
|
|
* @param[in] $expectedYaml the expected YAML string
|
|
*/
|
|
function checkThatYamlStringContainsYamlString( $actualYaml, $expectedYaml ) {
|
|
$actualValue = spyc_load( $actualYaml );
|
|
$expectedValue = spyc_load( $expectedYaml );
|
|
|
|
if ( !$actualValue ) {
|
|
return false;
|
|
}
|
|
|
|
return compareContents( $expectedValue, $actualValue );
|
|
}
|
|
|