Esempio n. 1
0
static void test_visitor_in_errors(TestInputVisitorData *data,
                                   const void *unused)
{
    TestStruct *p = NULL;
    Error *err = NULL;
    Visitor *v;
    strList *q = NULL;
    UserDefTwo *r = NULL;
    WrapAlternate *s = NULL;

    v = visitor_input_test_init(data, "{ 'integer': false, 'boolean': 'foo', "
                                "'string': -42 }");

    visit_type_TestStruct(v, NULL, &p, &err);
    error_free_or_abort(&err);
    g_assert(!p);

    v = visitor_input_test_init(data, "[ '1', '2', false, '3' ]");
    visit_type_strList(v, NULL, &q, &err);
    error_free_or_abort(&err);
    assert(!q);

    v = visitor_input_test_init(data, "{ 'str':'hi' }");
    visit_type_UserDefTwo(v, NULL, &r, &err);
    error_free_or_abort(&err);
    assert(!r);

    v = visitor_input_test_init(data, "{ }");
    visit_type_WrapAlternate(v, NULL, &s, &err);
    error_free_or_abort(&err);
    assert(!s);
}
static void test_visitor_in_errors(TestInputVisitorData *data,
                                   const void *unused)
{
    TestStruct *p = NULL;
    Error *err = NULL;
    Visitor *v;
    strList *q = NULL;

    v = visitor_input_test_init(data, "{ 'integer': false, 'boolean': 'foo', "
                                "'string': -42 }");

    visit_type_TestStruct(v, &p, NULL, &err);
    error_free_or_abort(&err);
    /* FIXME - a failed parse should not leave a partially-allocated p
     * for us to clean up; this could cause callers to leak memory. */
    g_assert(p->string == NULL);

    g_free(p->string);
    g_free(p);

    v = visitor_input_test_init(data, "[ '1', '2', false, '3' ]");
    visit_type_strList(v, &q, NULL, &err);
    error_free_or_abort(&err);
    assert(q);
    qapi_free_strList(q);
}
static void test_visitor_in_wrong_type(TestInputVisitorData *data,
                                       const void *unused)
{
    TestStruct *p = NULL;
    Visitor *v;
    strList *q = NULL;
    int64_t i;
    Error *err = NULL;

    /* Make sure arrays and structs cannot be confused */

    v = visitor_input_test_init(data, "[]");
    visit_type_TestStruct(v, &p, NULL, &err);
    error_free_or_abort(&err);
    g_assert(!p);

    v = visitor_input_test_init(data, "{}");
    visit_type_strList(v, &q, NULL, &err);
    error_free_or_abort(&err);
    assert(!q);

    /* Make sure primitives and struct cannot be confused */

    v = visitor_input_test_init(data, "1");
    visit_type_TestStruct(v, &p, NULL, &err);
    error_free_or_abort(&err);
    g_assert(!p);

    v = visitor_input_test_init(data, "{}");
    visit_type_int(v, &i, NULL, &err);
    error_free_or_abort(&err);

    /* Make sure primitives and arrays cannot be confused */

    v = visitor_input_test_init(data, "1");
    visit_type_strList(v, &q, NULL, &err);
    error_free_or_abort(&err);
    assert(!q);

    v = visitor_input_test_init(data, "[]");
    visit_type_int(v, &i, NULL, &err);
    error_free_or_abort(&err);
}
static void visit_primitive_list(Visitor *v, void **native, Error **errp)
{
    PrimitiveList *pl = *native;
    switch (pl->type) {
    case PTYPE_STRING:
        visit_type_strList(v, NULL, &pl->value.strings, errp);
        break;
    case PTYPE_BOOLEAN:
        visit_type_boolList(v, NULL, &pl->value.booleans, errp);
        break;
    case PTYPE_NUMBER:
        visit_type_numberList(v, NULL, &pl->value.numbers, errp);
        break;
    case PTYPE_INTEGER:
        visit_type_intList(v, NULL, &pl->value.integers, errp);
        break;
    case PTYPE_S8:
        visit_type_int8List(v, NULL, &pl->value.s8_integers, errp);
        break;
    case PTYPE_S16:
        visit_type_int16List(v, NULL, &pl->value.s16_integers, errp);
        break;
    case PTYPE_S32:
        visit_type_int32List(v, NULL, &pl->value.s32_integers, errp);
        break;
    case PTYPE_S64:
        visit_type_int64List(v, NULL, &pl->value.s64_integers, errp);
        break;
    case PTYPE_U8:
        visit_type_uint8List(v, NULL, &pl->value.u8_integers, errp);
        break;
    case PTYPE_U16:
        visit_type_uint16List(v, NULL, &pl->value.u16_integers, errp);
        break;
    case PTYPE_U32:
        visit_type_uint32List(v, NULL, &pl->value.u32_integers, errp);
        break;
    case PTYPE_U64:
        visit_type_uint64List(v, NULL, &pl->value.u64_integers, errp);
        break;
    default:
        g_assert_not_reached();
    }
}