<?php

set_include_path(get_include_path()
		.PATH_SEPARATOR.realpath(dirname(__FILE__).'/../wp-includes/')
);

require_once 'PHPUnit/Framework.php';

require_once 'plugin.php';

class MockObject_ConstructorNoReference
{
	function MockObject_ConstructorNoReference()
	{
		add_filter('testFilter', array($this, 'hook'));
	}
	
	function hook()
	{
		echo 'Passed!';
	}
}

class MockObject_ConstructorReference
{
	function MockObject_ConstructorReference()
	{
		add_filter('testFilter', array(&$this, 'hook'));
	}
	
	function hook()
	{
		echo 'Passed!';
	}
}

class MockObject
{
	function MockObject()
	{
		
	}
	
	function hook()
	{
		echo 'Passed!';
	}
}

function MockFunction1()
{
	echo 'Passed!';
}

function MockFunction2()
{
	echo 'Passed!';
}

function add_filter_test($tag, $function_to_add, $priority = 10, $accepted_args = 1) {
	global $wp_filter;

	$wp_filter[$tag][$priority][serialize($function_to_add)] = array('function' => $function_to_add, 'accepted_args' => $accepted_args);
	return true;
}
 
class TestPlugin extends PHPUnit_Framework_TestCase
{
    public function testUseCase1()
    {
		// Add first object
		$idx = _wp_filter_build_unique_id('testFilter', array($this, __FUNCTION__));
		
		$this->assertEquals('TestPlugintestUseCase10', $idx);
		
		// Add same object 
		$idx = _wp_filter_build_unique_id('testFilter', array($this, __FUNCTION__));
		
		$this->assertEquals('TestPlugintestUseCase10', $idx);
    }
	
    public function testUseCase2()
    {
		// Add first object
		$idx = _wp_filter_build_unique_id('testFilter', array(&$this, __FUNCTION__));
		$this->assertEquals('TestPlugintestUseCase20', $idx);
		
		// Add same object 
		$idx = _wp_filter_build_unique_id('testFilter', array(&$this, __FUNCTION__));
		$this->assertEquals('TestPlugintestUseCase20', $idx);
    }
 
    public function testUseCase5()
    {
		$idx = _wp_filter_build_unique_id('testFilter', array('MockObject', 'hook'));
		$this->assertEquals('MockObjecthook', $idx);
    }
 
    public function testUseCase6()
    {
		$idx = _wp_filter_build_unique_id('testFilter', 'MockFunction1');
		$this->assertEquals('MockFunction1', $idx);
		
        $idx = _wp_filter_build_unique_id('testFilter', 'MockFunction2');
		$this->assertEquals('MockFunction2', $idx);
    }
	
	public function testOldAddFilterfunction()
	{
		for($i=0; $i<500; ++$i)
		{
			add_filter_test('testFilter', 'MockFunction1');
		}
	}
	
	public function testNewAddFilterFunction()
	{
		for($i=0; $i<500; ++$i)
		{
			add_filter('testFilter', 'MockFunction1');
		}
	}
	
	public function testOldAddFilterFunctionStatic()
	{
		for($i=0; $i<500; ++$i)
		{
			add_filter_test('testFilter', array('MockObject', 'hook'));
		}
	}
	
	public function testNewAddFilterFunctionStatic()
	{
		for($i=0; $i<500; ++$i)
		{
			add_filter('testFilter', array('MockObject', 'hook'));
		}
	}
	
	public function testOldAddFilterFunctionClasses()
	{
		for($i=0; $i<500; ++$i)
		{
			add_filter_test('testFilter', array(&$this, __FUNCTION__));
		}
	}
	
	public function testNewAddFilterFunctionClasses()
	{
		for($i=0; $i<500; ++$i)
		{
			add_filter('testFilter', array(&$this, __FUNCTION__));
		}
	}
	
	public function testOldRemoveFilterFunctionClasses()
	{
		global $wp_filter;
		
		for($i=0; $i<500; $i++)
		{
			$this->testing = $i;
			add_filter_test('testFilter1', array(&$this, __FUNCTION__));
		}
		
		remove_filter('testFilter1', array(&$this, __FUNCTION__));
	}
	
	public function testNewRemoveFilterFunctionClasses()
	{
		for($i=0; $i<500; $i++)
		{
			add_filter('filter2', array(&$this, __FUNCTION__));
		}
		
		$this->assertEquals(1, count($GLOBALS['wp_filter']['filter2'][10]));
		
		remove_filter('filter2', array(&$this, __FUNCTION__));
		
		$this->assertEquals(0, count($GLOBALS['wp_filter']['filter2'][10]));
	}
}