Blame tests/json_eq.c

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
}