test.cpp文件

  1 #include"pch.h"
  2 
  3 /*#ifdef WIN32
  4 #define _CRTDBG_MAP_ALLOC
  5 #include <stdlib.h>
  6 #include <crtdbg.h>
  7 #endif*/
  8 
  9 #include <stdio.h>
 10 #include <stdlib.h>
 11 #include <string.h>
 12 #include "leptjson.h"
 13 static int main_ret = 0;
 14 static int test_count = 0;
 15 static int test_pass = 0;
 16 
 17 #define EXPECT_EQ_BASE(equality, expect, actual, format) \
 18     do {\
 19         test_count++;\
 20         if (equality)\
 21             test_pass++;\
 22         else {\
 23             fprintf(stderr, "%s:%d: expect: " format " actual: " format "\n", __FILE__, __LINE__, expect, actual);\
 24             main_ret = 1;\
 25         }\
 26     } while(0)
 27 
 28 //测试解析结果
 29 #define EXPECT_EQ_INT(expect, actual) EXPECT_EQ_BASE((expect) == (actual), expect, actual, "%d")
 30 
 31 //format为自动选择格式%e或者%f(选输出宽度小的)精度是保留17位以内
 32 #define EXPECT_EQ_DOUBLE(expect, actual) EXPECT_EQ_BASE((expect) == (actual), expect, actual, "%.17g")
 33 #define EXPECT_EQ_STRING(expect, actual, alength) \
 34     EXPECT_EQ_BASE(sizeof(expect) - 1 == alength && memcmp(expect, actual, alength) == 0, expect, actual, "%s")
 35 #define EXPECT_TRUE(actual) EXPECT_EQ_BASE((actual) != 0, "true", "false", "%s")
 36 #define EXPECT_FALSE(actual) EXPECT_EQ_BASE((actual) == 0, "false", "true", "%s")
 37 #define EXPECT_EQ_SIZE_T(expect, actual) EXPECT_EQ_BASE((expect) == (actual), (size_t)expect, (size_t)actual, "%zu")
 38 
 39 //null测试
 40 static void test_parse_null() {
 41     lept_value v;
 42     v.type = LEPT_FALSE;
 43     EXPECT_EQ_INT(LEPT_PARSE_OK, lept_parse(&v, "null"));
 44     EXPECT_EQ_INT(LEPT_NULL, lept_get_type(&v));
 45 }
 46 
 47 //false测试
 48 static void test_parse_false() {
 49     lept_value v;
 50     v.type = LEPT_TRUE;
 51     EXPECT_EQ_INT(LEPT_PARSE_OK, lept_parse(&v, "false"));
 52     EXPECT_EQ_INT(LEPT_FALSE, lept_get_type(&v));
 53 }
 54 
 55 //true测试
 56 static void test_parse_true() {
 57     lept_value v;
 58     v.type = LEPT_FALSE;
 59     EXPECT_EQ_INT(LEPT_PARSE_OK, lept_parse(&v, "true"));
 60     EXPECT_EQ_INT(LEPT_TRUE, lept_get_type(&v));
 61 }
 62 
 63 static void test_parse_array() {
 64     size_t i, j;
 65     lept_value v;
 66 
 67     lept_init(&v);
 68     EXPECT_EQ_INT(LEPT_PARSE_OK, lept_parse(&v, "[ ]"));
 69     EXPECT_EQ_INT(LEPT_ARRAY, lept_get_type(&v));
 70     EXPECT_EQ_SIZE_T(0, lept_get_array_size(&v));
 71     lept_free(&v);
 72 
 73     lept_init(&v);
 74     EXPECT_EQ_INT(LEPT_PARSE_OK, lept_parse(&v, "[ null , false , true , 123 , \"abc\" ]"));
 75     EXPECT_EQ_INT(LEPT_ARRAY, lept_get_type(&v));
 76     EXPECT_EQ_SIZE_T(5, lept_get_array_size(&v));
 77     EXPECT_EQ_INT(LEPT_NULL, lept_get_type(lept_get_array_element(&v, 0)));
 78     EXPECT_EQ_INT(LEPT_FALSE, lept_get_type(lept_get_array_element(&v, 1)));
 79     EXPECT_EQ_INT(LEPT_TRUE, lept_get_type(lept_get_array_element(&v, 2)));
 80     EXPECT_EQ_INT(LEPT_NUMBER, lept_get_type(lept_get_array_element(&v, 3)));
 81     EXPECT_EQ_INT(LEPT_STRING, lept_get_type(lept_get_array_element(&v, 4)));
 82     EXPECT_EQ_DOUBLE(123.0, lept_get_number(lept_get_array_element(&v, 3)));
 83     EXPECT_EQ_STRING("abc", lept_get_string(lept_get_array_element(&v, 4)), lept_get_string_length(lept_get_array_element(&v, 4)));
 84     lept_free(&v);
 85 
 86     lept_init(&v);
 87     EXPECT_EQ_INT(LEPT_PARSE_OK, lept_parse(&v, "[ [ ] , [ 0 ] , [ 0 , 1 ] , [ 0 , 1 , 2 ] ]"));
 88     EXPECT_EQ_INT(LEPT_ARRAY, lept_get_type(&v));
 89     EXPECT_EQ_SIZE_T(4, lept_get_array_size(&v));
 90     for (i = 0; i < 4; i++) {
 91         lept_value* a = lept_get_array_element(&v, i);
 92         EXPECT_EQ_INT(LEPT_ARRAY, lept_get_type(a));
 93         EXPECT_EQ_SIZE_T(i, lept_get_array_size(a));
 94         for (j = 0; j < i; j++) {
 95             lept_value* e = lept_get_array_element(a, j);
 96             EXPECT_EQ_INT(LEPT_NUMBER, lept_get_type(e));
 97             EXPECT_EQ_DOUBLE((double)j, lept_get_number(e));
 98         }
 99     }
100     lept_free(&v);
101 }
102 
103 //尝试用宏来重构上述三个测试代码,因为他们具有重复性
104 #define TEST_ERROR(error, json)\
105     do {\
106         lept_value v;\
107         v.type = LEPT_FALSE;\
108         EXPECT_EQ_INT(error, lept_parse(&v, json));\
109         EXPECT_EQ_INT(LEPT_NULL, lept_get_type(&v));\
110     } while(0)
111 
112 //测试number
113 #define TEST_NUMBER(expect, json)\
114     do {\
115         lept_value v;\
116         EXPECT_EQ_INT(LEPT_PARSE_OK, lept_parse(&v, json));\
117         EXPECT_EQ_INT(LEPT_NUMBER, lept_get_type(&v));\
118         EXPECT_EQ_DOUBLE(expect, lept_get_number(&v));\
119     } while(0)
120 
121 static void  test_parse_number() {
122     TEST_NUMBER(0.0, "0");
123     TEST_NUMBER(0.0, "-0");
124     TEST_NUMBER(0.0, "-0.0");
125     //TEST_ERROR(0.5E10, "0.5E10");整数部分如果是0开始,只能是单个0
126     TEST_NUMBER(1.0, "1");
127     TEST_NUMBER(-1.0, "-1");
128     TEST_NUMBER(1.5, "1.5");
129     TEST_NUMBER(-1.5, "-1.5");
130     TEST_NUMBER(3.1416, "3.1416");
131     TEST_NUMBER(1E10, "1E10");
132     TEST_NUMBER(1e10, "1e10");
133     TEST_NUMBER(1E+10, "1E+10");
134     TEST_NUMBER(1E-10, "1E-10");
135     TEST_NUMBER(-1E10, "-1E10");
136     TEST_NUMBER(-1e10, "-1e10");
137     TEST_NUMBER(-1E+10, "-1E+10");
138     TEST_NUMBER(-1E-10, "-1E-10");
139     TEST_NUMBER(1.234E+10, "1.234E+10");
140     TEST_NUMBER(1.234E-10, "1.234E-10");
141     TEST_NUMBER(0.0, "1e-10000"); /* must underflow */
142 
143     TEST_NUMBER(1.0000000000000002, "1.0000000000000002"); /* the smallest number > 1 */
144     TEST_NUMBER(4.9406564584124654e-324, "4.9406564584124654e-324"); /* minimum denormal */
145     TEST_NUMBER(-4.9406564584124654e-324, "-4.9406564584124654e-324");
146     TEST_NUMBER(2.2250738585072009e-308, "2.2250738585072009e-308");  /* Max subnormal double */
147     TEST_NUMBER(-2.2250738585072009e-308, "-2.2250738585072009e-308");
148     TEST_NUMBER(2.2250738585072014e-308, "2.2250738585072014e-308");  /* Min normal positive double */
149     TEST_NUMBER(-2.2250738585072014e-308, "-2.2250738585072014e-308");
150     TEST_NUMBER(1.7976931348623157e+308, "1.7976931348623157e+308");  /* Max double */
151     TEST_NUMBER(-1.7976931348623157e+308, "-1.7976931348623157e+308");
152 }
153 
154 #define TEST_STRING(expect, json)\
155     do {\
156         lept_value v;\
157         lept_init(&v);\
158         EXPECT_EQ_INT(LEPT_PARSE_OK, lept_parse(&v, json));\
159         EXPECT_EQ_INT(LEPT_STRING, lept_get_type(&v));\
160         EXPECT_EQ_STRING(expect, lept_get_string(&v), lept_get_string_length(&v));\
161         lept_free(&v);\
162     } while(0)
163 
164 
165 static void test_parse_string() {
166     TEST_STRING("", "\"\"");
167     TEST_STRING("Hello", "\"Hello\"");
168     TEST_STRING("Hello\nWorld", "\"Hello\\nWorld\"");
169     TEST_STRING("\" \\ / \b \f \n \r \t", "\"\\\" \\\\ \\/ \\b \\f \\n \\r \\t\"");
170     TEST_STRING("Hello\0World", "\"Hello\\u0000World\"");
171     TEST_STRING("\x24", "\"\\u0024\"");         /* Dollar sign U+0024 */
172     TEST_STRING("\xC2\xA2", "\"\\u00A2\"");     /* Cents sign U+00A2 */
173     TEST_STRING("\xE2\x82\xAC", "\"\\u20AC\""); /* Euro sign U+20AC */
174     TEST_STRING("\xF0\x9D\x84\x9E", "\"\\uD834\\uDD1E\"");  /* G clef sign U+1D11E */
175     TEST_STRING("\xF0\x9D\x84\x9E", "\"\\ud834\\udd1e\"");  /* G clef sign U+1D11E */
176 }
177 
178 static void test_parse_object() {
179     lept_value v;
180     size_t i;
181 
182     lept_init(&v);
183     EXPECT_EQ_INT(LEPT_PARSE_OK, lept_parse(&v, " { } "));
184     EXPECT_EQ_INT(LEPT_OBJECT, lept_get_type(&v));
185     EXPECT_EQ_SIZE_T(0, lept_get_object_size(&v));
186     lept_free(&v);
187 
188     lept_init(&v);
189     EXPECT_EQ_INT(LEPT_PARSE_OK, lept_parse(&v,
190         " { "
191         "\"n\" : null , "
192         "\"f\" : false , "
193         "\"t\" : true , "
194         "\"i\" : 123 , "
195         "\"s\" : \"abc\", "
196         "\"a\" : [ 1, 2, 3 ],"
197         "\"o\" : { \"1\" : 1, \"2\" : 2, \"3\" : 3 }"
198         " } "
199     ));
200     EXPECT_EQ_INT(LEPT_OBJECT, lept_get_type(&v));
201     EXPECT_EQ_SIZE_T(7, lept_get_object_size(&v));
202     EXPECT_EQ_STRING("n", lept_get_object_key(&v, 0), lept_get_object_key_length(&v, 0));
203     EXPECT_EQ_INT(LEPT_NULL, lept_get_type(lept_get_object_value(&v, 0)));
204     EXPECT_EQ_STRING("f", lept_get_object_key(&v, 1), lept_get_object_key_length(&v, 1));
205     EXPECT_EQ_INT(LEPT_FALSE, lept_get_type(lept_get_object_value(&v, 1)));
206     EXPECT_EQ_STRING("t", lept_get_object_key(&v, 2), lept_get_object_key_length(&v, 2));
207     EXPECT_EQ_INT(LEPT_TRUE, lept_get_type(lept_get_object_value(&v, 2)));
208     EXPECT_EQ_STRING("i", lept_get_object_key(&v, 3), lept_get_object_key_length(&v, 3));
209     EXPECT_EQ_INT(LEPT_NUMBER, lept_get_type(lept_get_object_value(&v, 3)));
210     EXPECT_EQ_DOUBLE(123.0, lept_get_number(lept_get_object_value(&v, 3)));
211     EXPECT_EQ_STRING("s", lept_get_object_key(&v, 4), lept_get_object_key_length(&v, 4));
212     EXPECT_EQ_INT(LEPT_STRING, lept_get_type(lept_get_object_value(&v, 4)));
213     EXPECT_EQ_STRING("abc", lept_get_string(lept_get_object_value(&v, 4)), lept_get_string_length(lept_get_object_value(&v, 4)));
214     EXPECT_EQ_STRING("a", lept_get_object_key(&v, 5), lept_get_object_key_length(&v, 5));
215     EXPECT_EQ_INT(LEPT_ARRAY, lept_get_type(lept_get_object_value(&v, 5)));
216     EXPECT_EQ_SIZE_T(3, lept_get_array_size(lept_get_object_value(&v, 5)));
217     for (i = 0; i < 3; i++) {
218         lept_value* e = lept_get_array_element(lept_get_object_value(&v, 5), i);
219         EXPECT_EQ_INT(LEPT_NUMBER, lept_get_type(e));
220         EXPECT_EQ_DOUBLE(i + 1.0, lept_get_number(e));
221     }
222     EXPECT_EQ_STRING("o", lept_get_object_key(&v, 6), lept_get_object_key_length(&v, 6));
223     {
224         lept_value* o = lept_get_object_value(&v, 6);
225         EXPECT_EQ_INT(LEPT_OBJECT, lept_get_type(o));
226         for (i = 0; i < 3; i++) {
227             lept_value* ov = lept_get_object_value(o, i);
228             EXPECT_TRUE('1' + i == lept_get_object_key(o, i)[0]);
229             EXPECT_EQ_SIZE_T(1, lept_get_object_key_length(o, i));
230             EXPECT_EQ_INT(LEPT_NUMBER, lept_get_type(ov));
231             EXPECT_EQ_DOUBLE(i + 1.0, lept_get_number(ov));
232         }
233     }
234     lept_free(&v);
235 }
236 
237 //以下用null作为示例,你修改其中参数即可作为别的类型测试
238 static void test_parse_expect_value() {
239     lept_value v;
240 
241     v.type = LEPT_FALSE;
242     EXPECT_EQ_INT(LEPT_PARSE_EXPECT_VALUE, lept_parse(&v, ""));
243     EXPECT_EQ_INT(LEPT_NULL, lept_get_type(&v));
244 
245     v.type = LEPT_FALSE;
246     EXPECT_EQ_INT(LEPT_PARSE_EXPECT_VALUE, lept_parse(&v, " "));
247     EXPECT_EQ_INT(LEPT_NULL, lept_get_type(&v));
248 }
249 
250 //数据类型的错值判断
251 static void test_parse_invalid_value() {
252     TEST_ERROR(LEPT_PARSE_INVALID_VALUE, "nul");
253     TEST_ERROR(LEPT_PARSE_INVALID_VALUE, "?");
254     
255     //invalid number
256     TEST_ERROR(LEPT_PARSE_INVALID_VALUE, "+0");
257     TEST_ERROR(LEPT_PARSE_INVALID_VALUE, "+1");
258     TEST_ERROR(LEPT_PARSE_INVALID_VALUE, ".123"); /* at least one digit before '.' */
259     TEST_ERROR(LEPT_PARSE_INVALID_VALUE, "1.");   /* at least one digit after '.' */
260     TEST_ERROR(LEPT_PARSE_INVALID_VALUE, "INF");
261     TEST_ERROR(LEPT_PARSE_INVALID_VALUE, "inf");
262     TEST_ERROR(LEPT_PARSE_INVALID_VALUE, "NAN");
263 }
264 
265 static void test_parse_root_not_singular() {
266     TEST_ERROR(LEPT_PARSE_ROOT_NOT_SINGULAR, "null x");
267 
268     //暂时无法解决的问题
269     //invalid number 
270     //TEST_ERROR(LEPT_PARSE_ROOT_NOT_SINGULAR, "0123"); /* after zero should be '.' , 'E' , 'e' or nothing */
271     //TEST_ERROR(LEPT_PARSE_ROOT_NOT_SINGULAR, "0x0");
272     //TEST_ERROR(LEPT_PARSE_ROOT_NOT_SINGULAR, "0x123");
273 }
274 
275 static void test_parse_missing_quotation_mark() {
276     TEST_ERROR(LEPT_PARSE_MISS_QUOTATION_MARK, "\"");
277     TEST_ERROR(LEPT_PARSE_MISS_QUOTATION_MARK, "\"abc");
278 }
279 
280 static void test_parse_invalid_string_escape() {
281     TEST_ERROR(LEPT_PARSE_INVALID_STRING_ESCAPE, "\"\\v\"");
282     TEST_ERROR(LEPT_PARSE_INVALID_STRING_ESCAPE, "\"\\'\"");
283     TEST_ERROR(LEPT_PARSE_INVALID_STRING_ESCAPE, "\"\\0\"");
284     TEST_ERROR(LEPT_PARSE_INVALID_STRING_ESCAPE, "\"\\x12\"");
285 }
286 
287 static void test_parse_invalid_string_char() {
288     TEST_ERROR(LEPT_PARSE_INVALID_STRING_CHAR, "\"\x01\"");
289     TEST_ERROR(LEPT_PARSE_INVALID_STRING_CHAR, "\"\x1F\"");
290 }
291 
292 static void test_parse_invalid_unicode_hex() {
293     TEST_ERROR(LEPT_PARSE_INVALID_UNICODE_HEX, "\"\\u\"");
294     TEST_ERROR(LEPT_PARSE_INVALID_UNICODE_HEX, "\"\\u0\"");
295     TEST_ERROR(LEPT_PARSE_INVALID_UNICODE_HEX, "\"\\u01\"");
296     TEST_ERROR(LEPT_PARSE_INVALID_UNICODE_HEX, "\"\\u012\"");
297     TEST_ERROR(LEPT_PARSE_INVALID_UNICODE_HEX, "\"\\u/000\"");
298     TEST_ERROR(LEPT_PARSE_INVALID_UNICODE_HEX, "\"\\uG000\"");
299     TEST_ERROR(LEPT_PARSE_INVALID_UNICODE_HEX, "\"\\u0/00\"");
300     TEST_ERROR(LEPT_PARSE_INVALID_UNICODE_HEX, "\"\\u0G00\"");
301     TEST_ERROR(LEPT_PARSE_INVALID_UNICODE_HEX, "\"\\u00/0\"");
302     TEST_ERROR(LEPT_PARSE_INVALID_UNICODE_HEX, "\"\\u00G0\"");
303     TEST_ERROR(LEPT_PARSE_INVALID_UNICODE_HEX, "\"\\u000/\"");
304     TEST_ERROR(LEPT_PARSE_INVALID_UNICODE_HEX, "\"\\u000G\"");
305     TEST_ERROR(LEPT_PARSE_INVALID_UNICODE_HEX, "\"\\u 123\"");
306 }
307 
308 static void test_parse_invalid_unicode_surrogate() {
309     TEST_ERROR(LEPT_PARSE_INVALID_UNICODE_SURROGATE, "\"\\uD800\"");
310     TEST_ERROR(LEPT_PARSE_INVALID_UNICODE_SURROGATE, "\"\\uDBFF\"");
311     TEST_ERROR(LEPT_PARSE_INVALID_UNICODE_SURROGATE, "\"\\uD800\\\\\"");
312     TEST_ERROR(LEPT_PARSE_INVALID_UNICODE_SURROGATE, "\"\\uD800\\uDBFF\"");
313     TEST_ERROR(LEPT_PARSE_INVALID_UNICODE_SURROGATE, "\"\\uD800\\uE000\"");
314 }
315 
316 static void test_parse_miss_comma_or_square_bracket() {
317     TEST_ERROR(LEPT_PARSE_MISS_COMMA_OR_SQUARE_BRACKET, "[1");
318     TEST_ERROR(LEPT_PARSE_MISS_COMMA_OR_SQUARE_BRACKET, "[1}");
319     TEST_ERROR(LEPT_PARSE_MISS_COMMA_OR_SQUARE_BRACKET, "[1 2");
320     TEST_ERROR(LEPT_PARSE_MISS_COMMA_OR_SQUARE_BRACKET, "[[]");
321 }
322 
323 static void test_parse_miss_key() {
324     TEST_ERROR(LEPT_PARSE_MISS_KEY, "{:1,");
325     TEST_ERROR(LEPT_PARSE_MISS_KEY, "{1:1,");
326     TEST_ERROR(LEPT_PARSE_MISS_KEY, "{true:1,");
327     TEST_ERROR(LEPT_PARSE_MISS_KEY, "{false:1,");
328     TEST_ERROR(LEPT_PARSE_MISS_KEY, "{null:1,");
329     TEST_ERROR(LEPT_PARSE_MISS_KEY, "{[]:1,");
330     TEST_ERROR(LEPT_PARSE_MISS_KEY, "{{}:1,");
331     TEST_ERROR(LEPT_PARSE_MISS_KEY, "{\"a\":1,");
332 }
333 
334 static void test_parse_miss_colon() {
335     TEST_ERROR(LEPT_PARSE_MISS_COLON, "{\"a\"}");
336     TEST_ERROR(LEPT_PARSE_MISS_COLON, "{\"a\",\"b\"}");
337 }
338 
339 static void test_parse_miss_comma_or_curly_bracket() {
340     TEST_ERROR(LEPT_PARSE_MISS_COMMA_OR_CURLY_BRACKET, "{\"a\":1");
341     TEST_ERROR(LEPT_PARSE_MISS_COMMA_OR_CURLY_BRACKET, "{\"a\":1]");
342     TEST_ERROR(LEPT_PARSE_MISS_COMMA_OR_CURLY_BRACKET, "{\"a\":1 \"b\"");
343     TEST_ERROR(LEPT_PARSE_MISS_COMMA_OR_CURLY_BRACKET, "{\"a\":{}");
344 }
345 
346 static void test_access_null() {
347     lept_value v;
348     lept_init(&v);
349     lept_set_string(&v, "a", 1);
350     lept_set_null(&v);
351     EXPECT_EQ_INT(LEPT_NULL, lept_get_type(&v));
352     lept_free(&v);
353 }
354 
355 static void test_access_boolean() {
356     lept_value v;
357     lept_init(&v);
358     lept_set_string(&v, "a", 1);
359     lept_set_boolean(&v, 1);
360     EXPECT_TRUE(lept_get_boolean(&v));
361     lept_set_boolean(&v, 0);
362     EXPECT_FALSE(lept_get_boolean(&v));
363     lept_free(&v);
364 }
365 
366 static void test_access_number() {
367     lept_value v;
368     lept_init(&v);
369     lept_set_string(&v, "a", 1);
370     lept_set_number(&v, 1234.5);
371     EXPECT_EQ_DOUBLE(1234.5, lept_get_number(&v));
372     lept_free(&v);
373 }
374 
375 static void test_access_string() {
376     lept_value v;
377     lept_init(&v);
378     lept_set_string(&v, "", 0);
379     EXPECT_EQ_STRING("", lept_get_string(&v), lept_get_string_length(&v));
380     lept_set_string(&v, "Hello", 5);
381     EXPECT_EQ_STRING("Hello", lept_get_string(&v), lept_get_string_length(&v));
382     lept_free(&v);
383 }
384 
385 static void test_parse() {
386     test_parse_null();
387     test_parse_true();
388     test_parse_false();
389     test_parse_number();
390     test_parse_string();
391     test_parse_expect_value();
392     test_parse_invalid_value();
393     test_parse_root_not_singular();
394     //test_parse_number_too_big();
395     test_parse_missing_quotation_mark();
396     test_parse_invalid_string_escape();
397     test_parse_invalid_string_char();
398     test_parse_invalid_unicode_hex();
399     test_parse_invalid_unicode_surrogate();
400     test_parse_miss_comma_or_square_bracket();
401     test_parse_miss_key();
402     test_parse_miss_colon();
403     test_parse_miss_comma_or_curly_bracket();
404 
405     test_access_null();
406     test_access_boolean();
407     test_access_number();
408     test_access_string();
409     test_parse_array();
410     test_parse_object();
411 }
412 
413 int main() {
414 /*#ifdef WIN32
415     _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
416     //_CrtSetBreakAlloc(87);  //在系统提示的第几次内存泄漏情况后,设置断点,可以更好的追踪泄漏源
417 #endif
418 */
419 
420     test_parse();
421     printf("%d/%d (%3.2f%%) passed\n", test_pass, test_count, test_pass * 100.0 / test_count);
422     return main_ret;
423 }

 

posted @ 2020-04-27 20:35  Royzzzzz  阅读(226)  评论(0编辑  收藏  举报