def test_cw_array(): '''Check the CWriter class array method correctly prints out the C representation of an array. ''' cwriter = CWriter() symbol = DataSymbol('a', REAL_TYPE) arr = ArrayReference(symbol) lit = Literal('0.0', REAL_TYPE) assignment = Assignment.create(arr, lit) # An array without any children (dimensions) should produce an error. with pytest.raises(VisitorError) as excinfo: result = cwriter(assignment) assert "Arrays must have at least 1 dimension but found node: '" \ in str(excinfo.value) # Dimensions can be references, literals or operations arr.addchild(Reference(DataSymbol('b', INTEGER_TYPE), parent=arr)) arr.addchild(Literal('1', INTEGER_TYPE, parent=arr)) uop = UnaryOperation.create(UnaryOperation.Operator.MINUS, Literal('2', INTEGER_TYPE)) uop.parent = arr arr.addchild(uop) result = cwriter(assignment) # Results is reversed and flatten (row-major 1D) # dimensions are called <name>LEN<dimension> by convention assert result == "a[(-2) * aLEN2 * aLEN1 + 1 * aLEN1 + b] = 0.0;\n"
def test_array_children_validation(): '''Test that children added to Array are validated. Array accepts DataNodes and Range children.''' array_type = ArrayType(REAL_SINGLE_TYPE, shape=[5, 5]) array = ArrayReference(DataSymbol("rname", array_type)) datanode1 = Literal("1", INTEGER_SINGLE_TYPE) erange = Range() assignment = Assignment() # Invalid child with pytest.raises(GenerationError) as excinfo: array.addchild(assignment) assert ("Item 'Assignment' can't be child 0 of 'ArrayReference'. The valid" " format is: '[DataNode | Range]+'." in str(excinfo.value)) # Valid children array.addchild(datanode1) array.addchild(erange)