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 option assignment.
35 * In addition to testing gmx::OptionsAssigner, these are the main
36 * tests for the classes from basicoptions.h and basicoptionstorage.h (and
37 * their base classes) that actually implement the behavior, as well as for the
38 * internal implementation of the gmx::Options and gmx::AbstractOptionStorage
41 * \author Teemu Murtola <teemu.murtola@cbr.su.se>
42 * \ingroup module_options
47 #include <gtest/gtest.h>
49 #include "gromacs/options/basicoptions.h"
50 #include "gromacs/options/options.h"
51 #include "gromacs/options/optionsassigner.h"
52 #include "gromacs/utility/exceptions.h"
53 #include "gromacs/utility/stringutil.h"
58 /********************************************************************
59 * General assignment tests
62 TEST(OptionsAssignerTest, HandlesMissingRequiredParameter)
64 gmx::Options options(NULL, NULL);
66 using gmx::IntegerOption;
67 ASSERT_NO_THROW(options.addOption(
68 IntegerOption("p").store(&value).required()));
70 EXPECT_THROW(options.finish(), gmx::InvalidInputError);
73 TEST(OptionsAssignerTest, HandlesInvalidMultipleParameter)
75 gmx::Options options(NULL, NULL);
76 std::vector<int> values;
77 using gmx::IntegerOption;
78 ASSERT_NO_THROW(options.addOption(
79 IntegerOption("p").storeVector(&values).multiValue()));
81 gmx::OptionsAssigner assigner(&options);
82 EXPECT_NO_THROW(assigner.start());
83 ASSERT_NO_THROW(assigner.startOption("p"));
84 ASSERT_NO_THROW(assigner.appendValue("1"));
85 ASSERT_NO_THROW(assigner.finishOption());
86 EXPECT_THROW(assigner.startOption("p"), gmx::InvalidInputError);
87 EXPECT_NO_THROW(assigner.finish());
88 EXPECT_NO_THROW(options.finish());
90 EXPECT_TRUE(options.isSet("p"));
91 ASSERT_EQ(1U, values.size());
92 EXPECT_EQ(1, values[0]);
95 TEST(OptionsAssignerTest, HandlesMultipleParameter)
97 gmx::Options options(NULL, NULL);
98 std::vector<int> values;
99 using gmx::IntegerOption;
100 ASSERT_NO_THROW(options.addOption(
101 IntegerOption("p").storeVector(&values).allowMultiple()));
103 gmx::OptionsAssigner assigner(&options);
104 EXPECT_NO_THROW(assigner.start());
105 ASSERT_NO_THROW(assigner.startOption("p"));
106 ASSERT_NO_THROW(assigner.appendValue("1"));
107 EXPECT_NO_THROW(assigner.finishOption());
108 ASSERT_NO_THROW(assigner.startOption("p"));
109 ASSERT_NO_THROW(assigner.appendValue("2"));
110 EXPECT_NO_THROW(assigner.finishOption());
111 EXPECT_NO_THROW(assigner.finish());
112 EXPECT_NO_THROW(options.finish());
114 EXPECT_TRUE(options.isSet("p"));
115 ASSERT_EQ(2U, values.size());
116 EXPECT_EQ(1, values[0]);
117 EXPECT_EQ(2, values[1]);
120 TEST(OptionsAssignerTest, HandlesMissingValue)
122 gmx::Options options(NULL, NULL);
123 int value1 = 0, value2 = 0;
124 using gmx::IntegerOption;
125 ASSERT_NO_THROW(options.addOption(IntegerOption("p").store(&value1)));
126 ASSERT_NO_THROW(options.addOption(IntegerOption("q").store(&value2)));
128 gmx::OptionsAssigner assigner(&options);
129 EXPECT_NO_THROW(assigner.start());
130 ASSERT_NO_THROW(assigner.startOption("p"));
131 EXPECT_THROW(assigner.finishOption(), gmx::InvalidInputError);
132 ASSERT_NO_THROW(assigner.startOption("q"));
133 ASSERT_NO_THROW(assigner.appendValue("2"));
134 EXPECT_NO_THROW(assigner.finishOption());
135 EXPECT_NO_THROW(assigner.finish());
136 EXPECT_NO_THROW(options.finish());
138 EXPECT_EQ(2, value2);
141 TEST(OptionsAssignerTest, HandlesExtraValue)
143 gmx::Options options(NULL, NULL);
145 using gmx::IntegerOption;
146 ASSERT_NO_THROW(options.addOption(IntegerOption("p").store(&value1)));
148 gmx::OptionsAssigner assigner(&options);
149 EXPECT_NO_THROW(assigner.start());
150 ASSERT_NO_THROW(assigner.startOption("p"));
151 ASSERT_NO_THROW(assigner.appendValue("2"));
152 EXPECT_THROW(assigner.appendValue("3"), gmx::InvalidInputError);
153 EXPECT_NO_THROW(assigner.finishOption());
154 EXPECT_NO_THROW(assigner.finish());
155 EXPECT_NO_THROW(options.finish());
157 EXPECT_EQ(0, value1);
160 TEST(OptionsAssignerTest, HandlesSubSections)
162 gmx::Options options(NULL, NULL);
163 gmx::Options sub1("section1", NULL);
164 gmx::Options sub2("section2", NULL);
168 using gmx::IntegerOption;
169 ASSERT_NO_THROW(options.addOption(IntegerOption("p").store(&value)));
170 ASSERT_NO_THROW(sub1.addOption(IntegerOption("p").store(&value1)));
171 ASSERT_NO_THROW(sub2.addOption(IntegerOption("p").store(&value2)));
172 ASSERT_NO_THROW(options.addSubSection(&sub1));
173 ASSERT_NO_THROW(options.addSubSection(&sub2));
175 gmx::OptionsAssigner assigner(&options);
176 EXPECT_NO_THROW(assigner.start());
177 ASSERT_NO_THROW(assigner.startSubSection("section1"));
178 ASSERT_NO_THROW(assigner.startOption("p"));
179 EXPECT_NO_THROW(assigner.appendValue("5"));
180 EXPECT_NO_THROW(assigner.finishOption());
181 EXPECT_NO_THROW(assigner.finishSubSection());
182 ASSERT_NO_THROW(assigner.startOption("p"));
183 EXPECT_NO_THROW(assigner.appendValue("4"));
184 EXPECT_NO_THROW(assigner.finishOption());
185 ASSERT_NO_THROW(assigner.startSubSection("section2"));
186 ASSERT_NO_THROW(assigner.startOption("p"));
187 EXPECT_NO_THROW(assigner.appendValue("6"));
188 EXPECT_NO_THROW(assigner.finishOption());
189 EXPECT_NO_THROW(assigner.finishSubSection());
190 EXPECT_NO_THROW(assigner.finish());
191 EXPECT_NO_THROW(options.finish());
194 EXPECT_EQ(5, value1);
195 EXPECT_EQ(6, value2);
198 TEST(OptionsAssignerTest, HandlesNoStrictSubSections)
200 gmx::Options options(NULL, NULL);
201 gmx::Options sub1("section1", NULL);
202 gmx::Options sub2("section2", NULL);
208 using gmx::IntegerOption;
209 ASSERT_NO_THROW(options.addOption(IntegerOption("p").store(&pvalue)));
210 ASSERT_NO_THROW(sub1.addOption(IntegerOption("p").store(&pvalue1)));
211 ASSERT_NO_THROW(sub1.addOption(IntegerOption("q").store(&qvalue)));
212 ASSERT_NO_THROW(sub2.addOption(IntegerOption("p").store(&pvalue2)));
213 ASSERT_NO_THROW(sub2.addOption(IntegerOption("r").store(&rvalue)));
214 ASSERT_NO_THROW(options.addSubSection(&sub1));
215 ASSERT_NO_THROW(options.addSubSection(&sub2));
217 gmx::OptionsAssigner assigner(&options);
218 assigner.setNoStrictSectioning(true);
219 EXPECT_NO_THROW(assigner.start());
220 ASSERT_NO_THROW(assigner.startOption("q"));
221 EXPECT_NO_THROW(assigner.appendValue("6"));
222 EXPECT_NO_THROW(assigner.finishOption());
223 ASSERT_NO_THROW(assigner.startOption("p"));
224 EXPECT_NO_THROW(assigner.appendValue("7"));
225 EXPECT_NO_THROW(assigner.finishOption());
226 ASSERT_NO_THROW(assigner.startOption("r"));
227 EXPECT_NO_THROW(assigner.appendValue("8"));
228 EXPECT_NO_THROW(assigner.finishOption());
229 ASSERT_NO_THROW(assigner.startOption("p"));
230 EXPECT_NO_THROW(assigner.appendValue("9"));
231 EXPECT_NO_THROW(assigner.finishOption());
232 EXPECT_NO_THROW(assigner.finishSubSection());
233 ASSERT_NO_THROW(assigner.startOption("p"));
234 EXPECT_NO_THROW(assigner.appendValue("10"));
235 EXPECT_NO_THROW(assigner.finishOption());
236 EXPECT_NO_THROW(assigner.finish());
237 EXPECT_NO_THROW(options.finish());
239 EXPECT_EQ(6, qvalue);
240 EXPECT_EQ(7, pvalue1);
241 EXPECT_EQ(8, rvalue);
242 EXPECT_EQ(9, pvalue2);
243 EXPECT_EQ(10, pvalue);
246 TEST(OptionsAssignerTest, HandlesMultipleSources)
248 gmx::Options options(NULL, NULL);
250 using gmx::IntegerOption;
251 ASSERT_NO_THROW(options.addOption(IntegerOption("p").store(&value)));
254 gmx::OptionsAssigner assigner(&options);
255 EXPECT_NO_THROW(assigner.start());
256 ASSERT_NO_THROW(assigner.startOption("p"));
257 EXPECT_NO_THROW(assigner.appendValue("1"));
258 EXPECT_NO_THROW(assigner.finishOption());
259 EXPECT_NO_THROW(assigner.finish());
262 gmx::OptionsAssigner assigner2(&options);
263 EXPECT_NO_THROW(assigner2.start());
264 ASSERT_NO_THROW(assigner2.startOption("p"));
265 EXPECT_NO_THROW(assigner2.appendValue("2"));
266 EXPECT_NO_THROW(assigner2.finishOption());
267 EXPECT_NO_THROW(assigner2.finish());
269 EXPECT_NO_THROW(options.finish());
275 /********************************************************************
276 * Tests for boolean assignment
279 TEST(OptionsAssignerBooleanTest, StoresYesValue)
281 gmx::Options options(NULL, NULL);
283 using gmx::BooleanOption;
284 ASSERT_NO_THROW(options.addOption(BooleanOption("p").store(&value)));
286 gmx::OptionsAssigner assigner(&options);
287 EXPECT_NO_THROW(assigner.start());
288 ASSERT_NO_THROW(assigner.startOption("p"));
289 EXPECT_NO_THROW(assigner.appendValue("yes"));
290 EXPECT_NO_THROW(assigner.finishOption());
291 EXPECT_NO_THROW(assigner.finish());
292 EXPECT_NO_THROW(options.finish());
297 TEST(OptionsAssignerBooleanTest, SetsBooleanWithoutExplicitValue)
299 gmx::Options options(NULL, NULL);
301 using gmx::BooleanOption;
302 ASSERT_NO_THROW(options.addOption(BooleanOption("p").store(&value)));
304 gmx::OptionsAssigner assigner(&options);
305 EXPECT_NO_THROW(assigner.start());
306 ASSERT_NO_THROW(assigner.startOption("p"));
307 EXPECT_NO_THROW(assigner.finishOption());
308 EXPECT_NO_THROW(assigner.finish());
309 EXPECT_NO_THROW(options.finish());
314 TEST(OptionsAssignerBooleanTest, ClearsBooleanWithPrefixNo)
316 gmx::Options options(NULL, NULL);
318 using gmx::BooleanOption;
319 ASSERT_NO_THROW(options.addOption(BooleanOption("p").store(&value)));
321 gmx::OptionsAssigner assigner(&options);
322 assigner.setAcceptBooleanNoPrefix(true);
323 EXPECT_NO_THROW(assigner.start());
324 ASSERT_NO_THROW(assigner.startOption("nop"));
325 EXPECT_NO_THROW(assigner.finishOption());
326 EXPECT_NO_THROW(assigner.finish());
327 EXPECT_NO_THROW(options.finish());
332 TEST(OptionsAssignerBooleanTest, HandlesBooleanWithPrefixAndValue)
334 gmx::Options options(NULL, NULL);
336 using gmx::BooleanOption;
337 ASSERT_NO_THROW(options.addOption(BooleanOption("p").store(&value)));
339 gmx::OptionsAssigner assigner(&options);
340 assigner.setAcceptBooleanNoPrefix(true);
341 EXPECT_NO_THROW(assigner.start());
342 ASSERT_NO_THROW(assigner.startOption("nop"));
343 // It's OK to fail, but if it doesn't, it should work.
346 assigner.appendValue("no");
347 assigner.finishOption();
348 EXPECT_NO_THROW(assigner.finish());
351 catch (const gmx::InvalidInputError &)
357 /********************************************************************
358 * Tests for integer assignment
360 * These tests also contain tests for general default value handling.
363 TEST(OptionsAssignerIntegerTest, StoresSingleValue)
365 gmx::Options options(NULL, NULL);
367 using gmx::IntegerOption;
368 ASSERT_NO_THROW(options.addOption(IntegerOption("p").store(&value)));
370 gmx::OptionsAssigner assigner(&options);
371 EXPECT_NO_THROW(assigner.start());
372 ASSERT_NO_THROW(assigner.startOption("p"));
373 ASSERT_NO_THROW(assigner.appendValue("3"));
374 EXPECT_NO_THROW(assigner.finishOption());
375 EXPECT_NO_THROW(assigner.finish());
376 EXPECT_NO_THROW(options.finish());
381 TEST(OptionsAssignerIntegerTest, HandlesEmptyValue)
383 gmx::Options options(NULL, NULL);
385 using gmx::IntegerOption;
386 ASSERT_NO_THROW(options.addOption(IntegerOption("p").store(&value)));
388 gmx::OptionsAssigner assigner(&options);
389 EXPECT_NO_THROW(assigner.start());
390 ASSERT_NO_THROW(assigner.startOption("p"));
391 EXPECT_THROW(assigner.appendValue(""), gmx::InvalidInputError);
392 EXPECT_NO_THROW(assigner.finishOption());
393 EXPECT_NO_THROW(assigner.finish());
394 EXPECT_NO_THROW(options.finish());
399 TEST(OptionsAssignerIntegerTest, HandlesInvalidValue)
401 gmx::Options options(NULL, NULL);
403 using gmx::IntegerOption;
404 ASSERT_NO_THROW(options.addOption(IntegerOption("p").store(&value)));
406 gmx::OptionsAssigner assigner(&options);
407 EXPECT_NO_THROW(assigner.start());
408 ASSERT_NO_THROW(assigner.startOption("p"));
409 EXPECT_THROW(assigner.appendValue("2abc"), gmx::InvalidInputError);
410 EXPECT_NO_THROW(assigner.finishOption());
411 EXPECT_NO_THROW(assigner.finish());
412 EXPECT_NO_THROW(options.finish());
417 TEST(OptionsAssignerIntegerTest, HandlesOverflow)
419 gmx::Options options(NULL, NULL);
421 using gmx::IntegerOption;
422 ASSERT_NO_THROW(options.addOption(IntegerOption("p").store(&value)));
424 gmx::OptionsAssigner assigner(&options);
425 EXPECT_NO_THROW(assigner.start());
426 ASSERT_NO_THROW(assigner.startOption("p"));
427 std::string overflowValue(
428 gmx::formatString("%d0000", std::numeric_limits<int>::max()));
429 EXPECT_THROW(assigner.appendValue(overflowValue), gmx::InvalidInputError);
430 EXPECT_NO_THROW(assigner.finishOption());
431 EXPECT_NO_THROW(assigner.finish());
432 EXPECT_NO_THROW(options.finish());
437 TEST(OptionsAssignerIntegerTest, StoresDefaultValue)
439 gmx::Options options(NULL, NULL);
441 using gmx::IntegerOption;
442 ASSERT_NO_THROW(options.addOption(
443 IntegerOption("p").store(&value).defaultValue(2)));
446 gmx::OptionsAssigner assigner(&options);
447 EXPECT_NO_THROW(assigner.start());
448 EXPECT_NO_THROW(assigner.finish());
449 EXPECT_NO_THROW(options.finish());
454 TEST(OptionsAssignerIntegerTest, StoresDefaultValueIfSet)
456 gmx::Options options(NULL, NULL);
458 using gmx::IntegerOption;
459 ASSERT_NO_THROW(options.addOption(
460 IntegerOption("p").store(&value).defaultValueIfSet(2)));
461 EXPECT_EQ(-1, value);
463 gmx::OptionsAssigner assigner(&options);
464 EXPECT_NO_THROW(assigner.start());
465 ASSERT_NO_THROW(assigner.startOption("p"));
466 EXPECT_NO_THROW(assigner.finishOption());
467 EXPECT_NO_THROW(assigner.finish());
468 EXPECT_NO_THROW(options.finish());
473 TEST(OptionsAssignerIntegerTest, HandlesDefaultValueIfSetWhenNotSet)
475 gmx::Options options(NULL, NULL);
477 using gmx::IntegerOption;
478 ASSERT_NO_THROW(options.addOption(
479 IntegerOption("p").store(&value).defaultValueIfSet(2)));
480 EXPECT_EQ(-1, value);
482 gmx::OptionsAssigner assigner(&options);
483 EXPECT_NO_THROW(assigner.start());
484 EXPECT_NO_THROW(assigner.finish());
485 EXPECT_NO_THROW(options.finish());
487 EXPECT_EQ(-1, value);
490 TEST(OptionsAssignerIntegerTest, HandlesBothDefaultValues)
492 gmx::Options options(NULL, NULL);
494 using gmx::IntegerOption;
495 ASSERT_NO_THROW(options.addOption(
496 IntegerOption("p").store(&value)
497 .defaultValue(1).defaultValueIfSet(2)));
500 gmx::OptionsAssigner assigner(&options);
501 EXPECT_NO_THROW(assigner.start());
502 ASSERT_NO_THROW(assigner.startOption("p"));
503 EXPECT_NO_THROW(assigner.finishOption());
504 EXPECT_NO_THROW(assigner.finish());
505 EXPECT_NO_THROW(options.finish());
510 TEST(OptionsAssignerIntegerTest, StoresToVector)
512 gmx::Options options(NULL, NULL);
513 std::vector<int> values;
514 using gmx::IntegerOption;
515 ASSERT_NO_THROW(options.addOption(
516 IntegerOption("p").storeVector(&values).multiValue()));
518 gmx::OptionsAssigner assigner(&options);
519 EXPECT_NO_THROW(assigner.start());
520 ASSERT_NO_THROW(assigner.startOption("p"));
521 ASSERT_NO_THROW(assigner.appendValue("-2"));
522 ASSERT_NO_THROW(assigner.appendValue("1"));
523 ASSERT_NO_THROW(assigner.appendValue("4"));
524 EXPECT_NO_THROW(assigner.finishOption());
525 EXPECT_NO_THROW(assigner.finish());
526 EXPECT_NO_THROW(options.finish());
528 EXPECT_EQ(3U, values.size());
529 EXPECT_EQ(-2, values[0]);
530 EXPECT_EQ(1, values[1]);
531 EXPECT_EQ(4, values[2]);
534 TEST(OptionsAssignerIntegerTest, HandlesVectors)
536 gmx::Options options(NULL, NULL);
537 int vec[3] = {0, 0, 0};
538 using gmx::IntegerOption;
539 ASSERT_NO_THROW(options.addOption(IntegerOption("p").store(vec).vector()));
541 gmx::OptionsAssigner assigner(&options);
542 EXPECT_NO_THROW(assigner.start());
543 ASSERT_NO_THROW(assigner.startOption("p"));
544 ASSERT_NO_THROW(assigner.appendValue("-2"));
545 ASSERT_NO_THROW(assigner.appendValue("1"));
546 ASSERT_NO_THROW(assigner.appendValue("4"));
547 EXPECT_NO_THROW(assigner.finishOption());
548 EXPECT_NO_THROW(assigner.finish());
549 EXPECT_NO_THROW(options.finish());
551 EXPECT_EQ(-2, vec[0]);
552 EXPECT_EQ(1, vec[1]);
553 EXPECT_EQ(4, vec[2]);
556 TEST(OptionsAssignerIntegerTest, HandlesVectorFromSingleValue)
558 gmx::Options options(NULL, NULL);
559 int vec[3] = {0, 0, 0};
560 using gmx::IntegerOption;
561 ASSERT_NO_THROW(options.addOption(IntegerOption("p").store(vec).vector()));
563 gmx::OptionsAssigner assigner(&options);
564 EXPECT_NO_THROW(assigner.start());
565 ASSERT_NO_THROW(assigner.startOption("p"));
566 ASSERT_NO_THROW(assigner.appendValue("2"));
567 EXPECT_NO_THROW(assigner.finishOption());
568 EXPECT_NO_THROW(assigner.finish());
569 EXPECT_NO_THROW(options.finish());
571 EXPECT_EQ(2, vec[0]);
572 EXPECT_EQ(2, vec[1]);
573 EXPECT_EQ(2, vec[2]);
576 TEST(OptionsAssignerIntegerTest, HandlesVectorsWithDefaultValue)
578 gmx::Options options(NULL, NULL);
579 int vec[3] = {3, 2, 1};
580 using gmx::IntegerOption;
581 ASSERT_NO_THROW(options.addOption(IntegerOption("p").store(vec).vector()));
583 EXPECT_NO_THROW(options.finish());
585 EXPECT_EQ(3, vec[0]);
586 EXPECT_EQ(2, vec[1]);
587 EXPECT_EQ(1, vec[2]);
590 TEST(OptionsAssignerIntegerTest, HandlesVectorsWithDefaultValueWithInvalidAssignment)
592 gmx::Options options(NULL, NULL);
593 int vec[3] = {3, 2, 1};
594 std::vector<int> vec2(vec, vec+3);
595 using gmx::IntegerOption;
596 ASSERT_NO_THROW(options.addOption(IntegerOption("p").store(vec)
597 .storeVector(&vec2).vector()));
599 gmx::OptionsAssigner assigner(&options);
600 EXPECT_NO_THROW(assigner.start());
601 ASSERT_NO_THROW(assigner.startOption("p"));
602 EXPECT_NO_THROW(assigner.appendValue("1"));
603 EXPECT_NO_THROW(assigner.appendValue("3"));
604 EXPECT_THROW(assigner.finishOption(), gmx::InvalidInputError);
605 EXPECT_NO_THROW(assigner.finish());
606 EXPECT_NO_THROW(options.finish());
608 EXPECT_EQ(3, vec[0]);
609 EXPECT_EQ(2, vec[1]);
610 EXPECT_EQ(1, vec[2]);
611 ASSERT_EQ(3U, vec2.size());
612 EXPECT_EQ(3, vec2[0]);
613 EXPECT_EQ(2, vec2[1]);
614 EXPECT_EQ(1, vec2[2]);
618 /********************************************************************
619 * Tests for double assignment
622 TEST(OptionsAssignerDoubleTest, StoresSingleValue)
624 gmx::Options options(NULL, NULL);
626 using gmx::DoubleOption;
627 ASSERT_NO_THROW(options.addOption(DoubleOption("p").store(&value)));
629 gmx::OptionsAssigner assigner(&options);
630 EXPECT_NO_THROW(assigner.start());
631 ASSERT_NO_THROW(assigner.startOption("p"));
632 ASSERT_NO_THROW(assigner.appendValue("2.7"));
633 EXPECT_NO_THROW(assigner.finishOption());
634 EXPECT_NO_THROW(assigner.finish());
635 EXPECT_NO_THROW(options.finish());
637 EXPECT_DOUBLE_EQ(2.7, value);
640 TEST(OptionsAssignerDoubleTest, HandlesEmptyValue)
642 gmx::Options options(NULL, NULL);
644 using gmx::DoubleOption;
645 ASSERT_NO_THROW(options.addOption(DoubleOption("p").store(&value)));
647 gmx::OptionsAssigner assigner(&options);
648 EXPECT_NO_THROW(assigner.start());
649 ASSERT_NO_THROW(assigner.startOption("p"));
650 EXPECT_THROW(assigner.appendValue(""), gmx::InvalidInputError);
651 EXPECT_NO_THROW(assigner.finishOption());
652 EXPECT_NO_THROW(assigner.finish());
653 EXPECT_NO_THROW(options.finish());
655 EXPECT_DOUBLE_EQ(1.0, value);
659 /********************************************************************
660 * Tests for string assignment
663 TEST(OptionsAssignerStringTest, StoresSingleValue)
665 gmx::Options options(NULL, NULL);
667 using gmx::StringOption;
668 ASSERT_NO_THROW(options.addOption(StringOption("p").store(&value)));
670 gmx::OptionsAssigner assigner(&options);
671 EXPECT_NO_THROW(assigner.start());
672 ASSERT_NO_THROW(assigner.startOption("p"));
673 ASSERT_NO_THROW(assigner.appendValue("value"));
674 EXPECT_NO_THROW(assigner.finishOption());
675 EXPECT_NO_THROW(assigner.finish());
676 EXPECT_NO_THROW(options.finish());
678 EXPECT_EQ("value", value);
681 TEST(OptionsAssignerStringTest, HandlesEnumValue)
683 gmx::Options options(NULL, NULL);
685 const char * const allowed[] = { "none", "test", "value", NULL };
687 using gmx::StringOption;
688 ASSERT_NO_THROW(options.addOption(
689 StringOption("p").store(&value)
690 .enumValue(allowed).storeEnumIndex(&index)));
692 gmx::OptionsAssigner assigner(&options);
693 EXPECT_NO_THROW(assigner.start());
694 ASSERT_NO_THROW(assigner.startOption("p"));
695 ASSERT_NO_THROW(assigner.appendValue("test"));
696 EXPECT_NO_THROW(assigner.finishOption());
697 EXPECT_NO_THROW(assigner.finish());
698 EXPECT_NO_THROW(options.finish());
700 EXPECT_EQ("test", value);
704 TEST(OptionsAssignerStringTest, HandlesIncorrectEnumValue)
706 gmx::Options options(NULL, NULL);
708 const char * const allowed[] = { "none", "test", "value", NULL };
710 using gmx::StringOption;
711 ASSERT_NO_THROW(options.addOption(
712 StringOption("p").store(&value)
713 .enumValue(allowed).storeEnumIndex(&index)));
715 gmx::OptionsAssigner assigner(&options);
716 EXPECT_NO_THROW(assigner.start());
717 ASSERT_NO_THROW(assigner.startOption("p"));
718 ASSERT_THROW(assigner.appendValue("unknown"), gmx::InvalidInputError);
721 TEST(OptionsAssignerStringTest, CompletesEnumValue)
723 gmx::Options options(NULL, NULL);
725 const char * const allowed[] = { "none", "test", "value", NULL };
727 using gmx::StringOption;
728 ASSERT_NO_THROW(options.addOption(
729 StringOption("p").store(&value)
730 .enumValue(allowed).storeEnumIndex(&index)));
732 gmx::OptionsAssigner assigner(&options);
733 EXPECT_NO_THROW(assigner.start());
734 ASSERT_NO_THROW(assigner.startOption("p"));
735 ASSERT_NO_THROW(assigner.appendValue("te"));
736 EXPECT_NO_THROW(assigner.finishOption());
737 EXPECT_NO_THROW(assigner.finish());
738 EXPECT_NO_THROW(options.finish());
740 EXPECT_EQ("test", value);
744 TEST(OptionsAssignerStringTest, HandlesEnumWithNoValue)
746 gmx::Options options(NULL, NULL);
748 const char * const allowed[] = { "none", "test", "value", NULL };
750 using gmx::StringOption;
751 ASSERT_NO_THROW(options.addOption(
752 StringOption("p").store(&value)
753 .enumValue(allowed).storeEnumIndex(&index)));
754 EXPECT_TRUE(value.empty());
755 EXPECT_EQ(-1, index);
757 ASSERT_NO_THROW(options.finish());
759 EXPECT_TRUE(value.empty());
760 EXPECT_EQ(-1, index);
763 TEST(OptionsAssignerStringTest, HandlesEnumDefaultValue)
765 gmx::Options options(NULL, NULL);
767 const char * const allowed[] = { "none", "test", "value", NULL };
769 using gmx::StringOption;
770 ASSERT_NO_THROW(options.addOption(
771 StringOption("p").store(&value)
772 .enumValue(allowed).defaultValue("test")
773 .storeEnumIndex(&index)));
774 EXPECT_EQ("test", value);
777 gmx::OptionsAssigner assigner(&options);
778 EXPECT_NO_THROW(assigner.start());
779 EXPECT_NO_THROW(assigner.finish());
780 EXPECT_NO_THROW(options.finish());
782 EXPECT_EQ("test", value);
786 TEST(OptionsAssignerStringTest, HandlesEnumDefaultIndex)
788 gmx::Options options(NULL, NULL);
790 const char * const allowed[] = { "none", "test", "value", NULL };
792 using gmx::StringOption;
793 ASSERT_NO_THROW(options.addOption(
794 StringOption("p").store(&value)
795 .enumValue(allowed).defaultEnumIndex(1)
796 .storeEnumIndex(&index)));
797 EXPECT_EQ("test", value);
800 gmx::OptionsAssigner assigner(&options);
801 EXPECT_NO_THROW(assigner.start());
802 EXPECT_NO_THROW(assigner.finish());
803 EXPECT_NO_THROW(options.finish());
805 EXPECT_EQ("test", value);