1e462795ff5d4c7359f9e8637c10544bb2de70107tturney// Tencent is pleased to support the open source community by making RapidJSON available. 2e462795ff5d4c7359f9e8637c10544bb2de70107tturney// 3e462795ff5d4c7359f9e8637c10544bb2de70107tturney// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. 4e462795ff5d4c7359f9e8637c10544bb2de70107tturney// 5e462795ff5d4c7359f9e8637c10544bb2de70107tturney// Licensed under the MIT License (the "License"); you may not use this file except 6e462795ff5d4c7359f9e8637c10544bb2de70107tturney// in compliance with the License. You may obtain a copy of the License at 7e462795ff5d4c7359f9e8637c10544bb2de70107tturney// 8e462795ff5d4c7359f9e8637c10544bb2de70107tturney// http://opensource.org/licenses/MIT 9e462795ff5d4c7359f9e8637c10544bb2de70107tturney// 10e462795ff5d4c7359f9e8637c10544bb2de70107tturney// Unless required by applicable law or agreed to in writing, software distributed 11e462795ff5d4c7359f9e8637c10544bb2de70107tturney// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR 12e462795ff5d4c7359f9e8637c10544bb2de70107tturney// CONDITIONS OF ANY KIND, either express or implied. See the License for the 13e462795ff5d4c7359f9e8637c10544bb2de70107tturney// specific language governing permissions and limitations under the License. 14e462795ff5d4c7359f9e8637c10544bb2de70107tturney 15e462795ff5d4c7359f9e8637c10544bb2de70107tturney#ifndef UNITTEST_H_ 16e462795ff5d4c7359f9e8637c10544bb2de70107tturney#define UNITTEST_H_ 17e462795ff5d4c7359f9e8637c10544bb2de70107tturney 18e462795ff5d4c7359f9e8637c10544bb2de70107tturney 19e462795ff5d4c7359f9e8637c10544bb2de70107tturney// gtest indirectly included inttypes.h, without __STDC_CONSTANT_MACROS. 20e462795ff5d4c7359f9e8637c10544bb2de70107tturney#ifndef __STDC_CONSTANT_MACROS 21e462795ff5d4c7359f9e8637c10544bb2de70107tturney# define __STDC_CONSTANT_MACROS 1 // required by C++ standard 22e462795ff5d4c7359f9e8637c10544bb2de70107tturney#endif 23e462795ff5d4c7359f9e8637c10544bb2de70107tturney 24e462795ff5d4c7359f9e8637c10544bb2de70107tturney#ifdef _MSC_VER 25e462795ff5d4c7359f9e8637c10544bb2de70107tturney#define _CRTDBG_MAP_ALLOC 26e462795ff5d4c7359f9e8637c10544bb2de70107tturney#include <crtdbg.h> 27e462795ff5d4c7359f9e8637c10544bb2de70107tturney#pragma warning(disable : 4996) // 'function': was declared deprecated 28e462795ff5d4c7359f9e8637c10544bb2de70107tturney#endif 29e462795ff5d4c7359f9e8637c10544bb2de70107tturney 30e462795ff5d4c7359f9e8637c10544bb2de70107tturney#if defined(__clang__) || defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 2)) 31e462795ff5d4c7359f9e8637c10544bb2de70107tturney#if defined(__clang__) || (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) 32e462795ff5d4c7359f9e8637c10544bb2de70107tturney#pragma GCC diagnostic push 33e462795ff5d4c7359f9e8637c10544bb2de70107tturney#endif 34e462795ff5d4c7359f9e8637c10544bb2de70107tturney#pragma GCC diagnostic ignored "-Weffc++" 35e462795ff5d4c7359f9e8637c10544bb2de70107tturney#endif 36e462795ff5d4c7359f9e8637c10544bb2de70107tturney 37e462795ff5d4c7359f9e8637c10544bb2de70107tturney#include "gtest/gtest.h" 38e462795ff5d4c7359f9e8637c10544bb2de70107tturney#include <stdexcept> 39e462795ff5d4c7359f9e8637c10544bb2de70107tturney 40e462795ff5d4c7359f9e8637c10544bb2de70107tturney#if defined(__clang__) || defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) 41e462795ff5d4c7359f9e8637c10544bb2de70107tturney#pragma GCC diagnostic pop 42e462795ff5d4c7359f9e8637c10544bb2de70107tturney#endif 43e462795ff5d4c7359f9e8637c10544bb2de70107tturney 44e462795ff5d4c7359f9e8637c10544bb2de70107tturneytemplate <typename Ch> 45e462795ff5d4c7359f9e8637c10544bb2de70107tturneyinline unsigned StrLen(const Ch* s) { 46e462795ff5d4c7359f9e8637c10544bb2de70107tturney const Ch* p = s; 47e462795ff5d4c7359f9e8637c10544bb2de70107tturney while (*p) p++; 48e462795ff5d4c7359f9e8637c10544bb2de70107tturney return unsigned(p - s); 49e462795ff5d4c7359f9e8637c10544bb2de70107tturney} 50e462795ff5d4c7359f9e8637c10544bb2de70107tturney 51e462795ff5d4c7359f9e8637c10544bb2de70107tturneytemplate<typename Ch> 52e462795ff5d4c7359f9e8637c10544bb2de70107tturneyinline int StrCmp(const Ch* s1, const Ch* s2) { 53e462795ff5d4c7359f9e8637c10544bb2de70107tturney while(*s1 && (*s1 == *s2)) { s1++; s2++; } 54e462795ff5d4c7359f9e8637c10544bb2de70107tturney return (unsigned)*s1 < (unsigned)*s2 ? -1 : (unsigned)*s1 > (unsigned)*s2; 55e462795ff5d4c7359f9e8637c10544bb2de70107tturney} 56e462795ff5d4c7359f9e8637c10544bb2de70107tturney 57e462795ff5d4c7359f9e8637c10544bb2de70107tturneytemplate <typename Ch> 58e462795ff5d4c7359f9e8637c10544bb2de70107tturneyinline Ch* StrDup(const Ch* str) { 59e462795ff5d4c7359f9e8637c10544bb2de70107tturney size_t bufferSize = sizeof(Ch) * (StrLen(str) + 1); 60e462795ff5d4c7359f9e8637c10544bb2de70107tturney Ch* buffer = (Ch*)malloc(bufferSize); 61e462795ff5d4c7359f9e8637c10544bb2de70107tturney memcpy(buffer, str, bufferSize); 62e462795ff5d4c7359f9e8637c10544bb2de70107tturney return buffer; 63e462795ff5d4c7359f9e8637c10544bb2de70107tturney} 64e462795ff5d4c7359f9e8637c10544bb2de70107tturney 65e462795ff5d4c7359f9e8637c10544bb2de70107tturneyinline FILE* TempFile(char *filename) { 66e462795ff5d4c7359f9e8637c10544bb2de70107tturney#if _MSC_VER 67e462795ff5d4c7359f9e8637c10544bb2de70107tturney filename = tmpnam(filename); 68e462795ff5d4c7359f9e8637c10544bb2de70107tturney 69e462795ff5d4c7359f9e8637c10544bb2de70107tturney // For Visual Studio, tmpnam() adds a backslash in front. Remove it. 70e462795ff5d4c7359f9e8637c10544bb2de70107tturney if (filename[0] == '\\') 71e462795ff5d4c7359f9e8637c10544bb2de70107tturney for (int i = 0; filename[i] != '\0'; i++) 72e462795ff5d4c7359f9e8637c10544bb2de70107tturney filename[i] = filename[i + 1]; 73e462795ff5d4c7359f9e8637c10544bb2de70107tturney 74e462795ff5d4c7359f9e8637c10544bb2de70107tturney return fopen(filename, "wb"); 75e462795ff5d4c7359f9e8637c10544bb2de70107tturney#else 76e462795ff5d4c7359f9e8637c10544bb2de70107tturney strcpy(filename, "/tmp/fileXXXXXX"); 77e462795ff5d4c7359f9e8637c10544bb2de70107tturney int fd = mkstemp(filename); 78e462795ff5d4c7359f9e8637c10544bb2de70107tturney return fdopen(fd, "w"); 79e462795ff5d4c7359f9e8637c10544bb2de70107tturney#endif 80e462795ff5d4c7359f9e8637c10544bb2de70107tturney} 81e462795ff5d4c7359f9e8637c10544bb2de70107tturney 82e462795ff5d4c7359f9e8637c10544bb2de70107tturney// Use exception for catching assert 83e462795ff5d4c7359f9e8637c10544bb2de70107tturney#if _MSC_VER 84e462795ff5d4c7359f9e8637c10544bb2de70107tturney#pragma warning(disable : 4127) 85e462795ff5d4c7359f9e8637c10544bb2de70107tturney#endif 86e462795ff5d4c7359f9e8637c10544bb2de70107tturney 87e462795ff5d4c7359f9e8637c10544bb2de70107tturneyclass AssertException : public std::logic_error { 88e462795ff5d4c7359f9e8637c10544bb2de70107tturneypublic: 89e462795ff5d4c7359f9e8637c10544bb2de70107tturney AssertException(const char* w) : std::logic_error(w) {} 90e462795ff5d4c7359f9e8637c10544bb2de70107tturney}; 91e462795ff5d4c7359f9e8637c10544bb2de70107tturney 92e462795ff5d4c7359f9e8637c10544bb2de70107tturney#define RAPIDJSON_ASSERT(x) if (!(x)) throw AssertException(RAPIDJSON_STRINGIFY(x)) 93e462795ff5d4c7359f9e8637c10544bb2de70107tturney 94e462795ff5d4c7359f9e8637c10544bb2de70107tturneyclass Random { 95e462795ff5d4c7359f9e8637c10544bb2de70107tturneypublic: 96e462795ff5d4c7359f9e8637c10544bb2de70107tturney Random(unsigned seed = 0) : mSeed(seed) {} 97e462795ff5d4c7359f9e8637c10544bb2de70107tturney 98e462795ff5d4c7359f9e8637c10544bb2de70107tturney unsigned operator()() { 99e462795ff5d4c7359f9e8637c10544bb2de70107tturney mSeed = 214013 * mSeed + 2531011; 100e462795ff5d4c7359f9e8637c10544bb2de70107tturney return mSeed; 101e462795ff5d4c7359f9e8637c10544bb2de70107tturney } 102e462795ff5d4c7359f9e8637c10544bb2de70107tturney 103e462795ff5d4c7359f9e8637c10544bb2de70107tturneyprivate: 104e462795ff5d4c7359f9e8637c10544bb2de70107tturney unsigned mSeed; 105e462795ff5d4c7359f9e8637c10544bb2de70107tturney}; 106e462795ff5d4c7359f9e8637c10544bb2de70107tturney 107e462795ff5d4c7359f9e8637c10544bb2de70107tturney#endif // UNITTEST_H_ 108