<?php
/**
 * ezcDocTestConvertXhtmlDocbook
 * 
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *
 * @package Document
 * @version //autogen//
 * @subpackage Tests
 * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
 */

/**
 * Test suite for class.
 * 
 * @package Document
 * @subpackage Tests
 */
abstract class ezcDocumentOptionsTestCase extends ezcTestCase
{
    /**
     * Return class name of options class to test
     * 
     * @return string
     */
    abstract protected function getOptionsClassName();

    /**
     * Return default values for the options
     *
     * Returned array should be in the format:
     *
     * <code>
     *  array(
     *      array(
     *          'optionname',
     *          $value,
     *      ),
     *      ...
     *  )
     * </code>
     * 
     * @return array
     */
    public static function provideDefaultValues()
    {
        return array();
    }

    /**
     * Return valid data for options to test
     *
     * Returned array should be in the format:
     *
     * <code>
     *  array(
     *      array(
     *          'optionname',
     *          array(
     *              'value 1', 'value 2', ...
     *          ),
     *      ),
     *      ...
     *  )
     * </code>
     * 
     * @return array
     */
    public static function provideValidData()
    {
        return array();
    }

    /**
     * Return invalid data for options to test
     *
     * Returned array should be in the format:
     *
     * <code>
     *  array(
     *      array(
     *          'optionname',
     *          array(
     *              'value 1', 'value 2', ...
     *          ),
     *      ),
     *      ...
     *  )
     * </code>
     * 
     * @return array
     */
    public static function provideInvalidData()
    {
        return array();
    }

    /**
     * Test all options provided by the data provider
     * 
     * @dataProvider provideDefaultValues
     */
    public function testOptionsDefaultValues( $property, $value )
    {
        $class = $this->getOptionsClassName();
        $option = new $class();

        if ( is_object( $option->$property ) )
        {
            $this->assertEquals(
                $value,
                $option->$property,
                "Default value in option class '$class' of property '$property' is wrong."
            );
        }
        else
        {
            $this->assertSame(
                $value,
                $option->$property,
                "Default value in option class '$class' of property '$property' is not '$value'."
            );
        }
    }

    /**
     * Test all options provided by the data provider
     * 
     * @dataProvider provideValidData
     */
    public function testOptionsValidValues( $property, $values )
    {
        $class = $this->getOptionsClassName();
        $option = new $class();

        $this->assertSetProperty(
            $option,
            $property,
            $values
        );
    }

    /**
     * Test all options provided by the data provider
     * 
     * @dataProvider provideInvalidData
     */
    public function testOptionsInvalidValues( $property, $values )
    {
        $class = $this->getOptionsClassName();
        $option = new $class();

        $this->assertSetPropertyFails(
            $option,
            $property,
            $values
        );
    }

    public function testUnknownValue()
    {
        $class = $this->getOptionsClassName();
        $option = new $class();

        try
        {
            $option->get_an_not_existing_property;
            $this->fail( 'Expected ezcBasePropertyNotFoundException.' );
        }
        catch ( ezcBasePropertyNotFoundException $e )
        { /* Expected */ }

        try
        {
            $option->get_an_not_existing_property = true;
            $this->fail( 'Expected ezcBasePropertyNotFoundException.' );
        }
        catch ( ezcBasePropertyNotFoundException $e )
        { /* Expected */ }
    }
}

?>