Przeglądaj źródła

refining configuration test generator, now supporting conditions on
tests (i.e. if syntax highlighting is false, highlighting should never
be loaded)

El RIDO 11 lat temu
rodzic
commit
99dbb22e21
3 zmienionych plików z 455 dodań i 189 usunięć
  1. 61 0
      tst/bootstrap.php
  2. 312 157
      tst/configGenerator.php
  3. 82 32
      tst/configuration.php

+ 61 - 0
tst/bootstrap.php

@@ -8,6 +8,12 @@ require PATH . 'lib/auto.php';
 
 class helper
 {
+    /**
+     * delete directory and all its contents recursively
+     *
+     * @param string $path
+     * @throws Exception
+     */
     public static function rmdir($path)
     {
         $path .= DIRECTORY_SEPARATOR;
@@ -28,4 +34,59 @@ class helper
             throw new Exception('Error deleting directory "' . $path . '".');
         }
     }
+
+    /**
+     * create ini file
+     *
+     * @param string $pathToFile
+     * @param array $values
+     */
+    public static function createIniFile($pathToFile, $values)
+    {
+        if (count($values)) {
+            @unlink($pathToFile);
+            $ini = fopen($pathToFile, 'a');
+            foreach ($values as $section => $options) {
+                fwrite($ini, "[$section]" . PHP_EOL);
+                foreach($options as $option => $setting) {
+                    if (is_null($setting)) {
+                        continue;
+                    } elseif (is_string($setting)) {
+                        $setting = '"' . $setting . '"';
+                    } else {
+                        $setting = var_export($setting, true);
+                    }
+                    fwrite($ini, "$option = $setting" . PHP_EOL);
+                }
+                fwrite($ini, PHP_EOL);
+            }
+            fclose($ini);
+        }
+    }
+
+    /**
+     * a var_export that returns arrays without line breaks
+     * by linus@flowingcreativity.net via php.net
+     *
+     * @param mixed $var
+     * @param bool $return
+     * @return void|string
+     */
+    public static function var_export_min($var, $return = false)
+    {
+        if (is_array($var)) {
+            $toImplode = array();
+            foreach ($var as $key => $value) {
+                $toImplode[] = var_export($key, true) . ' => ' . self::var_export_min($value, true);
+            }
+            $code = 'array(' . implode(', ', $toImplode) . ')';
+            if ($return) {
+                return $code;
+            } else {
+                echo $code;
+            }
+        } else {
+            return var_export($var, $return);
+        }
+    }
 }

+ 312 - 157
tst/configGenerator.php

@@ -11,8 +11,7 @@
  */
 
 include 'bootstrap.php';
-
-$options = array(
+new configurationTestGenerator(array(
     'main/opendiscussion' => array(
         array(
             'setting' => true,
@@ -68,7 +67,7 @@ $options = array(
                             ),
                         ),
                         '$content',
-                        'outputs stylesheet correctly',
+                        'outputs prettify stylesheet correctly',
                     ),
                 ), array(
                     'type' => 'Tag',
@@ -81,7 +80,7 @@ $options = array(
                             ),
                         ),
                         '$content',
-                        'outputs javascript correctly',
+                        'outputs prettify javascript correctly',
                     ),
                 ),
             ),
@@ -101,7 +100,7 @@ $options = array(
                             ),
                         ),
                         '$content',
-                        'removes stylesheet correctly',
+                        'removes prettify stylesheet correctly',
                     ),
                 ), array(
                     'type' => 'NotTag',
@@ -114,31 +113,268 @@ $options = array(
                             ),
                         ),
                         '$content',
-                        'removes javascript correctly',
+                        'removes prettify javascript correctly',
                     ),
                 ),
             ),
             'affects' => array('view'),
         ),
     ),
