source: branches/kendall-score/test/ranking.cc @ 4072

Last change on this file since 4072 was 4072, checked in by Peter, 19 months ago

rebalance tree after insertion/deletion in case it's needed; moved the head node from being a child of the root to now be the parent of the root.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 8.0 KB
Line 
1// $Id: ranking.cc 4072 2021-08-20 05:40:18Z peter $
2
3/*
4  Copyright (C) 2021 Peter Johansson
5
6  The yat library is free software; you can redistribute it and/or
7  modify it under the terms of the GNU General Public License as
8  published by the Free Software Foundation; either version 3 of the
9  License, or (at your option) any later version.
10
11  The yat library is distributed in the hope that it will be useful,
12  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  General Public License for more details.
15
16  You should have received a copy of the GNU General Public License
17  along with yat. If not, see <http://www.gnu.org/licenses/>.
18*/
19
20#define YAT_DEBUG_RANKING 1
21
22#include <config.h>
23
24#include "Suite.h"
25
26#include "yat/utility/Ranking.h"
27#include "yat/utility/utility.h"
28
29#include <algorithm>
30
31using namespace theplu::yat;
32
33void test1(test::Suite& suite)
34{
35  suite.out() << YAT_TEST_PROLOGUE;
36  suite.out() << "Constructor(0)\n";
37  utility::Ranking<double> ranking;
38  {
39    suite.out() << "Constructor(1)\n";
40    utility::Ranking<double, std::less<double> > ranking2(ranking.compare());
41    test::avoid_compiler_warning(ranking2);
42    suite.out() << "Constructor(0)\n";
43    utility::Ranking<double, std::greater<double> > ranking3;
44    test::avoid_compiler_warning(ranking3);
45    std::greater<double> compare;
46    suite.out() << "Constructor(1)\n";
47    utility::Ranking<double, std::greater<double> > ranking4(compare);
48    test::avoid_compiler_warning(ranking4);
49  }
50
51  suite.out() << "::insert 0\n";
52  ranking.insert(0);
53  suite.out() << "::insert 1\n";
54  ranking.insert(1);
55  suite.out() << "::insert 2\n";
56  ranking.insert(2);
57  suite.out() << "::insert 1\n";
58  ranking.insert(1);
59  if (ranking.size() != 4) {
60    suite.add(false);
61    suite.err() << "error: incorrect size: " << ranking.size() << "\n";
62  }
63  suite.out() << "distance\n";
64  int dist = std::distance(ranking.begin(), ranking.end());
65  if (dist != 4) {
66    suite.add(false);
67    suite.err() << "error: incorrect distance: " << dist << "\n";
68  }
69  int cdist = std::distance(ranking.cbegin(), ranking.cend());
70  if (cdist != 4) {
71    suite.add(false);
72    suite.err() << "error: incorrect const distance: " << cdist << "\n";
73  }
74  int rdist = std::distance(ranking.rbegin(), ranking.rend());
75  if (rdist != 4) {
76    suite.add(false);
77    suite.err() << "error: incorrect reverse distance: " << rdist << "\n";
78  }
79  int crdist = std::distance(ranking.crbegin(), ranking.crend());
80  if (crdist != 4) {
81    suite.add(false);
82    suite.err() << "error: incorrect const reverse distance: "
83                << crdist << "\n";
84  }
85
86  // try to find lower bound for a large value
87  utility::Ranking<double>::iterator lower = ranking.lower_bound(10000);
88  if (lower != ranking.end()) {
89    suite.add(false);
90    suite.err() << "ranking.lower_bound(10000) expected ranking.end()\n";
91  }
92  lower = ranking.lower_bound(1);
93  if (*lower != 1) {
94    suite.add(false);
95    suite.err() << "error: *lower returned: " << *lower << "\n";
96  }
97
98  // try to find upper bound for a large value
99  utility::Ranking<double>::iterator upper = ranking.upper_bound(10000);
100  if (upper != ranking.end()) {
101    suite.add(false);
102    suite.err() << "ranking.upper_bound(10000) expected ranking.end()\n";
103  }
104  upper = ranking.upper_bound(1);
105  if (*upper != 2) {
106    suite.add(false);
107    suite.err() << "error: *upper returned: " << *upper << "\n";
108  }
109
110  dist = std::distance(lower, upper);
111  if (dist != 2) {
112    suite.add(false);
113    suite.err() << "error: distance(lower, upper): " << dist << "\n";
114  }
115
116  std::vector<int> vec(10);
117  ranking.insert(vec.begin(), vec.end());
118}
119
120
121void test2(test::Suite& suite)
122{
123  suite.out() << YAT_TEST_PROLOGUE;
124  // mimick how Ranking is used in Kendall::score
125  utility::Ranking<double> ranking;
126  auto lower = ranking.lower_bound(2);
127  int r = ranking.ranking(lower);
128  suite.out() << "ranking: " << r << "\n";
129  if (r != 0) {
130    suite.add(false);
131    suite.err() << "error: incorrect; expected 0\n";
132  }
133  ranking.insert(lower, 2);
134
135  lower = ranking.lower_bound(1);
136  r = ranking.ranking(lower);
137  suite.out() << "ranking: " << r << "\n";
138  if (r != 0) {
139    suite.add(false);
140    suite.err() << "error: incorrect; expected 0\n";
141  }
142  ranking.insert(lower, 1);
143
144  lower = ranking.lower_bound(3);
145  if (lower != ranking.cend()) {
146    suite.add(false);
147    suite.err() << "error: expected ranking.lower_bound(3) to return end()\n";
148  }
149  suite.out() << "values in ranking object:\n";
150  for (auto it=ranking.cbegin(); it!=ranking.cend(); ++it)
151    suite.out() << "value: " << *it << "\n";
152  size_t n = ranking.size();
153  if (n != 2) {
154    suite.add(false);
155    suite.err() << "::size() returns " << n << "; expected 2\n";
156  }
157  n = std::distance(ranking.cbegin(), ranking.cend());
158  if (n!=2) {
159    suite.add(false);
160    suite.err() << "distance(begin, end) returns " << n << "; expected 2\n";
161  }
162
163  r = ranking.ranking(lower);
164  suite.out() << "ranking: " << r << "\n";
165  if (r != 2) {
166    suite.add(false);
167    suite.err() << "error: incorrect; expected 2\n";
168  }
169}
170
171
172void test_copy(test::Suite& suite)
173{
174  suite.out() << YAT_TEST_PROLOGUE;
175  utility::Ranking<double> ranking;
176  ranking.insert(0);
177  ranking.insert(1);
178  ranking.insert(-1);
179
180  suite.out() << "test copy constructor\n";
181  utility::Ranking<double> ranking2(ranking);
182  int n = std::distance(ranking.begin(), ranking.end());
183  if (n != 3) {
184    suite.add(false);
185    suite.err() << "ranking distance: " << n << "\n";
186  }
187
188  n = std::distance(ranking2.begin(), ranking2.end());
189  if (n != 3) {
190    suite.add(false);
191    suite.err() << "error: copy constructor failed\n";
192    suite.err() << "ranking2 distance: " << n << "\n";
193    for (auto it = ranking2.cbegin(); it!=ranking2.cend(); ++it)
194      suite.err() << "value: " << *it << "\n";
195  }
196
197  utility::Ranking<double> ranking3;
198  ranking3.insert(10);
199  suite.out() << "test copy assignment\n";
200  ranking3 = ranking2;
201  n = std::distance(ranking3.begin(), ranking3.end());
202  if (n != 3) {
203    suite.add(false);
204    suite.err() << "error: assignment failed\n";
205    suite.err() << "ranking3 distance: " << n << "\n";
206  }
207
208  suite.out() << "test move constructor\n";
209  utility::Ranking<double> ranking4(std::move(ranking3));
210  n = std::distance(ranking4.begin(), ranking4.end());
211  if (n != 3) {
212    suite.add(false);
213    suite.err() << "error: move constructor failed\n";
214    suite.err() << "ranking4 distance: " << n << "\n";
215  }
216
217  suite.out() << "test move assignment\n";
218  ranking4 = std::move(ranking2);
219  n = std::distance(ranking4.begin(), ranking4.end());
220  if (n != 3) {
221    suite.add(false);
222    suite.err() << "error: move assignment failed\n";
223    suite.err() << "ranking4 distance: " << n << "\n";
224  }
225}
226
227
228void test_erase(test::Suite& suite)
229{
230  suite.out() << YAT_TEST_PROLOGUE;
231
232  utility::Ranking<double> ranking;
233  ranking.insert(1);
234  ranking.insert(2);
235  ranking.insert(3);
236  auto it = ranking.find(2);
237  suite.out() << "test erase(iterator)\n";
238  ranking.erase(it);
239  int n = ranking.size();
240  if (n != 2) {
241    suite.add(false);
242    suite.err() << "error: size() = " << n << "; expected 2\n";
243  }
244  n = std::distance(ranking.begin(), ranking.end());
245  if (n != 2) {
246    suite.add(false);
247    suite.err() << "error: distance = " << n << "; expected 2\n";
248  }
249
250  suite.out() << "test erase(value)\n";
251  ranking.insert(2);
252  ranking.erase(2);
253  n = ranking.size();
254  if (n != 2) {
255    suite.add(false);
256    suite.err() << "error: size() = " << n << "; expected 2\n";
257  }
258  n = std::distance(ranking.begin(), ranking.end());
259  if (n != 2) {
260    suite.add(false);
261    suite.err() << "error: distance = " << n << "; expected 2\n";
262  }
263
264  suite.out() << "test erase(iterator, iterator)\n";
265  ranking.insert(2);
266  ranking.insert(4);
267  ranking.insert(0);
268  auto lower = ranking.lower_bound(1);
269  auto upper = ranking.find(3);
270  // erase { 1, 2}
271  ranking.erase(lower, upper);
272  n = ranking.size();
273  if (n != 3) {
274    suite.add(false);
275    suite.err() << "error: size() = " << n << "; expected 3\n";
276  }
277  n = std::distance(ranking.begin(), ranking.end());
278  if (n != 3) {
279    suite.add(false);
280    suite.err() << "error: distance = " << n << "; expected 3\n";
281  }
282}
283
284
285int main(int argc, char* argv[])
286{
287  test::Suite suite(argc, argv);
288  try {
289    test1(suite);
290    test2(suite);
291    test_copy(suite);
292    test_erase(suite);
293  }
294  catch (std::exception& e) {
295    suite.add(false);
296    suite.err() << "error: exception caught: what(): ";
297    utility::print_what(e, suite.err());
298  }
299  return suite.return_value();
300}
Note: See TracBrowser for help on using the repository browser.