#!/usr/bin/python2
# -*- coding: utf-8 -*-
# Copyright 2015 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Unit tests for boolparse_lib methods."""

from __future__ import print_function

import unittest

import boolparse_lib


class ParserTest(unittest.TestCase):
    """Unittest for boolean expression parser."""

    def testSingleItem(self):
        self.assertFalse(boolparse_lib.BoolstrResult('A', {}))
        self.assertTrue(boolparse_lib.BoolstrResult('A', {'A', 'B'}))
        self.assertFalse(boolparse_lib.BoolstrResult('A', {'B'}))

    def testAndlogic(self):
        self.assertFalse(boolparse_lib.BoolstrResult('A and B', {}))
        self.assertFalse(boolparse_lib.BoolstrResult('A and B', {}))
        self.assertTrue(boolparse_lib.BoolstrResult('A and B', {'A', 'B', 'C'}))

    def testOrlogic(self):
        self.assertFalse(boolparse_lib.BoolstrResult('A or B', {}))
        self.assertTrue(boolparse_lib.BoolstrResult('A or B', {'B'}))
        self.assertTrue(boolparse_lib.BoolstrResult('A or B', {'A', 'B'}))
        self.assertTrue(boolparse_lib.BoolstrResult('A or B', {'A', 'C'}))
        self.assertFalse(boolparse_lib.BoolstrResult('A or B', {'C'}))

    def testNotlogic(self):
        self.assertTrue(boolparse_lib.BoolstrResult('not A', {}))
        self.assertFalse(boolparse_lib.BoolstrResult('not A', {'A'}))
        self.assertFalse(boolparse_lib.BoolstrResult('not A', {'A', 'B'}))
        self.assertTrue(boolparse_lib.BoolstrResult('not A', {'B'}))
        self.assertTrue(boolparse_lib.BoolstrResult('not not A', {'A'}))

    def testComplexBoolExpr(self):
        self.assertFalse(boolparse_lib.BoolstrResult('A and not B', {}))
        self.assertTrue(boolparse_lib.BoolstrResult('A and not B', {'A'}))
        self.assertFalse(boolparse_lib.BoolstrResult('A and not B', {'A', 'B'}))
        self.assertTrue(boolparse_lib.BoolstrResult('not (A and B)', {'A'}))
        self.assertFalse(
            boolparse_lib.BoolstrResult('not (A and B)', {'A', 'B'}))
        self.assertTrue(boolparse_lib.BoolstrResult('A or not B', {'A'}))
        self.assertTrue(boolparse_lib.BoolstrResult('A or not B', {'A', 'B'}))
        self.assertFalse(boolparse_lib.BoolstrResult('A or not B', {'B'}))
        self.assertTrue(boolparse_lib.BoolstrResult('A or not B', {'C'}))

    def testInvalidBoolExprInput(self):
        """Test invalid boolean expression.

        Test whether captures the exceptions caused by invalid boolean
        expression input. Note that only the lowercase and, or, not are allowed.
        """

        with self.assertRaises(boolparse_lib.BoolParseError):
            boolparse_lib.BoolstrResult('', {'A'})
        with self.assertRaises(TypeError):
            boolparse_lib.BoolstrResult(None, {'A'})

    def testCollectionInput(self):
        """Test whether handle different types of collection input."""
        self.assertFalse(boolparse_lib.BoolstrResult('A', None))
        self.assertTrue(boolparse_lib.BoolstrResult('A', ['A', 'A']))
        self.assertFalse(boolparse_lib.BoolstrResult('not A', ('A', 'B', 'B')))

    def testVariousOperand(self):
        """Test on various operand format."""
        self.assertFalse(
            boolparse_lib.BoolstrResult('A:foo and B:foo', {'A:foo'}))


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