3 * unit test for GstByteReader
5 * Copyright (C) <2008> Sebastian Dröge <sebastian.droege@collabora.co.uk>
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Library General Public
9 * License as published by the Free Software Foundation; either
10 * version 2 of the License, or (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Library General Public License for more details.
17 * You should have received a copy of the GNU Library General Public
18 * License along with this library; if not, write to the
19 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20 * Boston, MA 02111-1307, USA.
28 #include <gst/check/gstcheck.h>
29 #include <gst/base/gstbytereader.h>
31 #ifndef fail_unless_equals_int64
32 #define fail_unless_equals_int64(a, b) \
36 fail_unless(first == second, \
37 "'" #a "' (%" G_GINT64_FORMAT ") is not equal to '" #b"' (%" \
38 G_GINT64_FORMAT ")", first, second); \
42 GST_START_TEST (test_initialization)
44 guint8 data[] = { 0x01, 0x02, 0x03, 0x04 };
45 GstBuffer *buffer = gst_buffer_new ();
46 GstByteReader reader = GST_BYTE_READER_INIT (data, 4);
47 GstByteReader *reader2;
52 gst_buffer_take_memory (buffer, -1,
53 gst_memory_new_wrapped (GST_MEMORY_FLAG_READONLY, data, NULL, 4, 0, 4));
55 fail_unless (gst_byte_reader_get_uint8 (&reader, &x));
56 fail_unless_equals_int (x, 0x01);
57 fail_unless (gst_byte_reader_get_uint8 (&reader, &x));
58 fail_unless_equals_int (x, 0x02);
60 memset (&reader, 0, sizeof (GstByteReader));
62 gst_byte_reader_init (&reader, data, 4);
63 fail_unless (gst_byte_reader_get_uint8 (&reader, &x));
64 fail_unless_equals_int (x, 0x01);
65 fail_unless (gst_byte_reader_get_uint8 (&reader, &x));
66 fail_unless_equals_int (x, 0x02);
68 bdata = gst_buffer_map (buffer, &bsize, NULL, GST_MAP_READ);
69 gst_byte_reader_init (&reader, bdata, bsize);
70 fail_unless (gst_byte_reader_get_uint8 (&reader, &x));
71 fail_unless_equals_int (x, 0x01);
72 fail_unless (gst_byte_reader_get_uint8 (&reader, &x));
73 fail_unless_equals_int (x, 0x02);
74 gst_buffer_unmap (buffer, bdata, bsize);
76 reader2 = gst_byte_reader_new (data, 4);
77 fail_unless (gst_byte_reader_get_uint8 (reader2, &x));
78 fail_unless_equals_int (x, 0x01);
79 fail_unless (gst_byte_reader_get_uint8 (reader2, &x));
80 fail_unless_equals_int (x, 0x02);
81 gst_byte_reader_free (reader2);
83 bdata = gst_buffer_map (buffer, &bsize, NULL, GST_MAP_READ);
84 reader2 = gst_byte_reader_new (bdata, bsize);
85 fail_unless (gst_byte_reader_get_uint8 (reader2, &x));
86 fail_unless_equals_int (x, 0x01);
87 fail_unless (gst_byte_reader_get_uint8 (reader2, &x));
88 fail_unless_equals_int (x, 0x02);
89 gst_byte_reader_free (reader2);
90 gst_buffer_unmap (buffer, bdata, bsize);
92 gst_buffer_unref (buffer);
97 #define GET_CHECK8(reader, dest, val) { \
98 fail_unless (gst_byte_reader_get_uint8 (reader, &dest)); \
99 fail_unless_equals_uint64 (dest, val); \
102 #define GET_CHECK(reader, dest, bits, endianness, val) { \
103 fail_unless (gst_byte_reader_get_uint##bits##_##endianness (reader, &dest)); \
104 fail_unless_equals_uint64 (dest, val); \
107 #define GET_CHECK_FAIL8(reader, dest) { \
108 fail_if (gst_byte_reader_get_uint8 (reader, &dest)); \
111 #define GET_CHECK_FAIL(reader, dest, bits, endianness) { \
112 fail_if (gst_byte_reader_get_uint##bits##_##endianness (reader, &dest)); \
115 #define PEEK_CHECK8(reader, dest, val) { \
116 fail_unless (gst_byte_reader_peek_uint8 (reader, &dest)); \
117 fail_unless_equals_uint64 (dest, val); \
120 #define PEEK_CHECK(reader, dest, bits, endianness, val) { \
121 fail_unless (gst_byte_reader_peek_uint##bits##_##endianness (reader, &dest)); \
122 fail_unless_equals_uint64 (dest, val); \
125 #define PEEK_CHECK_FAIL8(reader, dest) { \
126 fail_if (gst_byte_reader_peek_uint8 (reader, &dest)); \
129 #define PEEK_CHECK_FAIL(reader, dest, bits, endianness) { \
130 fail_if (gst_byte_reader_peek_uint##bits##_##endianness (reader, &dest)); \
133 GST_START_TEST (test_get_uint_le)
135 guint8 data[] = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xab, 0xcd, 0xef,
136 0xfe, 0xdc, 0xba, 0x09, 0x87, 0x65, 0x43, 0x21
138 GstByteReader reader = GST_BYTE_READER_INIT (data, 16);
144 GET_CHECK8 (&reader, a, 0x12);
145 GET_CHECK (&reader, b, 16, le, 0x5634);
146 GET_CHECK (&reader, c, 24, le, 0xab9078);
147 GET_CHECK (&reader, c, 32, le, 0xdcfeefcd);
148 fail_unless (gst_byte_reader_set_pos (&reader, 0));
149 GET_CHECK (&reader, d, 64, le, G_GINT64_CONSTANT (0xefcdab9078563412));
150 GET_CHECK (&reader, d, 64, le, G_GINT64_CONSTANT (0x2143658709badcfe));
152 GET_CHECK_FAIL8 (&reader, a);
153 GET_CHECK_FAIL (&reader, b, 16, le);
154 GET_CHECK_FAIL (&reader, c, 24, le);
155 GET_CHECK_FAIL (&reader, c, 32, le);
156 GET_CHECK_FAIL (&reader, d, 64, le);
158 fail_unless (gst_byte_reader_set_pos (&reader, 0));
160 PEEK_CHECK8 (&reader, a, 0x12);
161 PEEK_CHECK (&reader, b, 16, le, 0x3412);
162 PEEK_CHECK (&reader, c, 24, le, 0x563412);
163 PEEK_CHECK (&reader, c, 32, le, 0x78563412);
164 PEEK_CHECK (&reader, d, 64, le, G_GINT64_CONSTANT (0xefcdab9078563412));
166 fail_unless (gst_byte_reader_set_pos (&reader, 16));
167 PEEK_CHECK_FAIL8 (&reader, a);
168 PEEK_CHECK_FAIL (&reader, b, 16, le);
169 PEEK_CHECK_FAIL (&reader, c, 24, le);
170 PEEK_CHECK_FAIL (&reader, c, 32, le);
171 PEEK_CHECK_FAIL (&reader, d, 64, le);
176 GST_START_TEST (test_get_uint_be)
178 guint8 data[] = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xab, 0xcd, 0xef,
179 0xfe, 0xdc, 0xba, 0x09, 0x87, 0x65, 0x43, 0x21
181 GstByteReader reader = GST_BYTE_READER_INIT (data, 16);
187 GET_CHECK8 (&reader, a, 0x12);
188 GET_CHECK (&reader, b, 16, be, 0x3456);
189 GET_CHECK (&reader, c, 24, be, 0x7890ab);
190 GET_CHECK (&reader, c, 32, be, 0xcdeffedc);
191 fail_unless (gst_byte_reader_set_pos (&reader, 0));
192 GET_CHECK (&reader, d, 64, be, G_GINT64_CONSTANT (0x1234567890abcdef));
193 GET_CHECK (&reader, d, 64, be, G_GINT64_CONSTANT (0xfedcba0987654321));
195 GET_CHECK_FAIL8 (&reader, a);
196 GET_CHECK_FAIL (&reader, b, 16, be);
197 GET_CHECK_FAIL (&reader, c, 24, be);
198 GET_CHECK_FAIL (&reader, c, 32, be);
199 GET_CHECK_FAIL (&reader, d, 64, be);
201 fail_unless (gst_byte_reader_set_pos (&reader, 0));
203 PEEK_CHECK8 (&reader, a, 0x12);
204 PEEK_CHECK (&reader, b, 16, be, 0x1234);
205 PEEK_CHECK (&reader, c, 24, be, 0x123456);
206 PEEK_CHECK (&reader, c, 32, be, 0x12345678);
207 PEEK_CHECK (&reader, d, 64, be, G_GINT64_CONSTANT (0x1234567890abcdef));
209 fail_unless (gst_byte_reader_set_pos (&reader, 16));
210 PEEK_CHECK_FAIL8 (&reader, a);
211 PEEK_CHECK_FAIL (&reader, b, 16, be);
212 PEEK_CHECK_FAIL (&reader, c, 24, be);
213 PEEK_CHECK_FAIL (&reader, c, 32, be);
214 PEEK_CHECK_FAIL (&reader, d, 64, be);
223 #undef GET_CHECK_FAIL8
224 #undef GET_CHECK_FAIL
225 #undef PEEK_CHECK_FAIL8
226 #undef PEEK_CHECK_FAIL
228 #define GET_CHECK8(reader, dest, val) { \
229 fail_unless (gst_byte_reader_get_int8 (reader, &dest)); \
230 fail_unless_equals_int64 (dest, val); \
233 #define GET_CHECK(reader, dest, bits, endianness, val) { \
234 fail_unless (gst_byte_reader_get_int##bits##_##endianness (reader, &dest)); \
235 fail_unless_equals_int64 (dest, val); \
238 #define GET_CHECK_FAIL8(reader, dest) { \
239 fail_if (gst_byte_reader_get_int8 (reader, &dest)); \
242 #define GET_CHECK_FAIL(reader, dest, bits, endianness) { \
243 fail_if (gst_byte_reader_get_int##bits##_##endianness (reader, &dest)); \
246 #define PEEK_CHECK8(reader, dest, val) { \
247 fail_unless (gst_byte_reader_peek_int8 (reader, &dest)); \
248 fail_unless_equals_int64 (dest, val); \
251 #define PEEK_CHECK(reader, dest, bits, endianness, val) { \
252 fail_unless (gst_byte_reader_peek_int##bits##_##endianness (reader, &dest)); \
253 fail_unless_equals_int64 (dest, val); \
256 #define PEEK_CHECK_FAIL8(reader, dest) { \
257 fail_if (gst_byte_reader_peek_int8 (reader, &dest)); \
260 #define PEEK_CHECK_FAIL(reader, dest, bits, endianness) { \
261 fail_if (gst_byte_reader_peek_int##bits##_##endianness (reader, &dest)); \
264 GST_START_TEST (test_get_int_le)
266 guint8 data[] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
267 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
269 GstByteReader reader = GST_BYTE_READER_INIT (data, 16);
275 GET_CHECK8 (&reader, a, -1);
276 GET_CHECK (&reader, b, 16, le, -1);
277 GET_CHECK (&reader, c, 24, le, -1);
278 GET_CHECK (&reader, c, 32, le, -1);
279 fail_unless (gst_byte_reader_set_pos (&reader, 0));
280 GET_CHECK (&reader, d, 64, le, G_GINT64_CONSTANT (-1));
281 GET_CHECK (&reader, d, 64, le, G_GINT64_CONSTANT (-1));
283 GET_CHECK_FAIL8 (&reader, a);
284 GET_CHECK_FAIL (&reader, b, 16, le);
285 GET_CHECK_FAIL (&reader, c, 24, le);
286 GET_CHECK_FAIL (&reader, c, 32, le);
287 GET_CHECK_FAIL (&reader, d, 64, le);
289 fail_unless (gst_byte_reader_set_pos (&reader, 0));
291 PEEK_CHECK8 (&reader, a, -1);
292 PEEK_CHECK (&reader, b, 16, le, -1);
293 PEEK_CHECK (&reader, c, 24, le, -1);
294 PEEK_CHECK (&reader, c, 32, le, -1);
295 PEEK_CHECK (&reader, d, 64, le, G_GINT64_CONSTANT (-1));
297 fail_unless (gst_byte_reader_set_pos (&reader, 16));
298 PEEK_CHECK_FAIL8 (&reader, a);
299 PEEK_CHECK_FAIL (&reader, b, 16, le);
300 PEEK_CHECK_FAIL (&reader, c, 24, le);
301 PEEK_CHECK_FAIL (&reader, c, 32, le);
302 PEEK_CHECK_FAIL (&reader, d, 64, le);
308 GST_START_TEST (test_get_int_be)
310 guint8 data[] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
311 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
313 GstByteReader reader = GST_BYTE_READER_INIT (data, 16);
319 GET_CHECK8 (&reader, a, -1);
320 GET_CHECK (&reader, b, 16, be, -1);
321 GET_CHECK (&reader, c, 24, be, -1);
322 GET_CHECK (&reader, c, 32, be, -1);
323 fail_unless (gst_byte_reader_set_pos (&reader, 0));
324 GET_CHECK (&reader, d, 64, be, G_GINT64_CONSTANT (-1));
325 GET_CHECK (&reader, d, 64, be, G_GINT64_CONSTANT (-1));
327 GET_CHECK_FAIL8 (&reader, a);
328 GET_CHECK_FAIL (&reader, b, 16, be);
329 GET_CHECK_FAIL (&reader, c, 24, be);
330 GET_CHECK_FAIL (&reader, c, 32, be);
331 GET_CHECK_FAIL (&reader, d, 64, be);
333 fail_unless (gst_byte_reader_set_pos (&reader, 0));
335 PEEK_CHECK8 (&reader, a, -1);
336 PEEK_CHECK (&reader, b, 16, be, -1);
337 PEEK_CHECK (&reader, c, 24, be, -1);
338 PEEK_CHECK (&reader, c, 32, be, -1);
339 PEEK_CHECK (&reader, d, 64, be, G_GINT64_CONSTANT (-1));
341 fail_unless (gst_byte_reader_set_pos (&reader, 16));
342 PEEK_CHECK_FAIL8 (&reader, a);
343 PEEK_CHECK_FAIL (&reader, b, 16, be);
344 PEEK_CHECK_FAIL (&reader, c, 24, be);
345 PEEK_CHECK_FAIL (&reader, c, 32, be);
346 PEEK_CHECK_FAIL (&reader, d, 64, be);
356 #undef GET_CHECK_FAIL8
357 #undef GET_CHECK_FAIL
358 #undef PEEK_CHECK_FAIL8
359 #undef PEEK_CHECK_FAIL
361 #define GET_CHECK(reader, dest, bits, endianness, val) { \
362 fail_unless (gst_byte_reader_get_float##bits##_##endianness (reader, &dest)); \
363 fail_unless_equals_float (dest, val); \
366 #define GET_CHECK_FAIL(reader, dest, bits, endianness) { \
367 fail_if (gst_byte_reader_get_float##bits##_##endianness (reader, &dest)); \
370 #define PEEK_CHECK(reader, dest, bits, endianness, val) { \
371 fail_unless (gst_byte_reader_peek_float##bits##_##endianness (reader, &dest)); \
372 fail_unless_equals_float (dest, val); \
375 #define PEEK_CHECK_FAIL(reader, dest, bits, endianness) { \
376 fail_if (gst_byte_reader_peek_float##bits##_##endianness (reader, &dest)); \
379 GST_START_TEST (test_get_float_le)
382 0x00, 0x00, 0x80, 0x3f,
383 0x00, 0x00, 0x80, 0xbf,
384 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x3f,
385 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xbf,
387 GstByteReader reader = GST_BYTE_READER_INIT (data, 24);
391 PEEK_CHECK (&reader, a, 32, le, 1.0);
392 GET_CHECK (&reader, a, 32, le, 1.0);
393 GET_CHECK (&reader, a, 32, le, -1.0);
394 PEEK_CHECK (&reader, b, 64, le, 1.0);
395 GET_CHECK (&reader, b, 64, le, 1.0);
396 GET_CHECK (&reader, b, 64, le, -1.0);
397 GET_CHECK_FAIL (&reader, a, 32, le);
398 GET_CHECK_FAIL (&reader, b, 64, le);
399 PEEK_CHECK_FAIL (&reader, a, 32, le);
400 PEEK_CHECK_FAIL (&reader, b, 64, le);
405 GST_START_TEST (test_get_float_be)
408 0x3f, 0x80, 0x00, 0x00,
409 0xbf, 0x80, 0x00, 0x00,
410 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
411 0xbf, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
413 GstByteReader reader = GST_BYTE_READER_INIT (data, 24);
417 PEEK_CHECK (&reader, a, 32, be, 1.0);
418 GET_CHECK (&reader, a, 32, be, 1.0);
419 GET_CHECK (&reader, a, 32, be, -1.0);
420 PEEK_CHECK (&reader, b, 64, be, 1.0);
421 GET_CHECK (&reader, b, 64, be, 1.0);
422 GET_CHECK (&reader, b, 64, be, -1.0);
423 GET_CHECK_FAIL (&reader, a, 32, be);
424 GET_CHECK_FAIL (&reader, b, 64, be);
425 PEEK_CHECK_FAIL (&reader, a, 32, be);
426 PEEK_CHECK_FAIL (&reader, b, 64, be);
433 #undef GET_CHECK_FAIL
434 #undef PEEK_CHECK_FAIL
436 GST_START_TEST (test_position_tracking)
438 guint8 data[] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
439 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
441 GstByteReader reader = GST_BYTE_READER_INIT (data, 16);
444 fail_unless_equals_int (gst_byte_reader_get_pos (&reader), 0);
445 fail_unless_equals_int (gst_byte_reader_get_remaining (&reader), 16);
447 fail_unless (gst_byte_reader_get_uint8 (&reader, &a));
448 fail_unless_equals_int (gst_byte_reader_get_pos (&reader), 1);
449 fail_unless_equals_int (gst_byte_reader_get_remaining (&reader), 16 - 1);
451 fail_unless (gst_byte_reader_set_pos (&reader, 8));
452 fail_unless_equals_int (gst_byte_reader_get_pos (&reader), 8);
453 fail_unless_equals_int (gst_byte_reader_get_remaining (&reader), 16 - 8);
455 fail_unless (gst_byte_reader_skip (&reader, 4));
456 fail_unless_equals_int (gst_byte_reader_get_pos (&reader), 12);
457 fail_unless_equals_int (gst_byte_reader_get_remaining (&reader), 16 - 12);
459 fail_unless (gst_byte_reader_set_pos (&reader, 16));
460 fail_unless_equals_int (gst_byte_reader_get_pos (&reader), 16);
461 fail_unless_equals_int (gst_byte_reader_get_remaining (&reader), 0);
463 fail_unless (gst_byte_reader_skip (&reader, 0));
464 fail_if (gst_byte_reader_skip (&reader, 1));
469 #define do_scan(r,m,p,o,s,x) \
470 fail_unless_equals_int (gst_byte_reader_masked_scan_uint32 (r,m,p,o,s), x);
472 GST_START_TEST (test_scan)
474 GstByteReader reader;
478 /* fill half the buffer with a pattern */
479 for (i = 0; i < 100; i++)
482 gst_byte_reader_init (&reader, data, 100);
484 /* find first bytes */
485 do_scan (&reader, 0xffffffff, 0x00010203, 0, 100, 0);
486 do_scan (&reader, 0xffffffff, 0x01020304, 0, 100, 1);
487 do_scan (&reader, 0xffffffff, 0x01020304, 1, 99, 1);
488 /* offset is past the pattern start */
489 do_scan (&reader, 0xffffffff, 0x01020304, 2, 98, -1);
490 /* not enough bytes to find the pattern */
491 do_scan (&reader, 0xffffffff, 0x02030405, 2, 3, -1);
492 do_scan (&reader, 0xffffffff, 0x02030405, 2, 4, 2);
493 /* size does not include the last scanned byte */
494 do_scan (&reader, 0xffffffff, 0x40414243, 0, 0x41, -1);
495 do_scan (&reader, 0xffffffff, 0x40414243, 0, 0x43, -1);
496 do_scan (&reader, 0xffffffff, 0x40414243, 0, 0x44, 0x40);
498 do_scan (&reader, 0xffffffff, 0x40414243, 65, 10, -1);
499 do_scan (&reader, 0xffffffff, 0x40414243, 64, 5, 64);
500 do_scan (&reader, 0xffffffff, 0x60616263, 65, 35, 0x60);
501 do_scan (&reader, 0xffffffff, 0x60616263, 0x60, 4, 0x60);
503 do_scan (&reader, 0xffffffff, 0x60616263, 0x61, 3, -1);
504 do_scan (&reader, 0xffffffff, 0x60616263, 99, 1, -1);
506 /* add more data to the buffer */
507 for (i = 100; i < 200; i++)
509 gst_byte_reader_init (&reader, data, 200);
512 do_scan (&reader, 0xffffffff, 0x60616263, 0x61, 6, -1);
513 /* this should work */
514 do_scan (&reader, 0xffffffff, 0x61626364, 0x61, 4, 0x61);
515 /* not enough data */
516 do_scan (&reader, 0xffffffff, 0x62636465, 0x61, 4, -1);
517 do_scan (&reader, 0xffffffff, 0x62636465, 0x61, 5, 0x62);
518 do_scan (&reader, 0xffffffff, 0x62636465, 0, 120, 0x62);
520 /* border conditions */
521 do_scan (&reader, 0xffffffff, 0x62636465, 0, 200, 0x62);
522 do_scan (&reader, 0xffffffff, 0x63646566, 0, 200, 0x63);
523 /* we completely searched the first list */
524 do_scan (&reader, 0xffffffff, 0x64656667, 0, 200, 0x64);
525 /* skip first buffer */
526 do_scan (&reader, 0xffffffff, 0x64656667, 0x64, 100, 0x64);
528 do_scan (&reader, 0xffffffff, 0x64656667, 0x65, 10, -1);
529 /* not enough data to scan */
530 do_scan (&reader, 0xffffffff, 0x64656667, 0x63, 4, -1);
531 do_scan (&reader, 0xffffffff, 0x64656667, 0x63, 5, 0x64);
532 do_scan (&reader, 0xffffffff, 0xc4c5c6c7, 0, 199, -1);
533 do_scan (&reader, 0xffffffff, 0xc4c5c6c7, 0x62, 102, 0xc4);
534 /* different masks */
535 do_scan (&reader, 0x00ffffff, 0x00656667, 0x64, 100, 0x64);
536 do_scan (&reader, 0x000000ff, 0x00000000, 0, 100, -1);
537 do_scan (&reader, 0x000000ff, 0x00000003, 0, 100, 0);
538 do_scan (&reader, 0x000000ff, 0x00000061, 0x61, 100, -1);
539 do_scan (&reader, 0xff000000, 0x61000000, 0, 0x62, -1);
540 /* does not even exist */
541 do_scan (&reader, 0x00ffffff, 0xffffffff, 0x65, 99, -1);
543 /* flush some bytes */
544 fail_unless (gst_byte_reader_skip (&reader, 0x20));
546 do_scan (&reader, 0xffffffff, 0x20212223, 0, 100, 0);
547 do_scan (&reader, 0xffffffff, 0x20212223, 0, 4, 0);
548 do_scan (&reader, 0xffffffff, 0xc4c5c6c7, 0x62, 70, 0xa4);
549 do_scan (&reader, 0xffffffff, 0xc4c5c6c7, 0, 168, 0xa4);
551 do_scan (&reader, 0xffffffff, 0xc4c5c6c7, 164, 4, 0xa4);
552 do_scan (&reader, 0xffffffff, 0xc4c5c6c7, 0x44, 100, 0xa4);
554 /* not enough bytes */
555 do_scan (&reader, 0xffffffff, 0xc4c5c6c7, 0x44, 99, -1);
560 GST_START_TEST (test_string_funcs)
562 GstByteReader reader, backup;
567 guint8 data[200], *d = 0;
570 /* fill half the buffer with a pattern */
571 for (i = 0; i < 100; i++)
574 gst_byte_reader_init (&reader, data, 100);
576 /* no NUL terminator, so these should all fail */
577 fail_if (gst_byte_reader_get_string (&reader, &s8));
578 fail_if (gst_byte_reader_get_string_utf8 (&reader, &s8));
579 fail_if (gst_byte_reader_dup_string (&reader, &c8));
580 fail_if (gst_byte_reader_dup_string_utf8 (&reader, &c8));
581 fail_if (gst_byte_reader_skip_string (&reader));
582 fail_if (gst_byte_reader_skip_string_utf8 (&reader));
583 fail_if (gst_byte_reader_skip_string_utf16 (&reader));
584 fail_if (gst_byte_reader_skip_string_utf32 (&reader));
585 fail_if (gst_byte_reader_peek_string (&reader, &s8));
586 fail_if (gst_byte_reader_peek_string_utf8 (&reader, &s8));
587 fail_if (gst_byte_reader_dup_string_utf16 (&reader, &c16));
588 fail_if (gst_byte_reader_dup_string_utf32 (&reader, &c32));
590 /* let's add a single NUL terminator */
593 fail_if (gst_byte_reader_skip_string_utf32 (&reader));
594 fail_if (gst_byte_reader_skip_string_utf16 (&reader));
595 fail_if (gst_byte_reader_dup_string_utf16 (&reader, &c16));
596 fail_if (gst_byte_reader_dup_string_utf32 (&reader, &c32));
597 fail_unless (gst_byte_reader_skip_string (&reader));
599 fail_unless (gst_byte_reader_skip_string_utf8 (&reader));
601 fail_unless (gst_byte_reader_peek_string (&reader, &s8));
602 fail_unless (gst_byte_reader_peek_string_utf8 (&reader, &s8));
603 fail_if (gst_byte_reader_dup_string_utf16 (&reader, &c16));
604 fail_if (gst_byte_reader_dup_string_utf32 (&reader, &c32));
606 /* let's add another NUL terminator */
609 fail_if (gst_byte_reader_skip_string_utf32 (&reader));
610 fail_if (gst_byte_reader_dup_string_utf32 (&reader, &c32));
611 fail_unless (gst_byte_reader_skip_string_utf16 (&reader));
613 fail_unless (gst_byte_reader_dup_string_utf16 (&reader, &c16));
616 fail_unless (gst_byte_reader_skip_string (&reader));
618 fail_unless (gst_byte_reader_skip_string_utf8 (&reader));
620 fail_unless (gst_byte_reader_peek_string (&reader, &s8));
621 fail_unless (gst_byte_reader_peek_string_utf8 (&reader, &s8));
622 fail_if (gst_byte_reader_dup_string_utf32 (&reader, &c32));
624 /* two more NUL terminators */
628 /* we're at pos. 80 now, so have only 3 NUL terminators in front of us */
629 fail_if (gst_byte_reader_skip_string_utf32 (&reader));
631 gst_byte_reader_init (&reader, data, 100);
633 /* oops, 79 is not dividable by 4, so not aligned, so should fail as well! */
634 fail_if (gst_byte_reader_skip_string_utf32 (&reader));
635 /* let's try that again */
637 gst_byte_reader_init (&reader, data, 100);
639 fail_unless (gst_byte_reader_skip_string_utf16 (&reader));
641 fail_unless (gst_byte_reader_skip_string (&reader));
643 fail_unless (gst_byte_reader_skip_string_utf8 (&reader));
645 fail_unless (gst_byte_reader_peek_string (&reader, &s8));
646 fail_unless (gst_byte_reader_peek_string_utf8 (&reader, &s8));
647 fail_unless (gst_byte_reader_dup_string_utf16 (&reader, &c16));
650 fail_unless (gst_byte_reader_dup_string_utf32 (&reader, &c32));
653 /* and again from the start */
654 gst_byte_reader_init (&reader, data, 100);
655 fail_unless (gst_byte_reader_skip_string_utf16 (&reader));
656 fail_if (gst_byte_reader_dup_data (&reader, 200, &d));
657 fail_if (gst_byte_reader_dup_data (&reader, 100, &d));
658 fail_if (gst_byte_reader_dup_data (&reader, 20, &d));
659 fail_unless (gst_byte_reader_dup_data (&reader, 10, &d));
660 fail_unless_equals_int (d[0], 0);
661 fail_unless_equals_int (d[1], 0);
662 fail_unless_equals_int (d[2], 85);
663 fail_unless_equals_int (d[3], 86);
669 GST_START_TEST (test_dup_string)
671 const gchar moredata[] = { 0x99, 0x10, 'f', '0', '0', '!', '\0', 0xff };
672 GstByteReader reader;
677 gst_byte_reader_init (&reader, (guint8 *) moredata, sizeof (moredata));
678 fail_unless (gst_byte_reader_get_uint16_be (&reader, &num));
679 fail_unless_equals_int (num, 0x9910);
680 fail_unless (gst_byte_reader_dup_string (&reader, &s));
681 fail_unless_equals_string (s, "f00!");
682 fail_unless (gst_byte_reader_get_uint8 (&reader, &x));
683 fail_unless_equals_int (x, 0xff);
690 gst_byte_reader_suite (void)
692 Suite *s = suite_create ("GstByteReader");
693 TCase *tc_chain = tcase_create ("general");
695 suite_add_tcase (s, tc_chain);
697 tcase_add_test (tc_chain, test_initialization);
698 tcase_add_test (tc_chain, test_get_uint_le);
699 tcase_add_test (tc_chain, test_get_uint_be);
700 tcase_add_test (tc_chain, test_get_int_le);
701 tcase_add_test (tc_chain, test_get_int_be);
702 tcase_add_test (tc_chain, test_get_float_le);
703 tcase_add_test (tc_chain, test_get_float_be);
704 tcase_add_test (tc_chain, test_position_tracking);
705 tcase_add_test (tc_chain, test_scan);
706 tcase_add_test (tc_chain, test_string_funcs);
707 tcase_add_test (tc_chain, test_dup_string);
713 GST_CHECK_MAIN (gst_byte_reader);