Skip to content

Commit 222b8aa

Browse files
authored
Merge pull request #698 from pxlxingliang/matrix
test: add the unittest of module_base/matrix.h
2 parents b98fce1 + 2502701 commit 222b8aa

File tree

2 files changed

+335
-0
lines changed

2 files changed

+335
-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: 330 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,330 @@
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+
}
69+
70+
TEST_F(matrixTest,ConstructorMatrix)
71+
{
72+
ModuleBase::matrix m(m33a);
73+
int mnr = m.nr;
74+
EXPECT_EQ(mnr,m33a.nr);
75+
EXPECT_EQ(m.nc,m33a.nc);
76+
for (int i=0;i<9;++i)
77+
{
78+
EXPECT_DOUBLE_EQ(m.c[i],m33a.c[i]);
79+
}
80+
}
81+
82+
TEST_F(matrixTest,ConstructorMtrixRValue)
83+
{
84+
85+
ModuleBase::matrix m(3.0*m33a);
86+
EXPECT_EQ(m.nr,m33a.nr);
87+
EXPECT_EQ(m.nc,m33a.nc);
88+
for (int i=0;i<9;++i)
89+
{
90+
EXPECT_DOUBLE_EQ(m.c[i],m33a.c[i] * 3.0);
91+
}
92+
}
93+
94+
TEST_F(matrixTest,Create)
95+
{
96+
m33a.create(13,14,true);
97+
EXPECT_EQ(m33a.nr,13);
98+
EXPECT_EQ(m33a.nc,14);
99+
for(int i=0;i<13*14;++i)
100+
{
101+
EXPECT_DOUBLE_EQ(m33a.c[i],0.0);
102+
}
103+
}
104+
105+
TEST_F(matrixTest,OperatorEqualMatrix)
106+
{
107+
ModuleBase::matrix m;
108+
m = m33a;
109+
EXPECT_EQ(m.nr,m33a.nr);
110+
EXPECT_EQ(m.nc,m33a.nc);
111+
for (int i=0;i<9;++i)
112+
{
113+
EXPECT_DOUBLE_EQ(m.c[i],m33a.c[i]);
114+
}
115+
116+
m23a = m33a;
117+
EXPECT_EQ(m23a.nr,m33a.nr);
118+
EXPECT_EQ(m23a.nc,m33a.nc);
119+
}
120+
121+
TEST_F(matrixTest,OperatorEqualMatrixRvalue)
122+
{
123+
ModuleBase::matrix m;
124+
m = 3.0 * m33a;
125+
EXPECT_EQ(m.nr,m33a.nr);
126+
EXPECT_EQ(m.nc,m33a.nc);
127+
for (int i=0;i<9;++i)
128+
{
129+
EXPECT_DOUBLE_EQ(m.c[i],m33a.c[i] * 3.0);
130+
}
131+
}
132+
133+
TEST_F(matrixTest,OperatorParentheses)
134+
{
135+
//EXPECT_DEATH(m33a(3,3),"");
136+
//EXPECT_DEATH(m33a(-1,0),"");
137+
m33a(0,0) = 1.1;
138+
EXPECT_DOUBLE_EQ(m33a(0,0),1.1);
139+
}
140+
141+
TEST_F(matrixTest,OperatorMultiplyEqual)
142+
{
143+
m33b = m33a;
144+
m33a *= 11.1;
145+
for (int i=0;i<m33a.nr;++i)
146+
{
147+
for (int j=0;j<m33a.nc;++j)
148+
{
149+
EXPECT_DOUBLE_EQ(m33a(i,j),m33b(i,j)*11.1);
150+
}
151+
}
152+
}
153+
154+
TEST_F(matrixTest,OperatorPlusEqual)
155+
{
156+
EXPECT_DEATH(m33a += m34a,"");
157+
158+
m33c = m33a;
159+
m33a += m33b;
160+
for (int i=0;i<m33a.nr;++i)
161+
{
162+
for (int j=0;j<m33a.nc;++j)
163+
{
164+
EXPECT_DOUBLE_EQ(m33a(i,j),m33b(i,j)+m33c(i,j));
165+
}
166+
}
167+
}
168+
169+
TEST_F(matrixTest,OperatorMinusEqual)
170+
{
171+
EXPECT_DEATH(m33a -= m34a,"");
172+
173+
m33c = m33a;
174+
m33a -= m33b;
175+
for (int i=0;i<m33a.nr;++i)
176+
{
177+
for (int j=0;j<m33a.nc;++j)
178+
{
179+
EXPECT_DOUBLE_EQ(m33a(i,j),m33c(i,j)-m33b(i,j));
180+
}
181+
}
182+
}
183+
184+
TEST_F(matrixTest,ClassMatrixTraceOn)
185+
{
186+
m33a(0,0) = 1.1;
187+
m33a(1,1) = 2.2;
188+
m33a(2,2) = 5.5;
189+
EXPECT_DOUBLE_EQ(m33a.trace_on(),8.8);
190+
}
191+
192+
TEST_F(matrixTest,ClassMatrixZeroOut)
193+
{
194+
m33a.zero_out();
195+
for (int i=0;i<m33a.nr;++i)
196+
{
197+
for (int j=0;j<m33a.nc;++j)
198+
{
199+
EXPECT_DOUBLE_EQ(m33a(i,j),0.0);
200+
}
201+
}
202+
}
203+
204+
TEST_F(matrixTest,ClassMatrixMaxMinAbsmax)
205+
{
206+
m33a(1,0) = 9999.9;
207+
m33a(0,0) = -999999.9;
208+
EXPECT_DOUBLE_EQ(m33a.max(),9999.9);
209+
EXPECT_DOUBLE_EQ(m33a.min(),-999999.9);
210+
EXPECT_DOUBLE_EQ(m33a.absmax(),999999.9);
211+
}
212+
213+
TEST_F(matrixTest,ClassMatrixNorm)
214+
{
215+
EXPECT_NEAR(m33a.norm(),16.881943016134133728,1E-12);
216+
EXPECT_NEAR(m33b.norm(),187.38956747908889611,1E-12);
217+
}
218+
219+
TEST_F(matrixTest,OperatorPlus)
220+
{
221+
m33c = m33a + m33b;
222+
for (int i=0;i<m33a.nr;++i)
223+
{
224+
for (int j=0;j<m33a.nc;++j)
225+
{
226+
EXPECT_DOUBLE_EQ(m33c(i,j),m33a(i,j) + m33b(i,j));
227+
}
228+
}
229+
//m33c = m33a + m34a;
230+
EXPECT_DEATH(m33a+m34a,"");
231+
}
232+
233+
234+
TEST_F(matrixTest,OperatorMinus)
235+
{
236+
m33c = m33a - m33b;
237+
for (int i=0;i<m33a.nr;++i)
238+
{
239+
for (int j=0;j<m33a.nc;++j)
240+
{
241+
EXPECT_DOUBLE_EQ(m33c(i,j),m33a(i,j) - m33b(i,j));
242+
}
243+
}
244+
EXPECT_DEATH(m33a-m34a,"");
245+
}
246+
247+
TEST_F(matrixTest,OperatorMultiplyTwoMatrix)
248+
{
249+
EXPECT_DEATH(m34a*m33a,"");
250+
251+
m33a(0,0) = 1.0; m33a(0,1) = 2.0; m33a(0,2) = 3.0;
252+
m33a(1,0) = 4.0; m33a(1,1) = 5.0; m33a(1,2) = 6.0;
253+
m33a(2,0) = 7.0; m33a(2,1) = 8.0; m33a(2,2) = 9.0;
254+
255+
m33b(0,0) = -3.0; m33b(0,1) = -2.0; m33b(0,2) = -1.0;
256+
m33b(1,0) = -6.0; m33b(1,1) = -5.0; m33b(1,2) = -4.0;
257+
m33b(2,0) = -9.0; m33b(2,1) = -8.0; m33b(2,2) = -7.0;
258+
259+
m33c = m33a * m33b;
260+
EXPECT_DOUBLE_EQ(m33c(0,0),-42.0);
261+
EXPECT_DOUBLE_EQ(m33c(0,1),-36.0);
262+
EXPECT_DOUBLE_EQ(m33c(0,2),-30.0);
263+
EXPECT_DOUBLE_EQ(m33c(1,0),-96.0);
264+
EXPECT_DOUBLE_EQ(m33c(1,1),-81.0);
265+
EXPECT_DOUBLE_EQ(m33c(1,2),-66.0);
266+
EXPECT_DOUBLE_EQ(m33c(2,0),-150.0);
267+
EXPECT_DOUBLE_EQ(m33c(2,1),-126.0);
268+
EXPECT_DOUBLE_EQ(m33c(2,2),-102.0);
269+
270+
m33c = m33b * m33a;
271+
EXPECT_DOUBLE_EQ(m33c(0,0),-18.0);
272+
EXPECT_DOUBLE_EQ(m33c(0,1),-24.0);
273+
EXPECT_DOUBLE_EQ(m33c(0,2),-30.0);
274+
EXPECT_DOUBLE_EQ(m33c(1,0),-54.0);
275+
EXPECT_DOUBLE_EQ(m33c(1,1),-69.0);
276+
EXPECT_DOUBLE_EQ(m33c(1,2),-84.0);
277+
EXPECT_DOUBLE_EQ(m33c(2,0),-90.0);
278+
EXPECT_DOUBLE_EQ(m33c(2,1),-114.0);
279+
EXPECT_DOUBLE_EQ(m33c(2,2),-138.0);
280+
}
281+
282+
TEST_F(matrixTest,OperatorMultiplyDouble)
283+
{
284+
m33b = 3.0 * m33a;
285+
m33c = m33a * 3.0;
286+
for(int i=1;i<=9;++i)
287+
{
288+
EXPECT_DOUBLE_EQ(m33b.c[i-1],m33a.c[i-1] * 3.0);
289+
EXPECT_DOUBLE_EQ(m33c.c[i-1],m33a.c[i-1] * 3.0);
290+
}
291+
}
292+
293+
TEST_F(matrixTest,Transpose)
294+
{
295+
m23a(0,0) = 1.0; m23a(0,1) = 2.0; m23a(0,2) = 3.0;
296+
m23a(1,0) = 4.0; m23a(1,1) = 5.0; m23a(1,2) = 6.0;
297+
ModuleBase::matrix m32a = transpose(m23a);
298+
299+
EXPECT_DOUBLE_EQ(m32a(0,0),1.0);
300+
EXPECT_DOUBLE_EQ(m32a(0,1),4.0);
301+
EXPECT_DOUBLE_EQ(m32a(1,0),2.0);
302+
EXPECT_DOUBLE_EQ(m32a(1,1),5.0);
303+
EXPECT_DOUBLE_EQ(m32a(2,0),3.0);
304+
EXPECT_DOUBLE_EQ(m32a(2,1),6.0);
305+
}
306+
307+
TEST_F(matrixTest,TraceOn)
308+
{
309+
EXPECT_DEATH(trace_on(m23a,m33a),"");
310+
EXPECT_DEATH(trace_on(m34a,m33a),"");
311+
312+
ModuleBase::matrix m32(3,2), m23(2,3);
313+
m23(0,0) = 1.0; m23(0,1) = 2.0; m23(0,2) = 3.0;
314+
m23(1,0) = 4.0; m23(1,1) = 5.0; m23(1,2) = 6.0;
315+
316+
m32(0,0) = 12.0; m32(0,1) = 23.0;
317+
m32(1,0) = 34.0; m32(1,1) = 45.0;
318+
m32(2,0) = 56.0; m32(2,1) = 67.0;
319+
320+
EXPECT_DOUBLE_EQ(trace_on(m23,m32),967.0);
321+
EXPECT_DOUBLE_EQ(trace_on(m32,m23),967.0);
322+
}
323+
324+
TEST_F(matrixTest,MDot)
325+
{
326+
EXPECT_DEATH(mdot(m23a,m33a),"");
327+
EXPECT_DEATH(mdot(m34a,m33a),"");
328+
EXPECT_DOUBLE_EQ(mdot(m33a,m33b),3163.5);
329+
}
330+

0 commit comments

Comments
 (0)