BOOST_AUTO_TEST_CASE_TEMPLATE( buildTest, T, test_types ) 
{
    typedef T ValueType;

    PartitionId size = comm->getSize();

    int numRows = 3 * size;
    int numCols = 5 * size;

    scoped_array<ValueType> values( new ValueType[ numRows * numCols ] );

    for ( IndexType i = 0; i < numRows; ++i)
    {
        for ( IndexType j = 0; j < numCols; ++j )
        {
            ValueType value = static_cast<ValueType> ( i * numCols + j + 1.0 );
            values[ i * numCols + j ] = value;
        }
    }

    DenseMatrix<ValueType> repM;
    repM.setRawDenseData( numRows, numCols, values.get() );

    for ( IndexType i = 0; i < numRows; ++i )
    {
        for ( IndexType j = 0; j<numCols; ++j )
        {
            Scalar value = repM.getValue( i , j );
            Scalar expectedvalue = Scalar( static_cast<ValueType>(values[i * numCols + j]) );
            LAMA_CHECK_SCALAR_SMALL( value - expectedvalue, ValueType, eps<ValueType>() );
        }
    }

    shared_ptr<Distribution> dist( new BlockDistribution(numRows, comm) );
    shared_ptr<Distribution> distCol( new BlockDistribution(numCols, comm) );

    DenseMatrix<ValueType> distM( repM, dist, distCol );

    for (IndexType i = 0; i<numRows; ++i)
    {
        for (IndexType j = 0; j<numCols; ++j)
        {
            Scalar value = distM.getValue( i, j );
            Scalar expectedvalue = repM.getValue( i, j );
            LAMA_CHECK_SCALAR_SMALL( value - expectedvalue , ValueType, eps<ValueType>() );
        }
    }
}
void cyclicDistTestImpl( const IndexType chunkSize, const IndexType n )
{
    boost::scoped_array<float> values( new float[n * n] );
    for ( IndexType i = 0; i < n; ++i )
    {
        for ( IndexType j = 0; j < n; ++j )
        {
            values[i * n + j] = static_cast<float>( i * n + j );
        }
    }

    DenseMatrix<float> repMatrix;
    repMatrix.setRawDenseData( n, n, values.get() );

    boost::shared_ptr<Distribution> dist( new CyclicDistribution( n, chunkSize, comm ) );

    DenseMatrix<float> distMatrix( repMatrix, dist, dist );

    for ( IndexType i = 0; i < n; i++ )
    {
        for ( IndexType j = 0; j < n; j++ )
        {
            Scalar expectedvalue = repMatrix.getValue( i, j );
            Scalar value = distMatrix.getValue( i, j );
            Scalar diff = expectedvalue - value;
            LAMA_CHECK_SCALAR_SMALL( diff, float, 1E-8 );
        }
    }
}