3 * This source code is part of
7 * GROningen MAchine for Chemical Simulations
9 * Written by David van der Spoel, Erik Lindahl, Berk Hess, and others.
10 * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
11 * Copyright (c) 2001-2009, The GROMACS development team,
12 * check out http://www.gromacs.org for more information.
14 * This program is free software; you can redistribute it and/or
15 * modify it under the terms of the GNU General Public License
16 * as published by the Free Software Foundation; either version 2
17 * of the License, or (at your option) any later version.
19 * If you want to redistribute modifications, please consider that
20 * scientific software is very special. Version control is crucial -
21 * bugs must be traceable. We will be happy to consider code for
22 * inclusion in the official distribution, but derived work must not
23 * be called official GROMACS. Details are found in the README & COPYING
24 * files - if they are missing, get the official version at www.gromacs.org.
26 * To help us fund GROMACS development, we humbly ask that you cite
27 * the papers on the package - you can find them in the top README file.
29 * For more info, check our website at http://www.gromacs.org
33 * Tests handling of time units with gmx::TimeUnitManager.
35 * Also related functionality in gmx::DoubleOptionStorage is tested.
37 * \author Teemu Murtola <teemu.murtola@cbr.su.se>
38 * \ingroup module_options
40 #include <gtest/gtest.h>
42 #include "gromacs/options/basicoptions.h"
43 #include "gromacs/options/options.h"
44 #include "gromacs/options/optionsassigner.h"
45 #include "gromacs/options/timeunitmanager.h"
50 TEST(TimeUnitManagerTest, BasicOperations)
52 gmx::TimeUnitManager manager;
53 EXPECT_EQ(gmx::eTimeUnit_ps, manager.timeUnit());
54 EXPECT_DOUBLE_EQ(1.0, manager.timeScaleFactor());
55 manager.setTimeUnit(gmx::eTimeUnit_ns);
56 EXPECT_EQ(gmx::eTimeUnit_ns, manager.timeUnit());
57 EXPECT_DOUBLE_EQ(1e3, manager.timeScaleFactor());
58 EXPECT_DOUBLE_EQ(1e-3, manager.inverseTimeScaleFactor());
61 TEST(TimeUnitManagerTest, ScalesAssignedOptionValue)
63 gmx::TimeUnitManager manager;
65 gmx::Options options(NULL, NULL);
67 using gmx::DoubleOption;
68 ASSERT_NO_THROW(options.addOption(DoubleOption("p").store(&value).timeValue()));
70 gmx::OptionsAssigner assigner(&options);
71 EXPECT_NO_THROW(assigner.start());
72 ASSERT_NO_THROW(assigner.startOption("p"));
73 ASSERT_NO_THROW(assigner.appendValue("1.5"));
74 EXPECT_NO_THROW(assigner.finishOption());
75 EXPECT_NO_THROW(assigner.finish());
77 EXPECT_DOUBLE_EQ(1.5, value);
78 manager.setTimeUnit(gmx::eTimeUnit_ns);
79 manager.scaleTimeOptions(&options);
80 EXPECT_DOUBLE_EQ(1500, value);
82 EXPECT_NO_THROW(options.finish());
84 manager.setTimeUnit(gmx::eTimeUnit_us);
85 manager.scaleTimeOptions(&options);
86 EXPECT_DOUBLE_EQ(1500000, value);
88 manager.setTimeUnit(gmx::eTimeUnit_fs);
89 manager.scaleTimeOptions(&options);
90 EXPECT_DOUBLE_EQ(0.0015, value);
92 manager.setTimeUnit(gmx::eTimeUnit_ps);
93 manager.scaleTimeOptions(&options);
94 EXPECT_DOUBLE_EQ(1.5, value);
97 TEST(TimeUnitManagerTest, DoesNotScaleDefaultValues)
99 gmx::TimeUnitManager manager;
101 gmx::Options options(NULL, NULL);
102 double value = 1.5, value2 = 0.0;
103 using gmx::DoubleOption;
104 ASSERT_NO_THROW(options.addOption(DoubleOption("p").store(&value).timeValue()));
105 ASSERT_NO_THROW(options.addOption(DoubleOption("q").store(&value2).timeValue()
106 .defaultValueIfSet(2.5)));
108 gmx::OptionsAssigner assigner(&options);
109 EXPECT_NO_THROW(assigner.start());
110 ASSERT_NO_THROW(assigner.startOption("q"));
111 EXPECT_NO_THROW(assigner.finishOption());
112 EXPECT_NO_THROW(assigner.finish());
113 EXPECT_NO_THROW(options.finish());
115 EXPECT_DOUBLE_EQ(2.5, value2);
116 manager.setTimeUnit(gmx::eTimeUnit_ns);
117 manager.scaleTimeOptions(&options);
118 EXPECT_DOUBLE_EQ(1.5, value);
119 EXPECT_DOUBLE_EQ(2.5, value2);
122 TEST(TimeUnitManagerTest, ScalesUserInputWithMultipleSources)
124 gmx::TimeUnitManager manager;
126 gmx::Options options(NULL, NULL);
128 using gmx::DoubleOption;
129 ASSERT_NO_THROW(options.addOption(DoubleOption("p").store(&value).timeValue()));
131 gmx::OptionsAssigner assigner(&options);
132 EXPECT_NO_THROW(assigner.start());
133 ASSERT_NO_THROW(assigner.startOption("p"));
134 ASSERT_NO_THROW(assigner.appendValue("1.5"));
135 EXPECT_NO_THROW(assigner.finishOption());
136 EXPECT_NO_THROW(assigner.finish());
137 gmx::OptionsAssigner assigner2(&options);
138 EXPECT_NO_THROW(assigner2.start());
139 EXPECT_NO_THROW(assigner2.finish());
140 EXPECT_NO_THROW(options.finish());
142 EXPECT_DOUBLE_EQ(1.5, value);
143 manager.setTimeUnit(gmx::eTimeUnit_ns);
144 manager.scaleTimeOptions(&options);
145 EXPECT_DOUBLE_EQ(1500, value);
148 TEST(TimeUnitManagerTest, TimeUnitOptionWorks)
150 gmx::TimeUnitManager manager;
152 gmx::Options options(NULL, NULL);
154 using gmx::DoubleOption;
155 ASSERT_NO_THROW(options.addOption(DoubleOption("p").store(&value).timeValue()));
156 ASSERT_NO_THROW(manager.addTimeUnitOption(&options, "tu"));
158 gmx::OptionsAssigner assigner(&options);
159 EXPECT_NO_THROW(assigner.start());
160 ASSERT_NO_THROW(assigner.startOption("p"));
161 ASSERT_NO_THROW(assigner.appendValue("1.5"));
162 EXPECT_NO_THROW(assigner.finishOption());
163 ASSERT_NO_THROW(assigner.startOption("tu"));
164 ASSERT_NO_THROW(assigner.appendValue("ns"));
165 EXPECT_NO_THROW(assigner.finishOption());
166 EXPECT_NO_THROW(assigner.finish());
168 EXPECT_DOUBLE_EQ(1.5, value);
169 EXPECT_EQ(gmx::eTimeUnit_ns, manager.timeUnit());
170 manager.scaleTimeOptions(&options);
171 EXPECT_DOUBLE_EQ(1500, value);
173 EXPECT_NO_THROW(options.finish());