/* * libsyncml - A syncml protocol implementation * Copyright (C) 2005 Armin Bauer * Copyright (C) 2008 Michael Bell * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include #include "tests/support.h" #ifdef ENABLE_WBXML #include #endif #include #include #include static SmlParser *start_wbxml_parser(const char *data) { setup_testbed(NULL); GError *error = NULL; SmlParser *parser = smlParserNew(SML_MIMETYPE_WBXML, 0, &error); sml_fail_unless(parser != NULL, NULL); sml_fail_unless(error == NULL, NULL); #ifdef ENABLE_WBXML char *buffer = NULL; gsize size = 0; sml_fail_unless(smlWbxmlConvertTo(NULL, data, &buffer, &size, &error), NULL); if (!smlParserStart(parser, buffer, size, &error)) { sml_fail_unless(error != NULL, NULL); SML_ERROR_FREE(error); /* the error is not used */ smlParserFree(parser); smlSafeCFree(&buffer); return NULL; } smlSafeCFree(&buffer); #endif return parser; } START_TEST (wbxml_parser_syncml_empty) { const char *data = ""; SmlParser *parser = start_wbxml_parser(data); sml_fail_unless(parser == NULL, NULL); } END_TEST START_TEST (wbxml_parser_no_syncbody) { const char *data = ""; SmlParser *parser = start_wbxml_parser(data); sml_fail_unless(parser != NULL, NULL); GError *error = NULL; SmlHeader *header = NULL; SmlCred *cred = NULL; sml_fail_unless(!smlParserGetHeader(parser, &header, &cred, &error), NULL); sml_fail_unless(header == NULL, NULL); sml_fail_unless(cred == NULL, NULL); sml_fail_unless(error != NULL, NULL); SML_ERROR_FREE(error); sml_fail_unless(!smlParserEnd(parser, NULL, NULL, &error), NULL); sml_fail_unless(error != NULL, NULL); SML_ERROR_FREE(error); smlParserFree(parser); } END_TEST START_TEST (wbxml_parser_no_synchdr) { const char *data = ""; SmlParser *parser = start_wbxml_parser(data); sml_fail_unless(parser == NULL, NULL); } END_TEST START_TEST (wbxml_parser_synchdr_empty) { const char *data = ""; SmlParser *parser = start_wbxml_parser(data); sml_fail_unless(parser != NULL, NULL); GError *error = NULL; SmlHeader *header = NULL; SmlCred *cred = NULL; sml_fail_unless(!smlParserGetHeader(parser, &header, &cred, &error), NULL); sml_fail_unless(header == NULL, NULL); sml_fail_unless(cred == NULL, NULL); sml_fail_unless(error != NULL, NULL); SML_ERROR_FREE(error); /* The empty SyncHdr is followed by an empty SyncHdr. * So the parser is at the correct position to finish successfully. */ sml_fail_unless(smlParserEnd(parser, NULL, NULL, &error), NULL); sml_fail_unless(error == NULL, NULL); smlParserFree(parser); } END_TEST START_TEST (wbxml_parser_synchdr_verproto) { const char *data = "SyncML/1.1"; SmlParser *parser = start_wbxml_parser(data); sml_fail_unless(parser != NULL, NULL); GError *error = NULL; SmlHeader *header = NULL; SmlCred *cred = NULL; sml_fail_unless(!smlParserGetHeader(parser, &header, &cred, &error), NULL); sml_fail_unless(header == NULL, NULL); sml_fail_unless(cred == NULL, NULL); sml_fail_unless(error != NULL, NULL); SML_ERROR_FREE(error); sml_fail_unless(!smlParserEnd(parser, NULL, NULL, &error), NULL); sml_fail_unless(error != NULL, NULL); SML_ERROR_FREE(error); smlParserFree(parser); } END_TEST START_TEST (wbxml_parser_synchdr_verdtd) { const char *data = "SyncML/1.11.1"; SmlParser *parser = start_wbxml_parser(data); sml_fail_unless(parser != NULL, NULL); GError *error = NULL; SmlHeader *header = NULL; SmlCred *cred = NULL; sml_fail_unless(!smlParserGetHeader(parser, &header, &cred, &error), NULL); sml_fail_unless(header == NULL, NULL); sml_fail_unless(cred == NULL, NULL); sml_fail_unless(error != NULL, NULL); SML_ERROR_FREE(error); sml_fail_unless(!smlParserEnd(parser, NULL, NULL, &error), NULL); sml_fail_unless(error != NULL, NULL); SML_ERROR_FREE(error); smlParserFree(parser); } END_TEST START_TEST (wbxml_parser_synchdr_msgid) { const char *data = "SyncML/1.11.11"; SmlParser *parser = start_wbxml_parser(data); sml_fail_unless(parser != NULL, NULL); GError *error = NULL; SmlHeader *header = NULL; SmlCred *cred = NULL; sml_fail_unless(!smlParserGetHeader(parser, &header, &cred, &error), NULL); sml_fail_unless(header == NULL, NULL); sml_fail_unless(cred == NULL, NULL); sml_fail_unless(error != NULL, NULL); SML_ERROR_FREE(error); sml_fail_unless(!smlParserEnd(parser, NULL, NULL, &error), NULL); sml_fail_unless(error != NULL, NULL); SML_ERROR_FREE(error); smlParserFree(parser); } END_TEST START_TEST (wbxml_parser_synchdr_sessionid) { const char *data = "SyncML/1.11.111"; SmlParser *parser = start_wbxml_parser(data); sml_fail_unless(parser != NULL, NULL); GError *error = NULL; SmlHeader *header = NULL; SmlCred *cred = NULL; sml_fail_unless(!smlParserGetHeader(parser, &header, &cred, &error), NULL); sml_fail_unless(header == NULL, NULL); sml_fail_unless(cred == NULL, NULL); sml_fail_unless(error != NULL, NULL); SML_ERROR_FREE(error); sml_fail_unless(!smlParserEnd(parser, NULL, NULL, &error), NULL); sml_fail_unless(error != NULL, NULL); SML_ERROR_FREE(error); smlParserFree(parser); } END_TEST START_TEST (wbxml_parser_synchdr_target) { const char *data = "SyncML/1.11.111test"; SmlParser *parser = start_wbxml_parser(data); sml_fail_unless(parser != NULL, NULL); GError *error = NULL; SmlHeader *header = NULL; SmlCred *cred = NULL; sml_fail_unless(!smlParserGetHeader(parser, &header, &cred, &error), NULL); sml_fail_unless(header == NULL, NULL); sml_fail_unless(cred == NULL, NULL); sml_fail_unless(error != NULL, NULL); SML_ERROR_FREE(error); sml_fail_unless(!smlParserEnd(parser, NULL, NULL, &error), NULL); sml_fail_unless(error != NULL, NULL); SML_ERROR_FREE(error); smlParserFree(parser); } END_TEST START_TEST (wbxml_parser_synchdr_source) { const char *data = "SyncML/1.11.111testtest"; SmlParser *parser = start_wbxml_parser(data); sml_fail_unless(parser != NULL, NULL); GError *error = NULL; SmlHeader *header = NULL; SmlCred *cred = NULL; sml_fail_unless(smlParserGetHeader(parser, &header, &cred, &error), NULL); sml_fail_unless(header != NULL, NULL); sml_fail_unless(cred == NULL, NULL); sml_fail_unless(error == NULL, NULL); sml_fail_unless(header->messageID == 1, NULL); sml_fail_unless(header->target != NULL, NULL); sml_fail_unless(header->source != NULL, NULL); sml_fail_unless(header->protocol == SML_PROTOCOL_SYNCML, NULL); sml_fail_unless(header->version == SML_VERSION_11, NULL); sml_fail_unless(header->sessionID == 1, NULL); smlHeaderFree(header); SmlStatus *status = NULL; sml_fail_unless(smlParserGetStatus(parser, &status, &error), NULL); sml_fail_unless(status == NULL, NULL); sml_fail_unless(error == NULL, NULL); SmlCommand *cmd = NULL; sml_fail_unless(smlParserGetCommand(parser, &cmd, &error), NULL); sml_fail_unless(cmd == NULL, NULL); sml_fail_unless(error == NULL, NULL); sml_fail_unless(smlParserEnd(parser, NULL, NULL, &error), NULL); sml_fail_unless(error == NULL, NULL); smlParserFree(parser); } END_TEST START_TEST (wbxml_parser_synchdr_source2) { const char *data = "SyncML/1.11.11123testtest"; SmlParser *parser = start_wbxml_parser(data); sml_fail_unless(parser != NULL, NULL); GError *error = NULL; SmlHeader *header = NULL; SmlCred *cred = NULL; sml_fail_unless(smlParserGetHeader(parser, &header, &cred, &error), NULL); sml_fail_unless(header != NULL, NULL); sml_fail_unless(cred == NULL, NULL); sml_fail_unless(error == NULL, NULL); sml_fail_unless(header->messageID == 1, NULL); sml_fail_unless(header->target != NULL, NULL); sml_fail_unless(header->source != NULL, NULL); sml_fail_unless(header->protocol == SML_PROTOCOL_SYNCML, NULL); sml_fail_unless(header->version == SML_VERSION_11, NULL); sml_fail_unless(header->sessionID == 123, NULL); smlHeaderFree(header); SmlStatus *status = NULL; sml_fail_unless(smlParserGetStatus(parser, &status, &error), NULL); sml_fail_unless(status == NULL, NULL); sml_fail_unless(error == NULL, NULL); SmlCommand *cmd = NULL; sml_fail_unless(smlParserGetCommand(parser, &cmd, &error), NULL); sml_fail_unless(cmd == NULL, NULL); sml_fail_unless(error == NULL, NULL); sml_fail_unless(smlParserEnd(parser, NULL, NULL, &error), NULL); sml_fail_unless(error == NULL, NULL); smlParserFree(parser); } END_TEST START_TEST (wbxml_parser_synchdr_additional) { const char *data = "SyncML/1.11.111testtest"; SmlParser *parser = start_wbxml_parser(data); sml_fail_unless(parser != NULL, NULL); GError *error = NULL; SmlHeader *header = NULL; SmlCred *cred = NULL; sml_fail_unless(!smlParserGetHeader(parser, &header, &cred, &error), NULL); sml_fail_unless(header == NULL, NULL); sml_fail_unless(cred == NULL, NULL); sml_fail_unless(error != NULL, NULL); SML_ERROR_FREE(error); sml_fail_unless(!smlParserEnd(parser, NULL, NULL, &error), NULL); sml_fail_unless(error != NULL, NULL); SML_ERROR_FREE(error); smlParserFree(parser); } END_TEST START_TEST (wbxml_parser_status_empty) { const char *data = "SyncML/1.11.111testtest"; SmlParser *parser = start_wbxml_parser(data); sml_fail_unless(parser != NULL, NULL); GError *error = NULL; SmlHeader *header = NULL; SmlCred *cred = NULL; sml_fail_unless(smlParserGetHeader(parser, &header, &cred, &error), NULL); sml_fail_unless(header != NULL, NULL); sml_fail_unless(cred == NULL, NULL); sml_fail_unless(error == NULL, NULL); sml_fail_unless(header->messageID == 1, NULL); smlHeaderFree(header); SmlStatus *status = NULL; sml_fail_unless(!smlParserGetStatus(parser, &status, &error), NULL); sml_fail_unless(status == NULL, NULL); sml_fail_unless(error != NULL, NULL); SML_ERROR_FREE(error); SmlCommand *cmd = NULL; sml_fail_unless(smlParserGetCommand(parser, &cmd, &error), NULL); sml_fail_unless(cmd == NULL, NULL); sml_fail_unless(error == NULL, NULL); sml_fail_unless(smlParserEnd(parser, NULL, NULL, &error), NULL); sml_fail_unless(error == NULL, NULL); smlParserFree(parser); } END_TEST START_TEST (wbxml_parser_status_cmdid) { const char *data = "SyncML/1.11.111testtest1"; SmlParser *parser = start_wbxml_parser(data); sml_fail_unless(parser != NULL, NULL); GError *error = NULL; SmlHeader *header = NULL; SmlCred *cred = NULL; sml_fail_unless(smlParserGetHeader(parser, &header, &cred, &error), NULL); sml_fail_unless(header != NULL, NULL); sml_fail_unless(cred == NULL, NULL); sml_fail_unless(error == NULL, NULL); sml_fail_unless(header->messageID == 1, NULL); smlHeaderFree(header); SmlStatus *status = NULL; sml_fail_unless(!smlParserGetStatus(parser, &status, &error), NULL); sml_fail_unless(status == NULL, NULL); sml_fail_unless(error != NULL, NULL); SML_ERROR_FREE(error); smlParserFree(parser); } END_TEST START_TEST (wbxml_parser_status_msgref) { const char *data = "SyncML/1.11.111testtest11"; SmlParser *parser = start_wbxml_parser(data); sml_fail_unless(parser != NULL, NULL); GError *error = NULL; SmlHeader *header = NULL; SmlCred *cred = NULL; sml_fail_unless(smlParserGetHeader(parser, &header, &cred, &error), NULL); sml_fail_unless(header != NULL, NULL); sml_fail_unless(cred == NULL, NULL); sml_fail_unless(error == NULL, NULL); sml_fail_unless(header->messageID == 1, NULL); smlHeaderFree(header); SmlStatus *status = NULL; sml_fail_unless(!smlParserGetStatus(parser, &status, &error), NULL); sml_fail_unless(status == NULL, NULL); sml_fail_unless(error != NULL, NULL); SML_ERROR_FREE(error); smlParserFree(parser); } END_TEST START_TEST (wbxml_parser_status_cmdref) { const char *data = "SyncML/1.11.111testtest111"; SmlParser *parser = start_wbxml_parser(data); sml_fail_unless(parser != NULL, NULL); GError *error = NULL; SmlHeader *header = NULL; SmlCred *cred = NULL; sml_fail_unless(smlParserGetHeader(parser, &header, &cred, &error), NULL); sml_fail_unless(header != NULL, NULL); sml_fail_unless(cred == NULL, NULL); sml_fail_unless(error == NULL, NULL); sml_fail_unless(header->messageID == 1, NULL); smlHeaderFree(header); SmlStatus *status = NULL; sml_fail_unless(!smlParserGetStatus(parser, &status, &error), NULL); sml_fail_unless(status == NULL, NULL); sml_fail_unless(error != NULL, NULL); SML_ERROR_FREE(error); smlParserFree(parser); } END_TEST START_TEST (wbxml_parser_status) { const char *data = "SyncML/1.11.111testtest110Sync"; SmlParser *parser = start_wbxml_parser(data); sml_fail_unless(parser != NULL, NULL); GError *error = NULL; SmlHeader *header = NULL; SmlCred *cred = NULL; sml_fail_unless(smlParserGetHeader(parser, &header, &cred, &error), NULL); sml_fail_unless(header != NULL, NULL); sml_fail_unless(cred == NULL, NULL); sml_fail_unless(error == NULL, NULL); sml_fail_unless(header->messageID == 1, NULL); smlHeaderFree(header); SmlStatus *status = NULL; sml_fail_unless(smlParserGetStatus(parser, &status, &error), NULL); sml_fail_unless(status != NULL, NULL); sml_fail_unless(error == NULL, NULL); smlStatusUnref(status); sml_fail_unless(smlParserGetStatus(parser, &status, &error), NULL); sml_fail_unless(status == NULL, NULL); sml_fail_unless(error == NULL, NULL); SmlCommand *cmd = NULL; sml_fail_unless(smlParserGetCommand(parser, &cmd, &error), NULL); sml_fail_unless(cmd == NULL, NULL); sml_fail_unless(error == NULL, NULL); sml_fail_unless(smlParserEnd(parser, NULL, NULL, &error), NULL); sml_fail_unless(error == NULL, NULL); smlParserFree(parser); } END_TEST START_TEST (wbxml_parser_status2) { const char *data = "SyncML/1.11.111testtest110Sync110Sync"; SmlParser *parser = start_wbxml_parser(data); sml_fail_unless(parser != NULL, NULL); GError *error = NULL; SmlHeader *header = NULL; SmlCred *cred = NULL; sml_fail_unless(smlParserGetHeader(parser, &header, &cred, &error), NULL); sml_fail_unless(header != NULL, NULL); sml_fail_unless(cred == NULL, NULL); sml_fail_unless(error == NULL, NULL); sml_fail_unless(header->messageID == 1, NULL); smlHeaderFree(header); SmlStatus *status = NULL; sml_fail_unless(smlParserGetStatus(parser, &status, &error), NULL); sml_fail_unless(status != NULL, NULL); sml_fail_unless(error == NULL, NULL); smlStatusUnref(status); sml_fail_unless(smlParserGetStatus(parser, &status, &error), NULL); sml_fail_unless(status != NULL, NULL); sml_fail_unless(error == NULL, NULL); smlStatusUnref(status); sml_fail_unless(smlParserGetStatus(parser, &status, &error), NULL); sml_fail_unless(status == NULL, NULL); sml_fail_unless(error == NULL, NULL); SmlCommand *cmd = NULL; sml_fail_unless(smlParserGetCommand(parser, &cmd, &error), NULL); sml_fail_unless(cmd == NULL, NULL); sml_fail_unless(error == NULL, NULL); gboolean final = TRUE; gboolean end = TRUE; sml_fail_unless(smlParserEnd(parser, &final, &end, &error), NULL); sml_fail_unless(error == NULL, NULL); sml_fail_unless(final == FALSE, NULL); sml_fail_unless(end == FALSE, NULL); smlParserFree(parser); } END_TEST START_TEST (wbxml_parser_final) { const char *data = "SyncML/1.11.111testtest110Sync110Sync"; SmlParser *parser = start_wbxml_parser(data); sml_fail_unless(parser != NULL, NULL); GError *error = NULL; SmlHeader *header = NULL; SmlCred *cred = NULL; sml_fail_unless(smlParserGetHeader(parser, &header, &cred, &error), NULL); sml_fail_unless(header != NULL, NULL); sml_fail_unless(cred == NULL, NULL); sml_fail_unless(error == NULL, NULL); sml_fail_unless(header->messageID == 1, NULL); smlHeaderFree(header); SmlStatus *status = NULL; sml_fail_unless(smlParserGetStatus(parser, &status, &error), NULL); sml_fail_unless(status != NULL, NULL); sml_fail_unless(error == NULL, NULL); smlStatusUnref(status); sml_fail_unless(smlParserGetStatus(parser, &status, &error), NULL); sml_fail_unless(status != NULL, NULL); sml_fail_unless(error == NULL, NULL); smlStatusUnref(status); sml_fail_unless(smlParserGetStatus(parser, &status, &error), NULL); sml_fail_unless(status == NULL, NULL); sml_fail_unless(error == NULL, NULL); SmlCommand *cmd = NULL; sml_fail_unless(smlParserGetCommand(parser, &cmd, &error), NULL); sml_fail_unless(cmd == NULL, NULL); sml_fail_unless(error == NULL, NULL); gboolean final = FALSE; gboolean end = FALSE; sml_fail_unless(smlParserEnd(parser, &final, &end, &error), NULL); sml_fail_unless(error == NULL, NULL); sml_fail_unless(final == TRUE, NULL); sml_fail_unless(end == TRUE, NULL); smlParserFree(parser); } END_TEST START_TEST (wbxml_parser_final2) { const char *data = "SyncML/1.11.111testtest110Sync110Sync"; SmlParser *parser = start_wbxml_parser(data); sml_fail_unless(parser != NULL, NULL); GError *error = NULL; SmlHeader *header = NULL; SmlCred *cred = NULL; sml_fail_unless(smlParserGetHeader(parser, &header, &cred, &error), NULL); sml_fail_unless(header != NULL, NULL); sml_fail_unless(cred == NULL, NULL); sml_fail_unless(error == NULL, NULL); sml_fail_unless(header->messageID == 1, NULL); smlHeaderFree(header); SmlStatus *status = NULL; sml_fail_unless(smlParserGetStatus(parser, &status, &error), NULL); sml_fail_unless(status != NULL, NULL); sml_fail_unless(error == NULL, NULL); smlStatusUnref(status); sml_fail_unless(smlParserGetStatus(parser, &status, &error), NULL); sml_fail_unless(status != NULL, NULL); sml_fail_unless(error == NULL, NULL); smlStatusUnref(status); sml_fail_unless(smlParserGetStatus(parser, &status, &error), NULL); sml_fail_unless(status == NULL, NULL); sml_fail_unless(error == NULL, NULL); SmlCommand *cmd = NULL; sml_fail_unless(smlParserGetCommand(parser, &cmd, &error), NULL); sml_fail_unless(cmd == NULL, NULL); sml_fail_unless(error == NULL, NULL); gboolean final = FALSE; gboolean end = FALSE; sml_fail_unless(smlParserEnd(parser, &final, &end, &error), NULL); sml_fail_unless(error == NULL, NULL); sml_fail_unless(final == TRUE, NULL); sml_fail_unless(end == TRUE, NULL); smlParserFree(parser); } END_TEST START_TEST (wbxml_parser_cmd) { const char *data = "SyncML/1.11.111testtest1/test/testNextlast200"; SmlParser *parser = start_wbxml_parser(data); sml_fail_unless(parser != NULL, NULL); GError *error = NULL; SmlHeader *header = NULL; SmlCred *cred = NULL; sml_fail_unless(smlParserGetHeader(parser, &header, &cred, &error), NULL); sml_fail_unless(header != NULL, NULL); sml_fail_unless(cred == NULL, NULL); sml_fail_unless(error == NULL, NULL); sml_fail_unless(header->messageID == 1, NULL); smlHeaderFree(header); SmlStatus *status = NULL; sml_fail_unless(smlParserGetStatus(parser, &status, &error), NULL); sml_fail_unless(status == NULL, NULL); sml_fail_unless(error == NULL, NULL); sml_fail_unless(smlParserGetStatus(parser, &status, &error), NULL); sml_fail_unless(status == NULL, NULL); sml_fail_unless(error == NULL, NULL); SmlCommand *cmd = NULL; sml_fail_unless(smlParserGetCommand(parser, &cmd, &error), NULL); sml_fail_unless(cmd != NULL, NULL); sml_fail_unless(error == NULL, NULL); sml_fail_unless(cmd->cmdID == 1, NULL); smlCommandUnref(cmd); sml_fail_unless(smlParserGetCommand(parser, &cmd, &error), NULL); sml_fail_unless(cmd == NULL, NULL); sml_fail_unless(error == NULL, NULL); gboolean final = TRUE; gboolean end = TRUE; sml_fail_unless(smlParserEnd(parser, &final, &end, &error), NULL); sml_fail_unless(error == NULL, NULL); sml_fail_unless(final == FALSE, NULL); sml_fail_unless(end == FALSE, NULL); smlParserFree(parser); } END_TEST START_TEST (wbxml_parser_cmd_final) { const char *data = "SyncML/1.11.111testtest1/test/testNextlast200"; SmlParser *parser = start_wbxml_parser(data); sml_fail_unless(parser != NULL, NULL); GError *error = NULL; SmlHeader *header = NULL; SmlCred *cred = NULL; sml_fail_unless(smlParserGetHeader(parser, &header, &cred, &error), NULL); sml_fail_unless(header != NULL, NULL); sml_fail_unless(cred == NULL, NULL); sml_fail_unless(error == NULL, NULL); sml_fail_unless(header->messageID == 1, NULL); smlHeaderFree(header); SmlStatus *status = NULL; sml_fail_unless(smlParserGetStatus(parser, &status, &error), NULL); sml_fail_unless(status == NULL, NULL); sml_fail_unless(error == NULL, NULL); sml_fail_unless(smlParserGetStatus(parser, &status, &error), NULL); sml_fail_unless(status == NULL, NULL); sml_fail_unless(error == NULL, NULL); SmlCommand *cmd = NULL; sml_fail_unless(smlParserGetCommand(parser, &cmd, &error), NULL); sml_fail_unless(cmd != NULL, NULL); sml_fail_unless(error == NULL, NULL); sml_fail_unless(cmd->cmdID == 1, NULL); smlCommandUnref(cmd); sml_fail_unless(smlParserGetCommand(parser, &cmd, &error), NULL); sml_fail_unless(cmd == NULL, NULL); sml_fail_unless(error == NULL, NULL); gboolean final = FALSE; gboolean end = TRUE; sml_fail_unless(smlParserEnd(parser, &final, &end, &error), NULL); sml_fail_unless(error == NULL, NULL); sml_fail_unless(final == TRUE, NULL); sml_fail_unless(end == FALSE, NULL); smlParserFree(parser); } END_TEST @SML_TESTCASE_CODE@