| /* |
| * Copyright 2020 Google Inc. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions are |
| * met: redistributions of source code must retain the above copyright |
| * notice, this list of conditions and the following disclaimer; |
| * redistributions in binary form must reproduce the above copyright |
| * notice, this list of conditions and the following disclaimer in the |
| * documentation and/or other materials provided with the distribution; |
| * neither the name of the copyright holders nor the names of its |
| * contributors may be used to endorse or promote products derived from |
| * this software without specific prior written permission. |
| * |
| * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
| * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
| * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
| * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
| * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
| * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
| * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
| * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
| * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| */ |
| |
| #include <gtest/gtest.h> |
| |
| // For EXPECT_THAT and HasSubstr |
| #include <gmock/gmock.h> |
| |
| #include "args.hh" |
| #include "command.hh" |
| |
| bool ran_test1 = false; |
| |
| // A dummy class so we can make a reference to pass around. |
| class DispatchTable {}; |
| |
| DispatchTable dt; |
| |
| bool |
| do_test1(const DispatchTable &dt, Args &args) |
| { |
| ran_test1 = true; |
| return true; |
| } |
| |
| bool ran_test2 = false; |
| |
| bool |
| do_test2(const DispatchTable &dt, Args &args) |
| { |
| ran_test2 = true; |
| return true; |
| } |
| |
| TEST(CommandTest, OneCommandNoArgs) |
| { |
| Command test1("test1", 0, 0, do_test1, ""); |
| |
| // Try to run the command with an extra argument, expecting it to fail. |
| EXPECT_FALSE(ran_test1); |
| Args args1({ "test1", "extra" }); |
| EXPECT_FALSE(Command::run(dt, args1)); |
| EXPECT_FALSE(ran_test1); |
| |
| // Try to run with an unrecognized command. |
| Args args2({ "bad_command" }); |
| EXPECT_FALSE(Command::run(dt, args2)); |
| EXPECT_FALSE(ran_test1); |
| |
| // Run with the right name and number of arguments. |
| Args args3({ "test1" }); |
| EXPECT_TRUE(Command::run(dt, args3)); |
| EXPECT_TRUE(ran_test1); |
| ran_test1 = false; |
| |
| // Try with no command at all. |
| Args args4({}); |
| EXPECT_FALSE(Command::run(dt, args4)); |
| EXPECT_FALSE(ran_test1); |
| } |
| |
| TEST(CommandTest, OneCommandSomeArgs) |
| { |
| Command test1("test1", 2, 3, do_test1, ""); |
| |
| // Too few arguments. |
| EXPECT_FALSE(ran_test1); |
| Args args1({ "test1" }); |
| EXPECT_FALSE(Command::run(dt, args1)); |
| EXPECT_FALSE(ran_test1); |
| |
| // Too many arguments. |
| Args args2({ "test1", "arg1", "arg2", "arg3", "arg4" }); |
| EXPECT_FALSE(Command::run(dt, args2)); |
| EXPECT_FALSE(ran_test1); |
| |
| // Just enough arguments. |
| Args args3({ "test1", "arg1", "arg2" }); |
| EXPECT_TRUE(Command::run(dt, args3)); |
| EXPECT_TRUE(ran_test1); |
| ran_test1 = false; |
| |
| // Almost too many arguments. |
| Args args4({ "test1", "arg1", "arg2", "arg3" }); |
| EXPECT_TRUE(Command::run(dt, args4)); |
| EXPECT_TRUE(ran_test1); |
| ran_test1 = false; |
| } |
| |
| TEST(CommandTest, TwoCommands) |
| { |
| Command test1("test1", 0, 0, do_test1, ""); |
| Command test2("test2", 1, 1, do_test2, ""); |
| |
| // Try a bad command name. |
| Args args1({ "bad_command" }); |
| EXPECT_FALSE(Command::run(dt, args1)); |
| EXPECT_FALSE(ran_test1); |
| EXPECT_FALSE(ran_test2); |
| |
| // Try the right command with the wrong number of arguments. |
| Args args2({ "test1", "arg1" }); |
| EXPECT_FALSE(Command::run(dt, args2)); |
| EXPECT_FALSE(ran_test1); |
| EXPECT_FALSE(ran_test2); |
| |
| // Run the first command. |
| Args args3({ "test1" }); |
| EXPECT_TRUE(Command::run(dt, args3)); |
| EXPECT_TRUE(ran_test1); |
| EXPECT_FALSE(ran_test2); |
| ran_test1 = ran_test2 = false; |
| |
| // Run the second command. |
| Args args4({ "test2", "arg1" }); |
| EXPECT_TRUE(Command::run(dt, args4)); |
| EXPECT_FALSE(ran_test1); |
| EXPECT_TRUE(ran_test2); |
| ran_test1 = ran_test2 = false; |
| } |
| |
| TEST(CommandTest, Usage) |
| { |
| std::string name1 = "test1"; |
| std::string usage1 = "first test usage string"; |
| std::string name2 = "test2"; |
| std::string usage2 = "second test usage string"; |
| |
| Command test1(name1, 0, 0, do_test1, usage1); |
| Command test2(name2, 0, 0, do_test2, usage2); |
| |
| auto summary = Command::usageSummary(); |
| |
| EXPECT_THAT(summary, testing::HasSubstr(name1)); |
| EXPECT_THAT(summary, testing::HasSubstr(usage1)); |
| |
| EXPECT_THAT(summary, testing::HasSubstr(name2)); |
| EXPECT_THAT(summary, testing::HasSubstr(usage2)); |
| } |