Support custom default extension for FileNameOption
[alexxy/gromacs.git] / src / gromacs / options / tests / filenameoption.cpp
index be0acd969b8fa9084c440b52be7e5f2a59f24cf4..6097d3232c987f2aab9c427e95aeab88d6b2d88e 100644 (file)
  */
 /*! \internal \file
  * \brief
- * Tests file name option implementation.
+ * Tests basic file name option implementation.
  *
  * \author Teemu Murtola <teemu.murtola@gmail.com>
  * \ingroup module_options
  */
-#include <vector>
+#include "gmxpre.h"
+
+#include "gromacs/options/filenameoption.h"
 
 #include <gtest/gtest.h>
 
-#include "gromacs/options/filenameoption.h"
-#include "gromacs/options/filenameoptionmanager.h"
+#include "gromacs/fileio/filenm.h"
 #include "gromacs/options/options.h"
 #include "gromacs/options/optionsassigner.h"
 #include "gromacs/utility/exceptions.h"
-#include "gromacs/utility/file.h"
-#include "gromacs/utility/path.h"
 
 #include "testutils/testasserts.h"
-#include "testutils/testfilemanager.h"
 
 namespace
 {
 
 using gmx::FileNameOption;
-using gmx::test::TestFileManager;
-
-TEST(FileNameOptionTest, AddsMissingExtension)
-{
-    gmx::Options           options(NULL, NULL);
-    std::string            value;
-    ASSERT_NO_THROW_GMX(options.addOption(
-                                FileNameOption("f").store(&value)
-                                    .filetype(gmx::eftTrajectory).outputFile()));
-
-    gmx::OptionsAssigner assigner(&options);
-    EXPECT_NO_THROW_GMX(assigner.start());
-    EXPECT_NO_THROW_GMX(assigner.startOption("f"));
-    EXPECT_NO_THROW_GMX(assigner.appendValue("testfile"));
-    EXPECT_NO_THROW_GMX(assigner.finishOption());
-    EXPECT_NO_THROW_GMX(assigner.finish());
-    EXPECT_NO_THROW_GMX(options.finish());
-
-    EXPECT_EQ("testfile.xtc", value);
-}
 
 TEST(FileNameOptionTest, HandlesRequiredDefaultValueWithoutExtension)
 {
@@ -105,6 +83,7 @@ TEST(FileNameOptionTest, HandlesRequiredOptionWithoutValue)
                                 FileNameOption("f").store(&value).required()
                                     .filetype(gmx::eftGenericData).outputFile()
                                     .defaultBasename("testfile")));
+    EXPECT_EQ("testfile.dat", value);
 
     gmx::OptionsAssigner assigner(&options);
     EXPECT_NO_THROW_GMX(assigner.start());
@@ -154,68 +133,35 @@ TEST(FileNameOptionTest, HandlesOptionalDefaultValueWithoutExtension)
     EXPECT_EQ("testfile.ndx", value);
 }
 
-TEST(FileNameOptionTest, AddsMissingExtensionBasedOnExistingFile)
-{
-    TestFileManager      tempFiles;
-    std::string          filename(tempFiles.getTemporaryFilePath(".trr"));
-    gmx::File::writeFileFromString(filename, "Dummy trajectory file");
-    std::string          inputValue(gmx::Path::stripExtension(filename));
-
-    gmx::Options         options(NULL, NULL);
-    std::string          value;
-    ASSERT_NO_THROW_GMX(options.addOption(
-                                FileNameOption("f").store(&value)
-                                    .filetype(gmx::eftTrajectory).inputFile()));
-
-    gmx::OptionsAssigner assigner(&options);
-    EXPECT_NO_THROW_GMX(assigner.start());
-    EXPECT_NO_THROW_GMX(assigner.startOption("f"));
-    EXPECT_NO_THROW_GMX(assigner.appendValue(inputValue));
-    EXPECT_NO_THROW_GMX(assigner.finishOption());
-    EXPECT_NO_THROW_GMX(assigner.finish());
-    EXPECT_NO_THROW_GMX(options.finish());
-
-    EXPECT_EQ(filename, value);
-}
-
-TEST(FileNameOptionTest, AddsMissingExtensionForRequiredDefaultNameBasedOnExistingFile)
+TEST(FileNameOptionTest, HandlesRequiredCustomDefaultExtension)
 {
-    TestFileManager      tempFiles;
-    std::string          filename(tempFiles.getTemporaryFilePath(".trr"));
-    gmx::File::writeFileFromString(filename, "Dummy trajectory file");
-    std::string          inputValue(gmx::Path::stripExtension(filename));
-
-    gmx::Options         options(NULL, NULL);
-    std::string          value;
+    gmx::Options           options(NULL, NULL);
+    std::string            value;
     ASSERT_NO_THROW_GMX(options.addOption(
                                 FileNameOption("f").store(&value).required()
-                                    .filetype(gmx::eftTrajectory).inputFile()
-                                    .defaultBasename(inputValue.c_str())));
-    EXPECT_EQ(inputValue + ".xtc", value);
+                                    .filetype(gmx::eftTrajectory).outputFile()
+                                    .defaultBasename("testfile")
+                                    .defaultType(efPDB)));
+    EXPECT_EQ("testfile.pdb", value);
 
     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(filename, value);
+    EXPECT_EQ("testfile.pdb", value);
 }
 
