| 
<?php
 require_once __DIR__ . "/../../vendor/autoload.php";
 
 use jlawrence\eos\Parser;
 use jlawrence\eos\Trig;
 
 class ParserTest extends PHPUnit_Framework_TestCase
 {
 public function testAddition()
 {
 $this->assertEquals(2, Parser::solve('1+1'));
 }
 
 public function testSubtraction()
 {
 $this->assertEquals(3, Parser::solve('9-6'));
 }
 
 public function testMultiplication()
 {
 $this->assertEquals(10, Parser::solve('5*2'));
 }
 
 public function testDivision()
 {
 $this->assertEquals(4, Parser::solve('12 / 3'));
 }
 
 public function testAdditionAndSubtraction()
 {
 $this->assertEquals(5, Parser::solve('3 + 4 - 2'));
 }
 
 public function testMultiplicationAndDivision()
 {
 $this->assertEquals(8, Parser::solve('16 * 2 / 4'));
 }
 
 public function testBIDMAS()
 {
 $this->assertEquals(14, Parser::solve('2 + 3 * 4'));
 $this->assertEquals(12, Parser::solve('3 * (7 - 3)'));
 $this->assertEquals(13, Parser::solve('2 + 3 * 5 - 4'));
 $this->assertEquals(20, Parser::solve('5+((1+2)*4)+3'));
 }
 
 public function testVariables()
 {
 $this->assertEquals(10, Parser::solve('x*y', array(
 'x' => 5,
 'y' => 2
 )));
 
 $this->assertEquals(24, Parser::solve('2(4x)', array(
 'x' => 3
 )));
 
 $this->assertEquals(15, Parser::solve('2a+a', array(
 'a' => 5
 )));
 }
 
 public function testTrigonometryInDegrees()
 {
 Trig::$DEGREES = true;
 $this->assertEquals(0, Parser::solve('sin(180)'));
 $this->assertEquals(0, Parser::solve('cos(90)'));
 $this->assertEquals(1, Parser::solve('tan(45)'));
 
 Trig::$DEGREES = false;
 }
 
 public function testTrigonometry()
 {
 $this->assertEquals(1, Parser::solve('sin(pi/2)'));
 $this->assertEquals(-1, Parser::solve('cos(pi)'));
 $this->assertEquals(1, Parser::solve('tan(pi/4)'));
 $this->assertEquals(1, Parser::solve('csc(pi/2)'));
 $this->assertEquals(-1, Parser::solve('sec(pi)'));
 $this->assertEquals(1, Parser::solve('cot(pi/4)'));
 }
 
 public function testGamma()
 {
 $this->assertEquals(120, Parser::solve('5!'));
 $this->assertEquals(720, Parser::solve('3!!'));
 
 $result = Parser::solve('3.5!');
 
 $this->assertTrue(11.64 > $result && $result > 11.63);
 }
 
 public function testLogSqrtPowersSummation()
 {
 $this->assertEquals(2, Parser::solve('ln(e^2)'));
 $this->assertEquals(8, Parser::solve("log(sqrt(2^x),2)", 16));
 $this->assertEquals(2, Parser::solve("log(100)"));
 $this->assertEquals(9, Parser::solve('sum(sum(x, 1, 2)x, 1, 2)'));
 $this->assertEquals(100, Parser::solve("sum(100, 2, 3)"));
 }
 
 public function testModulus()
 {
 $this->assertEquals(2, Parser::solve("5%3"));
 $this->assertEquals(1, Parser::solve("4%3"));
 }
 
 public function testAbs()
 {
 $this->assertEquals(4, Parser::solve("abs(-4)"));
 }
 
 public function testSolvePostFix()
 {
 $pf = array('2', '3', '+');
 $this->assertEquals(5, Parser::solve($pf));
 }
 
 /**
 * @expectedException \Exception
 * @expectedExceptionCode \jlawrence\eos\Math::E_DIV_ZERO
 */
 public function testDivisionByZero()
 {
 Parser::solve("3/0");
 }
 
 /**
 * @expectedException \Exception
 * @expectedExceptionCode \jlawrence\eos\Math::E_DIV_ZERO
 */
 public function testModulusByZero()
 {
 Parser::solve("3%0");
 }
 
 /**
 * @expectedException \Exception
 * @expectedExceptionCode \jlawrence\eos\Math::E_NAN
 */
 public function testLnError()
 {
 Parser::solve("ln(0)");
 }
 
 /**
 * @expectedException \Exception
 * @expectedExceptionCode \jlawrence\eos\Math::E_NAN
 */
 public function testLogError()
 {
 Parser::solve("log(0)");
 }
 
 /**
 * @expectedException \Exception
 * @expectedExceptionCode \jlawrence\eos\Math::E_NAN
 */
 public function testSqrtError()
 {
 Parser::solve("sqrt(-4)");
 }
 
 /**
 * @expectedException \Exception
 * @expectedExceptionCode \jlawrence\eos\Math::E_NO_VAR
 */
 public function testNoVariable()
 {
 Parser::solve("4x");
 }
 
 /**
 * @expectedException \Exception
 * @expectedExceptionCode \jlawrence\eos\Math::E_NAN
 */
 public function testNegativeFactorial()
 {
 Parser::solve("-4!");
 }
 
 /**
 * @expectedException \Exception
 * @expectedExceptionCode \jlawrence\eos\Math::E_NO_EQ
 */
 public function testNoEquation()
 {
 Parser::solve("");
 }
 
 /**
 * @expectedException \Exception
 * @expectedExceptionCode \jlawrence\eos\Math::E_NO_SET
 */
 public function testMismatchedParenthesis()
 {
 Parser::solve("(2+(3*4)");
 }
 
 /**
 * @expectedException \Exception
 * @expectedExceptionCode \jlawrence\eos\Math::E_NO_SET
 */
 public function testMismatchedBrackets()
 {
 Parser::solve("[2+[3*4]");
 }
 }
 
 |