<?php

/**
 * All-use harness, use this rather than SimpleTest's
 */
class HTMLPurifier_Harness extends UnitTestCase
{

    public function __construct($name = null)
    {
        parent::__construct($name);
    }

    /**
     * @type HTMLPurifier_Config
     */
    protected $config;

    /**
     * @type HTMLPurifier_Context
     */
    protected $context;

    /**
     * @type HTMLPurifier
     */
    protected $purifier;

    /**
     * Generates easily accessible default config/context, as well as
     * a convenience purifier for integration testing.
     */
    public function setUp()
    {
        list($this->config, $this->context) = $this->createCommon();
        $this->config->set('Output.Newline', '
');
        $this->purifier = new HTMLPurifier();
    }

    /**
     * Asserts a purification. Good for integration testing.
     * @param string $input
     * @param string $expect
     */
    public function assertPurification($input, $expect = null)
    {
        if ($expect === null) {
            $expect = $input;
        }
        $result = $this->purifier->purify($input, $this->config);
        $this->assertIdentical($expect, $result);
    }


    /**
     * Accepts config and context and prepares them into a valid state
     * @param &$config Reference to config variable
     * @param &$context Reference to context variable
     */
    protected function prepareCommon(&$config, &$context)
    {
        $config = HTMLPurifier_Config::create($config);
        if (!$context) {
            $context = new HTMLPurifier_Context();
        }
    }

    /**
     * Generates default configuration and context objects
     * @return Defaults in form of array($config, $context)
     */
    protected function createCommon()
    {
        return array(HTMLPurifier_Config::createDefault(), new HTMLPurifier_Context);
    }

    /**
     * Normalizes a string to Unix (\n) endings
     */
    protected function normalize(&$string)
    {
        $string = str_replace(array("\r\n", "\r"), "\n", $string);
    }

    /**
     * If $expect is false, ignore $result and check if status failed.
     * Otherwise, check if $status if true and $result === $expect.
     * @param $status Boolean status
     * @param $result Mixed result from processing
     * @param $expect Mixed expectation for result
     */
    protected function assertEitherFailOrIdentical($status, $result, $expect)
    {
        if ($expect === false) {
            $this->assertFalse($status, 'Expected false result, got true');
        } else {
            $this->assertTrue($status, 'Expected true result, got false');
            $this->assertIdentical($result, $expect);
        }
    }

    public function getTests()
    {
        // __onlytest makes only one test get triggered
        foreach (get_class_methods(get_class($this)) as $method) {
            if (strtolower(substr($method, 0, 10)) == '__onlytest') {
                $this->reporter->paintSkip('All test methods besides ' . $method);
                return array($method);
            }
        }
        return parent::getTests();
    }

}

// vim: et sw=4 sts=4