-);
+    'main/syntaxhighlightingtheme' => array(
+        array(
+            'setting' => 'sons-of-obsidian',
+            'tests' => array(
+                array(
+                    'conditions' => array('main/syntaxhighlighting' => true),
+                    'type' => 'Tag',
+                    'args' => array(
+                        array(
+                            'tag' => 'link',
+                            'attributes' => array(
+                                'type' => 'text/css',
+                                'rel' => 'stylesheet',
+                                'href' => 'regexp:#css/prettify/sons-of-obsidian.css#',
+                            ),
+                        ),
+                        '$content',
+                        'outputs prettify theme stylesheet correctly',
+                    ),
+                ),
+                array(
+                    'conditions' => array('main/syntaxhighlighting' => false),
+                    'type' => 'NotTag',
+                    'args' => array(
+                        array(
+                            'tag' => 'link',
+                            'attributes' => array(
+                                'type' => 'text/css',
+                                'rel' => 'stylesheet',
+                                'href' => 'regexp:#css/prettify/sons-of-obsidian.css#',
+                            ),
+                        ),
+                        '$content',
+                        'removes prettify theme stylesheet correctly',
+                    ),
+                ),
+            ),
+            'affects' => array('view'),
+        ), array(
+            'setting' => null, // option not set
+            'tests' => array(
+                array(
+                    'type' => 'NotTag',
+                    'args' => array(
+                        array(
+                            'tag' => 'link',
+                            'attributes' => array(
+                                'type' => 'text/css',
+                                'rel' => 'stylesheet',
+                                'href' => 'regexp:#css/prettify/sons-of-obsidian.css#',
+                            ),
+                        ),
+                        '$content',
+                        'removes prettify theme stylesheet correctly',
+                    ),
+                ),
+            ),
+            'affects' => array('view'),
+        ),
+    ),
+));
+
+class configurationTestGenerator
+{
+    /**
+     * endless loop protection, since we're working with a recursive function,
+     * creating factorial configurations
+     * @var int
+     */
+    const MAX_ITERATIONS = 1000;
+
+    /**
+     * options to test
+     * @var array
+     */
+    private $_options;
+
+    /**
+     * iteration count to guarantee timely end
+     * @var int
+     */
+    private $_iterationCount = 0;
+
+    /**
+     * generated configurations
+     * @var array
+     */
+    private $_configurations = array(
+        array('options' => array(), 'tests' => array(), 'affects' => array())
+    );
+
+    /**
+     * constructor, generates the configuration test
+     * @param array $options
+     */
+    public function __construct($options) {
+        $this->_options = $options;
+        // generate all possible combinations of options: options^settings
+        $this->_generateConfigurations();
+        $this->_writeConfigurationTest();
+    }
 
-// endless loop protection, since we're working with a recursive function, creating factorial configurations
-define('MAX_ITERATIONS', 1000);
+    /**
+     * write configuration test file based on generated configuration array
+     */
+    private function _writeConfigurationTest()
+    {
+        $defaultOptions = parse_ini_file(PATH . 'cfg' . DIRECTORY_SEPARATOR . 'conf.ini', true);
+        $code = $this->_getHeader();
+        foreach ($this->_configurations as $key => $conf) {
+            $fullOptions = array_replace_recursive($defaultOptions, $conf['options']);
+            $options = helper::var_export_min($fullOptions, true);
+            foreach ($conf['affects'] as $step) {
+                $step = ucfirst($step);
+                switch ($step) {
+                    case 'Create':
+                        $code .= <<<EOT
+    /**
+     * @runInSeparateProcess
+     */
+    public function test$step$key()
+    {
+        \$this->reset($options);
+        \$_POST = self::\$paste;
+        \$_SERVER['REMOTE_ADDR'] = '::1';
+        ob_start();
+        new zerobin;
+        \$content = ob_get_contents();
 
-// generate all possible combinations of configurations: (option * settings)!
-$i = 0;
-$configurations = array(array('options' => array(), 'tests' => array(), 'affects' => array()));
-$configurations = getConfigurations($options, $configurations, $i);
+        \$response = json_decode(\$content, true);
+        \$this->assertEquals(\$response['status'], 0, 'outputs status');
+        \$this->assertEquals(
+            \$response['deletetoken'],
+            hash_hmac('sha1', \$response['id'], serversalt::get()),
+            'outputs valid delete token'
+        );
+        \$this->assertTrue(\$this->_model->exists(\$response['id']), 'paste exists after posting data');
 
-$defaultOptions = parse_ini_file(PATH . 'cfg' . DIRECTORY_SEPARATOR . 'conf.ini', true);
 
-$code = <<<'EOT'
+EOT;
+                        break;
+                    case 'Read':
+                        $code .= <<<EOT
+    /**
+     * @runInSeparateProcess
+     */
+    public function test$step$key()
+    {
+        \$this->reset($options);
+        \$this->_model->create(self::\$pasteid, self::\$paste);
+        \$_SERVER['QUERY_STRING'] = self::\$pasteid;
+        ob_start();
+        new zerobin;
+        \$content = ob_get_contents();
+
+        \$this->assertTag(
+            array(
+                'id' => 'cipherdata',
+                'content' => htmlspecialchars(json_encode(self::\$paste), ENT_NOQUOTES)
+            ),
+            \$content,
+            'outputs data correctly'
+        );
+
+
+EOT;
+                        break;
+                    case 'Delete':
+                        $code .= <<<EOT
+    /**
+     * @runInSeparateProcess
+     */
+    public function test$step$key()
+    {
+        \$this->reset($options);
+        \$this->_model->create(self::$\pasteid, self::$\paste);
+        \$this->assertTrue(\$this->_model->exists(self::$\pasteid), 'paste exists before deleting data');
+        \$_GET['pasteid'] = self::$\pasteid;
+        \$_GET['deletetoken'] = hash_hmac('sha1', self::$\pasteid, serversalt::get());
+        ob_start();
+        new zerobin;
+        \$content = ob_get_contents();
+
+        \$this->assertTag(
+            array(
+                'id' => 'status',
+                'content' => 'Paste was properly deleted'
+            ),
+            \$content,
+            'outputs deleted status correctly'
+        );
+        \$this->assertFalse(\$this->_model->exists(self::\$pasteid), 'paste successfully deleted');
+
+
+EOT;
+                        break;
+                    // view
+                    default:
+                        $code .= <<<EOT
+    /**
+     * @runInSeparateProcess
+     */
+    public function test$step$key()
+    {
+        \$this->reset($options);
+        ob_start();
+        new zerobin;
+        \$content = ob_get_contents();
+
+
+EOT;
+                }
+                foreach ($conf['tests'] as $tests) {
+                    foreach ($tests as $test) {
+                        if (array_key_exists('conditions', $test)) {
+                            while(list($path, $setting) = each($test['conditions'])) {
+                                list($section, $option) = explode('/', $path);
+                                if ($fullOptions[$section][$option] !== $setting) {
+                                    continue 2;
+                                }
+                            }
+                        }
+                        $args = array();
+                        foreach ($test['args'] as $arg) {
+                            if (is_string($arg) && strpos($arg, '$') === 0) {
+                                $args[] = $arg;
+                            } else {
+                                $args[] = helper::var_export_min($arg, true);
+                            }
+                        }
+                        $type = $test['type'];
+                        $args = implode(', ', $args);
+                        $code .= "        \$this->assert$type($args);" . PHP_EOL;
+                    }
+                }
+                $code .= '    }' . PHP_EOL . PHP_EOL;
+            }
+        }
+        $code .= '}' . PHP_EOL;
+        file_put_contents('configuration.php', $code);
+    }
+
+    /**
+     * get header of configuration test file
+     *
+     * @return string
+     */
+    private function _getHeader()
+    {
+        return <<<'EOT'
 <?php
 /**
  * DO NOT EDIT: This file is automatically generated by configGenerator.php
  */
-class configTest extends PHPUnit_Framework_TestCase
+class configurationTest extends PHPUnit_Framework_TestCase
 {
     private static $pasteid = '501f02e9eeb8bcec';
 
@@ -179,163 +415,82 @@ class configTest extends PHPUnit_Framework_TestCase
         $_SERVER = array();
         if ($this->_model->exists(self::$pasteid))
             $this->_model->delete(self::$pasteid);
-
-        // generate configuration file
-        if (count($configuration)) {
-            @unlink($this->_conf);
-            $c = fopen($this->_conf, 'a');
-            foreach ($configuration as $section => $options) {
-                fwrite($c, "[$section]" . PHP_EOL);
-                foreach($options as $option => $setting) {
-                    if (is_string($setting)) {
-                        $setting = '"' . $setting . '"';
-                    } else {
-                        $setting = var_export($setting, true);
-                    }
-                    fwrite($c, "$option = $setting" . PHP_EOL);
-                }
-                fwrite($c, PHP_EOL);
-            }
-            fclose($c);
-        }
+        helper::createIniFile($this->_conf, $configuration);
     }
 
 EOT;
+    }
 
-foreach ($configurations as $key => $conf) {
-    $options = var_export_min(array_replace_recursive($defaultOptions, $conf['options']), true);
-    foreach ($conf['affects'] as $step) {
-        $step = ucfirst($step);
-        switch ($step) {
-            case 'Create':
-                // @todo
-                continue;
-                break;
-            case 'Read':
-                // @todo
-                continue;
-                break;
-            case 'Delete':
-                // @todo
-                continue;
-                break;
-            // view
-            default:
-                $code .= <<<EOT
     /**
-     * @runInSeparateProcess
+     * recursive function to generate configurations based on options
+     *
+     * @throws Exception
+     * @return array
      */
-    public function test$step$key()
+    private function _generateConfigurations()
     {
-        \$this->reset($options);
-        ob_start();
-        new zerobin;
-        \$content = ob_get_contents();
-
-
-EOT;
+        // recursive factorial function
+        if (++$this->_iterationCount > self::MAX_ITERATIONS) {
+            echo 'max iterations reached, stopping', PHP_EOL;
+            return $this->_configurations;
         }
+        echo "generateConfigurations: iteration $this->_iterationCount", PHP_EOL;
+        $continue = list($path, $settings) = each($this->_options);
+        if ($continue === false) {
+            return $this->_configurations;
+        }
+        list($section, $option) = explode('/', $path);
+        for ($c = 0, $max = count($this->_configurations); $c < $max; ++$c) {
+            if (!array_key_exists($section, $this->_configurations[$c]['options'])) {
+                $this->_configurations[$c]['options'][$section] = array();
+            }
+            if (count($settings) == 0) {
+                throw new Exception("Check your \$options: option $option has no settings!");
+            }
+            // set the first setting in the original configuration
+            $setting = current($settings);
+            $this->_addSetting($this->_configurations[$c], $setting, $section, $option);
 
-        foreach ($conf['tests'] as $tests) {
-            foreach ($tests as $test) {
-                $args = array();
-                foreach ($test['args'] as $arg) {
-                    if ($arg == '$content') {
-                        $args[] = $arg;
-                    } else {
-                        $args[] = var_export_min($arg, true);
-                    }
-                }
-                $type = $test['type'];
-                $args = implode(', ', $args);
-                $code .= <<<EOT
-        \$this->assert$type($args);
-
-EOT;
+            // create clones for each of the other settings
+            while ($setting = next($settings)) {
+                $clone = $this->_configurations[$c];
+                $this->_configurations[] = $this->_addSetting($clone, $setting, $section, $option);
             }
+            reset($settings);
         }
-        $code .= <<<'EOT'
-    }
-
-
-EOT;
+        return $this->_generateConfigurations();
     }
-}
 
-$code .= '}' . PHP_EOL;
-
-file_put_contents('configuration.php', $code);
-
-// recursive factorial function
-function getConfigurations(&$options, &$configurations, &$i) {
-    if (++$i > MAX_ITERATIONS) {
-        echo "max iterations reached, stopping", PHP_EOL;
-        return $configurations;
-    }
-    echo "getConfigurations: iteration $i", PHP_EOL;
-    $continue = list($path, $settings) = each($options);
-    if ($continue === false) {
-        return $configurations;
-    }
-    list($section, $option) = explode('/', $path);
-    for ($c = 0, $max = count($configurations); $c < $max; ++$c) {
-        if (!array_key_exists($section, $configurations[$c]['options'])) {
-            $configurations[$c]['options'][$section] = array();
+    /**
+     * add a setting to the given configuration
+     *
+     * @param array $configuration
+     * @param array $setting
+     * @param string $section
+     * @param string $option
+     * @throws Exception
+     * @return array
+     */
+    private function _addSetting(&$configuration, &$setting, &$section, &$option) {
+        if (++$this->_iterationCount > self::MAX_ITERATIONS) {
+            echo 'max iterations reached, stopping', PHP_EOL;
+            return $configuration;
         }
-        if (count($settings) == 0) {
-            throw new Exception("Check your \$options: option $option has no settings!");
+        echo "addSetting: iteration $this->_iterationCount", PHP_EOL;
+        if (
+            array_key_exists($option, $configuration['options'][$section]) &&
+            $configuration['options'][$section][$option] === $setting['setting']
+        ) {
+            $val = helper::var_export_min($setting['setting'], true);
+            throw new Exception("Endless loop or error in options detected: option '$option' already exists with setting '$val' in one of the configurations!");
         }
-        // set the first setting in the original configuration
-        $setting = current($settings);
-        addSetting($configurations[$c], $setting, $section, $option, $i);
-
-        // create clones for each of the other settings
-        while ($setting = next($settings)) {
-            $clone = $configurations[$c];
-            $configurations[] = addSetting($clone, $setting, $section, $option, $i);
+        $configuration['options'][$section][$option] = $setting['setting'];
+        $configuration['tests'][$option] = $setting['tests'];
+        foreach ($setting['affects'] as $affects) {
+            if (!in_array($affects, $configuration['affects'])) {
+                $configuration['affects'][] = $affects;
+            }
         }
-        reset($settings);
-    }
-    return getConfigurations($options, $configurations, $i);
-}
-
-function addSetting(&$configuration, &$setting, &$section, &$option, &$i) {
-    if (++$i > MAX_ITERATIONS) {
-        echo "max iterations reached, stopping", PHP_EOL;
         return $configuration;
     }
-    echo "addSetting: iteration $i", PHP_EOL;
-    if (
-        array_key_exists($option, $configuration['options'][$section]) &&
-        $configuration['options'][$section][$option] === $setting['setting']
-    ) {
-        $val = var_export_min($setting['setting'], true);
-        throw new Exception("Endless loop or error in options detected: option '$option' already exists with setting '$val' in one of the configurations!");
-    }
-    $configuration['options'][$section][$option] = $setting['setting'];
-    $configuration['tests'][$option] = $setting['tests'];
-    foreach ($setting['affects'] as $affects) {
-        if (!in_array($affects, $configuration['affects'])) {
-            $configuration['affects'][] = $affects;
-        }
-    }
-    return $configuration;
-}
-
-// by linus@flowingcreativity.net via php.net
-function var_export_min($var, $return = false) {
-    if (is_array($var)) {
-        $toImplode = array();
-        foreach ($var as $key => $value) {
-            $toImplode[] = var_export($key, true).' => '.var_export_min($value, true);
-        }
-        $code = 'array('.implode(', ', $toImplode).')';
-        if ($return) {
-            return $code;
-        } else {
-            echo $code;
-        }
-    } else {
-        return var_export($var, $return);
-    }
 }

+ 82 - 32
tst/configuration.php

@@ -2,7 +2,7 @@
 /**
  * DO NOT EDIT: This file is automatically generated by configGenerator.php
  */
-class configTest extends PHPUnit_Framework_TestCase
+class configurationTest extends PHPUnit_Framework_TestCase
 {
     private static $pasteid = '501f02e9eeb8bcec';
 
@@ -43,39 +43,22 @@ class configTest extends PHPUnit_Framework_TestCase
         $_SERVER = array();
         if ($this->_model->exists(self::$pasteid))
             $this->_model->delete(self::$pasteid);
-
-        // generate configuration file
-        if (count($configuration)) {
-            @unlink($this->_conf);
-            $c = fopen($this->_conf, 'a');
-            foreach ($configuration as $section => $options) {
-                fwrite($c, "[$section]" . PHP_EOL);
-                foreach($options as $option => $setting) {
-                    if (is_string($setting)) {
-                        $setting = '"' . $setting . '"';
-                    } else {
-                        $setting = var_export($setting, true);
-                    }
-                    fwrite($c, "$option = $setting" . PHP_EOL);
-                }
-                fwrite($c, PHP_EOL);
-            }
-            fclose($c);
-        }
+        helper::createIniFile($this->_conf, $configuration);
     }
     /**
      * @runInSeparateProcess
      */
     public function testView0()
     {
-        $this->reset(array('main' => array('opendiscussion' => true, 'syntaxhighlighting' => true, 'burnafterreadingselected' => '', 'sizelimit' => '2097152', 'template' => 'bootstrap', 'base64version' => '2.1.9'), 'expire' => array('default' => '1month'), 'expire_options' => array('5min' => '300', '10min' => '600', '1hour' => '3600', '1day' => '86400', '1week' => '604800', '1month' => '2592000', '1year' => '31536000', 'never' => '0'), 'expire_labels' => array('5min' => '5 minutes', '10min' => '10 minutes', '1hour' => '1 hour', '1day' => '1 day', '1week' => '1 week', '1month' => '1 month', '1year' => '1 year', 'never' => 'Never'), 'traffic' => array('limit' => '10', 'dir' => '../data'), 'model' => array('class' => 'zerobin_data'), 'model_options' => array('dir' => '../data')));
+        $this->reset(array('main' => array('opendiscussion' => true, 'syntaxhighlighting' => true, 'burnafterreadingselected' => '', 'sizelimit' => '2097152', 'template' => 'bootstrap', 'base64version' => '2.1.9', 'syntaxhighlightingtheme' => 'sons-of-obsidian'), 'expire' => array('default' => '1month'), 'expire_options' => array('5min' => '300', '10min' => '600', '1hour' => '3600', '1day' => '86400', '1week' => '604800', '1month' => '2592000', '1year' => '31536000', 'never' => '0'), 'expire_labels' => array('5min' => '5 minutes', '10min' => '10 minutes', '1hour' => '1 hour', '1day' => '1 day', '1week' => '1 week', '1month' => '1 month', '1year' => '1 year', 'never' => 'Never'), 'traffic' => array('limit' => '10', 'dir' => '../data'), 'model' => array('class' => 'zerobin_data'), 'model_options' => array('dir' => '../data')));
         ob_start();
         new zerobin;
         $content = ob_get_contents();
 
         $this->assertNotTag(array('id' => 'opendiscussion', 'attributes' => array('disabled' => 'disabled')), $content, 'outputs enabled discussion correctly');
-        $this->assertTag(array('tag' => 'link', 'attributes' => array('type' => 'text/css', 'rel' => 'stylesheet', 'href' => 'regexp:#css/prettify/prettify.css#')), $content, 'outputs stylesheet correctly');
-        $this->assertTag(array('tag' => 'script', 'attributes' => array('type' => 'text/javascript', 'src' => 'regexp:#js/prettify.js#')), $content, 'outputs javascript correctly');
+        $this->assertTag(array('tag' => 'link', 'attributes' => array('type' => 'text/css', 'rel' => 'stylesheet', 'href' => 'regexp:#css/prettify/prettify.css#')), $content, 'outputs prettify stylesheet correctly');
+        $this->assertTag(array('tag' => 'script', 'attributes' => array('type' => 'text/javascript', 'src' => 'regexp:#js/prettify.js#')), $content, 'outputs prettify javascript correctly');
+        $this->assertTag(array('tag' => 'link', 'attributes' => array('type' => 'text/css', 'rel' => 'stylesheet', 'href' => 'regexp:#css/prettify/sons-of-obsidian.css#')), $content, 'outputs prettify theme stylesheet correctly');
     }
 
     /**
@@ -83,14 +66,15 @@ class configTest extends PHPUnit_Framework_TestCase
      */
     public function testView1()
     {
-        $this->reset(array('main' => array('opendiscussion' => false, 'syntaxhighlighting' => true, 'burnafterreadingselected' => '', 'sizelimit' => '2097152', 'template' => 'bootstrap', 'base64version' => '2.1.9'), 'expire' => array('default' => '1month'), 'expire_options' => array('5min' => '300', '10min' => '600', '1hour' => '3600', '1day' => '86400', '1week' => '604800', '1month' => '2592000', '1year' => '31536000', 'never' => '0'), 'expire_labels' => array('5min' => '5 minutes', '10min' => '10 minutes', '1hour' => '1 hour', '1day' => '1 day', '1week' => '1 week', '1month' => '1 month', '1year' => '1 year', 'never' => 'Never'), 'traffic' => array('limit' => '10', 'dir' => '../data'), 'model' => array('class' => 'zerobin_data'), 'model_options' => array('dir' => '../data')));
+        $this->reset(array('main' => array('opendiscussion' => false, 'syntaxhighlighting' => true, 'burnafterreadingselected' => '', 'sizelimit' => '2097152', 'template' => 'bootstrap', 'base64version' => '2.1.9', 'syntaxhighlightingtheme' => 'sons-of-obsidian'), 'expire' => array('default' => '1month'), 'expire_options' => array('5min' => '300', '10min' => '600', '1hour' => '3600', '1day' => '86400', '1week' => '604800', '1month' => '2592000', '1year' => '31536000', 'never' => '0'), 'expire_labels' => array('5min' => '5 minutes', '10min' => '10 minutes', '1hour' => '1 hour', '1day' => '1 day', '1week' => '1 week', '1month' => '1 month', '1year' => '1 year', 'never' => 'Never'), 'traffic' => array('limit' => '10', 'dir' => '../data'), 'model' => array('class' => 'zerobin_data'), 'model_options' => array('dir' => '../data')));
         ob_start();
         new zerobin;
         $content = ob_get_contents();
 
         $this->assertTag(array('id' => 'opendiscussion', 'attributes' => array('disabled' => 'disabled')), $content, 'outputs disabled discussion correctly');
-        $this->assertTag(array('tag' => 'link', 'attributes' => array('type' => 'text/css', 'rel' => 'stylesheet', 'href' => 'regexp:#css/prettify/prettify.css#')), $content, 'outputs stylesheet correctly');
-        $this->assertTag(array('tag' => 'script', 'attributes' => array('type' => 'text/javascript', 'src' => 'regexp:#js/prettify.js#')), $content, 'outputs javascript correctly');
+        $this->assertTag(array('tag' => 'link', 'attributes' => array('type' => 'text/css', 'rel' => 'stylesheet', 'href' => 'regexp:#css/prettify/prettify.css#')), $content, 'outputs prettify stylesheet correctly');
+        $this->assertTag(array('tag' => 'script', 'attributes' => array('type' => 'text/javascript', 'src' => 'regexp:#js/prettify.js#')), $content, 'outputs prettify javascript correctly');
+        $this->assertTag(array('tag' => 'link', 'attributes' => array('type' => 'text/css', 'rel' => 'stylesheet', 'href' => 'regexp:#css/prettify/sons-of-obsidian.css#')), $content, 'outputs prettify theme stylesheet correctly');
     }
 
     /**
@@ -98,14 +82,15 @@ class configTest extends PHPUnit_Framework_TestCase
      */
     public function testView2()
     {
-        $this->reset(array('main' => array('opendiscussion' => true, 'syntaxhighlighting' => false, 'burnafterreadingselected' => '', 'sizelimit' => '2097152', 'template' => 'bootstrap', 'base64version' => '2.1.9'), 'expire' => array('default' => '1month'), 'expire_options' => array('5min' => '300', '10min' => '600', '1hour' => '3600', '1day' => '86400', '1week' => '604800', '1month' => '2592000', '1year' => '31536000', 'never' => '0'), 'expire_labels' => array('5min' => '5 minutes', '10min' => '10 minutes', '1hour' => '1 hour', '1day' => '1 day', '1week' => '1 week', '1month' => '1 month', '1year' => '1 year', 'never' => 'Never'), 'traffic' => array('limit' => '10', 'dir' => '../data'), 'model' => array('class' => 'zerobin_data'), 'model_options' => array('dir' => '../data')));
+        $this->reset(array('main' => array('opendiscussion' => true, 'syntaxhighlighting' => false, 'burnafterreadingselected' => '', 'sizelimit' => '2097152', 'template' => 'bootstrap', 'base64version' => '2.1.9', 'syntaxhighlightingtheme' => 'sons-of-obsidian'), 'expire' => array('default' => '1month'), 'expire_options' => array('5min' => '300', '10min' => '600', '1hour' => '3600', '1day' => '86400', '1week' => '604800', '1month' => '2592000', '1year' => '31536000', 'never' => '0'), 'expire_labels' => array('5min' => '5 minutes', '10min' => '10 minutes', '1hour' => '1 hour', '1day' => '1 day', '1week' => '1 week', '1month' => '1 month', '1year' => '1 year', 'never' => 'Never'), 'traffic' => array('limit' => '10', 'dir' => '../data'), 'model' => array('class' => 'zerobin_data'), 'model_options' => array('dir' => '../data')));
         ob_start();
         new zerobin;
         $content = ob_get_contents();
 
         $this->assertNotTag(array('id' => 'opendiscussion', 'attributes' => array('disabled' => 'disabled')), $content, 'outputs enabled discussion correctly');
-        $this->assertNotTag(array('tag' => 'link', 'attributes' => array('type' => 'text/css', 'rel' => 'stylesheet', 'href' => 'regexp:#css/prettify/prettify.css#')), $content, 'removes stylesheet correctly');
-        $this->assertNotTag(array('tag' => 'script', 'attributes' => array('type' => 'text/javascript', 'src' => 'regexp:#js/prettify.js#')), $content, 'removes javascript correctly');
+        $this->assertNotTag(array('tag' => 'link', 'attributes' => array('type' => 'text/css', 'rel' => 'stylesheet', 'href' => 'regexp:#css/prettify/prettify.css#')), $content, 'removes prettify stylesheet correctly');
+        $this->assertNotTag(array('tag' => 'script', 'attributes' => array('type' => 'text/javascript', 'src' => 'regexp:#js/prettify.js#')), $content, 'removes prettify javascript correctly');
+        $this->assertNotTag(array('tag' => 'link', 'attributes' => array('type' => 'text/css', 'rel' => 'stylesheet', 'href' => 'regexp:#css/prettify/sons-of-obsidian.css#')), $content, 'removes prettify theme stylesheet correctly');
     }
 
     /**
@@ -113,14 +98,79 @@ class configTest extends PHPUnit_Framework_TestCase
      */
     public function testView3()
     {
-        $this->reset(array('main' => array('opendiscussion' => false, 'syntaxhighlighting' => false, 'burnafterreadingselected' => '', 'sizelimit' => '2097152', 'template' => 'bootstrap', 'base64version' => '2.1.9'), 'expire' => array('default' => '1month'), 'expire_options' => array('5min' => '300', '10min' => '600', '1hour' => '3600', '1day' => '86400', '1week' => '604800', '1month' => '2592000', '1year' => '31536000', 'never' => '0'), 'expire_labels' => array('5min' => '5 minutes', '10min' => '10 minutes', '1hour' => '1 hour', '1day' => '1 day', '1week' => '1 week', '1month' => '1 month', '1year' => '1 year', 'never' => 'Never'), 'traffic' => array('limit' => '10', 'dir' => '../data'), 'model' => array('class' => 'zerobin_data'), 'model_options' => array('dir' => '../data')));
+        $this->reset(array('main' => array('opendiscussion' => false, 'syntaxhighlighting' => false, 'burnafterreadingselected' => '', 'sizelimit' => '2097152', 'template' => 'bootstrap', 'base64version' => '2.1.9', 'syntaxhighlightingtheme' => 'sons-of-obsidian'), 'expire' => array('default' => '1month'), 'expire_options' => array('5min' => '300', '10min' => '600', '1hour' => '3600', '1day' => '86400', '1week' => '604800', '1month' => '2592000', '1year' => '31536000', 'never' => '0'), 'expire_labels' => array('5min' => '5 minutes', '10min' => '10 minutes', '1hour' => '1 hour', '1day' => '1 day', '1week' => '1 week', '1month' => '1 month', '1year' => '1 year', 'never' => 'Never'), 'traffic' => array('limit' => '10', 'dir' => '../data'), 'model' => array('class' => 'zerobin_data'), 'model_options' => array('dir' => '../data')));
+        ob_start();
+        new zerobin;
+        $content = ob_get_contents();
+
+        $this->assertTag(array('id' => 'opendiscussion', 'attributes' => array('disabled' => 'disabled')), $content, 'outputs disabled discussion correctly');
+        $this->assertNotTag(array('tag' => 'link', 'attributes' => array('type' => 'text/css', 'rel' => 'stylesheet', 'href' => 'regexp:#css/prettify/prettify.css#')), $content, 'removes prettify stylesheet correctly');
+        $this->assertNotTag(array('tag' => 'script', 'attributes' => array('type' => 'text/javascript', 'src' => 'regexp:#js/prettify.js#')), $content, 'removes prettify javascript correctly');
+        $this->assertNotTag(array('tag' => 'link', 'attributes' => array('type' => 'text/css', 'rel' => 'stylesheet', 'href' => 'regexp:#css/prettify/sons-of-obsidian.css#')), $content, 'removes prettify theme stylesheet correctly');
+    }
+
+    /**
+     * @runInSeparateProcess
+     */
+    public function testView4()
+    {
+        $this->reset(array('main' => array('opendiscussion' => true, 'syntaxhighlighting' => true, 'burnafterreadingselected' => '', 'sizelimit' => '2097152', 'template' => 'bootstrap', 'base64version' => '2.1.9', 'syntaxhighlightingtheme' => NULL), 'expire' => array('default' => '1month'), 'expire_options' => array('5min' => '300', '10min' => '600', '1hour' => '3600', '1day' => '86400', '1week' => '604800', '1month' => '2592000', '1year' => '31536000', 'never' => '0'), 'expire_labels' => array('5min' => '5 minutes', '10min' => '10 minutes', '1hour' => '1 hour', '1day' => '1 day', '1week' => '1 week', '1month' => '1 month', '1year' => '1 year', 'never' => 'Never'), 'traffic' => array('limit' => '10', 'dir' => '../data'), 'model' => array('class' => 'zerobin_data'), 'model_options' => array('dir' => '../data')));
+        ob_start();
+        new zerobin;
+        $content = ob_get_contents();
+
+        $this->assertNotTag(array('id' => 'opendiscussion', 'attributes' => array('disabled' => 'disabled')), $content, 'outputs enabled discussion correctly');
+        $this->assertTag(array('tag' => 'link', 'attributes' => array('type' => 'text/css', 'rel' => 'stylesheet', 'href' => 'regexp:#css/prettify/prettify.css#')), $content, 'outputs prettify stylesheet correctly');
+        $this->assertTag(array('tag' => 'script', 'attributes' => array('type' => 'text/javascript', 'src' => 'regexp:#js/prettify.js#')), $content, 'outputs prettify javascript correctly');
+        $this->assertNotTag(array('tag' => 'link', 'attributes' => array('type' => 'text/css', 'rel' => 'stylesheet', 'href' => 'regexp:#css/prettify/sons-of-obsidian.css#')), $content, 'removes prettify theme stylesheet correctly');
+    }
+
+    /**
+     * @runInSeparateProcess
+     */
+    public function testView5()
+    {
+        $this->reset(array('main' => array('opendiscussion' => false, 'syntaxhighlighting' => true, 'burnafterreadingselected' => '', 'sizelimit' => '2097152', 'template' => 'bootstrap', 'base64version' => '2.1.9', 'syntaxhighlightingtheme' => NULL), 'expire' => array('default' => '1month'), 'expire_options' => array('5min' => '300', '10min' => '600', '1hour' => '3600', '1day' => '86400', '1week' => '604800', '1month' => '2592000', '1year' => '31536000', 'never' => '0'), 'expire_labels' => array('5min' => '5 minutes', '10min' => '10 minutes', '1hour' => '1 hour', '1day' => '1 day', '1week' => '1 week', '1month' => '1 month', '1year' => '1 year', 'never' => 'Never'), 'traffic' => array('limit' => '10', 'dir' => '../data'), 'model' => array('class' => 'zerobin_data'), 'model_options' => array('dir' => '../data')));
+        ob_start();
+        new zerobin;
+        $content = ob_get_contents();
+
+        $this->assertTag(array('id' => 'opendiscussion', 'attributes' => array('disabled' => 'disabled')), $content, 'outputs disabled discussion correctly');
+        $this->assertTag(array('tag' => 'link', 'attributes' => array('type' => 'text/css', 'rel' => 'stylesheet', 'href' => 'regexp:#css/prettify/prettify.css#')), $content, 'outputs prettify stylesheet correctly');
+        $this->assertTag(array('tag' => 'script', 'attributes' => array('type' => 'text/javascript', 'src' => 'regexp:#js/prettify.js#')), $content, 'outputs prettify javascript correctly');
+        $this->assertNotTag(array('tag' => 'link', 'attributes' => array('type' => 'text/css', 'rel' => 'stylesheet', 'href' => 'regexp:#css/prettify/sons-of-obsidian.css#')), $content, 'removes prettify theme stylesheet correctly');
+    }
+
+    /**
+     * @runInSeparateProcess
+     */
+    public function testView6()
+    {
+        $this->reset(array('main' => array('opendiscussion' => true, 'syntaxhighlighting' => false, 'burnafterreadingselected' => '', 'sizelimit' => '2097152', 'template' => 'bootstrap', 'base64version' => '2.1.9', 'syntaxhighlightingtheme' => NULL), 'expire' => array('default' => '1month'), 'expire_options' => array('5min' => '300', '10min' => '600', '1hour' => '3600', '1day' => '86400', '1week' => '604800', '1month' => '2592000', '1year' => '31536000', 'never' => '0'), 'expire_labels' => array('5min' => '5 minutes', '10min' => '10 minutes', '1hour' => '1 hour', '1day' => '1 day', '1week' => '1 week', '1month' => '1 month', '1year' => '1 year', 'never' => 'Never'), 'traffic' => array('limit' => '10', 'dir' => '../data'), 'model' => array('class' => 'zerobin_data'), 'model_options' => array('dir' => '../data')));
+        ob_start();
+        new zerobin;
+        $content = ob_get_contents();
+
+        $this->assertNotTag(array('id' => 'opendiscussion', 'attributes' => array('disabled' => 'disabled')), $content, 'outputs enabled discussion correctly');
+        $this->assertNotTag(array('tag' => 'link', 'attributes' => array('type' => 'text/css', 'rel' => 'stylesheet', 'href' => 'regexp:#css/prettify/prettify.css#')), $content, 'removes prettify stylesheet correctly');
+        $this->assertNotTag(array('tag' => 'script', 'attributes' => array('type' => 'text/javascript', 'src' => 'regexp:#js/prettify.js#')), $content, 'removes prettify javascript correctly');
+        $this->assertNotTag(array('tag' => 'link', 'attributes' => array('type' => 'text/css', 'rel' => 'stylesheet', 'href' => 'regexp:#css/prettify/sons-of-obsidian.css#')), $content, 'removes prettify theme stylesheet correctly');
+    }
+
+    /**
+     * @runInSeparateProcess
+     */
+    public function testView7()
+    {
+        $this->reset(array('main' => array('opendiscussion' => false, 'syntaxhighlighting' => false, 'burnafterreadingselected' => '', 'sizelimit' => '2097152', 'template' => 'bootstrap', 'base64version' => '2.1.9', 'syntaxhighlightingtheme' => NULL), 'expire' => array('default' => '1month'), 'expire_options' => array('5min' => '300', '10min' => '600', '1hour' => '3600', '1day' => '86400', '1week' => '604800', '1month' => '2592000', '1year' => '31536000', 'never' => '0'), 'expire_labels' => array('5min' => '5 minutes', '10min' => '10 minutes', '1hour' => '1 hour', '1day' => '1 day', '1week' => '1 week', '1month' => '1 month', '1year' => '1 year', 'never' => 'Never'), 'traffic' => array('limit' => '10', 'dir' => '../data'), 'model' => array('class' => 'zerobin_data'), 'model_options' => array('dir' => '../data')));
         ob_start();
         new zerobin;
         $content = ob_get_contents();
 
         $this->assertTag(array('id' => 'opendiscussion', 'attributes' => array('disabled' => 'disabled')), $content, 'outputs disabled discussion correctly');
-        $this->assertNotTag(array('tag' => 'link', 'attributes' => array('type' => 'text/css', 'rel' => 'stylesheet', 'href' => 'regexp:#css/prettify/prettify.css#')), $content, 'removes stylesheet correctly');
-        $this->assertNotTag(array('tag' => 'script', 'attributes' => array('type' => 'text/javascript', 'src' => 'regexp:#js/prettify.js#')), $content, 'removes javascript correctly');
+        $this->assertNotTag(array('tag' => 'link', 'attributes' => array('type' => 'text/css', 'rel' => 'stylesheet', 'href' => 'regexp:#css/prettify/prettify.css#')), $content, 'removes prettify stylesheet correctly');
+        $this->assertNotTag(array('tag' => 'script', 'attributes' => array('type' => 'text/javascript', 'src' => 'regexp:#js/prettify.js#')), $content, 'removes prettify javascript correctly');
+        $this->assertNotTag(array('tag' => 'link', 'attributes' => array('type' => 'text/css', 'rel' => 'stylesheet', 'href' => 'regexp:#css/prettify/sons-of-obsidian.css#')), $content, 'removes prettify theme stylesheet correctly');
     }
 
 }