Make FileNameOption behave more like old filenm parser
authorTeemu Murtola <teemu.murtola@gmail.com>
Wed, 5 Feb 2014 19:59:17 +0000 (21:59 +0200)
committerMark Abraham <mark.j.abraham@gmail.com>
Sun, 9 Feb 2014 12:39:40 +0000 (13:39 +0100)
If a required file name option is provided without a value, then it is a
no-op.  Previously, FileNameOption raised an exception for such usage.
Add a test to cover this case.

Related to #642.

Change-Id: I89d6cc8ee5d5bf2915bb6841317b402ade00b99b

src/gromacs/commandline/tests/refdata/CommandLineHelpWriterTest_HandlesLongFileOptions.xml
src/gromacs/commandline/tests/refdata/CommandLineHelpWriterTest_HandlesOptionTypes.xml
src/gromacs/options/filenameoption.cpp
src/gromacs/options/filenameoption.h
src/gromacs/options/tests/filenameoption.cpp

index b01af043e39815dc0cc1da129746d51c58a9ba39..44497d3a08fe60e92be6e9c3736055725485aa75 100644 (file)
@@ -4,14 +4,14 @@
   <String Name="HelpText"><![CDATA[
 SYNOPSIS
 
-gmx [-f <.xtc/.trr/...>] [-f2 <.xtc/.trr/...>] [-lib [<.xtc/.trr/...>]]
+gmx [-f [<.xtc/.trr/...>]] [-f2 [<.xtc/.trr/...>]] [-lib [<.xtc/.trr/...>]]
     [-longfileopt [<.dat>]] [-longfileopt2 [<.dat>]]
 
 FILE OPTIONS
 
- -f     <.xtc/.trr/...> (path/to/long/trajectory/name.xtc) (Input)
+ -f     [<.xtc/.trr/...>] (path/to/long/trajectory/name.xtc) (Input)
      File name option with a long value: xtc trr cpt trj gro g96 pdb g87 tng
- -f2    <.xtc/.trr/...> (path/to/long/trajectory.xtc) (Input)
+ -f2    [<.xtc/.trr/...>] (path/to/long/trajectory.xtc) (Input)
      File name option with a long value: xtc trr cpt trj gro g96 pdb g87 tng
  -lib   [<.xtc/.trr/...>] (path/to/long/trajectory/name.xtc) (Input, Opt., Lib.)
      File name option with a long value and type: xtc trr cpt trj gro g96 pdb
index e81c9f60abfc29b510cbf958fdd084be76dca7c6..f24fd8342cb3e39afb77f86546e8453de893d2a9 100644 (file)
@@ -4,14 +4,14 @@
   <String Name="HelpText"><![CDATA[
 SYNOPSIS
 
-gmx [-f <.xtc/.trr/...>] [-mult [<.xtc/.trr/...> [...]]] [-lib [<.dat>]]
+gmx [-f [<.xtc/.trr/...>]] [-mult [<.xtc/.trr/...> [...]]] [-lib [<.dat>]]
     [-io [<.dat>]] [-o <.xvg>] [-[no]bool] [-[no]hidden] [-int <int>]
     [-ivec <vector>] [-double <real>] [-dvec <vector>] [-time <time>]
     [-string <string>] [-enum <enum>]
 
 FILE OPTIONS
 
- -f     <.xtc/.trr/...> (traj.xtc) (Input)
+ -f     [<.xtc/.trr/...>] (traj.xtc) (Input)
      Input file description: xtc trr cpt trj gro g96 pdb g87 tng
  -mult  [<.xtc/.trr/...> [...]] (traj.xtc) (Input, Opt.)
      Multiple file description: xtc trr cpt trj gro g96 pdb g87 tng
index ae40a3a6cfbe3ebdbda1e1c32fd930ca79ed0065..31dff32dc4e3754f52164d8974e00a8c351c01aa 100644 (file)
@@ -273,15 +273,12 @@ FileNameOptionStorage::FileNameOptionStorage(const FileNameOption &settings)
 {
     if (settings.defaultBasename_ != NULL)
     {
+        std::string defaultValue =
+            completeFileName(settings.defaultBasename_, filetype_, false);
+        setDefaultValueIfSet(defaultValue);
         if (isRequired())
         {
-            setDefaultValue(completeFileName(settings.defaultBasename_,
-                                             filetype_, false));
-        }
-        else
-        {
-            setDefaultValueIfSet(completeFileName(settings.defaultBasename_,
-                                                  filetype_, false));
+            setDefaultValue(defaultValue);
         }
     }
 }
index 489f56d8871d244a7006060c55e4e9e80eb8eadf..0b8bc093c5997488966132923acf9ef21980e0fb 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012, by the GROMACS development team, led by
+ * Copyright (c) 2012,2014, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
@@ -113,7 +113,8 @@ class FileNameOption : public OptionTemplate<std::string, FileNameOption>
          * be provided; it is automatically added based on filetype().
          * The behavior is also adjusted based on required(): if the option is
          * required, the value given to defaultBasename() is treated as for
-         * defaultValue(), otherwise it is treated as for defaultValueIfSet().
+         * both defaultValue() and defaultValueIfSet(), otherwise it is treated
+         * as for defaultValueIfSet().
          */
         MyClass &defaultBasename(const char *basename)
         { defaultBasename_ = basename; return me(); }
index ee3770d5095899b0a1c362e8821de6d8ff8a8869..76956c69505ace344544f90a0ab9b3fb564634a2 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
@@ -95,6 +95,25 @@ TEST(FileNameOptionTest, HandlesRequiredDefaultValueWithoutExtension)
     EXPECT_EQ("testfile.dat", value);
 }
 
+TEST(FileNameOptionTest, HandlesRequiredOptionWithoutValue)
+{
+    gmx::Options           options(NULL, NULL);
+    std::string            value;
+    ASSERT_NO_THROW_GMX(options.addOption(
+                                FileNameOption("f").store(&value).required()
+                                    .filetype(gmx::eftGenericData).outputFile()
+                                    .defaultBasename("testfile")));
+
+    gmx::OptionsAssigner assigner(&options);
+    EXPECT_NO_THROW_GMX(assigner.start());
+    EXPECT_NO_THROW_GMX(assigner.startOption("f"));
+    EXPECT_NO_THROW_GMX(assigner.finishOption());
+    EXPECT_NO_THROW_GMX(assigner.finish());
+    EXPECT_NO_THROW_GMX(options.finish());
+
+    EXPECT_EQ("testfile.dat", value);
+}
+
 TEST(FileNameOptionTest, HandlesOptionalDefaultValueWithoutExtension)
 {
     gmx::Options           options(NULL, NULL);