<?php
namespace apache\shindig\test\gadgets;
use apache\shindig\gadgets\templates\Token;
use apache\shindig\gadgets\templates\ExpType;
use apache\shindig\gadgets\templates\ExpLexer;
use apache\shindig\gadgets\templates\ExpParser;
use apache\shindig\gadgets\templates\ExpressionParser;

/**
 * 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.
 */

class ObjEe {
  public $Ee;
}

/**
 * ExpressionParser test case.
 */
class ExpressionParserTest extends \PHPUnit_Framework_TestCase {

  private $input;
  private $tokenStream;
  private $dataContext;

  /**
   * Prepares the environment before running a test.
   */
  protected function setUp() {
    parent::setUp();
    $encoded_json = base64_encode('{"array_attr": [0, 1]}');
    $attr_equ = "no_prefix_id.Ee+---((2-1)*(4.0-3)-1.0/2+5e-1)>-.5e+1+4 or not empty cur_id['empty_str']&&!top_id.null_attr";
    $this->input = 'osx:parseJson(osx:urlDecode(osx:urlEncode(osx:decodeBase64("' . $encoded_json . '"))))'
        . '.array_attr['
        . $attr_equ . "?0:1"
        . "]==1?(true?'no_prefix_id.Ee <= 0':"
        . '"\'should never be here\'	\\\\\\""'
        . "):'no_prefix_id.Ee > 0'";
    
    $this->tokenStream = array(
        new Token(ExpType::$FUNCTION, 'osx:parseJson'),
        new Token(ExpType::$PAREN, '('),
        new Token(ExpType::$FUNCTION, 'osx:urlDecode'),
        new Token(ExpType::$PAREN, '('),
        new Token(ExpType::$FUNCTION, 'osx:urlEncode'),
        new Token(ExpType::$PAREN, '('),
        new Token(ExpType::$FUNCTION, 'osx:decodeBase64'),
        new Token(ExpType::$PAREN, '('),
        new Token(ExpType::$STRING, 'eyJhcnJheV9hdHRyIjogWzAsIDFdfQ=='),
        new Token(ExpType::$PAREN, ')'),
        new Token(ExpType::$PAREN, ')'),
        new Token(ExpType::$PAREN, ')'),
        new Token(ExpType::$PAREN, ')'),
        new Token(ExpType::$DOT, '.'),
        new Token(ExpType::$IDENTITY, 'array_attr'),
        new Token(ExpType::$PAREN, '['),
        new Token(ExpType::$IDENTITY, 'no_prefix_id'),
        new Token(ExpType::$DOT, '.'),
        new Token(ExpType::$IDENTITY, 'Ee'),
        new Token(ExpType::$BINARY_OP, '+'),
        new Token(ExpType::$UNARY_OP, ' -'),
        new Token(ExpType::$UNARY_OP, ' -'),
        new Token(ExpType::$UNARY_OP, ' -'),
        new Token(ExpType::$PAREN, '('),
        new Token(ExpType::$PAREN, '('),
        new Token(ExpType::$INT, 2),
        new Token(ExpType::$BINARY_OP, ' - '),
        new Token(ExpType::$INT, 1),
        new Token(ExpType::$PAREN, ')'),
        new Token(ExpType::$BINARY_OP, '*'),
        new Token(ExpType::$PAREN, '('),
        new Token(ExpType::$FLOAT, 4.0),
        new Token(ExpType::$BINARY_OP, ' - '),
        new Token(ExpType::$INT, 3),
        new Token(ExpType::$PAREN, ')'),
        new Token(ExpType::$BINARY_OP, ' - '),
        new Token(ExpType::$FLOAT, 1.0),
        new Token(ExpType::$BINARY_OP, '/'),
        new Token(ExpType::$INT, 2),
        new Token(ExpType::$BINARY_OP, '+'),
        new Token(ExpType::$FLOAT, 0.5),
        new Token(ExpType::$PAREN, ')'),
        new Token(ExpType::$BINARY_OP, '>'),
        new Token(ExpType::$UNARY_OP, ' -'),
        new Token(ExpType::$FLOAT, 5.0),
        new Token(ExpType::$BINARY_OP, '+'),
        new Token(ExpType::$INT, 4),
        new Token(ExpType::$BINARY_OP, '||'),
        new Token(ExpType::$UNARY_OP, '!'),
        new Token(ExpType::$UNARY_OP, 'empty'),
        new Token(ExpType::$IDENTITY, 'cur_id'),
        new Token(ExpType::$PAREN, '['),
        new Token(ExpType::$STRING, 'empty_str'),
        new Token(ExpType::$PAREN, ']'),
        new Token(ExpType::$BINARY_OP, '&&'),
        new Token(ExpType::$UNARY_OP, '!'),
        new Token(ExpType::$IDENTITY, 'top_id'),
        new Token(ExpType::$DOT, '.'),
        new Token(ExpType::$IDENTITY, 'null_attr'),
        new Token(ExpType::$TERNARY, '?'),
        new Token(ExpType::$INT, 0),
        new Token(ExpType::$TERNARY, ':'),
        new Token(ExpType::$INT, 1),
        new Token(ExpType::$PAREN, ']'),
        new Token(ExpType::$BINARY_OP, '=='),
        new Token(ExpType::$INT, 1),
        new Token(ExpType::$TERNARY, '?'),
        new Token(ExpType::$PAREN, '('),
        new Token(ExpType::$BOOL, true),
        new Token(ExpType::$TERNARY, '?'),
        new Token(ExpType::$STRING, 'no_prefix_id.Ee <= 0'),
        new Token(ExpType::$TERNARY, ':'),
        new Token(ExpType::$STRING, '\'should never be here\'	\\"'),
        new Token(ExpType::$PAREN, ')'),
        new Token(ExpType::$TERNARY, ':'),
        new Token(ExpType::$STRING, 'no_prefix_id.Ee > 0')
    );
    
    $no_prefix_id = new ObjEe();
    $no_prefix_id->Ee = 1;  // change this number to see the difference
    $cur_id = array('empty_str' => '');
    $top_id = (object)'empty_object';
    $this->dataContext = array(
        'no_prefix_id' => $no_prefix_id,
        'Cur' => array('cur_id' => $cur_id),
        'My' => array(),
        'Top' => array('top_id' => $top_id)
    );
  }

  /**
   * Cleans up the environment after running a test.
   */
  protected function tearDown() {
    parent::tearDown();
  }
  
  /**
   * Tests ExpLexer::process
   */
  public function testProcess() {
    $actualTokenStream = ExpLexer::process($this->input);
    $this->assertEquals($this->tokenStream, $actualTokenStream);
  }

  /**
   * Tests ExpParser::parse
   */
  public function testParse() {
    $this->dataContext['no_prefix_id']->Ee = 1;
    $actualResult = ExpParser::parse($this->tokenStream, $this->dataContext);
    $this->assertEquals(new Token(ExpType::$STRING, 'no_prefix_id.Ee > 0'), $actualResult);
    
    $this->dataContext['no_prefix_id']->Ee = -1;
    $actualResult = ExpParser::parse($this->tokenStream, $this->dataContext);
    $this->assertEquals(new Token(ExpType::$STRING, 'no_prefix_id.Ee <= 0'), $actualResult);
  }

  /**
   * Tests ExpressionParser::evaluate
   */
  public function testEvaluate() {
    $actualOutput = ExpressionParser::evaluate($this->input, $this->dataContext);
    
    // Expected result
    $this->assertEquals('no_prefix_id.Ee > 0', $actualOutput);
  }

}
