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