<?php

// emulates inserting a dir called HTMLPurifier into your class dir
set_include_path(get_include_path() . PATH_SEPARATOR . '../library/');

@include_once '../test-settings.php';

require_once 'HTMLPurifier/ConfigSchema.php';
require_once 'HTMLPurifier/Config.php';
require_once 'HTMLPurifier/Context.php';

$LEXERS = array();
$RUNS = isset($GLOBALS['HTMLPurifierTest']['Runs'])
    ? $GLOBALS['HTMLPurifierTest']['Runs'] : 2; 

require_once 'HTMLPurifier/Lexer/DirectLex.php';
$LEXERS['DirectLex'] = new HTMLPurifier_Lexer_DirectLex();

if (!empty($GLOBALS['HTMLPurifierTest']['PEAR'])) {
    require_once 'HTMLPurifier/Lexer/PEARSax3.php';
    $LEXERS['PEARSax3'] = new HTMLPurifier_Lexer_PEARSax3();
} else {
    exit('PEAR required to perform benchmark.');
}

if (version_compare(PHP_VERSION, '5', '>=')) {
    require_once 'HTMLPurifier/Lexer/DOMLex.php';
    $LEXERS['DOMLex'] = new HTMLPurifier_Lexer_DOMLex();
}

// PEAR
require_once 'Benchmark/Timer.php'; // to do the timing
require_once 'Text/Password.php'; // for generating random input

// custom class to aid unit testing
class RowTimer extends Benchmark_Timer
{
    
    var $name;
    
    function RowTimer($name, $auto = false) {
        $this->name = htmlentities($name);
        $this->Benchmark_Timer($auto);
    }
    
    function getOutput() {

        $total  = $this->TimeElapsed();
        $result = $this->getProfiling();
        $dashes = '';
        
        $out = '<tr>';
        
        $out .= "<td>{$this->name}</td>";
        
        $standard = false;
        
        foreach ($result as $k => $v) {
            if ($v['name'] == 'Start' || $v['name'] == 'Stop') continue;
            
            //$perc = (($v['diff'] * 100) / $total);
            //$tperc = (($v['total'] * 100) / $total);
            
            //$out .= '<td align="right">' . $v['diff'] . '</td>';
            
            if ($standard == false) $standard = $v['diff'];
            
            $perc = $v['diff'] * 100 / $standard;
            $bad_run = ($v['diff'] < 0);
            
            $out .= '<td align="right"'.
                   ($bad_run ? ' style="color:#AAA;"' : '').
                   '>' . number_format($perc, 2, '.', '') .
                   '%</td><td>'.number_format($v['diff'],4,'.','').'</td>';
            
        }
        
        $out .= '</tr>';
        
        return $out;
    }
}

function print_lexers() {
    global $LEXERS;
    $first = true;
    foreach ($LEXERS as $key => $value) {
        if (!$first) echo ' / ';
        echo htmlspecialchars($key);
        $first = false;
    }
}

function do_benchmark($name, $document) {
    global $LEXERS, $RUNS;
    
    $config = HTMLPurifier_Config::createDefault();
    $context = new HTMLPurifier_Context();
    
    $timer = new RowTimer($name);
    $timer->start();
    
    foreach($LEXERS as $key => $lexer) {
        for ($i=0; $i<$RUNS; $i++) $tokens = $lexer->tokenizeHTML($document, $config, $context);
        $timer->setMarker($key);
    }
    
    $timer->stop();
    $timer->display();
}

?>
<html>
<head>
<title>Benchmark: <?php print_lexers(); ?></title>
</head>
<body>
<h1>Benchmark: <?php print_lexers(); ?></h1>
<table border="1">
<tr><th>Case</th><?php
foreach ($LEXERS as $key => $value) {
    echo '<th colspan="2">' . htmlspecialchars($key) . '</th>';
}
?></tr>
<?php

// ************************************************************************** //

// sample of html pages

$dir = 'samples/Lexer';
$dh  = opendir($dir);
while (false !== ($filename = readdir($dh))) {
    
    if (strpos($filename, '.html') !== strlen($filename) - 5) continue;
    $document = file_get_contents($dir . '/' . $filename);
    do_benchmark("File: $filename", $document);
    
}

// crashers, caused infinite loops before

$snippets = array();
$snippets[] = '<a href="foo>';
$snippets[] = '<a "=>';

foreach ($snippets as $snippet) {
    do_benchmark($snippet, $snippet);
}

// random input

$random = Text_Password::create(80, 'unpronounceable', 'qwerty <>="\'');

do_benchmark('Random input', $random);

?></table>

<?php

echo '<div>Random input was: ' .
  '<span colspan="4" style="font-family:monospace;">' .
  htmlspecialchars($random) . '</span></div>';

?>


</body></html>