xref: /aosp_15_r20/external/autotest/server/cros/dynamic_suite/boolparse_lib_unittest.py (revision 9c5db1993ded3edbeafc8092d69fe5de2ee02df7)
1#!/usr/bin/python3
2# -*- coding: utf-8 -*-
3# Copyright 2015 The Chromium OS Authors. All rights reserved.
4# Use of this source code is governed by a BSD-style license that can be
5# found in the LICENSE file.
6
7"""Unit tests for boolparse_lib methods."""
8
9from __future__ import print_function
10
11import unittest
12
13from autotest_lib.server.cros.dynamic_suite import boolparse_lib
14
15
16class ParserTest(unittest.TestCase):
17    """Unittest for boolean expression parser."""
18
19    def testSingleItem(self):
20        self.assertFalse(boolparse_lib.BoolstrResult('A', {}))
21        self.assertTrue(boolparse_lib.BoolstrResult('A', {'A', 'B'}))
22        self.assertFalse(boolparse_lib.BoolstrResult('A', {'B'}))
23
24    def testAndlogic(self):
25        self.assertFalse(boolparse_lib.BoolstrResult('A and B', {}))
26        self.assertFalse(boolparse_lib.BoolstrResult('A and B', {}))
27        self.assertTrue(boolparse_lib.BoolstrResult('A and B', {'A', 'B', 'C'}))
28
29    def testOrlogic(self):
30        self.assertFalse(boolparse_lib.BoolstrResult('A or B', {}))
31        self.assertTrue(boolparse_lib.BoolstrResult('A or B', {'B'}))
32        self.assertTrue(boolparse_lib.BoolstrResult('A or B', {'A', 'B'}))
33        self.assertTrue(boolparse_lib.BoolstrResult('A or B', {'A', 'C'}))
34        self.assertFalse(boolparse_lib.BoolstrResult('A or B', {'C'}))
35
36    def testNotlogic(self):
37        self.assertTrue(boolparse_lib.BoolstrResult('not A', {}))
38        self.assertFalse(boolparse_lib.BoolstrResult('not A', {'A'}))
39        self.assertFalse(boolparse_lib.BoolstrResult('not A', {'A', 'B'}))
40        self.assertTrue(boolparse_lib.BoolstrResult('not A', {'B'}))
41        self.assertTrue(boolparse_lib.BoolstrResult('not not A', {'A'}))
42
43    def testComplexBoolExpr(self):
44        self.assertFalse(boolparse_lib.BoolstrResult('A and not B', {}))
45        self.assertTrue(boolparse_lib.BoolstrResult('A and not B', {'A'}))
46        self.assertFalse(boolparse_lib.BoolstrResult('A and not B', {'A', 'B'}))
47        self.assertTrue(boolparse_lib.BoolstrResult('not (A and B)', {'A'}))
48        self.assertFalse(
49            boolparse_lib.BoolstrResult('not (A and B)', {'A', 'B'}))
50        self.assertTrue(boolparse_lib.BoolstrResult('A or not B', {'A'}))
51        self.assertTrue(boolparse_lib.BoolstrResult('A or not B', {'A', 'B'}))
52        self.assertFalse(boolparse_lib.BoolstrResult('A or not B', {'B'}))
53        self.assertTrue(boolparse_lib.BoolstrResult('A or not B', {'C'}))
54
55    def testInvalidBoolExprInput(self):
56        """Test invalid boolean expression.
57
58        Test whether captures the exceptions caused by invalid boolean
59        expression input. Note that only the lowercase and, or, not are allowed.
60        """
61
62        with self.assertRaises(boolparse_lib.BoolParseError):
63            boolparse_lib.BoolstrResult('', {'A'})
64        with self.assertRaises(TypeError):
65            boolparse_lib.BoolstrResult(None, {'A'})
66
67    def testCollectionInput(self):
68        """Test whether handle different types of collection input."""
69        self.assertFalse(boolparse_lib.BoolstrResult('A', None))
70        self.assertTrue(boolparse_lib.BoolstrResult('A', ['A', 'A']))
71        self.assertFalse(boolparse_lib.BoolstrResult('not A', ('A', 'B', 'B')))
72
73    def testVariousOperand(self):
74        """Test on various operand format."""
75        self.assertFalse(
76            boolparse_lib.BoolstrResult('A:foo and B:foo', {'A:foo'}))
77
78
79if __name__ == '__main__':
80    unittest.main()
81