Blame src/tests/text.c

Packit c32a2d
/*
Packit c32a2d
	text: Test text transformations in libmpg123 (conversion to UTF-8).
Packit c32a2d
Packit c32a2d
	copyright 2009 by the mpg123 project - free software under the terms of the LGPL 2.1
Packit c32a2d
	see COPYING and AUTHORS files in distribution or http://mpg123.org
Packit c32a2d
	initially written by Thomas Orgis
Packit c32a2d
Packit c32a2d
	arguments: decoder testfile.mpeg
Packit c32a2d
*/
Packit c32a2d
Packit c32a2d
#include <mpg123.h>
Packit c32a2d
#include <compat.h>
Packit c32a2d
Packit c32a2d
#include "testtext.h"
Packit c32a2d
Packit c32a2d
int string_good(mpg123_string *sb)
Packit c32a2d
{
Packit c32a2d
	/* Let's accept additional null bytes... */
Packit c32a2d
	if(sb->fill >= sizeof(utf8) && memcmp(utf8, sb->p, sizeof(utf8)) == 0
Packit c32a2d
	   && (sb->fill <= sizeof(utf8) || sb->p[sizeof(utf8)] == 0) )
Packit c32a2d
	return 1;
Packit c32a2d
	else
Packit c32a2d
	return 0;
Packit c32a2d
}
Packit c32a2d
Packit c32a2d
int check_string(const char* name, enum mpg123_text_encoding enc, const unsigned char* source, size_t source_size)
Packit c32a2d
{
Packit c32a2d
	int ret = 0;
Packit c32a2d
	mpg123_string sb;
Packit c32a2d
	mpg123_init_string(&sb);
Packit c32a2d
	printf("Conversion of %s: ", name);
Packit c32a2d
	if(    mpg123_store_utf8(&sb, enc, source, source_size)
Packit c32a2d
	    && string_good(&sb) )
Packit c32a2d
	{
Packit c32a2d
		printf("PASS\n");
Packit c32a2d
		ret = 0;
Packit c32a2d
	}
Packit c32a2d
	else
Packit c32a2d
	{
Packit c32a2d
		printf("FAIL (%"SIZE_P" vs. %"SIZE_P")\n", (size_p)sb.fill, (size_p)sizeof(utf8));
Packit c32a2d
		ret = 1;
Packit c32a2d
	}
Packit c32a2d
Packit c32a2d
	mpg123_free_string(&sb);
Packit c32a2d
	return ret;
Packit c32a2d
}
Packit c32a2d
Packit c32a2d
/* We test: latin1, cp1252, utf8 and all of utf16be/le with and without BOM.
Packit c32a2d
   Everything should succeed -- except utf16le without BOM. */
Packit c32a2d
int main()
Packit c32a2d
{
Packit c32a2d
	int ret = 0;
Packit c32a2d
	mpg123_string trans_utf16le;
Packit c32a2d
Packit c32a2d
	mpg123_init_string(&trans_utf16le);
Packit c32a2d
Packit c32a2d
	/* First, all conversions that should work. */
Packit c32a2d
	ret += check_string("latin1", mpg123_text_latin1, latin1, sizeof(latin1));
Packit c32a2d
	ret += check_string("cp1252", mpg123_text_cp1252, cp1252, sizeof(cp1252));
Packit c32a2d
	ret += check_string("utf8",   mpg123_text_utf8,   utf8,   sizeof(utf8));
Packit c32a2d
	ret += check_string("utf16bom_be", mpg123_text_utf16bom, utf16bom_be, sizeof(utf16bom_be));
Packit c32a2d
	ret += check_string("utf16bom_le", mpg123_text_utf16,    utf16bom_le, sizeof(utf16bom_le));
Packit c32a2d
	ret += check_string("utf16be",     mpg123_text_utf16be,  utf16be,     sizeof(utf16be));
Packit c32a2d
Packit c32a2d
	/* Now test the non-supported string. */
Packit c32a2d
	printf("Let's see what happens with a non-BOM little endian UTF-16 string: ");
Packit c32a2d
	mpg123_store_utf8(&trans_utf16le, mpg123_text_utf16, utf16le, sizeof(utf16le));
Packit c32a2d
	if(string_good(&trans_utf16le))
Packit c32a2d
	{
Packit c32a2d
		++ret;
Packit c32a2d
		printf("FAIL\n");
Packit c32a2d
	}
Packit c32a2d
	else printf("PASS\n");
Packit c32a2d
Packit c32a2d
	mpg123_free_string(&trans_utf16le);
Packit c32a2d
Packit c32a2d
	printf("\n%s\n", ret == 0 ? "PASS" : "FAIL");
Packit c32a2d
Packit c32a2d
	return ret;
Packit c32a2d
}