Line data Source code
1 : // Author(s): Wieger Wesselink
2 : // Copyright: see the accompanying file COPYING or copy at
3 : // https://github.com/mCRL2org/mCRL2/blob/master/COPYING
4 : //
5 : // Distributed under the Boost Software License, Version 1.0.
6 : // (See accompanying file LICENSE_1_0.txt or copy at
7 : // http://www.boost.org/LICENSE_1_0.txt)
8 : //
9 : /// \file aterm_list_test.cpp
10 : /// \brief Add your file description here.
11 :
12 : #define BOOST_TEST_MODULE aterm_list_test
13 : #include <boost/test/included/unit_test.hpp>
14 :
15 : #include "mcrl2/atermpp/aterm_io.h"
16 : #include "mcrl2/atermpp/aterm_balanced_tree.h"
17 : #include "mcrl2/atermpp/set_operations.h"
18 :
19 : using namespace atermpp;
20 :
21 : struct counter
22 : {
23 : int& m_sum;
24 :
25 6 : counter(int& sum)
26 6 : : m_sum(sum)
27 6 : {}
28 :
29 22 : void operator()(const atermpp::aterm& t) const
30 : {
31 22 : m_sum += down_cast<aterm_int>(t).value();
32 22 : }
33 : };
34 :
35 : struct increment
36 : {
37 : atermpp::aterm operator()(const atermpp::aterm& t) const
38 : {
39 : return aterm_int(down_cast<aterm_int>(t).value() + 1);
40 : }
41 : };
42 :
43 : struct func
44 : {
45 : func()
46 : {}
47 :
48 : func(int)
49 : {}
50 :
51 : atermpp::aterm operator()(const atermpp::aterm& x) const
52 : {
53 : return read_term_from_string("f(" + pp(x) + ")");
54 : }
55 : };
56 :
57 2 : BOOST_AUTO_TEST_CASE(test_aterm_balanced_tree)
58 : {
59 1 : aterm_balanced_tree empty_tree;
60 1 : BOOST_CHECK(empty_tree.begin() == empty_tree.end());
61 :
62 2 : aterm_list q = read_list_from_string("[0,1,2,3,4,5,6,7,8,9]");
63 2 : aterm_list r(read_list_from_string("[0,1,2,3,4,6,1,7,8,9]"));
64 1 : aterm_balanced_tree qtree(q.begin(),10);
65 1 : aterm_balanced_tree rtree(r.begin(),10);
66 :
67 :
68 1 : BOOST_CHECK(qtree.size() == 10);
69 1 : BOOST_CHECK(!qtree.empty());
70 :
71 11 : for (int i = 0; i != 10; ++i)
72 : {
73 10 : BOOST_CHECK(qtree[i] == aterm_int(i));
74 : }
75 :
76 1 : BOOST_CHECK(std::equal(qtree.begin(), qtree.end(), q.begin()));
77 1 : BOOST_CHECK(std::equal(q.begin(), q.end(), qtree.begin()));
78 1 : BOOST_CHECK(aterm_balanced_tree(q.begin(), q.size()) == qtree);
79 :
80 1 : int count = 0;
81 :
82 1 : std::for_each(qtree.begin(), qtree.end(), counter(count));
83 :
84 1 : BOOST_CHECK(count == 45);
85 :
86 1 : count = 0;
87 :
88 1 : std::for_each(qtree.begin(), qtree.end(), counter(count));
89 :
90 1 : aterm_balanced_tree qcopy(q.begin(),10);
91 :
92 1 : qtree.swap(qcopy);
93 :
94 1 : BOOST_CHECK(std::equal(qtree.begin(), qtree.end(), q.begin()));
95 1 : BOOST_CHECK(std::equal(q.begin(), q.end(), qtree.begin()));
96 :
97 1 : BOOST_CHECK(!std::equal(rtree.begin(), rtree.end(), q.begin()));
98 1 : BOOST_CHECK(!std::equal(q.begin(), q.end(), rtree.begin()));
99 1 : }
100 :
101 2 : BOOST_AUTO_TEST_CASE(test_singleton_aterm_balanced_tree)
102 : {
103 1 : aterm_balanced_tree empty_tree;
104 1 : BOOST_CHECK(empty_tree.begin() == empty_tree.end());
105 :
106 2 : aterm_list q = read_list_from_string("[7]");
107 2 : aterm_list r(read_list_from_string("[0]"));
108 1 : aterm_balanced_tree qtree(q.begin(),1);
109 1 : aterm_balanced_tree rtree(r.begin(),1);
110 :
111 :
112 1 : BOOST_CHECK(qtree.size() == 1);
113 1 : BOOST_CHECK(!qtree.empty());
114 :
115 2 : for (int i = 0; i != 1; ++i)
116 : {
117 1 : BOOST_CHECK(qtree[i] == aterm_int(7));
118 : }
119 :
120 1 : BOOST_CHECK(std::equal(qtree.begin(), qtree.end(), q.begin()));
121 1 : BOOST_CHECK(std::equal(q.begin(), q.end(), qtree.begin()));
122 1 : BOOST_CHECK(aterm_balanced_tree(q.begin(), q.size()) == qtree);
123 :
124 1 : int count = 0;
125 :
126 1 : std::for_each(qtree.begin(), qtree.end(), counter(count));
127 :
128 1 : BOOST_CHECK(count == 7);
129 :
130 1 : count = 0;
131 :
132 1 : std::for_each(qtree.begin(), qtree.end(), counter(count));
133 :
134 1 : aterm_balanced_tree qcopy(q.begin(),1);
135 :
136 1 : qtree.swap(qcopy);
137 :
138 1 : BOOST_CHECK(std::equal(qtree.begin(), qtree.end(), q.begin()));
139 1 : BOOST_CHECK(std::equal(q.begin(), q.end(), qtree.begin()));
140 :
141 1 : BOOST_CHECK(!std::equal(rtree.begin(), rtree.end(), q.begin()));
142 1 : BOOST_CHECK(!std::equal(q.begin(), q.end(), rtree.begin()));
143 1 : }
144 :
145 2 : BOOST_AUTO_TEST_CASE(test_empty_aterm_balanced_tree)
146 : {
147 1 : aterm_balanced_tree empty_tree;
148 1 : BOOST_CHECK(empty_tree.begin() == empty_tree.end());
149 :
150 2 : aterm_list q = read_list_from_string("[]");
151 2 : aterm_list r(read_list_from_string("[]"));
152 1 : aterm_balanced_tree qtree(q.begin(),0);
153 1 : aterm_balanced_tree rtree(r.begin(),0);
154 :
155 :
156 1 : BOOST_CHECK(qtree.size() == 0);
157 1 : BOOST_CHECK(qtree.empty());
158 :
159 1 : for (int i = 0; i != 0; ++i)
160 : {
161 0 : BOOST_CHECK(qtree[i] == aterm_int(i));
162 : }
163 :
164 1 : BOOST_CHECK(std::equal(qtree.begin(), qtree.end(), q.begin()));
165 1 : BOOST_CHECK(std::equal(q.begin(), q.end(), qtree.begin()));
166 1 : BOOST_CHECK(aterm_balanced_tree(q.begin(), q.size()) == qtree);
167 :
168 1 : int count = 0;
169 :
170 1 : std::for_each(qtree.begin(), qtree.end(), counter(count));
171 :
172 1 : BOOST_CHECK(count == 0);
173 :
174 1 : count = 0;
175 :
176 1 : std::for_each(qtree.begin(), qtree.end(), counter(count));
177 :
178 1 : aterm_balanced_tree qcopy(q.begin(),0);
179 :
180 1 : qtree.swap(qcopy);
181 :
182 1 : BOOST_CHECK(std::equal(qtree.begin(), qtree.end(), q.begin()));
183 1 : BOOST_CHECK(std::equal(q.begin(), q.end(), qtree.begin()));
184 :
185 1 : BOOST_CHECK(std::equal(rtree.begin(), rtree.end(), q.begin()));
186 1 : BOOST_CHECK(std::equal(q.begin(), q.end(), rtree.begin()));
187 1 : }
188 :
189 :
|