lsst.cpputils
g87389fa792+0bb42a27e1
Toggle main menu visibility
Loading...
Searching...
No Matches
include
lsst
cpputils
tests.h
Go to the documentation of this file.
1
// -*- lsst-c++ -*-
2
3
/*
4
* This file is part of utils.
5
*
6
* Developed for the LSST Data Management System.
7
* This product includes software developed by the LSST Project
8
* (https://www.lsst.org).
9
* See the COPYRIGHT file at the top-level directory of this distribution
10
* for details of code ownership.
11
*
12
* This program is free software: you can redistribute it and/or modify
13
* it under the terms of the GNU General Public License as published by
14
* the Free Software Foundation, either version 3 of the License, or
15
* (at your option) any later version.
16
*
17
* This program is distributed in the hope that it will be useful,
18
* but WITHOUT ANY WARRANTY; without even the implied warranty of
19
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20
* GNU General Public License for more details.
21
*
22
* You should have received a copy of the GNU General Public License
23
* along with this program. If not, see <https://www.gnu.org/licenses/>.
24
*/
25
26
#ifndef LSST_CPPUTILS_TESTS_H
27
#define LSST_CPPUTILS_TESTS_H
28
29
// Do not include unit_test.hpp, to avoid definition problems with BOOST_TEST_MODULE
30
31
#include <ostream>
32
#include <type_traits>
33
34
namespace
lsst
{
35
namespace
cpputils
{
36
37
namespace
{
38
// Variable template reporting whether a type can be printed using <<
39
// Second template parameter is a dummy to let us do some metaprogramming
40
template
<
typename
,
typename
=
void
>
41
constexpr
bool
HAS_STREAM_OUTPUT =
false
;
42
template
<
typename
T>
43
constexpr
bool
HAS_STREAM_OUTPUT<
44
T, std::enable_if_t<true, decltype((void)(std::declval<std::ostream&>() <<
std::declval<T&>
()),
45
void
())>> =
true
;
46
47
// Conditional function templates reporting object values if possible
48
template
<
typename
T,
class
Hash>
49
std::enable_if_t<HAS_STREAM_OUTPUT<T>> printIfHashEqual(T obj1, T obj2, Hash hash) {
50
BOOST_TEST_REQUIRE(obj1 == obj2);
51
BOOST_TEST(hash(obj1) == hash(obj2),
52
obj1 <<
" == "
<< obj2 <<
", but "
<< hash(obj1) <<
" != "
<< hash(obj2));
53
}
54
template
<
typename
T,
class
Hash>
55
std::enable_if_t<!HAS_STREAM_OUTPUT<T>> printIfHashEqual(T obj1, T obj2, Hash hash) {
56
if
(!(obj1 == obj2)) {
57
BOOST_FAIL(
"Unequal objects need not have equal hashes."
);
58
}
59
BOOST_TEST(hash(obj1) == hash(obj2));
60
}
61
}
// namespace
62
71
template
<
typename
T>
72
constexpr
void
assertValidHash
() {
73
using namespace
std
;
74
using
Hash =
hash<remove_cv_t<T>
>;
75
76
static_assert
(
is_default_constructible<Hash>::value
,
77
"std::hash specializations must be default-constructible"
);
78
static_assert
(
is_copy_assignable<Hash>::value
,
"std::hash specializations must be copy-assignable"
);
79
// Swappability hard to test before C++17
80
static_assert
(
is_destructible<Hash>::value
,
"std::hash specializations must be destructible"
);
81
82
static_assert
(
is_same<typename Hash::argument_type, remove_cv_t<T>
>::value,
83
"std::hash must have an argument_type member until C++20"
);
84
static_assert
(
is_same<typename Hash::result_type, size_t>::value
,
85
"std::hash must have a result_type member until C++20"
);
86
// Ability to call Hash(T) hard to test before C++17
87
static_assert
(
is_same<std::invoke_result_t<Hash, T>
,
size_t
>::value,
88
"std::hash specializations must be callable and return a size_t"
);
89
}
90
101
template
<
typename
T>
102
void
assertHashesEqual
(T obj1, T obj2) {
103
using
Hash =
std::hash<std::remove_cv_t<T>
>;
104
105
printIfHashEqual(obj1, obj2, Hash());
106
}
107
108
}
// namespace cpputils
109
}
// namespace lsst
110
111
#endif
std::declval
T declval(T... args)
std::hash
std::is_copy_assignable
std::is_default_constructible
std::is_destructible
std::is_same
lsst::cpputils
Definition
main.dox:1
lsst::cpputils::assertHashesEqual
void assertHashesEqual(T obj1, T obj2)
Test that equal objects have equal hashes.
Definition
tests.h:102
lsst::cpputils::assertValidHash
constexpr void assertValidHash()
Compile-time test of whether a specialization of std::hash conforms to the general spec.
Definition
tests.h:72
lsst
std
STL namespace.
Generated on
for lsst.cpputils by
1.17.0