summaryrefslogtreecommitdiff
path: root/test/shuffler_test.cc
blob: 879f2e079ade4145b35730b1e4f1820014c54df4 (plain)
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
112
113
114
115
116
117
118
119
120
121
122
#include "lib/shuffler.h"
#include "lib/piece.h"
#include "lib/content_video.h"
#include <boost/test/unit_test.hpp>

using std::list;
using boost::shared_ptr;
using boost::weak_ptr;
using boost::optional;

static void
push (Shuffler& s, int frame, Eyes eyes)
{
	shared_ptr<Piece> piece (new Piece (shared_ptr<Content>(), shared_ptr<Decoder>(), FrameRateChange(24, 24)));
	ContentVideo cv;
	cv.frame = frame;
	cv.eyes = eyes;
	s.video (piece, cv);
}

list<ContentVideo> pending_cv;

static void
receive (weak_ptr<Piece>, ContentVideo cv)
{
	pending_cv.push_back (cv);
}

static void
check (int frame, Eyes eyes, int line)
{
	BOOST_REQUIRE_MESSAGE (!pending_cv.empty(), "Check at " << line << " failed.");
	BOOST_CHECK_MESSAGE (pending_cv.front().frame == frame, "Check at " << line << " failed.");
	BOOST_CHECK_MESSAGE (pending_cv.front().eyes == eyes, "Check at " << line << " failed.");
	pending_cv.pop_front();
}

/** A perfect sequence */
BOOST_AUTO_TEST_CASE (shuffler_test1)
{
	Shuffler s;
	s.Video.connect (boost::bind (&receive, _1, _2));

	for (int i = 0; i < 10; ++i) {
		push (s, i, EYES_LEFT);
		push (s, i, EYES_RIGHT);
		check (i, EYES_LEFT, __LINE__);
		check (i, EYES_RIGHT, __LINE__);
	}
}

/** Everything present but some simple shuffling needed */
BOOST_AUTO_TEST_CASE (shuffler_test2)
{
	Shuffler s;
	s.Video.connect (boost::bind (&receive, _1, _2));

	for (int i = 0; i < 10; i += 2) {
		push (s, i, EYES_LEFT);
		push (s, i + 1, EYES_LEFT);
		push (s, i, EYES_RIGHT);
		push (s, i + 1, EYES_RIGHT);
		check (i, EYES_LEFT, __LINE__);
		check (i, EYES_RIGHT, __LINE__);
		check (i + 1, EYES_LEFT, __LINE__);
		check (i + 1, EYES_RIGHT, __LINE__);
	}
}

/** One missing left eye image */
BOOST_AUTO_TEST_CASE (shuffler_test3)
{
	Shuffler s;
	s.Video.connect (boost::bind (&receive, _1, _2));

	push (s, 0, EYES_LEFT);
	check (0, EYES_LEFT, __LINE__);
	push (s, 0, EYES_RIGHT);
	check (0, EYES_RIGHT, __LINE__);
	push (s, 1, EYES_LEFT);
	check (1, EYES_LEFT, __LINE__);
	push (s, 1, EYES_RIGHT);
	check (1, EYES_RIGHT, __LINE__);
	push (s, 2, EYES_RIGHT);
	push (s, 3, EYES_LEFT);
	push (s, 3, EYES_RIGHT);
	push (s, 4, EYES_LEFT);
	push (s, 4, EYES_RIGHT);
	s.flush ();
	check (2, EYES_RIGHT, __LINE__);
	check (3, EYES_LEFT, __LINE__);
	check (3, EYES_RIGHT, __LINE__);
	check (4, EYES_LEFT, __LINE__);
	check (4, EYES_RIGHT, __LINE__);
}

/** One missing right eye image */
BOOST_AUTO_TEST_CASE (shuffler_test4)
{
	Shuffler s;
	s.Video.connect (boost::bind (&receive, _1, _2));

	push (s, 0, EYES_LEFT);
	check (0, EYES_LEFT, __LINE__);
	push (s, 0, EYES_RIGHT);
	check (0, EYES_RIGHT, __LINE__);
	push (s, 1, EYES_LEFT);
	check (1, EYES_LEFT, __LINE__);
	push (s, 1, EYES_RIGHT);
	check (1, EYES_RIGHT, __LINE__);
	push (s, 2, EYES_LEFT);
	push (s, 3, EYES_LEFT);
	push (s, 3, EYES_RIGHT);
	push (s, 4, EYES_LEFT);
	push (s, 4, EYES_RIGHT);
	s.flush ();
	check (2, EYES_LEFT, __LINE__);
	check (3, EYES_LEFT, __LINE__);
	check (3, EYES_RIGHT, __LINE__);
	check (4, EYES_LEFT, __LINE__);
	check (4, EYES_RIGHT, __LINE__);
}