1 // Copyright 2011 Google Inc. 2 // All rights reserved. 3 // 4 // Redistribution and use in source and binary forms, with or without 5 // modification, are permitted provided that the following conditions are 6 // met: 7 // 8 // * Redistributions of source code must retain the above copyright 9 // notice, this list of conditions and the following disclaimer. 10 // * Redistributions in binary form must reproduce the above copyright 11 // notice, this list of conditions and the following disclaimer in the 12 // documentation and/or other materials provided with the distribution. 13 // * Neither the name of Google Inc. nor the names of its contributors 14 // may be used to endorse or promote products derived from this software 15 // without specific prior written permission. 16 // 17 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 18 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 19 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 20 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 21 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 22 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 23 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 27 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 29 #include "utils/cmdline/commands_map.ipp" 30 31 #include <atf-c++.hpp> 32 33 #include "utils/cmdline/base_command.hpp" 34 #include "utils/defs.hpp" 35 #include "utils/sanity.hpp" 36 37 namespace cmdline = utils::cmdline; 38 39 40 namespace { 41 42 43 /// Fake command to validate the behavior of commands_map. 44 /// 45 /// Note that this command does not do anything. It is only intended to provide 46 /// a specific class that can be inserted into commands_map instances and check 47 /// that it can be located properly. 48 class mock_cmd : public cmdline::base_command_no_data { 49 public: 50 /// Constructor for the mock command. 51 /// 52 /// \param mock_name The name of the command. All other settings are set to 53 /// irrelevant values. 54 mock_cmd(const char* mock_name) : 55 cmdline::base_command_no_data(mock_name, "", 0, 0, 56 "Command for testing.") 57 { 58 } 59 60 /// Runs the mock command. 61 /// 62 /// \param unused_ui Object to interact with the I/O of the program. 63 /// \param unused_cmdline Representation of the command line to the 64 /// subcommand. 65 /// 66 /// \return Nothing because this function is never called. 67 int 68 run(cmdline::ui* UTILS_UNUSED_PARAM(ui), 69 const cmdline::parsed_cmdline& UTILS_UNUSED_PARAM(cmdline)) 70 { 71 UNREACHABLE; 72 } 73 }; 74 75 76 } // anonymous namespace 77 78 79 ATF_TEST_CASE_WITHOUT_HEAD(empty); 80 ATF_TEST_CASE_BODY(empty) 81 { 82 cmdline::commands_map< cmdline::base_command_no_data > commands; 83 ATF_REQUIRE(commands.empty()); 84 ATF_REQUIRE(commands.begin() == commands.end()); 85 } 86 87 88 ATF_TEST_CASE_WITHOUT_HEAD(some); 89 ATF_TEST_CASE_BODY(some) 90 { 91 cmdline::commands_map< cmdline::base_command_no_data > commands; 92 cmdline::base_command_no_data* cmd1 = new mock_cmd("cmd1"); 93 commands.insert(cmd1); 94 cmdline::base_command_no_data* cmd2 = new mock_cmd("cmd2"); 95 commands.insert(cmd2, "foo"); 96 97 ATF_REQUIRE(!commands.empty()); 98 99 cmdline::commands_map< cmdline::base_command_no_data >::const_iterator 100 iter = commands.begin(); 101 ATF_REQUIRE_EQ("", (*iter).first); 102 ATF_REQUIRE_EQ(1, (*iter).second.size()); 103 ATF_REQUIRE_EQ("cmd1", *(*iter).second.begin()); 104 105 ++iter; 106 ATF_REQUIRE_EQ("foo", (*iter).first); 107 ATF_REQUIRE_EQ(1, (*iter).second.size()); 108 ATF_REQUIRE_EQ("cmd2", *(*iter).second.begin()); 109 110 ATF_REQUIRE(++iter == commands.end()); 111 } 112 113 114 ATF_TEST_CASE_WITHOUT_HEAD(find__match); 115 ATF_TEST_CASE_BODY(find__match) 116 { 117 cmdline::commands_map< cmdline::base_command_no_data > commands; 118 cmdline::base_command_no_data* cmd1 = new mock_cmd("cmd1"); 119 commands.insert(cmd1); 120 cmdline::base_command_no_data* cmd2 = new mock_cmd("cmd2"); 121 commands.insert(cmd2); 122 123 ATF_REQUIRE(cmd1 == commands.find("cmd1")); 124 ATF_REQUIRE(cmd2 == commands.find("cmd2")); 125 } 126 127 128 ATF_TEST_CASE_WITHOUT_HEAD(find__nomatch); 129 ATF_TEST_CASE_BODY(find__nomatch) 130 { 131 cmdline::commands_map< cmdline::base_command_no_data > commands; 132 commands.insert(new mock_cmd("cmd1")); 133 134 ATF_REQUIRE(NULL == commands.find("cmd2")); 135 } 136 137 138 ATF_INIT_TEST_CASES(tcs) 139 { 140 ATF_ADD_TEST_CASE(tcs, empty); 141 ATF_ADD_TEST_CASE(tcs, some); 142 ATF_ADD_TEST_CASE(tcs, find__match); 143 ATF_ADD_TEST_CASE(tcs, find__nomatch); 144 } 145