/*
* Copyright (c) 2008
* Jonathan Schleifer <js@webkeks.org>
*
* All rights reserved.
*
* This file is part of libobjfw. It may be distributed under the terms of the
* Q Public License 1.0, which can be found in the file LICENSE included in
* the packaging of this file.
*/
#import "config.h"
#define _ISOC99_SOURCE
#import <stdlib.h>
#import <string.h>
#import <wchar.h>
#import "OFXMLFactory.h"
#define NUM_TESTS 10
static int i;
inline void
check_result(char *result, const char *should)
{
/* Use wprintf here so we don't mix printf and wprintf! */
i++;
if (!strcmp(result, should)) {
wprintf(L"\r\033[1;%dmchar* tests successful: %2d/%d\033[0m",
(i == NUM_TESTS ? 32 : 33), i, NUM_TESTS);
fflush(stdout);
} else {
wprintf(L"\r\033[K\033[1;31mchar* test %d/%d failed!\033[0m\n",
i, NUM_TESTS);
wprintf(L"%s is NOT expected result!\n", result);
exit(1);
}
free(result);
}
inline void
check_result_wide(wchar_t *result, const wchar_t *should)
{
i++;
if (!wcscmp(result, should)) {
wprintf(L"\r\033[1;%dmwchar_t* tests successful: %2d/%d\033[0m",
(i == NUM_TESTS ? 32 : 33), i, NUM_TESTS);
fflush(stdout);
} else {
wprintf(L"\r\033[K\033[1;31mwchar_t* test %d/%d failed!\033[0m"
"\n", i, NUM_TESTS);
wprintf(L"%s is NOT expected result!\n", result);
exit(1);
}
free(result);
}
inline void
test_concat()
{
const char *c1 = "<foo>", *c2 = "bar", *c3 = "<test/>";
char *s1, *s2, *s3;
char *strs[4];
if ((s1 = malloc(strlen(c1) + 1)) == NULL ||
(s2 = malloc(strlen(c2) + 1)) == NULL ||
(s3 = malloc(strlen(c3) + 1)) == NULL)
exit(1);
strncpy(s1, c1, strlen(c1) + 1);
strncpy(s2, c2, strlen(c2) + 1);
strncpy(s3, c3, strlen(c3) + 1);
strs[0] = s1;
strs[1] = s2;
strs[2] = s3;
strs[3] = NULL;
check_result([OFXMLFactory concatAndFreeCStrings: strs],
"<foo>bar<test/>");
}
inline void
test_concat_wide()
{
const wchar_t *c1 = L"<foo>", *c2 = L"bar", *c3 = L"<test/>";
wchar_t *s1, *s2, *s3;
wchar_t *strs[4];
if ((s1 = malloc((wcslen(c1) + 1) * sizeof(wchar_t))) == NULL ||
(s2 = malloc((wcslen(c2) + 1) * sizeof(wchar_t))) == NULL ||
(s3 = malloc((wcslen(c3) + 1) * sizeof(wchar_t))) == NULL)
exit(1);
wcsncpy(s1, c1, wcslen(c1) + 1);
wcsncpy(s2, c2, wcslen(c2) + 1);
wcsncpy(s3, c3, wcslen(c3) + 1);
strs[0] = s1;
strs[1] = s2;
strs[2] = s3;
strs[3] = NULL;
check_result_wide([OFXMLFactory concatAndFreeWideCStrings: strs],
L"<foo>bar<test/>");
}
inline void
test_create_stanza()
{
check_result([OFXMLFactory createStanza: "foo"
withCloseTag: NO
andData: NULL,
NULL],
"<foo>");
check_result([OFXMLFactory createStanza: "foo"
withCloseTag: NO
andData: NULL,
"bar", "baz",
"blub", "asd",
NULL],
"<foo bar='baz' blub='asd'>");
check_result([OFXMLFactory createStanza: "foo"
withCloseTag: YES
andData: NULL,
NULL],
"<foo/>");
check_result([OFXMLFactory createStanza: "foo"
withCloseTag: YES
andData: "bar",
NULL],
"<foo>bar</foo>");
check_result([OFXMLFactory createStanza: "foo"
withCloseTag: YES
andData: NULL,
"bar", "b&az",
NULL],
"<foo bar='b&az'/>");
check_result([OFXMLFactory createStanza: "foo"
withCloseTag: YES
andData: "bar",
"bar", "b'az",
NULL],
"<foo bar='b'az'>bar</foo>");
check_result([OFXMLFactory createStanza: "foo"
withCloseTag: YES
andData: NULL,
"bar", "b&az",
"x", "asd\"",
NULL],
"<foo bar='b&az' x='asd"'/>");
check_result([OFXMLFactory createStanza: "foo"
withCloseTag: YES
andData: "bar",
"bar", "b'az",
"x", "y",
"a", "b",
NULL],
"<foo bar='b'az' x='y' a='b'>bar</foo>");
}
inline void
test_create_stanza_wide()
{
check_result_wide([OFXMLFactory createWideStanza: L"foo"
withCloseTag: NO
andData: NULL,
NULL],
L"<foo>");
check_result_wide([OFXMLFactory createWideStanza: L"foo"
withCloseTag: NO
andData: NULL,
L"bar", L"baz",
L"blub", L"asd",
NULL],
L"<foo bar='baz' blub='asd'>");
check_result_wide([OFXMLFactory createWideStanza: L"foo"
withCloseTag: YES
andData: NULL,
NULL],
L"<foo/>");
check_result_wide([OFXMLFactory createWideStanza: L"foo"
withCloseTag: YES
andData: L"bar",
NULL],
L"<foo>bar</foo>");
check_result_wide([OFXMLFactory createWideStanza: L"foo"
withCloseTag: YES
andData: NULL,
L"bar", L"b&az",
NULL],
L"<foo bar='b&az'/>");
check_result_wide([OFXMLFactory createWideStanza: L"foo"
withCloseTag: YES
andData: L"bar",
L"bar", L"b'az",
NULL],
L"<foo bar='b'az'>bar</foo>");
check_result_wide([OFXMLFactory createWideStanza: L"foo"
withCloseTag: YES
andData: NULL,
L"bar", L"b&az",
L"x", L"asd\"",
NULL],
L"<foo bar='b&az' x='asd"'/>");
check_result_wide([OFXMLFactory createWideStanza: L"foo"
withCloseTag: YES
andData: L"bar",
L"bar", L"b'az",
L"x", L"y",
L"a", L"b",
NULL],
L"<foo bar='b'az' x='y' a='b'>bar</foo>");
}
inline void
test_escape()
{
check_result([OFXMLFactory escapeCString: "<hallo> &welt'\"!&"],
"<hallo> &welt'"!&");
}
inline void
test_escape_wide()
{
check_result_wide(
[OFXMLFactory escapeWideCString: L"<hallo> &welt'\"!&"],
L"<hallo> &welt'"!&");
}
int main()
{
i = 0;
test_escape();
test_create_stanza();
test_concat();
wprintf(L"\n");
i = 0;
test_escape_wide();
test_create_stanza_wide();
test_concat_wide();
wprintf(L"\n");
return 0;
}