/* * Copyright (C) 2014 René Kijewski * * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "tests-ubjson.h" typedef enum { BEFORE_ARRAY_1 = __LINE__, IN_ARRAY_1 = __LINE__, BEFORE_ARRAY_2 = __LINE__, IN_ARRAY_2 = __LINE__, BEFORE_END = __LINE__, } test_ubjson_empty_object_state_t; typedef struct { ubjson_cookie_t cookie; test_ubjson_empty_object_state_t state; } test_ubjson_empty_object_receiver_cookie_t; static void test_ubjson_empty_object_receiver_callback_sub( ubjson_cookie_t *restrict cookie, ubjson_type_t type1, ssize_t content1, ubjson_type_t type2, ssize_t content2, ubjson_read_callback_result_t *result) { *result = UBJSON_ABORTED; (void) content1, (void) type2, (void) content2; test_ubjson_empty_object_receiver_cookie_t *state; state = container_of(cookie, test_ubjson_empty_object_receiver_cookie_t, cookie); switch (state->state) { case BEFORE_ARRAY_1: TEST_ASSERT_EQUAL_INT(UBJSON_ENTER_OBJECT, type1); state->state = IN_ARRAY_1; TEST_ASSERT_EQUAL_INT(UBJSON_OKAY, ubjson_read_object(cookie)); state->state = BEFORE_ARRAY_2; break; case IN_ARRAY_1: TEST_FAIL("The empty object was not empty (1)"); break; case BEFORE_ARRAY_2: TEST_ASSERT_EQUAL_INT(UBJSON_ENTER_OBJECT, type1); state->state = IN_ARRAY_2; TEST_ASSERT_EQUAL_INT(UBJSON_OKAY, ubjson_read_object(cookie)); state->state = BEFORE_END; break; case IN_ARRAY_2: TEST_FAIL("The empty object was not empty (2)"); break; case BEFORE_END: TEST_FAIL("Content after the end"); break; default: TEST_FAIL("The cookie was corrupted"); break; } *result = UBJSON_OKAY; } static ubjson_read_callback_result_t test_ubjson_empty_object_receiver_callback( ubjson_cookie_t *restrict cookie, ubjson_type_t type1, ssize_t content1, ubjson_type_t type2, ssize_t content2) { ubjson_read_callback_result_t result; test_ubjson_empty_object_receiver_callback_sub(cookie, type1, content1, type2, content2, &result); return result; } #undef EMBUNIT_ERROR_RETURN #define EMBUNIT_ERROR_RETURN static void test_ubjson_empty_object_receiver(void) { test_ubjson_empty_object_receiver_cookie_t state; state.state = BEFORE_ARRAY_1; TEST_ASSERT_EQUAL_INT(UBJSON_OKAY, ubjson_read(&state.cookie, test_ubjson_read_fun, test_ubjson_empty_object_receiver_callback)); TEST_ASSERT_EQUAL_INT(BEFORE_ARRAY_2, state.state); TEST_ASSERT_EQUAL_INT(UBJSON_OKAY, ubjson_read(&state.cookie, test_ubjson_read_fun, test_ubjson_empty_object_receiver_callback)); TEST_ASSERT_EQUAL_INT(BEFORE_END, state.state); } #undef EMBUNIT_ERROR_RETURN #define EMBUNIT_ERROR_RETURN static void test_ubjson_empty_object_sender(void) { ubjson_cookie_t cookie; ubjson_write_init(&cookie, test_ubjson_write_fun); TEST_ASSERT(ubjson_open_object(&cookie) > 0); TEST_ASSERT(ubjson_close_object(&cookie) > 0); TEST_ASSERT(ubjson_open_object_len(&cookie, 0) > 0); } void test_ubjson_empty_object(void) { test_ubjson_test(test_ubjson_empty_object_sender, test_ubjson_empty_object_receiver); }