|
Packit |
1422b7 |
#include "config.h"
|
|
Packit |
1422b7 |
#include <stdio.h>
|
|
Packit |
1422b7 |
#include <stdlib.h>
|
|
Packit |
1422b7 |
#include <string.h>
|
|
Packit |
1422b7 |
#include <math.h>
|
|
Packit |
1422b7 |
#include <json.h>
|
|
Packit |
1422b7 |
#include "internal.h"
|
|
Packit |
1422b7 |
|
|
Packit |
1422b7 |
|
|
Packit |
1422b7 |
typedef struct json_object obj;
|
|
Packit |
1422b7 |
|
|
Packit |
1422b7 |
static int eq(obj* expected, obj* actual);
|
|
Packit |
1422b7 |
|
|
Packit |
1422b7 |
static int obj_eq(obj* expected, obj* actual) {
|
|
Packit |
1422b7 |
int eql = 1;
|
|
Packit |
1422b7 |
struct json_object_iterator it = json_object_iter_begin(expected);
|
|
Packit |
1422b7 |
struct json_object_iterator itEnd = json_object_iter_end(expected);
|
|
Packit |
1422b7 |
while (!json_object_iter_equal(&it, &itEnd)) {
|
|
Packit |
1422b7 |
obj *actual_val;
|
|
Packit |
1422b7 |
json_object_object_get_ex(actual, json_object_iter_peek_name(&it), &actual_val);
|
|
Packit |
1422b7 |
eql &= eq(json_object_iter_peek_value(&it), actual_val);
|
|
Packit |
1422b7 |
json_object_iter_next(&it);
|
|
Packit |
1422b7 |
}
|
|
Packit |
1422b7 |
return eql;
|
|
Packit |
1422b7 |
}
|
|
Packit |
1422b7 |
|
|
Packit |
1422b7 |
static int arr_eq(obj* expected, obj* actual) {
|
|
Packit |
1422b7 |
int eql = 1;
|
|
Packit |
1422b7 |
int expected_len = json_object_array_length(expected);
|
|
Packit |
1422b7 |
int actual_len = json_object_array_length(actual);
|
|
Packit |
1422b7 |
if (expected_len != actual_len) return 0;
|
|
Packit |
1422b7 |
for (int i = 0; i < expected_len; i++) {
|
|
Packit |
1422b7 |
obj* exp = json_object_array_get_idx(expected, i);
|
|
Packit |
1422b7 |
obj* act = json_object_array_get_idx(actual, i);
|
|
Packit |
1422b7 |
eql &= eq(exp, act);
|
|
Packit |
1422b7 |
}
|
|
Packit |
1422b7 |
return eql;
|
|
Packit |
1422b7 |
}
|
|
Packit |
1422b7 |
|
|
Packit |
1422b7 |
static int str_eq(obj* expected, obj* actual) {
|
|
Packit |
1422b7 |
const char* exp_str = json_object_to_json_string(expected);
|
|
Packit |
1422b7 |
const char* act_str = json_object_to_json_string(actual);
|
|
Packit |
1422b7 |
return strcmp(exp_str, act_str) == 0;
|
|
Packit |
1422b7 |
}
|
|
Packit |
1422b7 |
|
|
Packit |
1422b7 |
static int eq(obj* expected, obj* actual) {
|
|
Packit |
1422b7 |
if (expected == NULL && actual == NULL) {
|
|
Packit |
1422b7 |
return 1;
|
|
Packit |
1422b7 |
} else if (expected == NULL) {
|
|
Packit |
1422b7 |
return 0;
|
|
Packit |
1422b7 |
} else if (actual == NULL) {
|
|
Packit |
1422b7 |
return 0;
|
|
Packit |
1422b7 |
}
|
|
Packit |
1422b7 |
enum json_type expected_type = json_object_get_type(expected);
|
|
Packit |
1422b7 |
enum json_type actual_type = json_object_get_type(actual);
|
|
Packit |
1422b7 |
if (expected_type != actual_type) return 0;
|
|
Packit |
1422b7 |
switch(expected_type) {
|
|
Packit |
1422b7 |
case json_type_null:
|
|
Packit |
1422b7 |
return 1;
|
|
Packit |
1422b7 |
case json_type_boolean:
|
|
Packit |
1422b7 |
return json_object_get_boolean(expected) == json_object_get_boolean(actual);
|
|
Packit |
1422b7 |
case json_type_double:
|
|
Packit |
1422b7 |
return (fabs(json_object_get_double(expected) - json_object_get_double(actual)) < 0.001);
|
|
Packit |
1422b7 |
case json_type_int:
|
|
Packit |
1422b7 |
return json_object_get_int64(expected) == json_object_get_int64(actual);
|
|
Packit |
1422b7 |
case json_type_object:
|
|
Packit |
1422b7 |
return obj_eq(expected, actual);
|
|
Packit |
1422b7 |
case json_type_array:
|
|
Packit |
1422b7 |
return arr_eq(expected, actual);
|
|
Packit |
1422b7 |
case json_type_string:
|
|
Packit |
1422b7 |
return str_eq(expected, actual);
|
|
Packit |
1422b7 |
default:
|
|
Packit |
1422b7 |
fprintf(stderr, "unexpected type in %s:%d\n", __FILE__, __LINE__);
|
|
Packit |
1422b7 |
abort();
|
|
Packit |
1422b7 |
}
|
|
Packit |
1422b7 |
return 0;
|
|
Packit |
1422b7 |
}
|
|
Packit |
1422b7 |
|
|
Packit |
1422b7 |
int main(int argc, char** argv) {
|
|
Packit |
1422b7 |
if (argc != 3) {
|
|
Packit |
1422b7 |
fprintf(stderr, "expected and actual json not given, number of args was: %d\n", argc);
|
|
Packit |
1422b7 |
exit(100);
|
|
Packit |
1422b7 |
}
|
|
Packit |
1422b7 |
obj* expected = json_tokener_parse(argv[1]);
|
|
Packit |
1422b7 |
obj* actual = json_tokener_parse(argv[2]);
|
|
Packit |
1422b7 |
int result = eq(expected, actual) ? 0 : 1;
|
|
Packit |
1422b7 |
json_object_put(expected);
|
|
Packit |
1422b7 |
json_object_put(actual);
|
|
Packit |
1422b7 |
if (result != 0) {
|
|
Packit |
1422b7 |
printf("JSONs weren't equal. \n\tExpected: \n\t\t%s\n\tActual: \n\t\t%s\n", argv[1], argv[2]);
|
|
Packit |
1422b7 |
}
|
|
Packit |
1422b7 |
return result;
|
|
Packit |
1422b7 |
}
|