• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Boost.Signals2 library
2 
3 // Copyright Douglas Gregor 2002-2004. Use, modification and
4 // distribution is subject to the Boost Software License, Version
5 // 1.0. (See accompanying file LICENSE_1_0.txt or copy at
6 // http://www.boost.org/LICENSE_1_0.txt)
7 
8 // For more information, see http://www.boost.org
9 
10 #include <boost/signals2.hpp>
11 #define BOOST_TEST_MODULE ordering_test
12 #include <boost/test/included/unit_test.hpp>
13 #include <iostream>
14 #include <vector>
15 #include <algorithm>
16 #include <cstdlib>
17 #include <ctime>
18 #include <functional>
19 
20 std::vector<int> valuesOutput;
21 bool ungrouped1 = false;
22 bool ungrouped2 = false;
23 bool ungrouped3 = false;
24 
25 struct emit_int {
emit_intemit_int26   emit_int(int v) : value(v) {}
27 
operator ()emit_int28   void operator()() const
29   {
30     BOOST_CHECK(value == 42 || (!ungrouped1 && !ungrouped2 && !ungrouped3));
31     valuesOutput.push_back(value);
32     std::cout << value << ' ';
33   }
34 
35 private:
36   int value;
37 };
38 
39 struct write_ungrouped1 {
operator ()write_ungrouped140   void operator()() const
41   {
42     BOOST_CHECK(!ungrouped1);
43     ungrouped1 = true;
44     std::cout << "(Ungrouped #1)" << ' ';
45   }
46 };
47 
48 struct write_ungrouped2 {
operator ()write_ungrouped249   void operator()() const
50   {
51     BOOST_CHECK(!ungrouped2);
52     ungrouped2 = true;
53     std::cout << "(Ungrouped #2)" << ' ';
54   }
55 };
56 
57 struct write_ungrouped3 {
operator ()write_ungrouped358   void operator()() const
59   {
60     BOOST_CHECK(!ungrouped3);
61     ungrouped3 = true;
62     std::cout << "(Ungrouped #3)" << ' ';
63   }
64 };
65 
return_argument(int x)66 int return_argument(int x)
67 {
68   return x;
69 }
70 
test_group_compare()71 void test_group_compare()
72 {
73   boost::signals2::signal
74   <
75     int (),
76     boost::signals2::last_value<int>,
77     int,
78     std::greater< int >
79   > sig;
80 
81   sig.connect( 1, boost::bind( &return_argument, 1) );
82   sig.connect( 2, boost::bind( &return_argument, 2) );
83 
84   BOOST_CHECK(sig() == 1);
85 }
86 
BOOST_AUTO_TEST_CASE(test_main)87 BOOST_AUTO_TEST_CASE(test_main)
88 {
89   using namespace std;
90   srand(time(0));
91 
92   std::vector<int> sortedValues;
93 
94   boost::signals2::signal<void ()> sig;
95   sig.connect(write_ungrouped1());
96   for (int i = 0; i < 100; ++i) {
97 #ifdef BOOST_NO_STDC_NAMESPACE
98     int v = rand() % 100;
99 #else
100     int v = std::rand() % 100;
101 #endif
102     sortedValues.push_back(v);
103     sig.connect(v, emit_int(v));
104 
105     if (i == 50) {
106       sig.connect(write_ungrouped2());
107     }
108   }
109   sig.connect(write_ungrouped3());
110 
111   std::sort(sortedValues.begin(), sortedValues.end());
112 
113   // 17 at beginning, 42 at end
114   sortedValues.insert(sortedValues.begin(), 17);
115   sig.connect(emit_int(17), boost::signals2::at_front);
116   sortedValues.push_back(42);
117   sig.connect(emit_int(42));
118 
119   sig();
120   std::cout << std::endl;
121 
122   BOOST_CHECK(valuesOutput == sortedValues);
123   BOOST_CHECK(ungrouped1);
124   BOOST_CHECK(ungrouped2);
125   BOOST_CHECK(ungrouped3);
126 
127   test_group_compare();
128 }
129