-TEST(FileNameOptionTest, AddsMissingExtensionForOptionalDefaultNameBasedOnExistingFile)
+TEST(FileNameOptionTest, HandlesOptionalCustomDefaultExtension)
 {
-    TestFileManager      tempFiles;
-    std::string          filename(tempFiles.getTemporaryFilePath(".trr"));
-    gmx::File::writeFileFromString(filename, "Dummy trajectory file");
-    std::string          inputValue(gmx::Path::stripExtension(filename));
-
-    gmx::Options         options(NULL, NULL);
-    std::string          value;
+    gmx::Options           options(NULL, NULL);
+    std::string            value;
     ASSERT_NO_THROW_GMX(options.addOption(
                                 FileNameOption("f").store(&value)
-                                    .filetype(gmx::eftTrajectory).inputFile()
-                                    .defaultBasename(inputValue.c_str())));
+                                    .filetype(gmx::eftTrajectory).outputFile()
+                                    .defaultBasename("testfile")
+                                    .defaultType(efPDB)));
+    EXPECT_TRUE(value.empty());
 
     gmx::OptionsAssigner assigner(&options);
     EXPECT_NO_THROW_GMX(assigner.start());
@@ -224,66 +170,47 @@ TEST(FileNameOptionTest, AddsMissingExtensionForOptionalDefaultNameBasedOnExisti
     EXPECT_NO_THROW_GMX(assigner.finish());
     EXPECT_NO_THROW_GMX(options.finish());
 
-    EXPECT_EQ(filename, value);
+    EXPECT_EQ("testfile.pdb", value);
 }
 
-TEST(FileNameOptionTest, AddsMissingExtensionForRequiredFromDefaultNameOptionBasedOnExistingFile)
+TEST(FileNameOptionTest, GivesErrorOnUnknownFileSuffix)
 {
-    TestFileManager            tempFiles;
-    std::string                filename(tempFiles.getTemporaryFilePath(".trr"));
-    gmx::File::writeFileFromString(filename, "Dummy trajectory file");
-    std::string                inputValue(gmx::Path::stripExtension(filename));
-
-    gmx::FileNameOptionManager manager;
-    gmx::Options               options(NULL, NULL);
-    std::string                value;
-    ASSERT_NO_THROW_GMX(options.addManager(&manager));
+    gmx::Options           options(NULL, NULL);
+    std::string            value;
     ASSERT_NO_THROW_GMX(options.addOption(
-                                FileNameOption("f").store(&value).required()
-                                    .filetype(gmx::eftTrajectory).inputFile()
-                                    .defaultBasename("foo")));
-    ASSERT_NO_THROW_GMX(manager.addDefaultFileNameOption(&options, "deffnm"));
-    EXPECT_EQ("foo.xtc", value);
+                                FileNameOption("f").store(&value)
+                                    .filetype(gmx::eftIndex).outputFile()));
+    EXPECT_TRUE(value.empty());
 
     gmx::OptionsAssigner assigner(&options);
     EXPECT_NO_THROW_GMX(assigner.start());
-    EXPECT_NO_THROW_GMX(assigner.startOption("deffnm"));
-    EXPECT_NO_THROW_GMX(assigner.appendValue(inputValue));
+    EXPECT_NO_THROW_GMX(assigner.startOption("f"));
+    EXPECT_THROW_GMX(assigner.appendValue("testfile.foo"), gmx::InvalidInputError);
     EXPECT_NO_THROW_GMX(assigner.finishOption());
     EXPECT_NO_THROW_GMX(assigner.finish());
     EXPECT_NO_THROW_GMX(options.finish());
 
-    EXPECT_EQ(filename, value);
+    EXPECT_TRUE(value.empty());
 }
 
-TEST(FileNameOptionTest, AddsMissingExtensionForOptionalFromDefaultNameOptionBasedOnExistingFile)
+TEST(FileNameOptionTest, GivesErrorOnInvalidFileSuffix)
 {
-    TestFileManager            tempFiles;
-    std::string                filename(tempFiles.getTemporaryFilePath(".trr"));
-    gmx::File::writeFileFromString(filename, "Dummy trajectory file");
-    std::string                inputValue(gmx::Path::stripExtension(filename));
-
-    gmx::FileNameOptionManager manager;
-    gmx::Options               options(NULL, NULL);
-    std::string                value;
-    ASSERT_NO_THROW_GMX(options.addManager(&manager));
+    gmx::Options           options(NULL, NULL);
+    std::string            value;
     ASSERT_NO_THROW_GMX(options.addOption(
                                 FileNameOption("f").store(&value)
-                                    .filetype(gmx::eftTrajectory).inputFile()
-                                    .defaultBasename("foo")));
-    ASSERT_NO_THROW_GMX(manager.addDefaultFileNameOption(&options, "deffnm"));
+                                    .filetype(gmx::eftTrajectory).outputFile()));
+    EXPECT_TRUE(value.empty());
 
     gmx::OptionsAssigner assigner(&options);
     EXPECT_NO_THROW_GMX(assigner.start());
-    EXPECT_NO_THROW_GMX(assigner.startOption("deffnm"));
-    EXPECT_NO_THROW_GMX(assigner.appendValue(inputValue));
-    EXPECT_NO_THROW_GMX(assigner.finishOption());
     EXPECT_NO_THROW_GMX(assigner.startOption("f"));
+    EXPECT_THROW_GMX(assigner.appendValue("testfile.dat"), gmx::InvalidInputError);
     EXPECT_NO_THROW_GMX(assigner.finishOption());
     EXPECT_NO_THROW_GMX(assigner.finish());
     EXPECT_NO_THROW_GMX(options.finish());
 
-    EXPECT_EQ(filename, value);
+    EXPECT_TRUE(value.empty());
 }
 
 } // namespace