2041b96e96bbc525530033274f7a9d146ebf4035
[alexxy/gromacs.git] / src / gromacs / utility / tests / message_string_collector.cpp
1 /*
2  * This file is part of the GROMACS molecular simulation package.
3  *
4  * Copyright (c) 2021, by the GROMACS development team, led by
5  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
6  * and including many others, as listed in the AUTHORS file in the
7  * top-level source directory and at http://www.gromacs.org.
8  *
9  * GROMACS is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU Lesser General Public License
11  * as published by the Free Software Foundation; either version 2.1
12  * of the License, or (at your option) any later version.
13  *
14  * GROMACS is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17  * Lesser General Public License for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public
20  * License along with GROMACS; if not, see
21  * http://www.gnu.org/licenses, or write to the Free Software Foundation,
22  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA.
23  *
24  * If you want to redistribute modifications to GROMACS, please
25  * consider that scientific software is very special. Version
26  * control is crucial - bugs must be traceable. We will be happy to
27  * consider code for inclusion in the official distribution, but
28  * derived work must not be called official GROMACS. Details are found
29  * in the README & COPYING files - if they are missing, get the
30  * official version at http://www.gromacs.org.
31  *
32  * To help us fund GROMACS development, we humbly ask that you cite
33  * the research papers on the package. Check out http://www.gromacs.org.
34  */
35 /*! \internal \file
36  * \brief Tests for MessageStringCollector.
37  *
38  * \author Artem Zhmurov <zhmurov@gmail.com>
39  * \ingroup module_utility
40  */
41 #include "gmxpre.h"
42
43 #include "gromacs/utility/message_string_collector.h"
44
45 #include <gtest/gtest.h>
46
47 namespace gmx
48 {
49
50 namespace
51 {
52
53 TEST(MessageStringCollectorTest, CanAddAndClearMessagesNoContext)
54 {
55     MessageStringCollector messages;
56
57     EXPECT_TRUE(messages.isEmpty());
58
59     messages.append("Message1");
60
61     EXPECT_FALSE(messages.isEmpty());
62
63     messages.append("Message2");
64
65     EXPECT_FALSE(messages.isEmpty());
66
67     messages.clear();
68
69     EXPECT_TRUE(messages.isEmpty());
70 }
71
72 TEST(MessageStringCollectorTest, CanAddAndClearMessagesWithContext)
73 {
74     MessageStringCollector messages;
75
76     messages.startContext("Context1");
77
78     EXPECT_TRUE(messages.isEmpty());
79
80     messages.append("Message1");
81
82     EXPECT_FALSE(messages.isEmpty());
83
84     messages.append("Message1");
85
86     EXPECT_FALSE(messages.isEmpty());
87
88     messages.finishContext();
89
90     messages.clear();
91
92     EXPECT_TRUE(messages.isEmpty());
93 }
94
95 TEST(MessageStringCollectorTest, CanAddStringMessages)
96 {
97     std::string context1 = "Context1";
98     std::string message1 = "Message1";
99
100     MessageStringCollector messagesChar;
101     MessageStringCollector messagesString;
102
103     messagesChar.startContext(context1.c_str());
104     messagesChar.append(message1.c_str());
105     messagesChar.finishContext();
106
107     messagesString.startContext(context1);
108     messagesString.append(message1);
109     messagesString.finishContext();
110
111     EXPECT_EQ(messagesChar.toString(), messagesString.toString());
112 }
113
114 TEST(MessageStringCollectorTest, CanAddCharMessagesConditionally)
115 {
116     std::string context1     = "Context1";
117     std::string message1     = "Message1";
118     std::string message2     = "Message2";
119     bool        conditional1 = true;
120     bool        conditional2 = false;
121
122     MessageStringCollector messagesDirect;
123     MessageStringCollector messagesConditional;
124
125     messagesDirect.startContext(context1);
126     if (conditional1)
127     {
128         messagesDirect.append(message1.c_str());
129     }
130
131     if (conditional2)
132     {
133         messagesDirect.append(message2.c_str());
134     }
135
136     messagesDirect.finishContext();
137
138     messagesConditional.startContext(context1);
139     messagesConditional.appendIf(conditional1, message1.c_str());
140     messagesConditional.appendIf(conditional2, message2.c_str());
141     messagesConditional.finishContext();
142
143     EXPECT_EQ(messagesDirect.toString(), messagesConditional.toString());
144 }
145
146 TEST(MessageStringCollectorTest, CanAddStringMessagesConditionally)
147 {
148     std::string context1     = "Context1";
149     std::string message1     = "Message1";
150     std::string message2     = "Message2";
151     bool        conditional1 = true;
152     bool        conditional2 = false;
153
154     MessageStringCollector messagesDirect;
155     MessageStringCollector messagesConditional;
156
157     messagesDirect.startContext(context1);
158     if (conditional1)
159     {
160         messagesDirect.append(message1);
161     }
162
163     if (conditional2)
164     {
165         messagesDirect.append(message2);
166     }
167
168     messagesDirect.finishContext();
169
170     messagesConditional.startContext(context1);
171     messagesConditional.appendIf(conditional1, message1);
172     messagesConditional.appendIf(conditional2, message2);
173     messagesConditional.finishContext();
174
175     EXPECT_EQ(messagesDirect.toString(), messagesConditional.toString());
176 }
177
178 TEST(MessageStringCollectorTest, CanMoveConstruct)
179 {
180     MessageStringCollector first;
181     EXPECT_TRUE(first.isEmpty());
182     std::string message = "Message1";
183     first.append(message);
184     EXPECT_FALSE(first.isEmpty());
185     MessageStringCollector second(std::move(first));
186     // Now the only valid thing to do with first is to call the
187     // destructor.
188     EXPECT_FALSE(second.isEmpty());
189     EXPECT_EQ(second.toString(), message + "\n");
190 }
191
192 TEST(MessageStringCollectorTest, CanMoveAssign)
193 {
194     MessageStringCollector first, second;
195     EXPECT_TRUE(first.isEmpty());
196     EXPECT_TRUE(second.isEmpty());
197     std::string message = "Message1";
198     first.append(message);
199     EXPECT_FALSE(first.isEmpty());
200     second = std::move(first);
201     // Now the only valid thing to do with first is to call the
202     // destructor.
203     EXPECT_FALSE(second.isEmpty());
204     EXPECT_EQ(second.toString(), message + "\n");
205 }
206
207 } // namespace
208
209 } // namespace gmx