1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163
| #include <stdio.h> #include <stdlib.h> #include <string.h> #include "leptjson.h"
static int main_ret = 0; static int test_count = 0; static int test_pass = 0;
#define EXPECT_EQ_BASE(equality, expect, actual, format) \ do {\ test_count++;\ if (equality)\ test_pass++;\ else {\ fprintf(stderr, "%s:%d: expect: " format " actual: " format "\n", __FILE__, __LINE__, expect, actual);\ main_ret = 1;\ }\ } while(0)
#define EXPECT_EQ_INT(expect, actual) EXPECT_EQ_BASE((expect) == (actual), expect, actual, "%d") #define EXPECT_EQ_DOUBLE(expect, actual) EXPECT_EQ_BASE((expect) == (actual), expect, actual, "%.17g")
static void test_parse_null() { lept_value v; v.type = LEPT_FALSE; EXPECT_EQ_INT(LEPT_PARSE_OK, lept_parse(&v, "null")); EXPECT_EQ_INT(LEPT_NULL, lept_get_type(&v)); }
static void test_parse_true() { lept_value v; v.type = LEPT_FALSE; EXPECT_EQ_INT(LEPT_PARSE_OK, lept_parse(&v, "true")); EXPECT_EQ_INT(LEPT_TRUE, lept_get_type(&v)); }
static void test_parse_false() { lept_value v; v.type = LEPT_TRUE; EXPECT_EQ_INT(LEPT_PARSE_OK, lept_parse(&v, "false")); EXPECT_EQ_INT(LEPT_FALSE, lept_get_type(&v)); }
#define TEST_NUMBER(expect, json)\ do {\ lept_value v;\ EXPECT_EQ_INT(LEPT_PARSE_OK, lept_parse(&v, json));\ EXPECT_EQ_INT(LEPT_NUMBER, lept_get_type(&v));\ EXPECT_EQ_DOUBLE(expect, lept_get_number(&v));\ } while(0)
static void test_parse_number() { TEST_NUMBER(0.0, "0"); TEST_NUMBER(0.0, "-0"); TEST_NUMBER(0.0, "-0.0"); TEST_NUMBER(1.0, "1"); TEST_NUMBER(-1.0, "-1"); TEST_NUMBER(1.5, "1.5"); TEST_NUMBER(-1.5, "-1.5"); TEST_NUMBER(3.1416, "3.1416"); TEST_NUMBER(1E10, "1E10"); TEST_NUMBER(1e10, "1e10"); TEST_NUMBER(1E+10, "1E+10"); TEST_NUMBER(1E-10, "1E-10"); TEST_NUMBER(-1E10, "-1E10"); TEST_NUMBER(-1e10, "-1e10"); TEST_NUMBER(-1E+10, "-1E+10"); TEST_NUMBER(-1E-10, "-1E-10"); TEST_NUMBER(1.234E+10, "1.234E+10"); TEST_NUMBER(1.234E-10, "1.234E-10"); TEST_NUMBER(0.0, "1e-10000");
TEST_NUMBER(1.0000000000000002, "1.0000000000000002"); TEST_NUMBER( 4.9406564584124654e-324, "4.9406564584124654e-324"); TEST_NUMBER(-4.9406564584124654e-324, "-4.9406564584124654e-324"); TEST_NUMBER( 2.2250738585072009e-308, "2.2250738585072009e-308"); TEST_NUMBER(-2.2250738585072009e-308, "-2.2250738585072009e-308"); TEST_NUMBER( 2.2250738585072014e-308, "2.2250738585072014e-308"); TEST_NUMBER(-2.2250738585072014e-308, "-2.2250738585072014e-308"); TEST_NUMBER( 1.7976931348623157e+308, "1.7976931348623157e+308"); TEST_NUMBER(-1.7976931348623157e+308, "-1.7976931348623157e+308"); }
#define TEST_ERROR(error, json)\ do {\ lept_value v;\ v.type = LEPT_FALSE;\ EXPECT_EQ_INT(error, lept_parse(&v, json));\ EXPECT_EQ_INT(LEPT_NULL, lept_get_type(&v));\ } while(0)
static void test_parse_expect_value() { TEST_ERROR(LEPT_PARSE_EXPECT_VALUE, ""); TEST_ERROR(LEPT_PARSE_EXPECT_VALUE, " "); }
static void test_parse_invalid_value() { TEST_ERROR(LEPT_PARSE_INVALID_VALUE, "nul"); TEST_ERROR(LEPT_PARSE_INVALID_VALUE, "?");
#if 0 TEST_ERROR(LEPT_PARSE_INVALID_VALUE, "+0"); TEST_ERROR(LEPT_PARSE_INVALID_VALUE, "+1"); TEST_ERROR(LEPT_PARSE_INVALID_VALUE, ".123");
TEST_ERROR(LEPT_PARSE_INVALID_VALUE, "1.");
TEST_ERROR(LEPT_PARSE_INVALID_VALUE, "INF"); TEST_ERROR(LEPT_PARSE_INVALID_VALUE, "inf"); TEST_ERROR(LEPT_PARSE_INVALID_VALUE, "NAN"); TEST_ERROR(LEPT_PARSE_INVALID_VALUE, "nan"); #endif }
static void test_parse_root_not_singular() { TEST_ERROR(LEPT_PARSE_ROOT_NOT_SINGULAR, "null x");
#if 0 TEST_ERROR(LEPT_PARSE_ROOT_NOT_SINGULAR, "0123");
TEST_ERROR(LEPT_PARSE_ROOT_NOT_SINGULAR, "0x0"); TEST_ERROR(LEPT_PARSE_ROOT_NOT_SINGULAR, "0x123"); #endif }
static void test_parse_number_too_big() { #if 0 TEST_ERROR(LEPT_PARSE_NUMBER_TOO_BIG, "1e309"); TEST_ERROR(LEPT_PARSE_NUMBER_TOO_BIG, "-1e309"); #endif }
static void test_parse() { test_parse_null(); test_parse_true(); test_parse_false(); test_parse_number(); test_parse_expect_value(); test_parse_invalid_value(); test_parse_root_not_singular(); test_parse_number_too_big(); }
int main() { test_parse(); printf("%d/%d (%3.2f%%) passed\n", test_pass, test_count, test_pass * 100.0 / test_count); return main_ret; }
|