Index: tests/t3lib/matchcondition/t3lib_matchcondition_frontend_testcase.php
===================================================================
--- tests/t3lib/matchcondition/t3lib_matchcondition_frontend_testcase.php	(Revision 0)
+++ tests/t3lib/matchcondition/t3lib_matchcondition_frontend_testcase.php	(Revision 0)
@@ -0,0 +1,596 @@
+<?php
+/***************************************************************
+*  Copyright notice
+*
+*  (c) 2009 Oliver Hader <oliver@typo3.org>
+*  All rights reserved
+*
+*  This script is part of the TYPO3 project. The TYPO3 project is
+*  free software; you can redistribute it and/or modify
+*  it under the terms of the GNU General Public License as published by
+*  the Free Software Foundation; either version 2 of the License, or
+*  (at your option) any later version.
+*
+*  The GNU General Public License can be found at
+*  http://www.gnu.org/copyleft/gpl.html.
+*
+*  This script is distributed in the hope that it will be useful,
+*  but WITHOUT ANY WARRANTY; without even the implied warranty of
+*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+*  GNU General Public License for more details.
+*
+*  This copyright notice MUST APPEAR in all copies of the script!
+***************************************************************/
+
+
+/**
+ * Testcase for class t3lib_matchCondition_frontend.
+ *
+ * @author	Oliver Hader <oliver@typo3.org>
+ * @package TYPO3
+ * @subpackage t3lib
+ */
+class t3lib_matchCondition_frontend_testcase extends tx_phpunit_testcase {
+	/**
+	 * @var	array
+	 */
+	private $backupGlobalVariables;
+
+	/**
+	 * @var	array
+	 */
+	private $rootline;
+
+	/**
+	 * @var	t3lib_matchCondition
+	 */
+	private $matchCondition;
+
+	public function setUp() {
+		$this->backupGlobalVariables = array(
+			'_ENV' => $_ENV,
+			'_GET' => $_GET,
+			'_POST' => $_POST,
+			'_SERVER' => $_SERVER,
+			'TYPO3_CONF_VARS' => $GLOBALS['TYPO3_CONF_VARS'],
+			'T3_VAR' => $GLOBALS['T3_VAR'],
+		);
+
+		$this->testGlobalNamespace = uniqid('TEST');
+		$GLOBALS[$this->testGlobalNamespace] = array();
+
+		$this->setUpTSFE();
+		$this->matchCondition = t3lib_div::makeInstance('t3lib_matchCondition_frontend');
+	}
+
+	public function tearDown() {
+		foreach ($this->backupGlobalVariables as $key => $data) {
+			$GLOBALS[$key] = $data;
+		}
+
+		unset($this->matchCondition);
+		unset($this->backupGlobalVariables);
+		unset($GLOBALS[$this->testGlobalNamespace]);
+	}
+
+	private function setUpTSFE() {
+		$this->rootline = array(
+			2 => array('uid' => 121, 'pid' => 111),
+			1 => array('uid' => 111, 'pid' => 101,),
+			0 => array('uid' => 101, 'pid' => 0,),
+		);
+
+		$GLOBALS['TSFE'] = $this->getMock('tslib_fe', array(), array(), '', FALSE);
+		$GLOBALS['TSFE']->tmpl = $this->getMock('t3lib_TStemplate');
+	}
+
+	/**
+	 * Tests whether a faulty expression fails.
+	 * @test
+	 */
+	public function simulateDisabledMatchAllConditionsFailsOnFaultyExpression() {
+		$this->matchCondition->matchAll = false;
+		$this->assertFalse($this->matchCondition->match('[nullCondition = This expression would return false in general]'));
+	}
+
+	/**
+	 * Tests whether simulating positive matches for all conditions succeeds.
+	 * @test
+	 */
+	public function simulateEnabledMatchAllConditionsSucceeds() {
+		$this->matchCondition->setSimulateMatchResult(true);
+		$this->assertTrue($this->matchCondition->match('[nullCondition = This expression would return false in general]'));
+	}
+
+	/**
+	 * Tests whether simulating positive matches for specific conditions succeeds.
+	 * @test
+	 */
+	public function simulateEnabledMatchSpecificConditionsSucceeds() {
+		$testCondition = '[' . uniqid('test') . ' = Any condition to simulate a positive match]';
+		$this->matchCondition->setSimulateMatchConditions(array($testCondition));
+		$this->assertTrue($this->matchCondition->match($testCondition));
+	}
+
+	/**
+	 * Tests whether a condition matches Internet Explorer 7 on Windows.
+	 *
+	 * @return	void
+	 * @test
+	 */
+	public function conditionMatchesInternetExplorer7Windows() {
+		$_SERVER['HTTP_USER_AGENT'] = 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)';
+		$result = $this->matchCondition->match('[browser = msie] && [version = 7] && [system = winNT]');
+		$this->assertTrue($result);
+	}
+
+	/**
+	 * Tests whether a condition does not match Internet Explorer 7 on Windows.
+	 *
+	 * @return	void
+	 * @test
+	 */
+	public function conditionDoesNotMatchInternetExplorer7Windows() {
+		$_SERVER['HTTP_USER_AGENT'] = 'Opera/9.25 (Windows NT 6.0; U; en)';
+		$result = $this->matchCondition->match('[browser = msie] && [version = 7] && [system = winNT]');
+		$this->assertFalse($result);
+	}
+
+	/**
+	 * Tests whether a device type condition matches a crawler.
+	 * @test
+	 */
+	public function deviceConditionMatchesRobot() {
+		$_SERVER['HTTP_USER_AGENT'] = 'Googlebot/2.1 (+http://www.google.com/bot.html)';
+		$result = $this->matchCondition->match('[device = robot]');
+		$this->assertTrue($result);
+	}
+
+	/**
+	 * Tests whether a device type condition does not match a crawler.
+	 * @test
+	 */
+	public function deviceConditionDoesNotMatchRobot() {
+		$_SERVER['HTTP_USER_AGENT'] = md5('Some strange user agent');
+		$result = $this->matchCondition->match('[device = robot]');
+		$this->assertFalse($result);
+	}
+
+	/**
+	 * Tests whether the browserInfo hook is called.
+	 *
+	 * @return	void
+	 * @test
+	 */
+	public function deprecatedBrowserInfoHookIsCalled() {
+		$classRef = uniqid('tx_browserInfoHook');
+		$browserInfoHookMock = $this->getMock($classRef, array('browserInfo'));
+		$browserInfoHookMock->expects($this->atLeastOnce())->method('browserInfo');
+
+		$GLOBALS['T3_VAR']['getUserObj'][$classRef] = $browserInfoHookMock;
+		$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_matchcondition.php']['matchConditionClass'][$classRef] = $classRef;
+
+		$this->matchCondition->__construct();
+		$this->matchCondition->match('[browser = msie] && [version = 7] && [system = winNT]');
+	}
+
+	/**
+	 * Tests whether the whichDevice hook is called.
+	 *
+	 * @return	void
+	 * @test
+	 */
+	public function deprecatedWhichDeviceHookIsCalled() {
+		$classRef = uniqid('tx_whichDeviceHook');
+		$whichDeviceHookMock = $this->getMock($classRef, array('whichDevice'));
+		$whichDeviceHookMock->expects($this->atLeastOnce())->method('whichDevice');
+
+		$GLOBALS['T3_VAR']['getUserObj'][$classRef] = $whichDeviceHookMock;
+		$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_matchcondition.php']['matchConditionClass'][$classRef] = $classRef;
+
+		$this->matchCondition->__construct();
+		$this->matchCondition->match('[device = robot]');
+	}
+
+	/**
+	 * Tests whether the language comparison matches.
+	 * @test
+	 */
+	public function languageConditionMatchesSingleLanguageExpression() {
+		$_SERVER['HTTP_ACCEPT_LANGUAGE'] = 'de-de,de;q=0.8,en-us;q=0.5,en;q=0.3';
+		$this->assertTrue($this->matchCondition->match('[language = *de*]'));
+		$this->assertTrue($this->matchCondition->match('[language = *de-de*]'));
+	}
+
+	/**
+	 * Tests whether the language comparison matches.
+	 * @test
+	 */
+	public function languageConditionMatchesMultipleLanguagesExpression() {
+		$_SERVER['HTTP_ACCEPT_LANGUAGE'] = 'de-de,de;q=0.8,en-us;q=0.5,en;q=0.3';
+		$this->assertTrue($this->matchCondition->match('[language = *en*,*de*]'));
+		$this->assertTrue($this->matchCondition->match('[language = *en-us*,*de-de*]'));
+	}
+
+	/**
+	 * Tests whether the language comparison matches.
+	 * @test
+	 */
+	public function languageConditionMatchesCompleteLanguagesExpression() {
+		$this->markTestSkipped('This comparison seems to be incomplete in t3lib_matchCondition.');
+
+		$_SERVER['HTTP_ACCEPT_LANGUAGE'] = 'de-de,de;q=0.8,en-us;q=0.5,en;q=0.3';
+		$this->assertTrue($this->matchCondition->match('[language = de-de,de;q=0.8]'));
+	}
+
+	/**
+	 * Tests whether usergroup comparison matches.
+	 * @test
+	 */
+	public function usergroupConditionMatchesSingleGroupId() {
+		$GLOBALS['TSFE']->gr_list = '13,14,15';
+		$this->assertTrue($this->matchCondition->match('[usergroup = 13]'));
+	}
+
+	/**
+	 * Tests whether usergroup comparison matches.
+	 * @test
+	 */
+	public function usergroupConditionMatchesMultipleUserGroupId() {
+		$GLOBALS['TSFE']->gr_list = '13,14,15';
+		$this->assertTrue($this->matchCondition->match('[usergroup = 999,15,14,13]'));
+	}
+
+	/**
+	 * Tests whether usergroup comparison matches.
+	 * @test
+	 */
+	public function usergroupConditionDoesNotMatchDefaulUserGroupIds() {
+		$GLOBALS['TSFE']->gr_list = '0,-1';
+		$this->assertFalse($this->matchCondition->match('[usergroup = 0,-1]'));
+	}
+
+	/**
+	 * Tests whether user comparison matches.
+	 * @test
+	 */
+	public function loginUserConditionMatchesAnyLoggedInUser() {
+		$GLOBALS['TSFE']->loginUser = TRUE;
+		$GLOBALS['TSFE']->fe_user->user['uid'] = 13;
+		$this->assertTrue($this->matchCondition->match('[loginUser = *]'));
+	}
+
+	/**
+	 * Tests whether user comparison matches.
+	 * @test
+	 */
+	public function loginUserConditionMatchesSingleLoggedInUser() {
+		$GLOBALS['TSFE']->loginUser = TRUE;
+		$GLOBALS['TSFE']->fe_user->user['uid'] = 13;
+		$this->assertTrue($this->matchCondition->match('[loginUser = 13]'));
+	}
+
+	/**
+	 * Tests whether user comparison matches.
+	 * @test
+	 */
+	public function loginUserConditionMatchesMultipleLoggedInUsers() {
+		$GLOBALS['TSFE']->loginUser = TRUE;
+		$GLOBALS['TSFE']->fe_user->user['uid'] = 13;
+		$this->assertTrue($this->matchCondition->match('[loginUser = 999,13]'));
+	}
+
+	/**
+	 * Tests whether user comparison matches.
+	 * @test
+	 */
+	public function loginUserConditionDoesNotMatchIfNotUserIsLoggedId() {
+		$GLOBALS['TSFE']->loginUser = FALSE;
+		$GLOBALS['TSFE']->fe_user->user['uid'] = 13;
+		$this->assertFalse($this->matchCondition->match('[loginUser = *]'));
+		$this->assertFalse($this->matchCondition->match('[loginUser = 13]'));
+	}
+
+	/**
+	 * Tests whether numerical comparison matches.
+	 * @test
+	 */
+	public function globalVarConditionMatchesOnEqualExpression() {
+		$this->assertTrue($this->matchCondition->match('[globalVar = LIT:10 = 10]'));
+		$this->assertTrue($this->matchCondition->match('[globalVar = LIT:10.1 = 10.1]'));
+
+		$this->assertTrue($this->matchCondition->match('[globalVar = LIT:10 == 10]'));
+		$this->assertTrue($this->matchCondition->match('[globalVar = LIT:10.1 == 10.1]'));
+	}
+
+	/**
+	 * Tests whether numerical comparison matches.
+	 * @test
+	 */
+	public function globalVarConditionMatchesOnNotEqualExpression() {
+		$this->assertTrue($this->matchCondition->match('[globalVar = LIT:10 != 20]'));
+		$this->assertTrue($this->matchCondition->match('[globalVar = LIT:10.1 != 10.2]'));
+	}
+
+	/**
+	 * Tests whether numerical comparison matches.
+	 * @test
+	 */
+	public function globalVarConditionMatchesOnLowerThanExpression() {
+		$this->assertTrue($this->matchCondition->match('[globalVar = LIT:10 < 20]'));
+		$this->assertTrue($this->matchCondition->match('[globalVar = LIT:10.1 < 10.2]'));
+	}
+
+	/**
+	 * Tests whether numerical comparison matches.
+	 * @test
+	 */
+	public function globalVarConditionMatchesOnLowerThanOrEqualExpression() {
+		$this->assertTrue($this->matchCondition->match('[globalVar = LIT:10 <= 10]'));
+		$this->assertTrue($this->matchCondition->match('[globalVar = LIT:10 <= 20]'));
+
+		$this->assertTrue($this->matchCondition->match('[globalVar = LIT:10.1 <= 10.1]'));
+		$this->assertTrue($this->matchCondition->match('[globalVar = LIT:10.1 <= 10.2]'));
+	}
+
+	/**
+	 * Tests whether numerical comparison matches.
+	 * @test
+	 */
+	public function globalVarConditionMatchesOnGreaterThanExpression() {
+		$this->assertTrue($this->matchCondition->match('[globalVar = LIT:20 > 10]'));
+		$this->assertTrue($this->matchCondition->match('[globalVar = LIT:10.2 > 10.1]'));
+	}
+
+	/**
+	 * Tests whether numerical comparison matches.
+	 * @test
+	 */
+	public function globalVarConditionMatchesOnGreaterThanOrEqualExpression() {
+		$this->assertTrue($this->matchCondition->match('[globalVar = LIT:10 >= 10]'));
+		$this->assertTrue($this->matchCondition->match('[globalVar = LIT:20 >= 10]'));
+
+		$this->assertTrue($this->matchCondition->match('[globalVar = LIT:10.1 >= 10.1]'));
+		$this->assertTrue($this->matchCondition->match('[globalVar = LIT:10.2 >= 10.1]'));
+	}
+
+	/**
+	 * Tests whether string comparison matches.
+	 * @test
+	 */
+	public function globalStringConditionMatchesOnEqualExpression() {
+		$this->assertTrue($this->matchCondition->match('[globalString = LIT:TYPO3.Test.Condition = TYPO3.Test.Condition]'));
+		$this->assertFalse($this->matchCondition->match('[globalString = LIT:TYPO3.Test.Condition = TYPO3]'));
+	}
+
+	/**
+	 * Tests whether string comparison matches.
+	 * @test
+	 */
+	public function globalStringConditionMatchesWildcardExpression() {
+		$this->assertTrue($this->matchCondition->match('[globalString = LIT:TYPO3.Test.Condition = TYPO3?Test?Condition]'));
+		$this->assertTrue($this->matchCondition->match('[globalString = LIT:TYPO3.Test.Condition = TYPO3.T*t.Condition]'));
+		$this->assertTrue($this->matchCondition->match('[globalString = LIT:TYPO3.Test.Condition = TYPO3?T*t?Condition]'));
+	}
+
+	/**
+	 * Tests whether string comparison matches.
+	 * @test
+	 */
+	public function globalStringConditionMatchesRegularExpression() {
+		$this->assertTrue($this->matchCondition->match('[globalString = LIT:TYPO3.Test.Condition = /^[A-Za-z3.]+$/]'));
+		$this->assertTrue($this->matchCondition->match('[globalString = LIT:TYPO3.Test.Condition = /^TYPO3\..+Condition$/]'));
+		$this->assertFalse($this->matchCondition->match('[globalString = LIT:TYPO3.Test.Condition = /^FALSE/]'));
+	}
+
+	/**
+	 * Tests whether string comparison matches.
+	 * @test
+	 */
+	public function globalStringConditionMatchesEmptyRegularExpression() {
+		$testKey = uniqid('test');
+		$_SERVER[$testKey] = '';
+		$this->assertTrue($this->matchCondition->match('[globalString = _SERVER|' . $testKey . ' = /^$/]'));
+	}
+
+	/**
+	 * Tests whether treeLevel comparison matches.
+	 * @test
+	 */
+	public function treeLevelConditionMatchesSingleValue() {
+		$GLOBALS['TSFE']->tmpl->rootLine = $this->rootline;
+		$this->assertTrue($this->matchCondition->match('[treeLevel = 2]'));
+	}
+
+	/**
+	 * Tests whether treeLevel comparison matches.
+	 * @test
+	 */
+	public function treeLevelConditionMatchesMultipleValues() {
+		$GLOBALS['TSFE']->tmpl->rootLine = $this->rootline;
+		$this->assertTrue($this->matchCondition->match('[treeLevel = 999,998,2]'));
+	}
+
+	/**
+	 * Tests whether treeLevel comparison matches.
+	 * @test
+	 */
+	public function treeLevelConditionDoesNotMatchFaultyValue() {
+		$GLOBALS['TSFE']->tmpl->rootLine = $this->rootline;
+		$this->assertFalse($this->matchCondition->match('[treeLevel = 999]'));
+	}
+
+	/**
+	 * Tests whether a page Id is found in the previous rootline entries.
+	 * @test
+	 */
+	public function PIDupinRootlineConditionMatchesSinglePageIdInRootline() {
+		$GLOBALS['TSFE']->tmpl->rootLine = $this->rootline;
+		$GLOBALS['TSFE']->id = 121;
+		$this->assertTrue($this->matchCondition->match('[PIDupinRootline = 111]'));
+	}
+
+	/**
+	 * Tests whether a page Id is found in the previous rootline entries.
+	 * @test
+	 */
+	public function PIDupinRootlineConditionMatchesMultiplePageIdsInRootline() {
+		$GLOBALS['TSFE']->tmpl->rootLine = $this->rootline;
+		$GLOBALS['TSFE']->id = 121;
+		$this->assertTrue($this->matchCondition->match('[PIDupinRootline = 999,111,101]'));
+	}
+
+	/**
+	 * Tests whether a page Id is found in the previous rootline entries.
+	 * @test
+	 */
+	public function PIDupinRootlineConditionDoesNotMatchPageIdNotInRootline() {
+		$GLOBALS['TSFE']->tmpl->rootLine = $this->rootline;
+		$GLOBALS['TSFE']->id = 121;
+		$this->assertFalse($this->matchCondition->match('[PIDupinRootline = 999]'));
+	}
+
+	/**
+	 * Tests whether a page Id is found in the previous rootline entries.
+	 * @test
+	 */
+	public function PIDupinRootlineConditionDoesNotMatchLastPageIdInRootline() {
+		$GLOBALS['TSFE']->tmpl->rootLine = $this->rootline;
+		$GLOBALS['TSFE']->id = 121;
+		$this->assertFalse($this->matchCondition->match('[PIDupinRootline = 121]'));
+	}
+
+	/**
+	 * Tests whether a page Id is found in all rootline entries.
+	 * @test
+	 */
+	public function PIDinRootlineConditionMatchesSinglePageIdInRootline() {
+		$GLOBALS['TSFE']->tmpl->rootLine = $this->rootline;
+		$GLOBALS['TSFE']->id = 121;
+		$this->assertTrue($this->matchCondition->match('[PIDinRootline = 111]'));
+	}
+
+	/**
+	 * Tests whether a page Id is found in all rootline entries.
+	 * @test
+	 */
+	public function PIDinRootlineConditionMatchesMultiplePageIdsInRootline() {
+		$GLOBALS['TSFE']->tmpl->rootLine = $this->rootline;
+		$GLOBALS['TSFE']->id = 121;
+		$this->assertTrue($this->matchCondition->match('[PIDinRootline = 999,111,101]'));
+	}
+
+	/**
+	 * Tests whether a page Id is found in all rootline entries.
+	 * @test
+	 */
+	public function PIDinRootlineConditionMatchesLastPageIdInRootline() {
+		$GLOBALS['TSFE']->tmpl->rootLine = $this->rootline;
+		$GLOBALS['TSFE']->id = 121;
+		$this->assertTrue($this->matchCondition->match('[PIDinRootline = 121]'));
+	}
+
+	/**
+	 * Tests whether a page Id is found in all rootline entries.
+	 * @test
+	 */
+	public function PIDinRootlineConditionDoesNotMatchPageIdNotInRootline() {
+		$GLOBALS['TSFE']->tmpl->rootLine = $this->rootline;
+		$GLOBALS['TSFE']->id = 121;
+		$this->assertFalse($this->matchCondition->match('[PIDinRootline = 999]'));
+	}
+
+	/**
+	 * Tests whether the compatibility version can be evaluated.
+	 * (e.g. 4.9 is compatible to 4.0 but not to 5.0)
+	 * @test
+	 */
+	public function compatVersionConditionMatchesOlderRelease() {
+		$GLOBALS['TYPO3_CONF_VARS']['SYS']['compat_version'] = '4.9';
+		$this->assertTrue($this->matchCondition->match('[compatVersion = 4.0]'));
+	}
+
+	/**
+	 * Tests whether the compatibility version can be evaluated.
+	 * (e.g. 4.9 is compatible to 4.0 but not to 5.0)
+	 * @test
+	 */
+	public function compatVersionConditionMatchesSameRelease() {
+		$GLOBALS['TYPO3_CONF_VARS']['SYS']['compat_version'] = '4.9';
+		$this->assertTrue($this->matchCondition->match('[compatVersion = 4.9]'));
+	}
+
+	/**
+	 * Tests whether the compatibility version can be evaluated.
+	 * (e.g. 4.9 is compatible to 4.0 but not to 5.0)
+	 * @test
+	 */
+	public function compatVersionConditionDoesNotMatchNewerRelease() {
+		$GLOBALS['TYPO3_CONF_VARS']['SYS']['compat_version'] = '4.9';
+		$this->assertFalse($this->matchCondition->match('[compatVersion = 5.0]'));
+	}
+
+	/**
+	 * Tests whether the generic fetching of variables works with the namespace 'GP'.
+	 * @test
+	 */
+	public function genericGetVariablesSucceedsWithNamespaceGP() {
+		$_GET = array('testGet' => 'getTest');
+		$_POST = array('testPost' => 'postTest');
+
+		$this->assertTrue($this->matchCondition->match('[globalString = GP:testGet = getTest]'));
+		$this->assertTrue($this->matchCondition->match('[globalString = GP:testPost = postTest]'));
+	}
+
+	/**
+	 * Tests whether the generic fetching of variables works with the namespace 'TSFE'.
+	 * @test
+	 */
+	public function genericGetVariablesSucceedsWithNamespaceTSFE() {
+		$GLOBALS['TSFE']->id = 1234567;
+		$GLOBALS['TSFE']->testSimpleObject = new stdClass();
+		$GLOBALS['TSFE']->testSimpleObject->testSimpleVariable = 'testValue';
+
+		$this->assertTrue($this->matchCondition->match('[globalString = TSFE:id = 1234567]'));
+		$this->assertTrue($this->matchCondition->match('[globalString = TSFE:testSimpleObject|testSimpleVariable = testValue]'));
+	}
+
+	/**
+	 * Tests whether the generic fetching of variables works with the namespace 'ENV'.
+	 * @test
+	 */
+	public function genericGetVariablesSucceedsWithNamespaceENV() {
+		$testKey = uniqid('test');
+		putenv($testKey .'=testValue');
+
+		$this->assertTrue($this->matchCondition->match('[globalString = ENV:' . $testKey . ' = testValue]'));
+	}
+
+	/**
+	 * Tests whether the generic fetching of variables works with the namespace 'IENV'.
+	 * @test
+	 */
+	public function genericGetVariablesSucceedsWithNamespaceIENV() {
+		$_SERVER['HTTP_HOST'] = t3lib_div::getIndpEnv('TYPO3_HOST_ONLY') . ':1234567';
+		$this->assertTrue($this->matchCondition->match('[globalString = IENV:TYPO3_PORT = 1234567]'));
+	}
+
+	/**
+	 * Tests whether the generic fetching of variables works with any global namespace.
+	 * @test
+	 */
+	public function genericGetVariablesSucceedsWithAnyGlobalNamespace() {
+		$GLOBALS[$this->testGlobalNamespace] = array(
+			'first' => 'testFirst',
+			'second' => array('third' => 'testThird'),
+		);
+
+		$this->assertTrue($this->matchCondition->match(
+			'[globalString = ' . $this->testGlobalNamespace . '|first = testFirst]'
+		));
+		$this->assertTrue($this->matchCondition->match(
+			'[globalString = ' . $this->testGlobalNamespace . '|second|third = testThird]'
+		));
+	}
+}
+?>
\ No newline at end of file
Index: tests/t3lib/matchcondition/t3lib_matchcondition_backend_testcase.php
===================================================================
--- tests/t3lib/matchcondition/t3lib_matchcondition_backend_testcase.php	(Revision 0)
+++ tests/t3lib/matchcondition/t3lib_matchcondition_backend_testcase.php	(Revision 0)
@@ -0,0 +1,792 @@
+<?php
+/***************************************************************
+*  Copyright notice
+*
+*  (c) 2009 Oliver Hader <oliver@typo3.org>
+*  All rights reserved
+*
+*  This script is part of the TYPO3 project. The TYPO3 project is
+*  free software; you can redistribute it and/or modify
+*  it under the terms of the GNU General Public License as published by
+*  the Free Software Foundation; either version 2 of the License, or
+*  (at your option) any later version.
+*
+*  The GNU General Public License can be found at
+*  http://www.gnu.org/copyleft/gpl.html.
+*
+*  This script is distributed in the hope that it will be useful,
+*  but WITHOUT ANY WARRANTY; without even the implied warranty of
+*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+*  GNU General Public License for more details.
+*
+*  This copyright notice MUST APPEAR in all copies of the script!
+***************************************************************/
+
+
+/**
+ * Testcase for class t3lib_matchCondition_frontend.
+ *
+ * @author	Oliver Hader <oliver@typo3.org>
+ * @package TYPO3
+ * @subpackage t3lib
+ */
+class t3lib_matchCondition_backend_testcase extends tx_phpunit_testcase {
+	/**
+	 * @var	array
+	 */
+	private $backupGlobalVariables;
+
+	/**
+	 * @var	array
+	 */
+	private $rootline;
+
+	/**
+	 * @var	t3lib_matchCondition_backend
+	 */
+	private $matchCondition;
+
+	/**
+	 * @var	string
+	 */
+	private $testTableName;
+
+	public function setUp() {
+		$this->backupGlobalVariables = array(
+			'_ENV' => $_ENV,
+			'_GET' => $_GET,
+			'_POST' => $_POST,
+			'_SERVER' => $_SERVER,
+			'TCA' => $GLOBALS['TCA'],
+			'TYPO3_DB' => $GLOBALS['TYPO3_DB'],
+			'TYPO3_CONF_VARS' => $GLOBALS['TYPO3_CONF_VARS'],
+			'T3_VAR' => $GLOBALS['T3_VAR'],
+			'BE_USER' => $GLOBALS['BE_USER'],
+			'SOBE' => $GLOBALS['SOBE'],
+		);
+
+		$this->testTableName = 't3lib_matchCondition_backend_testTable';
+		$this->testGlobalNamespace = uniqid('TEST');
+
+		$GLOBALS['TCA'][$this->testTableName] = array('ctrl' => array());
+		$GLOBALS[$this->testGlobalNamespace] = array();
+
+		$this->setUpBackend();
+
+		$this->matchCondition = t3lib_div::makeInstance('t3lib_matchCondition_backend');
+	}
+
+	public function tearDown() {
+		foreach ($this->backupGlobalVariables as $key => $data) {
+			$GLOBALS[$key] = $data;
+		}
+
+		unset($this->matchCondition);
+		unset($this->backupGlobalVariables);
+		unset($GLOBALS[$this->testGlobalNamespace]);
+	}
+
+	private function setUpBackend() {
+		$this->rootline = array(
+			2 => array('uid' => 121, 'pid' => 111),
+			1 => array('uid' => 111, 'pid' => 101,),
+			0 => array('uid' => 101, 'pid' => 0,),
+		);
+
+		$GLOBALS['BE_USER'] = $this->getMock('beUserAuth', array(), array(), '', FALSE);
+	}
+
+	private function setUpDatabaseMockForDeterminePageId() {
+		$GLOBALS['TYPO3_DB'] = $this->getMock('t3lib_DB', array('exec_SELECTquery', 'sql_fetch_assoc', 'sql_free_result'));
+		$GLOBALS['TYPO3_DB']->expects($this->any())->method('exec_SELECTquery')->will(
+			$this->returnCallback(array($this, 'determinePageIdByRecordDatabaseExecuteCallback'))
+		);
+		$GLOBALS['TYPO3_DB']->expects($this->any())->method('sql_fetch_assoc')->will(
+			$this->returnCallback(array($this, 'determinePageIdByRecordDatabaseFetchCallback'))
+		);
+	}
+
+	/**
+	 * Tests whether a faulty expression fails.
+	 * @test
+	 */
+	public function simulateDisabledMatchAllConditionsFailsOnFaultyExpression() {
+		$this->matchCondition->matchAll = false;
+		$this->assertFalse($this->matchCondition->match('[nullCondition = This expression would return false in general]'));
+	}
+
+	/**
+	 * Tests whether simulating positive matches for all conditions succeeds.
+	 * @test
+	 */
+	public function simulateEnabledMatchAllConditionsSucceeds() {
+		$this->matchCondition->setSimulateMatchResult(true);
+		$this->assertTrue($this->matchCondition->match('[nullCondition = This expression would return false in general]'));
+	}
+
+	/**
+	 * Tests whether simulating positive matches for specific conditions succeeds.
+	 * @test
+	 */
+	public function simulateEnabledMatchSpecificConditionsSucceeds() {
+		$testCondition = '[' . uniqid('test') . ' = Any condition to simulate a positive match]';
+		$this->matchCondition->setSimulateMatchConditions(array($testCondition));
+		$this->assertTrue($this->matchCondition->match($testCondition));
+	}
+
+	/**
+	 * Tests whether a condition matches Internet Explorer 7 on Windows.
+	 *
+	 * @return	void
+	 * @test
+	 */
+	public function conditionMatchesInternetExplorer7Windows() {
+		$_SERVER['HTTP_USER_AGENT'] = 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)';
+		$result = $this->matchCondition->match('[browser = msie] && [version = 7] && [system = winNT]');
+		$this->assertTrue($result);
+	}
+
+	/**
+	 * Tests whether a condition does not match Internet Explorer 7 on Windows.
+	 *
+	 * @return	void
+	 * @test
+	 */
+	public function conditionDoesNotMatchInternetExplorer7Windows() {
+		$_SERVER['HTTP_USER_AGENT'] = 'Opera/9.25 (Windows NT 6.0; U; en)';
+		$result = $this->matchCondition->match('[browser = msie] && [version = 7] && [system = winNT]');
+		$this->assertFalse($result);
+	}
+
+	/**
+	 * Tests whether a device type condition matches a crawler.
+	 * @test
+	 */
+	public function deviceConditionMatchesRobot() {
+		$_SERVER['HTTP_USER_AGENT'] = 'Googlebot/2.1 (+http://www.google.com/bot.html)';
+		$result = $this->matchCondition->match('[device = robot]');
+		$this->assertTrue($result);
+	}
+
+	/**
+	 * Tests whether a device type condition does not match a crawler.
+	 * @test
+	 */
+	public function deviceConditionDoesNotMatchRobot() {
+		$_SERVER['HTTP_USER_AGENT'] = md5('Some strange user agent');
+		$result = $this->matchCondition->match('[device = robot]');
+		$this->assertFalse($result);
+	}
+
+	/**
+	 * Tests whether the language comparison matches.
+	 * @test
+	 */
+	public function languageConditionMatchesSingleLanguageExpression() {
+		$_SERVER['HTTP_ACCEPT_LANGUAGE'] = 'de-de,de;q=0.8,en-us;q=0.5,en;q=0.3';
+		$this->assertTrue($this->matchCondition->match('[language = *de*]'));
+		$this->assertTrue($this->matchCondition->match('[language = *de-de*]'));
+	}
+
+	/**
+	 * Tests whether the language comparison matches.
+	 * @test
+	 */
+	public function languageConditionMatchesMultipleLanguagesExpression() {
+		$_SERVER['HTTP_ACCEPT_LANGUAGE'] = 'de-de,de;q=0.8,en-us;q=0.5,en;q=0.3';
+		$this->assertTrue($this->matchCondition->match('[language = *en*,*de*]'));
+		$this->assertTrue($this->matchCondition->match('[language = *en-us*,*de-de*]'));
+	}
+
+	/**
+	 * Tests whether the language comparison matches.
+	 * @test
+	 */
+	public function languageConditionMatchesCompleteLanguagesExpression() {
+		$this->markTestSkipped('This comparison seems to be incomplete in t3lib_matchCondition.');
+
+		$_SERVER['HTTP_ACCEPT_LANGUAGE'] = 'de-de,de;q=0.8,en-us;q=0.5,en;q=0.3';
+		$this->assertTrue($this->matchCondition->match('[language = de-de,de;q=0.8]'));
+	}
+
+	/**
+	 * Tests whether usergroup comparison matches.
+	 * @test
+	 */
+	public function usergroupConditionMatchesSingleGroupId() {
+		$GLOBALS['BE_USER']->groupList = '13,14,15';
+		$this->assertTrue($this->matchCondition->match('[usergroup = 13]'));
+	}
+
+	/**
+	 * Tests whether usergroup comparison matches.
+	 * @test
+	 */
+	public function usergroupConditionMatchesMultipleUserGroupId() {
+		$GLOBALS['BE_USER']->groupList = '13,14,15';
+		$this->assertTrue($this->matchCondition->match('[usergroup = 999,15,14,13]'));
+	}
+
+	/**
+	 * Tests whether user comparison matches.
+	 * @test
+	 */
+	public function loginUserConditionMatchesAnyLoggedInUser() {
+		$GLOBALS['BE_USER']->user['uid'] = 13;
+		$this->assertTrue($this->matchCondition->match('[loginUser = *]'));
+	}
+
+	/**
+	 * Tests whether user comparison matches.
+	 * @test
+	 */
+	public function loginUserConditionMatchesSingleLoggedInUser() {
+		$GLOBALS['BE_USER']->user['uid'] = 13;
+		$this->assertTrue($this->matchCondition->match('[loginUser = 13]'));
+	}
+
+	/**
+	 * Tests whether user comparison matches.
+	 * @test
+	 */
+	public function loginUserConditionDoesNotMatchSingleLoggedInUser() {
+		$GLOBALS['BE_USER']->user['uid'] = 13;
+		$this->assertFalse($this->matchCondition->match('[loginUser = 999]'));
+	}
+
+	/**
+	 * Tests whether user comparison matches.
+	 * @test
+	 */
+	public function loginUserConditionMatchesMultipleLoggedInUsers() {
+		$GLOBALS['BE_USER']->user['uid'] = 13;
+		$this->assertTrue($this->matchCondition->match('[loginUser = 999,13]'));
+	}
+
+	/**
+	 * Tests whether checkinf for an admin user matches
+	 * @test
+	 */
+	public function adminUserConditionMatchesAdminUser() {
+		$GLOBALS['BE_USER']->user['uid'] = 13;
+		$GLOBALS['BE_USER']->user['admin'] = 1;
+		$this->assertTrue($this->matchCondition->match('[adminUser = 1]'));
+	}
+
+	/**
+	 * Tests whether checkinf for an admin user matches
+	 * @test
+	 */
+	public function adminUserConditionMatchesRegularUser() {
+		$GLOBALS['BE_USER']->user['uid'] = 14;
+		$GLOBALS['BE_USER']->user['admin'] = 0;
+		$this->assertTrue($this->matchCondition->match('[adminUser = 0]'));
+	}
+
+	/**
+	 * Tests whether checkinf for an admin user matches
+	 * @test
+	 */
+	public function adminUserConditionDoesNotMatchRegularUser() {
+		$GLOBALS['BE_USER']->user['uid'] = 14;
+		$GLOBALS['BE_USER']->user['admin'] = 0;
+		$this->assertFalse($this->matchCondition->match('[adminUser = 1]'));
+	}
+
+	/**
+	 * Tests whether numerical comparison matches.
+	 * @test
+	 */
+	public function globalVarConditionMatchesOnEqualExpression() {
+		$this->assertTrue($this->matchCondition->match('[globalVar = LIT:10 = 10]'));
+		$this->assertTrue($this->matchCondition->match('[globalVar = LIT:10.1 = 10.1]'));
+
+		$this->assertTrue($this->matchCondition->match('[globalVar = LIT:10 == 10]'));
+		$this->assertTrue($this->matchCondition->match('[globalVar = LIT:10.1 == 10.1]'));
+	}
+
+	/**
+	 * Tests whether numerical comparison matches.
+	 * @test
+	 */
+	public function globalVarConditionMatchesOnNotEqualExpression() {
+		$this->assertTrue($this->matchCondition->match('[globalVar = LIT:10 != 20]'));
+		$this->assertTrue($this->matchCondition->match('[globalVar = LIT:10.1 != 10.2]'));
+	}
+
+	/**
+	 * Tests whether numerical comparison matches.
+	 * @test
+	 */
+	public function globalVarConditionMatchesOnLowerThanExpression() {
+		$this->assertTrue($this->matchCondition->match('[globalVar = LIT:10 < 20]'));
+		$this->assertTrue($this->matchCondition->match('[globalVar = LIT:10.1 < 10.2]'));
+	}
+
+	/**
+	 * Tests whether numerical comparison matches.
+	 * @test
+	 */
+	public function globalVarConditionMatchesOnLowerThanOrEqualExpression() {
+		$this->assertTrue($this->matchCondition->match('[globalVar = LIT:10 <= 10]'));
+		$this->assertTrue($this->matchCondition->match('[globalVar = LIT:10 <= 20]'));
+
+		$this->assertTrue($this->matchCondition->match('[globalVar = LIT:10.1 <= 10.1]'));
+		$this->assertTrue($this->matchCondition->match('[globalVar = LIT:10.1 <= 10.2]'));
+	}
+
+	/**
+	 * Tests whether numerical comparison matches.
+	 * @test
+	 */
+	public function globalVarConditionMatchesOnGreaterThanExpression() {
+		$this->assertTrue($this->matchCondition->match('[globalVar = LIT:20 > 10]'));
+		$this->assertTrue($this->matchCondition->match('[globalVar = LIT:10.2 > 10.1]'));
+	}
+
+	/**
+	 * Tests whether numerical comparison matches.
+	 * @test
+	 */
+	public function globalVarConditionMatchesOnGreaterThanOrEqualExpression() {
+		$this->assertTrue($this->matchCondition->match('[globalVar = LIT:10 >= 10]'));
+		$this->assertTrue($this->matchCondition->match('[globalVar = LIT:20 >= 10]'));
+
+		$this->assertTrue($this->matchCondition->match('[globalVar = LIT:10.1 >= 10.1]'));
+		$this->assertTrue($this->matchCondition->match('[globalVar = LIT:10.2 >= 10.1]'));
+	}
+
+	/**
+	 * Tests whether string comparison matches.
+	 * @test
+	 */
+	public function globalStringConditionMatchesOnEqualExpression() {
+		$this->assertTrue($this->matchCondition->match('[globalString = LIT:TYPO3.Test.Condition = TYPO3.Test.Condition]'));
+		$this->assertFalse($this->matchCondition->match('[globalString = LIT:TYPO3.Test.Condition = TYPO3]'));
+	}
+
+	/**
+	 * Tests whether string comparison matches.
+	 * @test
+	 */
+	public function globalStringConditionMatchesWildcardExpression() {
+		$this->assertTrue($this->matchCondition->match('[globalString = LIT:TYPO3.Test.Condition = TYPO3?Test?Condition]'));
+		$this->assertTrue($this->matchCondition->match('[globalString = LIT:TYPO3.Test.Condition = TYPO3.T*t.Condition]'));
+		$this->assertTrue($this->matchCondition->match('[globalString = LIT:TYPO3.Test.Condition = TYPO3?T*t?Condition]'));
+	}
+
+	/**
+	 * Tests whether string comparison matches.
+	 * @test
+	 */
+	public function globalStringConditionMatchesRegularExpression() {
+		$this->assertTrue($this->matchCondition->match('[globalString = LIT:TYPO3.Test.Condition = /^[A-Za-z3.]+$/]'));
+		$this->assertTrue($this->matchCondition->match('[globalString = LIT:TYPO3.Test.Condition = /^TYPO3\..+Condition$/]'));
+		$this->assertFalse($this->matchCondition->match('[globalString = LIT:TYPO3.Test.Condition = /^FALSE/]'));
+	}
+
+	/**
+	 * Tests whether string comparison matches.
+	 * @test
+	 */
+	public function globalStringConditionMatchesEmptyRegularExpression() {
+		$testKey = uniqid('test');
+		$_SERVER[$testKey] = '';
+		$this->assertTrue($this->matchCondition->match('[globalString = _SERVER|' . $testKey . ' = /^$/]'));
+	}
+
+	/**
+	 * Tests whether treeLevel comparison matches.
+	 * @test
+	 */
+	public function treeLevelConditionMatchesSingleValue() {
+		$this->matchCondition->setRootline($this->rootline);
+		$this->assertTrue($this->matchCondition->match('[treeLevel = 2]'));
+	}
+
+	/**
+	 * Tests whether treeLevel comparison matches.
+	 * @test
+	 */
+	public function treeLevelConditionMatchesMultipleValues() {
+		$this->matchCondition->setRootline($this->rootline);
+		$this->assertTrue($this->matchCondition->match('[treeLevel = 999,998,2]'));
+	}
+
+	/**
+	 * Tests whether treeLevel comparison matches.
+	 * @test
+	 */
+	public function treeLevelConditionDoesNotMatchFaultyValue() {
+		$this->matchCondition->setRootline($this->rootline);
+		$this->assertFalse($this->matchCondition->match('[treeLevel = 999]'));
+	}
+
+	/**
+	 * Tests whether a page Id is found in the previous rootline entries.
+	 * @test
+	 */
+	public function PIDupinRootlineConditionMatchesSinglePageIdInRootline() {
+		$this->matchCondition->setRootline($this->rootline);
+		$this->matchCondition->setPageId(121);
+		$this->assertTrue($this->matchCondition->match('[PIDupinRootline = 111]'));
+	}
+
+	/**
+	 * Tests whether a page Id is found in the previous rootline entries.
+	 * @test
+	 */
+	public function PIDupinRootlineConditionMatchesMultiplePageIdsInRootline() {
+		$this->matchCondition->setRootline($this->rootline);
+		$this->matchCondition->setPageId(121);
+		$this->assertTrue($this->matchCondition->match('[PIDupinRootline = 999,111,101]'));
+	}
+
+	/**
+	 * Tests whether a page Id is found in the previous rootline entries.
+	 * @test
+	 */
+	public function PIDupinRootlineConditionDoesNotMatchPageIdNotInRootline() {
+		$this->matchCondition->setRootline($this->rootline);
+		$this->matchCondition->setPageId(121);
+		$this->assertFalse($this->matchCondition->match('[PIDupinRootline = 999]'));
+	}
+
+	/**
+	 * Tests whether a page Id is found in the previous rootline entries.
+	 * @test
+	 */
+	public function PIDupinRootlineConditionDoesNotMatchLastPageIdInRootline() {
+		$this->matchCondition->setRootline($this->rootline);
+		$this->matchCondition->setPageId(121);
+		$this->assertFalse($this->matchCondition->match('[PIDupinRootline = 121]'));
+	}
+
+	/**
+	 * Tests whether a page Id is found in the previous rootline entries.
+	 * @test
+	 */
+	public function PIDupinRootlineConditionMatchesCurrentPageIdWhileEditingNewPage() {
+		$GLOBALS['SOBE'] = $this->getMock('SC_alt_doc', array());
+		$GLOBALS['SOBE']->elementsData = array(
+			array(
+				'table' => 'pages',
+				'uid' => 'NEW4adc6021e37e7',
+				'pid' => 121,
+				'cmd' => 'new',
+				'deleteAccess' => 0,
+			),
+		);
+		$GLOBALS['SOBE']->data = array();
+
+		$this->matchCondition->setRootline($this->rootline);
+		$this->matchCondition->setPageId(121);
+		$this->assertTrue($this->matchCondition->match('[PIDupinRootline = 121]'));
+	}
+
+	/**
+	 * Tests whether a page Id is found in the previous rootline entries.
+	 * @test
+	 */
+	public function PIDupinRootlineConditionMatchesCurrentPageIdWhileSavingNewPage() {
+		$GLOBALS['SOBE'] = $this->getMock('SC_alt_doc', array());
+		$GLOBALS['SOBE']->elementsData = array(
+			array(
+				'table' => 'pages',
+				/// 999 is the uid of the page that was just created
+				'uid' => 999,
+				'pid' => 121,
+				'cmd' => 'edit',
+				'deleteAccess' => 1,
+			),
+		);
+		$GLOBALS['SOBE']->data = array(
+			'pages' => array(
+				'NEW4adc6021e37e7' => array(
+					'pid' => 121,
+				),
+			),
+		);
+
+		$this->matchCondition->setRootline($this->rootline);
+		$this->matchCondition->setPageId(121);
+		$this->assertTrue($this->matchCondition->match('[PIDupinRootline = 121]'));
+	}
+
+	/**
+	 * Tests whether a page Id is found in all rootline entries.
+	 * @test
+	 */
+	public function PIDinRootlineConditionMatchesSinglePageIdInRootline() {
+		$this->matchCondition->setRootline($this->rootline);
+		$this->matchCondition->setPageId(121);
+		$this->assertTrue($this->matchCondition->match('[PIDinRootline = 111]'));
+	}
+
+	/**
+	 * Tests whether a page Id is found in all rootline entries.
+	 * @test
+	 */
+	public function PIDinRootlineConditionMatchesMultiplePageIdsInRootline() {
+		$this->matchCondition->setRootline($this->rootline);
+		$this->matchCondition->setPageId(121);
+		$this->assertTrue($this->matchCondition->match('[PIDinRootline = 999,111,101]'));
+	}
+
+	/**
+	 * Tests whether a page Id is found in all rootline entries.
+	 * @test
+	 */
+	public function PIDinRootlineConditionMatchesLastPageIdInRootline() {
+		$this->matchCondition->setRootline($this->rootline);
+		$this->matchCondition->setPageId(121);
+		$this->assertTrue($this->matchCondition->match('[PIDinRootline = 121]'));
+	}
+
+	/**
+	 * Tests whether a page Id is found in all rootline entries.
+	 * @test
+	 */
+	public function PIDinRootlineConditionDoesNotMatchPageIdNotInRootline() {
+		$this->matchCondition->setRootline($this->rootline);
+		$this->matchCondition->setPageId(121);
+		$this->assertFalse($this->matchCondition->match('[PIDinRootline = 999]'));
+	}
+
+	/**
+	 * Tests whether the compatibility version can be evaluated.
+	 * (e.g. 4.9 is compatible to 4.0 but not to 5.0)
+	 * @test
+	 */
+	public function compatVersionConditionMatchesOlderRelease() {
+		$GLOBALS['TYPO3_CONF_VARS']['SYS']['compat_version'] = '4.9';
+		$this->assertTrue($this->matchCondition->match('[compatVersion = 4.0]'));
+	}
+
+	/**
+	 * Tests whether the compatibility version can be evaluated.
+	 * (e.g. 4.9 is compatible to 4.0 but not to 5.0)
+	 * @test
+	 */
+	public function compatVersionConditionMatchesSameRelease() {
+		$GLOBALS['TYPO3_CONF_VARS']['SYS']['compat_version'] = '4.9';
+		$this->assertTrue($this->matchCondition->match('[compatVersion = 4.9]'));
+	}
+
+	/**
+	 * Tests whether the compatibility version can be evaluated.
+	 * (e.g. 4.9 is compatible to 4.0 but not to 5.0)
+	 * @test
+	 */
+	public function compatVersionConditionDoesNotMatchNewerRelease() {
+		$GLOBALS['TYPO3_CONF_VARS']['SYS']['compat_version'] = '4.9';
+		$this->assertFalse($this->matchCondition->match('[compatVersion = 5.0]'));
+	}
+
+	/**
+	 * Tests whether the generic fetching of variables works with the namespace 'GP'.
+	 * @test
+	 */
+	public function genericGetVariablesSucceedsWithNamespaceGP() {
+		$_GET = array('testGet' => 'getTest');
+		$_POST = array('testPost' => 'postTest');
+
+		$this->assertTrue($this->matchCondition->match('[globalString = GP:testGet = getTest]'));
+		$this->assertTrue($this->matchCondition->match('[globalString = GP:testPost = postTest]'));
+	}
+
+	/**
+	 * Tests whether the generic fetching of variables does not work with the namespace 'TSFE',
+	 * since we are in the backend context here.
+	 * @test
+	 */
+	public function genericGetVariablesFailsWithNamespaceTSFE() {
+		$GLOBALS['TSFE'] = new stdClass();
+		$GLOBALS['TSFE']->id = 1234567;
+
+		$this->assertFalse($this->matchCondition->match('[globalString = TSFE:id = 1234567]'));
+	}
+
+	/**
+	 * Tests whether the generic fetching of variables works with the namespace 'ENV'.
+	 * @test
+	 */
+	public function genericGetVariablesSucceedsWithNamespaceENV() {
+		$testKey = uniqid('test');
+		putenv($testKey .'=testValue');
+
+		$this->assertTrue($this->matchCondition->match('[globalString = ENV:' . $testKey . ' = testValue]'));
+	}
+
+	/**
+	 * Tests whether the generic fetching of variables works with the namespace 'IENV'.
+	 * @test
+	 */
+	public function genericGetVariablesSucceedsWithNamespaceIENV() {
+		$_SERVER['HTTP_HOST'] = t3lib_div::getIndpEnv('TYPO3_HOST_ONLY') . ':1234567';
+		$this->assertTrue($this->matchCondition->match('[globalString = IENV:TYPO3_PORT = 1234567]'));
+	}
+
+	/**
+	 * Tests whether the generic fetching of variables works with any global namespace.
+	 * @test
+	 */
+	public function genericGetVariablesSucceedsWithAnyGlobalNamespace() {
+		$GLOBALS[$this->testGlobalNamespace] = array(
+			'first' => 'testFirst',
+			'second' => array('third' => 'testThird'),
+		);
+
+		$this->assertTrue($this->matchCondition->match(
+			'[globalString = ' . $this->testGlobalNamespace . '|first = testFirst]'
+		));
+		$this->assertTrue($this->matchCondition->match(
+			'[globalString = ' . $this->testGlobalNamespace . '|second|third = testThird]'
+		));
+	}
+
+	/**
+	 * Tests whether determining a pageId works.
+	 * @test
+	 */
+	public function pageIdCanBeDeterminedWhileCallingModuleWithPageTree() {
+		$_GET['id'] = 999;
+
+		$this->matchCondition->match('[globalVar = LIT:10 = 10]');
+		$this->assertEquals(999, $this->matchCondition->getPageId());
+	}
+
+	/**
+	 * Tests whether determining a pageId works.
+	 * @test
+	 */
+	public function pageIdCanBeDeterminedWhileEditingAPageRecord() {
+		$_GET['edit']['pages'][999] = 'edit';
+
+		$this->matchCondition->match('[globalVar = LIT:10 = 10]');
+		$this->assertEquals(999, $this->matchCondition->getPageId());
+	}
+
+	/**
+	 * Tests whether determining a pageId works.
+	 * @test
+	 */
+	public function pageIdCanBeDeterminedWhileEditingARegularRecord() {
+		$this->setUpDatabaseMockForDeterminePageId();
+
+		$_GET['edit'][$this->testTableName][13] = 'edit';
+
+		$this->matchCondition->match('[globalVar = LIT:10 = 10]');
+		$this->assertEquals(999, $this->matchCondition->getPageId());
+	}
+
+	/**
+	 * Tests whether determining a pageId works.
+	 * @test
+	 */
+	public function pageIdCanBeDeterminedWhileCreatingARecord() {
+		$_GET['edit']['pages'][999] = 'new';
+
+		$this->matchCondition->match('[globalVar = LIT:10 = 10]');
+		$this->assertEquals(999, $this->matchCondition->getPageId());
+	}
+
+	/**
+	 * Tests whether determining a pageId works.
+	 * @test
+	 */
+	public function pageIdCanBeDeterminedWhileCreatingARecordAfterAnExistingRecord() {
+		$this->setUpDatabaseMockForDeterminePageId();
+
+		$_GET['edit'][$this->testTableName][-13] = 'new';
+
+		$this->matchCondition->match('[globalVar = LIT:10 = 10]');
+		$this->assertEquals(999, $this->matchCondition->getPageId());
+	}
+
+	/**
+	 * Tests whether determining a pageId works.
+	 * @test
+	 */
+	public function pageIdCanBeDeterminedWhileDeletingAPageRecord() {
+		$_GET['cmd']['pages'][999]['delete'] = 1;
+
+		$this->matchCondition->match('[globalVar = LIT:10 = 10]');
+		$this->assertEquals(999, $this->matchCondition->getPageId());
+	}
+
+	/**
+	 * Tests whether determining a pageId works.
+	 * @test
+	 */
+	public function pageIdCanBeDeterminedWhileCopyingARecordToAnotherPage() {
+		$_GET['cmd']['pages'][121]['copy'] = 999;
+
+		$this->matchCondition->match('[globalVar = LIT:10 = 10]');
+		$this->assertEquals(999, $this->matchCondition->getPageId());
+	}
+
+	/**
+	 * Tests whether determining a pageId works.
+	 * @test
+	 */
+	public function pageIdCanBeDeterminedWhileCopyingARecordAfterAnExistingRecord() {
+		$this->setUpDatabaseMockForDeterminePageId();
+
+		$_GET['cmd'][$this->testTableName][121]['copy'] = -13;
+
+		$this->matchCondition->match('[globalVar = LIT:10 = 10]');
+		$this->assertEquals(999, $this->matchCondition->getPageId());
+	}
+
+	/**
+	 * Tests whether determining a pageId works.
+	 * @test
+	 */
+	public function pageIdCanBeDeterminedWhileMovingARecordToAnotherPage() {
+		$_GET['cmd']['pages'][121]['move'] = 999;
+
+		$this->matchCondition->match('[globalVar = LIT:10 = 10]');
+		$this->assertEquals(999, $this->matchCondition->getPageId());
+	}
+
+	/**
+	 * Callback method for pageIdCanBeDetermined test cases.
+	 * Simulates TYPO3_DB->exec_SELECTquery().
+	 *
+	 * @param	string		$fields
+	 * @param	string		$table
+	 * @param	string		$where
+	 * @return	mixed
+	 */
+	public function determinePageIdByRecordDatabaseExecuteCallback($fields, $table, $where) {
+		if ($table === $this->testTableName) {
+			return array(
+				'scope' => $this->testTableName,
+				'processed' => false,
+				'data' => array(
+					'pid' => 999,
+				),
+			);
+		} else {
+			return FALSE;
+		}
+	}
+
+	/**
+	 * Callback method for pageIdCanBeDetermined test cases.
+	 * Simulates TYPO3_DB->sql_fetch_assoc().
+	 *
+	 * @param	mixed		$resource
+	 * @return	mixed
+	 */
+	public function determinePageIdByRecordDatabaseFetchCallback(&$resource) {
+		if (is_array($resource) && !$resource['processed'] && $resource['scope'] === $this->testTableName) {
+			$resource['processed'] = true;
+			return $resource['data'];
+		} else {
+			return FALSE;
+		}
+	}
+}
+?>
\ No newline at end of file
