Skip to content

Commit 7680e5e

Browse files
committed
test: add the unittest of module_base/matrix.h
range: source/module_base/test/matrix_test.cpp
1 parent 30b51e4 commit 7680e5e

File tree

2 files changed

+339
-0
lines changed

2 files changed

+339
-0
lines changed

source/module_base/test/CMakeLists.txt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,3 +38,8 @@ AddTest(
3838
LIBS ${math_libs}
3939
SOURCES complexmatrix_test.cpp ../complexmatrix.cpp ../matrix.cpp
4040
)
41+
AddTest(
42+
TARGET base_matrix
43+
LIBS ${math_libs}
44+
SOURCES matrix_test.cpp ../matrix.cpp
45+
)
Lines changed: 334 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,334 @@
1+
#include"../matrix.h"
2+
#include"gtest/gtest.h"
3+
4+
/************************************************
5+
* unit test of class matrix and related functions
6+
***********************************************/
7+
8+
/**
9+
* - Tested functions of class matrix:
10+
* - constructor:
11+
* - constructed by nrow and ncloumn
12+
* - constructed by a matrix
13+
* - constructed by the rvalue of a matrix
14+
* - function create
15+
* - operator "=": assigned by a matrix or the rvalue of a matrix
16+
* - operator "()": access the element
17+
* - operator "*=", "+=", "-="
18+
* - function trace_on
19+
* - function zero_out
20+
* - function max/min/absmax
21+
* - function norm
22+
* - function print (not called in abacus, no need to test)
23+
*
24+
* - Tested functions related to class matrix
25+
* - operator "+", "-", "*" between two matrixs
26+
* - operator "*" between a double and a matrix, and reverse.
27+
* - function transpose
28+
* - function trace_on
29+
* - function mdot
30+
*
31+
*/
32+
33+
//a mock function of WARNING_QUIT, to avoid the uncorrected call by matrix.cpp at line 37.
34+
namespace ModuleBase
35+
{
36+
void WARNING_QUIT(const std::string &file,const std::string &description) {return ;}
37+
}
38+
39+
class matrixTest : public testing::Test
40+
{
41+
protected:
42+
ModuleBase::matrix m23a,m33a,m33b,m33c,m34a,m34b;
43+
44+
void SetUp()
45+
{
46+
m23a.create(2,3);
47+
for (int i=1;i<=6;++i) {m23a.c[i-1] = i*1.0;}
48+
49+
m33a.create(3,3);
50+
for (int i=1;i<=9;++i) {m33a.c[i-1] = i*1.0;}
51+
52+
m33b.create(3,3);
53+
for (int i=1;i<=9;++i) {m33b.c[i-1] = i*11.1;}
54+
55+
m33c.create(3,3,true);
56+
m34a.create(3,4,true);
57+
m34b.create(3,4,true);
58+
}
59+
60+
};
61+
62+
TEST(matrix,Constructornrnc)
63+
{
64+
ModuleBase::matrix m(3,4,true);
65+
EXPECT_EQ(m.nr,3);
66+
EXPECT_EQ(m.nc,4);
67+
EXPECT_DOUBLE_EQ(m(0,0),0.0);
68+
//EXPECT_DEATH(ModuleBase::matrix m(0,1),"");
69+
//EXPECT_DEATH(ModuleBase::matrix m(1,0),"");
70+
//EXPECT_DEATH(ModuleBase::matrix m(-1,1),"");
71+
//EXPECT_DEATH(ModuleBase::matrix m(1,-1),"");
72+
}
73+
74+
TEST_F(matrixTest,constructorMatrix)
75+
{
76+
ModuleBase::matrix m(m33a);
77+
int mnr = m.nr;
78+
EXPECT_EQ(mnr,m33a.nr);
79+
EXPECT_EQ(m.nc,m33a.nc);
80+
for (int i=0;i<9;++i)
81+
{
82+
EXPECT_DOUBLE_EQ(m.c[i],m33a.c[i]);
83+
}
84+
}
85+
86+
TEST_F(matrixTest,constructorMtrixRvalue)
87+
{
88+
89+
ModuleBase::matrix m(3.0*m33a);
90+
EXPECT_EQ(m.nr,m33a.nr);
91+
EXPECT_EQ(m.nc,m33a.nc);
92+
for (int i=0;i<9;++i)
93+
{
94+
EXPECT_DOUBLE_EQ(m.c[i],m33a.c[i] * 3.0);
95+
}
96+
}
97+
98+
TEST_F(matrixTest,create)
99+
{
100+
m33a.create(13,14,true);
101+
EXPECT_EQ(m33a.nr,13);
102+
EXPECT_EQ(m33a.nc,14);
103+
for(int i=0;i<13*14;++i)
104+
{
105+
EXPECT_DOUBLE_EQ(m33a.c[i],0.0);
106+
}
107+
}
108+
109+
TEST_F(matrixTest,operatorEqualMatrix)
110+
{
111+
ModuleBase::matrix m;
112+
m = m33a;
113+
EXPECT_EQ(m.nr,m33a.nr);
114+
EXPECT_EQ(m.nc,m33a.nc);
115+
for (int i=0;i<9;++i)
116+
{
117+
EXPECT_DOUBLE_EQ(m.c[i],m33a.c[i]);
118+
}
119+
120+
m23a = m33a;
121+
EXPECT_EQ(m23a.nr,m33a.nr);
122+
EXPECT_EQ(m23a.nc,m33a.nc);
123+
}
124+
125+
TEST_F(matrixTest,operatorEqualMatrixRvalue)
126+
{
127+
ModuleBase::matrix m;
128+
m = 3.0 * m33a;
129+
EXPECT_EQ(m.nr,m33a.nr);
130+
EXPECT_EQ(m.nc,m33a.nc);
131+
for (int i=0;i<9;++i)
132+
{
133+
EXPECT_DOUBLE_EQ(m.c[i],m33a.c[i] * 3.0);
134+
}
135+
}
136+
137+
TEST_F(matrixTest,operatorParentheses)
138+
{
139+
//EXPECT_DEATH(m33a(3,3),"");
140+
//EXPECT_DEATH(m33a(-1,0),"");
141+
m33a(0,0) = 1.1;
142+
EXPECT_DOUBLE_EQ(m33a(0,0),1.1);
143+
}
144+
145+
TEST_F(matrixTest,operatorMultiplyEqual)
146+
{
147+
m33b = m33a;
148+
m33a *= 11.1;
149+
for (int i=0;i<m33a.nr;++i)
150+
{
151+
for (int j=0;j<m33a.nc;++j)
152+
{
153+
EXPECT_DOUBLE_EQ(m33a(i,j),m33b(i,j)*11.1);
154+
}
155+
}
156+
}
157+
158+
TEST_F(matrixTest,operatorPlusEqual)
159+
{
160+
EXPECT_DEATH(m33a += m34a,"");
161+
162+
m33c = m33a;
163+
m33a += m33b;
164+
for (int i=0;i<m33a.nr;++i)
165+
{
166+
for (int j=0;j<m33a.nc;++j)
167+
{
168+
EXPECT_DOUBLE_EQ(m33a(i,j),m33b(i,j)+m33c(i,j));
169+
}
170+
}
171+
}
172+
173+
TEST_F(matrixTest,operatorMinusEqual)
174+
{
175+
EXPECT_DEATH(m33a -= m34a,"");
176+
177+
m33c = m33a;
178+
m33a -= m33b;
179+
for (int i=0;i<m33a.nr;++i)
180+
{
181+
for (int j=0;j<m33a.nc;++j)
182+
{
183+
EXPECT_DOUBLE_EQ(m33a(i,j),m33c(i,j)-m33b(i,j));
184+
}
185+
}
186+
}
187+
188+
TEST_F(matrixTest,classMatrixTraceOn)
189+
{
190+
m33a(0,0) = 1.1;
191+
m33a(1,1) = 2.2;
192+
m33a(2,2) = 5.5;
193+
EXPECT_DOUBLE_EQ(m33a.trace_on(),8.8);
194+
}
195+
196+
TEST_F(matrixTest,classMatrixZeroOut)
197+
{
198+
m33a.zero_out();
199+
for (int i=0;i<m33a.nr;++i)
200+
{
201+
for (int j=0;j<m33a.nc;++j)
202+
{
203+
EXPECT_DOUBLE_EQ(m33a(i,j),0.0);
204+
}
205+
}
206+
}
207+
208+
TEST_F(matrixTest,classMatrixMaxMinAbsmax)
209+
{
210+
m33a(1,0) = 9999.9;
211+
m33a(0,0) = -999999.9;
212+
EXPECT_DOUBLE_EQ(m33a.max(),9999.9);
213+
EXPECT_DOUBLE_EQ(m33a.min(),-999999.9);
214+
EXPECT_DOUBLE_EQ(m33a.absmax(),999999.9);
215+
}
216+
217+
TEST_F(matrixTest,classMatrixNorm)
218+
{
219+
EXPECT_NEAR(m33a.norm(),16.881943016134133728,1E-12);
220+
EXPECT_NEAR(m33b.norm(),187.38956747908889611,1E-12);
221+
}
222+
223+
TEST_F(matrixTest,operatorPlus)
224+
{
225+
m33c = m33a + m33b;
226+
for (int i=0;i<m33a.nr;++i)
227+
{
228+
for (int j=0;j<m33a.nc;++j)
229+
{
230+
EXPECT_DOUBLE_EQ(m33c(i,j),m33a(i,j) + m33b(i,j));
231+
}
232+
}
233+
//m33c = m33a + m34a;
234+
EXPECT_DEATH(m33a+m34a,"");
235+
}
236+
237+
238+
TEST_F(matrixTest,operatorMinus)
239+
{
240+
m33c = m33a - m33b;
241+
for (int i=0;i<m33a.nr;++i)
242+
{
243+
for (int j=0;j<m33a.nc;++j)
244+
{
245+
EXPECT_DOUBLE_EQ(m33c(i,j),m33a(i,j) - m33b(i,j));
246+
}
247+
}
248+
EXPECT_DEATH(m33a-m34a,"");
249+
}
250+
251+
TEST_F(matrixTest,operatorMultiplyTwoMatrix)
252+
{
253+
EXPECT_DEATH(m34a*m33a,"");
254+
255+
m33a(0,0) = 1.0; m33a(0,1) = 2.0; m33a(0,2) = 3.0;
256+
m33a(1,0) = 4.0; m33a(1,1) = 5.0; m33a(1,2) = 6.0;
257+
m33a(2,0) = 7.0; m33a(2,1) = 8.0; m33a(2,2) = 9.0;
258+
259+
m33b(0,0) = -3.0; m33b(0,1) = -2.0; m33b(0,2) = -1.0;
260+
m33b(1,0) = -6.0; m33b(1,1) = -5.0; m33b(1,2) = -4.0;
261+
m33b(2,0) = -9.0; m33b(2,1) = -8.0; m33b(2,2) = -7.0;
262+
263+
m33c = m33a * m33b;
264+
EXPECT_DOUBLE_EQ(m33c(0,0),-42.0);
265+
EXPECT_DOUBLE_EQ(m33c(0,1),-36.0);
266+
EXPECT_DOUBLE_EQ(m33c(0,2),-30.0);
267+
EXPECT_DOUBLE_EQ(m33c(1,0),-96.0);
268+
EXPECT_DOUBLE_EQ(m33c(1,1),-81.0);
269+
EXPECT_DOUBLE_EQ(m33c(1,2),-66.0);
270+
EXPECT_DOUBLE_EQ(m33c(2,0),-150.0);
271+
EXPECT_DOUBLE_EQ(m33c(2,1),-126.0);
272+
EXPECT_DOUBLE_EQ(m33c(2,2),-102.0);
273+
274+
m33c = m33b * m33a;
275+
EXPECT_DOUBLE_EQ(m33c(0,0),-18.0);
276+
EXPECT_DOUBLE_EQ(m33c(0,1),-24.0);
277+
EXPECT_DOUBLE_EQ(m33c(0,2),-30.0);
278+
EXPECT_DOUBLE_EQ(m33c(1,0),-54.0);
279+
EXPECT_DOUBLE_EQ(m33c(1,1),-69.0);
280+
EXPECT_DOUBLE_EQ(m33c(1,2),-84.0);
281+
EXPECT_DOUBLE_EQ(m33c(2,0),-90.0);
282+
EXPECT_DOUBLE_EQ(m33c(2,1),-114.0);
283+
EXPECT_DOUBLE_EQ(m33c(2,2),-138.0);
284+
}
285+
286+
TEST_F(matrixTest,operatorMultiplyDouble)
287+
{
288+
m33b = 3.0 * m33a;
289+
m33c = m33a * 3.0;
290+
for(int i=1;i<=9;++i)
291+
{
292+
EXPECT_DOUBLE_EQ(m33b.c[i-1],m33a.c[i-1] * 3.0);
293+
EXPECT_DOUBLE_EQ(m33c.c[i-1],m33a.c[i-1] * 3.0);
294+
}
295+
}
296+
297+
TEST_F(matrixTest,transpose)
298+
{
299+
m23a(0,0) = 1.0; m23a(0,1) = 2.0; m23a(0,2) = 3.0;
300+
m23a(1,0) = 4.0; m23a(1,1) = 5.0; m23a(1,2) = 6.0;
301+
ModuleBase::matrix m32a = transpose(m23a);
302+
303+
EXPECT_DOUBLE_EQ(m32a(0,0),1.0);
304+
EXPECT_DOUBLE_EQ(m32a(0,1),4.0);
305+
EXPECT_DOUBLE_EQ(m32a(1,0),2.0);
306+
EXPECT_DOUBLE_EQ(m32a(1,1),5.0);
307+
EXPECT_DOUBLE_EQ(m32a(2,0),3.0);
308+
EXPECT_DOUBLE_EQ(m32a(2,1),6.0);
309+
}
310+
311+
TEST_F(matrixTest,TraceOn)
312+
{
313+
EXPECT_DEATH(trace_on(m23a,m33a),"");
314+
EXPECT_DEATH(trace_on(m34a,m33a),"");
315+
316+
ModuleBase::matrix m32(3,2), m23(2,3);
317+
m23(0,0) = 1.0; m23(0,1) = 2.0; m23(0,2) = 3.0;
318+
m23(1,0) = 4.0; m23(1,1) = 5.0; m23(1,2) = 6.0;
319+
320+
m32(0,0) = 12.0; m32(0,1) = 23.0;
321+
m32(1,0) = 34.0; m32(1,1) = 45.0;
322+
m32(2,0) = 56.0; m32(2,1) = 67.0;
323+
324+
EXPECT_DOUBLE_EQ(trace_on(m23,m32),967.0);
325+
EXPECT_DOUBLE_EQ(trace_on(m32,m23),967.0);
326+
}
327+
328+
TEST_F(matrixTest,mdot)
329+
{
330+
EXPECT_DEATH(mdot(m23a,m33a),"");
331+
EXPECT_DEATH(mdot(m34a,m33a),"");
332+
EXPECT_DOUBLE_EQ(mdot(m33a,m33b),3163.5);
333+
}
334+

0 commit comments

Comments
 (0)