4129 |
19 Jan 22 |
peter |
// $Id$ |
4129 |
19 Jan 22 |
peter |
2 |
|
4129 |
19 Jan 22 |
peter |
3 |
/* |
4207 |
26 Aug 22 |
peter |
Copyright (C) 2022 Peter Johansson |
4129 |
19 Jan 22 |
peter |
5 |
|
4129 |
19 Jan 22 |
peter |
This file is part of the yat library, https://dev.thep.lu.se/yat |
4129 |
19 Jan 22 |
peter |
7 |
|
4129 |
19 Jan 22 |
peter |
The yat library is free software; you can redistribute it and/or |
4129 |
19 Jan 22 |
peter |
modify it under the terms of the GNU General Public License as |
4129 |
19 Jan 22 |
peter |
published by the Free Software Foundation; either version 3 of the |
4129 |
19 Jan 22 |
peter |
License, or (at your option) any later version. |
4129 |
19 Jan 22 |
peter |
12 |
|
4129 |
19 Jan 22 |
peter |
The yat library is distributed in the hope that it will be useful, |
4129 |
19 Jan 22 |
peter |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
4129 |
19 Jan 22 |
peter |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
4129 |
19 Jan 22 |
peter |
General Public License for more details. |
4129 |
19 Jan 22 |
peter |
17 |
|
4129 |
19 Jan 22 |
peter |
You should have received a copy of the GNU General Public License |
4129 |
19 Jan 22 |
peter |
along with yat. If not, see <https://www.gnu.org/licenses/>. |
4129 |
19 Jan 22 |
peter |
20 |
*/ |
4129 |
19 Jan 22 |
peter |
21 |
|
4129 |
19 Jan 22 |
peter |
22 |
#include <config.h> |
4129 |
19 Jan 22 |
peter |
23 |
|
4129 |
19 Jan 22 |
peter |
24 |
#include "Suite.h" |
4129 |
19 Jan 22 |
peter |
25 |
|
4132 |
21 Jan 22 |
peter |
26 |
#include "yat/utility/concept_check.h" |
4129 |
19 Jan 22 |
peter |
27 |
#include "yat/utility/Matrix.h" |
4129 |
19 Jan 22 |
peter |
28 |
#include "yat/utility/MatrixConstView.h" |
4129 |
19 Jan 22 |
peter |
29 |
#include "yat/utility/MatrixView.h" |
4129 |
19 Jan 22 |
peter |
30 |
|
4132 |
21 Jan 22 |
peter |
31 |
#include <boost/concept_check.hpp> |
4132 |
21 Jan 22 |
peter |
32 |
|
4129 |
19 Jan 22 |
peter |
33 |
using namespace theplu::yat; |
4129 |
19 Jan 22 |
peter |
34 |
|
4129 |
19 Jan 22 |
peter |
35 |
void test_matrix_view(test::Suite& suite); |
4129 |
19 Jan 22 |
peter |
36 |
void test_matrix_const_view(test::Suite& suite); |
4129 |
19 Jan 22 |
peter |
37 |
|
4129 |
19 Jan 22 |
peter |
38 |
int main(int argc, char* argv[]) |
4129 |
19 Jan 22 |
peter |
39 |
{ |
4129 |
19 Jan 22 |
peter |
40 |
test::Suite suite(argc, argv); |
4129 |
19 Jan 22 |
peter |
41 |
test_matrix_view(suite); |
4129 |
19 Jan 22 |
peter |
42 |
test_matrix_const_view(suite); |
4129 |
19 Jan 22 |
peter |
43 |
return suite.return_value(); |
4129 |
19 Jan 22 |
peter |
44 |
} |
4129 |
19 Jan 22 |
peter |
45 |
|
4129 |
19 Jan 22 |
peter |
46 |
|
4129 |
19 Jan 22 |
peter |
47 |
template<class VIEW> |
4129 |
19 Jan 22 |
peter |
48 |
void test_constructors(test::Suite& suite, utility::Matrix m) |
4129 |
19 Jan 22 |
peter |
49 |
{ |
4129 |
19 Jan 22 |
peter |
50 |
VIEW view; |
4129 |
19 Jan 22 |
peter |
51 |
VIEW view2(view); |
4129 |
19 Jan 22 |
peter |
52 |
suite.out() << "matrix:\n" << m << "\n"; |
4129 |
19 Jan 22 |
peter |
53 |
VIEW view3(m); |
4129 |
19 Jan 22 |
peter |
54 |
if (view3 != m) { |
4129 |
19 Jan 22 |
peter |
55 |
suite.add(false); |
4129 |
19 Jan 22 |
peter |
56 |
suite.err() << "view3 != m\n"; |
4129 |
19 Jan 22 |
peter |
57 |
} |
4129 |
19 Jan 22 |
peter |
58 |
VIEW view4(view3); |
4129 |
19 Jan 22 |
peter |
59 |
if (view4 != view3) { |
4129 |
19 Jan 22 |
peter |
60 |
suite.add(false); |
4129 |
19 Jan 22 |
peter |
61 |
suite.err() << "view4 != view3\n"; |
4129 |
19 Jan 22 |
peter |
62 |
} |
4129 |
19 Jan 22 |
peter |
63 |
m(0,0) = 3.1415; |
4129 |
19 Jan 22 |
peter |
64 |
if (view4 != m) { |
4129 |
19 Jan 22 |
peter |
65 |
suite.add(false); |
4129 |
19 Jan 22 |
peter |
66 |
suite.err() << "view4 != m\n"; |
4129 |
19 Jan 22 |
peter |
67 |
} |
4129 |
19 Jan 22 |
peter |
68 |
|
4129 |
19 Jan 22 |
peter |
69 |
VIEW view5(m, 2, 3, 3, 4); |
4129 |
19 Jan 22 |
peter |
70 |
if (view5.rows() != 3) { |
4129 |
19 Jan 22 |
peter |
71 |
suite.add(false); |
4129 |
19 Jan 22 |
peter |
72 |
suite.err() << "view5: incorrect rows: " << view5.rows() << "\n"; |
4129 |
19 Jan 22 |
peter |
73 |
} |
4129 |
19 Jan 22 |
peter |
74 |
if (view5.columns() != 4) { |
4129 |
19 Jan 22 |
peter |
75 |
suite.add(false); |
4129 |
19 Jan 22 |
peter |
76 |
suite.err() << "view5: incorrect columns: " << view5.columns() << "\n"; |
4129 |
19 Jan 22 |
peter |
77 |
} |
4129 |
19 Jan 22 |
peter |
78 |
for (size_t row = 0; row<view5.rows(); ++row) |
4129 |
19 Jan 22 |
peter |
79 |
for (size_t col = 0; col<view5.columns(); ++col) { |
4129 |
19 Jan 22 |
peter |
80 |
if (view5(row, col) != m(2+row, 3+col)) { |
4129 |
19 Jan 22 |
peter |
81 |
suite.add(false); |
4129 |
19 Jan 22 |
peter |
82 |
suite.err() << "incorrect view5:" << view5 << "\n"; |
4129 |
19 Jan 22 |
peter |
83 |
} |
4129 |
19 Jan 22 |
peter |
84 |
} |
4129 |
19 Jan 22 |
peter |
85 |
|
4129 |
19 Jan 22 |
peter |
// construct a matrix copy of a view and test that it's not linked |
4129 |
19 Jan 22 |
peter |
87 |
utility::Matrix m2(view5); |
4129 |
19 Jan 22 |
peter |
88 |
if (m2 != view5) { |
4129 |
19 Jan 22 |
peter |
89 |
suite.add(false); |
4129 |
19 Jan 22 |
peter |
90 |
suite.err() << "m2 != view5:\nm2:\n" << m2 << "\nview5:\n" << view5 |
4129 |
19 Jan 22 |
peter |
91 |
<< "\n"; |
4129 |
19 Jan 22 |
peter |
92 |
} |
4129 |
19 Jan 22 |
peter |
93 |
m2(0,0) = -1; |
4129 |
19 Jan 22 |
peter |
94 |
if (view5(0, 0) == -1) { |
4129 |
19 Jan 22 |
peter |
95 |
suite.err() << "view5(0,0) = -1\n"; |
4129 |
19 Jan 22 |
peter |
96 |
} |
4129 |
19 Jan 22 |
peter |
97 |
} |
4129 |
19 Jan 22 |
peter |
98 |
|
4129 |
19 Jan 22 |
peter |
99 |
|
4129 |
19 Jan 22 |
peter |
100 |
template<class VIEW> |
4129 |
19 Jan 22 |
peter |
101 |
void test_assignment(test::Suite& suite, utility::Matrix m) |
4129 |
19 Jan 22 |
peter |
102 |
{ |
4129 |
19 Jan 22 |
peter |
103 |
utility::Matrix m0(m.rows(), m.columns(), 0.0); |
4129 |
19 Jan 22 |
peter |
104 |
VIEW view(m0); |
4129 |
19 Jan 22 |
peter |
105 |
view = m; |
4129 |
19 Jan 22 |
peter |
106 |
if (!suite.add(suite.equal_matrix(m, view))) { |
4129 |
19 Jan 22 |
peter |
107 |
suite.err() << "view != m\n"; |
4129 |
19 Jan 22 |
peter |
108 |
} |
4129 |
19 Jan 22 |
peter |
109 |
if (!suite.add(suite.equal_matrix(m, m0))) { |
4129 |
19 Jan 22 |
peter |
110 |
suite.err() << "m != m0\n"; |
4129 |
19 Jan 22 |
peter |
111 |
} |
4129 |
19 Jan 22 |
peter |
112 |
|
4129 |
19 Jan 22 |
peter |
113 |
utility::Matrix m2(2,2,1.0); |
4129 |
19 Jan 22 |
peter |
114 |
VIEW view1(m, 1, 1, m2.rows(), m2.columns()); |
4129 |
19 Jan 22 |
peter |
115 |
VIEW view2(m, 1, 1, m2.rows(), m2.columns()); |
4129 |
19 Jan 22 |
peter |
116 |
view2 = m2; |
4129 |
19 Jan 22 |
peter |
117 |
if (!suite.add(suite.equal_matrix(view1, view2))) { |
4129 |
19 Jan 22 |
peter |
118 |
suite.err() << "view1 != view2 after = m2\n"; |
4129 |
19 Jan 22 |
peter |
119 |
} |
4129 |
19 Jan 22 |
peter |
120 |
view2 = m2 + m2; |
4129 |
19 Jan 22 |
peter |
121 |
if (!suite.add(suite.equal_matrix(view1, view2))) { |
4129 |
19 Jan 22 |
peter |
122 |
suite.err() << "view1 != view2 after = m2 + m2\n"; |
4129 |
19 Jan 22 |
peter |
123 |
} |
4129 |
19 Jan 22 |
peter |
124 |
view2 += m2*m2; |
4129 |
19 Jan 22 |
peter |
125 |
if (!suite.add(suite.equal_matrix(view1, view2))) { |
4129 |
19 Jan 22 |
peter |
126 |
suite.err() << "view1 != view2 after += m2*m2\n"; |
4129 |
19 Jan 22 |
peter |
127 |
} |
4129 |
19 Jan 22 |
peter |
128 |
view2 -= m2*m2; |
4129 |
19 Jan 22 |
peter |
129 |
if (!suite.add(suite.equal_matrix(view1, view2))) { |
4129 |
19 Jan 22 |
peter |
130 |
suite.err() << "view1 != view2 after -= m2*m2\n"; |
4129 |
19 Jan 22 |
peter |
131 |
} |
4129 |
19 Jan 22 |
peter |
132 |
view2 *= 1.2; |
4129 |
19 Jan 22 |
peter |
133 |
if (!suite.add(suite.equal_matrix(view1, view2))) { |
4129 |
19 Jan 22 |
peter |
134 |
suite.err() << "view1 != view2 after *= 1.2\n"; |
4129 |
19 Jan 22 |
peter |
135 |
} |
4129 |
19 Jan 22 |
peter |
136 |
|
4129 |
19 Jan 22 |
peter |
// create views that overlap with view |
4129 |
19 Jan 22 |
peter |
138 |
VIEW view3(m, 1, 5, 2, 2); |
4129 |
19 Jan 22 |
peter |
139 |
utility::Matrix copy3(view3); |
4129 |
19 Jan 22 |
peter |
140 |
VIEW view4(m, 2, 6, 2, 2); |
4129 |
19 Jan 22 |
peter |
141 |
suite.out() << "m:\n" << m << "\n"; |
4129 |
19 Jan 22 |
peter |
142 |
suite.out() << "copy3:\n" << copy3 << "\n"; |
4129 |
19 Jan 22 |
peter |
143 |
suite.out() << "view3:\n" << view3 << "\n"; |
4129 |
19 Jan 22 |
peter |
144 |
suite.out() << "view4:\n" << view4 << "\n"; |
4129 |
19 Jan 22 |
peter |
145 |
view4 = view3; |
4129 |
19 Jan 22 |
peter |
146 |
suite.add(suite.equal_matrix(view4, copy3)); |
4129 |
19 Jan 22 |
peter |
147 |
} |
4129 |
19 Jan 22 |
peter |
148 |
|
4129 |
19 Jan 22 |
peter |
149 |
|
4131 |
21 Jan 22 |
peter |
150 |
template<class VIEW> |
4131 |
21 Jan 22 |
peter |
151 |
void test_iterators(test::Suite& suite, utility::Matrix m) |
4131 |
21 Jan 22 |
peter |
152 |
{ |
4131 |
21 Jan 22 |
peter |
153 |
suite.out () << __func__ << "\n"; |
4131 |
21 Jan 22 |
peter |
154 |
size_t n1 = 2; |
4131 |
21 Jan 22 |
peter |
155 |
size_t n2 = 4; |
4131 |
21 Jan 22 |
peter |
156 |
VIEW view(m, 1, 3, n1, n2); |
4131 |
21 Jan 22 |
peter |
157 |
|
4131 |
21 Jan 22 |
peter |
158 |
suite.test_random_access_iterator(view.begin()); |
4131 |
21 Jan 22 |
peter |
159 |
suite.test_random_access_iterator(view.begin_row(0)); |
4131 |
21 Jan 22 |
peter |
160 |
suite.test_random_access_iterator(view.begin_column(0)); |
4131 |
21 Jan 22 |
peter |
161 |
|
4131 |
21 Jan 22 |
peter |
162 |
suite.out() << "testing ::row_iterator\n"; |
4131 |
21 Jan 22 |
peter |
163 |
size_t n = view.end_row(0) - view.begin_row(0); |
4131 |
21 Jan 22 |
peter |
164 |
if (n != n2) { |
4131 |
21 Jan 22 |
peter |
165 |
suite.add(false); |
4131 |
21 Jan 22 |
peter |
166 |
suite.err() << "end - begin: " << n << "; expected " << n2 << "\n"; |
4131 |
21 Jan 22 |
peter |
167 |
} |
4131 |
21 Jan 22 |
peter |
168 |
if (view.begin_row(0)[1] != view(0,1)) { |
4131 |
21 Jan 22 |
peter |
169 |
suite.add(false); |
4131 |
21 Jan 22 |
peter |
170 |
suite.err() << "error: view.begin_row(0)[1]: " << view.begin_row(0)[1] |
4131 |
21 Jan 22 |
peter |
171 |
<< "; expected: " << view(0,1) << "\n"; |
4131 |
21 Jan 22 |
peter |
172 |
} |
4131 |
21 Jan 22 |
peter |
173 |
|
4131 |
21 Jan 22 |
peter |
174 |
suite.out() << "testing ::column_iterator\n"; |
4131 |
21 Jan 22 |
peter |
175 |
n = view.end_column(0) - view.begin_column(0); |
4131 |
21 Jan 22 |
peter |
176 |
if (n != n1) { |
4131 |
21 Jan 22 |
peter |
177 |
suite.add(false); |
4131 |
21 Jan 22 |
peter |
178 |
suite.err() << "end - begin: " << n << "; expected " << n1 << "\n"; |
4131 |
21 Jan 22 |
peter |
179 |
} |
4131 |
21 Jan 22 |
peter |
180 |
if (view.begin_column(0)[1] != view(1,0)) { |
4131 |
21 Jan 22 |
peter |
181 |
suite.add(false); |
4131 |
21 Jan 22 |
peter |
182 |
suite.err() << "error: view.begin_column(0)[1]: " << view.begin_column(0)[1] |
4131 |
21 Jan 22 |
peter |
183 |
<< "; expected: " << view(1,0) << "\n"; |
4131 |
21 Jan 22 |
peter |
184 |
} |
4131 |
21 Jan 22 |
peter |
185 |
|
4131 |
21 Jan 22 |
peter |
186 |
suite.out() << "testing ::iterator\n"; |
4131 |
21 Jan 22 |
peter |
187 |
n = view.end() - view.begin(); |
4131 |
21 Jan 22 |
peter |
188 |
if (n != n1*n2) { |
4131 |
21 Jan 22 |
peter |
189 |
suite.add(false); |
4131 |
21 Jan 22 |
peter |
190 |
suite.err() << "end - begin: " << n << "; expected " << n1*n2 << "\n"; |
4131 |
21 Jan 22 |
peter |
191 |
} |
4131 |
21 Jan 22 |
peter |
192 |
if (view.begin()[n2] != view(1,0)) { |
4131 |
21 Jan 22 |
peter |
193 |
suite.add(false); |
4131 |
21 Jan 22 |
peter |
194 |
suite.err() << "error: view.begin(n2)[1]: " << view.begin()[n2] |
4131 |
21 Jan 22 |
peter |
195 |
<< "; expected: " << view(1,0) << "\n"; |
4131 |
21 Jan 22 |
peter |
196 |
} |
4131 |
21 Jan 22 |
peter |
197 |
} |
4131 |
21 Jan 22 |
peter |
198 |
|
4131 |
21 Jan 22 |
peter |
199 |
|
4137 |
21 Jan 22 |
peter |
200 |
utility::MatrixView make_view(utility::Matrix& m) |
4137 |
21 Jan 22 |
peter |
201 |
{ |
4137 |
21 Jan 22 |
peter |
202 |
return utility::MatrixView(m); |
4137 |
21 Jan 22 |
peter |
203 |
} |
4137 |
21 Jan 22 |
peter |
204 |
|
4137 |
21 Jan 22 |
peter |
205 |
|
4129 |
19 Jan 22 |
peter |
206 |
void test_matrix_view(test::Suite& suite) |
4129 |
19 Jan 22 |
peter |
207 |
{ |
4132 |
21 Jan 22 |
peter |
208 |
BOOST_CONCEPT_ASSERT((utility::Mutable_Container2D<utility::MatrixView>)); |
4129 |
19 Jan 22 |
peter |
209 |
suite.out() << "=== " << __func__ << "===\n"; |
4129 |
19 Jan 22 |
peter |
210 |
using utility::MatrixView; |
4129 |
19 Jan 22 |
peter |
// test constructors |
4129 |
19 Jan 22 |
peter |
212 |
utility::Matrix m(5, 10); |
4129 |
19 Jan 22 |
peter |
213 |
for (size_t i=0; i<m.rows(); ++i) |
4129 |
19 Jan 22 |
peter |
214 |
for (size_t j=0; j<m.columns(); ++j) |
4129 |
19 Jan 22 |
peter |
215 |
m(i,j) = 10*i + j; |
4129 |
19 Jan 22 |
peter |
216 |
|
4129 |
19 Jan 22 |
peter |
217 |
test_constructors<MatrixView>(suite, m); |
4129 |
19 Jan 22 |
peter |
218 |
test_assignment<MatrixView>(suite, m); |
4131 |
21 Jan 22 |
peter |
219 |
test_iterators<MatrixView>(suite, m); |
4137 |
21 Jan 22 |
peter |
220 |
MatrixView view = make_view(m); |
4141 |
01 Feb 22 |
peter |
221 |
|
4129 |
19 Jan 22 |
peter |
222 |
} |
4129 |
19 Jan 22 |
peter |
223 |
|
4129 |
19 Jan 22 |
peter |
224 |
|
4137 |
21 Jan 22 |
peter |
225 |
utility::MatrixConstView make_const_view(const utility::Matrix& m) |
4137 |
21 Jan 22 |
peter |
226 |
{ |
4137 |
21 Jan 22 |
peter |
227 |
return utility::MatrixConstView(m); |
4137 |
21 Jan 22 |
peter |
228 |
} |
4137 |
21 Jan 22 |
peter |
229 |
|
4137 |
21 Jan 22 |
peter |
230 |
|
4129 |
19 Jan 22 |
peter |
231 |
void test_matrix_const_view(test::Suite& suite) |
4129 |
19 Jan 22 |
peter |
232 |
{ |
4132 |
21 Jan 22 |
peter |
233 |
BOOST_CONCEPT_ASSERT((utility::Container2D<utility::MatrixConstView>)); |
4129 |
19 Jan 22 |
peter |
234 |
suite.out() << "=== " << __func__ << "===\n"; |
4129 |
19 Jan 22 |
peter |
235 |
using utility::MatrixConstView; |
4129 |
19 Jan 22 |
peter |
// test constructors |
4129 |
19 Jan 22 |
peter |
237 |
utility::Matrix m(5, 10); |
4129 |
19 Jan 22 |
peter |
238 |
for (size_t i=0; i<m.rows(); ++i) |
4129 |
19 Jan 22 |
peter |
239 |
for (size_t j=0; j<m.columns(); ++j) |
4129 |
19 Jan 22 |
peter |
240 |
m(i,j) = 10*i + j; |
4129 |
19 Jan 22 |
peter |
241 |
test_constructors<MatrixConstView>(suite, m); |
4131 |
21 Jan 22 |
peter |
242 |
test_iterators<MatrixConstView>(suite, m); |
4137 |
21 Jan 22 |
peter |
243 |
|
4137 |
21 Jan 22 |
peter |
244 |
MatrixConstView view = make_const_view(m); |
4141 |
01 Feb 22 |
peter |
245 |
|
4141 |
01 Feb 22 |
peter |
246 |
std::vector<double> vec(100,0); |
4141 |
01 Feb 22 |
peter |
247 |
for (size_t i=0; i<vec.size(); ++i) |
4141 |
01 Feb 22 |
peter |
248 |
vec[i] = i; |
4141 |
01 Feb 22 |
peter |
249 |
utility::Matrix correct(4, 5); |
4141 |
01 Feb 22 |
peter |
250 |
for (size_t i=0; i<correct.rows(); ++i) |
4141 |
01 Feb 22 |
peter |
251 |
for (size_t j=0; j<correct.columns(); ++j) |
4141 |
01 Feb 22 |
peter |
252 |
correct(i,j) = 5*i + j; |
4141 |
01 Feb 22 |
peter |
253 |
MatrixConstView view2(&vec.front(), 4, 5); |
4141 |
01 Feb 22 |
peter |
254 |
if (!suite.equal_matrix(view2, correct)) { |
4141 |
01 Feb 22 |
peter |
255 |
suite.add(false); |
4141 |
01 Feb 22 |
peter |
256 |
suite.err() << "error: view2 not equal correct\n"; |
4141 |
01 Feb 22 |
peter |
257 |
suite.err() << "view2:\n" << view2 << "\ncorrect:\n" << correct << "\n"; |
4141 |
01 Feb 22 |
peter |
258 |
} |
4141 |
01 Feb 22 |
peter |
259 |
|
4141 |
01 Feb 22 |
peter |
260 |
size_t tda = 10; |
4141 |
01 Feb 22 |
peter |
261 |
MatrixConstView view3(&vec.front(), 4, 5, tda); |
4141 |
01 Feb 22 |
peter |
262 |
for (size_t i=0; i<correct.rows(); ++i) |
4141 |
01 Feb 22 |
peter |
263 |
for (size_t j=0; j<correct.columns(); ++j) |
4141 |
01 Feb 22 |
peter |
264 |
correct(i,j) = tda*i + j; |
4141 |
01 Feb 22 |
peter |
265 |
if (!suite.equal_matrix(view3, correct)) { |
4141 |
01 Feb 22 |
peter |
266 |
suite.add(false); |
4141 |
01 Feb 22 |
peter |
267 |
suite.err() << "error: view3 not equal correct\n"; |
4141 |
01 Feb 22 |
peter |
268 |
suite.err() << "view3:\n" << view3 << "\ncorrect:\n" << correct << "\n"; |
4141 |
01 Feb 22 |
peter |
269 |
} |
4141 |
01 Feb 22 |
peter |
270 |
|
4141 |
01 Feb 22 |
peter |
271 |
MatrixConstView view4(correct.gsl_matrix_p()); |
4141 |
01 Feb 22 |
peter |
272 |
if (!suite.equal_matrix(view4, correct)) { |
4141 |
01 Feb 22 |
peter |
273 |
suite.add(false); |
4141 |
01 Feb 22 |
peter |
274 |
suite.err() << "error: view4 not equal correct\n"; |
4141 |
01 Feb 22 |
peter |
275 |
suite.err() << "view4:\n" << view4 << "\ncorrect:\n" << correct << "\n"; |
4141 |
01 Feb 22 |
peter |
276 |
} |
4129 |
19 Jan 22 |
peter |
277 |
} |