Merge release-4-6 into master
[alexxy/gromacs.git] / src / gromacs / options / tests / timeunitmanager.cpp
1 /*
2  *
3  *                This source code is part of
4  *
5  *                 G   R   O   M   A   C   S
6  *
7  *          GROningen MAchine for Chemical Simulations
8  *
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.
13
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.
18  *
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.
25  *
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.
28  *
29  * For more info, check our website at http://www.gromacs.org
30  */
31 /*! \internal \file
32  * \brief
33  * Tests handling of time units with gmx::TimeUnitManager.
34  *
35  * Also related functionality in gmx::DoubleOptionStorage is tested.
36  *
37  * \author Teemu Murtola <teemu.murtola@cbr.su.se>
38  * \ingroup module_options
39  */
40 #include <gtest/gtest.h>
41
42 #include "gromacs/options/basicoptions.h"
43 #include "gromacs/options/options.h"
44 #include "gromacs/options/optionsassigner.h"
45 #include "gromacs/options/timeunitmanager.h"
46
47 namespace
48 {
49
50 TEST(TimeUnitManagerTest, BasicOperations)
51 {
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());
59 }
60
61 TEST(TimeUnitManagerTest, ScalesAssignedOptionValue)
62 {
63     gmx::TimeUnitManager manager;
64
65     gmx::Options options(NULL, NULL);
66     double value = 0.0;
67     using gmx::DoubleOption;
68     ASSERT_NO_THROW(options.addOption(DoubleOption("p").store(&value).timeValue()));
69
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());
76
77     EXPECT_DOUBLE_EQ(1.5, value);
78     manager.setTimeUnit(gmx::eTimeUnit_ns);
79     manager.scaleTimeOptions(&options);
80     EXPECT_DOUBLE_EQ(1500, value);
81
82     EXPECT_NO_THROW(options.finish());
83
84     manager.setTimeUnit(gmx::eTimeUnit_us);
85     manager.scaleTimeOptions(&options);
86     EXPECT_DOUBLE_EQ(1500000, value);
87
88     manager.setTimeUnit(gmx::eTimeUnit_fs);
89     manager.scaleTimeOptions(&options);
90     EXPECT_DOUBLE_EQ(0.0015, value);
91
92     manager.setTimeUnit(gmx::eTimeUnit_ps);
93     manager.scaleTimeOptions(&options);
94     EXPECT_DOUBLE_EQ(1.5, value);
95 }
96
97 TEST(TimeUnitManagerTest, DoesNotScaleDefaultValues)
98 {
99     gmx::TimeUnitManager manager;
100
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)));
107
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());
114
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);
120 }
121
122 TEST(TimeUnitManagerTest, ScalesUserInputWithMultipleSources)
123 {
124     gmx::TimeUnitManager manager;
125
126     gmx::Options options(NULL, NULL);
127     double value = 0.0;
128     using gmx::DoubleOption;
129     ASSERT_NO_THROW(options.addOption(DoubleOption("p").store(&value).timeValue()));
130
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());
141
142     EXPECT_DOUBLE_EQ(1.5, value);
143     manager.setTimeUnit(gmx::eTimeUnit_ns);
144     manager.scaleTimeOptions(&options);
145     EXPECT_DOUBLE_EQ(1500, value);
146 }
147
148 TEST(TimeUnitManagerTest, TimeUnitOptionWorks)
149 {
150     gmx::TimeUnitManager manager;
151
152     gmx::Options options(NULL, NULL);
153     double value = 0.0;
154     using gmx::DoubleOption;
155     ASSERT_NO_THROW(options.addOption(DoubleOption("p").store(&value).timeValue()));
156     ASSERT_NO_THROW(manager.addTimeUnitOption(&options, "tu"));
157
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());
167
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);
172
173     EXPECT_NO_THROW(options.finish());
174 }
175
176 } // namespace