<?php
/**
 *
 * 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.
 *
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
 * @version //autogen//
 * @filesource
 * @package Reflection
 * @subpackage Tests
 * @author Falko Menge <mail@falko-menge.de>
 */

class ezcReflectionObjectTest extends ezcReflectionClassTest
{
    public function setUpFixtures()
    {
        $this->expected = array(
            'SomeClass'
                => new ReflectionObject( new SomeClass() ),
            'TestWebservice'
                => new ReflectionObject( new TestWebservice() ),
            'ReflectionFunction'
                => new ReflectionObject( new ReflectionFunction( 'var_export' ) ),
        );
        $this->class
            = new ezcReflectionObject( new SomeClass() );
        $this->classTestWebservice
            = new ezcReflectionObject( new TestWebservice() );
        $this->classReflectionFunction
            = new ezcReflectionObject( new ReflectionFunction( 'var_export' ) );
    }

    public function testExport() {
        $object = new TestWebservice();
        self::assertEquals( ReflectionObject::export( $object , true ), ezcReflectionObject::export( $object, true ) );
    }

    public static function suite()
    {
         return new PHPUnit_Framework_TestSuite( __CLASS__ );
    }
}
?>
