def test_unaryoperation_can_be_printed(): '''Test that a UnaryOperation instance can always be printed (i.e. is initialised fully)''' unary_operation = UnaryOperation(UnaryOperation.Operator.MINUS) assert "UnaryOperation[operator:'MINUS']" in str(unary_operation) op1 = Literal("1", INTEGER_SINGLE_TYPE) unary_operation.addchild(op1) # Check the node children are also printed assert ("Literal[value:'1', Scalar<INTEGER, SINGLE>]" in str(unary_operation))
def test_cw_unaryoperator(): '''Check the CWriter class unary_operation method correctly prints out the C representation of any given UnaryOperation. ''' cwriter = CWriter() # Test UnaryOperation without children. unary_operation = UnaryOperation(UnaryOperation.Operator.MINUS) with pytest.raises(VisitorError) as err: _ = cwriter(unary_operation) assert ("UnaryOperation malformed or incomplete. It should have " "exactly 1 child, but found 0." in str(err.value)) # Add child ref1 = Literal("a", CHARACTER_TYPE, unary_operation) unary_operation.addchild(ref1) assert cwriter(unary_operation) == '(-a)' # Test all supported Operators test_list = ((UnaryOperation.Operator.PLUS, '(+a)'), (UnaryOperation.Operator.MINUS, '(-a)'), (UnaryOperation.Operator.SQRT, 'sqrt(a)'), (UnaryOperation.Operator.NOT, '(!a)'), (UnaryOperation.Operator.COS, 'cos(a)'), (UnaryOperation.Operator.SIN, 'sin(a)'), (UnaryOperation.Operator.TAN, 'tan(a)'), (UnaryOperation.Operator.ACOS, 'acos(a)'), (UnaryOperation.Operator.ASIN, 'asin(a)'), (UnaryOperation.Operator.ATAN, 'atan(a)'), (UnaryOperation.Operator.ABS, 'abs(a)'), (UnaryOperation.Operator.REAL, '(float)a')) for operator, expected in test_list: unary_operation._operator = operator assert cwriter(unary_operation) in expected # Test that an unsupported operator raises an error class Unsupported(object): # pylint: disable=missing-docstring pass unary_operation._operator = Unsupported with pytest.raises(NotImplementedError) as err: _ = cwriter(unary_operation) assert "The C backend does not support the '" in str(err.value) assert "' operator." in str(err.value)
def test_unaryoperation_children_validation(): '''Test that children added to unaryOperation are validated. UnaryOperations accept just 1 DataNode as child. ''' operation = UnaryOperation(UnaryOperation.Operator.SIN) literal1 = Literal("1", INTEGER_SINGLE_TYPE) literal2 = Literal("2", INTEGER_SINGLE_TYPE) statement = Return() # Statements are not valid with pytest.raises(GenerationError) as excinfo: operation.addchild(statement) assert ("Item 'Return' can't be child 0 of 'UnaryOperation'. The valid " "format is: 'DataNode'.") in str(excinfo.value) # First DataNodes is valid, but not subsequent ones operation.addchild(literal1) with pytest.raises(GenerationError) as excinfo: operation.addchild(literal2) assert ("Item 'Literal' can't be child 1 of 'UnaryOperation'. The valid " "format is: 'DataNode'.") in str(excinfo.value)