Annotation of qemu/tests/check-qjson.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * Copyright IBM, Corp. 2009
        !             3:  *
        !             4:  * Authors:
        !             5:  *  Anthony Liguori   <[email protected]>
        !             6:  *
        !             7:  * This work is licensed under the terms of the GNU LGPL, version 2.1 or later.
        !             8:  * See the COPYING.LIB file in the top-level directory.
        !             9:  *
        !            10:  */
        !            11: #include <glib.h>
        !            12: 
        !            13: #include "qstring.h"
        !            14: #include "qint.h"
        !            15: #include "qdict.h"
        !            16: #include "qlist.h"
        !            17: #include "qfloat.h"
        !            18: #include "qbool.h"
        !            19: #include "qjson.h"
        !            20: 
        !            21: #include "qemu-common.h"
        !            22: 
        !            23: static void escaped_string(void)
        !            24: {
        !            25:     int i;
        !            26:     struct {
        !            27:         const char *encoded;
        !            28:         const char *decoded;
        !            29:         int skip;
        !            30:     } test_cases[] = {
        !            31:         { "\"\\b\"", "\b" },
        !            32:         { "\"\\f\"", "\f" },
        !            33:         { "\"\\n\"", "\n" },
        !            34:         { "\"\\r\"", "\r" },
        !            35:         { "\"\\t\"", "\t" },
        !            36:         { "\"/\"", "/" },
        !            37:         { "\"\\/\"", "/", .skip = 1 },
        !            38:         { "\"\\\\\"", "\\" },
        !            39:         { "\"\\\"\"", "\"" },
        !            40:         { "\"hello world \\\"embedded string\\\"\"",
        !            41:           "hello world \"embedded string\"" },
        !            42:         { "\"hello world\\nwith new line\"", "hello world\nwith new line" },
        !            43:         { "\"single byte utf-8 \\u0020\"", "single byte utf-8  ", .skip = 1 },
        !            44:         { "\"double byte utf-8 \\u00A2\"", "double byte utf-8 \xc2\xa2" },
        !            45:         { "\"triple byte utf-8 \\u20AC\"", "triple byte utf-8 \xe2\x82\xac" },
        !            46:         {}
        !            47:     };
        !            48: 
        !            49:     for (i = 0; test_cases[i].encoded; i++) {
        !            50:         QObject *obj;
        !            51:         QString *str;
        !            52: 
        !            53:         obj = qobject_from_json(test_cases[i].encoded);
        !            54: 
        !            55:         g_assert(obj != NULL);
        !            56:         g_assert(qobject_type(obj) == QTYPE_QSTRING);
        !            57:         
        !            58:         str = qobject_to_qstring(obj);
        !            59:         g_assert_cmpstr(qstring_get_str(str), ==, test_cases[i].decoded);
        !            60: 
        !            61:         if (test_cases[i].skip == 0) {
        !            62:             str = qobject_to_json(obj);
        !            63:             g_assert_cmpstr(qstring_get_str(str), ==, test_cases[i].encoded);
        !            64:             qobject_decref(obj);
        !            65:         }
        !            66: 
        !            67:         QDECREF(str);
        !            68:     }
        !            69: }
        !            70: 
        !            71: static void simple_string(void)
        !            72: {
        !            73:     int i;
        !            74:     struct {
        !            75:         const char *encoded;
        !            76:         const char *decoded;
        !            77:     } test_cases[] = {
        !            78:         { "\"hello world\"", "hello world" },
        !            79:         { "\"the quick brown fox jumped over the fence\"",
        !            80:           "the quick brown fox jumped over the fence" },
        !            81:         {}
        !            82:     };
        !            83: 
        !            84:     for (i = 0; test_cases[i].encoded; i++) {
        !            85:         QObject *obj;
        !            86:         QString *str;
        !            87: 
        !            88:         obj = qobject_from_json(test_cases[i].encoded);
        !            89: 
        !            90:         g_assert(obj != NULL);
        !            91:         g_assert(qobject_type(obj) == QTYPE_QSTRING);
        !            92:         
        !            93:         str = qobject_to_qstring(obj);
        !            94:         g_assert(strcmp(qstring_get_str(str), test_cases[i].decoded) == 0);
        !            95: 
        !            96:         str = qobject_to_json(obj);
        !            97:         g_assert(strcmp(qstring_get_str(str), test_cases[i].encoded) == 0);
        !            98: 
        !            99:         qobject_decref(obj);
        !           100:         
        !           101:         QDECREF(str);
        !           102:     }
        !           103: }
        !           104: 
        !           105: static void single_quote_string(void)
        !           106: {
        !           107:     int i;
        !           108:     struct {
        !           109:         const char *encoded;
        !           110:         const char *decoded;
        !           111:     } test_cases[] = {
        !           112:         { "'hello world'", "hello world" },
        !           113:         { "'the quick brown fox \\' jumped over the fence'",
        !           114:           "the quick brown fox ' jumped over the fence" },
        !           115:         {}
        !           116:     };
        !           117: 
        !           118:     for (i = 0; test_cases[i].encoded; i++) {
        !           119:         QObject *obj;
        !           120:         QString *str;
        !           121: 
        !           122:         obj = qobject_from_json(test_cases[i].encoded);
        !           123: 
        !           124:         g_assert(obj != NULL);
        !           125:         g_assert(qobject_type(obj) == QTYPE_QSTRING);
        !           126:         
        !           127:         str = qobject_to_qstring(obj);
        !           128:         g_assert(strcmp(qstring_get_str(str), test_cases[i].decoded) == 0);
        !           129: 
        !           130:         QDECREF(str);
        !           131:     }
        !           132: }
        !           133: 
        !           134: static void vararg_string(void)
        !           135: {
        !           136:     int i;
        !           137:     struct {
        !           138:         const char *decoded;
        !           139:     } test_cases[] = {
        !           140:         { "hello world" },
        !           141:         { "the quick brown fox jumped over the fence" },
        !           142:         {}
        !           143:     };
        !           144: 
        !           145:     for (i = 0; test_cases[i].decoded; i++) {
        !           146:         QObject *obj;
        !           147:         QString *str;
        !           148: 
        !           149:         obj = qobject_from_jsonf("%s", test_cases[i].decoded);
        !           150: 
        !           151:         g_assert(obj != NULL);
        !           152:         g_assert(qobject_type(obj) == QTYPE_QSTRING);
        !           153:         
        !           154:         str = qobject_to_qstring(obj);
        !           155:         g_assert(strcmp(qstring_get_str(str), test_cases[i].decoded) == 0);
        !           156: 
        !           157:         QDECREF(str);
        !           158:     }
        !           159: }
        !           160: 
        !           161: static void simple_number(void)
        !           162: {
        !           163:     int i;
        !           164:     struct {
        !           165:         const char *encoded;
        !           166:         int64_t decoded;
        !           167:         int skip;
        !           168:     } test_cases[] = {
        !           169:         { "0", 0 },
        !           170:         { "1234", 1234 },
        !           171:         { "1", 1 },
        !           172:         { "-32", -32 },
        !           173:         { "-0", 0, .skip = 1 },
        !           174:         { },
        !           175:     };
        !           176: 
        !           177:     for (i = 0; test_cases[i].encoded; i++) {
        !           178:         QObject *obj;
        !           179:         QInt *qint;
        !           180: 
        !           181:         obj = qobject_from_json(test_cases[i].encoded);
        !           182:         g_assert(obj != NULL);
        !           183:         g_assert(qobject_type(obj) == QTYPE_QINT);
        !           184: 
        !           185:         qint = qobject_to_qint(obj);
        !           186:         g_assert(qint_get_int(qint) == test_cases[i].decoded);
        !           187:         if (test_cases[i].skip == 0) {
        !           188:             QString *str;
        !           189: 
        !           190:             str = qobject_to_json(obj);
        !           191:             g_assert(strcmp(qstring_get_str(str), test_cases[i].encoded) == 0);
        !           192:             QDECREF(str);
        !           193:         }
        !           194: 
        !           195:         QDECREF(qint);
        !           196:     }
        !           197: }
        !           198: 
        !           199: static void float_number(void)
        !           200: {
        !           201:     int i;
        !           202:     struct {
        !           203:         const char *encoded;
        !           204:         double decoded;
        !           205:         int skip;
        !           206:     } test_cases[] = {
        !           207:         { "32.43", 32.43 },
        !           208:         { "0.222", 0.222 },
        !           209:         { "-32.12313", -32.12313 },
        !           210:         { "-32.20e-10", -32.20e-10, .skip = 1 },
        !           211:         { },
        !           212:     };
        !           213: 
        !           214:     for (i = 0; test_cases[i].encoded; i++) {
        !           215:         QObject *obj;
        !           216:         QFloat *qfloat;
        !           217: 
        !           218:         obj = qobject_from_json(test_cases[i].encoded);
        !           219:         g_assert(obj != NULL);
        !           220:         g_assert(qobject_type(obj) == QTYPE_QFLOAT);
        !           221: 
        !           222:         qfloat = qobject_to_qfloat(obj);
        !           223:         g_assert(qfloat_get_double(qfloat) == test_cases[i].decoded);
        !           224: 
        !           225:         if (test_cases[i].skip == 0) {
        !           226:             QString *str;
        !           227: 
        !           228:             str = qobject_to_json(obj);
        !           229:             g_assert(strcmp(qstring_get_str(str), test_cases[i].encoded) == 0);
        !           230:             QDECREF(str);
        !           231:         }
        !           232: 
        !           233:         QDECREF(qfloat);
        !           234:     }
        !           235: }
        !           236: 
        !           237: static void vararg_number(void)
        !           238: {
        !           239:     QObject *obj;
        !           240:     QInt *qint;
        !           241:     QFloat *qfloat;
        !           242:     int value = 0x2342;
        !           243:     int64_t value64 = 0x2342342343LL;
        !           244:     double valuef = 2.323423423;
        !           245: 
        !           246:     obj = qobject_from_jsonf("%d", value);
        !           247:     g_assert(obj != NULL);
        !           248:     g_assert(qobject_type(obj) == QTYPE_QINT);
        !           249: 
        !           250:     qint = qobject_to_qint(obj);
        !           251:     g_assert(qint_get_int(qint) == value);
        !           252: 
        !           253:     QDECREF(qint);
        !           254: 
        !           255:     obj = qobject_from_jsonf("%" PRId64, value64);
        !           256:     g_assert(obj != NULL);
        !           257:     g_assert(qobject_type(obj) == QTYPE_QINT);
        !           258: 
        !           259:     qint = qobject_to_qint(obj);
        !           260:     g_assert(qint_get_int(qint) == value64);
        !           261: 
        !           262:     QDECREF(qint);
        !           263: 
        !           264:     obj = qobject_from_jsonf("%f", valuef);
        !           265:     g_assert(obj != NULL);
        !           266:     g_assert(qobject_type(obj) == QTYPE_QFLOAT);
        !           267: 
        !           268:     qfloat = qobject_to_qfloat(obj);
        !           269:     g_assert(qfloat_get_double(qfloat) == valuef);
        !           270: 
        !           271:     QDECREF(qfloat);
        !           272: }
        !           273: 
        !           274: static void keyword_literal(void)
        !           275: {
        !           276:     QObject *obj;
        !           277:     QBool *qbool;
        !           278:     QString *str;
        !           279: 
        !           280:     obj = qobject_from_json("true");
        !           281:     g_assert(obj != NULL);
        !           282:     g_assert(qobject_type(obj) == QTYPE_QBOOL);
        !           283: 
        !           284:     qbool = qobject_to_qbool(obj);
        !           285:     g_assert(qbool_get_int(qbool) != 0);
        !           286: 
        !           287:     str = qobject_to_json(obj);
        !           288:     g_assert(strcmp(qstring_get_str(str), "true") == 0);
        !           289:     QDECREF(str);
        !           290: 
        !           291:     QDECREF(qbool);
        !           292: 
        !           293:     obj = qobject_from_json("false");
        !           294:     g_assert(obj != NULL);
        !           295:     g_assert(qobject_type(obj) == QTYPE_QBOOL);
        !           296: 
        !           297:     qbool = qobject_to_qbool(obj);
        !           298:     g_assert(qbool_get_int(qbool) == 0);
        !           299: 
        !           300:     str = qobject_to_json(obj);
        !           301:     g_assert(strcmp(qstring_get_str(str), "false") == 0);
        !           302:     QDECREF(str);
        !           303: 
        !           304:     QDECREF(qbool);
        !           305: 
        !           306:     obj = qobject_from_jsonf("%i", false);
        !           307:     g_assert(obj != NULL);
        !           308:     g_assert(qobject_type(obj) == QTYPE_QBOOL);
        !           309: 
        !           310:     qbool = qobject_to_qbool(obj);
        !           311:     g_assert(qbool_get_int(qbool) == 0);
        !           312: 
        !           313:     QDECREF(qbool);
        !           314:     
        !           315:     obj = qobject_from_jsonf("%i", true);
        !           316:     g_assert(obj != NULL);
        !           317:     g_assert(qobject_type(obj) == QTYPE_QBOOL);
        !           318: 
        !           319:     qbool = qobject_to_qbool(obj);
        !           320:     g_assert(qbool_get_int(qbool) != 0);
        !           321: 
        !           322:     QDECREF(qbool);
        !           323: }
        !           324: 
        !           325: typedef struct LiteralQDictEntry LiteralQDictEntry;
        !           326: typedef struct LiteralQObject LiteralQObject;
        !           327: 
        !           328: struct LiteralQObject
        !           329: {
        !           330:     int type;
        !           331:     union {
        !           332:         int64_t qint;
        !           333:         const char *qstr;
        !           334:         LiteralQDictEntry *qdict;
        !           335:         LiteralQObject *qlist;
        !           336:     } value;
        !           337: };
        !           338: 
        !           339: struct LiteralQDictEntry
        !           340: {
        !           341:     const char *key;
        !           342:     LiteralQObject value;
        !           343: };
        !           344: 
        !           345: #define QLIT_QINT(val) (LiteralQObject){.type = QTYPE_QINT, .value.qint = (val)}
        !           346: #define QLIT_QSTR(val) (LiteralQObject){.type = QTYPE_QSTRING, .value.qstr = (val)}
        !           347: #define QLIT_QDICT(val) (LiteralQObject){.type = QTYPE_QDICT, .value.qdict = (val)}
        !           348: #define QLIT_QLIST(val) (LiteralQObject){.type = QTYPE_QLIST, .value.qlist = (val)}
        !           349: 
        !           350: typedef struct QListCompareHelper
        !           351: {
        !           352:     int index;
        !           353:     LiteralQObject *objs;
        !           354:     int result;
        !           355: } QListCompareHelper;
        !           356: 
        !           357: static int compare_litqobj_to_qobj(LiteralQObject *lhs, QObject *rhs);
        !           358: 
        !           359: static void compare_helper(QObject *obj, void *opaque)
        !           360: {
        !           361:     QListCompareHelper *helper = opaque;
        !           362: 
        !           363:     if (helper->result == 0) {
        !           364:         return;
        !           365:     }
        !           366: 
        !           367:     if (helper->objs[helper->index].type == QTYPE_NONE) {
        !           368:         helper->result = 0;
        !           369:         return;
        !           370:     }
        !           371: 
        !           372:     helper->result = compare_litqobj_to_qobj(&helper->objs[helper->index++], obj);
        !           373: }
        !           374: 
        !           375: static int compare_litqobj_to_qobj(LiteralQObject *lhs, QObject *rhs)
        !           376: {
        !           377:     if (lhs->type != qobject_type(rhs)) {
        !           378:         return 0;
        !           379:     }
        !           380: 
        !           381:     switch (lhs->type) {
        !           382:     case QTYPE_QINT:
        !           383:         return lhs->value.qint == qint_get_int(qobject_to_qint(rhs));
        !           384:     case QTYPE_QSTRING:
        !           385:         return (strcmp(lhs->value.qstr, qstring_get_str(qobject_to_qstring(rhs))) == 0);
        !           386:     case QTYPE_QDICT: {
        !           387:         int i;
        !           388: 
        !           389:         for (i = 0; lhs->value.qdict[i].key; i++) {
        !           390:             QObject *obj = qdict_get(qobject_to_qdict(rhs), lhs->value.qdict[i].key);
        !           391: 
        !           392:             if (!compare_litqobj_to_qobj(&lhs->value.qdict[i].value, obj)) {
        !           393:                 return 0;
        !           394:             }
        !           395:         }
        !           396: 
        !           397:         return 1;
        !           398:     }
        !           399:     case QTYPE_QLIST: {
        !           400:         QListCompareHelper helper;
        !           401: 
        !           402:         helper.index = 0;
        !           403:         helper.objs = lhs->value.qlist;
        !           404:         helper.result = 1;
        !           405:         
        !           406:         qlist_iter(qobject_to_qlist(rhs), compare_helper, &helper);
        !           407: 
        !           408:         return helper.result;
        !           409:     }
        !           410:     default:
        !           411:         break;
        !           412:     }
        !           413: 
        !           414:     return 0;
        !           415: }
        !           416: 
        !           417: static void simple_dict(void)
        !           418: {
        !           419:     int i;
        !           420:     struct {
        !           421:         const char *encoded;
        !           422:         LiteralQObject decoded;
        !           423:     } test_cases[] = {
        !           424:         {
        !           425:             .encoded = "{\"foo\": 42, \"bar\": \"hello world\"}",
        !           426:             .decoded = QLIT_QDICT(((LiteralQDictEntry[]){
        !           427:                         { "foo", QLIT_QINT(42) },
        !           428:                         { "bar", QLIT_QSTR("hello world") },
        !           429:                         { }
        !           430:                     })),
        !           431:         }, {
        !           432:             .encoded = "{}",
        !           433:             .decoded = QLIT_QDICT(((LiteralQDictEntry[]){
        !           434:                         { }
        !           435:                     })),
        !           436:         }, {
        !           437:             .encoded = "{\"foo\": 43}",
        !           438:             .decoded = QLIT_QDICT(((LiteralQDictEntry[]){
        !           439:                         { "foo", QLIT_QINT(43) },
        !           440:                         { }
        !           441:                     })),
        !           442:         },
        !           443:         { }
        !           444:     };
        !           445: 
        !           446:     for (i = 0; test_cases[i].encoded; i++) {
        !           447:         QObject *obj;
        !           448:         QString *str;
        !           449: 
        !           450:         obj = qobject_from_json(test_cases[i].encoded);
        !           451:         g_assert(obj != NULL);
        !           452:         g_assert(qobject_type(obj) == QTYPE_QDICT);
        !           453: 
        !           454:         g_assert(compare_litqobj_to_qobj(&test_cases[i].decoded, obj) == 1);
        !           455: 
        !           456:         str = qobject_to_json(obj);
        !           457:         qobject_decref(obj);
        !           458: 
        !           459:         obj = qobject_from_json(qstring_get_str(str));
        !           460:         g_assert(obj != NULL);
        !           461:         g_assert(qobject_type(obj) == QTYPE_QDICT);
        !           462: 
        !           463:         g_assert(compare_litqobj_to_qobj(&test_cases[i].decoded, obj) == 1);
        !           464:         qobject_decref(obj);
        !           465:         QDECREF(str);
        !           466:     }
        !           467: }
        !           468: 
        !           469: static void simple_list(void)
        !           470: {
        !           471:     int i;
        !           472:     struct {
        !           473:         const char *encoded;
        !           474:         LiteralQObject decoded;
        !           475:     } test_cases[] = {
        !           476:         {
        !           477:             .encoded = "[43,42]",
        !           478:             .decoded = QLIT_QLIST(((LiteralQObject[]){
        !           479:                         QLIT_QINT(43),
        !           480:                         QLIT_QINT(42),
        !           481:                         { }
        !           482:                     })),
        !           483:         },
        !           484:         {
        !           485:             .encoded = "[43]",
        !           486:             .decoded = QLIT_QLIST(((LiteralQObject[]){
        !           487:                         QLIT_QINT(43),
        !           488:                         { }
        !           489:                     })),
        !           490:         },
        !           491:         {
        !           492:             .encoded = "[]",
        !           493:             .decoded = QLIT_QLIST(((LiteralQObject[]){
        !           494:                         { }
        !           495:                     })),
        !           496:         },
        !           497:         {
        !           498:             .encoded = "[{}]",
        !           499:             .decoded = QLIT_QLIST(((LiteralQObject[]){
        !           500:                         QLIT_QDICT(((LiteralQDictEntry[]){
        !           501:                                     {},
        !           502:                                         })),
        !           503:                         {},
        !           504:                             })),
        !           505:         },
        !           506:         { }
        !           507:     };
        !           508: 
        !           509:     for (i = 0; test_cases[i].encoded; i++) {
        !           510:         QObject *obj;
        !           511:         QString *str;
        !           512: 
        !           513:         obj = qobject_from_json(test_cases[i].encoded);
        !           514:         g_assert(obj != NULL);
        !           515:         g_assert(qobject_type(obj) == QTYPE_QLIST);
        !           516: 
        !           517:         g_assert(compare_litqobj_to_qobj(&test_cases[i].decoded, obj) == 1);
        !           518: 
        !           519:         str = qobject_to_json(obj);
        !           520:         qobject_decref(obj);
        !           521: 
        !           522:         obj = qobject_from_json(qstring_get_str(str));
        !           523:         g_assert(obj != NULL);
        !           524:         g_assert(qobject_type(obj) == QTYPE_QLIST);
        !           525: 
        !           526:         g_assert(compare_litqobj_to_qobj(&test_cases[i].decoded, obj) == 1);
        !           527:         qobject_decref(obj);
        !           528:         QDECREF(str);
        !           529:     }
        !           530: }
        !           531: 
        !           532: static void simple_whitespace(void)
        !           533: {
        !           534:     int i;
        !           535:     struct {
        !           536:         const char *encoded;
        !           537:         LiteralQObject decoded;
        !           538:     } test_cases[] = {
        !           539:         {
        !           540:             .encoded = " [ 43 , 42 ]",
        !           541:             .decoded = QLIT_QLIST(((LiteralQObject[]){
        !           542:                         QLIT_QINT(43),
        !           543:                         QLIT_QINT(42),
        !           544:                         { }
        !           545:                     })),
        !           546:         },
        !           547:         {
        !           548:             .encoded = " [ 43 , { 'h' : 'b' }, [ ], 42 ]",
        !           549:             .decoded = QLIT_QLIST(((LiteralQObject[]){
        !           550:                         QLIT_QINT(43),
        !           551:                         QLIT_QDICT(((LiteralQDictEntry[]){
        !           552:                                     { "h", QLIT_QSTR("b") },
        !           553:                                     { }})),
        !           554:                         QLIT_QLIST(((LiteralQObject[]){
        !           555:                                     { }})),
        !           556:                         QLIT_QINT(42),
        !           557:                         { }
        !           558:                     })),
        !           559:         },
        !           560:         {
        !           561:             .encoded = " [ 43 , { 'h' : 'b' , 'a' : 32 }, [ ], 42 ]",
        !           562:             .decoded = QLIT_QLIST(((LiteralQObject[]){
        !           563:                         QLIT_QINT(43),
        !           564:                         QLIT_QDICT(((LiteralQDictEntry[]){
        !           565:                                     { "h", QLIT_QSTR("b") },
        !           566:                                     { "a", QLIT_QINT(32) },
        !           567:                                     { }})),
        !           568:                         QLIT_QLIST(((LiteralQObject[]){
        !           569:                                     { }})),
        !           570:                         QLIT_QINT(42),
        !           571:                         { }
        !           572:                     })),
        !           573:         },
        !           574:         { }
        !           575:     };
        !           576: 
        !           577:     for (i = 0; test_cases[i].encoded; i++) {
        !           578:         QObject *obj;
        !           579:         QString *str;
        !           580: 
        !           581:         obj = qobject_from_json(test_cases[i].encoded);
        !           582:         g_assert(obj != NULL);
        !           583:         g_assert(qobject_type(obj) == QTYPE_QLIST);
        !           584: 
        !           585:         g_assert(compare_litqobj_to_qobj(&test_cases[i].decoded, obj) == 1);
        !           586: 
        !           587:         str = qobject_to_json(obj);
        !           588:         qobject_decref(obj);
        !           589: 
        !           590:         obj = qobject_from_json(qstring_get_str(str));
        !           591:         g_assert(obj != NULL);
        !           592:         g_assert(qobject_type(obj) == QTYPE_QLIST);
        !           593: 
        !           594:         g_assert(compare_litqobj_to_qobj(&test_cases[i].decoded, obj) == 1);
        !           595: 
        !           596:         qobject_decref(obj);
        !           597:         QDECREF(str);
        !           598:     }
        !           599: }
        !           600: 
        !           601: static void simple_varargs(void)
        !           602: {
        !           603:     QObject *embedded_obj;
        !           604:     QObject *obj;
        !           605:     LiteralQObject decoded = QLIT_QLIST(((LiteralQObject[]){
        !           606:             QLIT_QINT(1),
        !           607:             QLIT_QINT(2),
        !           608:             QLIT_QLIST(((LiteralQObject[]){
        !           609:                         QLIT_QINT(32),
        !           610:                         QLIT_QINT(42),
        !           611:                         {}})),
        !           612:             {}}));
        !           613: 
        !           614:     embedded_obj = qobject_from_json("[32, 42]");
        !           615:     g_assert(embedded_obj != NULL);
        !           616: 
        !           617:     obj = qobject_from_jsonf("[%d, 2, %p]", 1, embedded_obj);
        !           618:     g_assert(obj != NULL);
        !           619: 
        !           620:     g_assert(compare_litqobj_to_qobj(&decoded, obj) == 1);
        !           621: 
        !           622:     qobject_decref(obj);
        !           623: }
        !           624: 
        !           625: static void empty_input(void)
        !           626: {
        !           627:     const char *empty = "";
        !           628: 
        !           629:     QObject *obj = qobject_from_json(empty);
        !           630:     g_assert(obj == NULL);
        !           631: }
        !           632: 
        !           633: static void unterminated_string(void)
        !           634: {
        !           635:     QObject *obj = qobject_from_json("\"abc");
        !           636:     g_assert(obj == NULL);
        !           637: }
        !           638: 
        !           639: static void unterminated_sq_string(void)
        !           640: {
        !           641:     QObject *obj = qobject_from_json("'abc");
        !           642:     g_assert(obj == NULL);
        !           643: }
        !           644: 
        !           645: static void unterminated_escape(void)
        !           646: {
        !           647:     QObject *obj = qobject_from_json("\"abc\\\"");
        !           648:     g_assert(obj == NULL);
        !           649: }
        !           650: 
        !           651: static void unterminated_array(void)
        !           652: {
        !           653:     QObject *obj = qobject_from_json("[32");
        !           654:     g_assert(obj == NULL);
        !           655: }
        !           656: 
        !           657: static void unterminated_array_comma(void)
        !           658: {
        !           659:     QObject *obj = qobject_from_json("[32,");
        !           660:     g_assert(obj == NULL);
        !           661: }
        !           662: 
        !           663: static void invalid_array_comma(void)
        !           664: {
        !           665:     QObject *obj = qobject_from_json("[32,}");
        !           666:     g_assert(obj == NULL);
        !           667: }
        !           668: 
        !           669: static void unterminated_dict(void)
        !           670: {
        !           671:     QObject *obj = qobject_from_json("{'abc':32");
        !           672:     g_assert(obj == NULL);
        !           673: }
        !           674: 
        !           675: static void unterminated_dict_comma(void)
        !           676: {
        !           677:     QObject *obj = qobject_from_json("{'abc':32,");
        !           678:     g_assert(obj == NULL);
        !           679: }
        !           680: 
        !           681: static void invalid_dict_comma(void)
        !           682: {
        !           683:     QObject *obj = qobject_from_json("{'abc':32,}");
        !           684:     g_assert(obj == NULL);
        !           685: }
        !           686: 
        !           687: static void unterminated_literal(void)
        !           688: {
        !           689:     QObject *obj = qobject_from_json("nul");
        !           690:     g_assert(obj == NULL);
        !           691: }
        !           692: 
        !           693: int main(int argc, char **argv)
        !           694: {
        !           695:     g_test_init(&argc, &argv, NULL);
        !           696: 
        !           697:     g_test_add_func("/literals/string/simple", simple_string);
        !           698:     g_test_add_func("/literals/string/escaped", escaped_string);
        !           699:     g_test_add_func("/literals/string/single_quote", single_quote_string);
        !           700:     g_test_add_func("/literals/string/vararg", vararg_string);
        !           701: 
        !           702:     g_test_add_func("/literals/number/simple", simple_number);
        !           703:     g_test_add_func("/literals/number/float", float_number);
        !           704:     g_test_add_func("/literals/number/vararg", vararg_number);
        !           705: 
        !           706:     g_test_add_func("/literals/keyword", keyword_literal);
        !           707: 
        !           708:     g_test_add_func("/dicts/simple_dict", simple_dict);
        !           709:     g_test_add_func("/lists/simple_list", simple_list);
        !           710: 
        !           711:     g_test_add_func("/whitespace/simple_whitespace", simple_whitespace);
        !           712: 
        !           713:     g_test_add_func("/varargs/simple_varargs", simple_varargs);
        !           714: 
        !           715:     g_test_add_func("/errors/empty_input", empty_input);
        !           716:     g_test_add_func("/errors/unterminated/string", unterminated_string);
        !           717:     g_test_add_func("/errors/unterminated/escape", unterminated_escape);
        !           718:     g_test_add_func("/errors/unterminated/sq_string", unterminated_sq_string);
        !           719:     g_test_add_func("/errors/unterminated/array", unterminated_array);
        !           720:     g_test_add_func("/errors/unterminated/array_comma", unterminated_array_comma);
        !           721:     g_test_add_func("/errors/unterminated/dict", unterminated_dict);
        !           722:     g_test_add_func("/errors/unterminated/dict_comma", unterminated_dict_comma);
        !           723:     g_test_add_func("/errors/invalid_array_comma", invalid_array_comma);
        !           724:     g_test_add_func("/errors/invalid_dict_comma", invalid_dict_comma);
        !           725:     g_test_add_func("/errors/unterminated/literal", unterminated_literal);
        !           726: 
        !           727:     return g_test_run();
        !           728: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.