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 }