Blame utils/cmdline/options_test.cpp

Packit 209faa
// Copyright 2010 The Kyua Authors.
Packit 209faa
// All rights reserved.
Packit 209faa
//
Packit 209faa
// Redistribution and use in source and binary forms, with or without
Packit 209faa
// modification, are permitted provided that the following conditions are
Packit 209faa
// met:
Packit 209faa
//
Packit 209faa
// * Redistributions of source code must retain the above copyright
Packit 209faa
//   notice, this list of conditions and the following disclaimer.
Packit 209faa
// * Redistributions in binary form must reproduce the above copyright
Packit 209faa
//   notice, this list of conditions and the following disclaimer in the
Packit 209faa
//   documentation and/or other materials provided with the distribution.
Packit 209faa
// * Neither the name of Google Inc. nor the names of its contributors
Packit 209faa
//   may be used to endorse or promote products derived from this software
Packit 209faa
//   without specific prior written permission.
Packit 209faa
//
Packit 209faa
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
Packit 209faa
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
Packit 209faa
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
Packit 209faa
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
Packit 209faa
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
Packit 209faa
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
Packit 209faa
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
Packit 209faa
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
Packit 209faa
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
Packit 209faa
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
Packit 209faa
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Packit 209faa
Packit 209faa
#include "utils/cmdline/options.hpp"
Packit 209faa
Packit 209faa
#include <atf-c++.hpp>
Packit 209faa
Packit 209faa
#include "utils/cmdline/exceptions.hpp"
Packit 209faa
#include "utils/defs.hpp"
Packit 209faa
#include "utils/fs/path.hpp"
Packit 209faa
Packit 209faa
namespace cmdline = utils::cmdline;
Packit 209faa
Packit 209faa
namespace {
Packit 209faa
Packit 209faa
Packit 209faa
/// Simple string-based option type for testing purposes.
Packit 209faa
class mock_option : public cmdline::base_option {
Packit 209faa
public:
Packit 209faa
    /// Constructs a mock option with a short name and a long name.
Packit 209faa
    ///
Packit 209faa
    ///
Packit 209faa
    /// \param short_name_ The short name for the option.
Packit 209faa
    /// \param long_name_ The long name for the option.
Packit 209faa
    /// \param description_ A user-friendly description for the option.
Packit 209faa
    /// \param arg_name_ If not NULL, specifies that the option must receive an
Packit 209faa
    ///     argument and specifies the name of such argument for documentation
Packit 209faa
    ///     purposes.
Packit 209faa
    /// \param default_value_ If not NULL, specifies that the option has a
Packit 209faa
    ///     default value for the mandatory argument.
Packit 209faa
    mock_option(const char short_name_, const char* long_name_,
Packit 209faa
                  const char* description_, const char* arg_name_ = NULL,
Packit 209faa
                  const char* default_value_ = NULL) :
Packit 209faa
        base_option(short_name_, long_name_, description_, arg_name_,
Packit 209faa
                    default_value_) {}
Packit 209faa
Packit 209faa
    /// Constructs a mock option with a long name only.
Packit 209faa
    ///
Packit 209faa
    /// \param long_name_ The long name for the option.
Packit 209faa
    /// \param description_ A user-friendly description for the option.
Packit 209faa
    /// \param arg_name_ If not NULL, specifies that the option must receive an
Packit 209faa
    ///     argument and specifies the name of such argument for documentation
Packit 209faa
    ///     purposes.
Packit 209faa
    /// \param default_value_ If not NULL, specifies that the option has a
Packit 209faa
    ///     default value for the mandatory argument.
Packit 209faa
    mock_option(const char* long_name_,
Packit 209faa
                  const char* description_, const char* arg_name_ = NULL,
Packit 209faa
                  const char* default_value_ = NULL) :
Packit 209faa
        base_option(long_name_, description_, arg_name_, default_value_) {}
Packit 209faa
Packit 209faa
    /// The data type of this option.
Packit 209faa
    typedef std::string option_type;
Packit 209faa
Packit 209faa
    /// Ensures that the argument passed to the option is valid.
Packit 209faa
    ///
Packit 209faa
    /// In this particular mock option, this does not perform any validation.
Packit 209faa
    ///
Packit 209faa
    /// \param unused_str The user-provided argument to the option.
Packit 209faa
    void
Packit 209faa
    validate(const std::string& UTILS_UNUSED_PARAM(str)) const
Packit 209faa
    {
Packit 209faa
        // Do nothing.
Packit 209faa
    }
Packit 209faa
Packit 209faa
    /// Returns the input parameter without any conversion.
Packit 209faa
    ///
Packit 209faa
    /// \param str The user-provided argument to the option.
Packit 209faa
    ///
Packit 209faa
    /// \return The same value as provided by the user without conversion.
Packit 209faa
    static std::string
Packit 209faa
    convert(const std::string& str)
Packit 209faa
    {
Packit 209faa
        return str;
Packit 209faa
    }
Packit 209faa
};
Packit 209faa
Packit 209faa
Packit 209faa
}  // anonymous namespace
Packit 209faa
Packit 209faa
Packit 209faa
ATF_TEST_CASE_WITHOUT_HEAD(base_option__short_name__no_arg);
Packit 209faa
ATF_TEST_CASE_BODY(base_option__short_name__no_arg)
Packit 209faa
{
Packit 209faa
    const mock_option o('f', "force", "Force execution");
Packit 209faa
    ATF_REQUIRE(o.has_short_name());
Packit 209faa
    ATF_REQUIRE_EQ('f', o.short_name());
Packit 209faa
    ATF_REQUIRE_EQ("force", o.long_name());
Packit 209faa
    ATF_REQUIRE_EQ("Force execution", o.description());
Packit 209faa
    ATF_REQUIRE(!o.needs_arg());
Packit 209faa
    ATF_REQUIRE_EQ("-f", o.format_short_name());
Packit 209faa
    ATF_REQUIRE_EQ("--force", o.format_long_name());
Packit 209faa
}
Packit 209faa
Packit 209faa
Packit 209faa
ATF_TEST_CASE_WITHOUT_HEAD(base_option__short_name__with_arg__no_default);
Packit 209faa
ATF_TEST_CASE_BODY(base_option__short_name__with_arg__no_default)
Packit 209faa
{
Packit 209faa
    const mock_option o('c', "conf_file", "Configuration file", "path");
Packit 209faa
    ATF_REQUIRE(o.has_short_name());
Packit 209faa
    ATF_REQUIRE_EQ('c', o.short_name());
Packit 209faa
    ATF_REQUIRE_EQ("conf_file", o.long_name());
Packit 209faa
    ATF_REQUIRE_EQ("Configuration file", o.description());
Packit 209faa
    ATF_REQUIRE(o.needs_arg());
Packit 209faa
    ATF_REQUIRE_EQ("path", o.arg_name());
Packit 209faa
    ATF_REQUIRE(!o.has_default_value());
Packit 209faa
    ATF_REQUIRE_EQ("-c path", o.format_short_name());
Packit 209faa
    ATF_REQUIRE_EQ("--conf_file=path", o.format_long_name());
Packit 209faa
}
Packit 209faa
Packit 209faa
Packit 209faa
ATF_TEST_CASE_WITHOUT_HEAD(base_option__short_name__with_arg__with_default);
Packit 209faa
ATF_TEST_CASE_BODY(base_option__short_name__with_arg__with_default)
Packit 209faa
{
Packit 209faa
    const mock_option o('c', "conf_file", "Configuration file", "path",
Packit 209faa
                        "defpath");
Packit 209faa
    ATF_REQUIRE(o.has_short_name());
Packit 209faa
    ATF_REQUIRE_EQ('c', o.short_name());
Packit 209faa
    ATF_REQUIRE_EQ("conf_file", o.long_name());
Packit 209faa
    ATF_REQUIRE_EQ("Configuration file", o.description());
Packit 209faa
    ATF_REQUIRE(o.needs_arg());
Packit 209faa
    ATF_REQUIRE_EQ("path", o.arg_name());
Packit 209faa
    ATF_REQUIRE(o.has_default_value());
Packit 209faa
    ATF_REQUIRE_EQ("defpath", o.default_value());
Packit 209faa
    ATF_REQUIRE_EQ("-c path", o.format_short_name());
Packit 209faa
    ATF_REQUIRE_EQ("--conf_file=path", o.format_long_name());
Packit 209faa
}
Packit 209faa
Packit 209faa
Packit 209faa
ATF_TEST_CASE_WITHOUT_HEAD(base_option__long_name__no_arg);
Packit 209faa
ATF_TEST_CASE_BODY(base_option__long_name__no_arg)
Packit 209faa
{
Packit 209faa
    const mock_option o("dryrun", "Dry run mode");
Packit 209faa
    ATF_REQUIRE(!o.has_short_name());
Packit 209faa
    ATF_REQUIRE_EQ("dryrun", o.long_name());
Packit 209faa
    ATF_REQUIRE_EQ("Dry run mode", o.description());
Packit 209faa
    ATF_REQUIRE(!o.needs_arg());
Packit 209faa
    ATF_REQUIRE_EQ("--dryrun", o.format_long_name());
Packit 209faa
}
Packit 209faa
Packit 209faa
Packit 209faa
ATF_TEST_CASE_WITHOUT_HEAD(base_option__long_name__with_arg__no_default);
Packit 209faa
ATF_TEST_CASE_BODY(base_option__long_name__with_arg__no_default)
Packit 209faa
{
Packit 209faa
    const mock_option o("helper", "Path to helper", "path");
Packit 209faa
    ATF_REQUIRE(!o.has_short_name());
Packit 209faa
    ATF_REQUIRE_EQ("helper", o.long_name());
Packit 209faa
    ATF_REQUIRE_EQ("Path to helper", o.description());
Packit 209faa
    ATF_REQUIRE(o.needs_arg());
Packit 209faa
    ATF_REQUIRE_EQ("path", o.arg_name());
Packit 209faa
    ATF_REQUIRE(!o.has_default_value());
Packit 209faa
    ATF_REQUIRE_EQ("--helper=path", o.format_long_name());
Packit 209faa
}
Packit 209faa
Packit 209faa
Packit 209faa
ATF_TEST_CASE_WITHOUT_HEAD(base_option__long_name__with_arg__with_default);
Packit 209faa
ATF_TEST_CASE_BODY(base_option__long_name__with_arg__with_default)
Packit 209faa
{
Packit 209faa
    const mock_option o("executable", "Executable name", "file", "foo");
Packit 209faa
    ATF_REQUIRE(!o.has_short_name());
Packit 209faa
    ATF_REQUIRE_EQ("executable", o.long_name());
Packit 209faa
    ATF_REQUIRE_EQ("Executable name", o.description());
Packit 209faa
    ATF_REQUIRE(o.needs_arg());
Packit 209faa
    ATF_REQUIRE_EQ("file", o.arg_name());
Packit 209faa
    ATF_REQUIRE(o.has_default_value());
Packit 209faa
    ATF_REQUIRE_EQ("foo", o.default_value());
Packit 209faa
    ATF_REQUIRE_EQ("--executable=file", o.format_long_name());
Packit 209faa
}
Packit 209faa
Packit 209faa
Packit 209faa
ATF_TEST_CASE_WITHOUT_HEAD(bool_option__short_name);
Packit 209faa
ATF_TEST_CASE_BODY(bool_option__short_name)
Packit 209faa
{
Packit 209faa
    const cmdline::bool_option o('f', "force", "Force execution");
Packit 209faa
    ATF_REQUIRE(o.has_short_name());
Packit 209faa
    ATF_REQUIRE_EQ('f', o.short_name());
Packit 209faa
    ATF_REQUIRE_EQ("force", o.long_name());
Packit 209faa
    ATF_REQUIRE_EQ("Force execution", o.description());
Packit 209faa
    ATF_REQUIRE(!o.needs_arg());
Packit 209faa
}
Packit 209faa
Packit 209faa
Packit 209faa
ATF_TEST_CASE_WITHOUT_HEAD(bool_option__long_name);
Packit 209faa
ATF_TEST_CASE_BODY(bool_option__long_name)
Packit 209faa
{
Packit 209faa
    const cmdline::bool_option o("force", "Force execution");
Packit 209faa
    ATF_REQUIRE(!o.has_short_name());
Packit 209faa
    ATF_REQUIRE_EQ("force", o.long_name());
Packit 209faa
    ATF_REQUIRE_EQ("Force execution", o.description());
Packit 209faa
    ATF_REQUIRE(!o.needs_arg());
Packit 209faa
}
Packit 209faa
Packit 209faa
Packit 209faa
ATF_TEST_CASE_WITHOUT_HEAD(int_option__short_name);
Packit 209faa
ATF_TEST_CASE_BODY(int_option__short_name)
Packit 209faa
{
Packit 209faa
    const cmdline::int_option o('p', "int", "The int", "arg", "value");
Packit 209faa
    ATF_REQUIRE(o.has_short_name());
Packit 209faa
    ATF_REQUIRE_EQ('p', o.short_name());
Packit 209faa
    ATF_REQUIRE_EQ("int", o.long_name());
Packit 209faa
    ATF_REQUIRE_EQ("The int", o.description());
Packit 209faa
    ATF_REQUIRE(o.needs_arg());
Packit 209faa
    ATF_REQUIRE_EQ("arg", o.arg_name());
Packit 209faa
    ATF_REQUIRE(o.has_default_value());
Packit 209faa
    ATF_REQUIRE_EQ("value", o.default_value());
Packit 209faa
}
Packit 209faa
Packit 209faa
Packit 209faa
ATF_TEST_CASE_WITHOUT_HEAD(int_option__long_name);
Packit 209faa
ATF_TEST_CASE_BODY(int_option__long_name)
Packit 209faa
{
Packit 209faa
    const cmdline::int_option o("int", "The int", "arg", "value");
Packit 209faa
    ATF_REQUIRE(!o.has_short_name());
Packit 209faa
    ATF_REQUIRE_EQ("int", o.long_name());
Packit 209faa
    ATF_REQUIRE_EQ("The int", o.description());
Packit 209faa
    ATF_REQUIRE(o.needs_arg());
Packit 209faa
    ATF_REQUIRE_EQ("arg", o.arg_name());
Packit 209faa
    ATF_REQUIRE(o.has_default_value());
Packit 209faa
    ATF_REQUIRE_EQ("value", o.default_value());
Packit 209faa
}
Packit 209faa
Packit 209faa
Packit 209faa
ATF_TEST_CASE_WITHOUT_HEAD(int_option__type);
Packit 209faa
ATF_TEST_CASE_BODY(int_option__type)
Packit 209faa
{
Packit 209faa
    const cmdline::int_option o("int", "The int", "arg");
Packit 209faa
Packit 209faa
    o.validate("123");
Packit 209faa
    ATF_REQUIRE_EQ(123, cmdline::int_option::convert("123"));
Packit 209faa
Packit 209faa
    o.validate("-567");
Packit 209faa
    ATF_REQUIRE_EQ(-567, cmdline::int_option::convert("-567"));
Packit 209faa
Packit 209faa
    ATF_REQUIRE_THROW(cmdline::option_argument_value_error, o.validate(""));
Packit 209faa
    ATF_REQUIRE_THROW(cmdline::option_argument_value_error, o.validate("5a"));
Packit 209faa
    ATF_REQUIRE_THROW(cmdline::option_argument_value_error, o.validate("a5"));
Packit 209faa
    ATF_REQUIRE_THROW(cmdline::option_argument_value_error, o.validate("5 a"));
Packit 209faa
    ATF_REQUIRE_THROW(cmdline::option_argument_value_error, o.validate("5.0"));
Packit 209faa
}
Packit 209faa
Packit 209faa
Packit 209faa
ATF_TEST_CASE_WITHOUT_HEAD(list_option__short_name);
Packit 209faa
ATF_TEST_CASE_BODY(list_option__short_name)
Packit 209faa
{
Packit 209faa
    const cmdline::list_option o('p', "list", "The list", "arg", "value");
Packit 209faa
    ATF_REQUIRE(o.has_short_name());
Packit 209faa
    ATF_REQUIRE_EQ('p', o.short_name());
Packit 209faa
    ATF_REQUIRE_EQ("list", o.long_name());
Packit 209faa
    ATF_REQUIRE_EQ("The list", o.description());
Packit 209faa
    ATF_REQUIRE(o.needs_arg());
Packit 209faa
    ATF_REQUIRE_EQ("arg", o.arg_name());
Packit 209faa
    ATF_REQUIRE(o.has_default_value());
Packit 209faa
    ATF_REQUIRE_EQ("value", o.default_value());
Packit 209faa
}
Packit 209faa
Packit 209faa
Packit 209faa
ATF_TEST_CASE_WITHOUT_HEAD(list_option__long_name);
Packit 209faa
ATF_TEST_CASE_BODY(list_option__long_name)
Packit 209faa
{
Packit 209faa
    const cmdline::list_option o("list", "The list", "arg", "value");
Packit 209faa
    ATF_REQUIRE(!o.has_short_name());
Packit 209faa
    ATF_REQUIRE_EQ("list", o.long_name());
Packit 209faa
    ATF_REQUIRE_EQ("The list", o.description());
Packit 209faa
    ATF_REQUIRE(o.needs_arg());
Packit 209faa
    ATF_REQUIRE_EQ("arg", o.arg_name());
Packit 209faa
    ATF_REQUIRE(o.has_default_value());
Packit 209faa
    ATF_REQUIRE_EQ("value", o.default_value());
Packit 209faa
}
Packit 209faa
Packit 209faa
Packit 209faa
ATF_TEST_CASE_WITHOUT_HEAD(list_option__type);
Packit 209faa
ATF_TEST_CASE_BODY(list_option__type)
Packit 209faa
{
Packit 209faa
    const cmdline::list_option o("list", "The list", "arg");
Packit 209faa
Packit 209faa
    o.validate("");
Packit 209faa
    {
Packit 209faa
        const cmdline::list_option::option_type words =
Packit 209faa
            cmdline::list_option::convert("");
Packit 209faa
        ATF_REQUIRE(words.empty());
Packit 209faa
    }
Packit 209faa
Packit 209faa
    o.validate("foo");
Packit 209faa
    {
Packit 209faa
        const cmdline::list_option::option_type words =
Packit 209faa
            cmdline::list_option::convert("foo");
Packit 209faa
        ATF_REQUIRE_EQ(1, words.size());
Packit 209faa
        ATF_REQUIRE_EQ("foo", words[0]);
Packit 209faa
    }
Packit 209faa
Packit 209faa
    o.validate("foo,bar,baz");
Packit 209faa
    {
Packit 209faa
        const cmdline::list_option::option_type words =
Packit 209faa
            cmdline::list_option::convert("foo,bar,baz");
Packit 209faa
        ATF_REQUIRE_EQ(3, words.size());
Packit 209faa
        ATF_REQUIRE_EQ("foo", words[0]);
Packit 209faa
        ATF_REQUIRE_EQ("bar", words[1]);
Packit 209faa
        ATF_REQUIRE_EQ("baz", words[2]);
Packit 209faa
    }
Packit 209faa
Packit 209faa
    o.validate("foo,bar,");
Packit 209faa
    {
Packit 209faa
        const cmdline::list_option::option_type words =
Packit 209faa
            cmdline::list_option::convert("foo,bar,");
Packit 209faa
        ATF_REQUIRE_EQ(3, words.size());
Packit 209faa
        ATF_REQUIRE_EQ("foo", words[0]);
Packit 209faa
        ATF_REQUIRE_EQ("bar", words[1]);
Packit 209faa
        ATF_REQUIRE_EQ("", words[2]);
Packit 209faa
    }
Packit 209faa
Packit 209faa
    o.validate(",foo,bar");
Packit 209faa
    {
Packit 209faa
        const cmdline::list_option::option_type words =
Packit 209faa
            cmdline::list_option::convert(",foo,bar");
Packit 209faa
        ATF_REQUIRE_EQ(3, words.size());
Packit 209faa
        ATF_REQUIRE_EQ("", words[0]);
Packit 209faa
        ATF_REQUIRE_EQ("foo", words[1]);
Packit 209faa
        ATF_REQUIRE_EQ("bar", words[2]);
Packit 209faa
    }
Packit 209faa
Packit 209faa
    o.validate("foo,,bar");
Packit 209faa
    {
Packit 209faa
        const cmdline::list_option::option_type words =
Packit 209faa
            cmdline::list_option::convert("foo,,bar");
Packit 209faa
        ATF_REQUIRE_EQ(3, words.size());
Packit 209faa
        ATF_REQUIRE_EQ("foo", words[0]);
Packit 209faa
        ATF_REQUIRE_EQ("", words[1]);
Packit 209faa
        ATF_REQUIRE_EQ("bar", words[2]);
Packit 209faa
    }
Packit 209faa
}
Packit 209faa
Packit 209faa
Packit 209faa
ATF_TEST_CASE_WITHOUT_HEAD(path_option__short_name);
Packit 209faa
ATF_TEST_CASE_BODY(path_option__short_name)
Packit 209faa
{
Packit 209faa
    const cmdline::path_option o('p', "path", "The path", "arg", "value");
Packit 209faa
    ATF_REQUIRE(o.has_short_name());
Packit 209faa
    ATF_REQUIRE_EQ('p', o.short_name());
Packit 209faa
    ATF_REQUIRE_EQ("path", o.long_name());
Packit 209faa
    ATF_REQUIRE_EQ("The path", o.description());
Packit 209faa
    ATF_REQUIRE(o.needs_arg());
Packit 209faa
    ATF_REQUIRE_EQ("arg", o.arg_name());
Packit 209faa
    ATF_REQUIRE(o.has_default_value());
Packit 209faa
    ATF_REQUIRE_EQ("value", o.default_value());
Packit 209faa
}
Packit 209faa
Packit 209faa
Packit 209faa
ATF_TEST_CASE_WITHOUT_HEAD(path_option__long_name);
Packit 209faa
ATF_TEST_CASE_BODY(path_option__long_name)
Packit 209faa
{
Packit 209faa
    const cmdline::path_option o("path", "The path", "arg", "value");
Packit 209faa
    ATF_REQUIRE(!o.has_short_name());
Packit 209faa
    ATF_REQUIRE_EQ("path", o.long_name());
Packit 209faa
    ATF_REQUIRE_EQ("The path", o.description());
Packit 209faa
    ATF_REQUIRE(o.needs_arg());
Packit 209faa
    ATF_REQUIRE_EQ("arg", o.arg_name());
Packit 209faa
    ATF_REQUIRE(o.has_default_value());
Packit 209faa
    ATF_REQUIRE_EQ("value", o.default_value());
Packit 209faa
}
Packit 209faa
Packit 209faa
Packit 209faa
ATF_TEST_CASE_WITHOUT_HEAD(path_option__type);
Packit 209faa
ATF_TEST_CASE_BODY(path_option__type)
Packit 209faa
{
Packit 209faa
    const cmdline::path_option o("path", "The path", "arg");
Packit 209faa
Packit 209faa
    o.validate("/some/path");
Packit 209faa
Packit 209faa
    try {
Packit 209faa
        o.validate("");
Packit 209faa
        fail("option_argument_value_error not raised");
Packit 209faa
    } catch (const cmdline::option_argument_value_error& e) {
Packit 209faa
        // Expected; ignore.
Packit 209faa
    }
Packit 209faa
Packit 209faa
    const cmdline::path_option::option_type path =
Packit 209faa
        cmdline::path_option::convert("/foo/bar");
Packit 209faa
    ATF_REQUIRE_EQ("bar", path.leaf_name());  // Ensure valid type.
Packit 209faa
}
Packit 209faa
Packit 209faa
Packit 209faa
ATF_TEST_CASE_WITHOUT_HEAD(property_option__short_name);
Packit 209faa
ATF_TEST_CASE_BODY(property_option__short_name)
Packit 209faa
{
Packit 209faa
    const cmdline::property_option o('p', "property", "The property", "a=b");
Packit 209faa
    ATF_REQUIRE(o.has_short_name());
Packit 209faa
    ATF_REQUIRE_EQ('p', o.short_name());
Packit 209faa
    ATF_REQUIRE_EQ("property", o.long_name());
Packit 209faa
    ATF_REQUIRE_EQ("The property", o.description());
Packit 209faa
    ATF_REQUIRE(o.needs_arg());
Packit 209faa
    ATF_REQUIRE_EQ("a=b", o.arg_name());
Packit 209faa
    ATF_REQUIRE(!o.has_default_value());
Packit 209faa
}
Packit 209faa
Packit 209faa
Packit 209faa
ATF_TEST_CASE_WITHOUT_HEAD(property_option__long_name);
Packit 209faa
ATF_TEST_CASE_BODY(property_option__long_name)
Packit 209faa
{
Packit 209faa
    const cmdline::property_option o("property", "The property", "a=b");
Packit 209faa
    ATF_REQUIRE(!o.has_short_name());
Packit 209faa
    ATF_REQUIRE_EQ("property", o.long_name());
Packit 209faa
    ATF_REQUIRE_EQ("The property", o.description());
Packit 209faa
    ATF_REQUIRE(o.needs_arg());
Packit 209faa
    ATF_REQUIRE_EQ("a=b", o.arg_name());
Packit 209faa
    ATF_REQUIRE(!o.has_default_value());
Packit 209faa
}
Packit 209faa
Packit 209faa
Packit 209faa
ATF_TEST_CASE_WITHOUT_HEAD(property_option__type);
Packit 209faa
ATF_TEST_CASE_BODY(property_option__type)
Packit 209faa
{
Packit 209faa
    typedef std::pair< std::string, std::string > string_pair;
Packit 209faa
    const cmdline::property_option o("property", "The property", "a=b");
Packit 209faa
Packit 209faa
    o.validate("foo=bar");
Packit 209faa
    ATF_REQUIRE(string_pair("foo", "bar") ==
Packit 209faa
                cmdline::property_option::convert("foo=bar"));
Packit 209faa
Packit 209faa
    o.validate(" foo  = bar  baz");
Packit 209faa
    ATF_REQUIRE(string_pair(" foo  ", " bar  baz") ==
Packit 209faa
                cmdline::property_option::convert(" foo  = bar  baz"));
Packit 209faa
Packit 209faa
    ATF_REQUIRE_THROW(cmdline::option_argument_value_error, o.validate(""));
Packit 209faa
    ATF_REQUIRE_THROW(cmdline::option_argument_value_error, o.validate("="));
Packit 209faa
    ATF_REQUIRE_THROW(cmdline::option_argument_value_error, o.validate("a="));
Packit 209faa
    ATF_REQUIRE_THROW(cmdline::option_argument_value_error, o.validate("=b"));
Packit 209faa
}
Packit 209faa
Packit 209faa
Packit 209faa
ATF_TEST_CASE_WITHOUT_HEAD(string_option__short_name);
Packit 209faa
ATF_TEST_CASE_BODY(string_option__short_name)
Packit 209faa
{
Packit 209faa
    const cmdline::string_option o('p', "string", "The string", "arg", "value");
Packit 209faa
    ATF_REQUIRE(o.has_short_name());
Packit 209faa
    ATF_REQUIRE_EQ('p', o.short_name());
Packit 209faa
    ATF_REQUIRE_EQ("string", o.long_name());
Packit 209faa
    ATF_REQUIRE_EQ("The string", o.description());
Packit 209faa
    ATF_REQUIRE(o.needs_arg());
Packit 209faa
    ATF_REQUIRE_EQ("arg", o.arg_name());
Packit 209faa
    ATF_REQUIRE(o.has_default_value());
Packit 209faa
    ATF_REQUIRE_EQ("value", o.default_value());
Packit 209faa
}
Packit 209faa
Packit 209faa
Packit 209faa
ATF_TEST_CASE_WITHOUT_HEAD(string_option__long_name);
Packit 209faa
ATF_TEST_CASE_BODY(string_option__long_name)
Packit 209faa
{
Packit 209faa
    const cmdline::string_option o("string", "The string", "arg", "value");
Packit 209faa
    ATF_REQUIRE(!o.has_short_name());
Packit 209faa
    ATF_REQUIRE_EQ("string", o.long_name());
Packit 209faa
    ATF_REQUIRE_EQ("The string", o.description());
Packit 209faa
    ATF_REQUIRE(o.needs_arg());
Packit 209faa
    ATF_REQUIRE_EQ("arg", o.arg_name());
Packit 209faa
    ATF_REQUIRE(o.has_default_value());
Packit 209faa
    ATF_REQUIRE_EQ("value", o.default_value());
Packit 209faa
}
Packit 209faa
Packit 209faa
Packit 209faa
ATF_TEST_CASE_WITHOUT_HEAD(string_option__type);
Packit 209faa
ATF_TEST_CASE_BODY(string_option__type)
Packit 209faa
{
Packit 209faa
    const cmdline::string_option o("string", "The string", "foo");
Packit 209faa
Packit 209faa
    o.validate("");
Packit 209faa
    o.validate("some string");
Packit 209faa
Packit 209faa
    const cmdline::string_option::option_type string =
Packit 209faa
        cmdline::string_option::convert("foo");
Packit 209faa
    ATF_REQUIRE_EQ(3, string.length());  // Ensure valid type.
Packit 209faa
}
Packit 209faa
Packit 209faa
Packit 209faa
ATF_INIT_TEST_CASES(tcs)
Packit 209faa
{
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, base_option__short_name__no_arg);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, base_option__short_name__with_arg__no_default);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, base_option__short_name__with_arg__with_default);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, base_option__long_name__no_arg);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, base_option__long_name__with_arg__no_default);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, base_option__long_name__with_arg__with_default);
Packit 209faa
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, bool_option__short_name);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, bool_option__long_name);
Packit 209faa
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, int_option__short_name);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, int_option__long_name);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, int_option__type);
Packit 209faa
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, list_option__short_name);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, list_option__long_name);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, list_option__type);
Packit 209faa
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, path_option__short_name);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, path_option__long_name);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, path_option__type);
Packit 209faa
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, property_option__short_name);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, property_option__long_name);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, property_option__type);
Packit 209faa
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, string_option__short_name);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, string_option__long_name);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, string_option__type);
Packit 209faa
}