more tests
This commit is contained in:
@@ -16,6 +16,21 @@ static const struct {
|
|||||||
TEST("\t\n true \t\n"),
|
TEST("\t\n true \t\n"),
|
||||||
TEST("false"),
|
TEST("false"),
|
||||||
TEST("\t\n false \t\n"),
|
TEST("\t\n false \t\n"),
|
||||||
|
|
||||||
|
TEST("1"),
|
||||||
|
TEST(" 1 "),
|
||||||
|
|
||||||
|
TEST("9999999999999999999999999999999999999999999"),
|
||||||
|
|
||||||
|
TEST("[]"),
|
||||||
|
TEST("[1, 2, 3]"),
|
||||||
|
TEST(" [ ] "),
|
||||||
|
TEST(" [ 1 , 2 , 3 ] "),
|
||||||
|
|
||||||
|
TEST("{}"),
|
||||||
|
TEST(" { } "),
|
||||||
|
|
||||||
|
TEST(" { \"key\" : 5 } "),
|
||||||
};
|
};
|
||||||
|
|
||||||
#undef TEST
|
#undef TEST
|
||||||
@@ -26,8 +41,14 @@ _Bool json_strings_match(const char *A, const char *B)
|
|||||||
|
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
while(isspace(A[Ai])) Ai += 1;
|
// TODO: Only ignore spaces if they're
|
||||||
while(isspace(B[Bi])) Bi += 1;
|
// not inside strings.
|
||||||
|
while(isspace(A[Ai]))
|
||||||
|
Ai += 1;
|
||||||
|
|
||||||
|
while(isspace(B[Bi]))
|
||||||
|
Bi += 1;
|
||||||
|
|
||||||
if(A[Ai] != B[Bi]) return 0;
|
if(A[Ai] != B[Bi]) return 0;
|
||||||
Ai += 1;
|
Ai += 1;
|
||||||
Bi += 1;
|
Bi += 1;
|
||||||
@@ -68,7 +89,10 @@ int main()
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
//fprintf(stderr, "Failed.\n");
|
fprintf(stderr, "Failed! Expected:\n");
|
||||||
|
fprintf(stderr, " %s\n", tests[i].src);
|
||||||
|
fprintf(stderr, "but got:\n");
|
||||||
|
fprintf(stderr, " %s\n", serialized);
|
||||||
}
|
}
|
||||||
|
|
||||||
free(serialized);
|
free(serialized);
|
||||||
|
|||||||
@@ -381,14 +381,18 @@ static xj_value *parseArray(context_t *ctx)
|
|||||||
if(child == NULL)
|
if(child == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
// Skip whitespace.
|
||||||
|
while(ctx->i < ctx->len && isspace(ctx->str[ctx->i]))
|
||||||
|
ctx->i += 1;
|
||||||
|
|
||||||
if(ctx->i == ctx->len)
|
if(ctx->i == ctx->len)
|
||||||
{
|
{
|
||||||
xj_report(ctx->error, "String ended inside an array, right after the %dth child", count+1);
|
xj_report(ctx->error, "String ended inside an array, right after the %dth child", count+1);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
(*tail)->next = child;
|
|
||||||
*tail = child;
|
*tail = child;
|
||||||
|
tail = &child->next;
|
||||||
count += 1;
|
count += 1;
|
||||||
|
|
||||||
if(ctx->str[ctx->i] == ']')
|
if(ctx->str[ctx->i] == ']')
|
||||||
@@ -481,10 +485,20 @@ static xj_value *parseObject(context_t *ctx)
|
|||||||
if(child == NULL)
|
if(child == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
// Skip whitespace.
|
||||||
|
while(ctx->i < ctx->len && isspace(ctx->str[ctx->i]))
|
||||||
|
ctx->i += 1;
|
||||||
|
|
||||||
|
if(ctx->i == ctx->len)
|
||||||
|
{
|
||||||
|
xj_report(ctx->error, "String ended inside an object, right after the %dth child", count+1);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
child->key = key;
|
child->key = key;
|
||||||
|
|
||||||
(*tail)->next = child;
|
|
||||||
*tail = child;
|
*tail = child;
|
||||||
|
tail = &child->next;
|
||||||
count += 1;
|
count += 1;
|
||||||
|
|
||||||
if(ctx->str[ctx->i] == '}')
|
if(ctx->str[ctx->i] == '}')
|
||||||
@@ -682,7 +696,7 @@ static _Bool encodeValue(xj_value *val, buffer_t *buff)
|
|||||||
assert(k >= 0 && k < (int) sizeof(temp));
|
assert(k >= 0 && k < (int) sizeof(temp));
|
||||||
if(!appendString(buff, temp, k))
|
if(!appendString(buff, temp, k))
|
||||||
return 0;
|
return 0;
|
||||||
break;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
case XJ_FLOAT:
|
case XJ_FLOAT:
|
||||||
@@ -693,7 +707,7 @@ static _Bool encodeValue(xj_value *val, buffer_t *buff)
|
|||||||
assert(k >= 0 && k < (int) sizeof(temp));
|
assert(k >= 0 && k < (int) sizeof(temp));
|
||||||
if(!appendString(buff, temp, k))
|
if(!appendString(buff, temp, k))
|
||||||
return 0;
|
return 0;
|
||||||
break;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
case XJ_ARRAY:
|
case XJ_ARRAY:
|
||||||
@@ -716,7 +730,7 @@ static _Bool encodeValue(xj_value *val, buffer_t *buff)
|
|||||||
|
|
||||||
if(!appendString(buff, "]", 1))
|
if(!appendString(buff, "]", 1))
|
||||||
return 0;
|
return 0;
|
||||||
break;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
case XJ_OBJECT:
|
case XJ_OBJECT:
|
||||||
@@ -727,7 +741,7 @@ static _Bool encodeValue(xj_value *val, buffer_t *buff)
|
|||||||
xj_value *child = val->as_object;
|
xj_value *child = val->as_object;
|
||||||
while(child != NULL)
|
while(child != NULL)
|
||||||
{
|
{
|
||||||
if(!encodeString(child->key, -1, buff))
|
if(!encodeString(child->key, strlen(child->key), buff))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if(!appendString(buff, ": ", 2))
|
if(!appendString(buff, ": ", 2))
|
||||||
@@ -745,7 +759,7 @@ static _Bool encodeValue(xj_value *val, buffer_t *buff)
|
|||||||
|
|
||||||
if(!appendString(buff, "}", 1))
|
if(!appendString(buff, "}", 1))
|
||||||
return 0;
|
return 0;
|
||||||
break;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
case XJ_STRING:
|
case XJ_STRING:
|
||||||
@@ -762,11 +776,11 @@ char *xj_encode(xj_value *value, int *len)
|
|||||||
buff.tail = &buff.head;
|
buff.tail = &buff.head;
|
||||||
buff.head.next = NULL;
|
buff.head.next = NULL;
|
||||||
|
|
||||||
_Bool failed = !encodeValue(value, &buff);
|
_Bool ok = encodeValue(value, &buff);
|
||||||
|
|
||||||
char *serialized = NULL;
|
char *serialized = NULL;
|
||||||
|
|
||||||
if(!failed)
|
if(ok)
|
||||||
{
|
{
|
||||||
/* Serialize */
|
/* Serialize */
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user