OLD | NEW |
---|---|
(Empty) | |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #include "media/midi/usb_midi_output_stream.h" | |
6 | |
7 #include <string> | |
8 #include <vector> | |
9 | |
10 #include "base/memory/scoped_ptr.h" | |
11 #include "base/strings/stringprintf.h" | |
12 #include "media/midi/usb_midi_device.h" | |
13 #include "testing/gtest/include/gtest/gtest.h" | |
14 | |
15 namespace media { | |
16 | |
17 namespace { | |
18 | |
19 template<typename T, size_t N> | |
20 std::vector<T> ToVector(const T((&array)[N])) { | |
21 return std::vector<T>(array, array + N); | |
22 } | |
23 | |
24 class MockUsbMidiDevice : public UsbMidiDevice { | |
25 public: | |
26 virtual ~MockUsbMidiDevice() {} | |
27 | |
28 virtual std::vector<uint8> GetDescriptor() OVERRIDE { | |
29 return std::vector<uint8>(); | |
30 } | |
31 | |
32 virtual void Send(int endpoint_number, const std::vector<uint8>& data) | |
33 OVERRIDE { | |
34 for (size_t i = 0; i < data.size(); ++i) { | |
35 log_ += base::StringPrintf("0x%02x ", data[i]); | |
36 } | |
37 log_ += base::StringPrintf("(endpoint = %d)\n", endpoint_number); | |
38 } | |
39 | |
40 void Checkpoint(int tag) { | |
41 log_ += base::StringPrintf("checkpoint(%d)\n", tag); | |
42 } | |
43 | |
44 const std::string& log() const { return log_; } | |
45 | |
46 private: | |
47 std::string log_; | |
48 }; | |
scherkus (not reviewing)
2014/01/22 06:51:46
nit: these classes can still have DISALLOW_ macros
yhirano
2014/01/22 08:58:23
Done.
| |
49 | |
50 class UsbMidiOutputStreamTest : public ::testing::Test { | |
51 protected: | |
52 UsbMidiOutputStreamTest() { | |
53 UsbMidiJack jack(&device_, 1, 2, 4); | |
54 stream_.reset(new UsbMidiOutputStream(jack)); | |
55 } | |
56 | |
57 MockUsbMidiDevice device_; | |
58 scoped_ptr<UsbMidiOutputStream> stream_; | |
59 }; | |
60 | |
61 TEST_F(UsbMidiOutputStreamTest, SendEmpty) { | |
62 stream_->Send(std::vector<uint8>()); | |
63 | |
64 EXPECT_EQ("", device_.log()); | |
65 } | |
66 | |
67 TEST_F(UsbMidiOutputStreamTest, SendNoteOn) { | |
68 uint8 data[] = { 0x90, 0x45, 0x7f}; | |
69 | |
70 stream_->Send(ToVector(data)); | |
71 | |
72 EXPECT_EQ("0x29 0x90 0x45 0x7f (endpoint = 4)\n", device_.log()); | |
73 } | |
74 | |
75 TEST_F(UsbMidiOutputStreamTest, SendNoteOnPending) { | |
76 device_.Checkpoint(0); | |
77 stream_->Send(std::vector<uint8>(1, 0x90)); | |
78 device_.Checkpoint(1); | |
scherkus (not reviewing)
2014/01/22 06:51:46
an alternative to checkpoints is the check device_
yhirano
2014/01/22 08:58:23
That's a nice idea. Done.
| |
79 stream_->Send(std::vector<uint8>(1, 0x45)); | |
80 device_.Checkpoint(2); | |
81 stream_->Send(std::vector<uint8>(1, 0x7f)); | |
82 device_.Checkpoint(3); | |
83 stream_->Send(std::vector<uint8>(1, 0x90)); | |
84 device_.Checkpoint(4); | |
85 stream_->Send(std::vector<uint8>(1, 0x45)); | |
86 device_.Checkpoint(5); | |
87 | |
88 EXPECT_EQ("checkpoint(0)\n" | |
89 "checkpoint(1)\n" | |
90 "checkpoint(2)\n" | |
91 "0x29 0x90 0x45 0x7f (endpoint = 4)\n" | |
92 "checkpoint(3)\n" | |
93 "checkpoint(4)\n" | |
94 "checkpoint(5)\n", device_.log()); | |
95 } | |
96 | |
97 TEST_F(UsbMidiOutputStreamTest, SendNoteOnBurst) { | |
98 uint8 data1[] = { 0x90, }; | |
99 uint8 data2[] = { 0x45, 0x7f, 0x90, 0x45, 0x71, 0x90, 0x45, 0x72, 0x90, }; | |
100 | |
101 stream_->Send(ToVector(data1)); | |
102 stream_->Send(ToVector(data2)); | |
103 | |
104 EXPECT_EQ("0x29 0x90 0x45 0x7f " | |
105 "0x29 0x90 0x45 0x71 " | |
106 "0x29 0x90 0x45 0x72 (endpoint = 4)\n", device_.log()); | |
107 } | |
108 | |
109 TEST_F(UsbMidiOutputStreamTest, SendNoteOff) { | |
110 uint8 data[] = { 0x80, 0x33, 0x44, }; | |
111 | |
112 stream_->Send(ToVector(data)); | |
113 | |
114 EXPECT_EQ("0x28 0x80 0x33 0x44 (endpoint = 4)\n", device_.log()); | |
115 } | |
116 | |
117 TEST_F(UsbMidiOutputStreamTest, SendPolyphonicKeyPress) { | |
118 uint8 data[] = { 0xa0, 0x33, 0x44, }; | |
119 | |
120 stream_->Send(ToVector(data)); | |
121 | |
122 EXPECT_EQ("0x2a 0xa0 0x33 0x44 (endpoint = 4)\n", device_.log()); | |
123 } | |
124 | |
125 TEST_F(UsbMidiOutputStreamTest, SendControlChange) { | |
126 uint8 data[] = { 0xb7, 0x33, 0x44, }; | |
127 | |
128 stream_->Send(ToVector(data)); | |
129 | |
130 EXPECT_EQ("0x2b 0xb7 0x33 0x44 (endpoint = 4)\n", device_.log()); | |
131 } | |
132 | |
133 TEST_F(UsbMidiOutputStreamTest, SendProgramChange) { | |
134 uint8 data[] = { 0xc2, 0x33, }; | |
135 | |
136 stream_->Send(ToVector(data)); | |
137 | |
138 EXPECT_EQ("0x2c 0xc2 0x33 0x00 (endpoint = 4)\n", device_.log()); | |
139 } | |
140 | |
141 TEST_F(UsbMidiOutputStreamTest, SendChannelPressure) { | |
142 uint8 data[] = { 0xd1, 0x33, 0x44, }; | |
143 | |
144 stream_->Send(ToVector(data)); | |
145 | |
146 EXPECT_EQ("0x2d 0xd1 0x33 0x44 (endpoint = 4)\n", device_.log()); | |
147 } | |
148 | |
149 TEST_F(UsbMidiOutputStreamTest, SendPitchWheelChange) { | |
150 uint8 data[] = { 0xe4, 0x33, 0x44, }; | |
151 | |
152 stream_->Send(ToVector(data)); | |
153 | |
154 EXPECT_EQ("0x2e 0xe4 0x33 0x44 (endpoint = 4)\n", device_.log()); | |
155 } | |
156 | |
157 TEST_F(UsbMidiOutputStreamTest, SendTwoByteSysEx) { | |
158 uint8 data[] = { 0xf0, 0xf7, }; | |
159 | |
160 stream_->Send(ToVector(data)); | |
161 | |
162 EXPECT_EQ("0x26 0xf0 0xf7 0x00 (endpoint = 4)\n", device_.log()); | |
163 } | |
164 | |
165 TEST_F(UsbMidiOutputStreamTest, SendThreeByteSysEx) { | |
166 uint8 data[] = { 0xf0, 0x4f, 0xf7, }; | |
167 | |
168 stream_->Send(ToVector(data)); | |
169 | |
170 EXPECT_EQ("0x27 0xf0 0x4f 0xf7 (endpoint = 4)\n", device_.log()); | |
171 } | |
172 | |
173 TEST_F(UsbMidiOutputStreamTest, SendFourByteSysEx) { | |
174 uint8 data[] = { 0xf0, 0x00, 0x01, 0xf7, }; | |
175 | |
176 stream_->Send(ToVector(data)); | |
177 | |
178 EXPECT_EQ("0x24 0xf0 0x00 0x01 " | |
179 "0x25 0xf7 0x00 0x00 (endpoint = 4)\n", device_.log()); | |
180 } | |
181 | |
182 TEST_F(UsbMidiOutputStreamTest, SendFiveByteSysEx) { | |
183 uint8 data[] = { 0xf0, 0x00, 0x01, 0x02, 0xf7, }; | |
184 | |
185 stream_->Send(ToVector(data)); | |
186 | |
187 EXPECT_EQ("0x24 0xf0 0x00 0x01 " | |
188 "0x26 0x02 0xf7 0x00 (endpoint = 4)\n", device_.log()); | |
189 } | |
190 | |
191 TEST_F(UsbMidiOutputStreamTest, SendSixByteSysEx) { | |
192 uint8 data[] = { 0xf0, 0x00, 0x01, 0x02, 0x03, 0xf7, }; | |
193 | |
194 stream_->Send(ToVector(data)); | |
195 | |
196 EXPECT_EQ("0x24 0xf0 0x00 0x01 " | |
197 "0x27 0x02 0x03 0xf7 (endpoint = 4)\n", device_.log()); | |
198 } | |
199 | |
200 TEST_F(UsbMidiOutputStreamTest, SendPendingSysEx) { | |
201 uint8 data1[] = { 0xf0, 0x33, }; | |
202 uint8 data2[] = { 0x44, 0x55, 0x66, }; | |
203 uint8 data3[] = { 0x77, 0x88, 0x99, 0xf7, }; | |
204 | |
205 device_.Checkpoint(0); | |
206 stream_->Send(ToVector(data1)); | |
207 device_.Checkpoint(1); | |
208 stream_->Send(ToVector(data2)); | |
209 device_.Checkpoint(2); | |
210 stream_->Send(ToVector(data3)); | |
211 device_.Checkpoint(3); | |
212 | |
213 EXPECT_EQ("checkpoint(0)\n" | |
214 "checkpoint(1)\n" | |
215 "0x24 0xf0 0x33 0x44 (endpoint = 4)\n" | |
216 "checkpoint(2)\n" | |
217 "0x24 0x55 0x66 0x77 0x27 0x88 0x99 0xf7 (endpoint = 4)\n" | |
218 "checkpoint(3)\n", device_.log()); | |
219 } | |
220 | |
221 TEST_F(UsbMidiOutputStreamTest, SendNoteOnAfterSysEx) { | |
222 uint8 data[] = { 0xf0, 0x00, 0x01, 0x02, 0x03, 0xf7, 0x90, 0x44, 0x33, }; | |
223 | |
224 stream_->Send(ToVector(data)); | |
225 | |
226 EXPECT_EQ("0x24 0xf0 0x00 0x01 " | |
227 "0x27 0x02 0x03 0xf7 " | |
228 "0x29 0x90 0x44 0x33 (endpoint = 4)\n", device_.log()); | |
229 } | |
230 | |
231 TEST_F(UsbMidiOutputStreamTest, SendTimeCodeQuarterFrame) { | |
232 uint8 data[] = { 0xf1, 0x22, }; | |
233 | |
234 stream_->Send(ToVector(data)); | |
235 | |
236 EXPECT_EQ("0x22 0xf1 0x22 0x00 (endpoint = 4)\n", device_.log()); | |
237 } | |
238 | |
239 TEST_F(UsbMidiOutputStreamTest, SendSongPositionPointer) { | |
240 uint8 data[] = { 0xf2, 0x22, 0x33, }; | |
241 | |
242 stream_->Send(ToVector(data)); | |
243 | |
244 EXPECT_EQ("0x23 0xf2 0x22 0x33 (endpoint = 4)\n", device_.log()); | |
245 } | |
246 | |
247 TEST_F(UsbMidiOutputStreamTest, SendSongSelect) { | |
248 uint8 data[] = { 0xf3, 0x22, }; | |
249 | |
250 stream_->Send(ToVector(data)); | |
251 | |
252 EXPECT_EQ("0x22 0xf3 0x22 0x00 (endpoint = 4)\n", device_.log()); | |
253 } | |
254 | |
255 TEST_F(UsbMidiOutputStreamTest, TuneRequest) { | |
256 uint8 data[] = { 0xf6, }; | |
257 | |
258 stream_->Send(ToVector(data)); | |
259 | |
260 EXPECT_EQ("0x25 0xf6 0x00 0x00 (endpoint = 4)\n", device_.log()); | |
261 } | |
262 | |
263 TEST_F(UsbMidiOutputStreamTest, SendSongPositionPointerPending) { | |
264 uint8 data1[] = { 0xf2, 0x22, }; | |
265 uint8 data2[] = { 0x33, }; | |
266 | |
267 stream_->Send(ToVector(data1)); | |
268 device_.Checkpoint(0); | |
269 stream_->Send(ToVector(data2)); | |
270 | |
271 EXPECT_EQ("checkpoint(0)\n" | |
272 "0x23 0xf2 0x22 0x33 (endpoint = 4)\n", device_.log()); | |
273 } | |
274 | |
275 TEST_F(UsbMidiOutputStreamTest, SendRealTimeMessages) { | |
276 uint8 data[] = { 0xf8, 0xfa, 0xfb, 0xfc, 0xfe, 0xff, }; | |
277 | |
278 stream_->Send(ToVector(data)); | |
279 | |
280 EXPECT_EQ("0x25 0xf8 0x00 0x00 " | |
281 "0x25 0xfa 0x00 0x00 " | |
282 "0x25 0xfb 0x00 0x00 " | |
283 "0x25 0xfc 0x00 0x00 " | |
284 "0x25 0xfe 0x00 0x00 " | |
285 "0x25 0xff 0x00 0x00 (endpoint = 4)\n", device_.log()); | |
286 } | |
287 | |
288 TEST_F(UsbMidiOutputStreamTest, SendRealTimeInSysExMessage) { | |
289 uint8 data[] = { | |
290 0xf0, 0x00, 0x01, 0x02, | |
291 0xf8, 0xfa, | |
292 0x03, 0xf7, | |
293 }; | |
294 | |
295 stream_->Send(ToVector(data)); | |
296 | |
297 EXPECT_EQ("0x24 0xf0 0x00 0x01 " | |
298 "0x25 0xf8 0x00 0x00 " | |
299 "0x25 0xfa 0x00 0x00 " | |
300 "0x27 0x02 0x03 0xf7 (endpoint = 4)\n", device_.log()); | |
301 } | |
302 | |
303 } // namespace | |
304 | |
305 } // namespace media | |
OLD | NEW |