opm-core/tests/sparsetable_test.cpp
Bård Skaflestad be1ca06fa3 Use dynamic Boost.Test mode only if supported
Use result of OPM_DYNLINK_BOOST_TEST to determine whether or not to
#define the Boost symbol BOOST_TEST_DYN_LINK .

While here, replace an unprintable character with the proper UTF-8
encoding in a comment.
2012-06-27 16:51:37 +02:00

133 lines
4.8 KiB
C++

//===========================================================================
//
// File: test_sparsetable.cpp
//
// Created: Thu May 28 10:01:46 2009
//
// Author(s): Atgeirr F Rasmussen <atgeirr@sintef.no>
// Bård Skaflestad <bard.skaflestad@sintef.no>
//
// $Date$
//
// $Revision$
//
//===========================================================================
/*
Copyright 2009, 2010 SINTEF ICT, Applied Mathematics.
Copyright 2009, 2010 Statoil ASA.
This file is part of The Open Reservoir Simulator Project (OpenRS).
OpenRS is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OpenRS is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with OpenRS. If not, see <http://www.gnu.org/licenses/>.
*/
#include <config.h>
#if HAVE_DYNAMIC_BOOST_TEST
#define BOOST_TEST_DYN_LINK
#endif
#define NVERBOSE // to suppress our messages when throwing
#define BOOST_TEST_MODULE SparseTableTest
#include <boost/test/unit_test.hpp>
#include <opm/core/utility/SparseTable.hpp>
using namespace Opm;
BOOST_AUTO_TEST_CASE(construction_and_queries)
{
const SparseTable<int> st1;
BOOST_CHECK(st1.empty());
BOOST_CHECK_EQUAL(st1.size(), 0);
BOOST_CHECK_EQUAL(st1.dataSize(), 0);
// This should be getting us a table like this:
// ----------------
// 0
// <empty row>
// 1 2
// 3 4 5 6
// 7 8 9
// ----------------
const int num_elem = 10;
const int elem[num_elem] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
const int num_rows = 5;
const int rowsizes[num_rows] = { 1, 0, 2, 4, 3 };
const SparseTable<int> st2(elem, elem + num_elem, rowsizes, rowsizes + num_rows);
BOOST_CHECK(!st2.empty());
BOOST_CHECK_EQUAL(st2.size(), num_rows);
BOOST_CHECK_EQUAL(st2.dataSize(), num_elem);
BOOST_CHECK_EQUAL(st2[0][0], 0);
BOOST_CHECK_EQUAL(st2.rowSize(0), 1);
BOOST_CHECK(st2[1].empty());
BOOST_CHECK_EQUAL(st2.rowSize(1), 0);
BOOST_CHECK_EQUAL(st2[3][1], 4);
BOOST_CHECK_EQUAL(st2[4][2], 9);
BOOST_CHECK(st2[4].size() == rowsizes[4]);
const SparseTable<int> st2_again(elem, elem + num_elem, rowsizes, rowsizes + num_rows);
BOOST_CHECK(st2 == st2_again);
SparseTable<int> st2_byassign;
st2_byassign.assign(elem, elem + num_elem, rowsizes, rowsizes + num_rows);
BOOST_CHECK(st2 == st2_byassign);
const int last_row_size = rowsizes[num_rows - 1];
SparseTable<int> st2_append(elem, elem + num_elem - last_row_size, rowsizes, rowsizes + num_rows - 1);
BOOST_CHECK_EQUAL(st2_append.dataSize(), num_elem - last_row_size);
st2_append.appendRow(elem + num_elem - last_row_size, elem + num_elem);
BOOST_CHECK(st2 == st2_append);
SparseTable<int> st2_append2;
st2_append2.appendRow(elem, elem + 1);
st2_append2.appendRow(elem + 1, elem + 1);
st2_append2.appendRow(elem + 1, elem + 3);
st2_append2.appendRow(elem + 3, elem + 7);
st2_append2.appendRow(elem + 7, elem + 10);
BOOST_CHECK(st2 == st2_append2);
st2_append2.clear();
SparseTable<int> st_empty;
BOOST_CHECK(st2_append2 == st_empty);
SparseTable<int> st2_allocate;
st2_allocate.allocate(rowsizes, rowsizes + num_rows);
BOOST_CHECK_EQUAL(st2_allocate.size(), num_rows);
BOOST_CHECK_EQUAL(st2_allocate.dataSize(), num_elem);
int s = 0;
for (int i = 0; i < num_rows; ++i) {
SparseTable<int>::mutable_row_type row = st2_allocate[i];
for (int j = 0; j < rowsizes[i]; ++j, ++s)
row[j] = elem[s];
}
BOOST_CHECK(st2 == st2_allocate);
// One element too few.
BOOST_CHECK_THROW(const SparseTable<int> st3(elem, elem + num_elem - 1, rowsizes, rowsizes + num_rows), std::exception);
// A few elements too many.
BOOST_CHECK_THROW(const SparseTable<int> st4(elem, elem + num_elem, rowsizes, rowsizes + num_rows - 1), std::exception);
// Need at least one row.
BOOST_CHECK_THROW(const SparseTable<int> st5(elem, elem + num_elem, rowsizes, rowsizes), std::exception);
// Tests that only run in debug mode.
#ifndef NDEBUG
// Do not ask for wrong row numbers.
BOOST_CHECK_THROW(st1.rowSize(0), std::exception);
BOOST_CHECK_THROW(st2.rowSize(-1), std::exception);
BOOST_CHECK_THROW(st2.rowSize(st2.size()), std::exception);
// No negative row sizes.
const int err_rs[num_rows] = { 1, 0, -1, 7, 3 };
BOOST_CHECK_THROW(const SparseTable<int> st6(elem, elem + num_elem, err_rs, err_rs + num_rows), std::exception);
#endif
}