TRIQS/nda
2.0.0
Multi-dimensional array library for C++
Toggle main menu visibility
Loading...
Searching...
No Matches
gtest_tools.hpp
Go to the documentation of this file.
1
// Copyright (c) 2019--present, The Simons Foundation
2
// This file is part of TRIQS/nda and is licensed under the Apache License, Version 2.0.
3
// SPDX-License-Identifier: Apache-2.0
4
// See LICENSE in the root of this distribution for details.
5
10
11
#pragma once
12
13
#ifndef NDA_DEBUG
14
#define NDA_DEBUG
15
#endif
16
17
#include "
./nda.hpp
"
18
19
#include <gtest/gtest.h>
20
21
#include <cstdlib>
22
#include <iostream>
23
#include <sstream>
24
29
41
template
<
typename
X,
typename
Y>
42
::testing::AssertionResult
complex_are_close
(X
const
&x, Y
const
&y,
double
precision = 1.e-10) {
43
using
std::abs;
44
if
(abs(x - y) < precision)
45
return ::testing::AssertionSuccess();
46
else
47
return ::testing::AssertionFailure() <<
"abs(x - y) = "
<< abs(x - y) <<
"\n x = "
<< x <<
"\n y = "
<< y;
48
}
49
51
#define EXPECT_COMPLEX_NEAR(X, ...) EXPECT_TRUE(complex_are_close(X, __VA_ARGS__))
52
63
template
<
typename
X,
typename
Y>
64
::testing::AssertionResult
array_are_equal
(X
const
&x, Y
const
&y) {
65
if
(x.shape() != y.shape())
66
return ::testing::AssertionFailure() <<
"Comparing two arrays of different size "
67
<<
"\n X = "
<< x <<
"\n Y = "
<< y;
68
if
(x == y)
69
return ::testing::AssertionSuccess();
70
else
71
return ::testing::AssertionFailure() <<
"Arrays have different elements\n X = "
<< x <<
"\n Y = "
<< y;
72
}
73
75
#define EXPECT_EQ_ARRAY(X, Y) EXPECT_TRUE(array_are_equal(X, Y));
76
78
#define EXPECT_ARRAY_EQ(X, Y) EXPECT_TRUE(array_are_equal(X, Y));
79
92
template
<
typename
X,
typename
Y>
93
::testing::AssertionResult
array_are_close
(X
const
&x, Y
const
&y,
double
precision = 1.e-10) {
94
nda::array<nda::get_value_t<X>
,
nda::get_rank<X>
> x_reg = x;
95
nda::array<nda::get_value_t<X>
,
nda::get_rank<X>
> y_reg = y;
96
97
// check their shapes
98
if
(x_reg.
shape
() != y_reg.
shape
())
99
return ::testing::AssertionFailure() <<
"Comparing two arrays of different size "
100
<<
"\n X = "
<< x_reg <<
"\n Y = "
<< y_reg;
101
102
// empty arrays are considered equal
103
if
(x_reg.
size
() == 0) return ::testing::AssertionSuccess();
104
105
// check their difference
106
const
auto
maxdiff = max_element(abs(make_regular(x_reg - y_reg)));
107
if
(maxdiff < precision)
108
return ::testing::AssertionSuccess();
109
else
110
return ::testing::AssertionFailure() <<
"max_element(abs(X - Y)) = "
<< maxdiff <<
"\n X = "
<< x_reg <<
"\n Y = "
<< y_reg;
111
}
112
114
#define EXPECT_ARRAY_NEAR(X, ...) EXPECT_TRUE(array_are_close(X, __VA_ARGS__))
115
124
template
<
typename
X>
125
::testing::AssertionResult
array_almost_zero
(X
const
&x) {
126
nda::array<nda::get_value_t<X>
,
nda::get_rank<X>
> x_reg = x;
127
128
constexpr
double
eps = 1.e-10;
129
const
auto
max = max_element(abs(x_reg));
130
if
(x_reg.
size
() == 0 || max < eps)
131
return ::testing::AssertionSuccess();
132
else
133
return ::testing::AssertionFailure() <<
"max_element(abs(X)) = "
<< max <<
"\n X = "
<< x_reg;
134
}
135
137
#define EXPECT_ARRAY_ZERO(X) EXPECT_TRUE(array_almost_zero(X))
138
149
template
<
typename
X,
typename
Y>
150
::testing::AssertionResult
generic_are_near
(X
const
&x, Y
const
&y) {
151
double
precision = 1.e-12;
152
using
std::abs;
153
if
(abs(x - y) > precision)
154
return ::testing::AssertionFailure() <<
"X = "
<< x <<
" and Y = "
<< y <<
" are different. \n Difference is: "
<< abs(x - y);
155
return ::testing::AssertionSuccess();
156
}
157
159
#define EXPECT_CLOSE(X, Y) EXPECT_TRUE(generic_are_near(X, Y));
160
nda::basic_array::shape
auto const & shape() const noexcept
Get the shape of the view/array.
Definition
basic_array.hpp:631
nda::basic_array::size
long size() const noexcept
Get the total size of the view/array.
Definition
basic_array.hpp:643
nda::array
basic_array< ValueType, Rank, Layout, 'A', ContainerPolicy > array
Alias template of an nda::basic_array with an 'A' algebra.
Definition
declarations.hpp:64
nda::get_rank
constexpr int get_rank
Constexpr variable that specifies the rank of an nda::Array or of a contiguous 1-dimensional range.
Definition
traits.hpp:126
array_almost_zero
::testing::AssertionResult array_almost_zero(X const &x)
Check that an array/view is close to zero, i.e. that its largest absolute element is less than 1e-10.
Definition
gtest_tools.hpp:125
generic_are_near
::testing::AssertionResult generic_are_near(X const &x, Y const &y)
Check that that two generic objects are close, i.e. that their absolute difference is less than 1e-12...
Definition
gtest_tools.hpp:150
array_are_close
::testing::AssertionResult array_are_close(X const &x, Y const &y, double precision=1.e-10)
Check that two arrays/views are close, i.e. that they have the same shape and that the largest elemen...
Definition
gtest_tools.hpp:93
array_are_equal
::testing::AssertionResult array_are_equal(X const &x, Y const &y)
Check that two arrays/views are equal, i.e. that they have the same shape and the same elements.
Definition
gtest_tools.hpp:64
complex_are_close
::testing::AssertionResult complex_are_close(X const &x, Y const &y, double precision=1.e-10)
Check the absolute difference of two (complex) numbers.
Definition
gtest_tools.hpp:42
nda.hpp
Includes all relevant headers for the core nda library.
nda
gtest_tools.hpp
Generated by
1.17.0