/
merge.cpp
111 lines (86 loc) · 4.24 KB
/
merge.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#include <burst/container/make_deque.hpp>
#include <burst/container/make_list.hpp>
#include <burst/container/make_vector.hpp>
#include <burst/range/make_range_vector.hpp>
#include <burst/range/merge.hpp>
#include <doctest/doctest.h>
#include <boost/range/algorithm/for_each.hpp>
#include <functional>
#include <vector>
TEST_SUITE("merge")
{
TEST_CASE("Слияние пустых диапазонов — пустой диапазон")
{
std::vector<int> first;
std::vector<int> second;
auto ranges = burst::make_range_vector(first, second);
auto merged_range = burst::merge(ranges);
CHECK(merged_range.empty());
}
TEST_CASE("Слияние одного диапазона — сам этот диапазон")
{
int array[] = {1, 2, 3, 4};
auto ranges = burst::make_range_vector(array);
auto merged_range = burst::merge(ranges);
CHECK(merged_range == array);
}
TEST_CASE("Слияние пилообразно дополняющих друг друга диапазонов содержит все элементы "
"исходных диапазонов")
{
auto first = burst::make_list({'h', 'f', 'd', 'b'});
auto second = burst::make_list({'g', 'e', 'c', 'a'});
auto ranges = burst::make_range_vector(first, second);
auto merged_range = burst::merge(ranges, std::greater<>{});
auto expected_collection = {'h', 'g', 'f', 'e', 'd', 'c', 'b', 'a'};
CHECK(merged_range == expected_collection);
}
TEST_CASE("Слияние нескольких непересекающихся диапазонов порождает диапазон, составленный из "
"всех элементов исходных диапазонов")
{
auto first = {1, 2, 3};
auto second = {4, 5, 6};
auto third = {7, 8, 9};
auto ranges = burst::make_range_vector(first, second, third);
auto merged_range = burst::merge(ranges, std::less<>{});
auto expected_collection = {1, 2, 3, 4, 5, 6, 7, 8, 9};
CHECK(merged_range == expected_collection);
}
TEST_CASE("Результирующий диапазон ссылается на исходные диапазоны, так что изменение "
"элементов результирующего диапазона влечёт изменение соответствующих элементов исходных")
{
auto first = burst::make_vector({100, 50});
auto second = burst::make_vector({70, 30});
auto merged_range = burst::merge(std::tie(first, second), std::greater<>{});
boost::for_each(merged_range, [] (auto & x) { x /= 10; });
CHECK(first[0] == 10);
CHECK(first[1] == 5);
CHECK(second[0] == 7);
CHECK(second[1] == 3);
}
TEST_CASE("Слияние можно вызывать без предварительного создания диапазона диапазонов")
{
auto odd = burst::make_vector({1, 3, 5, 7});
auto even = burst::make_vector({0, 2, 4, 6, 8});
auto merged_range = burst::merge(std::tie(odd, even));
auto expected_collection = {0, 1, 2, 3, 4, 5, 6, 7, 8};
CHECK(merged_range == expected_collection);
}
TEST_CASE("Можно сливать диапазоны разных типов")
{
auto one = burst::make_vector({0, 3, 6, 9});
auto two = burst::make_list({1, 4, 7, 10});
auto three = burst::make_deque({2, 5, 8, 11});
auto merged_range = burst::merge(std::tie(one, two, three));
auto expected_collection = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
CHECK(merged_range == expected_collection);
}
TEST_CASE("Можно сливать с предикатом диапазоны разных типов")
{
auto one = burst::make_vector({9, 6, 3, 0});
auto two = burst::make_list({10, 7, 4, 1});
auto three = burst::make_deque({11, 8, 5, 2});
auto merged_range = burst::merge(std::tie(one, two, three), std::greater<>{});
auto expected_collection = {11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0};
CHECK(merged_range == expected_collection);
}
}