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
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')