xref: /aosp_15_r20/external/jsmn/test/testutil.h (revision 420d848fb01a502d3186bd0f49f4e0beb321f5cd)
1*420d848fSAndroid Build Coastguard Worker #ifndef __TEST_UTIL_H__
2*420d848fSAndroid Build Coastguard Worker #define __TEST_UTIL_H__
3*420d848fSAndroid Build Coastguard Worker 
4*420d848fSAndroid Build Coastguard Worker #include "../jsmn.h"
5*420d848fSAndroid Build Coastguard Worker 
vtokeq(const char * s,jsmntok_t * t,unsigned long numtok,va_list ap)6*420d848fSAndroid Build Coastguard Worker static int vtokeq(const char *s, jsmntok_t *t, unsigned long numtok,
7*420d848fSAndroid Build Coastguard Worker                   va_list ap) {
8*420d848fSAndroid Build Coastguard Worker   if (numtok > 0) {
9*420d848fSAndroid Build Coastguard Worker     unsigned long i;
10*420d848fSAndroid Build Coastguard Worker     int start, end, size;
11*420d848fSAndroid Build Coastguard Worker     int type;
12*420d848fSAndroid Build Coastguard Worker     char *value;
13*420d848fSAndroid Build Coastguard Worker 
14*420d848fSAndroid Build Coastguard Worker     size = -1;
15*420d848fSAndroid Build Coastguard Worker     value = NULL;
16*420d848fSAndroid Build Coastguard Worker     for (i = 0; i < numtok; i++) {
17*420d848fSAndroid Build Coastguard Worker       type = va_arg(ap, int);
18*420d848fSAndroid Build Coastguard Worker       if (type == JSMN_STRING) {
19*420d848fSAndroid Build Coastguard Worker         value = va_arg(ap, char *);
20*420d848fSAndroid Build Coastguard Worker         size = va_arg(ap, int);
21*420d848fSAndroid Build Coastguard Worker         start = end = -1;
22*420d848fSAndroid Build Coastguard Worker       } else if (type == JSMN_PRIMITIVE) {
23*420d848fSAndroid Build Coastguard Worker         value = va_arg(ap, char *);
24*420d848fSAndroid Build Coastguard Worker         start = end = size = -1;
25*420d848fSAndroid Build Coastguard Worker       } else {
26*420d848fSAndroid Build Coastguard Worker         start = va_arg(ap, int);
27*420d848fSAndroid Build Coastguard Worker         end = va_arg(ap, int);
28*420d848fSAndroid Build Coastguard Worker         size = va_arg(ap, int);
29*420d848fSAndroid Build Coastguard Worker         value = NULL;
30*420d848fSAndroid Build Coastguard Worker       }
31*420d848fSAndroid Build Coastguard Worker       if (t[i].type != type) {
32*420d848fSAndroid Build Coastguard Worker         printf("token %lu type is %d, not %d\n", i, t[i].type, type);
33*420d848fSAndroid Build Coastguard Worker         return 0;
34*420d848fSAndroid Build Coastguard Worker       }
35*420d848fSAndroid Build Coastguard Worker       if (start != -1 && end != -1) {
36*420d848fSAndroid Build Coastguard Worker         if (t[i].start != start) {
37*420d848fSAndroid Build Coastguard Worker           printf("token %lu start is %d, not %d\n", i, t[i].start, start);
38*420d848fSAndroid Build Coastguard Worker           return 0;
39*420d848fSAndroid Build Coastguard Worker         }
40*420d848fSAndroid Build Coastguard Worker         if (t[i].end != end) {
41*420d848fSAndroid Build Coastguard Worker           printf("token %lu end is %d, not %d\n", i, t[i].end, end);
42*420d848fSAndroid Build Coastguard Worker           return 0;
43*420d848fSAndroid Build Coastguard Worker         }
44*420d848fSAndroid Build Coastguard Worker       }
45*420d848fSAndroid Build Coastguard Worker       if (size != -1 && t[i].size != size) {
46*420d848fSAndroid Build Coastguard Worker         printf("token %lu size is %d, not %d\n", i, t[i].size, size);
47*420d848fSAndroid Build Coastguard Worker         return 0;
48*420d848fSAndroid Build Coastguard Worker       }
49*420d848fSAndroid Build Coastguard Worker 
50*420d848fSAndroid Build Coastguard Worker       if (s != NULL && value != NULL) {
51*420d848fSAndroid Build Coastguard Worker         const char *p = s + t[i].start;
52*420d848fSAndroid Build Coastguard Worker         if (strlen(value) != (unsigned long)(t[i].end - t[i].start) ||
53*420d848fSAndroid Build Coastguard Worker             strncmp(p, value, t[i].end - t[i].start) != 0) {
54*420d848fSAndroid Build Coastguard Worker           printf("token %lu value is %.*s, not %s\n", i, t[i].end - t[i].start,
55*420d848fSAndroid Build Coastguard Worker                  s + t[i].start, value);
56*420d848fSAndroid Build Coastguard Worker           return 0;
57*420d848fSAndroid Build Coastguard Worker         }
58*420d848fSAndroid Build Coastguard Worker       }
59*420d848fSAndroid Build Coastguard Worker     }
60*420d848fSAndroid Build Coastguard Worker   }
61*420d848fSAndroid Build Coastguard Worker   return 1;
62*420d848fSAndroid Build Coastguard Worker }
63*420d848fSAndroid Build Coastguard Worker 
tokeq(const char * s,jsmntok_t * tokens,int numtok,...)64*420d848fSAndroid Build Coastguard Worker static int tokeq(const char *s, jsmntok_t *tokens, int numtok, ...) {
65*420d848fSAndroid Build Coastguard Worker   int ok;
66*420d848fSAndroid Build Coastguard Worker   va_list args;
67*420d848fSAndroid Build Coastguard Worker   va_start(args, numtok);
68*420d848fSAndroid Build Coastguard Worker   ok = vtokeq(s, tokens, numtok, args);
69*420d848fSAndroid Build Coastguard Worker   va_end(args);
70*420d848fSAndroid Build Coastguard Worker   return ok;
71*420d848fSAndroid Build Coastguard Worker }
72*420d848fSAndroid Build Coastguard Worker 
parse(const char * s,int status,int numtok,...)73*420d848fSAndroid Build Coastguard Worker static int parse(const char *s, int status, int numtok, ...) {
74*420d848fSAndroid Build Coastguard Worker   int r;
75*420d848fSAndroid Build Coastguard Worker   int ok = 1;
76*420d848fSAndroid Build Coastguard Worker   va_list args;
77*420d848fSAndroid Build Coastguard Worker   jsmn_parser p;
78*420d848fSAndroid Build Coastguard Worker   jsmntok_t *t = malloc(numtok * sizeof(jsmntok_t));
79*420d848fSAndroid Build Coastguard Worker 
80*420d848fSAndroid Build Coastguard Worker   jsmn_init(&p);
81*420d848fSAndroid Build Coastguard Worker   r = jsmn_parse(&p, s, strlen(s), t, numtok);
82*420d848fSAndroid Build Coastguard Worker   if (r != status) {
83*420d848fSAndroid Build Coastguard Worker     printf("status is %d, not %d\n", r, status);
84*420d848fSAndroid Build Coastguard Worker     return 0;
85*420d848fSAndroid Build Coastguard Worker   }
86*420d848fSAndroid Build Coastguard Worker 
87*420d848fSAndroid Build Coastguard Worker   if (status >= 0) {
88*420d848fSAndroid Build Coastguard Worker     va_start(args, numtok);
89*420d848fSAndroid Build Coastguard Worker     ok = vtokeq(s, t, numtok, args);
90*420d848fSAndroid Build Coastguard Worker     va_end(args);
91*420d848fSAndroid Build Coastguard Worker   }
92*420d848fSAndroid Build Coastguard Worker   free(t);
93*420d848fSAndroid Build Coastguard Worker   return ok;
94*420d848fSAndroid Build Coastguard Worker }
95*420d848fSAndroid Build Coastguard Worker 
96*420d848fSAndroid Build Coastguard Worker #endif /* __TEST_UTIL_H__ */
97