based

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

find_if_n_test.cpp (7657B)


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