<?php
 
    // Modify your own mysql connection parameters here
 
    $mysql_host    =  'localhost' ;
 
    $mysql_user    =  'root' ;
 
    $mysql_password =  '' ;
 
    $mysql_database =  'test' ;
 
 
    // Include the variable store class
 
    include ( 'DbVariableStore.class.php' ) ;
 
 
    // Helper functions
 
    function  toboolean ( $value )
 
       { return ( ( $value ) ?  '   yes' : '    no' ) ; } ;
 
 
    function  toverdict ( $value )
 
       { return ( ( $value ) ?  '    ok' : 'failed' ) ; } ;
 
 
    function  formatted_printr ( $value )
 
       {
 
        if  ( is_array ( $value ) ) 
 
            return ( str_replace ( [ "\r", "\n" ], [ '', "\n\t\t" ], print_r ( $value, true ) ) ) ;
 
        else
 
            return ( $value ) ;
 
        }
 
 
    // Variables specific for running the tests either in Apache or CLI mode
 
    if  ( php_sapi_name ( )  == 'cli' )
 
       {
 
        $nl    =  "\n" ;
 
        $tab    =  "\t" ;
 
        }
 
    else
 
       {
 
        $nl    =  "<br/>" ;
 
        $tab    =  "    " ;
 
        }
 
 
 
 
    // Step 1 : Create a variable store named 'testvariables'
 
    echo ( "****** Step 1 : Create the variable store :$nl" ) ;
 
 
    $connection    =  mysqli_connect ( $mysql_host, $mysql_user, $mysql_password, $mysql_database ) ;
 
    mysqli_query ( $connection, "DROP TABLE IF EXISTS testvariables" ) ;
 
 
    $store = new DbVariableStore ( 'testvariables', $connection ) ;
 
    echo ( $tab . toverdict ( $store ) ) ;
 
    echo ( $nl ) ;
 
 
    // Step 2 : Test variable definition/retrieval,with all the possible conversion cases.
 
    // Loop through the following definitions array to :
 
    // 2.1 - Create a variable (given by the 'name' element)  with a value of 'value' and a type of 'type'
 
    //     The result should always be 'ok', except if the variable already exists, which should not be the 
 
    //     case in this run
 
    // 2.2 - Check if the variable is defined (true of false). The result should always be 'ok'.
 
    // 2.3 - Retrieve its value and compare it with the 'expected' value. For example, an initial value of
 
    //     " 3.14159" for a TYPE_INTEGER variable will be stored as "3".
 
    //     The result should always be 'ok'.
 
    // 2.4 - Undefine it and display the status. The result should always be 'ok'.
 
    // 2.5 - Check if it still defined. The result should always be 'no', since the variable has been deleted.
 
    $test_definitions    = 
 
       [
 
           [
 
            'name'        =>  'string.null',
 
            'value'        =>  null,
 
            'type'        =>  DbVariableStore::TYPE_STRING,
 
            'expected'    =>  ''
 
            ],
 
           [
 
            'name'        =>  'string.value',
 
            'value'        =>  'Hello World',
 
            'type'        =>  DbVariableStore::TYPE_STRING,
 
            'expected'    =>  'Hello World'
 
            ],
 
           [
 
            'name'        =>  'integer.value',
 
            'value'        =>  1,
 
            'type'        =>  DbVariableStore::TYPE_INTEGER,
 
            'expected'    =>  1
 
            ],
 
           [
 
            'name'        =>  'integer.strvalue',
 
            'value'        =>  " 1",
 
            'type'        =>  DbVariableStore::TYPE_INTEGER,
 
            'expected'    =>  1
 
            ],
 
           [
 
            'name'        =>  'integer.dblvalue',
 
            'value'        =>  " 3.14159",
 
            'type'        =>  DbVariableStore::TYPE_INTEGER,
 
            'expected'    =>  3
 
            ],
 
           [
 
            'name'        =>  'integer.truevalue',
 
            'value'        =>  true,
 
            'type'        =>  DbVariableStore::TYPE_INTEGER,
 
            'expected'    =>  1
 
            ],
 
           [
 
            'name'        =>  'integer.falsevalue',
 
            'value'        =>  false,
 
            'type'        =>  DbVariableStore::TYPE_INTEGER,
 
            'expected'    =>  0
 
            ],
 
           [
 
            'name'        =>  'dblvalue',
 
            'value'        =>  " 3.14159",
 
            'type'        =>  DbVariableStore::TYPE_DOUBLE,
 
            'expected'    =>  3.14159
 
            ],
 
           [
 
            'name'        =>  'boolean.truevalue',
 
            'value'        =>  "1",
 
            'type'        =>  DbVariableStore::TYPE_BOOLEAN,
 
            'expected'    =>  true
 
            ],
 
           [
 
            'name'        =>  'boolean.falsevalue',
 
            'value'        =>  "0",
 
            'type'        =>  DbVariableStore::TYPE_BOOLEAN,
 
            'expected'    =>  false
 
            ],
 
           [
 
            'name'        =>  'datetime.1',
 
            'value'        =>  "2014/01/01 13:40:00",
 
            'type'        =>  DbVariableStore::TYPE_DATETIME,
 
            'expected'    =>  "2014/01/01 13:40:00"
 
            ],
 
           [
 
            'name'        =>  'datetime.2',
 
            'value'        =>  "now",
 
            'type'        =>  DbVariableStore::TYPE_DATETIME,
 
            'expected'    =>  strtotime ( "now" )            // Failure is ok here when checking the expected string
 
            ],
 
           [                            
 
            'name'        =>  'datetime.3',
 
            'value'        =>  0,
 
            'type'        =>  DbVariableStore::TYPE_DATETIME,
 
            'expected'    =>  "1970/01/01 00:00:00"        // Failure is ok here if different GMT offset
 
            ],
 
           [
 
            'name'        =>  'date.1',
 
            'value'        =>  "2014/01/01",
 
            'type'        =>  DbVariableStore::TYPE_DATE,
 
            'expected'    =>  "2014/01/01"
 
            ],
 
           [
 
            'name'        =>  'time.1',
 
            'value'        =>  "17:40:17",
 
            'type'        =>  DbVariableStore::TYPE_TIME,
 
            'expected'    =>  "17:40:17"
 
            ],
 
           [
 
            'name'        =>  'timestamp',
 
            'value'        =>  "1970/01/01 00:00:00",
 
            'type'        =>  DbVariableStore::TYPE_TIMESTAMP,
 
            'expected'    =>  0                    // Comparison will fail since the original timestamp is a date string
 
            ],
 
           [
 
            'name'        =>  'array',                // This test will generate a notice : "array to string conversion"
 
            'value'        =>  [ 1, 2 ],                // when displaying the results
 
            'type'        =>  DbVariableStore::TYPE_SERIALIZED,
 
            'expected'    =>  [ 1, 2 ]
 
            ],
 
        ] ;
 
 
    echo ( "****** Step 2 : Variable create/check/retrieve/undefine/check :$nl" ) ;
 
    echo ( "$tab" . sprintf ( "%-20s", 'Variable' ) . "  Created?  IsDefined?  IsExpected?  Deleted?  StillDefined?$nl" ) ;
 
    echo ( "$tab--------------------------------------------------------------------------------$nl" ) ;
 
 
    foreach  ( $test_definitions  as  $def )
 
       {
 
        $creation_status    =  $store -> Define ( $def [ 'name' ], $def [ 'value' ], $def [ 'type' ] ) ;
 
        $is_defined        =  $store -> IsDefined ( $def [ 'name' ] ) ;
 
        $value            =  $store -> ValueOf ( $def [ 'name' ] ) ;
 
        $is_expected        =  ( $value  ==  $def [ 'expected' ] ) ;
 
        $deletion_status    =  $store -> Undefine ( $def [ 'name' ] ) ;
 
        $is_still_defined    =  $store -> IsDefined ( $def [ 'name' ] ) ;
 
 
        echo ( "$tab" . sprintf ( "%-20s", $def [ 'name' ] ) . "  " .
 
                "  " . toverdict ( $creation_status ) . "  " .
 
                "    " . toboolean ( $is_defined ) . "  " .
 
                "     " . toverdict ( $is_expected ) . "  " .
 
                "  " . toverdict ( $deletion_status ) . "  " .
 
                "       " . toboolean ( $is_still_defined ) .
 
                $nl ) ;
 
 
        $dvalue = formatted_printr ( $def [ 'value' ] ) ;
 
        $rvalue = formatted_printr ( $value ) ;
 
        echo ( "$tab$tab Defined value   : [$dvalue]$nl" ) ;
 
        echo ( "$tab$tab Retrieved value : [$rvalue]$nl" ) ;
 
        }
 
 
    echo ( $nl ) ;
 
 
 
    // Now just recreate the variables that have been created then undefined during step 2),
 
    // just to have a data set for further testing
 
    foreach  ( $test_definitions  as  $def )
 
        $store -> Define ( $def [ 'name' ], $def [ 'value' ], $def [ 'type' ] ) ;
 
 
    // Step 3 -
 
    //    Display variable count and variable list
 
    echo ( "****** Step 3 : Display variable count and variable list :$nl" ) ;
 
    echo ( "{$tab}Number of variables defined in step 2) : " . count ( $store ) . $nl ) ;
 
    echo ( "{$tab}Variable list                          : " . implode ( ', ', $store -> GetNames ( ) ) . $nl ) ;
 
    echo ( $nl ) ;
 
 
    // Step 4 : display the list of defined variables together with their value.
 
    // You will see a warning because the variable named 'array' is... an array
 
    echo ( "****** Step 4 : Display variable names and values :$nl" ) ;
 
 
    foreach  ( $store  as  $name => $value )
 
       {
 
        $value    =  formatted_printr ( $value ) ;
 
        echo ( $tab . sprintf ( "%-20s", $name ) . " : $value$nl" ) ;
 
        }
 
  
 
    echo ( $nl ) ;
 
 
    // Step 5 -
 
    //    Loop through variables by their integer index.
 
    echo ( "****** Step 5 : Loop through variables using their integer index :$nl" ) ;
 
    $count    =  count ( $store ) ;
 
    $vnames =  $store -> GetNames ( ) ;
 
 
    for (  $i = 0 ; $i  <  $count ; $i ++ )
 
       {
 
        $value    =  formatted_printr ( $store [$i] ) ;
 
        echo ( $tab . sprintf ( "%-20s", $vnames [$i] ) . " : $value$nl" ) ;
 
        }
 
     
 
    echo ( $nl ) ;
 
 
 
    // Step 6 -
 
    //    Loop through variables by their variable name.
 
    echo ( "****** Step 6 : Loop through variables using their name :$nl" ) ;
 
 
    foreach  ( $vnames  as  $vname )
 
       {
 
        $value    =  formatted_printr ( $store [ $vname ] ) ;
 
        echo ( $tab . sprintf ( "%-20s", $vname ) . " : $value$nl" ) ;
 
        }
 
     
 
    echo ( $nl ) ;
 
 
    // Step 7 :
 
    //    Create the variable named 'zz' accessing it as a property
 
    echo ( "****** Step 7 : Create a variable named 'zz' by accessing it as a property :$nl" ) ;
 
    $store [ 'zz' ]        =  'the zz value' ;
 
    $vnames =  $store -> GetNames ( ) ;
 
 
    foreach  ( $vnames  as  $vname )
 
       {
 
        $value    =  formatted_printr ( $store [ $vname ] ) ;
 
        echo ( $tab . sprintf ( "%-20s", $vname ) . " : $value$nl" ) ;
 
        }
 
 |