Exemplo n.º 1
0
    def is_valid_math_expression(obj: str, algebraic: bool) -> bool:
        """Checks if the given obj (a string) represents a valid algebraic or
        numeric expression. Note that purely-numeric expressions are NOT
        considered valid algebraic expressions.

        Args:
            obj: str. The given math expression string.
            algebraic: bool. True if the given expression is algebraic
                else numeric.

        Returns:
            bool. Whether the given object is a valid expression.
        """
        if len(obj) == 0:
            return True

        if not expression_parser.is_valid_expression(
                obj):  # type: ignore[no-untyped-call]
            return False

        expression_is_algebraic = expression_parser.is_algebraic(
            obj)  # type: ignore[no-untyped-call]
        # If the algebraic flag is true, expression_is_algebraic should
        # also be true, otherwise both should be false which would imply
        # that the expression is numeric.
        return not algebraic ^ expression_is_algebraic
Exemplo n.º 2
0
    def test_is_algebraic(self):
        """Tests for is_algebraic method."""
        self.assertTrue(expression_parser.is_algebraic('a^2.3'))
        self.assertTrue(expression_parser.is_algebraic('abs(alpha)'))
        self.assertTrue(expression_parser.is_algebraic('alpha/gamma'))
        self.assertTrue(expression_parser.is_algebraic('A + 2/3'))
        # The following tests might seem as invalid but the individual letters
        # will be joined via '*' during tokenization which makes them valid.
        self.assertTrue(expression_parser.is_algebraic('Alpha'))
        self.assertTrue(expression_parser.is_algebraic('invalid + 2'))
        self.assertTrue(expression_parser.is_algebraic('alpha + bet/22'))

        self.assertFalse(expression_parser.is_algebraic('1 + 2'))
        self.assertFalse(expression_parser.is_algebraic('1^2^3/4'))
        self.assertFalse(expression_parser.is_algebraic('1'))
        self.assertFalse(expression_parser.is_algebraic('sqrt(4/4)'))
        self.assertFalse(expression_parser.is_algebraic('tan(30)'))

        with self.assertRaisesRegexp(Exception, 'Invalid bracket pairing.'):
            expression_parser.is_algebraic('1 +2)')
        with self.assertRaisesRegexp(Exception, 'Invalid character: ~.'):
            expression_parser.is_algebraic('a~2')
        with self.assertRaisesRegexp(Exception, 'Invalid character: !.'):
            expression_parser.is_algebraic('4! 2')
        with self.assertRaisesRegexp(Exception, 'Invalid token: ..'):
            expression_parser.is_algebraic('alpha + bet/22.3.4')
    def test_is_algebraic(self):
        """Tests for is_algebraic method."""
        self.assertTrue(expression_parser.is_algebraic('a^2.3'))
        self.assertTrue(expression_parser.is_algebraic('abs(alpha)'))
        self.assertTrue(expression_parser.is_algebraic('alpha/gamma'))
        self.assertTrue(expression_parser.is_algebraic('A + 2/3'))

        self.assertFalse(expression_parser.is_algebraic('1 + 2'))
        self.assertFalse(expression_parser.is_algebraic('1^2^3/4'))
        self.assertFalse(expression_parser.is_algebraic('1'))
        self.assertFalse(expression_parser.is_algebraic('sqrt(4/4)'))
        self.assertFalse(expression_parser.is_algebraic('tan(30)'))

        with self.assertRaises(Exception):
            expression_parser.is_algebraic('1 +2)')
        with self.assertRaises(Exception):
            expression_parser.is_algebraic('Alpha')
        with self.assertRaises(Exception):
            expression_parser.is_algebraic('invalid + 2')
        with self.assertRaises(Exception):
            expression_parser.is_algebraic('alpha + bet/22')