1 /* test_libFLAC++ - Unit tester for libFLAC++
2 * Copyright (C) 2002,2003,2004,2005,2006,2007,2008,2009 Josh Coalson
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation; either version 2
7 * of the License, or (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License along
15 * with this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19 #include "FLAC/assert.h"
20 #include "FLAC++/metadata.h"
22 #include <stdlib.h> /* for malloc() */
23 #include <string.h> /* for memcmp() */
25 static ::FLAC__StreamMetadata streaminfo_, padding_, seektable_, application_, vorbiscomment_, cuesheet_, picture_;
27 static bool die_(const char *msg)
29 printf("FAILED, %s\n", msg);
33 static void *malloc_or_die_(size_t size)
35 void *x = malloc(size);
37 fprintf(stderr, "ERROR: out of memory allocating %u bytes\n", (unsigned)size);
43 static char *strdup_or_die_(const char *s)
47 fprintf(stderr, "ERROR: out of memory copying string \"%s\"\n", s);
53 static bool index_is_equal_(const ::FLAC__StreamMetadata_CueSheet_Index &index, const ::FLAC__StreamMetadata_CueSheet_Index &indexcopy)
55 if(indexcopy.offset != index.offset)
57 if(indexcopy.number != index.number)
62 static bool track_is_equal_(const ::FLAC__StreamMetadata_CueSheet_Track *track, const ::FLAC__StreamMetadata_CueSheet_Track *trackcopy)
66 if(trackcopy->offset != track->offset)
68 if(trackcopy->number != track->number)
70 if(0 != strcmp(trackcopy->isrc, track->isrc))
72 if(trackcopy->type != track->type)
74 if(trackcopy->pre_emphasis != track->pre_emphasis)
76 if(trackcopy->num_indices != track->num_indices)
78 if(0 == track->indices || 0 == trackcopy->indices) {
79 if(track->indices != trackcopy->indices)
83 for(i = 0; i < track->num_indices; i++) {
84 if(!index_is_equal_(trackcopy->indices[i], track->indices[i]))
91 static void init_metadata_blocks_()
93 streaminfo_.is_last = false;
94 streaminfo_.type = ::FLAC__METADATA_TYPE_STREAMINFO;
95 streaminfo_.length = FLAC__STREAM_METADATA_STREAMINFO_LENGTH;
96 streaminfo_.data.stream_info.min_blocksize = 576;
97 streaminfo_.data.stream_info.max_blocksize = 576;
98 streaminfo_.data.stream_info.min_framesize = 0;
99 streaminfo_.data.stream_info.max_framesize = 0;
100 streaminfo_.data.stream_info.sample_rate = 44100;
101 streaminfo_.data.stream_info.channels = 1;
102 streaminfo_.data.stream_info.bits_per_sample = 8;
103 streaminfo_.data.stream_info.total_samples = 0;
104 memset(streaminfo_.data.stream_info.md5sum, 0, 16);
106 padding_.is_last = false;
107 padding_.type = ::FLAC__METADATA_TYPE_PADDING;
108 padding_.length = 1234;
110 seektable_.is_last = false;
111 seektable_.type = ::FLAC__METADATA_TYPE_SEEKTABLE;
112 seektable_.data.seek_table.num_points = 2;
113 seektable_.length = seektable_.data.seek_table.num_points * FLAC__STREAM_METADATA_SEEKPOINT_LENGTH;
114 seektable_.data.seek_table.points = (::FLAC__StreamMetadata_SeekPoint*)malloc_or_die_(seektable_.data.seek_table.num_points * sizeof(::FLAC__StreamMetadata_SeekPoint));
115 seektable_.data.seek_table.points[0].sample_number = 0;
116 seektable_.data.seek_table.points[0].stream_offset = 0;
117 seektable_.data.seek_table.points[0].frame_samples = streaminfo_.data.stream_info.min_blocksize;
118 seektable_.data.seek_table.points[1].sample_number = ::FLAC__STREAM_METADATA_SEEKPOINT_PLACEHOLDER;
119 seektable_.data.seek_table.points[1].stream_offset = 1000;
120 seektable_.data.seek_table.points[1].frame_samples = streaminfo_.data.stream_info.min_blocksize;
122 application_.is_last = false;
123 application_.type = ::FLAC__METADATA_TYPE_APPLICATION;
124 application_.length = 8;
125 memcpy(application_.data.application.id, "\xfe\xdc\xba\x98", 4);
126 application_.data.application.data = (FLAC__byte*)malloc_or_die_(4);
127 memcpy(application_.data.application.data, "\xf0\xe1\xd2\xc3", 4);
129 vorbiscomment_.is_last = false;
130 vorbiscomment_.type = ::FLAC__METADATA_TYPE_VORBIS_COMMENT;
131 vorbiscomment_.length = (4 + 5) + 4 + (4 + 12) + (4 + 12);
132 vorbiscomment_.data.vorbis_comment.vendor_string.length = 5;
133 vorbiscomment_.data.vorbis_comment.vendor_string.entry = (FLAC__byte*)malloc_or_die_(5+1);
134 memcpy(vorbiscomment_.data.vorbis_comment.vendor_string.entry, "name0", 5+1);
135 vorbiscomment_.data.vorbis_comment.num_comments = 2;
136 vorbiscomment_.data.vorbis_comment.comments = (::FLAC__StreamMetadata_VorbisComment_Entry*)malloc_or_die_(vorbiscomment_.data.vorbis_comment.num_comments * sizeof(::FLAC__StreamMetadata_VorbisComment_Entry));
137 vorbiscomment_.data.vorbis_comment.comments[0].length = 12;
138 vorbiscomment_.data.vorbis_comment.comments[0].entry = (FLAC__byte*)malloc_or_die_(12+1);
139 memcpy(vorbiscomment_.data.vorbis_comment.comments[0].entry, "name2=value2", 12+1);
140 vorbiscomment_.data.vorbis_comment.comments[1].length = 12;
141 vorbiscomment_.data.vorbis_comment.comments[1].entry = (FLAC__byte*)malloc_or_die_(12+1);
142 memcpy(vorbiscomment_.data.vorbis_comment.comments[1].entry, "name3=value3", 12+1);
144 cuesheet_.is_last = false;
145 cuesheet_.type = ::FLAC__METADATA_TYPE_CUESHEET;
149 FLAC__STREAM_METADATA_CUESHEET_MEDIA_CATALOG_NUMBER_LEN +
150 FLAC__STREAM_METADATA_CUESHEET_LEAD_IN_LEN +
151 FLAC__STREAM_METADATA_CUESHEET_IS_CD_LEN +
152 FLAC__STREAM_METADATA_CUESHEET_RESERVED_LEN +
153 FLAC__STREAM_METADATA_CUESHEET_NUM_TRACKS_LEN
157 FLAC__STREAM_METADATA_CUESHEET_TRACK_OFFSET_LEN +
158 FLAC__STREAM_METADATA_CUESHEET_TRACK_NUMBER_LEN +
159 FLAC__STREAM_METADATA_CUESHEET_TRACK_ISRC_LEN +
160 FLAC__STREAM_METADATA_CUESHEET_TRACK_TYPE_LEN +
161 FLAC__STREAM_METADATA_CUESHEET_TRACK_PRE_EMPHASIS_LEN +
162 FLAC__STREAM_METADATA_CUESHEET_TRACK_RESERVED_LEN +
163 FLAC__STREAM_METADATA_CUESHEET_TRACK_NUM_INDICES_LEN
167 FLAC__STREAM_METADATA_CUESHEET_INDEX_OFFSET_LEN +
168 FLAC__STREAM_METADATA_CUESHEET_INDEX_NUMBER_LEN +
169 FLAC__STREAM_METADATA_CUESHEET_INDEX_RESERVED_LEN
172 memset(cuesheet_.data.cue_sheet.media_catalog_number, 0, sizeof(cuesheet_.data.cue_sheet.media_catalog_number));
173 cuesheet_.data.cue_sheet.media_catalog_number[0] = 'j';
174 cuesheet_.data.cue_sheet.media_catalog_number[1] = 'C';
175 cuesheet_.data.cue_sheet.lead_in = 159;
176 cuesheet_.data.cue_sheet.is_cd = true;
177 cuesheet_.data.cue_sheet.num_tracks = 2;
178 cuesheet_.data.cue_sheet.tracks = (FLAC__StreamMetadata_CueSheet_Track*)malloc_or_die_(cuesheet_.data.cue_sheet.num_tracks * sizeof(FLAC__StreamMetadata_CueSheet_Track));
179 cuesheet_.data.cue_sheet.tracks[0].offset = 1;
180 cuesheet_.data.cue_sheet.tracks[0].number = 1;
181 memcpy(cuesheet_.data.cue_sheet.tracks[0].isrc, "ACBDE1234567", sizeof(cuesheet_.data.cue_sheet.tracks[0].isrc));
182 cuesheet_.data.cue_sheet.tracks[0].type = 0;
183 cuesheet_.data.cue_sheet.tracks[0].pre_emphasis = 1;
184 cuesheet_.data.cue_sheet.tracks[0].num_indices = 2;
185 cuesheet_.data.cue_sheet.tracks[0].indices = (FLAC__StreamMetadata_CueSheet_Index*)malloc_or_die_(cuesheet_.data.cue_sheet.tracks[0].num_indices * sizeof(FLAC__StreamMetadata_CueSheet_Index));
186 cuesheet_.data.cue_sheet.tracks[0].indices[0].offset = 0;
187 cuesheet_.data.cue_sheet.tracks[0].indices[0].number = 0;
188 cuesheet_.data.cue_sheet.tracks[0].indices[1].offset = 1234567890;
189 cuesheet_.data.cue_sheet.tracks[0].indices[1].number = 1;
190 cuesheet_.data.cue_sheet.tracks[1].offset = 2345678901u;
191 cuesheet_.data.cue_sheet.tracks[1].number = 2;
192 memcpy(cuesheet_.data.cue_sheet.tracks[1].isrc, "ACBDE7654321", sizeof(cuesheet_.data.cue_sheet.tracks[1].isrc));
193 cuesheet_.data.cue_sheet.tracks[1].type = 1;
194 cuesheet_.data.cue_sheet.tracks[1].pre_emphasis = 0;
195 cuesheet_.data.cue_sheet.tracks[1].num_indices = 1;
196 cuesheet_.data.cue_sheet.tracks[1].indices = (FLAC__StreamMetadata_CueSheet_Index*)malloc_or_die_(cuesheet_.data.cue_sheet.tracks[1].num_indices * sizeof(FLAC__StreamMetadata_CueSheet_Index));
197 cuesheet_.data.cue_sheet.tracks[1].indices[0].offset = 0;
198 cuesheet_.data.cue_sheet.tracks[1].indices[0].number = 1;
200 picture_.is_last = true;
201 picture_.type = FLAC__METADATA_TYPE_PICTURE;
204 FLAC__STREAM_METADATA_PICTURE_TYPE_LEN +
205 FLAC__STREAM_METADATA_PICTURE_MIME_TYPE_LENGTH_LEN + /* will add the length for the string later */
206 FLAC__STREAM_METADATA_PICTURE_DESCRIPTION_LENGTH_LEN + /* will add the length for the string later */
207 FLAC__STREAM_METADATA_PICTURE_WIDTH_LEN +
208 FLAC__STREAM_METADATA_PICTURE_HEIGHT_LEN +
209 FLAC__STREAM_METADATA_PICTURE_DEPTH_LEN +
210 FLAC__STREAM_METADATA_PICTURE_COLORS_LEN +
211 FLAC__STREAM_METADATA_PICTURE_DATA_LENGTH_LEN /* will add the length for the data later */
214 picture_.data.picture.type = FLAC__STREAM_METADATA_PICTURE_TYPE_FRONT_COVER;
215 picture_.data.picture.mime_type = strdup_or_die_("image/jpeg");
216 picture_.length += strlen(picture_.data.picture.mime_type);
217 picture_.data.picture.description = (FLAC__byte*)strdup_or_die_("desc");
218 picture_.length += strlen((const char *)picture_.data.picture.description);
219 picture_.data.picture.width = 300;
220 picture_.data.picture.height = 300;
221 picture_.data.picture.depth = 24;
222 picture_.data.picture.colors = 0;
223 picture_.data.picture.data = (FLAC__byte*)strdup_or_die_("SOMEJPEGDATA");
224 picture_.data.picture.data_length = strlen((const char *)picture_.data.picture.data);
225 picture_.length += picture_.data.picture.data_length;
228 static void free_metadata_blocks_()
230 free(seektable_.data.seek_table.points);
231 free(application_.data.application.data);
232 free(vorbiscomment_.data.vorbis_comment.vendor_string.entry);
233 free(vorbiscomment_.data.vorbis_comment.comments[0].entry);
234 free(vorbiscomment_.data.vorbis_comment.comments[1].entry);
235 free(vorbiscomment_.data.vorbis_comment.comments);
236 free(cuesheet_.data.cue_sheet.tracks[0].indices);
237 free(cuesheet_.data.cue_sheet.tracks[1].indices);
238 free(cuesheet_.data.cue_sheet.tracks);
239 free(picture_.data.picture.mime_type);
240 free(picture_.data.picture.description);
241 free(picture_.data.picture.data);
244 bool test_metadata_object_streaminfo()
246 unsigned expected_length;
248 printf("testing class FLAC::Metadata::StreamInfo\n");
250 printf("testing StreamInfo::StreamInfo()... ");
251 FLAC::Metadata::StreamInfo block;
252 if(!block.is_valid())
253 return die_("!block.is_valid()");
254 expected_length = FLAC__STREAM_METADATA_STREAMINFO_LENGTH;
255 if(block.get_length() != expected_length) {
256 printf("FAILED, bad length, expected %u, got %u\n", expected_length, block.get_length());
261 printf("testing StreamInfo::StreamInfo(const StreamInfo &)... +\n");
262 printf(" StreamInfo::operator!=(const StreamInfo &)... ");
264 FLAC::Metadata::StreamInfo blockcopy(block);
265 if(!blockcopy.is_valid())
266 return die_("!blockcopy.is_valid()");
267 if(blockcopy != block)
268 return die_("copy is not identical to original");
271 printf("testing StreamInfo::~StreamInfo()... ");
275 printf("testing StreamInfo::StreamInfo(const ::FLAC__StreamMetadata &)... +\n");
276 printf(" StreamInfo::operator!=(const ::FLAC__StreamMetadata &)... ");
278 FLAC::Metadata::StreamInfo blockcopy(streaminfo_);
279 if(!blockcopy.is_valid())
280 return die_("!blockcopy.is_valid()");
281 if(blockcopy != streaminfo_)
282 return die_("copy is not identical to original");
286 printf("testing StreamInfo::StreamInfo(const ::FLAC__StreamMetadata *)... +\n");
287 printf(" StreamInfo::operator!=(const ::FLAC__StreamMetadata *)... ");
289 FLAC::Metadata::StreamInfo blockcopy(&streaminfo_);
290 if(!blockcopy.is_valid())
291 return die_("!blockcopy.is_valid()");
292 if(blockcopy != streaminfo_)
293 return die_("copy is not identical to original");
297 printf("testing StreamInfo::StreamInfo(const ::FLAC__StreamMetadata *, copy=true)... +\n");
298 printf(" StreamInfo::operator!=(const ::FLAC__StreamMetadata *)... ");
300 FLAC::Metadata::StreamInfo blockcopy(&streaminfo_, /*copy=*/true);
301 if(!blockcopy.is_valid())
302 return die_("!blockcopy.is_valid()");
303 if(blockcopy != streaminfo_)
304 return die_("copy is not identical to original");
308 printf("testing StreamInfo::StreamInfo(const ::FLAC__StreamMetadata *, copy=false)... +\n");
309 printf(" StreamInfo::operator!=(const ::FLAC__StreamMetadata *)... ");
311 ::FLAC__StreamMetadata *copy = ::FLAC__metadata_object_clone(&streaminfo_);
312 FLAC::Metadata::StreamInfo blockcopy(copy, /*copy=*/false);
313 if(!blockcopy.is_valid())
314 return die_("!blockcopy.is_valid()");
315 if(blockcopy != streaminfo_)
316 return die_("copy is not identical to original");
320 printf("testing StreamInfo::assign(const ::FLAC__StreamMetadata *, copy=true)... +\n");
321 printf(" StreamInfo::operator!=(const ::FLAC__StreamMetadata *)... ");
323 FLAC::Metadata::StreamInfo blockcopy;
324 blockcopy.assign(&streaminfo_, /*copy=*/true);
325 if(!blockcopy.is_valid())
326 return die_("!blockcopy.is_valid()");
327 if(blockcopy != streaminfo_)
328 return die_("copy is not identical to original");
332 printf("testing StreamInfo::assign(const ::FLAC__StreamMetadata *, copy=false)... +\n");
333 printf(" StreamInfo::operator!=(const ::FLAC__StreamMetadata *)... ");
335 ::FLAC__StreamMetadata *copy = ::FLAC__metadata_object_clone(&streaminfo_);
336 FLAC::Metadata::StreamInfo blockcopy;
337 blockcopy.assign(copy, /*copy=*/false);
338 if(!blockcopy.is_valid())
339 return die_("!blockcopy.is_valid()");
340 if(blockcopy != streaminfo_)
341 return die_("copy is not identical to original");
345 printf("testing StreamInfo::operator=(const StreamInfo &)... +\n");
346 printf(" StreamInfo::operator==(const StreamInfo &)... ");
348 FLAC::Metadata::StreamInfo blockcopy = block;
349 if(!blockcopy.is_valid())
350 return die_("!blockcopy.is_valid()");
351 if(!(blockcopy == block))
352 return die_("copy is not identical to original");
356 printf("testing StreamInfo::operator=(const ::FLAC__StreamMetadata &)... +\n");
357 printf(" StreamInfo::operator==(const ::FLAC__StreamMetadata &)... ");
359 FLAC::Metadata::StreamInfo blockcopy = streaminfo_;
360 if(!blockcopy.is_valid())
361 return die_("!blockcopy.is_valid()");
362 if(!(blockcopy == streaminfo_))
363 return die_("copy is not identical to original");
367 printf("testing StreamInfo::operator=(const ::FLAC__StreamMetadata *)... +\n");
368 printf(" StreamInfo::operator==(const ::FLAC__StreamMetadata *)... ");
370 FLAC::Metadata::StreamInfo blockcopy = &streaminfo_;
371 if(!blockcopy.is_valid())
372 return die_("!blockcopy.is_valid()");
373 if(!(blockcopy == streaminfo_))
374 return die_("copy is not identical to original");
378 printf("testing StreamInfo::set_min_blocksize()... ");
379 block.set_min_blocksize(streaminfo_.data.stream_info.min_blocksize);
382 printf("testing StreamInfo::set_max_blocksize()... ");
383 block.set_max_blocksize(streaminfo_.data.stream_info.max_blocksize);
386 printf("testing StreamInfo::set_min_framesize()... ");
387 block.set_min_framesize(streaminfo_.data.stream_info.min_framesize);
390 printf("testing StreamInfo::set_max_framesize()... ");
391 block.set_max_framesize(streaminfo_.data.stream_info.max_framesize);
394 printf("testing StreamInfo::set_sample_rate()... ");
395 block.set_sample_rate(streaminfo_.data.stream_info.sample_rate);
398 printf("testing StreamInfo::set_channels()... ");
399 block.set_channels(streaminfo_.data.stream_info.channels);
402 printf("testing StreamInfo::set_bits_per_sample()... ");
403 block.set_bits_per_sample(streaminfo_.data.stream_info.bits_per_sample);
406 printf("testing StreamInfo::set_total_samples()... ");
407 block.set_total_samples(streaminfo_.data.stream_info.total_samples);
410 printf("testing StreamInfo::set_md5sum()... ");
411 block.set_md5sum(streaminfo_.data.stream_info.md5sum);
414 printf("testing StreamInfo::get_min_blocksize()... ");
415 if(block.get_min_blocksize() != streaminfo_.data.stream_info.min_blocksize)
416 return die_("value mismatch, doesn't match previously set value");
419 printf("testing StreamInfo::get_max_blocksize()... ");
420 if(block.get_max_blocksize() != streaminfo_.data.stream_info.max_blocksize)
421 return die_("value mismatch, doesn't match previously set value");
424 printf("testing StreamInfo::get_min_framesize()... ");
425 if(block.get_min_framesize() != streaminfo_.data.stream_info.min_framesize)
426 return die_("value mismatch, doesn't match previously set value");
429 printf("testing StreamInfo::get_max_framesize()... ");
430 if(block.get_max_framesize() != streaminfo_.data.stream_info.max_framesize)
431 return die_("value mismatch, doesn't match previously set value");
434 printf("testing StreamInfo::get_sample_rate()... ");
435 if(block.get_sample_rate() != streaminfo_.data.stream_info.sample_rate)
436 return die_("value mismatch, doesn't match previously set value");
439 printf("testing StreamInfo::get_channels()... ");
440 if(block.get_channels() != streaminfo_.data.stream_info.channels)
441 return die_("value mismatch, doesn't match previously set value");
444 printf("testing StreamInfo::get_bits_per_sample()... ");
445 if(block.get_bits_per_sample() != streaminfo_.data.stream_info.bits_per_sample)
446 return die_("value mismatch, doesn't match previously set value");
449 printf("testing StreamInfo::get_total_samples()... ");
450 if(block.get_total_samples() != streaminfo_.data.stream_info.total_samples)
451 return die_("value mismatch, doesn't match previously set value");
454 printf("testing StreamInfo::get_md5sum()... ");
455 if(0 != memcmp(block.get_md5sum(), streaminfo_.data.stream_info.md5sum, 16))
456 return die_("value mismatch, doesn't match previously set value");
459 printf("testing FLAC::Metadata::clone(const FLAC::Metadata::Prototype *)... ");
460 FLAC::Metadata::Prototype *clone_ = FLAC::Metadata::clone(&block);
462 return die_("returned NULL");
463 if(0 == dynamic_cast<FLAC::Metadata::StreamInfo *>(clone_))
464 return die_("downcast is NULL");
465 if(*dynamic_cast<FLAC::Metadata::StreamInfo *>(clone_) != block)
466 return die_("clone is not identical");
468 printf("testing StreamInfo::~StreamInfo()... ");
473 printf("PASSED\n\n");
477 bool test_metadata_object_padding()
479 unsigned expected_length;
481 printf("testing class FLAC::Metadata::Padding\n");
483 printf("testing Padding::Padding()... ");
484 FLAC::Metadata::Padding block;
485 if(!block.is_valid())
486 return die_("!block.is_valid()");
488 if(block.get_length() != expected_length) {
489 printf("FAILED, bad length, expected %u, got %u\n", expected_length, block.get_length());
494 printf("testing Padding::Padding(const Padding &)... +\n");
495 printf(" Padding::operator!=(const Padding &)... ");
497 FLAC::Metadata::Padding blockcopy(block);
498 if(!blockcopy.is_valid())
499 return die_("!blockcopy.is_valid()");
500 if(blockcopy != block)
501 return die_("copy is not identical to original");
504 printf("testing Padding::~Padding()... ");
508 printf("testing Padding::Padding(const ::FLAC__StreamMetadata &)... +\n");
509 printf(" Padding::operator!=(const ::FLAC__StreamMetadata &)... ");
511 FLAC::Metadata::Padding blockcopy(padding_);
512 if(!blockcopy.is_valid())
513 return die_("!blockcopy.is_valid()");
514 if(blockcopy != padding_)
515 return die_("copy is not identical to original");
519 printf("testing Padding::Padding(const ::FLAC__StreamMetadata *)... +\n");
520 printf(" Padding::operator!=(const ::FLAC__StreamMetadata *)... ");
522 FLAC::Metadata::Padding blockcopy(&padding_);
523 if(!blockcopy.is_valid())
524 return die_("!blockcopy.is_valid()");
525 if(blockcopy != padding_)
526 return die_("copy is not identical to original");
530 printf("testing Padding::Padding(const ::FLAC__StreamMetadata *, copy=true)... +\n");
531 printf(" Padding::operator!=(const ::FLAC__StreamMetadata *)... ");
533 FLAC::Metadata::Padding blockcopy(&padding_, /*copy=*/true);
534 if(!blockcopy.is_valid())
535 return die_("!blockcopy.is_valid()");
536 if(blockcopy != padding_)
537 return die_("copy is not identical to original");
541 printf("testing Padding::Padding(const ::FLAC__StreamMetadata *, copy=false)... +\n");
542 printf(" Padding::operator!=(const ::FLAC__StreamMetadata *)... ");
544 ::FLAC__StreamMetadata *copy = ::FLAC__metadata_object_clone(&padding_);
545 FLAC::Metadata::Padding blockcopy(copy, /*copy=*/false);
546 if(!blockcopy.is_valid())
547 return die_("!blockcopy.is_valid()");
548 if(blockcopy != padding_)
549 return die_("copy is not identical to original");
553 printf("testing Padding::assign(const ::FLAC__StreamMetadata *, copy=true)... +\n");
554 printf(" Padding::operator!=(const ::FLAC__StreamMetadata *)... ");
556 FLAC::Metadata::Padding blockcopy;
557 blockcopy.assign(&padding_, /*copy=*/true);
558 if(!blockcopy.is_valid())
559 return die_("!blockcopy.is_valid()");
560 if(blockcopy != padding_)
561 return die_("copy is not identical to original");
565 printf("testing Padding::assign(const ::FLAC__StreamMetadata *, copy=false)... +\n");
566 printf(" Padding::operator!=(const ::FLAC__StreamMetadata *)... ");
568 ::FLAC__StreamMetadata *copy = ::FLAC__metadata_object_clone(&padding_);
569 FLAC::Metadata::Padding blockcopy;
570 blockcopy.assign(copy, /*copy=*/false);
571 if(!blockcopy.is_valid())
572 return die_("!blockcopy.is_valid()");
573 if(blockcopy != padding_)
574 return die_("copy is not identical to original");
578 printf("testing Padding::operator=(const Padding &)... +\n");
579 printf(" Padding::operator==(const Padding &)... ");
581 FLAC::Metadata::Padding blockcopy = block;
582 if(!blockcopy.is_valid())
583 return die_("!blockcopy.is_valid()");
584 if(!(blockcopy == block))
585 return die_("copy is not identical to original");
589 printf("testing Padding::operator=(const ::FLAC__StreamMetadata &)... +\n");
590 printf(" Padding::operator==(const ::FLAC__StreamMetadata &)... ");
592 FLAC::Metadata::Padding blockcopy = padding_;
593 if(!blockcopy.is_valid())
594 return die_("!blockcopy.is_valid()");
595 if(!(blockcopy == padding_))
596 return die_("copy is not identical to original");
600 printf("testing Padding::operator=(const ::FLAC__StreamMetadata *)... +\n");
601 printf(" Padding::operator==(const ::FLAC__StreamMetadata *)... ");
603 FLAC::Metadata::Padding blockcopy = &padding_;
604 if(!blockcopy.is_valid())
605 return die_("!blockcopy.is_valid()");
606 if(!(blockcopy == padding_))
607 return die_("copy is not identical to original");
611 printf("testing Padding::set_length()... ");
612 block.set_length(padding_.length);
615 printf("testing Prototype::get_length()... ");
616 if(block.get_length() != padding_.length)
617 return die_("value mismatch, doesn't match previously set value");
620 printf("testing FLAC::Metadata::clone(const FLAC::Metadata::Prototype *)... ");
621 FLAC::Metadata::Prototype *clone_ = FLAC::Metadata::clone(&block);
623 return die_("returned NULL");
624 if(0 == dynamic_cast<FLAC::Metadata::Padding *>(clone_))
625 return die_("downcast is NULL");
626 if(*dynamic_cast<FLAC::Metadata::Padding *>(clone_) != block)
627 return die_("clone is not identical");
629 printf("testing Padding::~Padding()... ");
634 printf("PASSED\n\n");
638 bool test_metadata_object_application()
640 unsigned expected_length;
642 printf("testing class FLAC::Metadata::Application\n");
644 printf("testing Application::Application()... ");
645 FLAC::Metadata::Application block;
646 if(!block.is_valid())
647 return die_("!block.is_valid()");
648 expected_length = FLAC__STREAM_METADATA_APPLICATION_ID_LEN / 8;
649 if(block.get_length() != expected_length) {
650 printf("FAILED, bad length, expected %u, got %u\n", expected_length, block.get_length());
655 printf("testing Application::Application(const Application &)... +\n");
656 printf(" Application::operator!=(const Application &)... ");
658 FLAC::Metadata::Application blockcopy(block);
659 if(!blockcopy.is_valid())
660 return die_("!blockcopy.is_valid()");
661 if(blockcopy != block)
662 return die_("copy is not identical to original");
665 printf("testing Application::~Application()... ");
669 printf("testing Application::Application(const ::FLAC__StreamMetadata &)... +\n");
670 printf(" Application::operator!=(const ::FLAC__StreamMetadata &)... ");
672 FLAC::Metadata::Application blockcopy(application_);
673 if(!blockcopy.is_valid())
674 return die_("!blockcopy.is_valid()");
675 if(blockcopy != application_)
676 return die_("copy is not identical to original");
680 printf("testing Application::Application(const ::FLAC__StreamMetadata *)... +\n");
681 printf(" Application::operator!=(const ::FLAC__StreamMetadata *)... ");
683 FLAC::Metadata::Application blockcopy(&application_);
684 if(!blockcopy.is_valid())
685 return die_("!blockcopy.is_valid()");
686 if(blockcopy != application_)
687 return die_("copy is not identical to original");
691 printf("testing Application::Application(const ::FLAC__StreamMetadata *, copy=true)... +\n");
692 printf(" Application::operator!=(const ::FLAC__StreamMetadata *)... ");
694 FLAC::Metadata::Application blockcopy(&application_, /*copy=*/true);
695 if(!blockcopy.is_valid())
696 return die_("!blockcopy.is_valid()");
697 if(blockcopy != application_)
698 return die_("copy is not identical to original");
702 printf("testing Application::Application(const ::FLAC__StreamMetadata *, copy=false)... +\n");
703 printf(" Application::operator!=(const ::FLAC__StreamMetadata *)... ");
705 ::FLAC__StreamMetadata *copy = ::FLAC__metadata_object_clone(&application_);
706 FLAC::Metadata::Application blockcopy(copy, /*copy=*/false);
707 if(!blockcopy.is_valid())
708 return die_("!blockcopy.is_valid()");
709 if(blockcopy != application_)
710 return die_("copy is not identical to original");
714 printf("testing Application::assign(const ::FLAC__StreamMetadata *, copy=true)... +\n");
715 printf(" Application::operator!=(const ::FLAC__StreamMetadata *)... ");
717 FLAC::Metadata::Application blockcopy;
718 blockcopy.assign(&application_, /*copy=*/true);
719 if(!blockcopy.is_valid())
720 return die_("!blockcopy.is_valid()");
721 if(blockcopy != application_)
722 return die_("copy is not identical to original");
726 printf("testing Application::assign(const ::FLAC__StreamMetadata *, copy=false)... +\n");
727 printf(" Application::operator!=(const ::FLAC__StreamMetadata *)... ");
729 ::FLAC__StreamMetadata *copy = ::FLAC__metadata_object_clone(&application_);
730 FLAC::Metadata::Application blockcopy;
731 blockcopy.assign(copy, /*copy=*/false);
732 if(!blockcopy.is_valid())
733 return die_("!blockcopy.is_valid()");
734 if(blockcopy != application_)
735 return die_("copy is not identical to original");
739 printf("testing Application::operator=(const Application &)... +\n");
740 printf(" Application::operator==(const Application &)... ");
742 FLAC::Metadata::Application blockcopy = block;
743 if(!blockcopy.is_valid())
744 return die_("!blockcopy.is_valid()");
745 if(!(blockcopy == block))
746 return die_("copy is not identical to original");
750 printf("testing Application::operator=(const ::FLAC__StreamMetadata &)... +\n");
751 printf(" Application::operator==(const ::FLAC__StreamMetadata &)... ");
753 FLAC::Metadata::Application blockcopy = application_;
754 if(!blockcopy.is_valid())
755 return die_("!blockcopy.is_valid()");
756 if(!(blockcopy == application_))
757 return die_("copy is not identical to original");
761 printf("testing Application::operator=(const ::FLAC__StreamMetadata *)... +\n");
762 printf(" Application::operator==(const ::FLAC__StreamMetadata *)... ");
764 FLAC::Metadata::Application blockcopy = &application_;
765 if(!blockcopy.is_valid())
766 return die_("!blockcopy.is_valid()");
767 if(!(blockcopy == application_))
768 return die_("copy is not identical to original");
772 printf("testing Application::set_id()... ");
773 block.set_id(application_.data.application.id);
776 printf("testing Application::set_data()... ");
777 block.set_data(application_.data.application.data, application_.length - sizeof(application_.data.application.id), /*copy=*/true);
780 printf("testing Application::get_id()... ");
781 if(0 != memcmp(block.get_id(), application_.data.application.id, sizeof(application_.data.application.id)))
782 return die_("value mismatch, doesn't match previously set value");
785 printf("testing Application::get_data()... ");
786 if(0 != memcmp(block.get_data(), application_.data.application.data, application_.length - sizeof(application_.data.application.id)))
787 return die_("value mismatch, doesn't match previously set value");
790 printf("testing FLAC::Metadata::clone(const FLAC::Metadata::Prototype *)... ");
791 FLAC::Metadata::Prototype *clone_ = FLAC::Metadata::clone(&block);
793 return die_("returned NULL");
794 if(0 == dynamic_cast<FLAC::Metadata::Application *>(clone_))
795 return die_("downcast is NULL");
796 if(*dynamic_cast<FLAC::Metadata::Application *>(clone_) != block)
797 return die_("clone is not identical");
799 printf("testing Application::~Application()... ");
804 printf("PASSED\n\n");
808 bool test_metadata_object_seektable()
810 unsigned expected_length;
812 printf("testing class FLAC::Metadata::SeekTable\n");
814 printf("testing SeekTable::SeekTable()... ");
815 FLAC::Metadata::SeekTable block;
816 if(!block.is_valid())
817 return die_("!block.is_valid()");
819 if(block.get_length() != expected_length) {
820 printf("FAILED, bad length, expected %u, got %u\n", expected_length, block.get_length());
825 printf("testing SeekTable::SeekTable(const SeekTable &)... +\n");
826 printf(" SeekTable::operator!=(const SeekTable &)... ");
828 FLAC::Metadata::SeekTable blockcopy(block);
829 if(!blockcopy.is_valid())
830 return die_("!blockcopy.is_valid()");
831 if(blockcopy != block)
832 return die_("copy is not identical to original");
835 printf("testing SeekTable::~SeekTable()... ");
839 printf("testing SeekTable::SeekTable(const ::FLAC__StreamMetadata &)... +\n");
840 printf(" SeekTable::operator!=(const ::FLAC__StreamMetadata &)... ");
842 FLAC::Metadata::SeekTable blockcopy(seektable_);
843 if(!blockcopy.is_valid())
844 return die_("!blockcopy.is_valid()");
845 if(blockcopy != seektable_)
846 return die_("copy is not identical to original");
850 printf("testing SeekTable::SeekTable(const ::FLAC__StreamMetadata *)... +\n");
851 printf(" SeekTable::operator!=(const ::FLAC__StreamMetadata *)... ");
853 FLAC::Metadata::SeekTable blockcopy(&seektable_);
854 if(!blockcopy.is_valid())
855 return die_("!blockcopy.is_valid()");
856 if(blockcopy != seektable_)
857 return die_("copy is not identical to original");
861 printf("testing SeekTable::SeekTable(const ::FLAC__StreamMetadata *, copy=true)... +\n");
862 printf(" SeekTable::operator!=(const ::FLAC__StreamMetadata *)... ");
864 FLAC::Metadata::SeekTable blockcopy(&seektable_, /*copy=*/true);
865 if(!blockcopy.is_valid())
866 return die_("!blockcopy.is_valid()");
867 if(blockcopy != seektable_)
868 return die_("copy is not identical to original");
872 printf("testing SeekTable::SeekTable(const ::FLAC__StreamMetadata *, copy=false)... +\n");
873 printf(" SeekTable::operator!=(const ::FLAC__StreamMetadata *)... ");
875 ::FLAC__StreamMetadata *copy = ::FLAC__metadata_object_clone(&seektable_);
876 FLAC::Metadata::SeekTable blockcopy(copy, /*copy=*/false);
877 if(!blockcopy.is_valid())
878 return die_("!blockcopy.is_valid()");
879 if(blockcopy != seektable_)
880 return die_("copy is not identical to original");
884 printf("testing SeekTable::assign(const ::FLAC__StreamMetadata *, copy=true)... +\n");
885 printf(" SeekTable::operator!=(const ::FLAC__StreamMetadata *)... ");
887 FLAC::Metadata::SeekTable blockcopy;
888 blockcopy.assign(&seektable_, /*copy=*/true);
889 if(!blockcopy.is_valid())
890 return die_("!blockcopy.is_valid()");
891 if(blockcopy != seektable_)
892 return die_("copy is not identical to original");
896 printf("testing SeekTable::assign(const ::FLAC__StreamMetadata *, copy=false)... +\n");
897 printf(" SeekTable::operator!=(const ::FLAC__StreamMetadata *)... ");
899 ::FLAC__StreamMetadata *copy = ::FLAC__metadata_object_clone(&seektable_);
900 FLAC::Metadata::SeekTable blockcopy;
901 blockcopy.assign(copy, /*copy=*/false);
902 if(!blockcopy.is_valid())
903 return die_("!blockcopy.is_valid()");
904 if(blockcopy != seektable_)
905 return die_("copy is not identical to original");
909 printf("testing SeekTable::operator=(const SeekTable &)... +\n");
910 printf(" SeekTable::operator==(const SeekTable &)... ");
912 FLAC::Metadata::SeekTable blockcopy = block;
913 if(!blockcopy.is_valid())
914 return die_("!blockcopy.is_valid()");
915 if(!(blockcopy == block))
916 return die_("copy is not identical to original");
920 printf("testing SeekTable::operator=(const ::FLAC__StreamMetadata &)... +\n");
921 printf(" SeekTable::operator==(const ::FLAC__StreamMetadata &)... ");
923 FLAC::Metadata::SeekTable blockcopy = seektable_;
924 if(!blockcopy.is_valid())
925 return die_("!blockcopy.is_valid()");
926 if(!(blockcopy == seektable_))
927 return die_("copy is not identical to original");
931 printf("testing SeekTable::operator=(const ::FLAC__StreamMetadata *)... +\n");
932 printf(" SeekTable::operator==(const ::FLAC__StreamMetadata *)... ");
934 FLAC::Metadata::SeekTable blockcopy = &seektable_;
935 if(!blockcopy.is_valid())
936 return die_("!blockcopy.is_valid()");
937 if(!(blockcopy == seektable_))
938 return die_("copy is not identical to original");
942 printf("testing SeekTable::insert_point() x 3... ");
943 if(!block.insert_point(0, seektable_.data.seek_table.points[1]))
944 return die_("returned false");
945 if(!block.insert_point(0, seektable_.data.seek_table.points[1]))
946 return die_("returned false");
947 if(!block.insert_point(1, seektable_.data.seek_table.points[0]))
948 return die_("returned false");
951 printf("testing SeekTable::is_legal()... ");
953 return die_("returned true");
956 printf("testing SeekTable::set_point()... ");
957 block.set_point(0, seektable_.data.seek_table.points[0]);
960 printf("testing SeekTable::delete_point()... ");
961 if(!block.delete_point(0))
962 return die_("returned false");
965 printf("testing SeekTable::is_legal()... ");
966 if(!block.is_legal())
967 return die_("returned false");
970 printf("testing SeekTable::get_num_points()... ");
971 if(block.get_num_points() != seektable_.data.seek_table.num_points)
972 return die_("number mismatch");
975 printf("testing SeekTable::operator!=(const ::FLAC__StreamMetadata &)... ");
976 if(block != seektable_)
977 return die_("data mismatch");
980 printf("testing SeekTable::get_point()... ");
982 block.get_point(1).sample_number != seektable_.data.seek_table.points[1].sample_number ||
983 block.get_point(1).stream_offset != seektable_.data.seek_table.points[1].stream_offset ||
984 block.get_point(1).frame_samples != seektable_.data.seek_table.points[1].frame_samples
986 return die_("point mismatch");
989 printf("testing FLAC::Metadata::clone(const FLAC::Metadata::Prototype *)... ");
990 FLAC::Metadata::Prototype *clone_ = FLAC::Metadata::clone(&block);
992 return die_("returned NULL");
993 if(0 == dynamic_cast<FLAC::Metadata::SeekTable *>(clone_))
994 return die_("downcast is NULL");
995 if(*dynamic_cast<FLAC::Metadata::SeekTable *>(clone_) != block)
996 return die_("clone is not identical");
998 printf("testing SeekTable::~SeekTable()... ");
1003 printf("PASSED\n\n");
1007 bool test_metadata_object_vorbiscomment()
1009 unsigned expected_length;
1011 printf("testing class FLAC::Metadata::VorbisComment::Entry\n");
1013 printf("testing Entry::Entry()... ");
1015 FLAC::Metadata::VorbisComment::Entry entry1;
1016 if(!entry1.is_valid())
1017 return die_("!is_valid()");
1020 printf("testing Entry::~Entry()... ");
1024 printf("testing Entry::Entry(const char *field, unsigned field_length)... ");
1025 FLAC::Metadata::VorbisComment::Entry entry2("name2=value2", strlen("name2=value2"));
1026 if(!entry2.is_valid())
1027 return die_("!is_valid()");
1031 printf("testing Entry::Entry(const char *field)... ");
1032 FLAC::Metadata::VorbisComment::Entry entry2z("name2=value2");
1033 if(!entry2z.is_valid())
1034 return die_("!is_valid()");
1035 if(strcmp(entry2.get_field(), entry2z.get_field()))
1036 return die_("bad value");
1040 printf("testing Entry::Entry(const char *field_name, const char *field_value, unsigned field_value_length)... ");
1041 FLAC::Metadata::VorbisComment::Entry entry3("name3", "value3", strlen("value3"));
1042 if(!entry3.is_valid())
1043 return die_("!is_valid()");
1047 printf("testing Entry::Entry(const char *field_name, const char *field_value)... ");
1048 FLAC::Metadata::VorbisComment::Entry entry3z("name3", "value3");
1049 if(!entry3z.is_valid())
1050 return die_("!is_valid()");
1051 if(strcmp(entry3.get_field(), entry3z.get_field()))
1052 return die_("bad value");
1056 printf("testing Entry::Entry(const Entry &entry)... ");
1058 FLAC::Metadata::VorbisComment::Entry entry2copy(entry2);
1059 if(!entry2copy.is_valid())
1060 return die_("!is_valid()");
1063 printf("testing Entry::~Entry()... ");
1067 printf("testing Entry::operator=(const Entry &entry)... ");
1068 FLAC::Metadata::VorbisComment::Entry entry1 = entry2;
1069 if(!entry2.is_valid())
1070 return die_("!is_valid()");
1073 printf("testing Entry::get_field_length()... ");
1074 if(entry1.get_field_length() != strlen("name2=value2"))
1075 return die_("value mismatch");
1078 printf("testing Entry::get_field_name_length()... ");
1079 if(entry1.get_field_name_length() != strlen("name2"))
1080 return die_("value mismatch");
1083 printf("testing Entry::get_field_value_length()... ");
1084 if(entry1.get_field_value_length() != strlen("value2"))
1085 return die_("value mismatch");
1088 printf("testing Entry::get_entry()... ");
1090 ::FLAC__StreamMetadata_VorbisComment_Entry entry = entry1.get_entry();
1091 if(entry.length != strlen("name2=value2"))
1092 return die_("entry length mismatch");
1093 if(0 != memcmp(entry.entry, "name2=value2", entry.length))
1094 return die_("entry value mismatch");
1098 printf("testing Entry::get_field()... ");
1099 if(0 != memcmp(entry1.get_field(), "name2=value2", strlen("name2=value2")))
1100 return die_("value mismatch");
1103 printf("testing Entry::get_field_name()... ");
1104 if(0 != memcmp(entry1.get_field_name(), "name2", strlen("name2")))
1105 return die_("value mismatch");
1108 printf("testing Entry::get_field_value()... ");
1109 if(0 != memcmp(entry1.get_field_value(), "value2", strlen("value2")))
1110 return die_("value mismatch");
1113 printf("testing Entry::set_field_name()... ");
1114 if(!entry1.set_field_name("name1"))
1115 return die_("returned false");
1116 if(0 != memcmp(entry1.get_field_name(), "name1", strlen("name1")))
1117 return die_("value mismatch");
1118 if(0 != memcmp(entry1.get_field(), "name1=value2", strlen("name1=value2")))
1119 return die_("entry mismatch");
1122 printf("testing Entry::set_field_value(const char *field_value, unsigned field_value_length)... ");
1123 if(!entry1.set_field_value("value1", strlen("value1")))
1124 return die_("returned false");
1125 if(0 != memcmp(entry1.get_field_value(), "value1", strlen("value1")))
1126 return die_("value mismatch");
1127 if(0 != memcmp(entry1.get_field(), "name1=value1", strlen("name1=value1")))
1128 return die_("entry mismatch");
1131 printf("testing Entry::set_field_value(const char *field_value)... ");
1132 if(!entry1.set_field_value("value1"))
1133 return die_("returned false");
1134 if(0 != memcmp(entry1.get_field_value(), "value1", strlen("value1")))
1135 return die_("value mismatch");
1136 if(0 != memcmp(entry1.get_field(), "name1=value1", strlen("name1=value1")))
1137 return die_("entry mismatch");
1140 printf("testing Entry::set_field(const char *field, unsigned field_length)... ");
1141 if(!entry1.set_field("name0=value0", strlen("name0=value0")))
1142 return die_("returned false");
1143 if(0 != memcmp(entry1.get_field_name(), "name0", strlen("name0")))
1144 return die_("value mismatch");
1145 if(0 != memcmp(entry1.get_field_value(), "value0", strlen("value0")))
1146 return die_("value mismatch");
1147 if(0 != memcmp(entry1.get_field(), "name0=value0", strlen("name0=value0")))
1148 return die_("entry mismatch");
1151 printf("testing Entry::set_field(const char *field)... ");
1152 if(!entry1.set_field("name0=value0"))
1153 return die_("returned false");
1154 if(0 != memcmp(entry1.get_field_name(), "name0", strlen("name0")))
1155 return die_("value mismatch");
1156 if(0 != memcmp(entry1.get_field_value(), "value0", strlen("value0")))
1157 return die_("value mismatch");
1158 if(0 != memcmp(entry1.get_field(), "name0=value0", strlen("name0=value0")))
1159 return die_("entry mismatch");
1162 printf("PASSED\n\n");
1165 printf("testing class FLAC::Metadata::VorbisComment\n");
1167 printf("testing VorbisComment::VorbisComment()... ");
1168 FLAC::Metadata::VorbisComment block;
1169 if(!block.is_valid())
1170 return die_("!block.is_valid()");
1171 expected_length = (FLAC__STREAM_METADATA_VORBIS_COMMENT_ENTRY_LENGTH_LEN/8 + strlen(::FLAC__VENDOR_STRING) + FLAC__STREAM_METADATA_VORBIS_COMMENT_NUM_COMMENTS_LEN/8);
1172 if(block.get_length() != expected_length) {
1173 printf("FAILED, bad length, expected %u, got %u\n", expected_length, block.get_length());
1178 printf("testing VorbisComment::VorbisComment(const VorbisComment &)... +\n");
1179 printf(" VorbisComment::operator!=(const VorbisComment &)... ");
1181 FLAC::Metadata::VorbisComment blockcopy(block);
1182 if(!blockcopy.is_valid())
1183 return die_("!blockcopy.is_valid()");
1184 if(blockcopy != block)
1185 return die_("copy is not identical to original");
1188 printf("testing VorbisComment::~VorbisComment()... ");
1192 printf("testing VorbisComment::VorbisComment(const ::FLAC__StreamMetadata &)... +\n");
1193 printf(" VorbisComment::operator!=(const ::FLAC__StreamMetadata &)... ");
1195 FLAC::Metadata::VorbisComment blockcopy(vorbiscomment_);
1196 if(!blockcopy.is_valid())
1197 return die_("!blockcopy.is_valid()");
1198 if(blockcopy != vorbiscomment_)
1199 return die_("copy is not identical to original");
1203 printf("testing VorbisComment::VorbisComment(const ::FLAC__StreamMetadata *)... +\n");
1204 printf(" VorbisComment::operator!=(const ::FLAC__StreamMetadata *)... ");
1206 FLAC::Metadata::VorbisComment blockcopy(&vorbiscomment_);
1207 if(!blockcopy.is_valid())
1208 return die_("!blockcopy.is_valid()");
1209 if(blockcopy != vorbiscomment_)
1210 return die_("copy is not identical to original");
1214 printf("testing VorbisComment::VorbisComment(const ::FLAC__StreamMetadata *, copy=true)... +\n");
1215 printf(" VorbisComment::operator!=(const ::FLAC__StreamMetadata *)... ");
1217 FLAC::Metadata::VorbisComment blockcopy(&vorbiscomment_, /*copy=*/true);
1218 if(!blockcopy.is_valid())
1219 return die_("!blockcopy.is_valid()");
1220 if(blockcopy != vorbiscomment_)
1221 return die_("copy is not identical to original");
1225 printf("testing VorbisComment::VorbisComment(const ::FLAC__StreamMetadata *, copy=false)... +\n");
1226 printf(" VorbisComment::operator!=(const ::FLAC__StreamMetadata *)... ");
1228 ::FLAC__StreamMetadata *copy = ::FLAC__metadata_object_clone(&vorbiscomment_);
1229 FLAC::Metadata::VorbisComment blockcopy(copy, /*copy=*/false);
1230 if(!blockcopy.is_valid())
1231 return die_("!blockcopy.is_valid()");
1232 if(blockcopy != vorbiscomment_)
1233 return die_("copy is not identical to original");
1237 printf("testing VorbisComment::assign(const ::FLAC__StreamMetadata *, copy=true)... +\n");
1238 printf(" VorbisComment::operator!=(const ::FLAC__StreamMetadata *)... ");
1240 FLAC::Metadata::VorbisComment blockcopy;
1241 blockcopy.assign(&vorbiscomment_, /*copy=*/true);
1242 if(!blockcopy.is_valid())
1243 return die_("!blockcopy.is_valid()");
1244 if(blockcopy != vorbiscomment_)
1245 return die_("copy is not identical to original");
1249 printf("testing VorbisComment::assign(const ::FLAC__StreamMetadata *, copy=false)... +\n");
1250 printf(" VorbisComment::operator!=(const ::FLAC__StreamMetadata *)... ");
1252 ::FLAC__StreamMetadata *copy = ::FLAC__metadata_object_clone(&vorbiscomment_);
1253 FLAC::Metadata::VorbisComment blockcopy;
1254 blockcopy.assign(copy, /*copy=*/false);
1255 if(!blockcopy.is_valid())
1256 return die_("!blockcopy.is_valid()");
1257 if(blockcopy != vorbiscomment_)
1258 return die_("copy is not identical to original");
1262 printf("testing VorbisComment::operator=(const VorbisComment &)... +\n");
1263 printf(" VorbisComment::operator==(const VorbisComment &)... ");
1265 FLAC::Metadata::VorbisComment blockcopy = block;
1266 if(!blockcopy.is_valid())
1267 return die_("!blockcopy.is_valid()");
1268 if(!(blockcopy == block))
1269 return die_("copy is not identical to original");
1273 printf("testing VorbisComment::operator=(const ::FLAC__StreamMetadata &)... +\n");
1274 printf(" VorbisComment::operator==(const ::FLAC__StreamMetadata &)... ");
1276 FLAC::Metadata::VorbisComment blockcopy = vorbiscomment_;
1277 if(!blockcopy.is_valid())
1278 return die_("!blockcopy.is_valid()");
1279 if(!(blockcopy == vorbiscomment_))
1280 return die_("copy is not identical to original");
1284 printf("testing VorbisComment::operator=(const ::FLAC__StreamMetadata *)... +\n");
1285 printf(" VorbisComment::operator==(const ::FLAC__StreamMetadata *)... ");
1287 FLAC::Metadata::VorbisComment blockcopy = &vorbiscomment_;
1288 if(!blockcopy.is_valid())
1289 return die_("!blockcopy.is_valid()");
1290 if(!(blockcopy == vorbiscomment_))
1291 return die_("copy is not identical to original");
1295 printf("testing VorbisComment::get_num_comments()... ");
1296 if(block.get_num_comments() != 0)
1297 return die_("value mismatch, expected 0");
1300 printf("testing VorbisComment::set_vendor_string()... ");
1301 if(!block.set_vendor_string((const FLAC__byte *)"mame0"))
1302 return die_("returned false");
1304 vorbiscomment_.data.vorbis_comment.vendor_string.entry[0] = 'm';
1306 printf("testing VorbisComment::get_vendor_string()... ");
1307 if(strlen((const char *)block.get_vendor_string()) != vorbiscomment_.data.vorbis_comment.vendor_string.length)
1308 return die_("length mismatch");
1309 if(0 != memcmp(block.get_vendor_string(), vorbiscomment_.data.vorbis_comment.vendor_string.entry, vorbiscomment_.data.vorbis_comment.vendor_string.length))
1310 return die_("value mismatch");
1313 printf("testing VorbisComment::append_comment()... +\n");
1314 printf(" VorbisComment::get_comment()... ");
1315 if(!block.append_comment(entry3))
1316 return die_("returned false");
1317 if(block.get_comment(0).get_field_length() != vorbiscomment_.data.vorbis_comment.comments[1].length)
1318 return die_("length mismatch");
1319 if(0 != memcmp(block.get_comment(0).get_field(), vorbiscomment_.data.vorbis_comment.comments[1].entry, vorbiscomment_.data.vorbis_comment.comments[1].length))
1320 return die_("value mismatch");
1323 printf("testing VorbisComment::append_comment()... +\n");
1324 printf(" VorbisComment::get_comment()... ");
1325 if(!block.append_comment(entry2))
1326 return die_("returned false");
1327 if(block.get_comment(1).get_field_length() != vorbiscomment_.data.vorbis_comment.comments[0].length)
1328 return die_("length mismatch");
1329 if(0 != memcmp(block.get_comment(1).get_field(), vorbiscomment_.data.vorbis_comment.comments[0].entry, vorbiscomment_.data.vorbis_comment.comments[0].length))
1330 return die_("value mismatch");
1333 printf("testing VorbisComment::delete_comment()... +\n");
1334 printf(" VorbisComment::get_comment()... ");
1335 if(!block.delete_comment(0))
1336 return die_("returned false");
1337 if(block.get_comment(0).get_field_length() != vorbiscomment_.data.vorbis_comment.comments[0].length)
1338 return die_("length[0] mismatch");
1339 if(0 != memcmp(block.get_comment(0).get_field(), vorbiscomment_.data.vorbis_comment.comments[0].entry, vorbiscomment_.data.vorbis_comment.comments[0].length))
1340 return die_("value[0] mismatch");
1343 printf("testing VorbisComment::delete_comment()... +\n");
1344 printf(" VorbisComment::get_comment()... ");
1345 if(!block.delete_comment(0))
1346 return die_("returned false");
1347 if(block.get_num_comments() != 0)
1348 return die_("block mismatch, expected num_comments = 0");
1351 printf("testing VorbisComment::insert_comment()... +\n");
1352 printf(" VorbisComment::get_comment()... ");
1353 if(!block.insert_comment(0, entry3))
1354 return die_("returned false");
1355 if(block.get_comment(0).get_field_length() != vorbiscomment_.data.vorbis_comment.comments[1].length)
1356 return die_("length mismatch");
1357 if(0 != memcmp(block.get_comment(0).get_field(), vorbiscomment_.data.vorbis_comment.comments[1].entry, vorbiscomment_.data.vorbis_comment.comments[1].length))
1358 return die_("value mismatch");
1361 printf("testing VorbisComment::insert_comment()... +\n");
1362 printf(" VorbisComment::get_comment()... ");
1363 if(!block.insert_comment(0, entry3))
1364 return die_("returned false");
1365 if(block.get_comment(0).get_field_length() != vorbiscomment_.data.vorbis_comment.comments[1].length)
1366 return die_("length mismatch");
1367 if(0 != memcmp(block.get_comment(0).get_field(), vorbiscomment_.data.vorbis_comment.comments[1].entry, vorbiscomment_.data.vorbis_comment.comments[1].length))
1368 return die_("value mismatch");
1371 printf("testing VorbisComment::insert_comment()... +\n");
1372 printf(" VorbisComment::get_comment()... ");
1373 if(!block.insert_comment(1, entry2))
1374 return die_("returned false");
1375 if(block.get_comment(1).get_field_length() != vorbiscomment_.data.vorbis_comment.comments[0].length)
1376 return die_("length mismatch");
1377 if(0 != memcmp(block.get_comment(1).get_field(), vorbiscomment_.data.vorbis_comment.comments[0].entry, vorbiscomment_.data.vorbis_comment.comments[0].length))
1378 return die_("value mismatch");
1381 printf("testing VorbisComment::set_comment()... +\n");
1382 printf(" VorbisComment::get_comment()... ");
1383 if(!block.set_comment(0, entry2))
1384 return die_("returned false");
1385 if(block.get_comment(0).get_field_length() != vorbiscomment_.data.vorbis_comment.comments[0].length)
1386 return die_("length mismatch");
1387 if(0 != memcmp(block.get_comment(0).get_field(), vorbiscomment_.data.vorbis_comment.comments[0].entry, vorbiscomment_.data.vorbis_comment.comments[0].length))
1388 return die_("value mismatch");
1391 printf("testing VorbisComment::delete_comment()... +\n");
1392 printf(" VorbisComment::get_comment()... ");
1393 if(!block.delete_comment(0))
1394 return die_("returned false");
1395 if(block.get_comment(0).get_field_length() != vorbiscomment_.data.vorbis_comment.comments[0].length)
1396 return die_("length[0] mismatch");
1397 if(0 != memcmp(block.get_comment(0).get_field(), vorbiscomment_.data.vorbis_comment.comments[0].entry, vorbiscomment_.data.vorbis_comment.comments[0].length))
1398 return die_("value[0] mismatch");
1399 if(block.get_comment(1).get_field_length() != vorbiscomment_.data.vorbis_comment.comments[1].length)
1400 return die_("length[1] mismatch");
1401 if(0 != memcmp(block.get_comment(1).get_field(), vorbiscomment_.data.vorbis_comment.comments[1].entry, vorbiscomment_.data.vorbis_comment.comments[1].length))
1402 return die_("value[0] mismatch");
1405 printf("testing FLAC::Metadata::clone(const FLAC::Metadata::Prototype *)... ");
1406 FLAC::Metadata::Prototype *clone_ = FLAC::Metadata::clone(&block);
1408 return die_("returned NULL");
1409 if(0 == dynamic_cast<FLAC::Metadata::VorbisComment *>(clone_))
1410 return die_("downcast is NULL");
1411 if(*dynamic_cast<FLAC::Metadata::VorbisComment *>(clone_) != block)
1412 return die_("clone is not identical");
1414 printf("testing VorbisComment::~VorbisComment()... ");
1419 printf("PASSED\n\n");
1423 bool test_metadata_object_cuesheet()
1425 unsigned expected_length;
1427 printf("testing class FLAC::Metadata::CueSheet::Track\n");
1429 printf("testing Track::Track()... ");
1430 FLAC::Metadata::CueSheet::Track track0;
1431 if(!track0.is_valid())
1432 return die_("!is_valid()");
1436 printf("testing Track::get_track()... ");
1437 const ::FLAC__StreamMetadata_CueSheet_Track *trackp = track0.get_track();
1439 return die_("returned pointer is NULL");
1442 printf("testing Track::Track(const ::FLAC__StreamMetadata_CueSheet_Track*)... ");
1443 FLAC::Metadata::CueSheet::Track track2(trackp);
1444 if(!track2.is_valid())
1445 return die_("!is_valid()");
1446 if(!track_is_equal_(track2.get_track(), trackp))
1447 return die_("copy is not equal");
1450 printf("testing Track::~Track()... ");
1454 printf("testing Track::Track(const Track &track)... ");
1456 FLAC::Metadata::CueSheet::Track track0copy(track0);
1457 if(!track0copy.is_valid())
1458 return die_("!is_valid()");
1459 if(!track_is_equal_(track0copy.get_track(), track0.get_track()))
1460 return die_("copy is not equal");
1463 printf("testing Track::~Track()... ");
1467 printf("testing Track::operator=(const Track &track)... ");
1468 FLAC::Metadata::CueSheet::Track track1 = track0;
1469 if(!track0.is_valid())
1470 return die_("!is_valid()");
1471 if(!track_is_equal_(track1.get_track(), track0.get_track()))
1472 return die_("copy is not equal");
1475 printf("testing Track::get_offset()... ");
1476 if(track1.get_offset() != 0)
1477 return die_("value mismatch");
1480 printf("testing Track::get_number()... ");
1481 if(track1.get_number() != 0)
1482 return die_("value mismatch");
1485 printf("testing Track::get_isrc()... ");
1486 if(0 != memcmp(track1.get_isrc(), "\0\0\0\0\0\0\0\0\0\0\0\0\0", 13))
1487 return die_("value mismatch");
1490 printf("testing Track::get_type()... ");
1491 if(track1.get_type() != 0)
1492 return die_("value mismatch");
1495 printf("testing Track::get_pre_emphasis()... ");
1496 if(track1.get_pre_emphasis() != 0)
1497 return die_("value mismatch");
1500 printf("testing Track::get_num_indices()... ");
1501 if(track1.get_num_indices() != 0)
1502 return die_("value mismatch");
1505 printf("testing Track::set_offset()... ");
1506 track1.set_offset(588);
1507 if(track1.get_offset() != 588)
1508 return die_("value mismatch");
1511 printf("testing Track::set_number()... ");
1512 track1.set_number(1);
1513 if(track1.get_number() != 1)
1514 return die_("value mismatch");
1517 printf("testing Track::set_isrc()... ");
1518 track1.set_isrc("ABCDE1234567");
1519 if(0 != memcmp(track1.get_isrc(), "ABCDE1234567", 13))
1520 return die_("value mismatch");
1523 printf("testing Track::set_type()... ");
1525 if(track1.get_type() != 1)
1526 return die_("value mismatch");
1529 printf("testing Track::set_pre_emphasis()... ");
1530 track1.set_pre_emphasis(1);
1531 if(track1.get_pre_emphasis() != 1)
1532 return die_("value mismatch");
1535 printf("PASSED\n\n");
1537 printf("testing class FLAC::Metadata::CueSheet\n");
1539 printf("testing CueSheet::CueSheet()... ");
1540 FLAC::Metadata::CueSheet block;
1541 if(!block.is_valid())
1542 return die_("!block.is_valid()");
1544 FLAC__STREAM_METADATA_CUESHEET_MEDIA_CATALOG_NUMBER_LEN +
1545 FLAC__STREAM_METADATA_CUESHEET_LEAD_IN_LEN +
1546 FLAC__STREAM_METADATA_CUESHEET_IS_CD_LEN +
1547 FLAC__STREAM_METADATA_CUESHEET_RESERVED_LEN +
1548 FLAC__STREAM_METADATA_CUESHEET_NUM_TRACKS_LEN
1550 if(block.get_length() != expected_length) {
1551 printf("FAILED, bad length, expected %u, got %u\n", expected_length, block.get_length());
1556 printf("testing CueSheet::CueSheet(const CueSheet &)... +\n");
1557 printf(" CueSheet::operator!=(const CueSheet &)... ");
1559 FLAC::Metadata::CueSheet blockcopy(block);
1560 if(!blockcopy.is_valid())
1561 return die_("!blockcopy.is_valid()");
1562 if(blockcopy != block)
1563 return die_("copy is not identical to original");
1566 printf("testing CueSheet::~CueSheet()... ");
1570 printf("testing CueSheet::CueSheet(const ::FLAC__StreamMetadata &)... +\n");
1571 printf(" CueSheet::operator!=(const ::FLAC__StreamMetadata &)... ");
1573 FLAC::Metadata::CueSheet blockcopy(cuesheet_);
1574 if(!blockcopy.is_valid())
1575 return die_("!blockcopy.is_valid()");
1576 if(blockcopy != cuesheet_)
1577 return die_("copy is not identical to original");
1581 printf("testing CueSheet::CueSheet(const ::FLAC__StreamMetadata *)... +\n");
1582 printf(" CueSheet::operator!=(const ::FLAC__StreamMetadata *)... ");
1584 FLAC::Metadata::CueSheet blockcopy(&cuesheet_);
1585 if(!blockcopy.is_valid())
1586 return die_("!blockcopy.is_valid()");
1587 if(blockcopy != cuesheet_)
1588 return die_("copy is not identical to original");
1592 printf("testing CueSheet::CueSheet(const ::FLAC__StreamMetadata *, copy=true)... +\n");
1593 printf(" CueSheet::operator!=(const ::FLAC__StreamMetadata *)... ");
1595 FLAC::Metadata::CueSheet blockcopy(&cuesheet_, /*copy=*/true);
1596 if(!blockcopy.is_valid())
1597 return die_("!blockcopy.is_valid()");
1598 if(blockcopy != cuesheet_)
1599 return die_("copy is not identical to original");
1603 printf("testing CueSheet::CueSheet(const ::FLAC__StreamMetadata *, copy=false)... +\n");
1604 printf(" CueSheet::operator!=(const ::FLAC__StreamMetadata *)... ");
1606 ::FLAC__StreamMetadata *copy = ::FLAC__metadata_object_clone(&cuesheet_);
1607 FLAC::Metadata::CueSheet blockcopy(copy, /*copy=*/false);
1608 if(!blockcopy.is_valid())
1609 return die_("!blockcopy.is_valid()");
1610 if(blockcopy != cuesheet_)
1611 return die_("copy is not identical to original");
1615 printf("testing CueSheet::assign(const ::FLAC__StreamMetadata *, copy=true)... +\n");
1616 printf(" CueSheet::operator!=(const ::FLAC__StreamMetadata *)... ");
1618 FLAC::Metadata::CueSheet blockcopy;
1619 blockcopy.assign(&cuesheet_, /*copy=*/true);
1620 if(!blockcopy.is_valid())
1621 return die_("!blockcopy.is_valid()");
1622 if(blockcopy != cuesheet_)
1623 return die_("copy is not identical to original");
1627 printf("testing CueSheet::assign(const ::FLAC__StreamMetadata *, copy=false)... +\n");
1628 printf(" CueSheet::operator!=(const ::FLAC__StreamMetadata *)... ");
1630 ::FLAC__StreamMetadata *copy = ::FLAC__metadata_object_clone(&cuesheet_);
1631 FLAC::Metadata::CueSheet blockcopy;
1632 blockcopy.assign(copy, /*copy=*/false);
1633 if(!blockcopy.is_valid())
1634 return die_("!blockcopy.is_valid()");
1635 if(blockcopy != cuesheet_)
1636 return die_("copy is not identical to original");
1640 printf("testing CueSheet::operator=(const CueSheet &)... +\n");
1641 printf(" CueSheet::operator==(const CueSheet &)... ");
1643 FLAC::Metadata::CueSheet blockcopy = block;
1644 if(!blockcopy.is_valid())
1645 return die_("!blockcopy.is_valid()");
1646 if(!(blockcopy == block))
1647 return die_("copy is not identical to original");
1651 printf("testing CueSheet::operator=(const ::FLAC__StreamMetadata &)... +\n");
1652 printf(" CueSheet::operator==(const ::FLAC__StreamMetadata &)... ");
1654 FLAC::Metadata::CueSheet blockcopy = cuesheet_;
1655 if(!blockcopy.is_valid())
1656 return die_("!blockcopy.is_valid()");
1657 if(!(blockcopy == cuesheet_))
1658 return die_("copy is not identical to original");
1662 printf("testing CueSheet::operator=(const ::FLAC__StreamMetadata *)... +\n");
1663 printf(" CueSheet::operator==(const ::FLAC__StreamMetadata *)... ");
1665 FLAC::Metadata::CueSheet blockcopy = &cuesheet_;
1666 if(!blockcopy.is_valid())
1667 return die_("!blockcopy.is_valid()");
1668 if(!(blockcopy == cuesheet_))
1669 return die_("copy is not identical to original");
1673 printf("testing CueSheet::get_media_catalog_number()... ");
1674 if(0 != strcmp(block.get_media_catalog_number(), ""))
1675 return die_("value mismatch");
1678 printf("testing CueSheet::get_lead_in()... ");
1679 if(block.get_lead_in() != 0)
1680 return die_("value mismatch, expected 0");
1683 printf("testing CueSheet::get_is_cd()... ");
1684 if(block.get_is_cd())
1685 return die_("value mismatch, expected false");
1688 printf("testing CueSheet::get_num_tracks()... ");
1689 if(block.get_num_tracks() != 0)
1690 return die_("value mismatch, expected 0");
1693 printf("testing CueSheet::set_media_catalog_number()... ");
1696 memset(mcn, 0, sizeof(mcn));
1697 strcpy(mcn, "1234567890123");
1698 block.set_media_catalog_number(mcn);
1699 if(0 != memcmp(block.get_media_catalog_number(), mcn, sizeof(mcn)))
1700 return die_("value mismatch");
1704 printf("testing CueSheet::set_lead_in()... ");
1705 block.set_lead_in(588);
1706 if(block.get_lead_in() != 588)
1707 return die_("value mismatch");
1710 printf("testing CueSheet::set_is_cd()... ");
1711 block.set_is_cd(true);
1712 if(!block.get_is_cd())
1713 return die_("value mismatch");
1716 printf("testing CueSheet::insert_track()... +\n");
1717 printf(" CueSheet::get_track()... ");
1718 if(!block.insert_track(0, track0))
1719 return die_("returned false");
1720 if(!track_is_equal_(block.get_track(0).get_track(), track0.get_track()))
1721 return die_("value mismatch");
1724 printf("testing CueSheet::insert_track()... +\n");
1725 printf(" CueSheet::get_track()... ");
1726 if(!block.insert_track(1, track1))
1727 return die_("returned false");
1728 if(!track_is_equal_(block.get_track(1).get_track(), track1.get_track()))
1729 return die_("value mismatch");
1732 ::FLAC__StreamMetadata_CueSheet_Index index0;
1733 index0.offset = 588*4;
1736 printf("testing CueSheet::insert_index(0)... +\n");
1737 printf(" CueSheet::get_track()... +\n");
1738 printf(" CueSheet::Track::get_index()... ");
1739 if(!block.insert_index(0, 0, index0))
1740 return die_("returned false");
1741 if(!index_is_equal_(block.get_track(0).get_index(0), index0))
1742 return die_("value mismatch");
1745 index0.offset = 588*5;
1746 printf("testing CueSheet::Track::set_index()... ");
1748 FLAC::Metadata::CueSheet::Track track_ = block.get_track(0);
1749 track_.set_index(0, index0);
1750 if(!index_is_equal_(track_.get_index(0), index0))
1751 return die_("value mismatch");
1755 index0.offset = 588*6;
1756 printf("testing CueSheet::set_index()... ");
1757 block.set_index(0, 0, index0);
1758 if(!index_is_equal_(block.get_track(0).get_index(0), index0))
1759 return die_("value mismatch");
1762 printf("testing CueSheet::delete_index()... ");
1763 if(!block.delete_index(0, 0))
1764 return die_("returned false");
1765 if(block.get_track(0).get_num_indices() != 0)
1766 return die_("num_indices mismatch");
1770 printf("testing CueSheet::set_track()... +\n");
1771 printf(" CueSheet::get_track()... ");
1772 if(!block.set_track(0, track1))
1773 return die_("returned false");
1774 if(!track_is_equal_(block.get_track(0).get_track(), track1.get_track()))
1775 return die_("value mismatch");
1778 printf("testing CueSheet::delete_track()... ");
1779 if(!block.delete_track(0))
1780 return die_("returned false");
1781 if(block.get_num_tracks() != 1)
1782 return die_("num_tracks mismatch");
1785 printf("testing FLAC::Metadata::clone(const FLAC::Metadata::Prototype *)... ");
1786 FLAC::Metadata::Prototype *clone_ = FLAC::Metadata::clone(&block);
1788 return die_("returned NULL");
1789 if(0 == dynamic_cast<FLAC::Metadata::CueSheet *>(clone_))
1790 return die_("downcast is NULL");
1791 if(*dynamic_cast<FLAC::Metadata::CueSheet *>(clone_) != block)
1792 return die_("clone is not identical");
1794 printf("testing CueSheet::~CueSheet()... ");
1798 printf("PASSED\n\n");
1802 bool test_metadata_object_picture()
1804 unsigned expected_length;
1806 printf("testing class FLAC::Metadata::Picture\n");
1808 printf("testing Picture::Picture()... ");
1809 FLAC::Metadata::Picture block;
1810 if(!block.is_valid())
1811 return die_("!block.is_valid()");
1813 FLAC__STREAM_METADATA_PICTURE_TYPE_LEN +
1814 FLAC__STREAM_METADATA_PICTURE_MIME_TYPE_LENGTH_LEN +
1815 FLAC__STREAM_METADATA_PICTURE_DESCRIPTION_LENGTH_LEN +
1816 FLAC__STREAM_METADATA_PICTURE_WIDTH_LEN +
1817 FLAC__STREAM_METADATA_PICTURE_HEIGHT_LEN +
1818 FLAC__STREAM_METADATA_PICTURE_DEPTH_LEN +
1819 FLAC__STREAM_METADATA_PICTURE_COLORS_LEN +
1820 FLAC__STREAM_METADATA_PICTURE_DATA_LENGTH_LEN
1822 if(block.get_length() != expected_length) {
1823 printf("FAILED, bad length, expected %u, got %u\n", expected_length, block.get_length());
1828 printf("testing Picture::Picture(const Picture &)... +\n");
1829 printf(" Picture::operator!=(const Picture &)... ");
1831 FLAC::Metadata::Picture blockcopy(block);
1832 if(!blockcopy.is_valid())
1833 return die_("!blockcopy.is_valid()");
1834 if(blockcopy != block)
1835 return die_("copy is not identical to original");
1838 printf("testing Picture::~Picture()... ");
1842 printf("testing Picture::Picture(const ::FLAC__StreamMetadata &)... +\n");
1843 printf(" Picture::operator!=(const ::FLAC__StreamMetadata &)... ");
1845 FLAC::Metadata::Picture blockcopy(picture_);
1846 if(!blockcopy.is_valid())
1847 return die_("!blockcopy.is_valid()");
1848 if(blockcopy != picture_)
1849 return die_("copy is not identical to original");
1853 printf("testing Picture::Picture(const ::FLAC__StreamMetadata *)... +\n");
1854 printf(" Picture::operator!=(const ::FLAC__StreamMetadata *)... ");
1856 FLAC::Metadata::Picture blockcopy(&picture_);
1857 if(!blockcopy.is_valid())
1858 return die_("!blockcopy.is_valid()");
1859 if(blockcopy != picture_)
1860 return die_("copy is not identical to original");
1864 printf("testing Picture::Picture(const ::FLAC__StreamMetadata *, copy=true)... +\n");
1865 printf(" Picture::operator!=(const ::FLAC__StreamMetadata *)... ");
1867 FLAC::Metadata::Picture blockcopy(&picture_, /*copy=*/true);
1868 if(!blockcopy.is_valid())
1869 return die_("!blockcopy.is_valid()");
1870 if(blockcopy != picture_)
1871 return die_("copy is not identical to original");
1875 printf("testing Picture::Picture(const ::FLAC__StreamMetadata *, copy=false)... +\n");
1876 printf(" Picture::operator!=(const ::FLAC__StreamMetadata *)... ");
1878 ::FLAC__StreamMetadata *copy = ::FLAC__metadata_object_clone(&picture_);
1879 FLAC::Metadata::Picture blockcopy(copy, /*copy=*/false);
1880 if(!blockcopy.is_valid())
1881 return die_("!blockcopy.is_valid()");
1882 if(blockcopy != picture_)
1883 return die_("copy is not identical to original");
1887 printf("testing Picture::assign(const ::FLAC__StreamMetadata *, copy=true)... +\n");
1888 printf(" Picture::operator!=(const ::FLAC__StreamMetadata *)... ");
1890 FLAC::Metadata::Picture blockcopy;
1891 blockcopy.assign(&picture_, /*copy=*/true);
1892 if(!blockcopy.is_valid())
1893 return die_("!blockcopy.is_valid()");
1894 if(blockcopy != picture_)
1895 return die_("copy is not identical to original");
1899 printf("testing Picture::assign(const ::FLAC__StreamMetadata *, copy=false)... +\n");
1900 printf(" Picture::operator!=(const ::FLAC__StreamMetadata *)... ");
1902 ::FLAC__StreamMetadata *copy = ::FLAC__metadata_object_clone(&picture_);
1903 FLAC::Metadata::Picture blockcopy;
1904 blockcopy.assign(copy, /*copy=*/false);
1905 if(!blockcopy.is_valid())
1906 return die_("!blockcopy.is_valid()");
1907 if(blockcopy != picture_)
1908 return die_("copy is not identical to original");
1912 printf("testing Picture::operator=(const Picture &)... +\n");
1913 printf(" Picture::operator==(const Picture &)... ");
1915 FLAC::Metadata::Picture blockcopy = block;
1916 if(!blockcopy.is_valid())
1917 return die_("!blockcopy.is_valid()");
1918 if(!(blockcopy == block))
1919 return die_("copy is not identical to original");
1923 printf("testing Picture::operator=(const ::FLAC__StreamMetadata &)... +\n");
1924 printf(" Picture::operator==(const ::FLAC__StreamMetadata &)... ");
1926 FLAC::Metadata::Picture blockcopy = picture_;
1927 if(!blockcopy.is_valid())
1928 return die_("!blockcopy.is_valid()");
1929 if(!(blockcopy == picture_))
1930 return die_("copy is not identical to original");
1934 printf("testing Picture::operator=(const ::FLAC__StreamMetadata *)... +\n");
1935 printf(" Picture::operator==(const ::FLAC__StreamMetadata *)... ");
1937 FLAC::Metadata::Picture blockcopy = &picture_;
1938 if(!blockcopy.is_valid())
1939 return die_("!blockcopy.is_valid()");
1940 if(!(blockcopy == picture_))
1941 return die_("copy is not identical to original");
1945 printf("testing Picture::get_type()... ");
1946 if(block.get_type() != ::FLAC__STREAM_METADATA_PICTURE_TYPE_OTHER)
1947 return die_("value mismatch, expected ::FLAC__STREAM_METADATA_PICTURE_TYPE_OTHER");
1950 printf("testing Picture::set_type()... +\n");
1951 printf(" Picture::get_type()... ");
1952 block.set_type(::FLAC__STREAM_METADATA_PICTURE_TYPE_MEDIA);
1953 if(block.get_type() != ::FLAC__STREAM_METADATA_PICTURE_TYPE_MEDIA)
1954 return die_("value mismatch, expected ::FLAC__STREAM_METADATA_PICTURE_TYPE_MEDIA");
1957 printf("testing Picture::set_mime_type()... ");
1958 if(!block.set_mime_type("qmage/jpeg"))
1959 return die_("returned false");
1961 picture_.data.picture.mime_type[0] = 'q';
1963 printf("testing Picture::get_mime_type()... ");
1964 if(0 != strcmp(block.get_mime_type(), picture_.data.picture.mime_type))
1965 return die_("value mismatch");
1968 printf("testing Picture::set_description()... ");
1969 if(!block.set_description((const FLAC__byte*)"qesc"))
1970 return die_("returned false");
1972 picture_.data.picture.description[0] = 'q';
1974 printf("testing Picture::get_description()... ");
1975 if(0 != strcmp((const char *)block.get_description(), (const char *)picture_.data.picture.description))
1976 return die_("value mismatch");
1979 printf("testing Picture::get_width()... ");
1980 if(block.get_width() != 0)
1981 return die_("value mismatch, expected 0");
1984 printf("testing Picture::set_width()... +\n");
1985 printf(" Picture::get_width()... ");
1986 block.set_width(400);
1987 if(block.get_width() != 400)
1988 return die_("value mismatch, expected 400");
1991 printf("testing Picture::get_height()... ");
1992 if(block.get_height() != 0)
1993 return die_("value mismatch, expected 0");
1996 printf("testing Picture::set_height()... +\n");
1997 printf(" Picture::get_height()... ");
1998 block.set_height(200);
1999 if(block.get_height() != 200)
2000 return die_("value mismatch, expected 200");
2003 printf("testing Picture::get_depth()... ");
2004 if(block.get_depth() != 0)
2005 return die_("value mismatch, expected 0");
2008 printf("testing Picture::set_depth()... +\n");
2009 printf(" Picture::get_depth()... ");
2010 block.set_depth(16);
2011 if(block.get_depth() != 16)
2012 return die_("value mismatch, expected 16");
2015 printf("testing Picture::get_colors()... ");
2016 if(block.get_colors() != 0)
2017 return die_("value mismatch, expected 0");
2020 printf("testing Picture::set_colors()... +\n");
2021 printf(" Picture::get_colors()... ");
2022 block.set_colors(1u>16);
2023 if(block.get_colors() != (1u>16))
2024 return die_("value mismatch, expected 2^16");
2027 printf("testing Picture::get_data_length()... ");
2028 if(block.get_data_length() != 0)
2029 return die_("value mismatch, expected 0");
2032 printf("testing Picture::set_data()... ");
2033 if(!block.set_data((const FLAC__byte*)"qOMEJPEGDATA", strlen("qOMEJPEGDATA")))
2034 return die_("returned false");
2036 picture_.data.picture.data[0] = 'q';
2038 printf("testing Picture::get_data()... ");
2039 if(block.get_data_length() != picture_.data.picture.data_length)
2040 return die_("length mismatch");
2041 if(0 != memcmp(block.get_data(), picture_.data.picture.data, picture_.data.picture.data_length))
2042 return die_("value mismatch");
2045 printf("testing FLAC::Metadata::clone(const FLAC::Metadata::Prototype *)... ");
2046 FLAC::Metadata::Prototype *clone_ = FLAC::Metadata::clone(&block);
2048 return die_("returned NULL");
2049 if(0 == dynamic_cast<FLAC::Metadata::Picture *>(clone_))
2050 return die_("downcast is NULL");
2051 if(*dynamic_cast<FLAC::Metadata::Picture *>(clone_) != block)
2052 return die_("clone is not identical");
2054 printf("testing Picture::~Picture()... ");
2059 printf("PASSED\n\n");
2063 bool test_metadata_object()
2065 printf("\n+++ libFLAC++ unit test: metadata objects\n\n");
2067 init_metadata_blocks_();
2069 if(!test_metadata_object_streaminfo())
2072 if(!test_metadata_object_padding())
2075 if(!test_metadata_object_application())
2078 if(!test_metadata_object_seektable())
2081 if(!test_metadata_object_vorbiscomment())
2084 if(!test_metadata_object_cuesheet())
2087 if(!test_metadata_object_picture())
2090 free_metadata_blocks_();