1 // Copyright 2015, Tobias Hermann and the FunctionalPlus contributors. 2 // https://github.com/Dobiasd/FunctionalPlus 3 // Distributed under the Boost Software License, Version 1.0. 4 // (See accompanying file LICENSE_1_0.txt or copy at 5 // http://www.boost.org/LICENSE_1_0.txt) 6 7 #include <doctest/doctest.h> 8 #include <fplus/fplus.hpp> 9 10 namespace { 11 typedef std::vector<int> IntVector; 12 IntVector xs = {1,2,2,3,2}; 13 typedef std::vector<IntVector> IntVectors; 14 typedef std::vector<std::size_t> IdxVector; 15 typedef std::list<int> IntList; 16 typedef std::vector<IntList> IntLists; __anon12f444c10202(int x)17 auto is_even_int = [](int x){ return x % 2 == 0; }; 18 } 19 20 TEST_CASE("split_test - split functions") 21 { 22 using namespace fplus; 23 24 REQUIRE_EQ(split(0, true, IntVector{1,0,1}), IntVectors({{1},{1}})); 25 REQUIRE_EQ(split(0, true, IntVector{0,1,0}), IntVectors({{},{1},{}})); 26 REQUIRE_EQ(split(0, true, IntVector{0,1}), IntVectors({{},{1}})); 27 REQUIRE_EQ(split(0, true, IntVector{1,0}), IntVectors({{1},{}})); 28 REQUIRE_EQ(split(0, true, IntVector{0}), IntVectors({{},{}})); 29 REQUIRE_EQ(split(0, true, IntVector{}), IntVectors{{}}); 30 31 REQUIRE_EQ(split(0, false, IntVector{1,0,1}), IntVectors({{1},{1}})); 32 REQUIRE_EQ(split(0, false, IntVector{0,1,0}), IntVectors{{1}}); 33 REQUIRE_EQ(split(0, false, IntVector{0,1}), IntVectors{{1}}); 34 REQUIRE_EQ(split(0, false, IntVector{1,0}), IntVectors{{1}}); 35 REQUIRE_EQ(split(0, false, IntVector{0}), IntVectors({})); 36 REQUIRE_EQ(split(0, false, IntVector{}), IntVectors({})); 37 38 REQUIRE_EQ(split(0, true, IntVector{1,0,1}), IntVectors({{1},{1}})); 39 REQUIRE_EQ(split(0, true, IntVector{0,1,0}), IntVectors({{},{1},{}})); 40 REQUIRE_EQ(split(0, true, IntVector{0,1}), IntVectors({{},{1}})); 41 REQUIRE_EQ(split(0, true, IntVector{1,0}), IntVectors({{1},{}})); 42 REQUIRE_EQ(split(0, true, IntVector{0}), IntVectors({{},{}})); 43 REQUIRE_EQ(split(0, true, IntVector{}), IntVectors{{}}); 44 45 REQUIRE_EQ(split(0, false, IntVector{1,0,1}), IntVectors({{1},{1}})); 46 REQUIRE_EQ(split(0, false, IntVector{0,1,0}), IntVectors{{1}}); 47 REQUIRE_EQ(split(0, false, IntVector{0,1}), IntVectors{{1}}); 48 REQUIRE_EQ(split(0, false, IntVector{1,0}), IntVectors{{1}}); 49 REQUIRE_EQ(split(0, false, IntVector{0}), IntVectors({})); 50 REQUIRE_EQ(split(0, false, IntVector{}), IntVectors({})); 51 52 REQUIRE_EQ(split_by_token(IntVector({0}), true, IntVector{1,0,1}), IntVectors({{1},{1}})); 53 REQUIRE_EQ(split_by_token(IntVector({0}), true, IntVector{0,1,0}), IntVectors({{},{1},{}})); 54 REQUIRE_EQ(split_by_token(IntVector({0}), true, IntVector{0,1}), IntVectors({{},{1}})); 55 REQUIRE_EQ(split_by_token(IntVector({0}), true, IntVector{1,0}), IntVectors({{1},{}})); 56 REQUIRE_EQ(split_by_token(IntVector({0}), true, IntVector{0}), IntVectors({{},{}})); 57 REQUIRE_EQ(split_by_token(IntVector({0}), true, IntVector{}), IntVectors{{}}); 58 59 REQUIRE_EQ(split_by_token(IntVector({0}), false, IntVector{1,0,1}), IntVectors({{1},{1}})); 60 REQUIRE_EQ(split_by_token(IntVector({0}), false, IntVector{0,1,0}), IntVectors{{1}}); 61 REQUIRE_EQ(split_by_token(IntVector({0}), false, IntVector{0,1}), IntVectors{{1}}); 62 REQUIRE_EQ(split_by_token(IntVector({0}), false, IntVector{1,0}), IntVectors{{1}}); 63 REQUIRE_EQ(split_by_token(IntVector({0}), false, IntVector{0}), IntVectors({})); 64 REQUIRE_EQ(split_by_token(IntVector({0}), false, IntVector{}), IntVectors({})); 65 66 REQUIRE_EQ(split_by_token(IntVector({0,9}), true, IntVector{1,0,9,1}), IntVectors({{1},{1}})); 67 REQUIRE_EQ(split_by_token(IntVector({0,9}), true, IntVector{0,9,1,0,9}), IntVectors({{},{1},{}})); 68 REQUIRE_EQ(split_by_token(IntVector({0,9}), true, IntVector{0,9,1}), IntVectors({{},{1}})); 69 REQUIRE_EQ(split_by_token(IntVector({0,9}), true, IntVector{1,0,9}), IntVectors({{1},{}})); 70 REQUIRE_EQ(split_by_token(IntVector({0,9}), true, IntVector{0,9}), IntVectors({{},{}})); 71 REQUIRE_EQ(split_by_token(IntVector({0,9}), true, IntVector{}), IntVectors{{}}); 72 73 REQUIRE_EQ(split_by_token(IntVector({0,9}), false, IntVector{1,0,9,1}), IntVectors({{1},{1}})); 74 REQUIRE_EQ(split_by_token(IntVector({0,9}), false, IntVector{0,9,1,0,9}), IntVectors{{1}}); 75 REQUIRE_EQ(split_by_token(IntVector({0,9}), false, IntVector{0,9,1}), IntVectors{{1}}); 76 REQUIRE_EQ(split_by_token(IntVector({0,9}), false, IntVector{1,0,9}), IntVectors{{1}}); 77 REQUIRE_EQ(split_by_token(IntVector({0,9}), false, IntVector{0,9}), IntVectors({})); 78 REQUIRE_EQ(split_by_token(IntVector({0,9}), false, IntVector{}), IntVectors({})); 79 80 REQUIRE_EQ(split_by_token(IntVector({}), true, IntVector{}), IntVectors({{},{}})); 81 REQUIRE_EQ(split_by_token(IntVector({}), true, IntVector{1}), IntVectors({{},{1},{}})); 82 REQUIRE_EQ(split_by_token(IntVector({}), true, IntVector{1,2}), IntVectors({{},{1},{2},{}})); 83 84 REQUIRE_EQ(split_by_token(IntVector({}), false, IntVector{}), IntVectors({})); 85 REQUIRE_EQ(split_by_token(IntVector({}), false, IntVector{1}), IntVectors{{1}}); 86 REQUIRE_EQ(split_by_token(IntVector({}), false, IntVector{1,2}), IntVectors({{1},{2}})); 87 88 REQUIRE_EQ(split_one_of(IntVector({0,3}), true, IntVector{1,3,2,0,0,6,0,7,5}), IntVectors({{1},{2},{},{6},{7,5}})); 89 REQUIRE_EQ(split_one_of(std::string(" ,.?"), false, std::string("Hi, how are you?")), std::vector<std::string>({"Hi", "how", "are", "you"})); 90 91 REQUIRE_EQ(split_at_idx(2, xs), std::make_pair(IntVector({1,2}), IntVector({2,3,2}))); 92 REQUIRE_EQ(partition(is_even_int, xs), std::make_pair(IntVector({2,2,2}), IntVector({1,3}))); 93 REQUIRE_EQ(split_every(2, xs), IntVectors({{1,2}, {2, 3}, {2}})); 94 auto splittedAt1And3 = split_at_idxs(IdxVector({1,3}), xs); 95 IntVectors splittedAt1And3Dest = {IntVector({1}), IntVector({2,2}), IntVector({3,2})}; 96 REQUIRE_EQ(splittedAt1And3, splittedAt1And3Dest); 97 auto splittedAt1And3And3 = split_at_idxs(IdxVector({1,3,3}), xs); 98 IntVectors splittedAt1And3And3Dest = {IntVector({1}), IntVector({2,2}), IntVector({}), IntVector({3,2})}; 99 REQUIRE_EQ(splittedAt1And3And3, splittedAt1And3And3Dest); 100 REQUIRE_EQ(split(3, true, xs), IntVectors({IntVector({1, 2, 2}), IntVector({2})})); 101 REQUIRE_EQ(split(1, true, IntVector{0,1,2}), IntVectors({{0},{2}})); 102 REQUIRE_EQ(split(2, true, IntVector{5,2,0,3}), IntVectors({{5},{0,3}})); 103 104 REQUIRE_EQ(split(2, true, IntVector{1,2}), IntVectors({{1},{}})); 105 REQUIRE_EQ(split(2, true, IntVector{2}), IntVectors({{},{}})); 106 REQUIRE_EQ(split(2, true, IntVector{}), IntVectors{{}}); 107 108 REQUIRE_EQ(split_by(is_even_int, true, IntList({1,3,2,2,5,5,3,6,7,9})), IntLists({{1,3},{},{5,5,3},{7,9}})); 109 REQUIRE_EQ(split_by_keep_separators(is_even_int, IntList({})), IntLists()); 110 REQUIRE_EQ(split_by_keep_separators(is_even_int, IntList({2})), IntLists({IntList({2})})); 111 REQUIRE_EQ(split_by_keep_separators(is_even_int, IntList({2,2,3})), IntLists({{2},{2,3}})); 112 REQUIRE_EQ(split_by_keep_separators(is_even_int, IntList({1,3,2})), IntLists({{1,3},{2}})); 113 REQUIRE_EQ(split_by_keep_separators(is_even_int, IntList({1,3,2,2,5,5,3,6,7,9})), IntLists({{1,3},{2},{2,5,5,3},{6,7,9}})); 114 REQUIRE_EQ(split_keep_separators(2, IntList({1,3,2,2,5,5,3,2,7,9})), IntLists({{1,3},{2},{2,5,5,3},{2,7,9}})); 115 }