/**
  * Constructs a new AbstractScopeTest.
  *
  * @param array   $scopeTokens   The type of scope the test wishes to listen to.
  * @param array   $tokens        The tokens that the test wishes to listen to
  *                               within the scope.
  * @param boolean $listenOutside If true this test will also alert the
  *                               extending class when a token is found outside
  *                               the scope, by calling the processTokenOutideScope.
  *
  * @see PHP_CodeSniffer.getValidScopeTokeners()
  * @throws PHP_CodeSniffer_Test_Exception If the specified tokens array is empty.
  */
 public function __construct(array $scopeTokens, array $tokens, $listenOutside = false)
 {
     if (empty($scopeTokens) === true) {
         throw new PHP_CodeSniffer_Test_Exception('The scope tokens list cannot be empty');
     }
     if (empty($tokens) === true) {
         throw new PHP_CodeSniffer_Test_Exception('The tokens list cannot be empty');
     }
     $invalidScopeTokens = array_diff($scopeTokens, PHP_CodeSniffer_File::getValidScopeOpeners());
     if (empty($invalidScopeTokens) === false) {
         $invalid = implode(', ', $invalidScopeTokens);
         throw new PHP_CodeSniffer_Test_Exception("Supplied scope tokens [{$invalid}] are not valid scope opener");
     }
     $invalidScopeTokens = array_intersect($scopeTokens, $tokens);
     if (empty($invalidScopeTokens) === false) {
         $invalid = implode(', ', $invalidScopeTokens);
         throw new PHP_CodeSniffer_Test_Exception("Supplied scope tokens [{$invalid}] cannot be in the tokens array");
     }
     $this->_listenOutside = $listenOutside;
     $this->_scopeTokens = $scopeTokens;
     $this->_tokens = $tokens;
 }