SYCL: Avoid using no_init read accessor in rocFFT
[alexxy/gromacs.git] / src / gromacs / options / tests / timeunitmanager.cpp
1 /*
2  * This file is part of the GROMACS molecular simulation package.
3  *
4  * Copyright (c) 2012,2013,2014,2015,2016 by the GROMACS development team.
5  * Copyright (c) 2019,2020, by the GROMACS development team, led by
6  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
7  * and including many others, as listed in the AUTHORS file in the
8  * top-level source directory and at http://www.gromacs.org.
9  *
10  * GROMACS is free software; you can redistribute it and/or
11  * modify it under the terms of the GNU Lesser General Public License
12  * as published by the Free Software Foundation; either version 2.1
13  * of the License, or (at your option) any later version.
14  *
15  * GROMACS is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
18  * Lesser General Public License for more details.
19  *
20  * You should have received a copy of the GNU Lesser General Public
21  * License along with GROMACS; if not, see
22  * http://www.gnu.org/licenses, or write to the Free Software Foundation,
23  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA.
24  *
25  * If you want to redistribute modifications to GROMACS, please
26  * consider that scientific software is very special. Version
27  * control is crucial - bugs must be traceable. We will be happy to
28  * consider code for inclusion in the official distribution, but
29  * derived work must not be called official GROMACS. Details are found
30  * in the README & COPYING files - if they are missing, get the
31  * official version at http://www.gromacs.org.
32  *
33  * To help us fund GROMACS development, we humbly ask that you cite
34  * the research papers on the package. Check out http://www.gromacs.org.
35  */
36 /*! \internal \file
37  * \brief
38  * Tests handling of time units with gmx::TimeUnitManager and
39  * gmx::TimeUnitBehavior.
40  *
41  * Also related functionality in gmx::DoubleOptionStorage is tested.
42  *
43  * \author Teemu Murtola <teemu.murtola@gmail.com>
44  * \ingroup module_options
45  */
46 #include "gmxpre.h"
47
48 #include "gromacs/options/timeunitmanager.h"
49
50 #include <gtest/gtest.h>
51
52 #include "gromacs/options/basicoptions.h"
53 #include "gromacs/options/options.h"
54 #include "gromacs/options/optionsassigner.h"
55
56 #include "testutils/testasserts.h"
57
58 namespace
59 {
60
61 TEST(TimeUnitManagerTest, BasicOperations)
62 {
63     gmx::TimeUnitManager manager;
64     EXPECT_EQ(gmx::TimeUnit::Picoseconds, manager.timeUnit());
65     EXPECT_DOUBLE_EQ(1.0, manager.timeScaleFactor());
66     manager.setTimeUnit(gmx::TimeUnit::Nanoseconds);
67     EXPECT_EQ(gmx::TimeUnit::Nanoseconds, manager.timeUnit());
68     EXPECT_DOUBLE_EQ(1e3, manager.timeScaleFactor());
69     EXPECT_DOUBLE_EQ(1e-3, manager.inverseTimeScaleFactor());
70 }
71
72 TEST(TimeUnitBehaviorTest, ScalesAssignedOptionValue)
73 {
74     gmx::TimeUnitBehavior behavior;
75
76     gmx::Options options;
77     double       value = 0.0;
78     using gmx::DoubleOption;
79     ASSERT_NO_THROW_GMX(options.addOption(DoubleOption("p").store(&value).timeValue()));
80
81     gmx::OptionsAssigner assigner(&options);
82     EXPECT_NO_THROW_GMX(assigner.start());
83     ASSERT_NO_THROW_GMX(assigner.startOption("p"));
84     ASSERT_NO_THROW_GMX(assigner.appendValue("1.5"));
85     EXPECT_NO_THROW_GMX(assigner.finishOption());
86     EXPECT_NO_THROW_GMX(assigner.finish());
87
88     EXPECT_DOUBLE_EQ(1.5, value);
89     behavior.setTimeUnit(gmx::TimeUnit::Nanoseconds);
90     behavior.optionsFinishing(&options);
91     EXPECT_DOUBLE_EQ(1500, value);
92
93     EXPECT_NO_THROW_GMX(options.finish());
94
95     behavior.setTimeUnit(gmx::TimeUnit::Microseconds);
96     behavior.optionsFinishing(&options);
97     EXPECT_DOUBLE_EQ(1500000, value);
98
99     behavior.setTimeUnit(gmx::TimeUnit::Femtoseconds);
100     behavior.optionsFinishing(&options);
101     EXPECT_DOUBLE_EQ(0.0015, value);
102
103     behavior.setTimeUnit(gmx::TimeUnit::Picoseconds);
104     behavior.optionsFinishing(&options);
105     EXPECT_DOUBLE_EQ(1.5, value);
106 }
107
108 TEST(TimeUnitBehaviorTest, DoesNotScaleDefaultValues)
109 {
110     gmx::TimeUnitBehavior behavior;
111
112     gmx::Options options;
113     double       value = 1.5, value2 = 0.0;
114     using gmx::DoubleOption;
115     ASSERT_NO_THROW_GMX(options.addOption(DoubleOption("p").store(&value).timeValue()));
116     ASSERT_NO_THROW_GMX(
117             options.addOption(DoubleOption("q").store(&value2).timeValue().defaultValueIfSet(2.5)));
118
119     gmx::OptionsAssigner assigner(&options);
120     EXPECT_NO_THROW_GMX(assigner.start());
121     ASSERT_NO_THROW_GMX(assigner.startOption("q"));
122     EXPECT_NO_THROW_GMX(assigner.finishOption());
123     EXPECT_NO_THROW_GMX(assigner.finish());
124     EXPECT_NO_THROW_GMX(options.finish());
125
126     EXPECT_DOUBLE_EQ(2.5, value2);
127     behavior.setTimeUnit(gmx::TimeUnit::Nanoseconds);
128     behavior.optionsFinishing(&options);
129     EXPECT_DOUBLE_EQ(1.5, value);
130     EXPECT_DOUBLE_EQ(2.5, value2);
131 }
132
133 TEST(TimeUnitBehaviorTest, ScalesUserInputWithMultipleSources)
134 {
135     gmx::TimeUnitBehavior behavior;
136
137     gmx::Options options;
138     double       value = 0.0;
139     using gmx::DoubleOption;
140     ASSERT_NO_THROW_GMX(options.addOption(DoubleOption("p").store(&value).timeValue()));
141
142     gmx::OptionsAssigner assigner(&options);
143     EXPECT_NO_THROW_GMX(assigner.start());
144     ASSERT_NO_THROW_GMX(assigner.startOption("p"));
145     ASSERT_NO_THROW_GMX(assigner.appendValue("1.5"));
146     EXPECT_NO_THROW_GMX(assigner.finishOption());
147     EXPECT_NO_THROW_GMX(assigner.finish());
148     gmx::OptionsAssigner assigner2(&options);
149     EXPECT_NO_THROW_GMX(assigner2.start());
150     EXPECT_NO_THROW_GMX(assigner2.finish());
151     EXPECT_NO_THROW_GMX(options.finish());
152
153     EXPECT_DOUBLE_EQ(1.5, value);
154     behavior.setTimeUnit(gmx::TimeUnit::Nanoseconds);
155     behavior.optionsFinishing(&options);
156     EXPECT_DOUBLE_EQ(1500, value);
157 }
158
159 TEST(TimeUnitBehaviorTest, TimeUnitOptionWorks)
160 {
161     gmx::TimeUnitBehavior behavior;
162
163     gmx::Options options;
164     double       value = 0.0;
165     using gmx::DoubleOption;
166     ASSERT_NO_THROW_GMX(options.addOption(DoubleOption("p").store(&value).timeValue()));
167     ASSERT_NO_THROW_GMX(behavior.addTimeUnitOption(&options, "tu"));
168
169     gmx::OptionsAssigner assigner(&options);
170     EXPECT_NO_THROW_GMX(assigner.start());
171     ASSERT_NO_THROW_GMX(assigner.startOption("p"));
172     ASSERT_NO_THROW_GMX(assigner.appendValue("1.5"));
173     EXPECT_NO_THROW_GMX(assigner.finishOption());
174     ASSERT_NO_THROW_GMX(assigner.startOption("tu"));
175     ASSERT_NO_THROW_GMX(assigner.appendValue("ns"));
176     EXPECT_NO_THROW_GMX(assigner.finishOption());
177     EXPECT_NO_THROW_GMX(assigner.finish());
178
179     EXPECT_DOUBLE_EQ(1.5, value);
180     EXPECT_EQ(gmx::TimeUnit::Nanoseconds, behavior.timeUnit());
181     behavior.optionsFinishing(&options);
182     EXPECT_DOUBLE_EQ(1500, value);
183
184     EXPECT_NO_THROW_GMX(options.finish());
185 }
186
187 } // namespace