git / moonbite-core / src/univalue/test/unitester.cpp · raw
// Copyright 2014 BitPay Inc.// Distributed under the MIT/X11 software license, see the accompanying// file COPYING or http://www.opensource.org/licenses/mit-license.php.#include <stdlib.h>#include <stdio.h>#include <string.h>#include <cassert>#include <string>#include "univalue.h"#ifndef JSON_TEST_SRC#error JSON_TEST_SRC must point to test source directory#endif#ifndef ARRAY_SIZE#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))#endifstd::string srcdir(JSON_TEST_SRC);static bool test_failed = false;#define d_assert(expr) { if (!(expr)) { test_failed = true; fprintf(stderr, "%s failed\n", filename.c_str()); } }#define f_assert(expr) { if (!(expr)) { test_failed = true; fprintf(stderr, "%s failed\n", __func__); } }static std::string rtrim(std::string s){ s.erase(s.find_last_not_of(" \n\r\t")+1); return s;}static void runtest(std::string filename, const std::string& jdata){ std::string prefix = filename.substr(0, 4); bool wantPass = (prefix == "pass") || (prefix == "roun"); bool wantFail = (prefix == "fail"); bool wantRoundTrip = (prefix == "roun"); assert(wantPass || wantFail); UniValue val; bool testResult = val.read(jdata); if (wantPass) { d_assert(testResult == true); } else { d_assert(testResult == false); } if (wantRoundTrip) { std::string odata = val.write(0, 0); assert(odata == rtrim(jdata)); }}static void runtest_file(const char *filename_){ std::string basename(filename_); std::string filename = srcdir + "/" + basename; FILE *f = fopen(filename.c_str(), "r"); assert(f != NULL); std::string jdata; char buf[4096]; while (!feof(f)) { int bread = fread(buf, 1, sizeof(buf), f); assert(!ferror(f)); std::string s(buf, bread); jdata += s; } assert(!ferror(f)); fclose(f); runtest(basename, jdata);}static const char *filenames[] = { "fail10.json", "fail11.json", "fail12.json", "fail13.json", "fail14.json", "fail15.json", "fail16.json", "fail17.json", //"fail18.json", // investigate "fail19.json", "fail1.json", "fail20.json", "fail21.json", "fail22.json", "fail23.json", "fail24.json", "fail25.json", "fail26.json", "fail27.json", "fail28.json", "fail29.json", "fail2.json", "fail30.json", "fail31.json", "fail32.json", "fail33.json", "fail34.json", "fail35.json", "fail36.json", "fail37.json", "fail38.json", // invalid unicode: only first half of surrogate pair "fail39.json", // invalid unicode: only second half of surrogate pair "fail40.json", // invalid unicode: broken UTF-8 "fail41.json", // invalid unicode: unfinished UTF-8 "fail42.json", // valid json with garbage following a nul byte "fail44.json", // unterminated string "fail45.json", // nested beyond max depth "fail3.json", "fail4.json", // extra comma "fail5.json", "fail6.json", "fail7.json", "fail8.json", "fail9.json", // extra comma "pass1.json", "pass2.json", "pass3.json", "pass4.json", "round1.json", // round-trip test "round2.json", // unicode "round3.json", // bare string "round4.json", // bare number "round5.json", // bare true "round6.json", // bare false "round7.json", // bare null};// Test \u handlingvoid unescape_unicode_test(){ UniValue val; bool testResult; // Escaped ASCII (quote) testResult = val.read("[\"\\u0022\"]"); f_assert(testResult); f_assert(val[0].get_str() == "\""); // Escaped Basic Plane character, two-byte UTF-8 testResult = val.read("[\"\\u0191\"]"); f_assert(testResult); f_assert(val[0].get_str() == "\xc6\x91"); // Escaped Basic Plane character, three-byte UTF-8 testResult = val.read("[\"\\u2191\"]"); f_assert(testResult); f_assert(val[0].get_str() == "\xe2\x86\x91"); // Escaped Supplementary Plane character U+1d161 testResult = val.read("[\"\\ud834\\udd61\"]"); f_assert(testResult); f_assert(val[0].get_str() == "\xf0\x9d\x85\xa1");}int main (int argc, char *argv[]){ for (unsigned int fidx = 0; fidx < ARRAY_SIZE(filenames); fidx++) { runtest_file(filenames[fidx]); } unescape_unicode_test(); return test_failed ? 1 : 0;}