import unittest

import sys
import os.path
import mozunit

from mozbuild.preprocessor import Expression, Context

class TestContext(unittest.TestCase):
  """
  Unit tests for the Context class
  """

  def setUp(self):
    self.c = Context()
    self.c['FAIL'] = 'PASS'

  def test_string_literal(self):
    """test string literal, fall-through for undefined var in a Context"""
    self.assertEqual(self.c['PASS'], 'PASS')

  def test_variable(self):
    """test value for defined var in the Context class"""
    self.assertEqual(self.c['FAIL'], 'PASS')

  def test_in(self):
    """test 'var in context' to not fall for fallback"""
    self.assert_('FAIL' in self.c)
    self.assert_('PASS' not in self.c)

class TestExpression(unittest.TestCase):
  """
  Unit tests for the Expression class
  evaluate() is called with a context {FAIL: 'PASS'}
  """

  def setUp(self):
    self.c = Context()
    self.c['FAIL'] = 'PASS'

  def test_string_literal(self):
    """Test for a string literal in an Expression"""
    self.assertEqual(Expression('PASS').evaluate(self.c), 'PASS')

  def test_variable(self):
    """Test for variable value in an Expression"""
    self.assertEqual(Expression('FAIL').evaluate(self.c), 'PASS')

  def test_not(self):
    """Test for the ! operator"""
    self.assert_(Expression('!0').evaluate(self.c))
    self.assert_(not Expression('!1').evaluate(self.c))

  def test_equals(self):
    """ Test for the == operator"""
    self.assert_(Expression('FAIL == PASS').evaluate(self.c))

  def test_notequals(self):
    """ Test for the != operator"""
    self.assert_(Expression('FAIL != 1').evaluate(self.c))

  def test_logical_and(self):
    """ Test for the && operator"""
    self.assertTrue(Expression('PASS == PASS && PASS != NOTPASS').evaluate(self.c))

  def test_logical_or(self):
    """ Test for the || operator"""
    self.assertTrue(Expression('PASS == NOTPASS || PASS != NOTPASS').evaluate(self.c))

  def test_logical_ops(self):
    """ Test for the && and || operators precedence"""
    # Would evaluate to false if precedence was wrong
    self.assertTrue(Expression('PASS == PASS || PASS != NOTPASS && PASS == NOTPASS').evaluate(self.c))

  def test_defined(self):
    """ Test for the defined() value"""
    self.assertTrue(Expression('defined(FAIL)').evaluate(self.c))
    self.assertTrue(Expression('!defined(PASS)').evaluate(self.c))


if __name__ == '__main__':
  mozunit.main()
