based

Opinionated utility library
git clone git://git.dimitrijedobrota.com/based.git
Log | Files | Refs | README | LICENSE | HACKING | CONTRIBUTING | CODE_OF_CONDUCT | BUILDING

find_if_n_test.cpp (7657B)


0 #include <array> 1 2 #include <catch2/catch_test_macros.hpp> 3 4 #include "based/algorithm.hpp" 5 6 struct predicate 7 { 8 int goal; 9 10 explicit predicate(int init) 11 : goal(init) 12 { 13 } 14 15 auto operator()(int n) const { return n == goal; } 16 }; 17 18 TEST_CASE("find_if_n(empty)", "[algorithm/find_if_n]") 19 { 20 const std::array<int, 0> arr = {}; 21 const auto [itr, left] = 22 based::find_if_n(std::begin(arr), std::size(arr), predicate {0}); 23 24 REQUIRE(itr == std::end(arr)); 25 } 26 27 TEST_CASE("find_if_n(one)", "[algorithm/find_if_n]") 28 { 29 const std::array arr = {0}; 30 31 SECTION("found") 32 { 33 const auto [itr, left] = 34 based::find_if_n(std::begin(arr), std::size(arr), predicate {0}); 35 const auto idx = std::distance(std::cbegin(arr), itr); 36 37 REQUIRE(idx == 0); 38 REQUIRE(idx + left == std::size(arr)); 39 } 40 41 SECTION("not found") 42 { 43 const auto [itr, left] = 44 based::find_if_n(std::begin(arr), std::size(arr), predicate {1}); 45 const auto idx = std::distance(std::cbegin(arr), itr); 46 47 REQUIRE(idx == 1); 48 REQUIRE(idx + left == std::size(arr)); 49 } 50 } 51 52 TEST_CASE("find_if_n(two)", "[algorithm/find_if_n]") 53 { 54 const std::array arr = {0, 1}; 55 56 SECTION("found 1") 57 { 58 const auto [itr, left] = 59 based::find_if_n(std::begin(arr), std::size(arr), predicate {0}); 60 const auto idx = std::distance(std::cbegin(arr), itr); 61 62 REQUIRE(idx == 0); 63 REQUIRE(idx + left == std::size(arr)); 64 } 65 66 SECTION("found 2") 67 { 68 const auto [itr, left] = 69 based::find_if_n(std::begin(arr), std::size(arr), predicate {1}); 70 const auto idx = std::distance(std::cbegin(arr), itr); 71 72 REQUIRE(idx == 1); 73 REQUIRE(idx + left == std::size(arr)); 74 } 75 76 SECTION("not found") 77 { 78 const auto [itr, left] = 79 based::find_if_n(std::begin(arr), std::size(arr), predicate {2}); 80 const auto idx = std::distance(std::cbegin(arr), itr); 81 82 REQUIRE(idx == 2); 83 REQUIRE(idx + left == std::size(arr)); 84 } 85 } 86 87 TEST_CASE("find_if_n(multiple)", "[algorithm/find_if_n]") 88 { 89 const std::array arr = {0, 0, 0, 0}; 90 91 SECTION("found") 92 { 93 const auto [itr, left] = 94 based::find_if_n(std::begin(arr), std::size(arr), predicate {0}); 95 const auto idx = std::distance(std::cbegin(arr), itr); 96 97 REQUIRE(idx == 0); 98 REQUIRE(idx + left == std::size(arr)); 99 } 100 101 SECTION("not found") 102 { 103 const auto [itr, left] = 104 based::find_if_n(std::begin(arr), std::size(arr), predicate {1}); 105 const auto idx = std::distance(std::cbegin(arr), itr); 106 107 REQUIRE(idx == 4); 108 REQUIRE(idx + left == std::size(arr)); 109 } 110 } 111 112 TEST_CASE("find_if_not_n(empty)", "[algorithm/find_if_not_n]") 113 { 114 const std::array<int, 0> arr = {}; 115 const auto [itr, left] = 116 based::find_if_not_n(std::begin(arr), std::size(arr), predicate {0}); 117 118 REQUIRE(itr == std::end(arr)); 119 } 120 121 TEST_CASE("find_if_not_n(one)", "[algorithm/find_if_not_n]") 122 { 123 const std::array arr = {0}; 124 125 SECTION("found") 126 { 127 const auto [itr, left] = 128 based::find_if_not_n(std::begin(arr), std::size(arr), predicate {1}); 129 130 const auto idx = std::distance(std::cbegin(arr), itr); 131 132 REQUIRE(idx == 0); 133 REQUIRE(idx + left == std::size(arr)); 134 } 135 136 SECTION("not found") 137 { 138 const auto [itr, left] = 139 based::find_if_not_n(std::begin(arr), std::size(arr), predicate {0}); 140 const auto idx = std::distance(std::cbegin(arr), itr); 141 142 REQUIRE(idx == 1); 143 REQUIRE(idx + left == std::size(arr)); 144 } 145 } 146 147 TEST_CASE("find_if_not_n(two)", "[algorithm/find_if_not_n]") 148 { 149 const std::array arr = {0, 1}; 150 151 SECTION("found 1") 152 { 153 const auto [itr, left] = 154 based::find_if_not_n(std::begin(arr), std::size(arr), predicate {1}); 155 const auto idx = std::distance(std::cbegin(arr), itr); 156 REQUIRE(idx == 0); 157 REQUIRE(idx + left == std::size(arr)); 158 } 159 160 SECTION("found 2") 161 { 162 const auto [itr, left] = 163 based::find_if_not_n(std::begin(arr), std::size(arr), predicate {0}); 164 const auto idx = std::distance(std::cbegin(arr), itr); 165 166 REQUIRE(idx == 1); 167 REQUIRE(idx + left == std::size(arr)); 168 } 169 } 170 171 TEST_CASE("find_if_not_n(multiple)", "[algorithm/find_if_not_n]") 172 { 173 const std::array arr = {0, 0, 0, 0}; 174 175 SECTION("found") 176 { 177 const auto [itr, left] = 178 based::find_if_not_n(std::begin(arr), std::size(arr), predicate {1}); 179 const auto idx = std::distance(std::cbegin(arr), itr); 180 181 REQUIRE(idx == 0); 182 REQUIRE(idx + left == std::size(arr)); 183 } 184 185 SECTION("not found") 186 { 187 const auto [itr, left] = 188 based::find_if_not_n(std::begin(arr), std::size(arr), predicate {0}); 189 const auto idx = std::distance(std::cbegin(arr), itr); 190 191 REQUIRE(idx == 4); 192 REQUIRE(idx + left == std::size(arr)); 193 } 194 } 195 196 TEST_CASE("all_n(empty)", "[algorithm/all_n]") 197 { 198 const std::array<int, 0> arr = {}; 199 200 REQUIRE(based::all_n(std::begin(arr), std::size(arr), predicate {0})); 201 } 202 203 TEST_CASE("all_n(homogeneous)", "[algorithm/all_n]") 204 { 205 const std::array arr = {1, 1, 1, 1, 1, 1}; 206 207 REQUIRE(based::all_n(std::begin(arr), std::size(arr), predicate {1})); 208 REQUIRE(!based::all_n(std::begin(arr), std::size(arr), predicate {2})); 209 } 210 211 TEST_CASE("all_n(non homogenous)", "[algorithm/all_n]") 212 { 213 const std::array arr = {1, 2, 1, 1, 1, 2}; 214 215 REQUIRE(!based::all_n(std::begin(arr), std::size(arr), predicate {1})); 216 REQUIRE(!based::all_n(std::begin(arr), std::size(arr), predicate {2})); 217 } 218 219 TEST_CASE("none_n(empty)", "[algorithm/none_n]") 220 { 221 const std::array<int, 0> arr = {}; 222 223 REQUIRE(based::none_n(std::begin(arr), std::size(arr), predicate {0})); 224 } 225 226 TEST_CASE("none_n(homogeneous)", "[algorithm/none_n]") 227 { 228 const std::array arr = {1, 1, 1, 1, 1, 1}; 229 230 REQUIRE(based::none_n(std::begin(arr), std::size(arr), predicate {2})); 231 REQUIRE(!based::none_n(std::begin(arr), std::size(arr), predicate {1})); 232 } 233 234 TEST_CASE("none_n(non homogeneous)", "[algorithm/none_n]") 235 { 236 const std::array arr = {1, 2, 1, 1, 1, 2}; 237 238 REQUIRE(based::none_n(std::begin(arr), std::size(arr), predicate {0})); 239 REQUIRE(!based::none_n(std::begin(arr), std::size(arr), predicate {2})); 240 REQUIRE(!based::none_n(std::begin(arr), std::size(arr), predicate {1})); 241 } 242 243 TEST_CASE("not_all_n(empty)", "[algorithm/not_all_n]") 244 { 245 const std::array<int, 0> arr = {}; 246 247 REQUIRE(based::not_all_n(std::begin(arr), std::size(arr), predicate {0})); 248 } 249 250 TEST_CASE("not_all_n(homogeneous)", "[algorithm/not_all_n]") 251 { 252 const std::array arr = {1, 1, 1, 1, 1, 1}; 253 254 REQUIRE(based::not_all_n(std::begin(arr), std::size(arr), predicate {2})); 255 REQUIRE(!based::not_all_n(std::begin(arr), std::size(arr), predicate {1})); 256 } 257 258 TEST_CASE("not_all_n(non homogeneous)", "[algorithm/not_all_n]") 259 { 260 const std::array arr = {1, 2, 1, 1, 1, 2}; 261 262 REQUIRE(based::not_all_n(std::begin(arr), std::size(arr), predicate {0})); 263 REQUIRE(based::not_all_n(std::begin(arr), std::size(arr), predicate {1})); 264 REQUIRE(based::not_all_n(std::begin(arr), std::size(arr), predicate {2})); 265 } 266 267 TEST_CASE("some_n(empty)", "[algorithm/some_n]") 268 { 269 const std::array<int, 0> arr = {}; 270 271 REQUIRE(!based::some_n(std::begin(arr), std::size(arr), predicate {0})); 272 } 273 274 TEST_CASE("some_n(homogeneous)", "[algorithm/some_n]") 275 { 276 const std::array arr = {1, 1, 1, 1, 1, 1}; 277 278 REQUIRE(based::some_n(std::begin(arr), std::size(arr), predicate {1})); 279 REQUIRE(!based::some_n(std::begin(arr), std::size(arr), predicate {2})); 280 } 281 282 TEST_CASE("some_n(non homogeneous)", "[algorithm/some_n]") 283 { 284 const std::array arr = {1, 2, 1, 1, 1, 2}; 285 286 REQUIRE(based::some_n(std::begin(arr), std::size(arr), predicate {1})); 287 REQUIRE(based::some_n(std::begin(arr), std::size(arr), predicate {2})); 288 REQUIRE(!based::some_n(std::begin(arr), std::size(arr), predicate {0})); 289 }