2 * This file is part of the GROMACS molecular simulation package.
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.
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.
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.
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.
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.
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.
38 * Tests handling of time units with gmx::TimeUnitManager and
39 * gmx::TimeUnitBehavior.
41 * Also related functionality in gmx::DoubleOptionStorage is tested.
43 * \author Teemu Murtola <teemu.murtola@gmail.com>
44 * \ingroup module_options
48 #include "gromacs/options/timeunitmanager.h"
50 #include <gtest/gtest.h>
52 #include "gromacs/options/basicoptions.h"
53 #include "gromacs/options/options.h"
54 #include "gromacs/options/optionsassigner.h"
56 #include "testutils/testasserts.h"
61 TEST(TimeUnitManagerTest, BasicOperations)
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());
72 TEST(TimeUnitBehaviorTest, ScalesAssignedOptionValue)
74 gmx::TimeUnitBehavior behavior;
78 using gmx::DoubleOption;
79 ASSERT_NO_THROW_GMX(options.addOption(DoubleOption("p").store(&value).timeValue()));
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());
88 EXPECT_DOUBLE_EQ(1.5, value);
89 behavior.setTimeUnit(gmx::TimeUnit::Nanoseconds);
90 behavior.optionsFinishing(&options);
91 EXPECT_DOUBLE_EQ(1500, value);
93 EXPECT_NO_THROW_GMX(options.finish());
95 behavior.setTimeUnit(gmx::TimeUnit::Microseconds);
96 behavior.optionsFinishing(&options);
97 EXPECT_DOUBLE_EQ(1500000, value);
99 behavior.setTimeUnit(gmx::TimeUnit::Femtoseconds);
100 behavior.optionsFinishing(&options);
101 EXPECT_DOUBLE_EQ(0.0015, value);
103 behavior.setTimeUnit(gmx::TimeUnit::Picoseconds);
104 behavior.optionsFinishing(&options);
105 EXPECT_DOUBLE_EQ(1.5, value);
108 TEST(TimeUnitBehaviorTest, DoesNotScaleDefaultValues)
110 gmx::TimeUnitBehavior behavior;
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()));
117 options.addOption(DoubleOption("q").store(&value2).timeValue().defaultValueIfSet(2.5)));
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());
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);
133 TEST(TimeUnitBehaviorTest, ScalesUserInputWithMultipleSources)
135 gmx::TimeUnitBehavior behavior;
137 gmx::Options options;
139 using gmx::DoubleOption;
140 ASSERT_NO_THROW_GMX(options.addOption(DoubleOption("p").store(&value).timeValue()));
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());
153 EXPECT_DOUBLE_EQ(1.5, value);
154 behavior.setTimeUnit(gmx::TimeUnit::Nanoseconds);
155 behavior.optionsFinishing(&options);
156 EXPECT_DOUBLE_EQ(1500, value);
159 TEST(TimeUnitBehaviorTest, TimeUnitOptionWorks)
161 gmx::TimeUnitBehavior behavior;
163 gmx::Options options;
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"));
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());
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);
184 EXPECT_NO_THROW_GMX(options.finish());