1 #include "lib/shuffler.h"
3 #include "lib/content_video.h"
4 #include <boost/test/unit_test.hpp>
7 using boost::shared_ptr;
12 push (Shuffler& s, int frame, Eyes eyes)
14 shared_ptr<Piece> piece (new Piece (shared_ptr<Content>(), shared_ptr<Decoder>(), FrameRateChange(24, 24)));
21 list<ContentVideo> pending_cv;
24 receive (weak_ptr<Piece>, ContentVideo cv)
26 pending_cv.push_back (cv);
30 check (int frame, Eyes eyes, int line)
32 BOOST_REQUIRE_MESSAGE (!pending_cv.empty(), "Check at " << line << " failed.");
33 BOOST_CHECK_MESSAGE (pending_cv.front().frame == frame, "Check at " << line << " failed.");
34 BOOST_CHECK_MESSAGE (pending_cv.front().eyes == eyes, "Check at " << line << " failed.");
35 pending_cv.pop_front();
38 /** A perfect sequence */
39 BOOST_AUTO_TEST_CASE (shuffler_test1)
42 s.Video.connect (boost::bind (&receive, _1, _2));
44 for (int i = 0; i < 10; ++i) {
45 push (s, i, EYES_LEFT);
46 push (s, i, EYES_RIGHT);
47 check (i, EYES_LEFT, __LINE__);
48 check (i, EYES_RIGHT, __LINE__);
52 /** Everything present but some simple shuffling needed */
53 BOOST_AUTO_TEST_CASE (shuffler_test2)
56 s.Video.connect (boost::bind (&receive, _1, _2));
58 for (int i = 0; i < 10; i += 2) {
59 push (s, i, EYES_LEFT);
60 push (s, i + 1, EYES_LEFT);
61 push (s, i, EYES_RIGHT);
62 push (s, i + 1, EYES_RIGHT);
63 check (i, EYES_LEFT, __LINE__);
64 check (i, EYES_RIGHT, __LINE__);
65 check (i + 1, EYES_LEFT, __LINE__);
66 check (i + 1, EYES_RIGHT, __LINE__);
70 /** One missing left eye image */
71 BOOST_AUTO_TEST_CASE (shuffler_test3)
74 s.Video.connect (boost::bind (&receive, _1, _2));
76 push (s, 0, EYES_LEFT);
77 check (0, EYES_LEFT, __LINE__);
78 push (s, 0, EYES_RIGHT);
79 check (0, EYES_RIGHT, __LINE__);
80 push (s, 1, EYES_LEFT);
81 check (1, EYES_LEFT, __LINE__);
82 push (s, 1, EYES_RIGHT);
83 check (1, EYES_RIGHT, __LINE__);
84 push (s, 2, EYES_RIGHT);
85 push (s, 3, EYES_LEFT);
86 push (s, 3, EYES_RIGHT);
87 push (s, 4, EYES_LEFT);
88 push (s, 4, EYES_RIGHT);
90 check (2, EYES_RIGHT, __LINE__);
91 check (3, EYES_LEFT, __LINE__);
92 check (3, EYES_RIGHT, __LINE__);
93 check (4, EYES_LEFT, __LINE__);
94 check (4, EYES_RIGHT, __LINE__);
97 /** One missing right eye image */
98 BOOST_AUTO_TEST_CASE (shuffler_test4)
101 s.Video.connect (boost::bind (&receive, _1, _2));
103 push (s, 0, EYES_LEFT);
104 check (0, EYES_LEFT, __LINE__);
105 push (s, 0, EYES_RIGHT);
106 check (0, EYES_RIGHT, __LINE__);
107 push (s, 1, EYES_LEFT);
108 check (1, EYES_LEFT, __LINE__);
109 push (s, 1, EYES_RIGHT);
110 check (1, EYES_RIGHT, __LINE__);
111 push (s, 2, EYES_LEFT);
112 push (s, 3, EYES_LEFT);
113 push (s, 3, EYES_RIGHT);
114 push (s, 4, EYES_LEFT);
115 push (s, 4, EYES_RIGHT);
117 check (2, EYES_LEFT, __LINE__);
118 check (3, EYES_LEFT, __LINE__);
119 check (3, EYES_RIGHT, __LINE__);
120 check (4, EYES_LEFT, __LINE__);
121 check (4, EYES_RIGHT, __LINE__);
125 BOOST_AUTO_TEST_CASE (shuffler_test5)
128 s.Video.connect (boost::bind (&receive, _1, _2));
130 /* One left should come out straight away */
131 push (s, 0, EYES_LEFT);
132 check (0, EYES_LEFT, __LINE__);
134 /* More lefts should be kept in the shuffler in the hope that some rights arrive */
135 for (int i = 0; i < s._max_size; ++i) {
136 push (s, i + 1, EYES_LEFT);
138 BOOST_CHECK (pending_cv.empty ());
140 /* If enough lefts come the shuffler should conclude that there's no rights and start
141 giving out the lefts.
143 push (s, s._max_size + 1, EYES_LEFT);
144 check (1, EYES_LEFT, __LINE__);
147 /** One complete frame (L+R) missing.
148 Shuffler should carry on, skipping this frame, as the player will cope with it.
150 BOOST_AUTO_TEST_CASE (shuffler_test6)
153 s.Video.connect (boost::bind (&receive, _1, _2));
155 push (s, 0, EYES_LEFT);
156 check (0, EYES_LEFT, __LINE__);
157 push (s, 0, EYES_RIGHT);
158 check (0, EYES_RIGHT, __LINE__);
160 push (s, 2, EYES_LEFT);
161 push (s, 2, EYES_RIGHT);
162 check (2, EYES_LEFT, __LINE__);
163 check (2, EYES_RIGHT, __LINE__);
165 push (s, 3, EYES_LEFT);
166 check (3, EYES_LEFT, __LINE__);
167 push (s, 3, EYES_RIGHT);
168 check (3, EYES_RIGHT, __LINE__);