def test_datasymbol_constant_value_setter(): '''Test that a DataSymbol constant value can be set if given a new valid constant value.''' # Test with valid constant values sym = DataSymbol('a', INTEGER_SINGLE_TYPE, constant_value=7) assert sym.constant_value.value == "7" sym.constant_value = 9 assert sym.constant_value.value == "9" sym = DataSymbol('a', REAL_SINGLE_TYPE, constant_value=3.1415) assert sym.constant_value.value == "3.1415" sym.constant_value = 1.0 assert sym.constant_value.value == "1.0" sym = DataSymbol('a', BOOLEAN_TYPE, constant_value=True) assert sym.constant_value.value == "true" sym.constant_value = False assert sym.constant_value.value == "false" # Test with valid constant expressions lhs = Literal('2', INTEGER_SINGLE_TYPE) rhs = Reference(DataSymbol('constval', INTEGER_SINGLE_TYPE)) ct_expr = BinaryOperation.create(BinaryOperation.Operator.ADD, lhs, rhs) sym = DataSymbol('a', INTEGER_SINGLE_TYPE, constant_value=ct_expr) assert isinstance(sym.constant_value, BinaryOperation) assert sym.constant_value is ct_expr
def test_datasymbol_is_constant(): '''Test that the DataSymbol is_constant property returns True if a constant value is set and False if it is not. ''' sym = DataSymbol('a', INTEGER_SINGLE_TYPE) assert not sym.is_constant sym.constant_value = 9 assert sym.is_constant
def test_datasymbol_constant_value_setter_invalid(): '''Test that a DataSymbol constant value setter raises the appropriate error if an invalid value and/or datatype are given.''' # Test with invalid constant values sym = DataSymbol('a', DeferredType()) with pytest.raises(ValueError) as error: sym.constant_value = 1.0 assert ("Error setting constant value for symbol 'a'. A DataSymbol with " "a constant value must be a scalar or an array but found " "'DeferredType'." in str(error.value)) # Test with invalid constant expressions ct_expr = Return() with pytest.raises(ValueError) as error: _ = DataSymbol('a', INTEGER_SINGLE_TYPE, constant_value=ct_expr) assert "Error setting constant value for symbol 'a'. PSyIR static " \ "expressions can only contain PSyIR literal, operation or reference" \ " nodes but found:" in str(error.value) with pytest.raises(ValueError) as error: DataSymbol('a', INTEGER_SINGLE_TYPE, interface=ArgumentInterface(), constant_value=9) assert ("Error setting constant value for symbol 'a'. A DataSymbol with " "an ArgumentInterface can not have a constant value." in str(error.value)) with pytest.raises(ValueError) as error: DataSymbol('a', INTEGER_SINGLE_TYPE, constant_value=9.81) assert ("Error setting constant value for symbol 'a'. This DataSymbol " "instance datatype is 'Scalar<INTEGER, SINGLE>' which " "means the constant value is expected to be") in str(error.value) assert "'int'>' but found " in str(error.value) assert "'float'>'." in str(error.value) with pytest.raises(ValueError) as error: DataSymbol('a', CHARACTER_TYPE, constant_value=42) assert ("Error setting constant value for symbol 'a'. This DataSymbol " "instance datatype is 'Scalar<CHARACTER, UNDEFINED>' which " "means the constant value is expected to be") in str(error.value) assert "'str'>' but found " in str(error.value) assert "'int'>'." in str(error.value) with pytest.raises(ValueError) as error: DataSymbol('a', BOOLEAN_TYPE, constant_value="hello") assert ("Error setting constant value for symbol 'a'. This DataSymbol " "instance datatype is 'Scalar<BOOLEAN, UNDEFINED>' which " "means the constant value is expected to be") in str(error.value) assert "'bool'>' but found " in str(error.value) assert "'str'>'." in str(error.value)