diff --git a/CMakeLists_files.cmake b/CMakeLists_files.cmake
index 82cc735c9..368118038 100644
--- a/CMakeLists_files.cmake
+++ b/CMakeLists_files.cmake
@@ -38,6 +38,7 @@ list (APPEND MAIN_SOURCE_FILES
list (APPEND TEST_SOURCE_FILES
tests/test_SimulationDataContainer.cpp
tests/test_cmp.cpp
+ tests/test_ConditionalStorage.cpp
tests/test_OpmLog.cpp
tests/test_messagelimiter.cpp
tests/test_param.cpp
diff --git a/tests/test_ConditionalStorage.cpp b/tests/test_ConditionalStorage.cpp
new file mode 100644
index 000000000..777c370d6
--- /dev/null
+++ b/tests/test_ConditionalStorage.cpp
@@ -0,0 +1,135 @@
+// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+// vi: set et ts=4 sw=4 sts=4:
+/*
+ This file is part of the Open Porous Media project (OPM).
+
+ OPM 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 2 of the License, or
+ (at your option) any later version.
+
+ OPM 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 OPM. If not, see .
+
+ Consult the COPYING file in the top-level source directory of this
+ module for the precise wording of the license and the list of
+ copyright holders.
+*/
+/*!
+ * \file
+ *
+ * \brief This is a simple test that illustrates how to use the Opm::ConditionalStorage
+ * class.
+*/
+#include "config.h"
+
+#include
+#include
+
+#include
+#include
+#include
+
+template
+class EnsureCompileTimeConstant
+{};
+
+class IAmAnIslandLeaveMeAlone
+{
+public:
+ IAmAnIslandLeaveMeAlone(int, int)
+ {}
+
+ IAmAnIslandLeaveMeAlone& operator=(const IAmAnIslandLeaveMeAlone&) = delete;
+};
+
+int main(int argc, char **argv)
+{
+ {
+ typedef Opm::ConditionalStorage ConditionalTrueString;
+ ConditionalTrueString foo; // default constructor
+ ConditionalTrueString bar("hello"); // construct using arguments
+ ConditionalTrueString baz(bar); // copy constructor
+
+ EnsureCompileTimeConstant hello OPM_UNUSED;
+ if (!std::is_same::value)
+ // something went wrong with the exported type
+ std::abort();
+
+ if (ConditionalTrueString::condition != true)
+ // the condition is not exported correctly
+ std::abort();
+
+ if (*bar != "hello")
+ // value constructor did not work
+ std::abort();
+
+ if (*bar != *baz)
+ // copy constructor did not work
+ std::abort();
+
+ if (foo->size() != 0)
+ // default constructor did not work
+ std::abort();
+
+ // the assignment operator for the "wrapper" object should work
+ foo = baz;
+ if (*foo != *baz)
+ // assignment operator did not work
+ std::abort();
+ }
+
+ {
+ typedef Opm::ConditionalStorage ConditionalFalseString;
+ ConditionalFalseString foo; // default constructor
+ ConditionalFalseString bar("hello"); // construct by value
+ ConditionalFalseString OPM_UNUSED baz(bar); // copy constructor
+
+ EnsureCompileTimeConstant hello OPM_UNUSED;
+ if (!std::is_same::value)
+ // something went wrong with the exported type
+ std::abort();
+
+ if (ConditionalFalseString::condition != false)
+ // the condition is not exported correctly
+ std::abort();
+
+ // the assignment operator for the "wrapper" object should always work
+ baz = foo;
+
+ try {
+ *bar;
+
+ // this is supposed to throw an std::logic_error
+ std::abort();
+ }
+ catch (std::logic_error &) {}
+
+ try {
+ foo->size();
+
+ // this is supposed to throw an std::logic_error
+ std::abort();
+ }
+ catch (std::logic_error &) {}
+ }
+
+ {
+ typedef Opm::ConditionalStorage ConditionalTrueIsland;
+ ConditionalTrueIsland OPM_UNUSED foo(1, 2);
+ // ConditionalTrueIsland OPM_UNUSED bar; // compiler fails because of missing default ctor
+ }
+
+ {
+ typedef Opm::ConditionalStorage ConditionalFalseIsland;
+ ConditionalFalseIsland OPM_UNUSED foo(1, 2);
+ // ConditionalFalseIsland OPM_UNUSED bar; // compiler fails because of missing default ctor
+ }
+
+ return 0;
+}