TRIQS/nda 1.3.0
Multi-dimensional array library for C++
Loading...
Searching...
No Matches
gtest_tools.hpp
Go to the documentation of this file.
1// Copyright (c) 2019-2024 Simons Foundation
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0.txt
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14//
15// Authors: Thomas Hahn, Olivier Parcollet, Nils Wentzell
16
22#pragma once
23
24#ifndef NDA_DEBUG
25#define NDA_DEBUG
26#endif
27
28#include "./nda.hpp"
29
30#include <gtest/gtest.h>
31
32#include <cstdlib>
33#include <iostream>
34#include <sstream>
35
52template <typename X, typename Y>
53::testing::AssertionResult complex_are_close(X const &x, Y const &y, double precision = 1.e-10) {
54 using std::abs;
55 if (abs(x - y) < precision)
56 return ::testing::AssertionSuccess();
57 else
58 return ::testing::AssertionFailure() << "abs(x - y) = " << abs(x - y) << "\n x = " << x << "\n y = " << y;
59}
60
62#define EXPECT_COMPLEX_NEAR(X, ...) EXPECT_TRUE(complex_are_close(X, __VA_ARGS__))
63
74template <typename X, typename Y>
75::testing::AssertionResult array_are_equal(X const &x, Y const &y) {
76 if (x.shape() != y.shape())
77 return ::testing::AssertionFailure() << "Comparing two arrays of different size "
78 << "\n X = " << x << "\n Y = " << y;
79 if (x == y)
80 return ::testing::AssertionSuccess();
81 else
82 return ::testing::AssertionFailure() << "Arrays have different elements\n X = " << x << "\n Y = " << y;
83}
84
86#define EXPECT_EQ_ARRAY(X, Y) EXPECT_TRUE(array_are_equal(X, Y));
87
89#define EXPECT_ARRAY_EQ(X, Y) EXPECT_TRUE(array_are_equal(X, Y));
90
103template <typename X, typename Y>
104::testing::AssertionResult array_are_close(X const &x, Y const &y, double precision = 1.e-10) {
107
108 // check their shapes
109 if (x_reg.shape() != y_reg.shape())
110 return ::testing::AssertionFailure() << "Comparing two arrays of different size "
111 << "\n X = " << x_reg << "\n Y = " << y_reg;
112
113 // empty arrays are considered equal
114 if (x_reg.size() == 0) return ::testing::AssertionSuccess();
115
116 // check their difference
117 const auto maxdiff = max_element(abs(make_regular(x_reg - y_reg)));
118 if (maxdiff < precision)
119 return ::testing::AssertionSuccess();
120 else
121 return ::testing::AssertionFailure() << "max_element(abs(X - Y)) = " << maxdiff << "\n X = " << x_reg << "\n Y = " << y_reg;
122}
123
125#define EXPECT_ARRAY_NEAR(X, ...) EXPECT_TRUE(array_are_close(X, __VA_ARGS__))
126
135template <typename X>
136::testing::AssertionResult array_almost_zero(X const &x) {
138
139 constexpr double eps = 1.e-10;
140 const auto max = max_element(abs(x_reg));
141 if (x_reg.size() == 0 || max < eps)
142 return ::testing::AssertionSuccess();
143 else
144 return ::testing::AssertionFailure() << "max_element(abs(X)) = " << max << "\n X = " << x_reg;
145}
146
148#define EXPECT_ARRAY_ZERO(X) EXPECT_TRUE(array_almost_zero(X))
149
160template <typename X, typename Y>
161::testing::AssertionResult generic_are_near(X const &x, Y const &y) {
162 double precision = 1.e-12;
163 using std::abs;
164 if (abs(x - y) > precision)
165 return ::testing::AssertionFailure() << "X = " << x << " and Y = " << y << " are different. \n Difference is: " << abs(x - y);
166 return ::testing::AssertionSuccess();
167}
168
170#define EXPECT_CLOSE(X, Y) EXPECT_TRUE(generic_are_near(X, Y));
171
A generic multi-dimensional array.
auto const & shape() const noexcept
Get the shape of the view/array.
long size() const noexcept
Get the total size of the view/array.
constexpr int get_rank
Constexpr variable that specifies the rank of an nda::Array or of a contiguous 1-dimensional range.
Definition traits.hpp:136
::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.
::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...
::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...
::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.
::testing::AssertionResult complex_are_close(X const &x, Y const &y, double precision=1.e-10)
Check the absolute difference of two (complex) numbers.
Includes all relevant headers for the core nda library.