Match-id-515db564370c501883bd877581f460290f764189

This commit is contained in:
BianTanggui
2020-05-27 16:42:58 +08:00
parent 6ba728cbb3
commit 45a23dceae
224 changed files with 67778 additions and 0 deletions

3
cli/.gitignore vendored Normal file
View File

@@ -0,0 +1,3 @@
.idea
cmake-build-debug
.vscode

1
cli/README.txt Normal file
View File

@@ -0,0 +1 @@
ascend-docker-cli

5
cli/src/CMakeLists.txt Normal file
View File

@@ -0,0 +1,5 @@
cmake_minimum_required(VERSION 2.26)
project(ascend_docker_cli C)
set(CMAKE_C_STANDARD 11)
aux_source_directory(. SRC)
add_executable(ascend_docker_cli ${SRC})

666
cli/src/main.c Normal file
View File

@@ -0,0 +1,666 @@
/*
* Copyright (c) Huawei Technologies Co., Ltd. 2020-2020. All rights reserved.
* Description: ascend-docker-cli工具配置容器挂载Ascend NPU设备
*/
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <getopt.h>
#include <string.h>
#include <stdbool.h>
#include <sys/fcntl.h>
#include <sys/fsuid.h>
#include <sys/mount.h>
#include <sys/stat.h>
#include <unistd.h>
#include <sched.h>
#include <dirent.h>
#define DEVICE_NAME "davinci"
#define DAVINCI_MANAGER_PATH "/dev/davinci_manager"
#define DEVMM_SVM_PATH "/dev/devmm_svm"
#define HISI_HDC_PATH "/dev/hisi_hdc"
#define DEFAULT_DIR_MODE 0755
#define BUF_SIZE 1024
#define ALLOW_PATH "/devices.allow"
#define ROOT_GAP 4
#define FSTYPE_GAP 2
#define MOUNT_SUBSTR_GAP 2
#define ROOT_SUBSTR_GAP 2
static const struct option g_opts[] = {
{"devices", required_argument, 0, 'd'},
{"pid", required_argument, 0, 'p'},
{"rootfs", required_argument, 0, 'r'},
{0, 0, 0, 0}
};
struct CmdArgs {
char *devices;
char *rootfs;
int pid;
};
static inline bool IsCmdArgsValid(struct CmdArgs *args)
{
return (args->devices != NULL) && (args->rootfs != NULL) && (args->pid > 0);
}
static void FreeCmdArgs(struct CmdArgs *args)
{
if (args->devices != NULL) {
free(args->devices);
args->devices = NULL;
}
if (args->rootfs != NULL) {
free(args->rootfs);
args->rootfs = NULL;
}
args->pid = -1;
}
static int GetNsPath(const int pid, const char *nsType, char *buf, size_t bufSize)
{
static const char *fmtStr = "/proc/%d/ns/%s";
return snprintf(buf, bufSize, fmtStr, pid, nsType);
}
static int GetSelfNsPath(const char *nsType, char *buf, size_t bufSize)
{
static const char *fmtStr = "/proc/self/ns/%s";
return snprintf(buf, bufSize, fmtStr, nsType);
}
static int EnterNsByFd(int fd, int nsType)
{
int ret = setns(fd, nsType);
if (ret < 0) {
fprintf(stderr, "error: failed to set ns: fd(%d)\n", fd);
return -1;
}
return 0;
}
static int EnterNsByPath(const char *path, int nsType)
{
int fd;
int ret;
fd = open(path, O_RDONLY);
if (fd < 0) {
fprintf(stderr, "error: failed to open ns path: %s\n", path);
return -1;
}
ret = EnterNsByFd(fd, nsType);
if (ret < 0) {
fprintf(stderr, "error: failed to set ns: %s\n", path);
return -1;
}
close(fd);
return 0;
}
static unsigned int GetNextSerialNum()
{
static unsigned int index = 0;
return index++;
}
static int MountDevice(const char *rootfs, const int serialNumber)
{
int ret;
char src[BUF_SIZE] = {0};
char dst[BUF_SIZE] = {0};
char tmp[BUF_SIZE] = {0};
snprintf(src, BUF_SIZE, "/dev/" DEVICE_NAME "%d", serialNumber);
unsigned int targetSerialDevId = GetNextSerialNum();
snprintf(tmp, BUF_SIZE, "/dev/" DEVICE_NAME "%d", targetSerialDevId);
snprintf(dst, BUF_SIZE, "%s%s", rootfs, (const char *)tmp);
struct stat srcStat;
ret = stat((const char *)src, &srcStat);
if (ret < 0) {
fprintf(stderr, "error: failed to stat src: %s\n", src);
return -1;
}
close(open(dst, O_NOFOLLOW | O_CREAT, srcStat.st_mode));
ret = mount(src, dst, NULL, MS_BIND, NULL);
if (ret < 0) {
fprintf(stderr, "error: failed to mount dev\n");
return -1;
}
ret = mount(NULL, dst, NULL, MS_BIND | MS_REMOUNT | MS_RDONLY | MS_NOSUID | MS_NOEXEC, NULL);
if (ret < 0) {
fprintf(stderr, "error: failed to re-mount dev\n");
return -1;
}
return 0;
}
static int DoMount(const char *rootfs, const char *devicesList)
{
static const char *sep = ",";
char list[BUF_SIZE] = {0};
strcpy(list, devicesList);
char *token = NULL;
token = strtok(list, sep);
while (token != NULL) {
int ret = MountDevice(rootfs, atoi((const char *) token));
if (ret < 0) {
fprintf(stderr, "error: failed to mount device no. %s\n", token);
return -1;
}
token = strtok(NULL, sep);
}
return 0;
}
static int CheckDirExists(char *dir, int len)
{
if (len < 0) {
fprintf(stderr, "length of path is %d\n", len);
return -1;
}
DIR *ptr = opendir(dir);
if (NULL == ptr) {
fprintf(stderr, "path %s not exist\n", dir);
return -1;
} else {
fprintf(stdout, "path %s exist\n", dir);
closedir(ptr);
return 0;
}
}
static int GetParentPathStr(const char *path, int lenOfPath, char *parent)
{
if (lenOfPath < 0) {
return -1;
}
char *ptr = strrchr(path, '/');
if (ptr == NULL) {
return 0;
}
int len = strlen(path) - strlen(ptr);
if (len < 1) {
return 0;
}
strncpy(parent, path, len);
return 0;
}
static int MakeParentDir(char *path, mode_t mode)
{
if (*path == '\0' || *path == '.') {
return 0;
}
if (CheckDirExists(path, strlen(path)) == 0) {
return 0;
}
char parentPath[BUF_SIZE] = {0};
GetParentPathStr(path, strlen(path), parentPath);
if (strlen(parentPath) > 0 && MakeParentDir(parentPath, mode) < 0) {
return -1;
}
struct stat s;
int ret = stat(path, &s);
if (ret < 0) {
fprintf(stderr, "error: failed to stat path: %s\n", path);
return (mkdir(path, mode));
}
if (S_ISDIR(s.st_mode)) {
return 0;
}
}
static int MountFiles(const char *rootfs, const char *file, unsigned long reMountRwFlag)
{
char src[BUF_SIZE] = {0};
char dst[BUF_SIZE] = {0};
snprintf(src, BUF_SIZE, "%s", file);
snprintf(dst, BUF_SIZE, "%s%s", rootfs, file);
struct stat srcStat;
int ret = stat((const char *) src, &srcStat);
if (ret < 0) {
fprintf(stderr, "error: failed to stat src: %s\n", src);
return -1;
}
if (S_ISDIR(srcStat.st_mode)) {
/* directory */
char parentDir[BUF_SIZE] = {0};
GetParentPathStr(dst, strlen(dst), parentDir);
if (CheckDirExists(parentDir, strlen(parentDir)) < 0) {
mode_t parentMode = DEFAULT_DIR_MODE;
ret = MakeParentDir(parentDir, parentMode);
if (ret < 0) {
fprintf(stderr, "error: failed to make dir: %s\n", parentDir);
return -1;
}
}
if (CheckDirExists(dst, strlen(dst)) < 0) {
const mode_t curMode = srcStat.st_mode;
ret = mkdir(dst, curMode);
if (ret < 0) {
fprintf(stderr, "error: failed to make dir: %s\n", dst);
return -1;
}
}
} else {
/* device */
close(open(dst, O_NOFOLLOW | O_CREAT, srcStat.st_mode));
}
ret = mount(src, dst, NULL, MS_BIND, NULL);
if (ret < 0) {
fprintf(stderr, "error: failed to mount dev\n");
return -1;
}
ret = mount(NULL, dst, NULL, reMountRwFlag, NULL);
if (ret < 0) {
fprintf(stderr, "error: failed to re-mount dev\n");
return -1;
}
return 0;
}
static int DoMountFiles(const char *rootfs)
{
/* device */
unsigned long reMountRwFlag = MS_BIND | MS_REMOUNT | MS_RDONLY | MS_NOSUID | MS_NOEXEC;
int ret = MountFiles(rootfs, DAVINCI_MANAGER_PATH, reMountRwFlag);
if (ret < 0) {
fprintf(stderr, "error: failed to do mount %s\n", DAVINCI_MANAGER_PATH);
return -1;
}
ret = MountFiles(rootfs, DEVMM_SVM_PATH, reMountRwFlag);
if (ret < 0) {
fprintf(stderr, "error: failed to do mount %s\n", DEVMM_SVM_PATH);
return -1;
}
ret = MountFiles(rootfs, HISI_HDC_PATH, reMountRwFlag);
if (ret < 0) {
fprintf(stderr, "error: failed to do mount %s\n", HISI_HDC_PATH);
return -1;
}
return 0;
}
typedef char *(*ParseFileLine)(char *, const char *);
int IsStrEqual(const char *s1, const char *s2)
{
return (!strcmp(s1, s2));
}
int StrHasPrefix(const char *str, const char *prefix)
{
return (!strncmp(str, prefix, strlen(prefix)));
}
char *GetCgroupMount(char *line, const char *subsys)
{
int i;
char *rootDir = NULL;
for (i = 0; i < ROOT_GAP; ++i) {
/* root is substr before gap, line is substr after gap */
rootDir = strsep(&line, " ");
}
char *mountPoint = NULL;
mountPoint = strsep(&line, " ");
line = strchr(line, '-');
char* fsType = NULL;
for (i = 0; i < FSTYPE_GAP; ++i) {
fsType = strsep(&line, " ");
}
char* substr = NULL;
for (i = 0; i < MOUNT_SUBSTR_GAP; ++i) {
substr = strsep(&line, " ");
}
if (rootDir == NULL || mountPoint == NULL || fsType == NULL || substr == NULL) {
return (NULL);
}
if (*rootDir == '\0' || *mountPoint == '\0' || *fsType == '\0' || *substr == '\0') {
return (NULL);
}
if (strlen(rootDir) >= BUF_SIZE || StrHasPrefix(rootDir, "/..")) {
return (NULL);
}
if (strstr(substr, subsys) == NULL) {
return (NULL);
}
if (!IsStrEqual(fsType, "cgroup")) {
return (NULL);
}
return (mountPoint);
}
char *GetCgroupRoot(char *line, const char *subSystem)
{
char *token = NULL;
int i;
for (i = 0; i < ROOT_SUBSTR_GAP; ++i) {
token = strsep(&line, ":");
}
char *rootDir = strsep(&line, ":");
if (rootDir == NULL || token == NULL) {
return (NULL);
}
if (*rootDir == '\0' || *token == '\0') {
return (NULL);
}
if (strlen(rootDir) >= BUF_SIZE || StrHasPrefix(rootDir, "/..")) {
return (NULL);
}
if (strstr(token, subSystem) == NULL) {
return (NULL);
}
return (rootDir);
}
static int CatFileContent(char* buffer, int bufferSize, ParseFileLine fn, const char* filepath)
{
FILE *fp;
char *line = NULL;
size_t len = 0;
fp = fopen(filepath, "r");
if (fp == NULL) {
fprintf(stderr, "cannot open file.\n");
return -1;
}
while (getline(&line, &len, fp) != -1) {
char* result = fn(line, "devices");
if (result != NULL && strlen(result) < bufferSize) {
strncpy(buffer, result, strlen(result));
break;
}
}
if (line != NULL) {
free(line);
}
fclose(fp);
return 0;
}
static int SetupDeviceCgroup(FILE *cgroupAllow, const char *devPath)
{
int ret;
struct stat devStat;
ret = stat(devPath, &devStat);
if (ret < 0) {
fprintf(stderr, "error: failed to get stat of %s\n", devPath);
return -1;
}
bool isFailed = fprintf(cgroupAllow, "c %u:%u rw", major(devStat.st_rdev), minor(devStat.st_rdev)) < 0 ||
fflush(cgroupAllow) == EOF || ferror(cgroupAllow) < 0;
if (isFailed) {
fprintf(stderr, "error: write devices failed\n");
return -1;
}
return 0;
}
static int SetupDriverCgroup(FILE *cgroupAllow)
{
int ret;
ret = SetupDeviceCgroup(cgroupAllow, DAVINCI_MANAGER_PATH);
if (ret < 0) {
fprintf(stderr, "error: failed to setup cgroup for %s\n", DAVINCI_MANAGER_PATH);
return -1;
}
ret = SetupDeviceCgroup(cgroupAllow, DEVMM_SVM_PATH);
if (ret < 0) {
fprintf(stderr, "error: failed to setup cgroup for %s\n", DEVMM_SVM_PATH);
return -1;
}
ret = SetupDeviceCgroup(cgroupAllow, HISI_HDC_PATH);
if (ret < 0) {
fprintf(stderr, "error: failed to setup cgroup for %s\n", HISI_HDC_PATH);
return -1;
}
return 0;
}
static int GetCgroupPath(const struct CmdArgs *args, char *effPath, const size_t maxSize)
{
int ret;
char mountPath[BUF_SIZE] = {0x0};
char mount[BUF_SIZE] = {0x0};
ret = snprintf(mountPath, BUF_SIZE, "/proc/%d/mountinfo", (int)getppid());
if (ret < 0) {
fprintf(stderr, "error: assemble mount info path failed: ppid(%d)\n", getppid());
return -1;
}
ret = CatFileContent(mount, BUF_SIZE, GetCgroupMount, mountPath);
if (ret < 0) {
fprintf(stderr, "error: cat file content failed\n");
return -1;
}
char cgroup[BUF_SIZE] = {0x0};
char cgroupPath[BUF_SIZE] = {0x0};
ret = snprintf(cgroupPath, BUF_SIZE, "/proc/%d/cgroup", args->pid);
if (ret < 0) {
fprintf(stderr, "error: assemble cgroup path failed: pid(%d)\n", args->pid);
return -1;
}
ret = CatFileContent(cgroup, BUF_SIZE, GetCgroupRoot, cgroupPath);
if (ret < 0) {
fprintf(stderr, "error: cat file content failed\n");
return -1;
}
// cut last '\n' off
cgroup[strcspn(cgroup, "\n")] = '\0';
ret = snprintf(effPath, maxSize, "%s%s%s", mount, cgroup, ALLOW_PATH);
if (ret < 0) {
fprintf(stderr, "error: assemble cgroup device path failed: \n");
return -1;
}
return 0;
}
int SetupCgroup(struct CmdArgs *args, const char *cgroupPath)
{
int ret;
char devicePath[BUF_SIZE] = {0};
FILE *cgroupAllow = NULL;
static const char *sep = ",";
char list[BUF_SIZE] = {0};
strcpy(list, args->devices);
char *token = NULL;
cgroupAllow = fopen(cgroupPath, "a");
if (cgroupAllow == NULL) {
fprintf(stderr, "error: failed to open cgroup file: %s\n", cgroupPath);
return -1;
}
ret = SetupDriverCgroup(cgroupAllow);
if (ret < 0) {
fclose(cgroupAllow);
fprintf(stderr, "error: failed to setup driver cgroup\n");
return -1;
}
token = strtok(list, sep);
while (token != NULL) {
ret = snprintf(devicePath, BUF_SIZE, "/dev/" DEVICE_NAME "%d", atoi(token));
if (ret < 0) {
fclose(cgroupAllow);
fprintf(stderr, "error: failed to assemble device path for no.%s\n", token);
return -1;
}
ret = SetupDeviceCgroup(cgroupAllow, (const char *)devicePath);
if (ret < 0) {
fclose(cgroupAllow);
fprintf(stderr, "error: failed to setup cgroup %s\n", token);
return -1;
}
token = strtok(NULL, sep);
}
fclose(cgroupAllow);
return 0;
}
static int SetupMounts(struct CmdArgs *args)
{
int ret;
char cgroupPath[BUF_SIZE] = {0};
char containerNsPath[BUF_SIZE] = {0};
ret = GetNsPath(args->pid, "mnt", containerNsPath, BUF_SIZE);
if (ret < 0) {
fprintf(stderr, "error: failed to get container mnt ns path: pid(%d)\n", args->pid);
return ret;
}
char originNsPath[BUF_SIZE] = {0};
ret = GetSelfNsPath("mnt", originNsPath, BUF_SIZE);
if (ret < 0) {
fprintf(stderr, "error: failed to get self ns path\n");
return ret;
}
int originNsFd = open((const char *)originNsPath, O_RDONLY);
if (originNsFd < 0) {
fprintf(stderr, "error: failed to get self ns fd: %s\n", originNsPath);
return -1;
}
ret = GetCgroupPath(args, cgroupPath, BUF_SIZE);
if (ret < 0) {
fprintf(stderr, "error: failed to get cgroup path\n");
return -1;
}
// enter container's mount namespace
ret = EnterNsByPath((const char *) containerNsPath, CLONE_NEWNS);
if (ret < 0) {
fprintf(stderr, "error: failed to set to container ns: %s\n", containerNsPath);
close(originNsFd);
return -1;
}
ret = DoMount(args->rootfs, args->devices);
if (ret < 0) {
fprintf(stderr, "error: failed to do mounts\n");
close(originNsFd);
return -1;
}
ret = DoMountFiles(args->rootfs);
if (ret < 0) {
fprintf(stderr, "error: failed to do mount files\n");
close(originNsFd);
return -1;
}
ret = SetupCgroup(args, (const char *)cgroupPath);
if (ret < 0) {
fprintf(stderr, "error: failed to set up cgroup\n");
close(originNsFd);
return -1;
}
// back to original namespace
ret = EnterNsByFd(originNsFd, CLONE_NEWNS);
if (ret < 0) {
fprintf(stderr, "error: failed to set ns back\n");
close(originNsFd);
return -1;
}
close(originNsFd);
return 0;
}
#ifdef gtest
int _main(int argc, char **argv) {
#else
int main(int argc, char **argv) {
#endif
int c;
int optionIndex;
struct CmdArgs args = {
.devices = NULL,
.rootfs = NULL,
.pid = -1
};
while ((c = getopt_long(argc, argv, "d:p:r", g_opts, &optionIndex)) != -1) {
switch (c) {
case 'd':
args.devices = strdup(optarg);
break;
case 'p':
args.pid = atoi(optarg);
break;
case 'r':
args.rootfs = strdup(optarg);
break;
default:
fprintf(stderr, "unrecongnized option\n");
return -1; // unrecognized option
}
}
if (!IsCmdArgsValid(&args)) {
FreeCmdArgs(&args);
return -1;
}
int ret = SetupMounts(&args);
if (ret < 0) {
FreeCmdArgs(&args);
return ret;
}
FreeCmdArgs(&args);
return 0;
}

157
cli/test/CMakeLists.txt Normal file
View File

@@ -0,0 +1,157 @@
cmake_minimum_required(VERSION 2.6)
project(demo)
macro(dtcenter_init_complier_settings)
set(compiler_flags
CMAKE_C_FLAGS
CMAKE_C_FLAGS_DEBUG
CMAKE_C_FLAGS_RELEASE
CMAKE_C_FLAGS_MINSIZEREL
CMAKE_C_FLAGS_RELWITHDEBINFO
CMAKE_CXX_FLAGS
CMAKE_CXX_FLAGS_DEBUG
CMAKE_CXX_FLAGS_RELEASE
CMAKE_CXX_FLAGS_MINSIZEREL
CMAKE_CXX_FLAGS_RELWITHDEBINFO
)
if (MSVC)
# For MSVC, CMake sets certain flags to defaults we want to override.
# This replacement code is taken from sample in the CMake Wiki at
# http://www.cmake.org/Wiki/CMake_FAQ#Dynamic_Replace.
foreach(flag_var ${compiler_flags})
if (NOT BUILD_SHARED_LIBS)
# When DTCenter is built as a shared library, it should also use
# shared runtime libraries. Otherwise, it may end up with multiple
# copies of runtime library data in different modules, resulting in
# hard-to-find crashes. When it is built as a static library, it is
# preferable to use CRT as static libraries, as we don't have to rely
# on CRT DLLs being available. CMake always defaults to using shared
# CRT libraries, so we override that default here.
string(REPLACE "/MD" "-MT" ${flag_var} "${${flag_var}}")
endif ()
# Do not create .pdb files
string(REPLACE "/Zi" "/Z7" ${flag_var} "${${flag_var}}")
string(REPLACE "/ZI" "/Z7" ${flag_var} "${${flag_var}}")
# We prefer more strict warning checking for building DTCenter.
# Replaces /W3 with /W4 in defaults.
# string(REPLACE "/W3" "/W4" ${flag_var} "${${flag_var}}")
endforeach()
# Suppress MSVC warnning
add_definitions(-wd4996)
# Summary of tuple support for Microsoft Visual Studio:
# Compiler version(MS) version(cmake) Support
# ---------- ----------- -------------- -----------------------------
# vs 2005 8 1400 disabled warings [4355]
# <= VS 2010 <= 10 <= 1600 Use Google Tests's own tuple.
# VS 2012 11 1700 std::tr1::tuple + _VARIADIC_MAX=10
# VS 2013 12 1800 std::tr1::tuple
if (MSVC)
if (MSVC_VERSION EQUAL 1400)
add_definitions(-wd4355)
endif (MSVC_VERSION EQUAL 1400)
if (MSVC_VERSION EQUAL 1700)
add_definitions(/D _VARIADIC_MAX=10)
endif (MSVC_VERSION EQUAL 1700)
endif (MSVC)
# Summary of name for Microsoft Visual Studio:
# Compiler version(MS) version(cmake) Name
# ---------- ----------- -------------- -----------------------------
# VS 2005 8 1400 vs2005
# VS 2008 9 1500 vs2008
# VS 2010 10 1600 vs2010
# VS 2012 11 1700 vs2012
# VS 2013 12 1800 vs2013
# VS 2015 13 1900 vs2015
if (MSVC_VERSION EQUAL 1400)
set(MSVC_NAME "vs2005")
elseif (MSVC_VERSION EQUAL 1500)
set(MSVC_NAME "vs2008")
elseif (MSVC_VERSION EQUAL 1600)
set(MSVC_NAME "vs2010")
elseif (MSVC_VERSION EQUAL 1700)
set(MSVC_NAME "vs2012")
elseif (MSVC_VERSION EQUAL 1800)
set(MSVC_NAME "vs2013")
elseif (MSVC_VERSION EQUAL 1900)
set(MSVC_NAME "vs2015")
elseif (MSVC_VERSION EQUAL 1910)
set(MSVC_NAME "vs2017")
else ()
message(FATAL_ERROR "Please add the MSVC_NAME for MSVC_VERSION[${MSVC_VERSION}]")
endif (MSVC_VERSION EQUAL 1400)
if (NOT BUILD_SHARED_LIBS)
set(LIBRARY_POSTFIX "mtd")
else ()
set(LIBRARY_POSTFIX "mdd")
endif (NOT BUILD_SHARED_LIBS)
endif (MSVC)
if(UNIX)
# 调试开关
add_definitions(-g)
# 关闭优化开关
add_definitions(-O0)
# 4.8.5编译选项
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
# ASAN编译选项
if (BUILD_ASAN)
add_definitions(-fsanitize=address -fsanitize-recover=all)
add_definitions(-fno-omit-frame-pointer -fno-stack-protector)
add_definitions(-fsanitize=leak)
endif(BUILD_ASAN)
if (BUILD_FUZZ)
# 包含FUZZ时必须使用C++11语法编译
# set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
endif(BUILD_FUZZ)
# DTCenter定义的宏
add_definitions(-DDT_COMPILE_GCC -DAUTOSTAR_LINUX)
# 默认不支持中文用例名,如果要支持请打开以下配置
# add_definitions(-DDTCENTER_CN2EN)
# GCC编译器告警开关
add_definitions(-Wall -Wextra -D_GLIBCXX_USE_CXX11_ABI=0)
add_definitions(-Wno-unused-parameter -Wno-unused-variable -Wno-unused-function -Wno-parentheses -Wno-write-strings -Wno-format-security)
add_definitions(-Wno-sign-compare -Wno-nonnull-compare -Wno-return-type -Wno-comment -Wno-ignored-qualifiers -Wno-missing-field-initializers)
#add_definitions(-fprofile-arcs -ftest-coverage)
# 以下只对C++语言有有效
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fpermissive -Wno-reorder")
# GCC 4.3.4不支持 -Wno-conversion-null 先注释掉
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-conversion-null")
#add_definitions(-rdynamic)
endif(UNIX)
endmacro()
dtcenter_init_complier_settings()
add_definitions(-g -O0)
add_definitions(-DDT_COMPILE_GCC -DAUTOSTAR_LINUX -D_GLIBCXX_USE_CXX11_ABI=0)
add_definitions(-Dgtest)
# GCC编译器告警开关
add_definitions(-Wall -Wextra)
add_definitions(-Wno-unused-parameter -Wno-unused-variable -Wno-unused-function -Wno-parentheses -Wno-write-strings -Wno-format-security)
add_definitions(-Wno-sign-compare -Wno-return-type -Wno-comment -Wno-ignored-qualifiers)
set(UT_DEMO_SRCS testcase/main.cpp ../src/main.c testcase/gtest_mytestcase.cpp)
add_executable(ut_demo ${UT_DEMO_SRCS})
target_link_libraries(ut_demo
${PROJECT_SOURCE_DIR}/lib/libdtcenter.a
)
target_link_libraries(ut_demo -pthread)
target_include_directories(ut_demo PUBLIC ${PROJECT_SOURCE_DIR}/include)

View File

@@ -0,0 +1,220 @@
#pragma once
#include "gtest/internal/gtest-port.h"
#ifdef GTEST_OS_WINDOWS
//此处不包含winsock.h了
#include <windows.h>
#endif
#ifdef GTEST_OS_LINUX
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <unistd.h>
#define HANDLE void*
#define UINT32 unsigned int
#define UINT8 unsigned char
#define UIN16 unsigned short
#define SOCKET unsigned int
#define INVALID_SOCKET 0
#define SOCKET_ERROR -1
#endif
/*相关接口*/
namespace testing {
/*ulLogtype枚举宏定义消息的打印级别*/
#define DT_SETUP 0 /*全局初始化事件*/
#define DT_TEARDOWN 1 /*全局加载事件*/
#define DT_TESTCASE_BEGIN 2 /*用例开始事件*/
#define DT_TESTCASE_END 3 /*用例结束事件*/
#define DT_MSG_MAGIC_WORD 0x4F4F4F4F
//是下面MsgStruct的消息内容
#define DT_MSG_TRACE_HEADER \
unsigned int ulMagicWord; \
unsigned int usProdType; \
unsigned int usLength \
#pragma pack(push,1)
//传向socket的消息内容中的消息头
struct DT_MSG_TRACE_HEADER_SUCT
{
DT_MSG_TRACE_HEADER;
};
typedef struct
{
DT_MSG_TRACE_HEADER;
}DT_MSG_TRACE_STRU;
//传向Socket的适应msgtype为字符串类型的消息体
typedef struct
{
DT_MSG_TRACE_HEADER;
unsigned int direction; //发送方向
unsigned int protocal; //协议
unsigned int msgFlag; //消息类型是INT32时为1为0时INT8 *
unsigned int msgTypeLen; //消息类型的长度 (msgType == 0) strlen(msgTypeStr) + strlen(reservered)
unsigned char msgTypeStr[1]; //消息类型
unsigned int msgcontentlength; //消息内容的长度
unsigned char msgcontent[1]; //消息内容
}DT_MSG_TRACE_DATA_STRU_INT8;
//传向Socket的适应msgtype为int类型的消息体
typedef struct
{
DT_MSG_TRACE_HEADER;
unsigned int direction; //发送方向
unsigned int protocal; //协议
unsigned int msgFlag; //消息类型是INT32时为1为0时INT8 *
unsigned int msgType; //消息类型
unsigned int msgcontentlength; //消息内容的长度
unsigned char msgcontent[1]; //消息内容
}DT_MSG_TRACE_DATA_STRU_INT32;
//msgtype消息类型
#define OUTER_MSG 0 //外部消息
#define INNER_MSG 1 //内部消息
//传向Socket的适应NodeB的消息体
typedef struct
{
DT_MSG_TRACE_HEADER;
unsigned int msgType; //内外部消息 0: 外部消息 1:内部消息 RecPId的长度
unsigned int SenderCpuId; //发出的Cpuid,若msgType为内部消息时SenderCpuId = RecCpuId
unsigned int SenderPId; //发出的pid,
unsigned int RecCpuId; //收到的Cpuid,
unsigned int RecPId; //收到的pid,
unsigned int msgcontentlength; //msgContents长度
unsigned char msgContents[1]; //消息内容
}DT_MSG_TRACE_DATA_STRU_NodeB;
//传向Socket的适应LTE的消息体
typedef struct
{
DT_MSG_TRACE_HEADER;
unsigned int msgType;
unsigned int SenderCpuId; //发出的Cpuid
unsigned int SenderPId; //发出的pid,
unsigned int RecCpuId; //收到的Cpuid,
unsigned int RecPId; //收到的pid,
unsigned int msgcontentlength; //msgContents长度
unsigned char msgContents[1]; //消息内容
}DT_MSG_TRACE_DATA_STRU_LTE;
//传向Socket的公用的dopra 消息
typedef struct
{
DT_MSG_TRACE_HEADER;
unsigned int msgType;
unsigned int SenderCpuId; //发出的Cpuid
unsigned int SenderPId; //发出的pid,
unsigned int RecCpuId; //收到的Cpuid,
unsigned int RecPId; //收到的pid,
unsigned int msgcontentlength; //msgContents长度
unsigned char msgContents[1]; //消息内容
}DT_MSG_TRACE_DATA_STRU_Common;
//传向Socket的5G产品的Service消息
typedef struct
{
DT_MSG_TRACE_HEADER;
unsigned int SenderServiceID; // 服务提供者ID
unsigned int ReceiverServiceID; // 服务使用者ID
unsigned int ServiceType; // 服务类型ID
unsigned int ServiceID; // API或者ABI的ID
unsigned int MsgContentSize; // 原始服务消息长度
unsigned char MsgContents[1]; // 原始消息内容
} DT_MSG_TRACE_DATA_STRU_SERVICE;
#pragma pack(pop)
/*MessageStruct,统一的消息头结构*/
typedef struct
{
unsigned int ulMsgHead; /*消息头4字节统一为0xf634f634*/
unsigned int ulMsgLen; /*消息总长度(包括消息体)4字节*/
unsigned int ulMsgHeadLen; /*消息头长度4字节*/
unsigned int ulVersionId; /*版本号4字节目前为0x00000001*/
unsigned char aucdate_time[24]; /*消息发送时间24字节字符串如2009-08-24 12:13:15.999 */
unsigned int ulReserved; /*保留字节*/
unsigned int ulSource; /*发送的消息类型值域0-1,具体意义见上面的ulSource宏定义*/
unsigned int ulLogtype; /*消息的打印级别值域0-9,具体意义见上面的ulLogtype宏定义*/
unsigned int ulMsgBodyLen; /*消息体长度*/
} MsgStruct;
#define SERVERPORT 6868
#define LOCALPORT 7878
/*udpSocket消息通信类定义*/
/*请不要自己直接使用下面的类,否则会给定位问题带来麻烦*/
class UdpSocket
{
public:
UdpSocket(void);
~UdpSocket(void);
private:
UINT32 m_localPort;
std::string m_strServerIP;
SOCKET m_hHandle;
sockaddr_in addrTo;
bool m_bTraceFlag;
bool m_bPortTraceFlag; /*串口开关*/
bool m_bDocPrintFlag; /*Doc界面打印开关*/
std::string m_SuiteName; /*当前发送消息的测试套名称*/
std::string m_preSuiteName; /*上一个测试套名称*/
std::string m_CaseName; /*测试用例名称*/
HANDLE m_FileHandle; /*记录串口消息的文件句柄*/
std::string m_fileFolderPath; /*创建的AutoStar文件夹的路径*/
bool m_bNewFileFlag;
int Init_Socket(); /*socket初始化*/
int CreateSocket(void); /*创建socket*/
int MessageSend(UINT32 ulSource, UINT32 ulLogtype, UINT32 usDataLen, UINT8 *poctData); /*消息发送*/
int WritePortMessageToTxt(UINT32 ulLogtype, UINT8 *poctData); /*写串口消息到文本*/
unsigned int DT_MessageHead_INT32(UINT32 ucProt, UINT32 ucDirection, UINT8 *pstrMsgType, UINT32 usDataLen, UINT8 *poctData, UINT8 *pOutData, UINT32 msgFlag);
unsigned int DT_MessageHead_INT8(UINT32 ucProt, UINT32 ucDirection, UINT8 *pstrMsgType, UINT32 usDataLen, UINT8 *poctData, UINT8 *pOutData, UINT32 msgFlag);
unsigned int DT_MessageHead_NodeB(UINT32 MsgType, UINT32 SenderCpuId, UINT32 SenderPId, UINT32 RecCpuId, UINT32 RecPId, UINT32 usDataLen, UINT8 *poctData, UINT8 *pOutData);
unsigned int DT_MessageHead_LTE(UINT32 MsgType, UINT32 SenderCpuId, UINT32 SenderPId, UINT32 RecCpuId, UINT32 RecPId, UINT32 usDataLen, UINT8 *poctData, UINT8 *pOutData);
unsigned int DT_MessageHead_InnerMsg(UINT32 MsgType, UINT32 SenderCpuId, UINT32 SenderPId, UINT32 RecCpuId, UINT32 RecPId, UINT32 usDataLen, UINT8 *poctData, UINT8 *pOutData);
public:
int SocketBind(void); /*socket绑定*/
int UdpSendMessage(UINT32 ulSource, UINT32 ulLogtype, UINT32 usDataLen, UINT8 *poctData); /*消息发送*/
int ReceiveMessage(UINT8 *recvData); /*消息接收*/
int CloseSocket(void); /*socket关闭*/
int SetServerIP(std::string strIP);
int SetLocalPort(UINT32 localPort);
int OpenTrace(bool bTrace); /*消息发送开关*/
int ComportMsgPrint(bool bFlag); /*串口打印开关*/
int SetSuiteCaseName(const char *pSuiteName, const char *pCaseName);
void DT_SendMessageToTracer_INT32(UINT32 ulSource, UINT32 ucProt, UINT32 ucDirection, UINT32 MsgType, UINT32 usDataLen, UINT8 *poctData); /*INT32的消息类型的消息发送*/
void DT_SendMessageToTracer_INT8(UINT32 ulSource, UINT32 ucProt, UINT32 ucDirection, UINT8 *pstrMsgType, UINT32 usDataLen, UINT8 *poctData); /*字符串的消息类型的消息发送*/
void DT_SendMessageToTracer_NodeB(UINT32 MsgType, UINT32 SenderCpuId, UINT32 SenderPId, UINT32 RecCpuId, UINT32 RecPId, UINT32 usDataLen, UINT8 *poctData); /*NodeB的消息发送*/
void DT_SendMessageToTracer_LTE(UINT32 MsgType, UINT32 SenderCpuId, UINT32 SenderPId, UINT32 RecCpuId, UINT32 RecPId, UINT32 usDataLen, UINT8 *poctData); /*NodeB的消息发送*/
void DT_SendMessageToTracer_InnerMsg(UINT32 MsgType, UINT32 SenderCpuId, UINT32 SenderPId, UINT32 RecCpuId, UINT32 RecPId, UINT32 usDataLen, UINT8 *poctData); /*NodeB的消息发送*/
void DT_SendMessageToTracer_ServiceMsg( // 5G产品, 服务消息跟踪
UINT32 ulSource,
UINT32 SenderServiceId,
UINT32 ReceiverServiceId,
UINT32 ServiceType, // 0 : ABI 1 : API
UINT32 ServiceID, // API ID or ABI ID
UINT32 usDataLen,
UINT8 *poctData);
bool GetPrintDocFlag(); /*获取Doc界面打印开关*/
void SetPrintDocFlag(bool bFlag); /*设置Doc界面打印开关*/
void SetNewFileCreateFlag(bool bFlag); /*设置串口打印重定向到文件时,本进程范围内不覆盖之前的打印*/
};
}

View File

@@ -0,0 +1,283 @@
// Copyright 2005, Google Inc.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// Author: wan@google.com (Zhanyong Wan)
//
// The Google C++ Testing Framework (Google Test)
//
// This header file defines the public API for death tests. It is
// #included by gtest.h so a user doesn't need to include this
// directly.
#ifndef GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_
#define GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_
#include "gtest/internal/gtest-death-test-internal.h"
namespace testing {
// This flag controls the style of death tests. Valid values are "threadsafe",
// meaning that the death test child process will re-execute the test binary
// from the start, running only a single death test, or "fast",
// meaning that the child process will execute the test logic immediately
// after forking.
GTEST_DECLARE_string_(death_test_style);
#if GTEST_HAS_DEATH_TEST
// The following macros are useful for writing death tests.
// Here's what happens when an ASSERT_DEATH* or EXPECT_DEATH* is
// executed:
//
// 1. It generates a warning if there is more than one active
// thread. This is because it's safe to fork() or clone() only
// when there is a single thread.
//
// 2. The parent process clone()s a sub-process and runs the death
// test in it; the sub-process exits with code 0 at the end of the
// death test, if it hasn't exited already.
//
// 3. The parent process waits for the sub-process to terminate.
//
// 4. The parent process checks the exit code and error message of
// the sub-process.
//
// Examples:
//
// ASSERT_DEATH(server.SendMessage(56, "Hello"), "Invalid port number");
// for (int i = 0; i < 5; i++) {
// EXPECT_DEATH(server.ProcessRequest(i),
// "Invalid request .* in ProcessRequest()")
// << "Failed to die on request " << i);
// }
//
// ASSERT_EXIT(server.ExitNow(), ::testing::ExitedWithCode(0), "Exiting");
//
// bool KilledBySIGHUP(int exit_code) {
// return WIFSIGNALED(exit_code) && WTERMSIG(exit_code) == SIGHUP;
// }
//
// ASSERT_EXIT(client.HangUpServer(), KilledBySIGHUP, "Hanging up!");
//
// On the regular expressions used in death tests:
//
// On POSIX-compliant systems (*nix), we use the <regex.h> library,
// which uses the POSIX extended regex syntax.
//
// On other platforms (e.g. Windows), we only support a simple regex
// syntax implemented as part of Google Test. This limited
// implementation should be enough most of the time when writing
// death tests; though it lacks many features you can find in PCRE
// or POSIX extended regex syntax. For example, we don't support
// union ("x|y"), grouping ("(xy)"), brackets ("[xy]"), and
// repetition count ("x{5,7}"), among others.
//
// Below is the syntax that we do support. We chose it to be a
// subset of both PCRE and POSIX extended regex, so it's easy to
// learn wherever you come from. In the following: 'A' denotes a
// literal character, period (.), or a single \\ escape sequence;
// 'x' and 'y' denote regular expressions; 'm' and 'n' are for
// natural numbers.
//
// c matches any literal character c
// \\d matches any decimal digit
// \\D matches any character that's not a decimal digit
// \\f matches \f
// \\n matches \n
// \\r matches \r
// \\s matches any ASCII whitespace, including \n
// \\S matches any character that's not a whitespace
// \\t matches \t
// \\v matches \v
// \\w matches any letter, _, or decimal digit
// \\W matches any character that \\w doesn't match
// \\c matches any literal character c, which must be a punctuation
// . matches any single character except \n
// A? matches 0 or 1 occurrences of A
// A* matches 0 or many occurrences of A
// A+ matches 1 or many occurrences of A
// ^ matches the beginning of a string (not that of each line)
// $ matches the end of a string (not that of each line)
// xy matches x followed by y
//
// If you accidentally use PCRE or POSIX extended regex features
// not implemented by us, you will get a run-time failure. In that
// case, please try to rewrite your regular expression within the
// above syntax.
//
// This implementation is *not* meant to be as highly tuned or robust
// as a compiled regex library, but should perform well enough for a
// death test, which already incurs significant overhead by launching
// a child process.
//
// Known caveats:
//
// A "threadsafe" style death test obtains the path to the test
// program from argv[0] and re-executes it in the sub-process. For
// simplicity, the current implementation doesn't search the PATH
// when launching the sub-process. This means that the user must
// invoke the test program via a path that contains at least one
// path separator (e.g. path/to/foo_test and
// /absolute/path/to/bar_test are fine, but foo_test is not). This
// is rarely a problem as people usually don't put the test binary
// directory in PATH.
//
// TODO(wan@google.com): make thread-safe death tests search the PATH.
// Asserts that a given statement causes the program to exit, with an
// integer exit status that satisfies predicate, and emitting error output
// that matches regex.
# define ASSERT_EXIT(statement, predicate, regex) \
GTEST_DEATH_TEST_(statement, predicate, regex, GTEST_FATAL_FAILURE_)
// Like ASSERT_EXIT, but continues on to successive tests in the
// test case, if any:
# define EXPECT_EXIT(statement, predicate, regex) \
GTEST_DEATH_TEST_(statement, predicate, regex, GTEST_NONFATAL_FAILURE_)
// Asserts that a given statement causes the program to exit, either by
// explicitly exiting with a nonzero exit code or being killed by a
// signal, and emitting error output that matches regex.
# define ASSERT_DEATH(statement, regex) \
ASSERT_EXIT(statement, ::testing::internal::ExitedUnsuccessfully, regex)
// Like ASSERT_DEATH, but continues on to successive tests in the
// test case, if any:
# define EXPECT_DEATH(statement, regex) \
EXPECT_EXIT(statement, ::testing::internal::ExitedUnsuccessfully, regex)
// Two predicate classes that can be used in {ASSERT,EXPECT}_EXIT*:
// Tests that an exit code describes a normal exit with a given exit code.
class GTEST_API_ ExitedWithCode {
public:
explicit ExitedWithCode(int exit_code);
bool operator()(int exit_status) const;
private:
// No implementation - assignment is unsupported.
void operator=(const ExitedWithCode& other);
const int exit_code_;
};
# if !GTEST_OS_WINDOWS
// Tests that an exit code describes an exit due to termination by a
// given signal.
class GTEST_API_ KilledBySignal {
public:
explicit KilledBySignal(int signum);
bool operator()(int exit_status) const;
private:
const int signum_;
};
# endif // !GTEST_OS_WINDOWS
// EXPECT_DEBUG_DEATH asserts that the given statements die in debug mode.
// The death testing framework causes this to have interesting semantics,
// since the sideeffects of the call are only visible in opt mode, and not
// in debug mode.
//
// In practice, this can be used to test functions that utilize the
// LOG(DFATAL) macro using the following style:
//
// int DieInDebugOr12(int* sideeffect) {
// if (sideeffect) {
// *sideeffect = 12;
// }
// LOG(DFATAL) << "death";
// return 12;
// }
//
// TEST(TestCase, TestDieOr12WorksInDgbAndOpt) {
// int sideeffect = 0;
// // Only asserts in dbg.
// EXPECT_DEBUG_DEATH(DieInDebugOr12(&sideeffect), "death");
//
// #ifdef NDEBUG
// // opt-mode has sideeffect visible.
// EXPECT_EQ(12, sideeffect);
// #else
// // dbg-mode no visible sideeffect.
// EXPECT_EQ(0, sideeffect);
// #endif
// }
//
// This will assert that DieInDebugReturn12InOpt() crashes in debug
// mode, usually due to a DCHECK or LOG(DFATAL), but returns the
// appropriate fallback value (12 in this case) in opt mode. If you
// need to test that a function has appropriate side-effects in opt
// mode, include assertions against the side-effects. A general
// pattern for this is:
//
// EXPECT_DEBUG_DEATH({
// // Side-effects here will have an effect after this statement in
// // opt mode, but none in debug mode.
// EXPECT_EQ(12, DieInDebugOr12(&sideeffect));
// }, "death");
//
# ifdef NDEBUG
# define EXPECT_DEBUG_DEATH(statement, regex) \
do { statement; } while (::testing::internal::AlwaysFalse())
# define ASSERT_DEBUG_DEATH(statement, regex) \
do { statement; } while (::testing::internal::AlwaysFalse())
# else
# define EXPECT_DEBUG_DEATH(statement, regex) \
EXPECT_DEATH(statement, regex)
# define ASSERT_DEBUG_DEATH(statement, regex) \
ASSERT_DEATH(statement, regex)
# endif // NDEBUG for EXPECT_DEBUG_DEATH
#endif // GTEST_HAS_DEATH_TEST
// EXPECT_DEATH_IF_SUPPORTED(statement, regex) and
// ASSERT_DEATH_IF_SUPPORTED(statement, regex) expand to real death tests if
// death tests are supported; otherwise they just issue a warning. This is
// useful when you are combining death test assertions with normal test
// assertions in one test.
#if GTEST_HAS_DEATH_TEST
# define EXPECT_DEATH_IF_SUPPORTED(statement, regex) \
EXPECT_DEATH(statement, regex)
# define ASSERT_DEATH_IF_SUPPORTED(statement, regex) \
ASSERT_DEATH(statement, regex)
#else
# define EXPECT_DEATH_IF_SUPPORTED(statement, regex) \
GTEST_UNSUPPORTED_DEATH_TEST_(statement, regex, )
# define ASSERT_DEATH_IF_SUPPORTED(statement, regex) \
GTEST_UNSUPPORTED_DEATH_TEST_(statement, regex, return)
#endif
} // namespace testing
#endif // GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_

View File

@@ -0,0 +1,230 @@
// Copyright 2005, Google Inc.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// Author: wan@google.com (Zhanyong Wan)
//
// The Google C++ Testing Framework (Google Test)
//
// This header file defines the Message class.
//
// IMPORTANT NOTE: Due to limitation of the C++ language, we have to
// leave some internal implementation details in this header file.
// They are clearly marked by comments like this:
//
// // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
//
// Such code is NOT meant to be used by a user directly, and is subject
// to CHANGE WITHOUT NOTICE. Therefore DO NOT DEPEND ON IT in a user
// program!
#ifndef GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_
#define GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_
#include <limits>
#include "gtest/internal/gtest-string.h"
#include "gtest/internal/gtest-internal.h"
namespace testing {
// The Message class works like an ostream repeater.
//
// Typical usage:
//
// 1. You stream a bunch of values to a Message object.
// It will remember the text in a stringstream.
// 2. Then you stream the Message object to an ostream.
// This causes the text in the Message to be streamed
// to the ostream.
//
// For example;
//
// testing::Message foo;
// foo << 1 << " != " << 2;
// std::cout << foo;
//
// will print "1 != 2".
//
// Message is not intended to be inherited from. In particular, its
// destructor is not virtual.
//
// Note that stringstream behaves differently in gcc and in MSVC. You
// can stream a NULL char pointer to it in the former, but not in the
// latter (it causes an access violation if you do). The Message
// class hides this difference by treating a NULL char pointer as
// "(null)".
class GTEST_API_ Message {
private:
// The type of basic IO manipulators (endl, ends, and flush) for
// narrow streams.
typedef std::ostream& (*BasicNarrowIoManip)(std::ostream&);
public:
// Constructs an empty Message.
// We allocate the stringstream separately because otherwise each use of
// ASSERT/EXPECT in a procedure adds over 200 bytes to the procedure's
// stack frame leading to huge stack frames in some cases; gcc does not reuse
// the stack space.
Message() : ss_(new ::std::stringstream) {
// By default, we want there to be enough precision when printing
// a double to a Message.
*ss_ << std::setprecision(std::numeric_limits<double>::digits10 + 2);
}
// Copy constructor.
Message(const Message& msg) : ss_(new ::std::stringstream) { // NOLINT
*ss_ << msg.GetString();
}
// Constructs a Message from a C-string.
explicit Message(const char* str) : ss_(new ::std::stringstream) {
*ss_ << str;
}
#if GTEST_OS_SYMBIAN
// Streams a value (either a pointer or not) to this object.
template <typename T>
inline Message& operator <<(const T& value) {
StreamHelper(typename internal::is_pointer<T>::type(), value);
return *this;
}
#else
// Streams a non-pointer value to this object.
template <typename T>
inline Message& operator <<(const T& val) {
::GTestStreamToHelper(ss_.get(), val);
return *this;
}
// Streams a pointer value to this object.
//
// This function is an overload of the previous one. When you
// stream a pointer to a Message, this definition will be used as it
// is more specialized. (The C++ Standard, section
// [temp.func.order].) If you stream a non-pointer, then the
// previous definition will be used.
//
// The reason for this overload is that streaming a NULL pointer to
// ostream is undefined behavior. Depending on the compiler, you
// may get "0", "(nil)", "(null)", or an access violation. To
// ensure consistent result across compilers, we always treat NULL
// as "(null)".
template <typename T>
inline Message& operator <<(T* const& pointer) { // NOLINT
if (pointer == NULL) {
*ss_ << "(null)";
} else {
::GTestStreamToHelper(ss_.get(), pointer);
}
return *this;
}
#endif // GTEST_OS_SYMBIAN
// Since the basic IO manipulators are overloaded for both narrow
// and wide streams, we have to provide this specialized definition
// of operator <<, even though its body is the same as the
// templatized version above. Without this definition, streaming
// endl or other basic IO manipulators to Message will confuse the
// compiler.
Message& operator <<(BasicNarrowIoManip val) {
*ss_ << val;
return *this;
}
// Instead of 1/0, we want to see true/false for bool values.
Message& operator <<(bool b) {
return *this << (b ? "true" : "false");
}
// These two overloads allow streaming a wide C string to a Message
// using the UTF-8 encoding.
Message& operator <<(const wchar_t* wide_c_str) {
return *this << internal::String::ShowWideCString(wide_c_str);
}
Message& operator <<(wchar_t* wide_c_str) {
return *this << internal::String::ShowWideCString(wide_c_str);
}
#if GTEST_HAS_STD_WSTRING
// Converts the given wide string to a narrow string using the UTF-8
// encoding, and streams the result to this Message object.
Message& operator <<(const ::std::wstring& wstr);
#endif // GTEST_HAS_STD_WSTRING
#if GTEST_HAS_GLOBAL_WSTRING
// Converts the given wide string to a narrow string using the UTF-8
// encoding, and streams the result to this Message object.
Message& operator <<(const ::wstring& wstr);
#endif // GTEST_HAS_GLOBAL_WSTRING
// Gets the text streamed to this object so far as a String.
// Each '\0' character in the buffer is replaced with "\\0".
//
// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
internal::String GetString() const {
return internal::StringStreamToString(ss_.get());
}
private:
#if GTEST_OS_SYMBIAN
// These are needed as the Nokia Symbian Compiler cannot decide between
// const T& and const T* in a function template. The Nokia compiler _can_
// decide between class template specializations for T and T*, so a
// tr1::type_traits-like is_pointer works, and we can overload on that.
template <typename T>
inline void StreamHelper(internal::true_type /*dummy*/, T* pointer) {
if (pointer == NULL) {
*ss_ << "(null)";
} else {
::GTestStreamToHelper(ss_.get(), pointer);
}
}
template <typename T>
inline void StreamHelper(internal::false_type /*dummy*/, const T& value) {
::GTestStreamToHelper(ss_.get(), value);
}
#endif // GTEST_OS_SYMBIAN
// We'll hold the text streamed to this object here.
const internal::scoped_ptr< ::std::stringstream> ss_;
// We declare (but don't implement) this to prevent the compiler
// from implementing the assignment operator.
void operator=(const Message&);
};
// Streams a Message to an ostream.
inline std::ostream& operator <<(std::ostream& os, const Message& sb) {
return os << sb.GetString();
}
} // namespace testing
#endif // GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,796 @@
// Copyright 2007, Google Inc.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// Author: wan@google.com (Zhanyong Wan)
// Google Test - The Google C++ Testing Framework
//
// This file implements a universal value printer that can print a
// value of any type T:
//
// void ::testing::internal::UniversalPrinter<T>::Print(value, ostream_ptr);
//
// A user can teach this function how to print a class type T by
// defining either operator<<() or PrintTo() in the namespace that
// defines T. More specifically, the FIRST defined function in the
// following list will be used (assuming T is defined in namespace
// foo):
//
// 1. foo::PrintTo(const T&, ostream*)
// 2. operator<<(ostream&, const T&) defined in either foo or the
// global namespace.
//
// If none of the above is defined, it will print the debug string of
// the value if it is a protocol buffer, or print the raw bytes in the
// value otherwise.
//
// To aid debugging: when T is a reference type, the address of the
// value is also printed; when T is a (const) char pointer, both the
// pointer value and the NUL-terminated string it points to are
// printed.
//
// We also provide some convenient wrappers:
//
// // Prints a value to a string. For a (const or not) char
// // pointer, the NUL-terminated string (but not the pointer) is
// // printed.
// std::string ::testing::PrintToString(const T& value);
//
// // Prints a value tersely: for a reference type, the referenced
// // value (but not the address) is printed; for a (const or not) char
// // pointer, the NUL-terminated string (but not the pointer) is
// // printed.
// void ::testing::internal::UniversalTersePrint(const T& value, ostream*);
//
// // Prints value using the type inferred by the compiler. The difference
// // from UniversalTersePrint() is that this function prints both the
// // pointer and the NUL-terminated string for a (const or not) char pointer.
// void ::testing::internal::UniversalPrint(const T& value, ostream*);
//
// // Prints the fields of a tuple tersely to a string vector, one
// // element for each field. Tuple support must be enabled in
// // gtest-port.h.
// std::vector<string> UniversalTersePrintTupleFieldsToStrings(
// const Tuple& value);
//
// Known limitation:
//
// The print primitives print the elements of an STL-style container
// using the compiler-inferred type of *iter where iter is a
// const_iterator of the container. When const_iterator is an input
// iterator but not a forward iterator, this inferred type may not
// match value_type, and the print output may be incorrect. In
// practice, this is rarely a problem as for most containers
// const_iterator is a forward iterator. We'll fix this if there's an
// actual need for it. Note that this fix cannot rely on value_type
// being defined as many user-defined container types don't have
// value_type.
#ifndef GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_
#define GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_
#include <ostream> // NOLINT
#include <sstream>
#include <string>
#include <utility>
#include <vector>
#include "gtest/internal/gtest-port.h"
#include "gtest/internal/gtest-internal.h"
namespace testing {
// Definitions in the 'internal' and 'internal2' name spaces are
// subject to change without notice. DO NOT USE THEM IN USER CODE!
namespace internal2 {
// Prints the given number of bytes in the given object to the given
// ostream.
GTEST_API_ void PrintBytesInObjectTo(const unsigned char* obj_bytes,
size_t count,
::std::ostream* os);
// For selecting which printer to use when a given type has neither <<
// nor PrintTo().
enum TypeKind {
kProtobuf, // a protobuf type
kConvertibleToInteger, // a type implicitly convertible to BiggestInt
// (e.g. a named or unnamed enum type)
kOtherType // anything else
};
// TypeWithoutFormatter<T, kTypeKind>::PrintValue(value, os) is called
// by the universal printer to print a value of type T when neither
// operator<< nor PrintTo() is defined for T, where kTypeKind is the
// "kind" of T as defined by enum TypeKind.
template <typename T, TypeKind kTypeKind>
class TypeWithoutFormatter {
public:
// This default version is called when kTypeKind is kOtherType.
static void PrintValue(const T& value, ::std::ostream* os) {
PrintBytesInObjectTo(reinterpret_cast<const unsigned char*>(&value),
sizeof(value), os);
}
};
// We print a protobuf using its ShortDebugString() when the string
// doesn't exceed this many characters; otherwise we print it using
// DebugString() for better readability.
const size_t kProtobufOneLinerMaxLength = 50;
template <typename T>
class TypeWithoutFormatter<T, kProtobuf> {
public:
static void PrintValue(const T& value, ::std::ostream* os) {
const ::testing::internal::string short_str = value.ShortDebugString();
const ::testing::internal::string pretty_str =
short_str.length() <= kProtobufOneLinerMaxLength ?
short_str : ("\n" + value.DebugString());
*os << ("<" + pretty_str + ">");
}
};
template <typename T>
class TypeWithoutFormatter<T, kConvertibleToInteger> {
public:
// Since T has no << operator or PrintTo() but can be implicitly
// converted to BiggestInt, we print it as a BiggestInt.
//
// Most likely T is an enum type (either named or unnamed), in which
// case printing it as an integer is the desired behavior. In case
// T is not an enum, printing it as an integer is the best we can do
// given that it has no user-defined printer.
static void PrintValue(const T& value, ::std::ostream* os) {
const internal::BiggestInt kBigInt = value;
*os << kBigInt;
}
};
// Prints the given value to the given ostream. If the value is a
// protocol message, its debug string is printed; if it's an enum or
// of a type implicitly convertible to BiggestInt, it's printed as an
// integer; otherwise the bytes in the value are printed. This is
// what UniversalPrinter<T>::Print() does when it knows nothing about
// type T and T has neither << operator nor PrintTo().
//
// A user can override this behavior for a class type Foo by defining
// a << operator in the namespace where Foo is defined.
//
// We put this operator in namespace 'internal2' instead of 'internal'
// to simplify the implementation, as much code in 'internal' needs to
// use << in STL, which would conflict with our own << were it defined
// in 'internal'.
//
// Note that this operator<< takes a generic std::basic_ostream<Char,
// CharTraits> type instead of the more restricted std::ostream. If
// we define it to take an std::ostream instead, we'll get an
// "ambiguous overloads" compiler error when trying to print a type
// Foo that supports streaming to std::basic_ostream<Char,
// CharTraits>, as the compiler cannot tell whether
// operator<<(std::ostream&, const T&) or
// operator<<(std::basic_stream<Char, CharTraits>, const Foo&) is more
// specific.
template <typename Char, typename CharTraits, typename T>
::std::basic_ostream<Char, CharTraits>& operator<<(
::std::basic_ostream<Char, CharTraits>& os, const T& x) {
TypeWithoutFormatter<T,
(internal::IsAProtocolMessage<T>::value ? kProtobuf :
internal::ImplicitlyConvertible<const T&, internal::BiggestInt>::value ?
kConvertibleToInteger : kOtherType)>::PrintValue(x, &os);
return os;
}
} // namespace internal2
} // namespace testing
// This namespace MUST NOT BE NESTED IN ::testing, or the name look-up
// magic needed for implementing UniversalPrinter won't work.
namespace testing_internal {
// Used to print a value that is not an STL-style container when the
// user doesn't define PrintTo() for it.
template <typename T>
void DefaultPrintNonContainerTo(const T& value, ::std::ostream* os) {
// With the following statement, during unqualified name lookup,
// testing::internal2::operator<< appears as if it was declared in
// the nearest enclosing namespace that contains both
// ::testing_internal and ::testing::internal2, i.e. the global
// namespace. For more details, refer to the C++ Standard section
// 7.3.4-1 [namespace.udir]. This allows us to fall back onto
// testing::internal2::operator<< in case T doesn't come with a <<
// operator.
//
// We cannot write 'using ::testing::internal2::operator<<;', which
// gcc 3.3 fails to compile due to a compiler bug.
using namespace ::testing::internal2; // NOLINT
// Assuming T is defined in namespace foo, in the next statement,
// the compiler will consider all of:
//
// 1. foo::operator<< (thanks to Koenig look-up),
// 2. ::operator<< (as the current namespace is enclosed in ::),
// 3. testing::internal2::operator<< (thanks to the using statement above).
//
// The operator<< whose type matches T best will be picked.
//
// We deliberately allow #2 to be a candidate, as sometimes it's
// impossible to define #1 (e.g. when foo is ::std, defining
// anything in it is undefined behavior unless you are a compiler
// vendor.).
*os << value;
}
} // namespace testing_internal
namespace testing {
namespace internal {
// UniversalPrinter<T>::Print(value, ostream_ptr) prints the given
// value to the given ostream. The caller must ensure that
// 'ostream_ptr' is not NULL, or the behavior is undefined.
//
// We define UniversalPrinter as a class template (as opposed to a
// function template), as we need to partially specialize it for
// reference types, which cannot be done with function templates.
template <typename T>
class UniversalPrinter;
template <typename T>
void UniversalPrint(const T& value, ::std::ostream* os);
// Used to print an STL-style container when the user doesn't define
// a PrintTo() for it.
template <typename C>
void DefaultPrintTo(IsContainer /* dummy */,
false_type /* is not a pointer */,
const C& container, ::std::ostream* os) {
const size_t kMaxCount = 32; // The maximum number of elements to print.
*os << '{';
size_t count = 0;
for (typename C::const_iterator it = container.begin();
it != container.end(); ++it, ++count) {
if (count > 0) {
*os << ',';
if (count == kMaxCount) { // Enough has been printed.
*os << " ...";
break;
}
}
*os << ' ';
// We cannot call PrintTo(*it, os) here as PrintTo() doesn't
// handle *it being a native array.
internal::UniversalPrint(*it, os);
}
if (count > 0) {
*os << ' ';
}
*os << '}';
}
// Used to print a pointer that is neither a char pointer nor a member
// pointer, when the user doesn't define PrintTo() for it. (A member
// variable pointer or member function pointer doesn't really point to
// a location in the address space. Their representation is
// implementation-defined. Therefore they will be printed as raw
// bytes.)
template <typename T>
void DefaultPrintTo(IsNotContainer /* dummy */,
true_type /* is a pointer */,
T* p, ::std::ostream* os) {
if (p == NULL) {
*os << "NULL";
} else {
// C++ doesn't allow casting from a function pointer to any object
// pointer.
//
// IsTrue() silences warnings: "Condition is always true",
// "unreachable code".
if (IsTrue(ImplicitlyConvertible<T*, const void*>::value)) {
// T is not a function type. We just call << to print p,
// relying on ADL to pick up user-defined << for their pointer
// types, if any.
*os << p;
} else {
// T is a function type, so '*os << p' doesn't do what we want
// (it just prints p as bool). We want to print p as a const
// void*. However, we cannot cast it to const void* directly,
// even using reinterpret_cast, as earlier versions of gcc
// (e.g. 3.4.5) cannot compile the cast when p is a function
// pointer. Casting to UInt64 first solves the problem.
*os << reinterpret_cast<const void*>(
reinterpret_cast<internal::UInt64>(p));
}
}
}
// Used to print a non-container, non-pointer value when the user
// doesn't define PrintTo() for it.
template <typename T>
void DefaultPrintTo(IsNotContainer /* dummy */,
false_type /* is not a pointer */,
const T& value, ::std::ostream* os) {
::testing_internal::DefaultPrintNonContainerTo(value, os);
}
// Prints the given value using the << operator if it has one;
// otherwise prints the bytes in it. This is what
// UniversalPrinter<T>::Print() does when PrintTo() is not specialized
// or overloaded for type T.
//
// A user can override this behavior for a class type Foo by defining
// an overload of PrintTo() in the namespace where Foo is defined. We
// give the user this option as sometimes defining a << operator for
// Foo is not desirable (e.g. the coding style may prevent doing it,
// or there is already a << operator but it doesn't do what the user
// wants).
template <typename T>
void PrintTo(const T& value, ::std::ostream* os) {
// DefaultPrintTo() is overloaded. The type of its first two
// arguments determine which version will be picked. If T is an
// STL-style container, the version for container will be called; if
// T is a pointer, the pointer version will be called; otherwise the
// generic version will be called.
//
// Note that we check for container types here, prior to we check
// for protocol message types in our operator<<. The rationale is:
//
// For protocol messages, we want to give people a chance to
// override Google Mock's format by defining a PrintTo() or
// operator<<. For STL containers, other formats can be
// incompatible with Google Mock's format for the container
// elements; therefore we check for container types here to ensure
// that our format is used.
//
// The second argument of DefaultPrintTo() is needed to bypass a bug
// in Symbian's C++ compiler that prevents it from picking the right
// overload between:
//
// PrintTo(const T& x, ...);
// PrintTo(T* x, ...);
DefaultPrintTo(IsContainerTest<T>(0), is_pointer<T>(), value, os);
}
// The following list of PrintTo() overloads tells
// UniversalPrinter<T>::Print() how to print standard types (built-in
// types, strings, plain arrays, and pointers).
// Overloads for various char types.
GTEST_API_ void PrintTo(unsigned char c, ::std::ostream* os);
GTEST_API_ void PrintTo(signed char c, ::std::ostream* os);
inline void PrintTo(char c, ::std::ostream* os) {
// When printing a plain char, we always treat it as unsigned. This
// way, the output won't be affected by whether the compiler thinks
// char is signed or not.
PrintTo(static_cast<unsigned char>(c), os);
}
// Overloads for other simple built-in types.
inline void PrintTo(bool x, ::std::ostream* os) {
*os << (x ? "true" : "false");
}
// Overload for wchar_t type.
// Prints a wchar_t as a symbol if it is printable or as its internal
// code otherwise and also as its decimal code (except for L'\0').
// The L'\0' char is printed as "L'\\0'". The decimal code is printed
// as signed integer when wchar_t is implemented by the compiler
// as a signed type and is printed as an unsigned integer when wchar_t
// is implemented as an unsigned type.
GTEST_API_ void PrintTo(wchar_t wc, ::std::ostream* os);
// Overloads for C strings.
GTEST_API_ void PrintTo(const char* s, ::std::ostream* os);
inline void PrintTo(char* s, ::std::ostream* os) {
PrintTo(ImplicitCast_<const char*>(s), os);
}
// signed/unsigned char is often used for representing binary data, so
// we print pointers to it as void* to be safe.
inline void PrintTo(const signed char* s, ::std::ostream* os) {
PrintTo(ImplicitCast_<const void*>(s), os);
}
inline void PrintTo(signed char* s, ::std::ostream* os) {
PrintTo(ImplicitCast_<const void*>(s), os);
}
inline void PrintTo(const unsigned char* s, ::std::ostream* os) {
PrintTo(ImplicitCast_<const void*>(s), os);
}
inline void PrintTo(unsigned char* s, ::std::ostream* os) {
PrintTo(ImplicitCast_<const void*>(s), os);
}
// MSVC can be configured to define wchar_t as a typedef of unsigned
// short. It defines _NATIVE_WCHAR_T_DEFINED when wchar_t is a native
// type. When wchar_t is a typedef, defining an overload for const
// wchar_t* would cause unsigned short* be printed as a wide string,
// possibly causing invalid memory accesses.
#if !defined(_MSC_VER) || defined(_NATIVE_WCHAR_T_DEFINED)
// Overloads for wide C strings
GTEST_API_ void PrintTo(const wchar_t* s, ::std::ostream* os);
inline void PrintTo(wchar_t* s, ::std::ostream* os) {
PrintTo(ImplicitCast_<const wchar_t*>(s), os);
}
#endif
// Overload for C arrays. Multi-dimensional arrays are printed
// properly.
// Prints the given number of elements in an array, without printing
// the curly braces.
template <typename T>
void PrintRawArrayTo(const T a[], size_t count, ::std::ostream* os) {
UniversalPrint(a[0], os);
for (size_t i = 1; i != count; i++) {
*os << ", ";
UniversalPrint(a[i], os);
}
}
// Overloads for ::string and ::std::string.
#if GTEST_HAS_GLOBAL_STRING
GTEST_API_ void PrintStringTo(const ::string&s, ::std::ostream* os);
inline void PrintTo(const ::string& s, ::std::ostream* os) {
PrintStringTo(s, os);
}
#endif // GTEST_HAS_GLOBAL_STRING
GTEST_API_ void PrintStringTo(const ::std::string&s, ::std::ostream* os);
inline void PrintTo(const ::std::string& s, ::std::ostream* os) {
PrintStringTo(s, os);
}
// Overloads for ::wstring and ::std::wstring.
#if GTEST_HAS_GLOBAL_WSTRING
GTEST_API_ void PrintWideStringTo(const ::wstring&s, ::std::ostream* os);
inline void PrintTo(const ::wstring& s, ::std::ostream* os) {
PrintWideStringTo(s, os);
}
#endif // GTEST_HAS_GLOBAL_WSTRING
#if GTEST_HAS_STD_WSTRING
GTEST_API_ void PrintWideStringTo(const ::std::wstring&s, ::std::ostream* os);
inline void PrintTo(const ::std::wstring& s, ::std::ostream* os) {
PrintWideStringTo(s, os);
}
#endif // GTEST_HAS_STD_WSTRING
#if GTEST_HAS_TR1_TUPLE
// Overload for ::std::tr1::tuple. Needed for printing function arguments,
// which are packed as tuples.
// Helper function for printing a tuple. T must be instantiated with
// a tuple type.
template <typename T>
void PrintTupleTo(const T& t, ::std::ostream* os);
// Overloaded PrintTo() for tuples of various arities. We support
// tuples of up-to 10 fields. The following implementation works
// regardless of whether tr1::tuple is implemented using the
// non-standard variadic template feature or not.
inline void PrintTo(const ::std::tr1::tuple<>& t, ::std::ostream* os) {
PrintTupleTo(t, os);
}
template <typename T1>
void PrintTo(const ::std::tr1::tuple<T1>& t, ::std::ostream* os) {
PrintTupleTo(t, os);
}
template <typename T1, typename T2>
void PrintTo(const ::std::tr1::tuple<T1, T2>& t, ::std::ostream* os) {
PrintTupleTo(t, os);
}
template <typename T1, typename T2, typename T3>
void PrintTo(const ::std::tr1::tuple<T1, T2, T3>& t, ::std::ostream* os) {
PrintTupleTo(t, os);
}
template <typename T1, typename T2, typename T3, typename T4>
void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4>& t, ::std::ostream* os) {
PrintTupleTo(t, os);
}
template <typename T1, typename T2, typename T3, typename T4, typename T5>
void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5>& t,
::std::ostream* os) {
PrintTupleTo(t, os);
}
template <typename T1, typename T2, typename T3, typename T4, typename T5,
typename T6>
void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6>& t,
::std::ostream* os) {
PrintTupleTo(t, os);
}
template <typename T1, typename T2, typename T3, typename T4, typename T5,
typename T6, typename T7>
void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7>& t,
::std::ostream* os) {
PrintTupleTo(t, os);
}
template <typename T1, typename T2, typename T3, typename T4, typename T5,
typename T6, typename T7, typename T8>
void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8>& t,
::std::ostream* os) {
PrintTupleTo(t, os);
}
template <typename T1, typename T2, typename T3, typename T4, typename T5,
typename T6, typename T7, typename T8, typename T9>
void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9>& t,
::std::ostream* os) {
PrintTupleTo(t, os);
}
template <typename T1, typename T2, typename T3, typename T4, typename T5,
typename T6, typename T7, typename T8, typename T9, typename T10>
void PrintTo(
const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>& t,
::std::ostream* os) {
PrintTupleTo(t, os);
}
#endif // GTEST_HAS_TR1_TUPLE
// Overload for std::pair.
template <typename T1, typename T2>
void PrintTo(const ::std::pair<T1, T2>& value, ::std::ostream* os) {
*os << '(';
// We cannot use UniversalPrint(value.first, os) here, as T1 may be
// a reference type. The same for printing value.second.
UniversalPrinter<T1>::Print(value.first, os);
*os << ", ";
UniversalPrinter<T2>::Print(value.second, os);
*os << ')';
}
// Implements printing a non-reference type T by letting the compiler
// pick the right overload of PrintTo() for T.
template <typename T>
class UniversalPrinter {
public:
// MSVC warns about adding const to a function type, so we want to
// disable the warning.
#ifdef _MSC_VER
# pragma warning(push) // Saves the current warning state.
# pragma warning(disable:4180) // Temporarily disables warning 4180.
#endif // _MSC_VER
// Note: we deliberately don't call this PrintTo(), as that name
// conflicts with ::testing::internal::PrintTo in the body of the
// function.
static void Print(const T& value, ::std::ostream* os) {
// By default, ::testing::internal::PrintTo() is used for printing
// the value.
//
// Thanks to Koenig look-up, if T is a class and has its own
// PrintTo() function defined in its namespace, that function will
// be visible here. Since it is more specific than the generic ones
// in ::testing::internal, it will be picked by the compiler in the
// following statement - exactly what we want.
PrintTo(value, os);
}
#ifdef _MSC_VER
# pragma warning(pop) // Restores the warning state.
#endif // _MSC_VER
};
// UniversalPrintArray(begin, len, os) prints an array of 'len'
// elements, starting at address 'begin'.
template <typename T>
void UniversalPrintArray(const T* begin, size_t len, ::std::ostream* os) {
if (len == 0) {
*os << "{}";
} else {
*os << "{ ";
const size_t kThreshold = 18;
const size_t kChunkSize = 8;
// If the array has more than kThreshold elements, we'll have to
// omit some details by printing only the first and the last
// kChunkSize elements.
// TODO(wan@google.com): let the user control the threshold using a flag.
if (len <= kThreshold) {
PrintRawArrayTo(begin, len, os);
} else {
PrintRawArrayTo(begin, kChunkSize, os);
*os << ", ..., ";
PrintRawArrayTo(begin + len - kChunkSize, kChunkSize, os);
}
*os << " }";
}
}
// This overload prints a (const) char array compactly.
GTEST_API_ void UniversalPrintArray(const char* begin,
size_t len,
::std::ostream* os);
// Implements printing an array type T[N].
template <typename T, size_t N>
class UniversalPrinter<T[N]> {
public:
// Prints the given array, omitting some elements when there are too
// many.
static void Print(const T (&a)[N], ::std::ostream* os) {
UniversalPrintArray(a, N, os);
}
};
// Implements printing a reference type T&.
template <typename T>
class UniversalPrinter<T&> {
public:
// MSVC warns about adding const to a function type, so we want to
// disable the warning.
#ifdef _MSC_VER
# pragma warning(push) // Saves the current warning state.
# pragma warning(disable:4180) // Temporarily disables warning 4180.
#endif // _MSC_VER
static void Print(const T& value, ::std::ostream* os) {
// Prints the address of the value. We use reinterpret_cast here
// as static_cast doesn't compile when T is a function type.
*os << "@" << reinterpret_cast<const void*>(&value) << " ";
// Then prints the value itself.
UniversalPrint(value, os);
}
#ifdef _MSC_VER
# pragma warning(pop) // Restores the warning state.
#endif // _MSC_VER
};
// Prints a value tersely: for a reference type, the referenced value
// (but not the address) is printed; for a (const) char pointer, the
// NUL-terminated string (but not the pointer) is printed.
template <typename T>
void UniversalTersePrint(const T& value, ::std::ostream* os) {
UniversalPrint(value, os);
}
inline void UniversalTersePrint(const char* str, ::std::ostream* os) {
if (str == NULL) {
*os << "NULL";
} else {
UniversalPrint(string(str), os);
}
}
inline void UniversalTersePrint(char* str, ::std::ostream* os) {
UniversalTersePrint(static_cast<const char*>(str), os);
}
// Prints a value using the type inferred by the compiler. The
// difference between this and UniversalTersePrint() is that for a
// (const) char pointer, this prints both the pointer and the
// NUL-terminated string.
template <typename T>
void UniversalPrint(const T& value, ::std::ostream* os) {
UniversalPrinter<T>::Print(value, os);
}
#if GTEST_HAS_TR1_TUPLE
typedef ::std::vector<string> Strings;
// This helper template allows PrintTo() for tuples and
// UniversalTersePrintTupleFieldsToStrings() to be defined by
// induction on the number of tuple fields. The idea is that
// TuplePrefixPrinter<N>::PrintPrefixTo(t, os) prints the first N
// fields in tuple t, and can be defined in terms of
// TuplePrefixPrinter<N - 1>.
// The inductive case.
template <size_t N>
struct TuplePrefixPrinter {
// Prints the first N fields of a tuple.
template <typename Tuple>
static void PrintPrefixTo(const Tuple& t, ::std::ostream* os) {
TuplePrefixPrinter<N - 1>::PrintPrefixTo(t, os);
*os << ", ";
UniversalPrinter<typename ::std::tr1::tuple_element<N - 1, Tuple>::type>
::Print(::std::tr1::get<N - 1>(t), os);
}
// Tersely prints the first N fields of a tuple to a string vector,
// one element for each field.
template <typename Tuple>
static void TersePrintPrefixToStrings(const Tuple& t, Strings* strings) {
TuplePrefixPrinter<N - 1>::TersePrintPrefixToStrings(t, strings);
::std::stringstream ss;
UniversalTersePrint(::std::tr1::get<N - 1>(t), &ss);
strings->push_back(ss.str());
}
};
// Base cases.
template <>
struct TuplePrefixPrinter<0> {
template <typename Tuple>
static void PrintPrefixTo(const Tuple&, ::std::ostream*) {}
template <typename Tuple>
static void TersePrintPrefixToStrings(const Tuple&, Strings*) {}
};
// We have to specialize the entire TuplePrefixPrinter<> class
// template here, even though the definition of
// TersePrintPrefixToStrings() is the same as the generic version, as
// Embarcadero (formerly CodeGear, formerly Borland) C++ doesn't
// support specializing a method template of a class template.
template <>
struct TuplePrefixPrinter<1> {
template <typename Tuple>
static void PrintPrefixTo(const Tuple& t, ::std::ostream* os) {
UniversalPrinter<typename ::std::tr1::tuple_element<0, Tuple>::type>::
Print(::std::tr1::get<0>(t), os);
}
template <typename Tuple>
static void TersePrintPrefixToStrings(const Tuple& t, Strings* strings) {
::std::stringstream ss;
UniversalTersePrint(::std::tr1::get<0>(t), &ss);
strings->push_back(ss.str());
}
};
// Helper function for printing a tuple. T must be instantiated with
// a tuple type.
template <typename T>
void PrintTupleTo(const T& t, ::std::ostream* os) {
*os << "(";
TuplePrefixPrinter< ::std::tr1::tuple_size<T>::value>::
PrintPrefixTo(t, os);
*os << ")";
}
// Prints the fields of a tuple tersely to a string vector, one
// element for each field. See the comment before
// UniversalTersePrint() for how we define "tersely".
template <typename Tuple>
Strings UniversalTersePrintTupleFieldsToStrings(const Tuple& value) {
Strings result;
TuplePrefixPrinter< ::std::tr1::tuple_size<Tuple>::value>::
TersePrintPrefixToStrings(value, &result);
return result;
}
#endif // GTEST_HAS_TR1_TUPLE
} // namespace internal
template <typename T>
::std::string PrintToString(const T& value) {
::std::stringstream ss;
internal::UniversalTersePrint(value, &ss);
return ss.str();
}
} // namespace testing
#endif // GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_

View File

@@ -0,0 +1,232 @@
// Copyright 2007, Google Inc.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// Author: wan@google.com (Zhanyong Wan)
//
// Utilities for testing Google Test itself and code that uses Google Test
// (e.g. frameworks built on top of Google Test).
#ifndef GTEST_INCLUDE_GTEST_GTEST_SPI_H_
#define GTEST_INCLUDE_GTEST_GTEST_SPI_H_
#include "gtest/gtest.h"
namespace testing {
// This helper class can be used to mock out Google Test failure reporting
// so that we can test Google Test or code that builds on Google Test.
//
// An object of this class appends a TestPartResult object to the
// TestPartResultArray object given in the constructor whenever a Google Test
// failure is reported. It can either intercept only failures that are
// generated in the same thread that created this object or it can intercept
// all generated failures. The scope of this mock object can be controlled with
// the second argument to the two arguments constructor.
class GTEST_API_ ScopedFakeTestPartResultReporter
: public TestPartResultReporterInterface {
public:
// The two possible mocking modes of this object.
enum InterceptMode {
INTERCEPT_ONLY_CURRENT_THREAD, // Intercepts only thread local failures.
INTERCEPT_ALL_THREADS // Intercepts all failures.
};
// The c'tor sets this object as the test part result reporter used
// by Google Test. The 'result' parameter specifies where to report the
// results. This reporter will only catch failures generated in the current
// thread. DEPRECATED
explicit ScopedFakeTestPartResultReporter(TestPartResultArray* result);
// Same as above, but you can choose the interception scope of this object.
ScopedFakeTestPartResultReporter(InterceptMode intercept_mode,
TestPartResultArray* result);
// The d'tor restores the previous test part result reporter.
virtual ~ScopedFakeTestPartResultReporter();
// Appends the TestPartResult object to the TestPartResultArray
// received in the constructor.
//
// This method is from the TestPartResultReporterInterface
// interface.
virtual void ReportTestPartResult(const TestPartResult& result);
private:
void Init();
const InterceptMode intercept_mode_;
TestPartResultReporterInterface* old_reporter_;
TestPartResultArray* const result_;
GTEST_DISALLOW_COPY_AND_ASSIGN_(ScopedFakeTestPartResultReporter);
};
namespace internal {
// A helper class for implementing EXPECT_FATAL_FAILURE() and
// EXPECT_NONFATAL_FAILURE(). Its destructor verifies that the given
// TestPartResultArray contains exactly one failure that has the given
// type and contains the given substring. If that's not the case, a
// non-fatal failure will be generated.
class GTEST_API_ SingleFailureChecker {
public:
// The constructor remembers the arguments.
SingleFailureChecker(const TestPartResultArray* results,
TestPartResult::Type type,
const string& substr);
~SingleFailureChecker();
private:
const TestPartResultArray* const results_;
const TestPartResult::Type type_;
const string substr_;
GTEST_DISALLOW_COPY_AND_ASSIGN_(SingleFailureChecker);
};
} // namespace internal
} // namespace testing
// A set of macros for testing Google Test assertions or code that's expected
// to generate Google Test fatal failures. It verifies that the given
// statement will cause exactly one fatal Google Test failure with 'substr'
// being part of the failure message.
//
// There are two different versions of this macro. EXPECT_FATAL_FAILURE only
// affects and considers failures generated in the current thread and
// EXPECT_FATAL_FAILURE_ON_ALL_THREADS does the same but for all threads.
//
// The verification of the assertion is done correctly even when the statement
// throws an exception or aborts the current function.
//
// Known restrictions:
// - 'statement' cannot reference local non-static variables or
// non-static members of the current object.
// - 'statement' cannot return a value.
// - You cannot stream a failure message to this macro.
//
// Note that even though the implementations of the following two
// macros are much alike, we cannot refactor them to use a common
// helper macro, due to some peculiarity in how the preprocessor
// works. The AcceptsMacroThatExpandsToUnprotectedComma test in
// gtest_unittest.cc will fail to compile if we do that.
#define EXPECT_FATAL_FAILURE(statement, substr) \
do { \
class GTestExpectFatalFailureHelper {\
public:\
static void Execute() { statement; }\
};\
::testing::TestPartResultArray gtest_failures;\
::testing::internal::SingleFailureChecker gtest_checker(\
&gtest_failures, ::testing::TestPartResult::kFatalFailure, (substr));\
{\
::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
::testing::ScopedFakeTestPartResultReporter:: \
INTERCEPT_ONLY_CURRENT_THREAD, &gtest_failures);\
GTestExpectFatalFailureHelper::Execute();\
}\
} while (::testing::internal::AlwaysFalse())
#define EXPECT_FATAL_FAILURE_ON_ALL_THREADS(statement, substr) \
do { \
class GTestExpectFatalFailureHelper {\
public:\
static void Execute() { statement; }\
};\
::testing::TestPartResultArray gtest_failures;\
::testing::internal::SingleFailureChecker gtest_checker(\
&gtest_failures, ::testing::TestPartResult::kFatalFailure, (substr));\
{\
::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
::testing::ScopedFakeTestPartResultReporter:: \
INTERCEPT_ALL_THREADS, &gtest_failures);\
GTestExpectFatalFailureHelper::Execute();\
}\
} while (::testing::internal::AlwaysFalse())
// A macro for testing Google Test assertions or code that's expected to
// generate Google Test non-fatal failures. It asserts that the given
// statement will cause exactly one non-fatal Google Test failure with 'substr'
// being part of the failure message.
//
// There are two different versions of this macro. EXPECT_NONFATAL_FAILURE only
// affects and considers failures generated in the current thread and
// EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS does the same but for all threads.
//
// 'statement' is allowed to reference local variables and members of
// the current object.
//
// The verification of the assertion is done correctly even when the statement
// throws an exception or aborts the current function.
//
// Known restrictions:
// - You cannot stream a failure message to this macro.
//
// Note that even though the implementations of the following two
// macros are much alike, we cannot refactor them to use a common
// helper macro, due to some peculiarity in how the preprocessor
// works. If we do that, the code won't compile when the user gives
// EXPECT_NONFATAL_FAILURE() a statement that contains a macro that
// expands to code containing an unprotected comma. The
// AcceptsMacroThatExpandsToUnprotectedComma test in gtest_unittest.cc
// catches that.
//
// For the same reason, we have to write
// if (::testing::internal::AlwaysTrue()) { statement; }
// instead of
// GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement)
// to avoid an MSVC warning on unreachable code.
#define EXPECT_NONFATAL_FAILURE(statement, substr) \
do {\
::testing::TestPartResultArray gtest_failures;\
::testing::internal::SingleFailureChecker gtest_checker(\
&gtest_failures, ::testing::TestPartResult::kNonFatalFailure, \
(substr));\
{\
::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
::testing::ScopedFakeTestPartResultReporter:: \
INTERCEPT_ONLY_CURRENT_THREAD, &gtest_failures);\
if (::testing::internal::AlwaysTrue()) { statement; }\
}\
} while (::testing::internal::AlwaysFalse())
#define EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(statement, substr) \
do {\
::testing::TestPartResultArray gtest_failures;\
::testing::internal::SingleFailureChecker gtest_checker(\
&gtest_failures, ::testing::TestPartResult::kNonFatalFailure, \
(substr));\
{\
::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
::testing::ScopedFakeTestPartResultReporter::INTERCEPT_ALL_THREADS,\
&gtest_failures);\
if (::testing::internal::AlwaysTrue()) { statement; }\
}\
} while (::testing::internal::AlwaysFalse())
#endif // GTEST_INCLUDE_GTEST_GTEST_SPI_H_

View File

@@ -0,0 +1,180 @@
// Copyright 2008, Google Inc.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// Author: mheule@google.com (Markus Heule)
//
#ifndef GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_
#define GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_
#include <iosfwd>
#include <vector>
#include "gtest/internal/gtest-internal.h"
#include "gtest/internal/gtest-string.h"
namespace testing {
// A copyable object representing the result of a test part (i.e. an
// assertion or an explicit FAIL(), ADD_FAILURE(), or SUCCESS()).
//
// Don't inherit from TestPartResult as its destructor is not virtual.
class GTEST_API_ TestPartResult {
public:
// The possible outcomes of a test part (i.e. an assertion or an
// explicit SUCCEED(), FAIL(), or ADD_FAILURE()).
enum Type {
kSuccess, // Succeeded.
kNonFatalFailure, // Failed but the test can continue.
kFatalFailure, // Failed and the test should be terminated.
kFouceSuccess //强制使用例成功,且直接返回退出用例
};
// C'tor. TestPartResult does NOT have a default constructor.
// Always use this constructor (with parameters) to create a
// TestPartResult object.
TestPartResult(Type a_type,
const char* a_file_name,
int a_line_number,
const char* a_message)
: type_(a_type),
file_name_(a_file_name),
line_number_(a_line_number),
summary_(ExtractSummary(a_message)),
message_(a_message) {
}
// Gets the outcome of the test part.
Type type() const { return type_; }
// Gets the name of the source file where the test part took place, or
// NULL if it's unknown.
const char* file_name() const { return file_name_.c_str(); }
// Gets the line in the source file where the test part took place,
// or -1 if it's unknown.
int line_number() const { return line_number_; }
// Gets the summary of the failure message.
const char* summary() const { return summary_.c_str(); }
// Gets the message associated with the test part.
const char* message() const { return message_.c_str(); }
// Returns true iff the test part passed.
bool passed() const { return ((type_ == kSuccess) || (type_ == kFouceSuccess)); }
// Returns true iff the test part failed.
bool failed() const { return ((type_ != kSuccess) && (type_ != kFouceSuccess)); }
// Returns true iff the test part non-fatally failed.
bool nonfatally_failed() const { return type_ == kNonFatalFailure; }
// Returns true iff the test part fatally failed.
bool fatally_failed() const { return type_ == kFatalFailure; }
// Returns true if 强制成功.
bool fatally_succeed() const { return type_ == kFouceSuccess; }
private:
Type type_;
// Gets the summary of the failure message by omitting the stack
// trace in it.
static internal::String ExtractSummary(const char* message);
// The name of the source file where the test part took place, or
// NULL if the source file is unknown.
internal::String file_name_;
// The line in the source file where the test part took place, or -1
// if the line number is unknown.
int line_number_;
internal::String summary_; // The test failure summary.
internal::String message_; // The test failure message.
};
// Prints a TestPartResult object.
std::ostream& operator<<(std::ostream& os, const TestPartResult& result);
// An array of TestPartResult objects.
//
// Don't inherit from TestPartResultArray as its destructor is not
// virtual.
class GTEST_API_ TestPartResultArray {
public:
TestPartResultArray() {}
// Appends the given TestPartResult to the array.
void Append(const TestPartResult& result);
// Returns the TestPartResult at the given index (0-based).
const TestPartResult& GetTestPartResult(int index) const;
// Returns the number of TestPartResult objects in the array.
int size() const;
private:
std::vector<TestPartResult> array_;
GTEST_DISALLOW_COPY_AND_ASSIGN_(TestPartResultArray);
};
// This interface knows how to report a test part result.
class TestPartResultReporterInterface {
public:
virtual ~TestPartResultReporterInterface() {}
virtual void ReportTestPartResult(const TestPartResult& result) = 0;
};
namespace internal {
// This helper class is used by {ASSERT|EXPECT}_NO_FATAL_FAILURE to check if a
// statement generates new fatal failures. To do so it registers itself as the
// current test part result reporter. Besides checking if fatal failures were
// reported, it only delegates the reporting to the former result reporter.
// The original result reporter is restored in the destructor.
// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
class GTEST_API_ HasNewFatalFailureHelper
: public TestPartResultReporterInterface {
public:
HasNewFatalFailureHelper();
virtual ~HasNewFatalFailureHelper();
virtual void ReportTestPartResult(const TestPartResult& result);
bool has_new_fatal_failure() const { return has_new_fatal_failure_; }
private:
bool has_new_fatal_failure_;
TestPartResultReporterInterface* original_reporter_;
GTEST_DISALLOW_COPY_AND_ASSIGN_(HasNewFatalFailureHelper);
};
} // namespace internal
} // namespace testing
#endif // GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_

View File

@@ -0,0 +1,259 @@
// Copyright 2008 Google Inc.
// All Rights Reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// Author: wan@google.com (Zhanyong Wan)
#ifndef GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_
#define GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_
// This header implements typed tests and type-parameterized tests.
// Typed (aka type-driven) tests repeat the same test for types in a
// list. You must know which types you want to test with when writing
// typed tests. Here's how you do it:
#if 0
// First, define a fixture class template. It should be parameterized
// by a type. Remember to derive it from testing::Test.
template <typename T>
class FooTest : public testing::Test {
public:
...
typedef std::list<T> List;
static T shared_;
T value_;
};
// Next, associate a list of types with the test case, which will be
// repeated for each type in the list. The typedef is necessary for
// the macro to parse correctly.
typedef testing::Types<char, int, unsigned int> MyTypes;
TYPED_TEST_CASE(FooTest, MyTypes);
// If the type list contains only one type, you can write that type
// directly without Types<...>:
// TYPED_TEST_CASE(FooTest, int);
// Then, use TYPED_TEST() instead of TEST_F() to define as many typed
// tests for this test case as you want.
TYPED_TEST(FooTest, DoesBlah) {
// Inside a test, refer to TypeParam to get the type parameter.
// Since we are inside a derived class template, C++ requires use to
// visit the members of FooTest via 'this'.
TypeParam n = this->value_;
// To visit static members of the fixture, add the TestFixture::
// prefix.
n += TestFixture::shared_;
// To refer to typedefs in the fixture, add the "typename
// TestFixture::" prefix.
typename TestFixture::List values;
values.push_back(n);
...
}
TYPED_TEST(FooTest, HasPropertyA) { ... }
#endif // 0
// Type-parameterized tests are abstract test patterns parameterized
// by a type. Compared with typed tests, type-parameterized tests
// allow you to define the test pattern without knowing what the type
// parameters are. The defined pattern can be instantiated with
// different types any number of times, in any number of translation
// units.
//
// If you are designing an interface or concept, you can define a
// suite of type-parameterized tests to verify properties that any
// valid implementation of the interface/concept should have. Then,
// each implementation can easily instantiate the test suite to verify
// that it conforms to the requirements, without having to write
// similar tests repeatedly. Here's an example:
#if 0
// First, define a fixture class template. It should be parameterized
// by a type. Remember to derive it from testing::Test.
template <typename T>
class FooTest : public testing::Test {
...
};
// Next, declare that you will define a type-parameterized test case
// (the _P suffix is for "parameterized" or "pattern", whichever you
// prefer):
TYPED_TEST_CASE_P(FooTest);
// Then, use TYPED_TEST_P() to define as many type-parameterized tests
// for this type-parameterized test case as you want.
TYPED_TEST_P(FooTest, DoesBlah) {
// Inside a test, refer to TypeParam to get the type parameter.
TypeParam n = 0;
...
}
TYPED_TEST_P(FooTest, HasPropertyA) { ... }
// Now the tricky part: you need to register all test patterns before
// you can instantiate them. The first argument of the macro is the
// test case name; the rest are the names of the tests in this test
// case.
REGISTER_TYPED_TEST_CASE_P(FooTest,
DoesBlah, HasPropertyA);
// Finally, you are free to instantiate the pattern with the types you
// want. If you put the above code in a header file, you can #include
// it in multiple C++ source files and instantiate it multiple times.
//
// To distinguish different instances of the pattern, the first
// argument to the INSTANTIATE_* macro is a prefix that will be added
// to the actual test case name. Remember to pick unique prefixes for
// different instances.
typedef testing::Types<char, int, unsigned int> MyTypes;
INSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, MyTypes);
// If the type list contains only one type, you can write that type
// directly without Types<...>:
// INSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, int);
#endif // 0
#include "gtest/internal/gtest-port.h"
#include "gtest/internal/gtest-type-util.h"
// Implements typed tests.
#if GTEST_HAS_TYPED_TEST
// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
//
// Expands to the name of the typedef for the type parameters of the
// given test case.
# define GTEST_TYPE_PARAMS_(TestCaseName) gtest_type_params_##TestCaseName##_
// The 'Types' template argument below must have spaces around it
// since some compilers may choke on '>>' when passing a template
// instance (e.g. Types<int>)
# define TYPED_TEST_CASE(CaseName, Types) \
typedef ::testing::internal::TypeList< Types >::type \
GTEST_TYPE_PARAMS_(CaseName)
# define TYPED_TEST(CaseName, TestName) \
template <typename gtest_TypeParam_> \
class GTEST_TEST_CLASS_NAME_(CaseName, TestName) \
: public CaseName<gtest_TypeParam_> { \
private: \
typedef CaseName<gtest_TypeParam_> TestFixture; \
typedef gtest_TypeParam_ TypeParam; \
virtual void TestBody(); \
}; \
bool gtest_##CaseName##_##TestName##_registered_ GTEST_ATTRIBUTE_UNUSED_ = \
::testing::internal::TypeParameterizedTest< \
CaseName, \
::testing::internal::TemplateSel< \
GTEST_TEST_CLASS_NAME_(CaseName, TestName)>, \
GTEST_TYPE_PARAMS_(CaseName)>::Register(\
"", #CaseName, #TestName, 0); \
template <typename gtest_TypeParam_> \
void GTEST_TEST_CLASS_NAME_(CaseName, TestName)<gtest_TypeParam_>::TestBody()
#endif // GTEST_HAS_TYPED_TEST
// Implements type-parameterized tests.
#if GTEST_HAS_TYPED_TEST_P
// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
//
// Expands to the namespace name that the type-parameterized tests for
// the given type-parameterized test case are defined in. The exact
// name of the namespace is subject to change without notice.
# define GTEST_CASE_NAMESPACE_(TestCaseName) \
gtest_case_##TestCaseName##_
// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
//
// Expands to the name of the variable used to remember the names of
// the defined tests in the given test case.
# define GTEST_TYPED_TEST_CASE_P_STATE_(TestCaseName) \
gtest_typed_test_case_p_state_##TestCaseName##_
// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE DIRECTLY.
//
// Expands to the name of the variable used to remember the names of
// the registered tests in the given test case.
# define GTEST_REGISTERED_TEST_NAMES_(TestCaseName) \
gtest_registered_test_names_##TestCaseName##_
// The variables defined in the type-parameterized test macros are
// static as typically these macros are used in a .h file that can be
// #included in multiple translation units linked together.
# define TYPED_TEST_CASE_P(CaseName) \
static ::testing::internal::TypedTestCasePState \
GTEST_TYPED_TEST_CASE_P_STATE_(CaseName)
# define TYPED_TEST_P(CaseName, TestName) \
namespace GTEST_CASE_NAMESPACE_(CaseName) { \
template <typename gtest_TypeParam_> \
class TestName : public CaseName<gtest_TypeParam_> { \
private: \
typedef CaseName<gtest_TypeParam_> TestFixture; \
typedef gtest_TypeParam_ TypeParam; \
virtual void TestBody(); \
}; \
static bool gtest_##TestName##_defined_ GTEST_ATTRIBUTE_UNUSED_ = \
GTEST_TYPED_TEST_CASE_P_STATE_(CaseName).AddTestName(\
__FILE__, __LINE__, #CaseName, #TestName); \
} \
template <typename gtest_TypeParam_> \
void GTEST_CASE_NAMESPACE_(CaseName)::TestName<gtest_TypeParam_>::TestBody()
# define REGISTER_TYPED_TEST_CASE_P(CaseName, ...) \
namespace GTEST_CASE_NAMESPACE_(CaseName) { \
typedef ::testing::internal::Templates<__VA_ARGS__>::type gtest_AllTests_; \
} \
static const char* const GTEST_REGISTERED_TEST_NAMES_(CaseName) = \
GTEST_TYPED_TEST_CASE_P_STATE_(CaseName).VerifyRegisteredTestNames(\
__FILE__, __LINE__, #__VA_ARGS__)
// The 'Types' template argument below must have spaces around it
// since some compilers may choke on '>>' when passing a template
// instance (e.g. Types<int>)
# define INSTANTIATE_TYPED_TEST_CASE_P(Prefix, CaseName, Types) \
bool gtest_##Prefix##_##CaseName GTEST_ATTRIBUTE_UNUSED_ = \
::testing::internal::TypeParameterizedTestCase<CaseName, \
GTEST_CASE_NAMESPACE_(CaseName)::gtest_AllTests_, \
::testing::internal::TypeList< Types >::type>::Register(\
#Prefix, #CaseName, GTEST_REGISTERED_TEST_NAMES_(CaseName))
#endif // GTEST_HAS_TYPED_TEST_P
#endif // GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,371 @@
// Copyright 2006, Google Inc.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// This file is AUTOMATICALLY GENERATED on 09/24/2010 by command
// 'gen_gtest_pred_impl.py 5'. DO NOT EDIT BY HAND!
//
// Implements a family of generic predicate assertion macros.
#ifndef GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
#define GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
// Makes sure this header is not included before gtest.h.
#ifndef GTEST_INCLUDE_GTEST_GTEST_H_
# error Do not include gtest_pred_impl.h directly. Include gtest.h instead.
#endif // GTEST_INCLUDE_GTEST_GTEST_H_
// This header implements a family of generic predicate assertion
// macros:
//
// ASSERT_PRED_FORMAT1(pred_format, v1)
// ASSERT_PRED_FORMAT2(pred_format, v1, v2)
// ...
//
// where pred_format is a function or functor that takes n (in the
// case of ASSERT_PRED_FORMATn) values and their source expression
// text, and returns a testing::AssertionResult. See the definition
// of ASSERT_EQ in gtest.h for an example.
//
// If you don't care about formatting, you can use the more
// restrictive version:
//
// ASSERT_PRED1(pred, v1)
// ASSERT_PRED2(pred, v1, v2)
// ...
//
// where pred is an n-ary function or functor that returns bool,
// and the values v1, v2, ..., must support the << operator for
// streaming to std::ostream.
//
// We also define the EXPECT_* variations.
//
// For now we only support predicates whose arity is at most 5.
// Please email googletestframework@googlegroups.com if you need
// support for higher arities.
// GTEST_ASSERT_ is the basic statement to which all of the assertions
// in this file reduce. Don't use this in your code.
#define GTEST_ASSERT_(expression, on_failure) \
{ \
::testing::styleCheck::tick(); \
} \
GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
if (const ::testing::AssertionResult gtest_ar = (expression)) \
; \
else \
on_failure(gtest_ar.failure_message())
#define GTEST_ASSERT2_(expression, on_failure) \
{ \
::testing::styleCheck::tick(); \
} \
GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
if(++gtest_assert_count_) \
if (const ::testing::AssertionResult gtest_ar = (expression)) \
; \
else \
on_failure(gtest_ar.failure_message())
// Helper function for implementing {EXPECT|ASSERT}_PRED1. Don't use
// this in your code.
template <typename Pred,
typename T1>
AssertionResult AssertPred1Helper(const char* pred_text,
const char* e1,
Pred pred,
const T1& v1) {
if (pred(v1)) return AssertionSuccess();
return AssertionFailure() << pred_text << "("
<< e1 << ") evaluates to false, where"
<< "\n" << e1 << " evaluates to " << v1;
}
// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT1.
// Don't use this in your code.
#define GTEST_PRED_FORMAT1_(pred_format, v1, on_failure)\
GTEST_ASSERT_(pred_format(#v1, v1),\
on_failure)
// Internal macro for implementing {EXPECT|ASSERT}_PRED1. Don't use
// this in your code.
#define GTEST_PRED1_(pred, v1, on_failure)\
GTEST_ASSERT_(::testing::AssertPred1Helper(#pred, \
#v1, \
pred, \
v1), on_failure)
// Unary predicate assertion macros.
#define EXPECT_PRED_FORMAT1(pred_format, v1) \
GTEST_PRED_FORMAT1_(pred_format, v1, GTEST_NONFATAL_FAILURE_)
#define EXPECT_PRED1(pred, v1) \
GTEST_PRED1_(pred, v1, GTEST_NONFATAL_FAILURE_)
#define ASSERT_PRED_FORMAT1(pred_format, v1) \
GTEST_PRED_FORMAT1_(pred_format, v1, GTEST_FATAL_FAILURE_)
#define ASSERT_PRED1(pred, v1) \
GTEST_PRED1_(pred, v1, GTEST_FATAL_FAILURE_)
// Helper function for implementing {EXPECT|ASSERT}_PRED2. Don't use
// this in your code.
template <typename Pred,
typename T1,
typename T2>
AssertionResult AssertPred2Helper(const char* pred_text,
const char* e1,
const char* e2,
Pred pred,
const T1& v1,
const T2& v2) {
if (pred(v1, v2)) return AssertionSuccess();
return AssertionFailure() << pred_text << "("
<< e1 << ", "
<< e2 << ") evaluates to false, where"
<< "\n" << e1 << " evaluates to " << v1
<< "\n" << e2 << " evaluates to " << v2;
}
// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT2.
// Don't use this in your code.
#define GTEST_PRED_FORMAT2_(pred_format, v1, v2, on_failure)\
GTEST_ASSERT2_(pred_format(#v1, #v2, v1, v2),\
on_failure)
// Internal macro for implementing {EXPECT|ASSERT}_PRED2. Don't use
// this in your code.
#define GTEST_PRED2_(pred, v1, v2, on_failure)\
GTEST_ASSERT_(::testing::AssertPred2Helper(#pred, \
#v1, \
#v2, \
pred, \
v1, \
v2), on_failure)
// Binary predicate assertion macros.
#define EXPECT_PRED_FORMAT2(pred_format, v1, v2) \
GTEST_PRED_FORMAT2_(pred_format, v1, v2, GTEST_NONFATAL_FAILURE_)
#define EXPECT_PRED2(pred, v1, v2) \
GTEST_PRED2_(pred, v1, v2, GTEST_NONFATAL_FAILURE_)
#define ASSERT_PRED_FORMAT2(pred_format, v1, v2) \
GTEST_PRED_FORMAT2_(pred_format, v1, v2, GTEST_FATAL_FAILURE_)
#define ASSERT_PRED2(pred, v1, v2) \
GTEST_PRED2_(pred, v1, v2, GTEST_FATAL_FAILURE_)
// Helper function for implementing {EXPECT|ASSERT}_PRED3. Don't use
// this in your code.
template <typename Pred,
typename T1,
typename T2,
typename T3>
AssertionResult AssertPred3Helper(const char* pred_text,
const char* e1,
const char* e2,
const char* e3,
Pred pred,
const T1& v1,
const T2& v2,
const T3& v3) {
if (pred(v1, v2, v3)) return AssertionSuccess();
return AssertionFailure() << pred_text << "("
<< e1 << ", "
<< e2 << ", "
<< e3 << ") evaluates to false, where"
<< "\n" << e1 << " evaluates to " << v1
<< "\n" << e2 << " evaluates to " << v2
<< "\n" << e3 << " evaluates to " << v3;
}
// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT3.
// Don't use this in your code.
#define GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, on_failure)\
GTEST_ASSERT_(pred_format(#v1, #v2, #v3, v1, v2, v3),\
on_failure)
// Internal macro for implementing {EXPECT|ASSERT}_PRED3. Don't use
// this in your code.
#define GTEST_PRED3_(pred, v1, v2, v3, on_failure)\
GTEST_ASSERT_(::testing::AssertPred3Helper(#pred, \
#v1, \
#v2, \
#v3, \
pred, \
v1, \
v2, \
v3), on_failure)
// Ternary predicate assertion macros.
#define EXPECT_PRED_FORMAT3(pred_format, v1, v2, v3) \
GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, GTEST_NONFATAL_FAILURE_)
#define EXPECT_PRED3(pred, v1, v2, v3) \
GTEST_PRED3_(pred, v1, v2, v3, GTEST_NONFATAL_FAILURE_)
#define ASSERT_PRED_FORMAT3(pred_format, v1, v2, v3) \
GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, GTEST_FATAL_FAILURE_)
#define ASSERT_PRED3(pred, v1, v2, v3) \
GTEST_PRED3_(pred, v1, v2, v3, GTEST_FATAL_FAILURE_)
// Helper function for implementing {EXPECT|ASSERT}_PRED4. Don't use
// this in your code.
template <typename Pred,
typename T1,
typename T2,
typename T3,
typename T4>
AssertionResult AssertPred4Helper(const char* pred_text,
const char* e1,
const char* e2,
const char* e3,
const char* e4,
Pred pred,
const T1& v1,
const T2& v2,
const T3& v3,
const T4& v4) {
if (pred(v1, v2, v3, v4)) return AssertionSuccess();
return AssertionFailure() << pred_text << "("
<< e1 << ", "
<< e2 << ", "
<< e3 << ", "
<< e4 << ") evaluates to false, where"
<< "\n" << e1 << " evaluates to " << v1
<< "\n" << e2 << " evaluates to " << v2
<< "\n" << e3 << " evaluates to " << v3
<< "\n" << e4 << " evaluates to " << v4;
}
// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT4.
// Don't use this in your code.
#define GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, on_failure)\
GTEST_ASSERT_(pred_format(#v1, #v2, #v3, #v4, v1, v2, v3, v4),\
on_failure)
// Internal macro for implementing {EXPECT|ASSERT}_PRED4. Don't use
// this in your code.
#define GTEST_PRED4_(pred, v1, v2, v3, v4, on_failure)\
GTEST_ASSERT_(::testing::AssertPred4Helper(#pred, \
#v1, \
#v2, \
#v3, \
#v4, \
pred, \
v1, \
v2, \
v3, \
v4), on_failure)
// 4-ary predicate assertion macros.
#define EXPECT_PRED_FORMAT4(pred_format, v1, v2, v3, v4) \
GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, GTEST_NONFATAL_FAILURE_)
#define EXPECT_PRED4(pred, v1, v2, v3, v4) \
GTEST_PRED4_(pred, v1, v2, v3, v4, GTEST_NONFATAL_FAILURE_)
#define ASSERT_PRED_FORMAT4(pred_format, v1, v2, v3, v4) \
GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, GTEST_FATAL_FAILURE_)
#define ASSERT_PRED4(pred, v1, v2, v3, v4) \
GTEST_PRED4_(pred, v1, v2, v3, v4, GTEST_FATAL_FAILURE_)
// Helper function for implementing {EXPECT|ASSERT}_PRED5. Don't use
// this in your code.
template <typename Pred,
typename T1,
typename T2,
typename T3,
typename T4,
typename T5>
AssertionResult AssertPred5Helper(const char* pred_text,
const char* e1,
const char* e2,
const char* e3,
const char* e4,
const char* e5,
Pred pred,
const T1& v1,
const T2& v2,
const T3& v3,
const T4& v4,
const T5& v5) {
if (pred(v1, v2, v3, v4, v5)) return AssertionSuccess();
return AssertionFailure() << pred_text << "("
<< e1 << ", "
<< e2 << ", "
<< e3 << ", "
<< e4 << ", "
<< e5 << ") evaluates to false, where"
<< "\n" << e1 << " evaluates to " << v1
<< "\n" << e2 << " evaluates to " << v2
<< "\n" << e3 << " evaluates to " << v3
<< "\n" << e4 << " evaluates to " << v4
<< "\n" << e5 << " evaluates to " << v5;
}
// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT5.
// Don't use this in your code.
#define GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, on_failure)\
GTEST_ASSERT_(pred_format(#v1, #v2, #v3, #v4, #v5, v1, v2, v3, v4, v5),\
on_failure)
// Internal macro for implementing {EXPECT|ASSERT}_PRED5. Don't use
// this in your code.
#define GTEST_PRED5_(pred, v1, v2, v3, v4, v5, on_failure)\
GTEST_ASSERT_(::testing::AssertPred5Helper(#pred, \
#v1, \
#v2, \
#v3, \
#v4, \
#v5, \
pred, \
v1, \
v2, \
v3, \
v4, \
v5), on_failure)
// 5-ary predicate assertion macros.
#define EXPECT_PRED_FORMAT5(pred_format, v1, v2, v3, v4, v5) \
GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, GTEST_NONFATAL_FAILURE_)
#define EXPECT_PRED5(pred, v1, v2, v3, v4, v5) \
GTEST_PRED5_(pred, v1, v2, v3, v4, v5, GTEST_NONFATAL_FAILURE_)
#define ASSERT_PRED_FORMAT5(pred_format, v1, v2, v3, v4, v5) \
GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, GTEST_FATAL_FAILURE_)
#define ASSERT_PRED5(pred, v1, v2, v3, v4, v5) \
GTEST_PRED5_(pred, v1, v2, v3, v4, v5, GTEST_FATAL_FAILURE_)
#endif // GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_

View File

@@ -0,0 +1,58 @@
// Copyright 2006, Google Inc.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// Author: wan@google.com (Zhanyong Wan)
//
// Google C++ Testing Framework definitions useful in production code.
#ifndef GTEST_INCLUDE_GTEST_GTEST_PROD_H_
#define GTEST_INCLUDE_GTEST_GTEST_PROD_H_
// When you need to test the private or protected members of a class,
// use the FRIEND_TEST macro to declare your tests as friends of the
// class. For example:
//
// class MyClass {
// private:
// void MyMethod();
// FRIEND_TEST(MyClassTest, MyMethod);
// };
//
// class MyClassTest : public testing::Test {
// // ...
// };
//
// TEST_F(MyClassTest, MyMethod) {
// // Can call MyClass::MyMethod() here.
// }
#define FRIEND_TEST(test_case_name, test_name)\
friend class test_case_name##_##test_name##_Test
#endif // GTEST_INCLUDE_GTEST_GTEST_PROD_H_

View File

@@ -0,0 +1,308 @@
// Copyright 2005, Google Inc.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// Authors: wan@google.com (Zhanyong Wan), eefacm@gmail.com (Sean Mcafee)
//
// The Google C++ Testing Framework (Google Test)
//
// This header file defines internal utilities needed for implementing
// death tests. They are subject to change without notice.
#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_
#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_
#include "gtest/internal/gtest-internal.h"
#include <stdio.h>
namespace testing {
namespace internal {
GTEST_DECLARE_string_(internal_run_death_test);
// Names of the flags (needed for parsing Google Test flags).
const char kDeathTestStyleFlag[] = "death_test_style";
const char kDeathTestUseFork[] = "death_test_use_fork";
const char kInternalRunDeathTestFlag[] = "internal_run_death_test";
#if GTEST_HAS_DEATH_TEST
// DeathTest is a class that hides much of the complexity of the
// GTEST_DEATH_TEST_ macro. It is abstract; its static Create method
// returns a concrete class that depends on the prevailing death test
// style, as defined by the --gtest_death_test_style and/or
// --gtest_internal_run_death_test flags.
// In describing the results of death tests, these terms are used with
// the corresponding definitions:
//
// exit status: The integer exit information in the format specified
// by wait(2)
// exit code: The integer code passed to exit(3), _exit(2), or
// returned from main()
class GTEST_API_ DeathTest {
public:
// Create returns false if there was an error determining the
// appropriate action to take for the current death test; for example,
// if the gtest_death_test_style flag is set to an invalid value.
// The LastMessage method will return a more detailed message in that
// case. Otherwise, the DeathTest pointer pointed to by the "test"
// argument is set. If the death test should be skipped, the pointer
// is set to NULL; otherwise, it is set to the address of a new concrete
// DeathTest object that controls the execution of the current test.
static bool Create(const char* statement, const RE* regex,
const char* file, int line, DeathTest** test);
DeathTest();
virtual ~DeathTest() { }
// A helper class that aborts a death test when it's deleted.
class ReturnSentinel {
public:
explicit ReturnSentinel(DeathTest* test) : test_(test) { }
~ReturnSentinel() { test_->Abort(TEST_ENCOUNTERED_RETURN_STATEMENT); }
private:
DeathTest* const test_;
GTEST_DISALLOW_COPY_AND_ASSIGN_(ReturnSentinel);
} GTEST_ATTRIBUTE_UNUSED_;
// An enumeration of possible roles that may be taken when a death
// test is encountered. EXECUTE means that the death test logic should
// be executed immediately. OVERSEE means that the program should prepare
// the appropriate environment for a child process to execute the death
// test, then wait for it to complete.
enum TestRole { OVERSEE_TEST, EXECUTE_TEST };
// An enumeration of the three reasons that a test might be aborted.
enum AbortReason {
TEST_ENCOUNTERED_RETURN_STATEMENT,
TEST_THREW_EXCEPTION,
TEST_DID_NOT_DIE
};
// Assumes one of the above roles.
virtual TestRole AssumeRole() = 0;
// Waits for the death test to finish and returns its status.
virtual int Wait() = 0;
// Returns true if the death test passed; that is, the test process
// exited during the test, its exit status matches a user-supplied
// predicate, and its stderr output matches a user-supplied regular
// expression.
// The user-supplied predicate may be a macro expression rather
// than a function pointer or functor, or else Wait and Passed could
// be combined.
virtual bool Passed(bool exit_status_ok) = 0;
// Signals that the death test did not die as expected.
virtual void Abort(AbortReason reason) = 0;
// Returns a human-readable outcome message regarding the outcome of
// the last death test.
static const char* LastMessage();
static void set_last_death_test_message(const String& message);
private:
// A string containing a description of the outcome of the last death test.
static String last_death_test_message_;
GTEST_DISALLOW_COPY_AND_ASSIGN_(DeathTest);
};
// Factory interface for death tests. May be mocked out for testing.
class DeathTestFactory {
public:
virtual ~DeathTestFactory() { }
virtual bool Create(const char* statement, const RE* regex,
const char* file, int line, DeathTest** test) = 0;
};
// A concrete DeathTestFactory implementation for normal use.
class DefaultDeathTestFactory : public DeathTestFactory {
public:
virtual bool Create(const char* statement, const RE* regex,
const char* file, int line, DeathTest** test);
};
// Returns true if exit_status describes a process that was terminated
// by a signal, or exited normally with a nonzero exit code.
GTEST_API_ bool ExitedUnsuccessfully(int exit_status);
// Traps C++ exceptions escaping statement and reports them as test
// failures. Note that trapping SEH exceptions is not implemented here.
# if GTEST_HAS_EXCEPTIONS
# define GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, death_test) \
try { \
GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
} catch (const ::std::exception& gtest_exception) { \
fprintf(\
stderr, \
"\n%s: Caught std::exception-derived exception escaping the " \
"death test statement. Exception message: %s\n", \
::testing::internal::FormatFileLocation(__FILE__, __LINE__).c_str(), \
gtest_exception.what()); \
fflush(stderr); \
death_test->Abort(::testing::internal::DeathTest::TEST_THREW_EXCEPTION); \
} catch (...) { \
death_test->Abort(::testing::internal::DeathTest::TEST_THREW_EXCEPTION); \
}
# else
# define GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, death_test) \
GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement)
# endif
// This macro is for implementing ASSERT_DEATH*, EXPECT_DEATH*,
// ASSERT_EXIT*, and EXPECT_EXIT*.
# define GTEST_DEATH_TEST_(statement, predicate, regex, fail) \
GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
if (::testing::internal::AlwaysTrue()) { \
const ::testing::internal::RE& gtest_regex = (regex); \
::testing::internal::DeathTest* gtest_dt; \
if (!::testing::internal::DeathTest::Create(#statement, &gtest_regex, \
__FILE__, __LINE__, &gtest_dt)) { \
goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__); \
} \
if (gtest_dt != NULL) { \
::testing::internal::scoped_ptr< ::testing::internal::DeathTest> \
gtest_dt_ptr(gtest_dt); \
switch (gtest_dt->AssumeRole()) { \
case ::testing::internal::DeathTest::OVERSEE_TEST: \
if (!gtest_dt->Passed(predicate(gtest_dt->Wait()))) { \
goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__); \
} \
break; \
case ::testing::internal::DeathTest::EXECUTE_TEST: { \
::testing::internal::DeathTest::ReturnSentinel \
gtest_sentinel(gtest_dt); \
GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, gtest_dt); \
gtest_dt->Abort(::testing::internal::DeathTest::TEST_DID_NOT_DIE); \
break; \
} \
default: \
break; \
} \
} \
} else \
GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__): \
fail(::testing::internal::DeathTest::LastMessage())
// The symbol "fail" here expands to something into which a message
// can be streamed.
// A class representing the parsed contents of the
// --gtest_internal_run_death_test flag, as it existed when
// RUN_ALL_TESTS was called.
class InternalRunDeathTestFlag {
public:
InternalRunDeathTestFlag(const String& a_file,
int a_line,
int an_index,
int a_write_fd)
: file_(a_file), line_(a_line), index_(an_index),
write_fd_(a_write_fd) {}
~InternalRunDeathTestFlag() {
if (write_fd_ >= 0)
posix::Close(write_fd_);
}
String file() const { return file_; }
int line() const { return line_; }
int index() const { return index_; }
int write_fd() const { return write_fd_; }
private:
String file_;
int line_;
int index_;
int write_fd_;
GTEST_DISALLOW_COPY_AND_ASSIGN_(InternalRunDeathTestFlag);
};
// Returns a newly created InternalRunDeathTestFlag object with fields
// initialized from the GTEST_FLAG(internal_run_death_test) flag if
// the flag is specified; otherwise returns NULL.
InternalRunDeathTestFlag* ParseInternalRunDeathTestFlag();
#else // GTEST_HAS_DEATH_TEST
// This macro is used for implementing macros such as
// EXPECT_DEATH_IF_SUPPORTED and ASSERT_DEATH_IF_SUPPORTED on systems where
// death tests are not supported. Those macros must compile on such systems
// iff EXPECT_DEATH and ASSERT_DEATH compile with the same parameters on
// systems that support death tests. This allows one to write such a macro
// on a system that does not support death tests and be sure that it will
// compile on a death-test supporting system.
//
// Parameters:
// statement - A statement that a macro such as EXPECT_DEATH would test
// for program termination. This macro has to make sure this
// statement is compiled but not executed, to ensure that
// EXPECT_DEATH_IF_SUPPORTED compiles with a certain
// parameter iff EXPECT_DEATH compiles with it.
// regex - A regex that a macro such as EXPECT_DEATH would use to test
// the output of statement. This parameter has to be
// compiled but not evaluated by this macro, to ensure that
// this macro only accepts expressions that a macro such as
// EXPECT_DEATH would accept.
// terminator - Must be an empty statement for EXPECT_DEATH_IF_SUPPORTED
// and a return statement for ASSERT_DEATH_IF_SUPPORTED.
// This ensures that ASSERT_DEATH_IF_SUPPORTED will not
// compile inside functions where ASSERT_DEATH doesn't
// compile.
//
// The branch that has an always false condition is used to ensure that
// statement and regex are compiled (and thus syntactically correct) but
// never executed. The unreachable code macro protects the terminator
// statement from generating an 'unreachable code' warning in case
// statement unconditionally returns or throws. The Message constructor at
// the end allows the syntax of streaming additional messages into the
// macro, for compilational compatibility with EXPECT_DEATH/ASSERT_DEATH.
# define GTEST_UNSUPPORTED_DEATH_TEST_(statement, regex, terminator) \
GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
if (::testing::internal::AlwaysTrue()) { \
GTEST_LOG_(WARNING) \
<< "Death tests are not supported on this platform.\n" \
<< "Statement '" #statement "' cannot be verified."; \
} else if (::testing::internal::AlwaysFalse()) { \
::testing::internal::RE::PartialMatch(".*", (regex)); \
GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
terminator; \
} else \
::testing::Message()
#endif // GTEST_HAS_DEATH_TEST
} // namespace internal
} // namespace testing
#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_

View File

@@ -0,0 +1,210 @@
// Copyright 2008, Google Inc.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// Author: keith.ray@gmail.com (Keith Ray)
//
// Google Test filepath utilities
//
// This header file declares classes and functions used internally by
// Google Test. They are subject to change without notice.
//
// This file is #included in <gtest/internal/gtest-internal.h>.
// Do not include this header file separately!
#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_
#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_
#include "gtest/internal/gtest-string.h"
namespace testing {
namespace internal {
// FilePath - a class for file and directory pathname manipulation which
// handles platform-specific conventions (like the pathname separator).
// Used for helper functions for naming files in a directory for xml output.
// Except for Set methods, all methods are const or static, which provides an
// "immutable value object" -- useful for peace of mind.
// A FilePath with a value ending in a path separator ("like/this/") represents
// a directory, otherwise it is assumed to represent a file. In either case,
// it may or may not represent an actual file or directory in the file system.
// Names are NOT checked for syntax correctness -- no checking for illegal
// characters, malformed paths, etc.
class GTEST_API_ FilePath {
public:
FilePath() : pathname_("") { }
FilePath(const FilePath& rhs) : pathname_(rhs.pathname_) { }
explicit FilePath(const char* pathname) : pathname_(pathname) {
Normalize();
}
explicit FilePath(const String& pathname) : pathname_(pathname) {
Normalize();
}
FilePath& operator=(const FilePath& rhs) {
Set(rhs);
return *this;
}
void Set(const FilePath& rhs) {
pathname_ = rhs.pathname_;
}
String ToString() const { return pathname_; }
const char* c_str() const { return pathname_.c_str(); }
// Returns the current working directory, or "" if unsuccessful.
static FilePath GetCurrentDir();
// Given directory = "dir", base_name = "test", number = 0,
// extension = "xml", returns "dir/test.xml". If number is greater
// than zero (e.g., 12), returns "dir/test_12.xml".
// On Windows platform, uses \ as the separator rather than /.
static FilePath MakeFileName(const FilePath& directory,
const FilePath& base_name,
int number,
const char* extension);
// Given directory = "dir", relative_path = "test.xml",
// returns "dir/test.xml".
// On Windows, uses \ as the separator rather than /.
static FilePath ConcatPaths(const FilePath& directory,
const FilePath& relative_path);
// Returns a pathname for a file that does not currently exist. The pathname
// will be directory/base_name.extension or
// directory/base_name_<number>.extension if directory/base_name.extension
// already exists. The number will be incremented until a pathname is found
// that does not already exist.
// Examples: 'dir/foo_test.xml' or 'dir/foo_test_1.xml'.
// There could be a race condition if two or more processes are calling this
// function at the same time -- they could both pick the same filename.
static FilePath GenerateUniqueFileName(const FilePath& directory,
const FilePath& base_name,
const char* extension);
// Returns true iff the path is NULL or "".
bool IsEmpty() const { return c_str() == NULL || *c_str() == '\0'; }
// If input name has a trailing separator character, removes it and returns
// the name, otherwise return the name string unmodified.
// On Windows platform, uses \ as the separator, other platforms use /.
FilePath RemoveTrailingPathSeparator() const;
// Returns a copy of the FilePath with the directory part removed.
// Example: FilePath("path/to/file").RemoveDirectoryName() returns
// FilePath("file"). If there is no directory part ("just_a_file"), it returns
// the FilePath unmodified. If there is no file part ("just_a_dir/") it
// returns an empty FilePath ("").
// On Windows platform, '\' is the path separator, otherwise it is '/'.
FilePath RemoveDirectoryName() const;
// RemoveFileName returns the directory path with the filename removed.
// Example: FilePath("path/to/file").RemoveFileName() returns "path/to/".
// If the FilePath is "a_file" or "/a_file", RemoveFileName returns
// FilePath("./") or, on Windows, FilePath(".\\"). If the filepath does
// not have a file, like "just/a/dir/", it returns the FilePath unmodified.
// On Windows platform, '\' is the path separator, otherwise it is '/'.
FilePath RemoveFileName() const;
// Returns a copy of the FilePath with the case-insensitive extension removed.
// Example: FilePath("dir/file.exe").RemoveExtension("EXE") returns
// FilePath("dir/file"). If a case-insensitive extension is not
// found, returns a copy of the original FilePath.
FilePath RemoveExtension(const char* extension) const;
// Creates directories so that path exists. Returns true if successful or if
// the directories already exist; returns false if unable to create
// directories for any reason. Will also return false if the FilePath does
// not represent a directory (that is, it doesn't end with a path separator).
bool CreateDirectoriesRecursively() const;
// Create the directory so that path exists. Returns true if successful or
// if the directory already exists; returns false if unable to create the
// directory for any reason, including if the parent directory does not
// exist. Not named "CreateDirectory" because that's a macro on Windows.
bool CreateFolder() const;
// Returns true if FilePath describes something in the file-system,
// either a file, directory, or whatever, and that something exists.
bool FileOrDirectoryExists() const;
// Returns true if pathname describes a directory in the file-system
// that exists.
bool DirectoryExists() const;
// Returns true if FilePath ends with a path separator, which indicates that
// it is intended to represent a directory. Returns false otherwise.
// This does NOT check that a directory (or file) actually exists.
bool IsDirectory() const;
// Returns true if pathname describes a root directory. (Windows has one
// root directory per disk drive.)
bool IsRootDirectory() const;
// Returns true if pathname describes an absolute path.
bool IsAbsolutePath() const;
private:
// Replaces multiple consecutive separators with a single separator.
// For example, "bar///foo" becomes "bar/foo". Does not eliminate other
// redundancies that might be in a pathname involving "." or "..".
//
// A pathname with multiple consecutive separators may occur either through
// user error or as a result of some scripts or APIs that generate a pathname
// with a trailing separator. On other platforms the same API or script
// may NOT generate a pathname with a trailing "/". Then elsewhere that
// pathname may have another "/" and pathname components added to it,
// without checking for the separator already being there.
// The script language and operating system may allow paths like "foo//bar"
// but some of the functions in FilePath will not handle that correctly. In
// particular, RemoveTrailingPathSeparator() only removes one separator, and
// it is called in CreateDirectoriesRecursively() assuming that it will change
// a pathname from directory syntax (trailing separator) to filename syntax.
//
// On Windows this method also replaces the alternate path separator '/' with
// the primary path separator '\\', so that for example "bar\\/\\foo" becomes
// "bar\\foo".
void Normalize();
// Returns a pointer to the last occurence of a valid path separator in
// the FilePath. On Windows, for example, both '/' and '\' are valid path
// separators. Returns NULL if no path separator was found.
const char* FindLastPathSeparator() const;
String pathname_;
}; // class FilePath
} // namespace internal
} // namespace testing
#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,233 @@
// Copyright 2003 Google Inc.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// Authors: Dan Egnor (egnor@google.com)
//
// A "smart" pointer type with reference tracking. Every pointer to a
// particular object is kept on a circular linked list. When the last pointer
// to an object is destroyed or reassigned, the object is deleted.
//
// Used properly, this deletes the object when the last reference goes away.
// There are several caveats:
// - Like all reference counting schemes, cycles lead to leaks.
// - Each smart pointer is actually two pointers (8 bytes instead of 4).
// - Every time a pointer is assigned, the entire list of pointers to that
// object is traversed. This class is therefore NOT SUITABLE when there
// will often be more than two or three pointers to a particular object.
// - References are only tracked as long as linked_ptr<> objects are copied.
// If a linked_ptr<> is converted to a raw pointer and back, BAD THINGS
// will happen (double deletion).
//
// A good use of this class is storing object references in STL containers.
// You can safely put linked_ptr<> in a vector<>.
// Other uses may not be as good.
//
// Note: If you use an incomplete type with linked_ptr<>, the class
// *containing* linked_ptr<> must have a constructor and destructor (even
// if they do nothing!).
//
// Bill Gibbons suggested we use something like this.
//
// Thread Safety:
// Unlike other linked_ptr implementations, in this implementation
// a linked_ptr object is thread-safe in the sense that:
// - it's safe to copy linked_ptr objects concurrently,
// - it's safe to copy *from* a linked_ptr and read its underlying
// raw pointer (e.g. via get()) concurrently, and
// - it's safe to write to two linked_ptrs that point to the same
// shared object concurrently.
// TODO(wan@google.com): rename this to safe_linked_ptr to avoid
// confusion with normal linked_ptr.
#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_
#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_
#include <stdlib.h>
#include <assert.h>
#include "gtest/internal/gtest-port.h"
namespace testing {
namespace internal {
// Protects copying of all linked_ptr objects.
GTEST_API_ GTEST_DECLARE_STATIC_MUTEX_(g_linked_ptr_mutex);
// This is used internally by all instances of linked_ptr<>. It needs to be
// a non-template class because different types of linked_ptr<> can refer to
// the same object (linked_ptr<Superclass>(obj) vs linked_ptr<Subclass>(obj)).
// So, it needs to be possible for different types of linked_ptr to participate
// in the same circular linked list, so we need a single class type here.
//
// DO NOT USE THIS CLASS DIRECTLY YOURSELF. Use linked_ptr<T>.
class linked_ptr_internal {
public:
// Create a new circle that includes only this instance.
void join_new() {
next_ = this;
}
// Many linked_ptr operations may change p.link_ for some linked_ptr
// variable p in the same circle as this object. Therefore we need
// to prevent two such operations from occurring concurrently.
//
// Note that different types of linked_ptr objects can coexist in a
// circle (e.g. linked_ptr<Base>, linked_ptr<Derived1>, and
// linked_ptr<Derived2>). Therefore we must use a single mutex to
// protect all linked_ptr objects. This can create serious
// contention in production code, but is acceptable in a testing
// framework.
// Join an existing circle.
// L < g_linked_ptr_mutex
void join(linked_ptr_internal const* ptr) {
MutexLock lock(&g_linked_ptr_mutex);
linked_ptr_internal const* p = ptr;
while (p->next_ != ptr) p = p->next_;
p->next_ = this;
next_ = ptr;
}
// Leave whatever circle we're part of. Returns true if we were the
// last member of the circle. Once this is done, you can join() another.
// L < g_linked_ptr_mutex
bool depart() {
MutexLock lock(&g_linked_ptr_mutex);
if (next_ == this) return true;
linked_ptr_internal const* p = next_;
while (p->next_ != this) p = p->next_;
p->next_ = next_;
return false;
}
private:
mutable linked_ptr_internal const* next_;
};
template <typename T>
class linked_ptr {
public:
typedef T element_type;
// Take over ownership of a raw pointer. This should happen as soon as
// possible after the object is created.
explicit linked_ptr(T* ptr = NULL) { capture(ptr); }
~linked_ptr() { depart(); }
// Copy an existing linked_ptr<>, adding ourselves to the list of references.
template <typename U> linked_ptr(linked_ptr<U> const& ptr) { copy(&ptr); }
linked_ptr(linked_ptr const& ptr) { // NOLINT
assert(&ptr != this);
copy(&ptr);
}
// Assignment releases the old value and acquires the new.
template <typename U> linked_ptr& operator=(linked_ptr<U> const& ptr) {
depart();
copy(&ptr);
return *this;
}
linked_ptr& operator=(linked_ptr const& ptr) {
if (&ptr != this) {
depart();
copy(&ptr);
}
return *this;
}
// Smart pointer members.
void reset(T* ptr = NULL) {
depart();
capture(ptr);
}
T* get() const { return value_; }
T* operator->() const { return value_; }
T& operator*() const { return *value_; }
bool operator==(T* p) const { return value_ == p; }
bool operator!=(T* p) const { return value_ != p; }
template <typename U>
bool operator==(linked_ptr<U> const& ptr) const {
return value_ == ptr.get();
}
template <typename U>
bool operator!=(linked_ptr<U> const& ptr) const {
return value_ != ptr.get();
}
private:
template <typename U>
friend class linked_ptr;
T* value_;
linked_ptr_internal link_;
void depart() {
if (link_.depart()) delete value_;
}
void capture(T* ptr) {
value_ = ptr;
link_.join_new();
}
template <typename U> void copy(linked_ptr<U> const* ptr) {
value_ = ptr->get();
if (value_)
link_.join(&ptr->link_);
else
link_.join_new();
}
};
template<typename T> inline
bool operator==(T* ptr, const linked_ptr<T>& x) {
return ptr == x.get();
}
template<typename T> inline
bool operator!=(T* ptr, const linked_ptr<T>& x) {
return ptr != x.get();
}
// A function to convert T* into linked_ptr<T>
// Doing e.g. make_linked_ptr(new FooBarBaz<type>(arg)) is a shorter notation
// for linked_ptr<FooBarBaz<type> >(new FooBarBaz<type>(arg))
template <typename T>
linked_ptr<T> make_linked_ptr(T* ptr) {
return linked_ptr<T>(ptr);
}
} // namespace internal
} // namespace testing
#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,301 @@
$$ -*- mode: c++; -*-
$var n = 50 $$ Maximum length of Values arguments we want to support.
$var maxtuple = 10 $$ Maximum number of Combine arguments we want to support.
// Copyright 2008 Google Inc.
// All Rights Reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// Author: vladl@google.com (Vlad Losev)
// Type and function utilities for implementing parameterized tests.
// This file is generated by a SCRIPT. DO NOT EDIT BY HAND!
//
// Currently Google Test supports at most $n arguments in Values,
// and at most $maxtuple arguments in Combine. Please contact
// googletestframework@googlegroups.com if you need more.
// Please note that the number of arguments to Combine is limited
// by the maximum arity of the implementation of tr1::tuple which is
// currently set at $maxtuple.
#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
// scripts/fuse_gtest.py depends on gtest's own header being #included
// *unconditionally*. Therefore these #includes cannot be moved
// inside #if GTEST_HAS_PARAM_TEST.
#include "gtest/internal/gtest-param-util.h"
#include "gtest/internal/gtest-port.h"
#if GTEST_HAS_PARAM_TEST
namespace testing {
// Forward declarations of ValuesIn(), which is implemented in
// include/gtest/gtest-param-test.h.
template <typename ForwardIterator>
internal::ParamGenerator<
typename ::testing::internal::IteratorTraits<ForwardIterator>::value_type>
ValuesIn(ForwardIterator begin, ForwardIterator end);
template <typename T, size_t N>
internal::ParamGenerator<T> ValuesIn(const T (&array)[N]);
template <class Container>
internal::ParamGenerator<typename Container::value_type> ValuesIn(
const Container& container);
namespace internal {
// Used in the Values() function to provide polymorphic capabilities.
template <typename T1>
class ValueArray1 {
public:
explicit ValueArray1(T1 v1) : v1_(v1) {}
template <typename T>
operator ParamGenerator<T>() const { return ValuesIn(&v1_, &v1_ + 1); }
private:
// No implementation - assignment is unsupported.
void operator=(const ValueArray1& other);
const T1 v1_;
};
$range i 2..n
$for i [[
$range j 1..i
template <$for j, [[typename T$j]]>
class ValueArray$i {
public:
ValueArray$i($for j, [[T$j v$j]]) : $for j, [[v$(j)_(v$j)]] {}
template <typename T>
operator ParamGenerator<T>() const {
const T array[] = {$for j, [[v$(j)_]]};
return ValuesIn(array);
}
private:
// No implementation - assignment is unsupported.
void operator=(const ValueArray$i& other);
$for j [[
const T$j v$(j)_;
]]
};
]]
# if GTEST_HAS_COMBINE
// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
//
// Generates values from the Cartesian product of values produced
// by the argument generators.
//
$range i 2..maxtuple
$for i [[
$range j 1..i
$range k 2..i
template <$for j, [[typename T$j]]>
class CartesianProductGenerator$i
: public ParamGeneratorInterface< ::std::tr1::tuple<$for j, [[T$j]]> > {
public:
typedef ::std::tr1::tuple<$for j, [[T$j]]> ParamType;
CartesianProductGenerator$i($for j, [[const ParamGenerator<T$j>& g$j]])
: $for j, [[g$(j)_(g$j)]] {}
virtual ~CartesianProductGenerator$i() {}
virtual ParamIteratorInterface<ParamType>* Begin() const {
return new Iterator(this, $for j, [[g$(j)_, g$(j)_.begin()]]);
}
virtual ParamIteratorInterface<ParamType>* End() const {
return new Iterator(this, $for j, [[g$(j)_, g$(j)_.end()]]);
}
private:
class Iterator : public ParamIteratorInterface<ParamType> {
public:
Iterator(const ParamGeneratorInterface<ParamType>* base, $for j, [[
const ParamGenerator<T$j>& g$j,
const typename ParamGenerator<T$j>::iterator& current$(j)]])
: base_(base),
$for j, [[
begin$(j)_(g$j.begin()), end$(j)_(g$j.end()), current$(j)_(current$j)
]] {
ComputeCurrentValue();
}
virtual ~Iterator() {}
virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
return base_;
}
// Advance should not be called on beyond-of-range iterators
// so no component iterators must be beyond end of range, either.
virtual void Advance() {
assert(!AtEnd());
++current$(i)_;
$for k [[
if (current$(i+2-k)_ == end$(i+2-k)_) {
current$(i+2-k)_ = begin$(i+2-k)_;
++current$(i+2-k-1)_;
}
]]
ComputeCurrentValue();
}
virtual ParamIteratorInterface<ParamType>* Clone() const {
return new Iterator(*this);
}
virtual const ParamType* Current() const { return &current_value_; }
virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
// Having the same base generator guarantees that the other
// iterator is of the same type and we can downcast.
GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
<< "The program attempted to compare iterators "
<< "from different generators." << std::endl;
const Iterator* typed_other =
CheckedDowncastToActualType<const Iterator>(&other);
// We must report iterators equal if they both point beyond their
// respective ranges. That can happen in a variety of fashions,
// so we have to consult AtEnd().
return (AtEnd() && typed_other->AtEnd()) ||
($for j && [[
current$(j)_ == typed_other->current$(j)_
]]);
}
private:
Iterator(const Iterator& other)
: base_(other.base_), $for j, [[
begin$(j)_(other.begin$(j)_),
end$(j)_(other.end$(j)_),
current$(j)_(other.current$(j)_)
]] {
ComputeCurrentValue();
}
void ComputeCurrentValue() {
if (!AtEnd())
current_value_ = ParamType($for j, [[*current$(j)_]]);
}
bool AtEnd() const {
// We must report iterator past the end of the range when either of the
// component iterators has reached the end of its range.
return
$for j || [[
current$(j)_ == end$(j)_
]];
}
// No implementation - assignment is unsupported.
void operator=(const Iterator& other);
const ParamGeneratorInterface<ParamType>* const base_;
// begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
// current[i]_ is the actual traversing iterator.
$for j [[
const typename ParamGenerator<T$j>::iterator begin$(j)_;
const typename ParamGenerator<T$j>::iterator end$(j)_;
typename ParamGenerator<T$j>::iterator current$(j)_;
]]
ParamType current_value_;
}; // class CartesianProductGenerator$i::Iterator
// No implementation - assignment is unsupported.
void operator=(const CartesianProductGenerator$i& other);
$for j [[
const ParamGenerator<T$j> g$(j)_;
]]
}; // class CartesianProductGenerator$i
]]
// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
//
// Helper classes providing Combine() with polymorphic features. They allow
// casting CartesianProductGeneratorN<T> to ParamGenerator<U> if T is
// convertible to U.
//
$range i 2..maxtuple
$for i [[
$range j 1..i
template <$for j, [[class Generator$j]]>
class CartesianProductHolder$i {
public:
CartesianProductHolder$i($for j, [[const Generator$j& g$j]])
: $for j, [[g$(j)_(g$j)]] {}
template <$for j, [[typename T$j]]>
operator ParamGenerator< ::std::tr1::tuple<$for j, [[T$j]]> >() const {
return ParamGenerator< ::std::tr1::tuple<$for j, [[T$j]]> >(
new CartesianProductGenerator$i<$for j, [[T$j]]>(
$for j,[[
static_cast<ParamGenerator<T$j> >(g$(j)_)
]]));
}
private:
// No implementation - assignment is unsupported.
void operator=(const CartesianProductHolder$i& other);
$for j [[
const Generator$j g$(j)_;
]]
}; // class CartesianProductHolder$i
]]
# endif // GTEST_HAS_COMBINE
} // namespace internal
} // namespace testing
#endif // GTEST_HAS_PARAM_TEST
#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_

View File

@@ -0,0 +1,628 @@
// Copyright 2008 Google Inc.
// All Rights Reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// Author: vladl@google.com (Vlad Losev)
// Type and function utilities for implementing parameterized tests.
#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_
#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_
#include <iterator>
#include <utility>
#include <vector>
// scripts/fuse_gtest.py depends on gtest's own header being #included
// *unconditionally*. Therefore these #includes cannot be moved
// inside #if GTEST_HAS_PARAM_TEST.
#include "gtest/internal/gtest-internal.h"
#include "gtest/internal/gtest-linked_ptr.h"
#include "gtest/internal/gtest-port.h"
#include "gtest/gtest-printers.h"
#if GTEST_HAS_PARAM_TEST
namespace testing {
namespace internal {
// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
//
// Outputs a message explaining invalid registration of different
// fixture class for the same test case. This may happen when
// TEST_P macro is used to define two tests with the same name
// but in different namespaces.
GTEST_API_ void ReportInvalidTestCaseType(const char* test_case_name,
const char* file, int line);
template <typename> class ParamGeneratorInterface;
template <typename> class ParamGenerator;
// Interface for iterating over elements provided by an implementation
// of ParamGeneratorInterface<T>.
template <typename T>
class ParamIteratorInterface {
public:
virtual ~ParamIteratorInterface() {}
// A pointer to the base generator instance.
// Used only for the purposes of iterator comparison
// to make sure that two iterators belong to the same generator.
virtual const ParamGeneratorInterface<T>* BaseGenerator() const = 0;
// Advances iterator to point to the next element
// provided by the generator. The caller is responsible
// for not calling Advance() on an iterator equal to
// BaseGenerator()->End().
virtual void Advance() = 0;
// Clones the iterator object. Used for implementing copy semantics
// of ParamIterator<T>.
virtual ParamIteratorInterface* Clone() const = 0;
// Dereferences the current iterator and provides (read-only) access
// to the pointed value. It is the caller's responsibility not to call
// Current() on an iterator equal to BaseGenerator()->End().
// Used for implementing ParamGenerator<T>::operator*().
virtual const T* Current() const = 0;
// Determines whether the given iterator and other point to the same
// element in the sequence generated by the generator.
// Used for implementing ParamGenerator<T>::operator==().
virtual bool Equals(const ParamIteratorInterface& other) const = 0;
};
// Class iterating over elements provided by an implementation of
// ParamGeneratorInterface<T>. It wraps ParamIteratorInterface<T>
// and implements the const forward iterator concept.
template <typename T>
class ParamIterator {
public:
typedef T value_type;
typedef const T& reference;
typedef ptrdiff_t difference_type;
// ParamIterator assumes ownership of the impl_ pointer.
ParamIterator(const ParamIterator& other) : impl_(other.impl_->Clone()) {}
ParamIterator& operator=(const ParamIterator& other) {
if (this != &other)
impl_.reset(other.impl_->Clone());
return *this;
}
const T& operator*() const { return *impl_->Current(); }
const T* operator->() const { return impl_->Current(); }
// Prefix version of operator++.
ParamIterator& operator++() {
impl_->Advance();
return *this;
}
// Postfix version of operator++.
ParamIterator operator++(int /*unused*/) {
ParamIteratorInterface<T>* clone = impl_->Clone();
impl_->Advance();
return ParamIterator(clone);
}
bool operator==(const ParamIterator& other) const {
return impl_.get() == other.impl_.get() || impl_->Equals(*other.impl_);
}
bool operator!=(const ParamIterator& other) const {
return !(*this == other);
}
private:
friend class ParamGenerator<T>;
explicit ParamIterator(ParamIteratorInterface<T>* impl) : impl_(impl) {}
scoped_ptr<ParamIteratorInterface<T> > impl_;
};
// ParamGeneratorInterface<T> is the binary interface to access generators
// defined in other translation units.
template <typename T>
class ParamGeneratorInterface {
public:
typedef T ParamType;
virtual ~ParamGeneratorInterface() {}
// Generator interface definition
virtual ParamIteratorInterface<T>* Begin() const = 0;
virtual ParamIteratorInterface<T>* End() const = 0;
};
// Wraps ParamGeneratorInterface<T> and provides general generator syntax
// compatible with the STL Container concept.
// This class implements copy initialization semantics and the contained
// ParamGeneratorInterface<T> instance is shared among all copies
// of the original object. This is possible because that instance is immutable.
template<typename T>
class ParamGenerator {
public:
typedef ParamIterator<T> iterator;
explicit ParamGenerator(ParamGeneratorInterface<T>* impl) : impl_(impl) {}
ParamGenerator(const ParamGenerator& other) : impl_(other.impl_) {}
ParamGenerator& operator=(const ParamGenerator& other) {
impl_ = other.impl_;
return *this;
}
iterator begin() const { return iterator(impl_->Begin()); }
iterator end() const { return iterator(impl_->End()); }
private:
linked_ptr<const ParamGeneratorInterface<T> > impl_;
};
// Generates values from a range of two comparable values. Can be used to
// generate sequences of user-defined types that implement operator+() and
// operator<().
// This class is used in the Range() function.
template <typename T, typename IncrementT>
class RangeGenerator : public ParamGeneratorInterface<T> {
public:
RangeGenerator(T begin, T end, IncrementT step)
: begin_(begin), end_(end),
step_(step), end_index_(CalculateEndIndex(begin, end, step)) {}
virtual ~RangeGenerator() {}
virtual ParamIteratorInterface<T>* Begin() const {
return new Iterator(this, begin_, 0, step_);
}
virtual ParamIteratorInterface<T>* End() const {
return new Iterator(this, end_, end_index_, step_);
}
private:
class Iterator : public ParamIteratorInterface<T> {
public:
Iterator(const ParamGeneratorInterface<T>* base, T value, int index,
IncrementT step)
: base_(base), value_(value), index_(index), step_(step) {}
virtual ~Iterator() {}
virtual const ParamGeneratorInterface<T>* BaseGenerator() const {
return base_;
}
virtual void Advance() {
value_ = value_ + step_;
index_++;
}
virtual ParamIteratorInterface<T>* Clone() const {
return new Iterator(*this);
}
virtual const T* Current() const { return &value_; }
virtual bool Equals(const ParamIteratorInterface<T>& other) const {
// Having the same base generator guarantees that the other
// iterator is of the same type and we can downcast.
GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
<< "The program attempted to compare iterators "
<< "from different generators." << std::endl;
const int other_index =
CheckedDowncastToActualType<const Iterator>(&other)->index_;
return index_ == other_index;
}
private:
Iterator(const Iterator& other)
: ParamIteratorInterface<T>(),
base_(other.base_), value_(other.value_), index_(other.index_),
step_(other.step_) {}
// No implementation - assignment is unsupported.
void operator=(const Iterator& other);
const ParamGeneratorInterface<T>* const base_;
T value_;
int index_;
const IncrementT step_;
}; // class RangeGenerator::Iterator
static int CalculateEndIndex(const T& begin,
const T& end,
const IncrementT& step) {
int end_index = 0;
for (T i = begin; i < end; i = i + step)
end_index++;
return end_index;
}
// No implementation - assignment is unsupported.
void operator=(const RangeGenerator& other);
const T begin_;
const T end_;
const IncrementT step_;
// The index for the end() iterator. All the elements in the generated
// sequence are indexed (0-based) to aid iterator comparison.
const int end_index_;
}; // class RangeGenerator
// Generates values from a pair of STL-style iterators. Used in the
// ValuesIn() function. The elements are copied from the source range
// since the source can be located on the stack, and the generator
// is likely to persist beyond that stack frame.
template <typename T>
class ValuesInIteratorRangeGenerator : public ParamGeneratorInterface<T> {
public:
template <typename ForwardIterator>
ValuesInIteratorRangeGenerator(ForwardIterator begin, ForwardIterator end)
: container_(begin, end) {}
virtual ~ValuesInIteratorRangeGenerator() {}
virtual ParamIteratorInterface<T>* Begin() const {
return new Iterator(this, container_.begin());
}
virtual ParamIteratorInterface<T>* End() const {
return new Iterator(this, container_.end());
}
private:
typedef typename ::std::vector<T> ContainerType;
class Iterator : public ParamIteratorInterface<T> {
public:
Iterator(const ParamGeneratorInterface<T>* base,
typename ContainerType::const_iterator iterator)
: base_(base), iterator_(iterator) {}
virtual ~Iterator() {}
virtual const ParamGeneratorInterface<T>* BaseGenerator() const {
return base_;
}
virtual void Advance() {
++iterator_;
value_.reset();
}
virtual ParamIteratorInterface<T>* Clone() const {
return new Iterator(*this);
}
// We need to use cached value referenced by iterator_ because *iterator_
// can return a temporary object (and of type other then T), so just
// having "return &*iterator_;" doesn't work.
// value_ is updated here and not in Advance() because Advance()
// can advance iterator_ beyond the end of the range, and we cannot
// detect that fact. The client code, on the other hand, is
// responsible for not calling Current() on an out-of-range iterator.
virtual const T* Current() const {
if (value_.get() == NULL)
value_.reset(new T(*iterator_));
return value_.get();
}
virtual bool Equals(const ParamIteratorInterface<T>& other) const {
// Having the same base generator guarantees that the other
// iterator is of the same type and we can downcast.
GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
<< "The program attempted to compare iterators "
<< "from different generators." << std::endl;
return iterator_ ==
CheckedDowncastToActualType<const Iterator>(&other)->iterator_;
}
private:
Iterator(const Iterator& other)
// The explicit constructor call suppresses a false warning
// emitted by gcc when supplied with the -Wextra option.
: ParamIteratorInterface<T>(),
base_(other.base_),
iterator_(other.iterator_) {}
const ParamGeneratorInterface<T>* const base_;
typename ContainerType::const_iterator iterator_;
// A cached value of *iterator_. We keep it here to allow access by
// pointer in the wrapping iterator's operator->().
// value_ needs to be mutable to be accessed in Current().
// Use of scoped_ptr helps manage cached value's lifetime,
// which is bound by the lifespan of the iterator itself.
mutable scoped_ptr<const T> value_;
}; // class ValuesInIteratorRangeGenerator::Iterator
// No implementation - assignment is unsupported.
void operator=(const ValuesInIteratorRangeGenerator& other);
const ContainerType container_;
}; // class ValuesInIteratorRangeGenerator
// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
//
// Stores a parameter value and later creates tests parameterized with that
// value.
template <class TestClass>
class ParameterizedTestFactory : public TestFactoryBase {
public:
typedef typename TestClass::ParamType ParamType;
explicit ParameterizedTestFactory(ParamType parameter) :
parameter_(parameter) {}
virtual Test* CreateTest() {
TestClass::SetParam(&parameter_);
return new TestClass();
}
private:
const ParamType parameter_;
GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestFactory);
};
// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
//
// TestMetaFactoryBase is a base class for meta-factories that create
// test factories for passing into MakeAndRegisterTestInfo function.
template <class ParamType>
class TestMetaFactoryBase {
public:
virtual ~TestMetaFactoryBase() {}
virtual TestFactoryBase* CreateTestFactory(ParamType parameter) = 0;
};
// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
//
// TestMetaFactory creates test factories for passing into
// MakeAndRegisterTestInfo function. Since MakeAndRegisterTestInfo receives
// ownership of test factory pointer, same factory object cannot be passed
// into that method twice. But ParameterizedTestCaseInfo is going to call
// it for each Test/Parameter value combination. Thus it needs meta factory
// creator class.
template <class TestCase>
class TestMetaFactory
: public TestMetaFactoryBase<typename TestCase::ParamType> {
public:
typedef typename TestCase::ParamType ParamType;
TestMetaFactory() {}
virtual TestFactoryBase* CreateTestFactory(ParamType parameter) {
return new ParameterizedTestFactory<TestCase>(parameter);
}
private:
GTEST_DISALLOW_COPY_AND_ASSIGN_(TestMetaFactory);
};
// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
//
// ParameterizedTestCaseInfoBase is a generic interface
// to ParameterizedTestCaseInfo classes. ParameterizedTestCaseInfoBase
// accumulates test information provided by TEST_P macro invocations
// and generators provided by INSTANTIATE_TEST_CASE_P macro invocations
// and uses that information to register all resulting test instances
// in RegisterTests method. The ParameterizeTestCaseRegistry class holds
// a collection of pointers to the ParameterizedTestCaseInfo objects
// and calls RegisterTests() on each of them when asked.
class ParameterizedTestCaseInfoBase {
public:
virtual ~ParameterizedTestCaseInfoBase() {}
// Base part of test case name for display purposes.
virtual const string& GetTestCaseName() const = 0;
// Test case id to verify identity.
virtual TypeId GetTestCaseTypeId() const = 0;
// UnitTest class invokes this method to register tests in this
// test case right before running them in RUN_ALL_TESTS macro.
// This method should not be called more then once on any single
// instance of a ParameterizedTestCaseInfoBase derived class.
virtual void RegisterTests() = 0;
protected:
ParameterizedTestCaseInfoBase() {}
private:
GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseInfoBase);
};
// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
//
// ParameterizedTestCaseInfo accumulates tests obtained from TEST_P
// macro invocations for a particular test case and generators
// obtained from INSTANTIATE_TEST_CASE_P macro invocations for that
// test case. It registers tests with all values generated by all
// generators when asked.
template <class TestCase>
class ParameterizedTestCaseInfo : public ParameterizedTestCaseInfoBase {
public:
// ParamType and GeneratorCreationFunc are private types but are required
// for declarations of public methods AddTestPattern() and
// AddTestCaseInstantiation().
typedef typename TestCase::ParamType ParamType;
// A function that returns an instance of appropriate generator type.
typedef ParamGenerator<ParamType>(GeneratorCreationFunc)();
explicit ParameterizedTestCaseInfo(const char* name)
: test_case_name_(name) {}
// Test case base name for display purposes.
virtual const string& GetTestCaseName() const { return test_case_name_; }
// Test case id to verify identity.
virtual TypeId GetTestCaseTypeId() const { return GetTypeId<TestCase>(); }
// TEST_P macro uses AddTestPattern() to record information
// about a single test in a LocalTestInfo structure.
// test_case_name is the base name of the test case (without invocation
// prefix). test_base_name is the name of an individual test without
// parameter index. For the test SequenceA/FooTest.DoBar/1 FooTest is
// test case base name and DoBar is test base name.
void AddTestPattern(const char* test_case_name,
const char* test_base_name,
TestMetaFactoryBase<ParamType>* meta_factory) {
tests_.push_back(linked_ptr<TestInfo>(new TestInfo(test_case_name,
test_base_name,
meta_factory)));
}
// INSTANTIATE_TEST_CASE_P macro uses AddGenerator() to record information
// about a generator.
int AddTestCaseInstantiation(const string& instantiation_name,
GeneratorCreationFunc* func,
const char* sFilePath/* file */,
int iLine/* line */) {
instantiations_.push_back(::std::make_pair(instantiation_name, func));
//add by qiaoyang
test_case_p_sfilePath_ = sFilePath;
test_case_p_iLine_ = iLine;
return 0; // Return value used only to run this method in namespace scope.
}
// UnitTest class invokes this method to register tests in this test case
// test cases right before running tests in RUN_ALL_TESTS macro.
// This method should not be called more then once on any single
// instance of a ParameterizedTestCaseInfoBase derived class.
// UnitTest has a guard to prevent from calling this method more then once.
virtual void RegisterTests() {
for (typename TestInfoContainer::iterator test_it = tests_.begin();
test_it != tests_.end(); ++test_it) {
linked_ptr<TestInfo> test_info = *test_it;
for (typename InstantiationContainer::iterator gen_it =
instantiations_.begin(); gen_it != instantiations_.end();
++gen_it) {
const string& instantiation_name = gen_it->first;
ParamGenerator<ParamType> generator((*gen_it->second)());
Message test_case_name_stream;
if ( !instantiation_name.empty() )
test_case_name_stream << instantiation_name << "/";
test_case_name_stream << test_info->test_case_base_name;
int i = 0;
for (typename ParamGenerator<ParamType>::iterator param_it =
generator.begin();
param_it != generator.end(); ++param_it, ++i) {
Message test_name_stream;
test_name_stream << test_info->test_base_name << "/" << i;
MakeAndRegisterTestInfo(
test_case_name_stream.GetString().c_str(),
test_name_stream.GetString().c_str(),
NULL, // No type parameter.
PrintToString(*param_it).c_str(),
GetTestCaseTypeId(),
TestCase::SetUpTestCase,
TestCase::TearDownTestCase,
test_info->test_meta_factory->CreateTestFactory(*param_it),
// __FILE__, __LINE__);//autostar增加后两个参数使用参数化功能
test_case_p_sfilePath_, test_case_p_iLine_);//autostar增加后两个参数使用参数化功能
} // for param_it
} // for gen_it
} // for test_it
} // RegisterTests
private:
// LocalTestInfo structure keeps information about a single test registered
// with TEST_P macro.
struct TestInfo {
TestInfo(const char* a_test_case_base_name,
const char* a_test_base_name,
TestMetaFactoryBase<ParamType>* a_test_meta_factory) :
test_case_base_name(a_test_case_base_name),
test_base_name(a_test_base_name),
test_meta_factory(a_test_meta_factory) {}
const string test_case_base_name;
const string test_base_name;
const scoped_ptr<TestMetaFactoryBase<ParamType> > test_meta_factory;
};
typedef ::std::vector<linked_ptr<TestInfo> > TestInfoContainer;
// Keeps pairs of <Instantiation name, Sequence generator creation function>
// received from INSTANTIATE_TEST_CASE_P macros.
typedef ::std::vector<std::pair<string, GeneratorCreationFunc*> >
InstantiationContainer;
const string test_case_name_;
TestInfoContainer tests_;
InstantiationContainer instantiations_;
//add by qiaoyang
std::string test_case_p_sfilePath_;
int test_case_p_iLine_;
GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseInfo);
}; // class ParameterizedTestCaseInfo
// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
//
// ParameterizedTestCaseRegistry contains a map of ParameterizedTestCaseInfoBase
// classes accessed by test case names. TEST_P and INSTANTIATE_TEST_CASE_P
// macros use it to locate their corresponding ParameterizedTestCaseInfo
// descriptors.
class ParameterizedTestCaseRegistry {
public:
ParameterizedTestCaseRegistry() {}
~ParameterizedTestCaseRegistry() {
for (TestCaseInfoContainer::iterator it = test_case_infos_.begin();
it != test_case_infos_.end(); ++it) {
delete *it;
}
}
// Looks up or creates and returns a structure containing information about
// tests and instantiations of a particular test case.
template <class TestCase>
ParameterizedTestCaseInfo<TestCase>* GetTestCasePatternHolder(
const char* test_case_name,
const char* file,
int line) {
ParameterizedTestCaseInfo<TestCase>* typed_test_info = NULL;
for (TestCaseInfoContainer::iterator it = test_case_infos_.begin();
it != test_case_infos_.end(); ++it) {
if ((*it)->GetTestCaseName() == test_case_name) {
if ((*it)->GetTestCaseTypeId() != GetTypeId<TestCase>()) {
// Complain about incorrect usage of Google Test facilities
// and terminate the program since we cannot guaranty correct
// test case setup and tear-down in this case.
ReportInvalidTestCaseType(test_case_name, file, line);
posix::Abort();
} else {
// At this point we are sure that the object we found is of the same
// type we are looking for, so we downcast it to that type
// without further checks.
typed_test_info = CheckedDowncastToActualType<
ParameterizedTestCaseInfo<TestCase> >(*it);
}
break;
}
}
if (typed_test_info == NULL) {
typed_test_info = new ParameterizedTestCaseInfo<TestCase>(test_case_name);
test_case_infos_.push_back(typed_test_info);
}
return typed_test_info;
}
void RegisterTests() {
for (TestCaseInfoContainer::iterator it = test_case_infos_.begin();
it != test_case_infos_.end(); ++it) {
(*it)->RegisterTests();
}
}
private:
typedef ::std::vector<ParameterizedTestCaseInfoBase*> TestCaseInfoContainer;
TestCaseInfoContainer test_case_infos_;
GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseRegistry);
};
} // namespace internal
} // namespace testing
#endif // GTEST_HAS_PARAM_TEST
#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,350 @@
// Copyright 2005, Google Inc.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// Authors: wan@google.com (Zhanyong Wan), eefacm@gmail.com (Sean Mcafee)
//
// The Google C++ Testing Framework (Google Test)
//
// This header file declares the String class and functions used internally by
// Google Test. They are subject to change without notice. They should not used
// by code external to Google Test.
//
// This header file is #included by <gtest/internal/gtest-internal.h>.
// It should not be #included by other files.
#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_
#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_
#ifdef __BORLANDC__
// string.h is not guaranteed to provide strcpy on C++ Builder.
# include <mem.h>
#endif
#include <string.h>
#include "gtest/internal/gtest-port.h"
#include <string>
namespace testing {
namespace internal {
// String - a UTF-8 string class.
//
// For historic reasons, we don't use std::string.
//
// TODO(wan@google.com): replace this class with std::string or
// implement it in terms of the latter.
//
// Note that String can represent both NULL and the empty string,
// while std::string cannot represent NULL.
//
// NULL and the empty string are considered different. NULL is less
// than anything (including the empty string) except itself.
//
// This class only provides minimum functionality necessary for
// implementing Google Test. We do not intend to implement a full-fledged
// string class here.
//
// Since the purpose of this class is to provide a substitute for
// std::string on platforms where it cannot be used, we define a copy
// constructor and assignment operators such that we don't need
// conditional compilation in a lot of places.
//
// In order to make the representation efficient, the d'tor of String
// is not virtual. Therefore DO NOT INHERIT FROM String.
class GTEST_API_ String {
public:
// Static utility methods
// Returns the input enclosed in double quotes if it's not NULL;
// otherwise returns "(null)". For example, "\"Hello\"" is returned
// for input "Hello".
//
// This is useful for printing a C string in the syntax of a literal.
//
// Known issue: escape sequences are not handled yet.
static String ShowCStringQuoted(const char* c_str);
// Clones a 0-terminated C string, allocating memory using new. The
// caller is responsible for deleting the return value using
// delete[]. Returns the cloned string, or NULL if the input is
// NULL.
//
// This is different from strdup() in string.h, which allocates
// memory using malloc().
static const char* CloneCString(const char* c_str);
#if GTEST_OS_WINDOWS_MOBILE
// Windows CE does not have the 'ANSI' versions of Win32 APIs. To be
// able to pass strings to Win32 APIs on CE we need to convert them
// to 'Unicode', UTF-16.
// Creates a UTF-16 wide string from the given ANSI string, allocating
// memory using new. The caller is responsible for deleting the return
// value using delete[]. Returns the wide string, or NULL if the
// input is NULL.
//
// The wide string is created using the ANSI codepage (CP_ACP) to
// match the behaviour of the ANSI versions of Win32 calls and the
// C runtime.
static LPCWSTR AnsiToUtf16(const char* c_str);
// Creates an ANSI string from the given wide string, allocating
// memory using new. The caller is responsible for deleting the return
// value using delete[]. Returns the ANSI string, or NULL if the
// input is NULL.
//
// The returned string is created using the ANSI codepage (CP_ACP) to
// match the behaviour of the ANSI versions of Win32 calls and the
// C runtime.
static const char* Utf16ToAnsi(LPCWSTR utf16_str);
#endif
// Compares two C strings. Returns true iff they have the same content.
//
// Unlike strcmp(), this function can handle NULL argument(s). A
// NULL C string is considered different to any non-NULL C string,
// including the empty string.
static bool CStringEquals(const char* lhs, const char* rhs);
// Converts a wide C string to a String using the UTF-8 encoding.
// NULL will be converted to "(null)". If an error occurred during
// the conversion, "(failed to convert from wide string)" is
// returned.
static String ShowWideCString(const wchar_t* wide_c_str);
// Similar to ShowWideCString(), except that this function encloses
// the converted string in double quotes.
static String ShowWideCStringQuoted(const wchar_t* wide_c_str);
// Compares two wide C strings. Returns true iff they have the same
// content.
//
// Unlike wcscmp(), this function can handle NULL argument(s). A
// NULL C string is considered different to any non-NULL C string,
// including the empty string.
static bool WideCStringEquals(const wchar_t* lhs, const wchar_t* rhs);
// Compares two C strings, ignoring case. Returns true iff they
// have the same content.
//
// Unlike strcasecmp(), this function can handle NULL argument(s).
// A NULL C string is considered different to any non-NULL C string,
// including the empty string.
static bool CaseInsensitiveCStringEquals(const char* lhs,
const char* rhs);
// Compares two wide C strings, ignoring case. Returns true iff they
// have the same content.
//
// Unlike wcscasecmp(), this function can handle NULL argument(s).
// A NULL C string is considered different to any non-NULL wide C string,
// including the empty string.
// NB: The implementations on different platforms slightly differ.
// On windows, this method uses _wcsicmp which compares according to LC_CTYPE
// environment variable. On GNU platform this method uses wcscasecmp
// which compares according to LC_CTYPE category of the current locale.
// On MacOS X, it uses towlower, which also uses LC_CTYPE category of the
// current locale.
static bool CaseInsensitiveWideCStringEquals(const wchar_t* lhs,
const wchar_t* rhs);
// Formats a list of arguments to a String, using the same format
// spec string as for printf.
//
// We do not use the StringPrintf class as it is not universally
// available.
//
// The result is limited to 4096 characters (including the tailing
// 0). If 4096 characters are not enough to format the input,
// "<buffer exceeded>" is returned.
static String Format(const char* format, ...);
// C'tors
// The default c'tor constructs a NULL string.
String() : c_str_(NULL), length_(0) {}
// Constructs a String by cloning a 0-terminated C string.
String(const char* a_c_str) { // NOLINT
if (a_c_str == NULL) {
c_str_ = NULL;
length_ = 0;
} else {
ConstructNonNull(a_c_str, strlen(a_c_str));
}
}
// Constructs a String by copying a given number of chars from a
// buffer. E.g. String("hello", 3) creates the string "hel",
// String("a\0bcd", 4) creates "a\0bc", String(NULL, 0) creates "",
// and String(NULL, 1) results in access violation.
String(const char* buffer, size_t a_length) {
ConstructNonNull(buffer, a_length);
}
// The copy c'tor creates a new copy of the string. The two
// String objects do not share content.
String(const String& str) : c_str_(NULL), length_(0) { *this = str; }
// D'tor. String is intended to be a final class, so the d'tor
// doesn't need to be virtual.
~String() { delete[] c_str_; }
// Allows a String to be implicitly converted to an ::std::string or
// ::string, and vice versa. Converting a String containing a NULL
// pointer to ::std::string or ::string is undefined behavior.
// Converting a ::std::string or ::string containing an embedded NUL
// character to a String will result in the prefix up to the first
// NUL character.
String(const ::std::string& str) {
ConstructNonNull(str.c_str(), str.length());
}
operator ::std::string() const { return ::std::string(c_str(), length()); }
#if GTEST_HAS_GLOBAL_STRING
String(const ::string& str) {
ConstructNonNull(str.c_str(), str.length());
}
operator ::string() const { return ::string(c_str(), length()); }
#endif // GTEST_HAS_GLOBAL_STRING
// Returns true iff this is an empty string (i.e. "").
bool empty() const { return (c_str() != NULL) && (length() == 0); }
// Compares this with another String.
// Returns < 0 if this is less than rhs, 0 if this is equal to rhs, or > 0
// if this is greater than rhs.
int Compare(const String& rhs) const;
// Returns true iff this String equals the given C string. A NULL
// string and a non-NULL string are considered not equal.
bool operator==(const char* a_c_str) const { return Compare(a_c_str) == 0; }
// Returns true iff this String is less than the given String. A
// NULL string is considered less than "".
bool operator<(const String& rhs) const { return Compare(rhs) < 0; }
// Returns true iff this String doesn't equal the given C string. A NULL
// string and a non-NULL string are considered not equal.
bool operator!=(const char* a_c_str) const { return !(*this == a_c_str); }
// Returns true iff this String ends with the given suffix. *Any*
// String is considered to end with a NULL or empty suffix.
bool EndsWith(const char* suffix) const;
// Returns true iff this String ends with the given suffix, not considering
// case. Any String is considered to end with a NULL or empty suffix.
bool EndsWithCaseInsensitive(const char* suffix) const;
// Returns the length of the encapsulated string, or 0 if the
// string is NULL.
size_t length() const { return length_; }
// Gets the 0-terminated C string this String object represents.
// The String object still owns the string. Therefore the caller
// should NOT delete the return value.
const char* c_str() const { return c_str_; }
// Assigns a C string to this object. Self-assignment works.
const String& operator=(const char* a_c_str) {
return *this = String(a_c_str);
}
// Assigns a String object to this object. Self-assignment works.
const String& operator=(const String& rhs) {
if (this != &rhs) {
delete[] c_str_;
if (rhs.c_str() == NULL) {
c_str_ = NULL;
length_ = 0;
} else {
ConstructNonNull(rhs.c_str(), rhs.length());
}
}
return *this;
}
private:
// Constructs a non-NULL String from the given content. This
// function can only be called when c_str_ has not been allocated.
// ConstructNonNull(NULL, 0) results in an empty string ("").
// ConstructNonNull(NULL, non_zero) is undefined behavior.
void ConstructNonNull(const char* buffer, size_t a_length) {
char* const str = new char[a_length + 1];
memcpy(str, buffer, a_length);
str[a_length] = '\0';
c_str_ = str;
length_ = a_length;
}
const char* c_str_;
size_t length_;
}; // class String
// Streams a String to an ostream. Each '\0' character in the String
// is replaced with "\\0".
inline ::std::ostream& operator<<(::std::ostream& os, const String& str) {
if (str.c_str() == NULL) {
os << "(null)";
} else {
const char* const c_str = str.c_str();
for (size_t i = 0; i != str.length(); i++) {
if (c_str[i] == '\0') {
os << "\\0";
} else {
os << c_str[i];
}
}
}
return os;
}
// Gets the content of the stringstream's buffer as a String. Each '\0'
// character in the buffer is replaced with "\\0".
GTEST_API_ String StringStreamToString(::std::stringstream* stream);
// Converts a streamable value to a String. A NULL pointer is
// converted to "(null)". When the input value is a ::string,
// ::std::string, ::wstring, or ::std::wstring object, each NUL
// character in it is replaced with "\\0".
// Declared here but defined in gtest.h, so that it has access
// to the definition of the Message class, required by the ARM
// compiler.
template <typename T>
String StreamableToString(const T& streamable);
} // namespace internal
} // namespace testing
#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_

View File

@@ -0,0 +1,968 @@
// This file was GENERATED by a script. DO NOT EDIT BY HAND!!!
// Copyright 2009 Google Inc.
// All Rights Reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// Author: wan@google.com (Zhanyong Wan)
// Implements a subset of TR1 tuple needed by Google Test and Google Mock.
#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_
#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_
#include <utility> // For ::std::pair.
// The compiler used in Symbian has a bug that prevents us from declaring the
// tuple template as a friend (it complains that tuple is redefined). This
// hack bypasses the bug by declaring the members that should otherwise be
// private as public.
// Sun Studio versions < 12 also have the above bug.
#if defined(__SYMBIAN32__) || (defined(__SUNPRO_CC) && __SUNPRO_CC < 0x590)
# define GTEST_DECLARE_TUPLE_AS_FRIEND_ public:
#else
# define GTEST_DECLARE_TUPLE_AS_FRIEND_ \
template <GTEST_10_TYPENAMES_(U)> friend class tuple; \
private:
#endif
// GTEST_n_TUPLE_(T) is the type of an n-tuple.
#define GTEST_0_TUPLE_(T) tuple<>
#define GTEST_1_TUPLE_(T) tuple<T##0, void, void, void, void, void, void, \
void, void, void>
#define GTEST_2_TUPLE_(T) tuple<T##0, T##1, void, void, void, void, void, \
void, void, void>
#define GTEST_3_TUPLE_(T) tuple<T##0, T##1, T##2, void, void, void, void, \
void, void, void>
#define GTEST_4_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, void, void, void, \
void, void, void>
#define GTEST_5_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, void, void, \
void, void, void>
#define GTEST_6_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, void, \
void, void, void>
#define GTEST_7_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \
void, void, void>
#define GTEST_8_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \
T##7, void, void>
#define GTEST_9_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \
T##7, T##8, void>
#define GTEST_10_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \
T##7, T##8, T##9>
// GTEST_n_TYPENAMES_(T) declares a list of n typenames.
#define GTEST_0_TYPENAMES_(T)
#define GTEST_1_TYPENAMES_(T) typename T##0
#define GTEST_2_TYPENAMES_(T) typename T##0, typename T##1
#define GTEST_3_TYPENAMES_(T) typename T##0, typename T##1, typename T##2
#define GTEST_4_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
typename T##3
#define GTEST_5_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
typename T##3, typename T##4
#define GTEST_6_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
typename T##3, typename T##4, typename T##5
#define GTEST_7_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
typename T##3, typename T##4, typename T##5, typename T##6
#define GTEST_8_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
typename T##3, typename T##4, typename T##5, typename T##6, typename T##7
#define GTEST_9_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
typename T##3, typename T##4, typename T##5, typename T##6, \
typename T##7, typename T##8
#define GTEST_10_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
typename T##3, typename T##4, typename T##5, typename T##6, \
typename T##7, typename T##8, typename T##9
// In theory, defining stuff in the ::std namespace is undefined
// behavior. We can do this as we are playing the role of a standard
// library vendor.
namespace std {
namespace tr1 {
template <typename T0 = void, typename T1 = void, typename T2 = void,
typename T3 = void, typename T4 = void, typename T5 = void,
typename T6 = void, typename T7 = void, typename T8 = void,
typename T9 = void>
class tuple;
// Anything in namespace gtest_internal is Google Test's INTERNAL
// IMPLEMENTATION DETAIL and MUST NOT BE USED DIRECTLY in user code.
namespace gtest_internal {
// ByRef<T>::type is T if T is a reference; otherwise it's const T&.
template <typename T>
struct ByRef { typedef const T& type; }; // NOLINT
template <typename T>
struct ByRef<T&> { typedef T& type; }; // NOLINT
// A handy wrapper for ByRef.
#define GTEST_BY_REF_(T) typename ::std::tr1::gtest_internal::ByRef<T>::type
// AddRef<T>::type is T if T is a reference; otherwise it's T&. This
// is the same as tr1::add_reference<T>::type.
template <typename T>
struct AddRef { typedef T& type; }; // NOLINT
template <typename T>
struct AddRef<T&> { typedef T& type; }; // NOLINT
// A handy wrapper for AddRef.
#define GTEST_ADD_REF_(T) typename ::std::tr1::gtest_internal::AddRef<T>::type
// A helper for implementing get<k>().
template <int k> class Get;
// A helper for implementing tuple_element<k, T>. kIndexValid is true
// iff k < the number of fields in tuple type T.
template <bool kIndexValid, int kIndex, class Tuple>
struct TupleElement;
template <GTEST_10_TYPENAMES_(T)>
struct TupleElement<true, 0, GTEST_10_TUPLE_(T)> { typedef T0 type; };
template <GTEST_10_TYPENAMES_(T)>
struct TupleElement<true, 1, GTEST_10_TUPLE_(T)> { typedef T1 type; };
template <GTEST_10_TYPENAMES_(T)>
struct TupleElement<true, 2, GTEST_10_TUPLE_(T)> { typedef T2 type; };
template <GTEST_10_TYPENAMES_(T)>
struct TupleElement<true, 3, GTEST_10_TUPLE_(T)> { typedef T3 type; };
template <GTEST_10_TYPENAMES_(T)>
struct TupleElement<true, 4, GTEST_10_TUPLE_(T)> { typedef T4 type; };
template <GTEST_10_TYPENAMES_(T)>
struct TupleElement<true, 5, GTEST_10_TUPLE_(T)> { typedef T5 type; };
template <GTEST_10_TYPENAMES_(T)>
struct TupleElement<true, 6, GTEST_10_TUPLE_(T)> { typedef T6 type; };
template <GTEST_10_TYPENAMES_(T)>
struct TupleElement<true, 7, GTEST_10_TUPLE_(T)> { typedef T7 type; };
template <GTEST_10_TYPENAMES_(T)>
struct TupleElement<true, 8, GTEST_10_TUPLE_(T)> { typedef T8 type; };
template <GTEST_10_TYPENAMES_(T)>
struct TupleElement<true, 9, GTEST_10_TUPLE_(T)> { typedef T9 type; };
} // namespace gtest_internal
template <>
class tuple<> {
public:
tuple() {}
tuple(const tuple& /* t */) {}
tuple& operator=(const tuple& /* t */) { return *this; }
};
template <GTEST_1_TYPENAMES_(T)>
class GTEST_1_TUPLE_(T) {
public:
template <int k> friend class gtest_internal::Get;
tuple() : f0_() {}
explicit tuple(GTEST_BY_REF_(T0) f0) : f0_(f0) {}
tuple(const tuple& t) : f0_(t.f0_) {}
template <GTEST_1_TYPENAMES_(U)>
tuple(const GTEST_1_TUPLE_(U)& t) : f0_(t.f0_) {}
tuple& operator=(const tuple& t) { return CopyFrom(t); }
template <GTEST_1_TYPENAMES_(U)>
tuple& operator=(const GTEST_1_TUPLE_(U)& t) {
return CopyFrom(t);
}
GTEST_DECLARE_TUPLE_AS_FRIEND_
template <GTEST_1_TYPENAMES_(U)>
tuple& CopyFrom(const GTEST_1_TUPLE_(U)& t) {
f0_ = t.f0_;
return *this;
}
T0 f0_;
};
template <GTEST_2_TYPENAMES_(T)>
class GTEST_2_TUPLE_(T) {
public:
template <int k> friend class gtest_internal::Get;
tuple() : f0_(), f1_() {}
explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1) : f0_(f0),
f1_(f1) {}
tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_) {}
template <GTEST_2_TYPENAMES_(U)>
tuple(const GTEST_2_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_) {}
template <typename U0, typename U1>
tuple(const ::std::pair<U0, U1>& p) : f0_(p.first), f1_(p.second) {}
tuple& operator=(const tuple& t) { return CopyFrom(t); }
template <GTEST_2_TYPENAMES_(U)>
tuple& operator=(const GTEST_2_TUPLE_(U)& t) {
return CopyFrom(t);
}
template <typename U0, typename U1>
tuple& operator=(const ::std::pair<U0, U1>& p) {
f0_ = p.first;
f1_ = p.second;
return *this;
}
GTEST_DECLARE_TUPLE_AS_FRIEND_
template <GTEST_2_TYPENAMES_(U)>
tuple& CopyFrom(const GTEST_2_TUPLE_(U)& t) {
f0_ = t.f0_;
f1_ = t.f1_;
return *this;
}
T0 f0_;
T1 f1_;
};
template <GTEST_3_TYPENAMES_(T)>
class GTEST_3_TUPLE_(T) {
public:
template <int k> friend class gtest_internal::Get;
tuple() : f0_(), f1_(), f2_() {}
explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
GTEST_BY_REF_(T2) f2) : f0_(f0), f1_(f1), f2_(f2) {}
tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_) {}
template <GTEST_3_TYPENAMES_(U)>
tuple(const GTEST_3_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_) {}
tuple& operator=(const tuple& t) { return CopyFrom(t); }
template <GTEST_3_TYPENAMES_(U)>
tuple& operator=(const GTEST_3_TUPLE_(U)& t) {
return CopyFrom(t);
}
GTEST_DECLARE_TUPLE_AS_FRIEND_
template <GTEST_3_TYPENAMES_(U)>
tuple& CopyFrom(const GTEST_3_TUPLE_(U)& t) {
f0_ = t.f0_;
f1_ = t.f1_;
f2_ = t.f2_;
return *this;
}
T0 f0_;
T1 f1_;
T2 f2_;
};
template <GTEST_4_TYPENAMES_(T)>
class GTEST_4_TUPLE_(T) {
public:
template <int k> friend class gtest_internal::Get;
tuple() : f0_(), f1_(), f2_(), f3_() {}
explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3) : f0_(f0), f1_(f1), f2_(f2),
f3_(f3) {}
tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_) {}
template <GTEST_4_TYPENAMES_(U)>
tuple(const GTEST_4_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
f3_(t.f3_) {}
tuple& operator=(const tuple& t) { return CopyFrom(t); }
template <GTEST_4_TYPENAMES_(U)>
tuple& operator=(const GTEST_4_TUPLE_(U)& t) {
return CopyFrom(t);
}
GTEST_DECLARE_TUPLE_AS_FRIEND_
template <GTEST_4_TYPENAMES_(U)>
tuple& CopyFrom(const GTEST_4_TUPLE_(U)& t) {
f0_ = t.f0_;
f1_ = t.f1_;
f2_ = t.f2_;
f3_ = t.f3_;
return *this;
}
T0 f0_;
T1 f1_;
T2 f2_;
T3 f3_;
};
template <GTEST_5_TYPENAMES_(T)>
class GTEST_5_TUPLE_(T) {
public:
template <int k> friend class gtest_internal::Get;
tuple() : f0_(), f1_(), f2_(), f3_(), f4_() {}
explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3,
GTEST_BY_REF_(T4) f4) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4) {}
tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
f4_(t.f4_) {}
template <GTEST_5_TYPENAMES_(U)>
tuple(const GTEST_5_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
f3_(t.f3_), f4_(t.f4_) {}
tuple& operator=(const tuple& t) { return CopyFrom(t); }
template <GTEST_5_TYPENAMES_(U)>
tuple& operator=(const GTEST_5_TUPLE_(U)& t) {
return CopyFrom(t);
}
GTEST_DECLARE_TUPLE_AS_FRIEND_
template <GTEST_5_TYPENAMES_(U)>
tuple& CopyFrom(const GTEST_5_TUPLE_(U)& t) {
f0_ = t.f0_;
f1_ = t.f1_;
f2_ = t.f2_;
f3_ = t.f3_;
f4_ = t.f4_;
return *this;
}
T0 f0_;
T1 f1_;
T2 f2_;
T3 f3_;
T4 f4_;
};
template <GTEST_6_TYPENAMES_(T)>
class GTEST_6_TUPLE_(T) {
public:
template <int k> friend class gtest_internal::Get;
tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_() {}
explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
GTEST_BY_REF_(T5) f5) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4),
f5_(f5) {}
tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
f4_(t.f4_), f5_(t.f5_) {}
template <GTEST_6_TYPENAMES_(U)>
tuple(const GTEST_6_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
f3_(t.f3_), f4_(t.f4_), f5_(t.f5_) {}
tuple& operator=(const tuple& t) { return CopyFrom(t); }
template <GTEST_6_TYPENAMES_(U)>
tuple& operator=(const GTEST_6_TUPLE_(U)& t) {
return CopyFrom(t);
}
GTEST_DECLARE_TUPLE_AS_FRIEND_
template <GTEST_6_TYPENAMES_(U)>
tuple& CopyFrom(const GTEST_6_TUPLE_(U)& t) {
f0_ = t.f0_;
f1_ = t.f1_;
f2_ = t.f2_;
f3_ = t.f3_;
f4_ = t.f4_;
f5_ = t.f5_;
return *this;
}
T0 f0_;
T1 f1_;
T2 f2_;
T3 f3_;
T4 f4_;
T5 f5_;
};
template <GTEST_7_TYPENAMES_(T)>
class GTEST_7_TUPLE_(T) {
public:
template <int k> friend class gtest_internal::Get;
tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_() {}
explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6) : f0_(f0), f1_(f1), f2_(f2),
f3_(f3), f4_(f4), f5_(f5), f6_(f6) {}
tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
f4_(t.f4_), f5_(t.f5_), f6_(t.f6_) {}
template <GTEST_7_TYPENAMES_(U)>
tuple(const GTEST_7_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_) {}
tuple& operator=(const tuple& t) { return CopyFrom(t); }
template <GTEST_7_TYPENAMES_(U)>
tuple& operator=(const GTEST_7_TUPLE_(U)& t) {
return CopyFrom(t);
}
GTEST_DECLARE_TUPLE_AS_FRIEND_
template <GTEST_7_TYPENAMES_(U)>
tuple& CopyFrom(const GTEST_7_TUPLE_(U)& t) {
f0_ = t.f0_;
f1_ = t.f1_;
f2_ = t.f2_;
f3_ = t.f3_;
f4_ = t.f4_;
f5_ = t.f5_;
f6_ = t.f6_;
return *this;
}
T0 f0_;
T1 f1_;
T2 f2_;
T3 f3_;
T4 f4_;
T5 f5_;
T6 f6_;
};
template <GTEST_8_TYPENAMES_(T)>
class GTEST_8_TUPLE_(T) {
public:
template <int k> friend class gtest_internal::Get;
tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_() {}
explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6,
GTEST_BY_REF_(T7) f7) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4),
f5_(f5), f6_(f6), f7_(f7) {}
tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_) {}
template <GTEST_8_TYPENAMES_(U)>
tuple(const GTEST_8_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_) {}
tuple& operator=(const tuple& t) { return CopyFrom(t); }
template <GTEST_8_TYPENAMES_(U)>
tuple& operator=(const GTEST_8_TUPLE_(U)& t) {
return CopyFrom(t);
}
GTEST_DECLARE_TUPLE_AS_FRIEND_
template <GTEST_8_TYPENAMES_(U)>
tuple& CopyFrom(const GTEST_8_TUPLE_(U)& t) {
f0_ = t.f0_;
f1_ = t.f1_;
f2_ = t.f2_;
f3_ = t.f3_;
f4_ = t.f4_;
f5_ = t.f5_;
f6_ = t.f6_;
f7_ = t.f7_;
return *this;
}
T0 f0_;
T1 f1_;
T2 f2_;
T3 f3_;
T4 f4_;
T5 f5_;
T6 f6_;
T7 f7_;
};
template <GTEST_9_TYPENAMES_(T)>
class GTEST_9_TUPLE_(T) {
public:
template <int k> friend class gtest_internal::Get;
tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_(), f8_() {}
explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6, GTEST_BY_REF_(T7) f7,
GTEST_BY_REF_(T8) f8) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4),
f5_(f5), f6_(f6), f7_(f7), f8_(f8) {}
tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_) {}
template <GTEST_9_TYPENAMES_(U)>
tuple(const GTEST_9_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_) {}
tuple& operator=(const tuple& t) { return CopyFrom(t); }
template <GTEST_9_TYPENAMES_(U)>
tuple& operator=(const GTEST_9_TUPLE_(U)& t) {
return CopyFrom(t);
}
GTEST_DECLARE_TUPLE_AS_FRIEND_
template <GTEST_9_TYPENAMES_(U)>
tuple& CopyFrom(const GTEST_9_TUPLE_(U)& t) {
f0_ = t.f0_;
f1_ = t.f1_;
f2_ = t.f2_;
f3_ = t.f3_;
f4_ = t.f4_;
f5_ = t.f5_;
f6_ = t.f6_;
f7_ = t.f7_;
f8_ = t.f8_;
return *this;
}
T0 f0_;
T1 f1_;
T2 f2_;
T3 f3_;
T4 f4_;
T5 f5_;
T6 f6_;
T7 f7_;
T8 f8_;
};
template <GTEST_10_TYPENAMES_(T)>
class tuple {
public:
template <int k> friend class gtest_internal::Get;
tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_(), f8_(),
f9_() {}
explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6, GTEST_BY_REF_(T7) f7,
GTEST_BY_REF_(T8) f8, GTEST_BY_REF_(T9) f9) : f0_(f0), f1_(f1), f2_(f2),
f3_(f3), f4_(f4), f5_(f5), f6_(f6), f7_(f7), f8_(f8), f9_(f9) {}
tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_), f9_(t.f9_) {}
template <GTEST_10_TYPENAMES_(U)>
tuple(const GTEST_10_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_),
f9_(t.f9_) {}
tuple& operator=(const tuple& t) { return CopyFrom(t); }
template <GTEST_10_TYPENAMES_(U)>
tuple& operator=(const GTEST_10_TUPLE_(U)& t) {
return CopyFrom(t);
}
GTEST_DECLARE_TUPLE_AS_FRIEND_
template <GTEST_10_TYPENAMES_(U)>
tuple& CopyFrom(const GTEST_10_TUPLE_(U)& t) {
f0_ = t.f0_;
f1_ = t.f1_;
f2_ = t.f2_;
f3_ = t.f3_;
f4_ = t.f4_;
f5_ = t.f5_;
f6_ = t.f6_;
f7_ = t.f7_;
f8_ = t.f8_;
f9_ = t.f9_;
return *this;
}
T0 f0_;
T1 f1_;
T2 f2_;
T3 f3_;
T4 f4_;
T5 f5_;
T6 f6_;
T7 f7_;
T8 f8_;
T9 f9_;
};
// 6.1.3.2 Tuple creation functions.
// Known limitations: we don't support passing an
// std::tr1::reference_wrapper<T> to make_tuple(). And we don't
// implement tie().
inline tuple<> make_tuple() { return tuple<>(); }
template <GTEST_1_TYPENAMES_(T)>
inline GTEST_1_TUPLE_(T) make_tuple(const T0& f0) {
return GTEST_1_TUPLE_(T)(f0);
}
template <GTEST_2_TYPENAMES_(T)>
inline GTEST_2_TUPLE_(T) make_tuple(const T0& f0, const T1& f1) {
return GTEST_2_TUPLE_(T)(f0, f1);
}
template <GTEST_3_TYPENAMES_(T)>
inline GTEST_3_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2) {
return GTEST_3_TUPLE_(T)(f0, f1, f2);
}
template <GTEST_4_TYPENAMES_(T)>
inline GTEST_4_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
const T3& f3) {
return GTEST_4_TUPLE_(T)(f0, f1, f2, f3);
}
template <GTEST_5_TYPENAMES_(T)>
inline GTEST_5_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
const T3& f3, const T4& f4) {
return GTEST_5_TUPLE_(T)(f0, f1, f2, f3, f4);
}
template <GTEST_6_TYPENAMES_(T)>
inline GTEST_6_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
const T3& f3, const T4& f4, const T5& f5) {
return GTEST_6_TUPLE_(T)(f0, f1, f2, f3, f4, f5);
}
template <GTEST_7_TYPENAMES_(T)>
inline GTEST_7_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
const T3& f3, const T4& f4, const T5& f5, const T6& f6) {
return GTEST_7_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6);
}
template <GTEST_8_TYPENAMES_(T)>
inline GTEST_8_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7) {
return GTEST_8_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7);
}
template <GTEST_9_TYPENAMES_(T)>
inline GTEST_9_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7,
const T8& f8) {
return GTEST_9_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7, f8);
}
template <GTEST_10_TYPENAMES_(T)>
inline GTEST_10_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7,
const T8& f8, const T9& f9) {
return GTEST_10_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7, f8, f9);
}
// 6.1.3.3 Tuple helper classes.
template <typename Tuple> struct tuple_size;
template <GTEST_0_TYPENAMES_(T)>
struct tuple_size<GTEST_0_TUPLE_(T)> { static const int value = 0; };
template <GTEST_1_TYPENAMES_(T)>
struct tuple_size<GTEST_1_TUPLE_(T)> { static const int value = 1; };
template <GTEST_2_TYPENAMES_(T)>
struct tuple_size<GTEST_2_TUPLE_(T)> { static const int value = 2; };
template <GTEST_3_TYPENAMES_(T)>
struct tuple_size<GTEST_3_TUPLE_(T)> { static const int value = 3; };
template <GTEST_4_TYPENAMES_(T)>
struct tuple_size<GTEST_4_TUPLE_(T)> { static const int value = 4; };
template <GTEST_5_TYPENAMES_(T)>
struct tuple_size<GTEST_5_TUPLE_(T)> { static const int value = 5; };
template <GTEST_6_TYPENAMES_(T)>
struct tuple_size<GTEST_6_TUPLE_(T)> { static const int value = 6; };
template <GTEST_7_TYPENAMES_(T)>
struct tuple_size<GTEST_7_TUPLE_(T)> { static const int value = 7; };
template <GTEST_8_TYPENAMES_(T)>
struct tuple_size<GTEST_8_TUPLE_(T)> { static const int value = 8; };
template <GTEST_9_TYPENAMES_(T)>
struct tuple_size<GTEST_9_TUPLE_(T)> { static const int value = 9; };
template <GTEST_10_TYPENAMES_(T)>
struct tuple_size<GTEST_10_TUPLE_(T)> { static const int value = 10; };
template <int k, class Tuple>
struct tuple_element {
typedef typename gtest_internal::TupleElement<
k < (tuple_size<Tuple>::value), k, Tuple>::type type;
};
#define GTEST_TUPLE_ELEMENT_(k, Tuple) typename tuple_element<k, Tuple >::type
// 6.1.3.4 Element access.
namespace gtest_internal {
template <>
class Get<0> {
public:
template <class Tuple>
static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(0, Tuple))
Field(Tuple& t) { return t.f0_; } // NOLINT
template <class Tuple>
static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(0, Tuple))
ConstField(const Tuple& t) { return t.f0_; }
};
template <>
class Get<1> {
public:
template <class Tuple>
static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(1, Tuple))
Field(Tuple& t) { return t.f1_; } // NOLINT
template <class Tuple>
static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(1, Tuple))
ConstField(const Tuple& t) { return t.f1_; }
};
template <>
class Get<2> {
public:
template <class Tuple>
static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(2, Tuple))
Field(Tuple& t) { return t.f2_; } // NOLINT
template <class Tuple>
static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(2, Tuple))
ConstField(const Tuple& t) { return t.f2_; }
};
template <>
class Get<3> {
public:
template <class Tuple>
static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(3, Tuple))
Field(Tuple& t) { return t.f3_; } // NOLINT
template <class Tuple>
static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(3, Tuple))
ConstField(const Tuple& t) { return t.f3_; }
};
template <>
class Get<4> {
public:
template <class Tuple>
static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(4, Tuple))
Field(Tuple& t) { return t.f4_; } // NOLINT
template <class Tuple>
static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(4, Tuple))
ConstField(const Tuple& t) { return t.f4_; }
};
template <>
class Get<5> {
public:
template <class Tuple>
static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(5, Tuple))
Field(Tuple& t) { return t.f5_; } // NOLINT
template <class Tuple>
static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(5, Tuple))
ConstField(const Tuple& t) { return t.f5_; }
};
template <>
class Get<6> {
public:
template <class Tuple>
static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(6, Tuple))
Field(Tuple& t) { return t.f6_; } // NOLINT
template <class Tuple>
static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(6, Tuple))
ConstField(const Tuple& t) { return t.f6_; }
};
template <>
class Get<7> {
public:
template <class Tuple>
static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(7, Tuple))
Field(Tuple& t) { return t.f7_; } // NOLINT
template <class Tuple>
static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(7, Tuple))
ConstField(const Tuple& t) { return t.f7_; }
};
template <>
class Get<8> {
public:
template <class Tuple>
static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(8, Tuple))
Field(Tuple& t) { return t.f8_; } // NOLINT
template <class Tuple>
static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(8, Tuple))
ConstField(const Tuple& t) { return t.f8_; }
};
template <>
class Get<9> {
public:
template <class Tuple>
static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(9, Tuple))
Field(Tuple& t) { return t.f9_; } // NOLINT
template <class Tuple>
static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(9, Tuple))
ConstField(const Tuple& t) { return t.f9_; }
};
} // namespace gtest_internal
template <int k, GTEST_10_TYPENAMES_(T)>
GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(k, GTEST_10_TUPLE_(T)))
get(GTEST_10_TUPLE_(T)& t) {
return gtest_internal::Get<k>::Field(t);
}
template <int k, GTEST_10_TYPENAMES_(T)>
GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(k, GTEST_10_TUPLE_(T)))
get(const GTEST_10_TUPLE_(T)& t) {
return gtest_internal::Get<k>::ConstField(t);
}
// 6.1.3.5 Relational operators
// We only implement == and !=, as we don't have a need for the rest yet.
namespace gtest_internal {
// SameSizeTuplePrefixComparator<k, k>::Eq(t1, t2) returns true if the
// first k fields of t1 equals the first k fields of t2.
// SameSizeTuplePrefixComparator(k1, k2) would be a compiler error if
// k1 != k2.
template <int kSize1, int kSize2>
struct SameSizeTuplePrefixComparator;
template <>
struct SameSizeTuplePrefixComparator<0, 0> {
template <class Tuple1, class Tuple2>
static bool Eq(const Tuple1& /* t1 */, const Tuple2& /* t2 */) {
return true;
}
};
template <int k>
struct SameSizeTuplePrefixComparator<k, k> {
template <class Tuple1, class Tuple2>
static bool Eq(const Tuple1& t1, const Tuple2& t2) {
return SameSizeTuplePrefixComparator<k - 1, k - 1>::Eq(t1, t2) &&
::std::tr1::get<k - 1>(t1) == ::std::tr1::get<k - 1>(t2);
}
};
} // namespace gtest_internal
template <GTEST_10_TYPENAMES_(T), GTEST_10_TYPENAMES_(U)>
inline bool operator==(const GTEST_10_TUPLE_(T)& t,
const GTEST_10_TUPLE_(U)& u) {
return gtest_internal::SameSizeTuplePrefixComparator<
tuple_size<GTEST_10_TUPLE_(T)>::value,
tuple_size<GTEST_10_TUPLE_(U)>::value>::Eq(t, u);
}
template <GTEST_10_TYPENAMES_(T), GTEST_10_TYPENAMES_(U)>
inline bool operator!=(const GTEST_10_TUPLE_(T)& t,
const GTEST_10_TUPLE_(U)& u) { return !(t == u); }
// 6.1.4 Pairs.
// Unimplemented.
} // namespace tr1
} // namespace std
#undef GTEST_0_TUPLE_
#undef GTEST_1_TUPLE_
#undef GTEST_2_TUPLE_
#undef GTEST_3_TUPLE_
#undef GTEST_4_TUPLE_
#undef GTEST_5_TUPLE_
#undef GTEST_6_TUPLE_
#undef GTEST_7_TUPLE_
#undef GTEST_8_TUPLE_
#undef GTEST_9_TUPLE_
#undef GTEST_10_TUPLE_
#undef GTEST_0_TYPENAMES_
#undef GTEST_1_TYPENAMES_
#undef GTEST_2_TYPENAMES_
#undef GTEST_3_TYPENAMES_
#undef GTEST_4_TYPENAMES_
#undef GTEST_5_TYPENAMES_
#undef GTEST_6_TYPENAMES_
#undef GTEST_7_TYPENAMES_
#undef GTEST_8_TYPENAMES_
#undef GTEST_9_TYPENAMES_
#undef GTEST_10_TYPENAMES_
#undef GTEST_DECLARE_TUPLE_AS_FRIEND_
#undef GTEST_BY_REF_
#undef GTEST_ADD_REF_
#undef GTEST_TUPLE_ELEMENT_
#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_

View File

@@ -0,0 +1,336 @@
$$ -*- mode: c++; -*-
$var n = 10 $$ Maximum number of tuple fields we want to support.
$$ This meta comment fixes auto-indentation in Emacs. }}
// Copyright 2009 Google Inc.
// All Rights Reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// Author: wan@google.com (Zhanyong Wan)
// Implements a subset of TR1 tuple needed by Google Test and Google Mock.
#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_
#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_
#include <utility> // For ::std::pair.
// The compiler used in Symbian has a bug that prevents us from declaring the
// tuple template as a friend (it complains that tuple is redefined). This
// hack bypasses the bug by declaring the members that should otherwise be
// private as public.
// Sun Studio versions < 12 also have the above bug.
#if defined(__SYMBIAN32__) || (defined(__SUNPRO_CC) && __SUNPRO_CC < 0x590)
# define GTEST_DECLARE_TUPLE_AS_FRIEND_ public:
#else
# define GTEST_DECLARE_TUPLE_AS_FRIEND_ \
template <GTEST_$(n)_TYPENAMES_(U)> friend class tuple; \
private:
#endif
$range i 0..n-1
$range j 0..n
$range k 1..n
// GTEST_n_TUPLE_(T) is the type of an n-tuple.
#define GTEST_0_TUPLE_(T) tuple<>
$for k [[
$range m 0..k-1
$range m2 k..n-1
#define GTEST_$(k)_TUPLE_(T) tuple<$for m, [[T##$m]]$for m2 [[, void]]>
]]
// GTEST_n_TYPENAMES_(T) declares a list of n typenames.
$for j [[
$range m 0..j-1
#define GTEST_$(j)_TYPENAMES_(T) $for m, [[typename T##$m]]
]]
// In theory, defining stuff in the ::std namespace is undefined
// behavior. We can do this as we are playing the role of a standard
// library vendor.
namespace std {
namespace tr1 {
template <$for i, [[typename T$i = void]]>
class tuple;
// Anything in namespace gtest_internal is Google Test's INTERNAL
// IMPLEMENTATION DETAIL and MUST NOT BE USED DIRECTLY in user code.
namespace gtest_internal {
// ByRef<T>::type is T if T is a reference; otherwise it's const T&.
template <typename T>
struct ByRef { typedef const T& type; }; // NOLINT
template <typename T>
struct ByRef<T&> { typedef T& type; }; // NOLINT
// A handy wrapper for ByRef.
#define GTEST_BY_REF_(T) typename ::std::tr1::gtest_internal::ByRef<T>::type
// AddRef<T>::type is T if T is a reference; otherwise it's T&. This
// is the same as tr1::add_reference<T>::type.
template <typename T>
struct AddRef { typedef T& type; }; // NOLINT
template <typename T>
struct AddRef<T&> { typedef T& type; }; // NOLINT
// A handy wrapper for AddRef.
#define GTEST_ADD_REF_(T) typename ::std::tr1::gtest_internal::AddRef<T>::type
// A helper for implementing get<k>().
template <int k> class Get;
// A helper for implementing tuple_element<k, T>. kIndexValid is true
// iff k < the number of fields in tuple type T.
template <bool kIndexValid, int kIndex, class Tuple>
struct TupleElement;
$for i [[
template <GTEST_$(n)_TYPENAMES_(T)>
struct TupleElement<true, $i, GTEST_$(n)_TUPLE_(T)> [[]]
{ typedef T$i type; };
]]
} // namespace gtest_internal
template <>
class tuple<> {
public:
tuple() {}
tuple(const tuple& /* t */) {}
tuple& operator=(const tuple& /* t */) { return *this; }
};
$for k [[
$range m 0..k-1
template <GTEST_$(k)_TYPENAMES_(T)>
class $if k < n [[GTEST_$(k)_TUPLE_(T)]] $else [[tuple]] {
public:
template <int k> friend class gtest_internal::Get;
tuple() : $for m, [[f$(m)_()]] {}
explicit tuple($for m, [[GTEST_BY_REF_(T$m) f$m]]) : [[]]
$for m, [[f$(m)_(f$m)]] {}
tuple(const tuple& t) : $for m, [[f$(m)_(t.f$(m)_)]] {}
template <GTEST_$(k)_TYPENAMES_(U)>
tuple(const GTEST_$(k)_TUPLE_(U)& t) : $for m, [[f$(m)_(t.f$(m)_)]] {}
$if k == 2 [[
template <typename U0, typename U1>
tuple(const ::std::pair<U0, U1>& p) : f0_(p.first), f1_(p.second) {}
]]
tuple& operator=(const tuple& t) { return CopyFrom(t); }
template <GTEST_$(k)_TYPENAMES_(U)>
tuple& operator=(const GTEST_$(k)_TUPLE_(U)& t) {
return CopyFrom(t);
}
$if k == 2 [[
template <typename U0, typename U1>
tuple& operator=(const ::std::pair<U0, U1>& p) {
f0_ = p.first;
f1_ = p.second;
return *this;
}
]]
GTEST_DECLARE_TUPLE_AS_FRIEND_
template <GTEST_$(k)_TYPENAMES_(U)>
tuple& CopyFrom(const GTEST_$(k)_TUPLE_(U)& t) {
$for m [[
f$(m)_ = t.f$(m)_;
]]
return *this;
}
$for m [[
T$m f$(m)_;
]]
};
]]
// 6.1.3.2 Tuple creation functions.
// Known limitations: we don't support passing an
// std::tr1::reference_wrapper<T> to make_tuple(). And we don't
// implement tie().
inline tuple<> make_tuple() { return tuple<>(); }
$for k [[
$range m 0..k-1
template <GTEST_$(k)_TYPENAMES_(T)>
inline GTEST_$(k)_TUPLE_(T) make_tuple($for m, [[const T$m& f$m]]) {
return GTEST_$(k)_TUPLE_(T)($for m, [[f$m]]);
}
]]
// 6.1.3.3 Tuple helper classes.
template <typename Tuple> struct tuple_size;
$for j [[
template <GTEST_$(j)_TYPENAMES_(T)>
struct tuple_size<GTEST_$(j)_TUPLE_(T)> { static const int value = $j; };
]]
template <int k, class Tuple>
struct tuple_element {
typedef typename gtest_internal::TupleElement<
k < (tuple_size<Tuple>::value), k, Tuple>::type type;
};
#define GTEST_TUPLE_ELEMENT_(k, Tuple) typename tuple_element<k, Tuple >::type
// 6.1.3.4 Element access.
namespace gtest_internal {
$for i [[
template <>
class Get<$i> {
public:
template <class Tuple>
static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_($i, Tuple))
Field(Tuple& t) { return t.f$(i)_; } // NOLINT
template <class Tuple>
static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_($i, Tuple))
ConstField(const Tuple& t) { return t.f$(i)_; }
};
]]
} // namespace gtest_internal
template <int k, GTEST_$(n)_TYPENAMES_(T)>
GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(k, GTEST_$(n)_TUPLE_(T)))
get(GTEST_$(n)_TUPLE_(T)& t) {
return gtest_internal::Get<k>::Field(t);
}
template <int k, GTEST_$(n)_TYPENAMES_(T)>
GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(k, GTEST_$(n)_TUPLE_(T)))
get(const GTEST_$(n)_TUPLE_(T)& t) {
return gtest_internal::Get<k>::ConstField(t);
}
// 6.1.3.5 Relational operators
// We only implement == and !=, as we don't have a need for the rest yet.
namespace gtest_internal {
// SameSizeTuplePrefixComparator<k, k>::Eq(t1, t2) returns true if the
// first k fields of t1 equals the first k fields of t2.
// SameSizeTuplePrefixComparator(k1, k2) would be a compiler error if
// k1 != k2.
template <int kSize1, int kSize2>
struct SameSizeTuplePrefixComparator;
template <>
struct SameSizeTuplePrefixComparator<0, 0> {
template <class Tuple1, class Tuple2>
static bool Eq(const Tuple1& /* t1 */, const Tuple2& /* t2 */) {
return true;
}
};
template <int k>
struct SameSizeTuplePrefixComparator<k, k> {
template <class Tuple1, class Tuple2>
static bool Eq(const Tuple1& t1, const Tuple2& t2) {
return SameSizeTuplePrefixComparator<k - 1, k - 1>::Eq(t1, t2) &&
::std::tr1::get<k - 1>(t1) == ::std::tr1::get<k - 1>(t2);
}
};
} // namespace gtest_internal
template <GTEST_$(n)_TYPENAMES_(T), GTEST_$(n)_TYPENAMES_(U)>
inline bool operator==(const GTEST_$(n)_TUPLE_(T)& t,
const GTEST_$(n)_TUPLE_(U)& u) {
return gtest_internal::SameSizeTuplePrefixComparator<
tuple_size<GTEST_$(n)_TUPLE_(T)>::value,
tuple_size<GTEST_$(n)_TUPLE_(U)>::value>::Eq(t, u);
}
template <GTEST_$(n)_TYPENAMES_(T), GTEST_$(n)_TYPENAMES_(U)>
inline bool operator!=(const GTEST_$(n)_TUPLE_(T)& t,
const GTEST_$(n)_TUPLE_(U)& u) { return !(t == u); }
// 6.1.4 Pairs.
// Unimplemented.
} // namespace tr1
} // namespace std
$for j [[
#undef GTEST_$(j)_TUPLE_
]]
$for j [[
#undef GTEST_$(j)_TYPENAMES_
]]
#undef GTEST_DECLARE_TUPLE_AS_FRIEND_
#undef GTEST_BY_REF_
#undef GTEST_ADD_REF_
#undef GTEST_TUPLE_ELEMENT_
#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,296 @@
$$ -*- mode: c++; -*-
$var n = 50 $$ Maximum length of type lists we want to support.
// Copyright 2008 Google Inc.
// All Rights Reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// Author: wan@google.com (Zhanyong Wan)
// Type utilities needed for implementing typed and type-parameterized
// tests. This file is generated by a SCRIPT. DO NOT EDIT BY HAND!
//
// Currently we support at most $n types in a list, and at most $n
// type-parameterized tests in one type-parameterized test case.
// Please contact googletestframework@googlegroups.com if you need
// more.
#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
#include "gtest/internal/gtest-port.h"
#include "gtest/internal/gtest-string.h"
// #ifdef __GNUC__ is too general here. It is possible to use gcc without using
// libstdc++ (which is where cxxabi.h comes from).
# ifdef __GLIBCXX__
# include <cxxabi.h>
# elif defined(__HP_aCC)
# include <acxx_demangle.h>
# endif // __GLIBCXX__
namespace testing {
namespace internal {
// GetTypeName<T>() returns a human-readable name of type T.
// NB: This function is also used in Google Mock, so don't move it inside of
// the typed-test-only section below.
template <typename T>
String GetTypeName() {
# if GTEST_HAS_RTTI
const char* const name = typeid(T).name();
# if defined(__GLIBCXX__) || defined(__HP_aCC)
int status = 0;
// gcc's implementation of typeid(T).name() mangles the type name,
// so we have to demangle it.
# ifdef __GLIBCXX__
using abi::__cxa_demangle;
# endif // __GLIBCXX__
char* const readable_name = __cxa_demangle(name, 0, 0, &status);
const String name_str(status == 0 ? readable_name : name);
free(readable_name);
return name_str;
# else
return name;
# endif // __GLIBCXX__ || __HP_aCC
# else
return "<type>";
# endif // GTEST_HAS_RTTI
}
#if GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
// AssertyTypeEq<T1, T2>::type is defined iff T1 and T2 are the same
// type. This can be used as a compile-time assertion to ensure that
// two types are equal.
template <typename T1, typename T2>
struct AssertTypeEq;
template <typename T>
struct AssertTypeEq<T, T> {
typedef bool type;
};
// A unique type used as the default value for the arguments of class
// template Types. This allows us to simulate variadic templates
// (e.g. Types<int>, Type<int, double>, and etc), which C++ doesn't
// support directly.
struct None {};
// The following family of struct and struct templates are used to
// represent type lists. In particular, TypesN<T1, T2, ..., TN>
// represents a type list with N types (T1, T2, ..., and TN) in it.
// Except for Types0, every struct in the family has two member types:
// Head for the first type in the list, and Tail for the rest of the
// list.
// The empty type list.
struct Types0 {};
// Type lists of length 1, 2, 3, and so on.
template <typename T1>
struct Types1 {
typedef T1 Head;
typedef Types0 Tail;
};
$range i 2..n
$for i [[
$range j 1..i
$range k 2..i
template <$for j, [[typename T$j]]>
struct Types$i {
typedef T1 Head;
typedef Types$(i-1)<$for k, [[T$k]]> Tail;
};
]]
} // namespace internal
// We don't want to require the users to write TypesN<...> directly,
// as that would require them to count the length. Types<...> is much
// easier to write, but generates horrible messages when there is a
// compiler error, as gcc insists on printing out each template
// argument, even if it has the default value (this means Types<int>
// will appear as Types<int, None, None, ..., None> in the compiler
// errors).
//
// Our solution is to combine the best part of the two approaches: a
// user would write Types<T1, ..., TN>, and Google Test will translate
// that to TypesN<T1, ..., TN> internally to make error messages
// readable. The translation is done by the 'type' member of the
// Types template.
$range i 1..n
template <$for i, [[typename T$i = internal::None]]>
struct Types {
typedef internal::Types$n<$for i, [[T$i]]> type;
};
template <>
struct Types<$for i, [[internal::None]]> {
typedef internal::Types0 type;
};
$range i 1..n-1
$for i [[
$range j 1..i
$range k i+1..n
template <$for j, [[typename T$j]]>
struct Types<$for j, [[T$j]]$for k[[, internal::None]]> {
typedef internal::Types$i<$for j, [[T$j]]> type;
};
]]
namespace internal {
# define GTEST_TEMPLATE_ template <typename T> class
// The template "selector" struct TemplateSel<Tmpl> is used to
// represent Tmpl, which must be a class template with one type
// parameter, as a type. TemplateSel<Tmpl>::Bind<T>::type is defined
// as the type Tmpl<T>. This allows us to actually instantiate the
// template "selected" by TemplateSel<Tmpl>.
//
// This trick is necessary for simulating typedef for class templates,
// which C++ doesn't support directly.
template <GTEST_TEMPLATE_ Tmpl>
struct TemplateSel {
template <typename T>
struct Bind {
typedef Tmpl<T> type;
};
};
# define GTEST_BIND_(TmplSel, T) \
TmplSel::template Bind<T>::type
// A unique struct template used as the default value for the
// arguments of class template Templates. This allows us to simulate
// variadic templates (e.g. Templates<int>, Templates<int, double>,
// and etc), which C++ doesn't support directly.
template <typename T>
struct NoneT {};
// The following family of struct and struct templates are used to
// represent template lists. In particular, TemplatesN<T1, T2, ...,
// TN> represents a list of N templates (T1, T2, ..., and TN). Except
// for Templates0, every struct in the family has two member types:
// Head for the selector of the first template in the list, and Tail
// for the rest of the list.
// The empty template list.
struct Templates0 {};
// Template lists of length 1, 2, 3, and so on.
template <GTEST_TEMPLATE_ T1>
struct Templates1 {
typedef TemplateSel<T1> Head;
typedef Templates0 Tail;
};
$range i 2..n
$for i [[
$range j 1..i
$range k 2..i
template <$for j, [[GTEST_TEMPLATE_ T$j]]>
struct Templates$i {
typedef TemplateSel<T1> Head;
typedef Templates$(i-1)<$for k, [[T$k]]> Tail;
};
]]
// We don't want to require the users to write TemplatesN<...> directly,
// as that would require them to count the length. Templates<...> is much
// easier to write, but generates horrible messages when there is a
// compiler error, as gcc insists on printing out each template
// argument, even if it has the default value (this means Templates<list>
// will appear as Templates<list, NoneT, NoneT, ..., NoneT> in the compiler
// errors).
//
// Our solution is to combine the best part of the two approaches: a
// user would write Templates<T1, ..., TN>, and Google Test will translate
// that to TemplatesN<T1, ..., TN> internally to make error messages
// readable. The translation is done by the 'type' member of the
// Templates template.
$range i 1..n
template <$for i, [[GTEST_TEMPLATE_ T$i = NoneT]]>
struct Templates {
typedef Templates$n<$for i, [[T$i]]> type;
};
template <>
struct Templates<$for i, [[NoneT]]> {
typedef Templates0 type;
};
$range i 1..n-1
$for i [[
$range j 1..i
$range k i+1..n
template <$for j, [[GTEST_TEMPLATE_ T$j]]>
struct Templates<$for j, [[T$j]]$for k[[, NoneT]]> {
typedef Templates$i<$for j, [[T$j]]> type;
};
]]
// The TypeList template makes it possible to use either a single type
// or a Types<...> list in TYPED_TEST_CASE() and
// INSTANTIATE_TYPED_TEST_CASE_P().
template <typename T>
struct TypeList { typedef Types1<T> type; };
$range i 1..n
template <$for i, [[typename T$i]]>
struct TypeList<Types<$for i, [[T$i]]> > {
typedef typename Types<$for i, [[T$i]]>::type type;
};
#endif // GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
} // namespace internal
} // namespace testing
#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,660 @@
//**************************************************************************
//* Microsoft Windows **
//* Copyright (c) 1996 - 2001 Microsoft Corporation. All rights reserved. **
//**************************************************************************
//;begin_internal
/***********************************************************************************************
This is a distributed SDK component - do not put any #includes or other directives that rely
upon files not dropped. If in doubt - build iedev
If you add comments please include either ;BUGBUG at the beginning of a single line OR
enclose in a ;begin_internal, ;end_internal block - such as this one!
***********************************************************************************************/
//;end_internal
//;begin_internal
#ifndef __MSXML2DID_H__
#define __MSXML2DID_H__
//;end_internal
#define DISPID_XOBJ_MIN 0x00010000
#define DISPID_XOBJ_MAX 0x0001FFFF
#define DISPID_XOBJ_BASE DISPID_XOBJ_MIN
#define DISPID_XMLELEMENTCOLLECTION DISPID_XOBJ_BASE
#define DISPID_XMLELEMENTCOLLECTION_LENGTH DISPID_XMLELEMENTCOLLECTION + 1
#define DISPID_XMLELEMENTCOLLECTION_NEWENUM DISPID_NEWENUM
#define DISPID_XMLELEMENTCOLLECTION_ITEM DISPID_XMLELEMENTCOLLECTION + 3
#define DISPID_XMLDOCUMENT DISPID_XMLELEMENTCOLLECTION + 100
#define DISPID_XMLDOCUMENT_ROOT DISPID_XMLDOCUMENT + 1
#define DISPID_XMLDOCUMENT_FILESIZE DISPID_XMLDOCUMENT + 2
#define DISPID_XMLDOCUMENT_FILEMODIFIEDDATE DISPID_XMLDOCUMENT + 3
#define DISPID_XMLDOCUMENT_FILEUPDATEDDATE DISPID_XMLDOCUMENT + 4
#define DISPID_XMLDOCUMENT_URL DISPID_XMLDOCUMENT + 5
#define DISPID_XMLDOCUMENT_MIMETYPE DISPID_XMLDOCUMENT + 6
#define DISPID_XMLDOCUMENT_READYSTATE DISPID_XMLDOCUMENT + 7
#define DISPID_XMLDOCUMENT_CREATEELEMENT DISPID_XMLDOCUMENT + 8
#define DISPID_XMLDOCUMENT_CHARSET DISPID_XMLDOCUMENT + 9
#define DISPID_XMLDOCUMENT_VERSION DISPID_XMLDOCUMENT + 10
#define DISPID_XMLDOCUMENT_DOCTYPE DISPID_XMLDOCUMENT + 11
#define DISPID_XMLDOCUMENT_DTDURL DISPID_XMLDOCUMENT + 12
#define DISPID_XMLDOCUMENT_ASYNC DISPID_XMLDOCUMENT + 13
#define DISPID_XMLDOCUMENT_CASEINSENSITIVE DISPID_XMLDOCUMENT + 14
#define DISPID_XMLDOCUMENT_BASEURL DISPID_XMLDOCUMENT + 15
#define DISPID_XMLDOCUMENT_XML DISPID_XMLDOCUMENT + 16
#define DISPID_XMLDOCUMENT_LASTERROR DISPID_XMLDOCUMENT + 17
#define DISPID_XMLDOCUMENT_TRIMWHITESPACE DISPID_XMLDOCUMENT + 18
#define DISPID_XMLDOCUMENT_COMMIT DISPID_XMLDOCUMENT + 19
#define DISPID_XMLELEMENT DISPID_XMLDOCUMENT + 100
#define DISPID_XMLELEMENT_TAGNAME DISPID_XMLELEMENT + 1
#define DISPID_XMLELEMENT_PARENT DISPID_XMLELEMENT + 2
#define DISPID_XMLELEMENT_SETATTRIBUTE DISPID_XMLELEMENT + 3
#define DISPID_XMLELEMENT_GETATTRIBUTE DISPID_XMLELEMENT + 4
#define DISPID_XMLELEMENT_REMOVEATTRIBUTE DISPID_XMLELEMENT + 5
#define DISPID_XMLELEMENT_CHILDREN DISPID_XMLELEMENT + 6
#define DISPID_XMLELEMENT_TYPE DISPID_XMLELEMENT + 7
#define DISPID_XMLELEMENT_TEXT DISPID_XMLELEMENT + 8
#define DISPID_XMLELEMENT_ADDCHILD DISPID_XMLELEMENT + 9
#define DISPID_XMLELEMENT_REMOVECHILD DISPID_XMLELEMENT + 10
#define DISPID_XMLELEMENT_ATTRIBUTES DISPID_XMLELEMENT + 11
#define DISPID_XMLNOTIFSINK DISPID_XMLELEMENT + 100
#define DISPID_XMLNOTIFSINK_CHILDADDED DISPID_XMLNOTIFSINK + 1
#define DISPID_XMLATTRIBUTE DISPID_XMLNOTIFSINK + 100
#define DISPID_XMLATTRIBUTE_NAME DISPID_XMLATTRIBUTE + 1
#define DISPID_XMLATTRIBUTE_VALUE DISPID_XMLATTRIBUTE + 2
// IXMLError2
#define DISPID_XMLERROR DISPID_XMLNOTIFSINK + 100
#define DISPID_XMLERROR_REASON DISPID_XMLERROR + 1
#define DISPID_XMLERROR_LINE DISPID_XMLERROR + 2
#define DISPID_XMLERROR_POS DISPID_XMLERROR + 3
// INode
#define DISPID_NODE DISPID_XMLERROR + 100
#define DISPID_NODE_NAME DISPID_NODE + 1
#define DISPID_NODE_PARENT DISPID_NODE + 2
#define DISPID_NODE_TYPE DISPID_NODE + 3
#define DISPID_NODE_VALUE DISPID_NODE + 4
#define DISPID_NODE_SETATTRIBUTE DISPID_NODE + 5
#define DISPID_NODE_GETATTRIBUTE DISPID_NODE + 6
#define DISPID_NODE_REMOVEATTRIBUTE DISPID_NODE + 7
#define DISPID_NODE_ATTRIBUTES DISPID_NODE + 8
#define DISPID_NODE_ADD DISPID_NODE + 9
#define DISPID_NODE_REMOVE DISPID_NODE + 10
#define DISPID_NODE_CHILDREN DISPID_NODE + 11
// INodeList
#define DISPID_NODELIST DISPID_NODE + 100
#define DISPID_NODELIST_NEWENUM DISPID_NODELIST + 1
#define DISPID_NODELIST_NEXT DISPID_NODELIST + 2
#define DISPID_NODELIST_CURRENT DISPID_NODELIST + 3
#define DISPID_NODELIST_MOVE DISPID_NODELIST + 4
#define DISPID_NODELIST_MOVETONODE DISPID_NODELIST + 5
#define DISPID_NODELIST_LENGTH DISPID_NODELIST + 6
#define DISPID_NODELIST_ITEM DISPID_NODELIST + 7
// Our dispids need to be mapped into the range 1..9999 to keep Trident happy
// specifically, to make the XML tag more efficient. (simonb, 09-18-1998)
#define DISPID_DOM_BASE 0x00000001
#define DISPID_DOM_COLLECTION_BASE 1000000
#define DISPID_DOM_COLLECTION_MAX 2999999
#define DISPID_DOM_NODE (DISPID_DOM_BASE)
#define DISPID_DOM_NODE_NODENAME (DISPID_DOM_NODE + 1)
#define DISPID_DOM_NODE_NODEVALUE (DISPID_DOM_NODE + 2)
#define DISPID_DOM_NODE_NODETYPE (DISPID_DOM_NODE + 3)
#define DISPID_DOM_NODE_NODETYPEENUM (DISPID_DOM_NODE + 4)
#define DISPID_DOM_NODE_PARENTNODE (DISPID_DOM_NODE + 5)
#define DISPID_DOM_NODE_CHILDNODES (DISPID_DOM_NODE + 6)
#define DISPID_DOM_NODE_FIRSTCHILD (DISPID_DOM_NODE + 7)
#define DISPID_DOM_NODE_LASTCHILD (DISPID_DOM_NODE + 8)
#define DISPID_DOM_NODE_PREVIOUSSIBLING (DISPID_DOM_NODE + 9)
#define DISPID_DOM_NODE_NEXTSIBLING (DISPID_DOM_NODE + 10)
#define DISPID_DOM_NODE_ATTRIBUTES (DISPID_DOM_NODE + 11)
#define DISPID_DOM_NODE_INSERTBEFORE (DISPID_DOM_NODE + 12)
#define DISPID_DOM_NODE_REPLACECHILD (DISPID_DOM_NODE + 13)
#define DISPID_DOM_NODE_REMOVECHILD (DISPID_DOM_NODE + 14)
#define DISPID_DOM_NODE_APPENDCHILD (DISPID_DOM_NODE + 15)
#define DISPID_DOM_NODE_HASCHILDNODES (DISPID_DOM_NODE + 16)
#define DISPID_DOM_NODE_OWNERDOC (DISPID_DOM_NODE + 17)
#define DISPID_DOM_NODE_CLONENODE (DISPID_DOM_NODE + 18)
#define DISPID_XMLDOM_NODE (DISPID_DOM_NODE + 19)
#define DISPID_XMLDOM_NODE_STRINGTYPE (DISPID_XMLDOM_NODE + 1)
#define DISPID_XMLDOM_NODE_SPECIFIED (DISPID_XMLDOM_NODE + 2)
#define DISPID_XMLDOM_NODE_DEFINITION (DISPID_XMLDOM_NODE + 3)
#define DISPID_XMLDOM_NODE_TEXT (DISPID_XMLDOM_NODE + 4)
#define DISPID_XMLDOM_NODE_NODETYPEDVALUE (DISPID_XMLDOM_NODE + 5)
#define DISPID_XMLDOM_NODE_DATATYPE (DISPID_XMLDOM_NODE + 6)
#define DISPID_XMLDOM_NODE_XML (DISPID_XMLDOM_NODE + 7)
#define DISPID_XMLDOM_NODE_TRANSFORMNODE (DISPID_XMLDOM_NODE + 8)
#define DISPID_XMLDOM_NODE_SELECTNODES (DISPID_XMLDOM_NODE + 9)
#define DISPID_XMLDOM_NODE_SELECTSINGLENODE (DISPID_XMLDOM_NODE + 10)
#define DISPID_XMLDOM_NODE_PARSED (DISPID_XMLDOM_NODE + 11)
#define DISPID_XMLDOM_NODE_NAMESPACE (DISPID_XMLDOM_NODE + 12)
#define DISPID_XMLDOM_NODE_PREFIX (DISPID_XMLDOM_NODE + 13)
#define DISPID_XMLDOM_NODE_BASENAME (DISPID_XMLDOM_NODE + 14)
#define DISPID_XMLDOM_NODE_TRANSFORMNODETOOBJECT (DISPID_XMLDOM_NODE + 15)
#define DISPID_XMLDOM_NODE__TOP (DISPID_XMLDOM_NODE + 16)
#define DISPID_DOM_DOCUMENT (DISPID_XMLDOM_NODE__TOP + 1)
#define DISPID_DOM_DOCUMENT_DOCTYPE (DISPID_DOM_DOCUMENT + 1)
#define DISPID_DOM_DOCUMENT_IMPLEMENTATION (DISPID_DOM_DOCUMENT + 2)
#define DISPID_DOM_DOCUMENT_DOCUMENTELEMENT (DISPID_DOM_DOCUMENT + 3)
#define DISPID_DOM_DOCUMENT_CREATEELEMENT (DISPID_DOM_DOCUMENT + 4)
#define DISPID_DOM_DOCUMENT_CREATEDOCUMENTFRAGMENT (DISPID_DOM_DOCUMENT + 5)
#define DISPID_DOM_DOCUMENT_CREATETEXTNODE (DISPID_DOM_DOCUMENT + 6)
#define DISPID_DOM_DOCUMENT_CREATECOMMENT (DISPID_DOM_DOCUMENT + 7)
#define DISPID_DOM_DOCUMENT_CREATECDATASECTION (DISPID_DOM_DOCUMENT + 8)
#define DISPID_DOM_DOCUMENT_CREATEPROCESSINGINSTRUCTION (DISPID_DOM_DOCUMENT + 9)
#define DISPID_DOM_DOCUMENT_CREATEATTRIBUTE (DISPID_DOM_DOCUMENT + 10)
#define DISPID_DOM_DOCUMENT_CREATEENTITY (DISPID_DOM_DOCUMENT + 11)
#define DISPID_DOM_DOCUMENT_CREATEENTITYREFERENCE (DISPID_DOM_DOCUMENT + 12)
#define DISPID_DOM_DOCUMENT_GETELEMENTSBYTAGNAME (DISPID_DOM_DOCUMENT + 13)
#define DISPID_DOM_DOCUMENT_TOP (DISPID_DOM_DOCUMENT + 14)
#define DISPID_XMLDOM_DOCUMENT (DISPID_DOM_DOCUMENT + 15)
#define DISPID_XMLDOM_DOCUMENT_DOCUMENTNODE (DISPID_XMLDOM_DOCUMENT + 1)
#define DISPID_XMLDOM_DOCUMENT_CREATENODE (DISPID_XMLDOM_DOCUMENT + 2)
#define DISPID_XMLDOM_DOCUMENT_CREATENODEEX (DISPID_XMLDOM_DOCUMENT + 3)
#define DISPID_XMLDOM_DOCUMENT_NODEFROMID (DISPID_XMLDOM_DOCUMENT + 4)
#define DISPID_XMLDOM_DOCUMENT_DOCUMENTNAMESPACES (DISPID_XMLDOM_DOCUMENT + 5)
#define DISPID_XMLDOM_DOCUMENT_LOAD (DISPID_XMLDOM_DOCUMENT + 6)
#define DISPID_XMLDOM_DOCUMENT_PARSEERROR (DISPID_XMLDOM_DOCUMENT + 7)
#define DISPID_XMLDOM_DOCUMENT_URL (DISPID_XMLDOM_DOCUMENT + 8)
#define DISPID_XMLDOM_DOCUMENT_ASYNC (DISPID_XMLDOM_DOCUMENT + 9)
#define DISPID_XMLDOM_DOCUMENT_ABORT (DISPID_XMLDOM_DOCUMENT + 10)
#define DISPID_XMLDOM_DOCUMENT_LOADXML (DISPID_XMLDOM_DOCUMENT + 11)
#define DISPID_XMLDOM_DOCUMENT_SAVE (DISPID_XMLDOM_DOCUMENT + 12)
#define DISPID_XMLDOM_DOCUMENT_VALIDATE (DISPID_XMLDOM_DOCUMENT + 13)
#define DISPID_XMLDOM_DOCUMENT_RESOLVENAMESPACE (DISPID_XMLDOM_DOCUMENT + 14)
#define DISPID_XMLDOM_DOCUMENT_PRESERVEWHITESPACE (DISPID_XMLDOM_DOCUMENT + 15)
#define DISPID_XMLDOM_DOCUMENT_ONREADYSTATECHANGE (DISPID_XMLDOM_DOCUMENT + 16)
#define DISPID_XMLDOM_DOCUMENT_ONDATAAVAILABLE (DISPID_XMLDOM_DOCUMENT + 17)
#define DISPID_XMLDOM_DOCUMENT_ONTRANSFORMNODE (DISPID_XMLDOM_DOCUMENT + 18)
#define DISPID_XMLDOM_DOCUMENT__TOP (DISPID_XMLDOM_DOCUMENT + 19)
#define DISPID_DOM_NODELIST (DISPID_XMLDOM_DOCUMENT__TOP + 1)
#define DISPID_DOM_NODELIST_ITEM (DISPID_DOM_NODELIST + 1)
#define DISPID_DOM_NODELIST_LENGTH (DISPID_DOM_NODELIST + 2)
#define DISPID_XMLDOM_NODELIST (DISPID_DOM_NODELIST + 3)
#define DISPID_XMLDOM_NODELIST_NEXTNODE (DISPID_XMLDOM_NODELIST + 1)
#define DISPID_XMLDOM_NODELIST_RESET (DISPID_XMLDOM_NODELIST + 2)
#define DISPID_XMLDOM_NODELIST_NEWENUM (DISPID_XMLDOM_NODELIST + 3)
#define DISPID_XMLDOM_NODELIST__TOP (DISPID_XMLDOM_NODELIST + 4)
#define DISPID_DOM_NAMEDNODEMAP (DISPID_XMLDOM_NODELIST__TOP + 1)
#define DISPID_DOM_NAMEDNODEMAP_GETNAMEDITEM (DISPID_DOM_NAMEDNODEMAP + 3)
#define DISPID_DOM_NAMEDNODEMAP_SETNAMEDITEM (DISPID_DOM_NAMEDNODEMAP + 4)
#define DISPID_DOM_NAMEDNODEMAP_REMOVENAMEDITEM (DISPID_DOM_NAMEDNODEMAP + 5)
#define DISPID_XMLDOM_NAMEDNODEMAP (DISPID_DOM_NAMEDNODEMAP + 6)
#define DISPID_XMLDOM_NAMEDNODEMAP_GETQUALIFIEDITEM (DISPID_XMLDOM_NAMEDNODEMAP + 1)
#define DISPID_XMLDOM_NAMEDNODEMAP_REMOVEQUALIFIEDITEM (DISPID_XMLDOM_NAMEDNODEMAP + 2)
#define DISPID_XMLDOM_NAMEDNODEMAP_NEXTNODE (DISPID_XMLDOM_NAMEDNODEMAP + 3)
#define DISPID_XMLDOM_NAMEDNODEMAP_RESET (DISPID_XMLDOM_NAMEDNODEMAP + 4)
#define DISPID_XMLDOM_NAMEDNODEMAP_NEWENUM (DISPID_XMLDOM_NAMEDNODEMAP + 5)
#define DISPID_XMLDOM_NAMEDNODEMAP__TOP (DISPID_XMLDOM_NAMEDNODEMAP + 6)
#define DISPID_DOM_W3CWRAPPERS (DISPID_XMLDOM_NAMEDNODEMAP__TOP + 1)
#define DISPID_DOM_DOCUMENTFRAGMENT (DISPID_DOM_W3CWRAPPERS + 1)
#define DISPID_DOM_DOCUMENTFRAGMENT__TOP (DISPID_DOM_DOCUMENTFRAGMENT + 1)
#define DISPID_DOM_ELEMENT (DISPID_DOM_DOCUMENTFRAGMENT__TOP + 1)
#define DISPID_DOM_ELEMENT_GETTAGNAME (DISPID_DOM_ELEMENT + 1)
#define DISPID_DOM_ELEMENT_GETATTRIBUTES (DISPID_DOM_ELEMENT + 2)
#define DISPID_DOM_ELEMENT_GETATTRIBUTE (DISPID_DOM_ELEMENT + 3)
#define DISPID_DOM_ELEMENT_SETATTRIBUTE (DISPID_DOM_ELEMENT + 4)
#define DISPID_DOM_ELEMENT_REMOVEATTRIBUTE (DISPID_DOM_ELEMENT + 5)
#define DISPID_DOM_ELEMENT_GETATTRIBUTENODE (DISPID_DOM_ELEMENT + 6)
#define DISPID_DOM_ELEMENT_SETATTRIBUTENODE (DISPID_DOM_ELEMENT + 7)
#define DISPID_DOM_ELEMENT_REMOVEATTRIBUTENODE (DISPID_DOM_ELEMENT + 8)
#define DISPID_DOM_ELEMENT_GETELEMENTSBYTAGNAME (DISPID_DOM_ELEMENT + 9)
#define DISPID_DOM_ELEMENT_NORMALIZE (DISPID_DOM_ELEMENT + 10)
#define DISPID_DOM_ELEMENT__TOP (DISPID_DOM_ELEMENT + 11)
#define DISPID_DOM_DATA (DISPID_DOM_ELEMENT__TOP + 1)
#define DISPID_DOM_DATA_DATA (DISPID_DOM_DATA + 1)
#define DISPID_DOM_DATA_LENGTH (DISPID_DOM_DATA + 2)
#define DISPID_DOM_DATA_SUBSTRING (DISPID_DOM_DATA + 3)
#define DISPID_DOM_DATA_APPEND (DISPID_DOM_DATA + 4)
#define DISPID_DOM_DATA_INSERT (DISPID_DOM_DATA + 5)
#define DISPID_DOM_DATA_DELETE (DISPID_DOM_DATA + 6)
#define DISPID_DOM_DATA_REPLACE (DISPID_DOM_DATA + 7)
#define DISPID_DOM_DATA__TOP (DISPID_DOM_DATA + 8)
#define DISPID_DOM_ATTRIBUTE (DISPID_DOM_DATA__TOP + 1)
#define DISPID_DOM_ATTRIBUTE_GETNAME (DISPID_DOM_ATTRIBUTE + 1)
#define DISPID_DOM_ATTRIBUTE_SPECIFIED (DISPID_DOM_ATTRIBUTE + 2)
#define DISPID_DOM_ATTRIBUTE_VALUE (DISPID_DOM_ATTRIBUTE + 3)
#define DISPID_DOM_ATTRIBUTE__TOP (DISPID_DOM_ATTRIBUTE + 4)
#define DISPID_DOM_TEXT (DISPID_DOM_ATTRIBUTE__TOP + 1)
#define DISPID_DOM_TEXT_SPLITTEXT (DISPID_DOM_TEXT + 1)
#define DISPID_DOM_TEXT_JOINTEXT (DISPID_DOM_TEXT + 2)
#define DISPID_DOM_TEXT__TOP (DISPID_DOM_TEXT + 3)
#define DISPID_DOM_PI (DISPID_DOM_TEXT__TOP + 1)
#define DISPID_DOM_PI_TARGET (DISPID_DOM_PI + 1)
#define DISPID_DOM_PI_DATA (DISPID_DOM_PI + 2)
#define DISPID_DOM_PI__TOP (DISPID_DOM_PI + 3)
#define DISPID_DOM_DOCUMENTTYPE (DISPID_DOM_PI__TOP + 1)
#define DISPID_DOM_DOCUMENTTYPE_NAME (DISPID_DOM_DOCUMENTTYPE + 1)
#define DISPID_DOM_DOCUMENTTYPE_ENTITIES (DISPID_DOM_DOCUMENTTYPE + 2)
#define DISPID_DOM_DOCUMENTTYPE_NOTATIONS (DISPID_DOM_DOCUMENTTYPE + 3)
#define DISPID_DOM_DOCUMENTTYPE__TOP (DISPID_DOM_DOCUMENTTYPE + 4)
#define DISPID_DOM_NOTATION (DISPID_DOM_DOCUMENTTYPE__TOP + 1)
#define DISPID_DOM_NOTATION_PUBLICID (DISPID_DOM_NOTATION + 1)
#define DISPID_DOM_NOTATION_SYSTEMID (DISPID_DOM_NOTATION + 2)
#define DISPID_DOM_NOTATION__TOP (DISPID_DOM_NOTATION + 3)
#define DISPID_DOM_ENTITY (DISPID_DOM_NOTATION__TOP + 1)
#define DISPID_DOM_ENTITY_PUBLICID (DISPID_DOM_ENTITY + 1)
#define DISPID_DOM_ENTITY_SYSTEMID (DISPID_DOM_ENTITY + 2)
#define DISPID_DOM_ENTITY_NOTATIONNAME (DISPID_DOM_ENTITY + 3)
#define DISPID_DOM_ENTITY__TOP (DISPID_DOM_ENTITY + 4)
//define DISPID_DOM_COMMENT
//define DISPID_DOM_CDATASECTION
//define DISPID_DOM_ENTITYREFERENCE
#define DISPID_DOM_W3CWRAPPERS_TOP (DISPID_DOM_ENTITY__TOP)
#define DISPID_DOM_IMPLEMENTATION (DISPID_DOM_W3CWRAPPERS_TOP + 1)
#define DISPID_DOM_IMPLEMENTATION_HASFEATURE (DISPID_DOM_IMPLEMENTATION + 1)
#define DISPID_DOM_IMPLEMENTATION__TOP (DISPID_DOM_IMPLEMENTATION + 2)
#define DISPID_DOM__TOP (DISPID_DOM_IMPLEMENTATION + 0x20)
#define DISPID_DOM_ERROR (DISPID_DOM__TOP + 1)
#define DISPID_DOM_ERROR_ERRORCODE (DISPID_DOM_ERROR + 1)
#define DISPID_DOM_ERROR_URL (DISPID_DOM_ERROR + 2)
#define DISPID_DOM_ERROR_REASON (DISPID_DOM_ERROR + 3)
#define DISPID_DOM_ERROR_SRCTEXT (DISPID_DOM_ERROR + 4)
#define DISPID_DOM_ERROR_LINE (DISPID_DOM_ERROR + 5)
#define DISPID_DOM_ERROR_LINEPOS (DISPID_DOM_ERROR + 6)
#define DISPID_DOM_ERROR_FILEPOS (DISPID_DOM_ERROR + 7)
#define DISPID_DOM_ERROR__TOP (DISPID_DOM_ERROR + 8)
#define DISPID_DOM_ERROR2 (DISPID_DOM_ERROR__TOP + 1)
#define DISPID_DOM_ERROR2_ALLERRORS (DISPID_DOM_ERROR2 + 1)
#define DISPID_DOM_ERROR2_ERRORPARAMETERS (DISPID_DOM_ERROR2 + 2)
#define DISPID_DOM_ERROR2_ERRORPARAMETERSCOUNT (DISPID_DOM_ERROR2 + 3)
#define DISPID_DOM_ERROR2_ERRORXPATH (DISPID_DOM_ERROR2 + 4)
#define DISPID_DOM_ERROR2__TOP (DISPID_DOM_ERROR2 + 5)
#define DISPID_DOM_ERRORCOLLECTION (DISPID_DOM_ERROR2__TOP + 1)
#define DISPID_DOM_ERRORCOLLECTION_LENGTH (DISPID_DOM_ERRORCOLLECTION + 1)
#define DISPID_DOM_ERRORCOLLECTION_NEXT (DISPID_DOM_ERRORCOLLECTION + 2)
#define DISPID_DOM_ERRORCOLLECTION_RESET (DISPID_DOM_ERRORCOLLECTION + 3)
#define DISPID_DOM_ERRORCOLLECTION__TOP (DISPID_DOM_ERRORCOLLECTION + 4)
#define DISPID_XTLRUNTIME (DISPID_DOM_ERROR__TOP + 1)
#define DISPID_XTLRUNTIME_UNIQUEID (DISPID_XTLRUNTIME + 1)
#define DISPID_XTLRUNTIME_DEPTH (DISPID_XTLRUNTIME + 2)
#define DISPID_XTLRUNTIME_CHILDNUMBER (DISPID_XTLRUNTIME + 3)
#define DISPID_XTLRUNTIME_ANCESTORCHILDNUMBER (DISPID_XTLRUNTIME + 4)
#define DISPID_XTLRUNTIME_ABSOLUTECHILDNUMBER (DISPID_XTLRUNTIME + 5)
#define DISPID_XTLRUNTIME_FORMATINDEX (DISPID_XTLRUNTIME + 6)
#define DISPID_XTLRUNTIME_FORMATNUMBER (DISPID_XTLRUNTIME + 7)
#define DISPID_XTLRUNTIME_FORMATDATE (DISPID_XTLRUNTIME + 8)
#define DISPID_XTLRUNTIME_FORMATTIME (DISPID_XTLRUNTIME + 9)
#define DISPID_XTLRUNTIME__TOP (DISPID_XTLRUNTIME + 10)
#define DISPID_XMLDOMEVENT (DISPID_XTLRUNTIME__TOP + 1)
#define DISPID_XMLDOMEVENT_ONREADYSTATECHANGE (DISPID_READYSTATECHANGE)
#define DISPID_XMLDOMEVENT_ONDATAAVAILABLE (DISPID_XMLDOMEVENT + 1)
#define DISPID_XMLDOMEVENT__TOP (DISPID_XMLDOMEVENT + 2)
#define DISPID_XMLDOM_DOCUMENT2 (DISPID_XMLDOMEVENT__TOP + 1)
#define DISPID_XMLDOM_DOCUMENT2_NAMESPACES (DISPID_XMLDOM_DOCUMENT2 + 1)
#define DISPID_XMLDOM_DOCUMENT2_SCHEMAS (DISPID_XMLDOM_DOCUMENT2 + 2)
#define DISPID_XMLDOM_DOCUMENT2_VALIDATE (DISPID_XMLDOM_DOCUMENT2 + 3)
#define DISPID_XMLDOM_DOCUMENT2_SETPROPERTY (DISPID_XMLDOM_DOCUMENT2 + 4)
#define DISPID_XMLDOM_DOCUMENT2_GETPROPERTY (DISPID_XMLDOM_DOCUMENT2 + 5)
#define DISPID_XMLDOM_DOCUMENT2__TOP (DISPID_XMLDOM_DOCUMENT2 + 6)
#define DISPID_XMLDOM_DOCUMENT3 (DISPID_XMLDOM_DOCUMENT2__TOP + 1)
#define DISPID_XMLDOM_DOCUMENT3_VALIDATENODE (DISPID_XMLDOM_DOCUMENT3 + 1)
#define DISPID_XMLDOM_DOCUMENT3_IMPORTNODE (DISPID_XMLDOM_DOCUMENT3 + 2)
#define DISPID_XMLDOM_DOCUMENT3__TOP (DISPID_XMLDOM_DOCUMENT3 + 3)
#define DISPID_XMLDOM_SCHEMACOLLECTION (DISPID_DOM_BASE + 1)
#define DISPID_XMLDOM_SCHEMACOLLECTION_ADD (DISPID_XMLDOM_SCHEMACOLLECTION + 1)
#define DISPID_XMLDOM_SCHEMACOLLECTION_GET (DISPID_XMLDOM_SCHEMACOLLECTION + 2)
#define DISPID_XMLDOM_SCHEMACOLLECTION_REMOVE (DISPID_XMLDOM_SCHEMACOLLECTION + 3)
#define DISPID_XMLDOM_SCHEMACOLLECTION_LENGTH (DISPID_XMLDOM_SCHEMACOLLECTION + 4)
#define DISPID_XMLDOM_SCHEMACOLLECTION_NAMESPACEURI (DISPID_XMLDOM_SCHEMACOLLECTION + 5)
#define DISPID_XMLDOM_SCHEMACOLLECTION_ADDCOLLECTION (DISPID_XMLDOM_SCHEMACOLLECTION + 6)
#define DISPID_XMLDOM_SCHEMACOLLECTION__TOP (DISPID_XMLDOM_SCHEMACOLLECTION + 7)
#define DISPID_XMLDOM_SELECTION (DISPID_XMLDOM_NODELIST__TOP + 1)
#define DISPID_XMLDOM_SELECTION_EXPR (DISPID_XMLDOM_SELECTION + 1)
#define DISPID_XMLDOM_SELECTION_CONTEXT (DISPID_XMLDOM_SELECTION + 2)
#define DISPID_XMLDOM_SELECTION_PEEKNODE (DISPID_XMLDOM_SELECTION + 3)
#define DISPID_XMLDOM_SELECTION_MATCHES (DISPID_XMLDOM_SELECTION + 4)
#define DISPID_XMLDOM_SELECTION_REMOVENEXT (DISPID_XMLDOM_SELECTION + 5)
#define DISPID_XMLDOM_SELECTION_REMOVEALL (DISPID_XMLDOM_SELECTION + 6)
#define DISPID_XMLDOM_SELECTION_CLONE (DISPID_XMLDOM_SELECTION + 7)
#define DISPID_XMLDOM_SELECTION_GETPROPERTY (DISPID_XMLDOM_SELECTION + 8)
#define DISPID_XMLDOM_SELECTION_SETPROPERTY (DISPID_XMLDOM_SELECTION + 9)
#define DISPID_XMLDOM_SELECTION__TOP (DISPID_XMLDOM_SELECTION + 10)
#define DISPID_XMLDOM_TEMPLATE (DISPID_DOM_BASE)
#define DISPID_XMLDOM_TEMPLATE_STYLESHEET (DISPID_XMLDOM_TEMPLATE + 1)
#define DISPID_XMLDOM_TEMPLATE_CREATEPROCESSOR (DISPID_XMLDOM_TEMPLATE + 2)
#define DISPID_XMLDOM_TEMPLATE__TOP (DISPID_XMLDOM_TEMPLATE + 3)
#define DISPID_XMLDOM_PROCESSOR (DISPID_DOM_BASE)
#define DISPID_XMLDOM_PROCESSOR_INPUT (DISPID_XMLDOM_PROCESSOR + 1)
#define DISPID_XMLDOM_PROCESSOR_XSLTEMPLATE (DISPID_XMLDOM_PROCESSOR + 2)
#define DISPID_XMLDOM_PROCESSOR_SETSTARTMODE (DISPID_XMLDOM_PROCESSOR + 3)
#define DISPID_XMLDOM_PROCESSOR_STARTMODE (DISPID_XMLDOM_PROCESSOR + 4)
#define DISPID_XMLDOM_PROCESSOR_STARTMODEURI (DISPID_XMLDOM_PROCESSOR + 5)
#define DISPID_XMLDOM_PROCESSOR_OUTPUT (DISPID_XMLDOM_PROCESSOR + 6)
#define DISPID_XMLDOM_PROCESSOR_TRANSFORM (DISPID_XMLDOM_PROCESSOR + 7)
#define DISPID_XMLDOM_PROCESSOR_RESET (DISPID_XMLDOM_PROCESSOR + 8)
#define DISPID_XMLDOM_PROCESSOR_READYSTATE (DISPID_XMLDOM_PROCESSOR + 9)
#define DISPID_XMLDOM_PROCESSOR_ADDPARAMETER (DISPID_XMLDOM_PROCESSOR + 10)
#define DISPID_XMLDOM_PROCESSOR_ADDOBJECT (DISPID_XMLDOM_PROCESSOR + 11)
#define DISPID_XMLDOM_PROCESSOR_STYLESHEET (DISPID_XMLDOM_PROCESSOR + 12)
#define DISPID_XMLDOM_PROCESSOR__TOP (DISPID_XMLDOM_PROCESSOR + 13)
#define DISPID_XMLDSO DISPID_XOBJ_BASE
#define DISPID_XMLDSO_DOCUMENT DISPID_XMLDSO + 1
#define DISPID_XMLDSO_JAVADSOCOMPATIBLE DISPID_XMLDSO_DOCUMENT + 1
#define DISPID_SAX_XMLREADER__MIN 0x00000501
#define DISPID_SAX_XMLREADER__MAX 0x00010000
#define DISPID_SAX_XMLREADER__BASE DISPID_SAX_XMLREADER__MIN
#define DISPID_SAX_XMLREADER (DISPID_SAX_XMLREADER__BASE)
#define DISPID_SAX_XMLREADER_GETFEATURE (DISPID_SAX_XMLREADER + 1)
#define DISPID_SAX_XMLREADER_PUTFEATURE (DISPID_SAX_XMLREADER + 2)
#define DISPID_SAX_XMLREADER_GETPROPERTY (DISPID_SAX_XMLREADER + 3)
#define DISPID_SAX_XMLREADER_PUTPROPERTY (DISPID_SAX_XMLREADER + 4)
#define DISPID_SAX_XMLREADER_ENTITYRESOLVER (DISPID_SAX_XMLREADER + 5)
#define DISPID_SAX_XMLREADER_CONTENTHANDLER (DISPID_SAX_XMLREADER + 6)
#define DISPID_SAX_XMLREADER_DTDHANDLER (DISPID_SAX_XMLREADER + 7)
#define DISPID_SAX_XMLREADER_ERRORHANDLER (DISPID_SAX_XMLREADER + 8)
#define DISPID_SAX_XMLREADER_BASEURL (DISPID_SAX_XMLREADER + 9)
#define DISPID_SAX_XMLREADER_SECUREBASEURL (DISPID_SAX_XMLREADER + 10)
#define DISPID_SAX_XMLREADER_PARSE (DISPID_SAX_XMLREADER + 11)
#define DISPID_SAX_XMLREADER_PARSEURL (DISPID_SAX_XMLREADER + 12)
#define DISPID_SAX_XMLREADER_PARENT (DISPID_SAX_XMLREADER + 13)
#define DISPID_SAX_XMLREADER__TOP (DISPID_SAX_XMLREADER + 14)
#define DISPID_SAX_XMLFILTER__BASE (DISPID_SAX_XMLREADER__TOP + 1)
#define DISPID_SAX_XMLFILTER (DISPID_SAX_XMLFILTER__BASE)
#define DISPID_SAX_XMLFILTER_GETFEATURE (DISPID_SAX_XMLFILTER + 1)
#define DISPID_SAX_XMLFILTER_PUTFEATURE (DISPID_SAX_XMLFILTER + 2)
#define DISPID_SAX_XMLFILTER_GETPROPERTY (DISPID_SAX_XMLFILTER + 3)
#define DISPID_SAX_XMLFILTER_PUTPROPERTY (DISPID_SAX_XMLFILTER + 4)
#define DISPID_SAX_XMLFILTER_ENTITYRESOLVER (DISPID_SAX_XMLFILTER + 5)
#define DISPID_SAX_XMLFILTER_CONTENTHANDLER (DISPID_SAX_XMLFILTER + 6)
#define DISPID_SAX_XMLFILTER_DTDHANDLER (DISPID_SAX_XMLFILTER + 7)
#define DISPID_SAX_XMLFILTER_ERRORHANDLER (DISPID_SAX_XMLFILTER + 8)
#define DISPID_SAX_XMLFILTER_BASEURL (DISPID_SAX_XMLFILTER + 9)
#define DISPID_SAX_XMLFILTER_SECUREBASEURL (DISPID_SAX_XMLFILTER + 10)
#define DISPID_SAX_XMLFILTER_PARSE (DISPID_SAX_XMLFILTER + 11)
#define DISPID_SAX_XMLFILTER_PARSEURL (DISPID_SAX_XMLFILTER + 12)
#define DISPID_SAX_XMLFILTER_PARENT (DISPID_SAX_XMLFILTER + 13)
#define DISPID_SAX_XMLFILTER__TOP (DISPID_SAX_XMLFILTER + 15)
#define DISPID_SAX_LOCATOR__BASE (DISPID_SAX_XMLFILTER__TOP + 1)
#define DISPID_SAX_LOCATOR (DISPID_SAX_LOCATOR__BASE)
#define DISPID_SAX_LOCATOR_COLUMNNUMBER (DISPID_SAX_LOCATOR + 1)
#define DISPID_SAX_LOCATOR_LINENUMBER (DISPID_SAX_LOCATOR + 2)
#define DISPID_SAX_LOCATOR_PUBLICID (DISPID_SAX_LOCATOR + 3)
#define DISPID_SAX_LOCATOR_SYSTEMID (DISPID_SAX_LOCATOR + 4)
#define DISPID_SAX_LOCATOR__TOP (DISPID_SAX_LOCATOR + 5)
#define DISPID_SAX_ENTITYRESOLVER__BASE (DISPID_SAX_LOCATOR__TOP + 1)
#define DISPID_SAX_ENTITYRESOLVER (DISPID_SAX_ENTITYRESOLVER__BASE)
#define DISPID_SAX_ENTITYRESOLVER_RESOLVEENTITY (DISPID_SAX_ENTITYRESOLVER + 1)
#define DISPID_SAX_ENTITYRESOLVER__TOP (DISPID_SAX_ENTITYRESOLVER + 2)
#define DISPID_SAX_CONTENTHANDLER__BASE (DISPID_SAX_ENTITYRESOLVER__TOP + 1)
#define DISPID_SAX_CONTENTHANDLER (DISPID_SAX_CONTENTHANDLER__BASE)
#define DISPID_SAX_CONTENTHANDLER_DOCUMENTLOCATOR (DISPID_SAX_CONTENTHANDLER + 1)
#define DISPID_SAX_CONTENTHANDLER_STARTDOCUMENT (DISPID_SAX_CONTENTHANDLER + 2)
#define DISPID_SAX_CONTENTHANDLER_ENDDOCUMENT (DISPID_SAX_CONTENTHANDLER + 3)
#define DISPID_SAX_CONTENTHANDLER_STARTPREFIXMAPPING (DISPID_SAX_CONTENTHANDLER + 4)
#define DISPID_SAX_CONTENTHANDLER_ENDPREFIXMAPPING (DISPID_SAX_CONTENTHANDLER + 5)
#define DISPID_SAX_CONTENTHANDLER_STARTELEMENT (DISPID_SAX_CONTENTHANDLER + 6)
#define DISPID_SAX_CONTENTHANDLER_ENDELEMENT (DISPID_SAX_CONTENTHANDLER + 7)
#define DISPID_SAX_CONTENTHANDLER_CHARACTERS (DISPID_SAX_CONTENTHANDLER + 8)
#define DISPID_SAX_CONTENTHANDLER_IGNORABLEWHITESPACE (DISPID_SAX_CONTENTHANDLER + 9)
#define DISPID_SAX_CONTENTHANDLER_PROCESSINGINSTRUCTION (DISPID_SAX_CONTENTHANDLER + 10)
#define DISPID_SAX_CONTENTHANDLER_SKIPPEDENTITY (DISPID_SAX_CONTENTHANDLER + 11)
#define DISPID_SAX_CONTENTHANDLER__TOP (DISPID_SAX_CONTENTHANDLER + 12)
#define DISPID_SAX_DTDHANDLER__BASE (DISPID_SAX_CONTENTHANDLER__TOP + 1)
#define DISPID_SAX_DTDHANDLER (DISPID_SAX_DTDHANDLER__BASE)
#define DISPID_SAX_DTDHANDLER_NOTATIONDECL (DISPID_SAX_DTDHANDLER + 1)
#define DISPID_SAX_DTDHANDLER_UNPARSEDENTITYDECL (DISPID_SAX_DTDHANDLER + 2)
#define DISPID_SAX_DTDHANDLER__TOP (DISPID_SAX_DTDHANDLER + 3)
#define DISPID_SAX_ERRORHANDLER__BASE (DISPID_SAX_DTDHANDLER__TOP + 1)
#define DISPID_SAX_ERRORHANDLER (DISPID_SAX_ERRORHANDLER__BASE)
#define DISPID_SAX_ERRORHANDLER_ERROR (DISPID_SAX_ERRORHANDLER + 1)
#define DISPID_SAX_ERRORHANDLER_FATALERROR (DISPID_SAX_ERRORHANDLER + 2)
#define DISPID_SAX_ERRORHANDLER_IGNORABLEWARNING (DISPID_SAX_ERRORHANDLER + 3)
#define DISPID_SAX_ERRORHANDLER__TOP (DISPID_SAX_ERRORHANDLER + 4)
#define DISPID_SAX_ATTRIBUTES__BASE (DISPID_SAX_ERRORHANDLER__TOP + 1)
#define DISPID_SAX_ATTRIBUTES (DISPID_SAX_ATTRIBUTES__BASE)
#define DISPID_SAX_ATTRIBUTES_LENGTH (DISPID_SAX_ATTRIBUTES + 1)
#define DISPID_SAX_ATTRIBUTES_GETURI (DISPID_SAX_ATTRIBUTES + 2)
#define DISPID_SAX_ATTRIBUTES_GETLOCALNAME (DISPID_SAX_ATTRIBUTES + 3)
#define DISPID_SAX_ATTRIBUTES_GETQNAME (DISPID_SAX_ATTRIBUTES + 4)
#define DISPID_SAX_ATTRIBUTES_GETINDEXFROMNAME (DISPID_SAX_ATTRIBUTES + 5)
#define DISPID_SAX_ATTRIBUTES_GETINDEXFROMQNAME (DISPID_SAX_ATTRIBUTES + 6)
#define DISPID_SAX_ATTRIBUTES_GETTYPE (DISPID_SAX_ATTRIBUTES + 7)
#define DISPID_SAX_ATTRIBUTES_GETTYPEFROMNAME (DISPID_SAX_ATTRIBUTES + 8)
#define DISPID_SAX_ATTRIBUTES_GETTYPEFROMQNAME (DISPID_SAX_ATTRIBUTES + 9)
#define DISPID_SAX_ATTRIBUTES_GETVALUE (DISPID_SAX_ATTRIBUTES + 10)
#define DISPID_SAX_ATTRIBUTES_GETVALUEFROMNAME (DISPID_SAX_ATTRIBUTES + 11)
#define DISPID_SAX_ATTRIBUTES_GETVALUEFROMQNAME (DISPID_SAX_ATTRIBUTES + 12)
#define DISPID_SAX_ATTRIBUTES__TOP (DISPID_SAX_ATTRIBUTES + 13)
#define DISPID_SAX_LEXICALHANDLER__BASE (DISPID_SAX_ATTRIBUTES__TOP + 1)
#define DISPID_SAX_LEXICALHANDLER (DISPID_SAX_LEXICALHANDLER__BASE)
#define DISPID_SAX_LEXICALHANDLER_STARTDTD (DISPID_SAX_LEXICALHANDLER + 1)
#define DISPID_SAX_LEXICALHANDLER_ENDDTD (DISPID_SAX_LEXICALHANDLER + 2)
#define DISPID_SAX_LEXICALHANDLER_STARTENTITY (DISPID_SAX_LEXICALHANDLER + 3)
#define DISPID_SAX_LEXICALHANDLER_ENDENTITY (DISPID_SAX_LEXICALHANDLER + 4)
#define DISPID_SAX_LEXICALHANDLER_STARTCDATA (DISPID_SAX_LEXICALHANDLER + 5)
#define DISPID_SAX_LEXICALHANDLER_ENDCDATA (DISPID_SAX_LEXICALHANDLER + 6)
#define DISPID_SAX_LEXICALHANDLER_COMMENT (DISPID_SAX_LEXICALHANDLER + 7)
#define DISPID_SAX_LEXICALHANDLER__TOP (DISPID_SAX_LEXICALHANDLER + 8)
#define DISPID_SAX_DECLHANDLER__BASE (DISPID_SAX_LEXICALHANDLER__TOP + 1)
#define DISPID_SAX_DECLHANDLER (DISPID_SAX_DECLHANDLER__BASE)
#define DISPID_SAX_DECLHANDLER_ELEMENTDECL (DISPID_SAX_DECLHANDLER + 1)
#define DISPID_SAX_DECLHANDLER_ATTRIBUTEDECL (DISPID_SAX_DECLHANDLER + 2)
#define DISPID_SAX_DECLHANDLER_INTERNALENTITYDECL (DISPID_SAX_DECLHANDLER + 3)
#define DISPID_SAX_DECLHANDLER_EXTERNALENTITYDECL (DISPID_SAX_DECLHANDLER + 4)
#define DISPID_SAX_DECLHANDLER__TOP (DISPID_SAX_DECLHANDLER + 5)
#define DISPID_MX_ATTRIBUTES__BASE (DISPID_SAX_DECLHANDLER__TOP + 1)
#define DISPID_MX_ATTRIBUTES (DISPID_MX_ATTRIBUTES__BASE)
#define DISPID_MX_ATTRIBUTES_ADDATTRIBUTE (DISPID_MX_ATTRIBUTES + 1)
#define DISPID_MX_ATTRIBUTES_CLEAR (DISPID_MX_ATTRIBUTES + 2)
#define DISPID_MX_ATTRIBUTES_REMOVEATTRIBUTE (DISPID_MX_ATTRIBUTES + 3)
#define DISPID_MX_ATTRIBUTES_SETATTRIBUTE (DISPID_MX_ATTRIBUTES + 4)
#define DISPID_MX_ATTRIBUTES_SETATTRIBUTES (DISPID_MX_ATTRIBUTES + 5)
#define DISPID_MX_ATTRIBUTES_SETLOCALNAME (DISPID_MX_ATTRIBUTES + 6)
#define DISPID_MX_ATTRIBUTES_SETQNAME (DISPID_MX_ATTRIBUTES + 7)
#define DISPID_MX_ATTRIBUTES_SETTYPE (DISPID_MX_ATTRIBUTES + 8)
#define DISPID_MX_ATTRIBUTES_SETURI (DISPID_MX_ATTRIBUTES + 9)
#define DISPID_MX_ATTRIBUTES_SETVALUE (DISPID_MX_ATTRIBUTES + 10)
#define DISPID_MX_ATTRIBUTES_ADDATTRIBUTEFROMINDEX (DISPID_MX_ATTRIBUTES + 11)
#define DISPID_MX_ATTRIBUTES__TOP (DISPID_MX_ATTRIBUTES + 11)
#define DISPID_MX_WRITER__BASE (DISPID_MX_ATTRIBUTES__TOP + 1)
#define DISPID_MX_WRITER (DISPID_MX_WRITER__BASE)
#define DISPID_MX_WRITER_OUTPUT (DISPID_MX_WRITER + 1)
#define DISPID_MX_WRITER_DESTINATION (DISPID_MX_WRITER + 2)
#define DISPID_MX_WRITER_ENCODING (DISPID_MX_WRITER + 3)
#define DISPID_MX_WRITER_BYTEORDERMARK (DISPID_MX_WRITER + 4)
#define DISPID_MX_WRITER_INDENT (DISPID_MX_WRITER + 5)
#define DISPID_MX_WRITER_STANDALONE (DISPID_MX_WRITER + 6)
#define DISPID_MX_WRITER_OMITXMLDECLARATION (DISPID_MX_WRITER + 7)
#define DISPID_MX_WRITER_VERSION (DISPID_MX_WRITER + 8)
#define DISPID_MX_WRITER_DISABLEOUTPUTESCAPING (DISPID_MX_WRITER + 9)
#define DISPID_MX_WRITER_FLUSH (DISPID_MX_WRITER + 10)
#define DISPID_MX_WRITER_RESET (DISPID_MX_WRITER + 11)
#define DISPID_MX_WRITER__TOP (DISPID_MX_WRITER + 12)
#define DISPID_MX_READER_CONTROL__BASE (DISPID_MX_WRITER__TOP + 1)
#define DISPID_MX_READER_CONTROL (DISPID_MX_READER_CONTROL__BASE)
#define DISPID_MX_READER_CONTROL_ABORT (DISPID_MX_READER_CONTROL + 1)
#define DISPID_MX_READER_CONTROL_RESUME (DISPID_MX_READER_CONTROL + 2)
#define DISPID_MX_READER_CONTROL_SUSPEND (DISPID_MX_READER_CONTROL + 3)
#define DISPID_MX_READER_CONTROL__TOP (DISPID_MX_READER_CONTROL + 4)
#define DISPID_MX_SCHEMADECLHANDLER__BASE (DISPID_MX_READER_CONTROL__TOP + 1)
#define DISPID_MX_SCHEMADECLHANDLER (DISPID_MX_SCHEMADECLHANDLER__BASE)
#define DISPID_MX_SCHEMADECLHANDLER_SCHEMAELEMENTDECL (DISPID_MX_SCHEMADECLHANDLER + 1)
#define DISPID_MX_SCHEMADECLHANDLER__TOP (DISPID_MX_SCHEMADECLHANDLER + 2)
#define DISPID_MX_NSMGR__BASE (DISPID_MX_SCHEMADECLHANDLER__TOP + 1)
#define DISPID_MX_NSMGR (DISPID_MX_NSMGR__BASE)
#define DISPID_MX_NSMGR_ALLOWOVERRIDE (DISPID_MX_NSMGR + 1)
#define DISPID_MX_NSMGR_RESET (DISPID_MX_NSMGR + 2)
#define DISPID_MX_NSMGR_PUSHCONTEXT (DISPID_MX_NSMGR + 3)
#define DISPID_MX_NSMGR_PUSHNODECONTEXT (DISPID_MX_NSMGR + 4)
#define DISPID_MX_NSMGR_POPCONTEXT (DISPID_MX_NSMGR + 5)
#define DISPID_MX_NSMGR_DECLAREPREFIX (DISPID_MX_NSMGR + 6)
#define DISPID_MX_NSMGR_GETDECLAREDPREFIXES (DISPID_MX_NSMGR + 7)
#define DISPID_MX_NSMGR_GETPREFIXES (DISPID_MX_NSMGR + 8)
#define DISPID_MX_NSMGR_GETURI (DISPID_MX_NSMGR + 9)
#define DISPID_MX_NSMGR_GETURIFROMNODE (DISPID_MX_NSMGR + 10)
#define DISPID_MX_NSMGR_LENGTH (DISPID_MX_NSMGR + 11)
#define DISPID_MX_NSMGR__TOP (DISPID_MX_NSMGR + 12)
#define DISPID_MXXML_FILTER__BASE (DISPID_MX_NSMGR__TOP + 1)
#define DISPID_MXXML_FILTER (DISPID_MXXML_FILTER__BASE)
#define DISPID_MXXML_FILTER_CONTENTHANDLER (DISPID_MXXML_FILTER + 1)
#define DISPID_MXXML_FILTER_DTDHANDLER (DISPID_MXXML_FILTER + 2)
#define DISPID_MXXML_FILTER_ENTITYRESOLVER (DISPID_MXXML_FILTER + 3)
#define DISPID_MXXML_FILTER_ERRORHANDLER (DISPID_MXXML_FILTER + 4)
#define DISPID_MXXML_FILTER_GETFEATURE (DISPID_MXXML_FILTER + 5)
#define DISPID_MXXML_FILTER_GETPROPERTY (DISPID_MXXML_FILTER + 6)
#define DISPID_MXXML_FILTER_PUTFEATURE (DISPID_MXXML_FILTER + 7)
#define DISPID_MXXML_FILTER_PUTPROPERTY (DISPID_MXXML_FILTER + 8)
#define DISPID_MXXML_FILTER__TOP (DISPID_MXXML_FILTER + 9)
// Schema Object Model DISPIDs
#define DISPID_SOM (DISPID_MX_NSMGR__TOP + 1)
#define DISPID_SOM_VALIDATE (DISPID_SOM + 1)
#define DISPID_SOM_VALIDATEONLOAD (DISPID_SOM + 2)
#define DISPID_SOM_GETSCHEMA (DISPID_SOM + 3)
#define DISPID_SOM_GETDECLARATION (DISPID_SOM + 4)
#define DISPID_SOM_ITEMBYNAME (DISPID_SOM + 5)
#define DISPID_SOM_ITEMBYQNAME (DISPID_SOM + 6)
#define DISPID_SOM_ANYATTRIBUTE (DISPID_SOM + 7)
#define DISPID_SOM_ATTRIBUTEGROUPS (DISPID_SOM + 8)
#define DISPID_SOM_ATTRIBUTES (DISPID_SOM + 9)
#define DISPID_SOM_BASETYPES (DISPID_SOM + 10)
#define DISPID_SOM_CONTENTMODEL (DISPID_SOM + 11)
#define DISPID_SOM_CONTENTTYPE (DISPID_SOM + 12)
#define DISPID_SOM_DEFAULTVALUE (DISPID_SOM + 13)
#define DISPID_SOM_DERIVEDBY (DISPID_SOM + 14)
#define DISPID_SOM_DISALLOWED (DISPID_SOM + 15)
#define DISPID_SOM_ELEMENTS (DISPID_SOM + 16)
#define DISPID_SOM_ENUMERATION (DISPID_SOM + 17)
#define DISPID_SOM_FIELDS (DISPID_SOM + 18)
#define DISPID_SOM_FINAL (DISPID_SOM + 19)
#define DISPID_SOM_FIXEDVALUE (DISPID_SOM + 20)
#define DISPID_SOM_FRACTIONDIGITS (DISPID_SOM + 21)
#define DISPID_SOM_ID (DISPID_SOM + 22)
#define DISPID_SOM_IDCONSTRAINTS (DISPID_SOM + 23)
#define DISPID_SOM_ISABSTRACT (DISPID_SOM + 24)
#define DISPID_SOM_ISNILLABLE (DISPID_SOM + 25)
#define DISPID_SOM_ISREFERENCE (DISPID_SOM + 26)
#define DISPID_SOM_ISVALID (DISPID_SOM + 27)
#define DISPID_SOM_ITEMTYPE (DISPID_SOM + 28)
#define DISPID_SOM_LENGTH (DISPID_SOM + 29)
#define DISPID_SOM_MAXEXCLUSIVE (DISPID_SOM + 30)
#define DISPID_SOM_MAXINCLUSIVE (DISPID_SOM + 31)
#define DISPID_SOM_MAXLENGTH (DISPID_SOM + 32)
#define DISPID_SOM_MAXOCCURS (DISPID_SOM + 33)
#define DISPID_SOM_MINEXCLUSIVE (DISPID_SOM + 34)
#define DISPID_SOM_MININCLUSIVE (DISPID_SOM + 35)
#define DISPID_SOM_MINLENGTH (DISPID_SOM + 36)
#define DISPID_SOM_MINOCCURS (DISPID_SOM + 37)
#define DISPID_SOM_MODELGROUPS (DISPID_SOM + 38)
#define DISPID_SOM_NAME (DISPID_SOM + 39)
#define DISPID_SOM_NAMESPACES (DISPID_SOM + 40)
#define DISPID_SOM_NAMESPACEURI (DISPID_SOM + 41)
#define DISPID_SOM_NOTATIONS (DISPID_SOM + 42)
#define DISPID_SOM_PARTICLES (DISPID_SOM + 43)
#define DISPID_SOM_PATTERNS (DISPID_SOM + 44)
#define DISPID_SOM_PROCESSCONTENTS (DISPID_SOM + 45)
#define DISPID_SOM_PROHIBITED (DISPID_SOM + 46)
#define DISPID_SOM_PUBLICIDENTIFIER (DISPID_SOM + 47)
#define DISPID_SOM_REFERENCEDKEY (DISPID_SOM + 48)
#define DISPID_SOM_SCHEMA (DISPID_SOM + 49)
#define DISPID_SOM_SCHEMALOCATIONS (DISPID_SOM + 50)
#define DISPID_SOM_SCOPE (DISPID_SOM + 51)
#define DISPID_SOM_SELECTOR (DISPID_SOM + 52)
#define DISPID_SOM_SUBSTITUTIONGROUP (DISPID_SOM + 53)
#define DISPID_SOM_EXCLUSIONS (DISPID_SOM + 54)
#define DISPID_SOM_SYSTEMIDENTIFIER (DISPID_SOM + 55)
#define DISPID_SOM_TARGETNAMESPACE (DISPID_SOM + 56)
#define DISPID_SOM_TOTALDIGITS (DISPID_SOM + 57)
#define DISPID_SOM_TYPE (DISPID_SOM + 58)
#define DISPID_SOM_TYPES (DISPID_SOM + 59)
#define DISPID_SOM_UNHANDLEDATTRS (DISPID_SOM + 60)
#define DISPID_SOM_USE (DISPID_SOM + 61)
#define DISPID_SOM_VARIETY (DISPID_SOM + 62)
#define DISPID_SOM_VERSION (DISPID_SOM + 63)
#define DISPID_SOM_WHITESPACE (DISPID_SOM + 64)
#define DISPID_SOM_WRITEANNOTATION (DISPID_SOM + 65)
#define DISPID_SOM_TOP (DISPID_SOM + 66)
// XML DigitalSignature DISPIDs
#define DISPID_XMLDSIG (0x00000001)
#define DISPID_XMLDSIG_CREATEKEYFROMCSP (DISPID_XMLDSIG + 0)
#define DISPID_XMLDSIG_CREATEKEYFROMHMACSECRET (DISPID_XMLDSIG + 1)
#define DISPID_XMLDSIG_CREATEKEYFROMNODE (DISPID_XMLDSIG + 2)
#define DISPID_XMLDSIG_CREATESAXPROXY (DISPID_XMLDSIG + 3)
#define DISPID_XMLDSIG_GETVERIFYINGCERTIFICATE (DISPID_XMLDSIG + 4)
#define DISPID_XMLDSIG_SETREFERENCEDATA (DISPID_XMLDSIG + 5)
#define DISPID_XMLDSIG_SIGN (DISPID_XMLDSIG + 6)
#define DISPID_XMLDSIG_SIGNATURE (DISPID_XMLDSIG + 7)
#define DISPID_XMLDSIG_STORE (DISPID_XMLDSIG + 8)
#define DISPID_XMLDSIG_VERIFY (DISPID_XMLDSIG + 9)
//;begin_internal
#endif // __MSXMLDID_H__
//;end_internal

View File

@@ -0,0 +1,294 @@
/*
www.sourceforge.net/projects/tinyxml
Original file by Yves Berquin.
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any
damages arising from the use of this software.
Permission is granted to anyone to use this software for any
purpose, including commercial applications, and to alter it and
redistribute it freely, subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must
not claim that you wrote the original software. If you use this
software in a product, an acknowledgment in the product documentation
would be appreciated but is not required.
2. Altered source versions must be plainly marked as such, and
must not be misrepresented as being the original software.
3. This notice may not be removed or altered from any source
distribution.
*/
/*
* THIS FILE WAS ALTERED BY Tyge Lovset, 7. April 2005.
*
* - completely rewritten. compact, clean, and fast implementation.
* - sizeof(TiXmlString) = pointer size (4 bytes on 32-bit systems)
* - fixed reserve() to work as per specification.
* - fixed buggy compares operator==(), operator<(), and operator>()
* - fixed operator+=() to take a const ref argument, following spec.
* - added "copy" constructor with length, and most compare operators.
* - added swap(), clear(), size(), capacity(), operator+().
*/
#ifndef TIXML_USE_STL
#ifndef TIXML_STRING_INCLUDED
#define TIXML_STRING_INCLUDED
#include <assert.h>
#include <string.h>
/*
TiXmlString is an emulation of a subset of the std::string template.
Its purpose is to allow compiling TinyXML on compilers with no or poor STL support.
Only the member functions relevant to the TinyXML project have been implemented.
The buffer allocation is made by a simplistic power of 2 like mechanism : if we increase
a string and there's no more room, we allocate a buffer twice as big as we need.
*/
class TiXmlString
{
public :
// The size type used
typedef unsigned int size_type;
// Error value for find primitive
static const size_type npos; // = -1;
// TiXmlString empty constructor
TiXmlString () : rep_(&nullrep_)
{
}
// TiXmlString copy constructor
TiXmlString (const TiXmlString & copy)
{
init(copy.length());
memcpy(start(), copy.data(), length());
}
// TiXmlString constructor, based on a string
TiXmlString (const char * copy)
{
init( static_cast<size_type>( strlen(copy) ));
memcpy(start(), copy, length());
}
// TiXmlString constructor, based on a string
TiXmlString (const char * str, size_type len)
{
init(len);
memcpy(start(), str, len);
}
// TiXmlString destructor
~TiXmlString ()
{
quit();
}
// = operator
TiXmlString& operator = (const char * copy)
{
return assign( copy, (size_type)strlen(copy));
}
// = operator
TiXmlString& operator = (const TiXmlString & copy)
{
return assign(copy.start(), copy.length());
}
// += operator. Maps to append
TiXmlString& operator += (const char * suffix)
{
return append(suffix, static_cast<size_type>( strlen(suffix) ));
}
// += operator. Maps to append
TiXmlString& operator += (char single)
{
return append(&single, 1);
}
// += operator. Maps to append
TiXmlString& operator += (const TiXmlString & suffix)
{
return append(suffix.data(), suffix.length());
}
// Convert a TiXmlString into a null-terminated char *
const char * c_str () const { return rep_->str; }
// Convert a TiXmlString into a char * (need not be null terminated).
const char * data () const { return rep_->str; }
// Return the length of a TiXmlString
size_type length () const { return rep_->size; }
// Alias for length()
size_type size () const { return rep_->size; }
// Checks if a TiXmlString is empty
bool empty () const { return rep_->size == 0; }
// Return capacity of string
size_type capacity () const { return rep_->capacity; }
// single char extraction
const char& at (size_type index) const
{
assert( index < length() );
return rep_->str[ index ];
}
// [] operator
char& operator [] (size_type index) const
{
assert( index < length() );
return rep_->str[ index ];
}
// find a char in a string. Return TiXmlString::npos if not found
size_type find (char lookup) const
{
return find(lookup, 0);
}
// find a char in a string from an offset. Return TiXmlString::npos if not found
size_type find (char tofind, size_type offset) const
{
if (offset >= length()) return npos;
for (const char* p = c_str() + offset; *p != '\0'; ++p)
{
if (*p == tofind) return static_cast< size_type >( p - c_str() );
}
return npos;
}
void clear ()
{
//Lee:
//The original was just too strange, though correct:
// TiXmlString().swap(*this);
//Instead use the quit & re-init:
quit();
init(0,0);
}
/* Function to reserve a big amount of data when we know we'll need it. Be aware that this
function DOES NOT clear the content of the TiXmlString if any exists.
*/
void reserve (size_type cap);
TiXmlString& assign (const char* str, size_type len);
TiXmlString& append (const char* str, size_type len);
void swap (TiXmlString& other)
{
Rep* r = rep_;
rep_ = other.rep_;
other.rep_ = r;
}
private:
void init(size_type sz) { init(sz, sz); }
void set_size(size_type sz) { rep_->str[ rep_->size = sz ] = '\0'; }
char* start() const { return rep_->str; }
char* finish() const { return rep_->str + rep_->size; }
struct Rep
{
size_type size, capacity;
char str[1];
};
void init(size_type sz, size_type cap)
{
if (cap)
{
rep_ = static_cast<Rep*>(operator new(sizeof(Rep) + cap));
rep_->str[ rep_->size = sz ] = '\0';
rep_->capacity = cap;
}
else
{
rep_ = &nullrep_;
}
}
void quit()
{
if (rep_ != &nullrep_)
{
operator delete(rep_);
}
}
Rep * rep_;
static Rep nullrep_;
} ;
inline bool operator == (const TiXmlString & a, const TiXmlString & b)
{
return ( a.length() == b.length() ) // optimization on some platforms
&& ( strcmp(a.c_str(), b.c_str()) == 0 ); // actual compare
}
inline bool operator < (const TiXmlString & a, const TiXmlString & b)
{
return strcmp(a.c_str(), b.c_str()) < 0;
}
inline bool operator != (const TiXmlString & a, const TiXmlString & b) { return !(a == b); }
inline bool operator > (const TiXmlString & a, const TiXmlString & b) { return b < a; }
inline bool operator <= (const TiXmlString & a, const TiXmlString & b) { return !(b < a); }
inline bool operator >= (const TiXmlString & a, const TiXmlString & b) { return !(a < b); }
inline bool operator == (const TiXmlString & a, const char* b) { return strcmp(a.c_str(), b) == 0; }
inline bool operator == (const char* a, const TiXmlString & b) { return b == a; }
inline bool operator != (const TiXmlString & a, const char* b) { return !(a == b); }
inline bool operator != (const char* a, const TiXmlString & b) { return !(b == a); }
TiXmlString operator + (const TiXmlString & a, const TiXmlString & b);
TiXmlString operator + (const TiXmlString & a, const char* b);
TiXmlString operator + (const char* a, const TiXmlString & b);
/*
TiXmlOutStream is an emulation of std::ostream. It is based on TiXmlString.
Only the operators that we need for TinyXML have been developped.
*/
class TiXmlOutStream : public TiXmlString
{
public :
// TiXmlOutStream << operator.
TiXmlOutStream & operator << (const TiXmlString & in)
{
*this += in;
return *this;
}
// TiXmlOutStream << operator.
TiXmlOutStream & operator << (const char * in)
{
*this += in;
return *this;
}
} ;
#endif // TIXML_STRING_INCLUDED
#endif // TIXML_USE_STL

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,58 @@
/***
mockcpp is a generic C/C++ mock framework.
Copyright (C) <2009> <Darwin Yuan: darwin.yuan@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
***/
#ifndef __MOCKCPP_AFTER_MATCH_BUILDER_H
#define __MOCKCPP_AFTER_MATCH_BUILDER_H
#include <mockcpp/mockcpp.h>
#include <mockcpp/DummyBuilder.h>
MOCKCPP_NS_START
struct InvocationMockerNamespace;
struct InvocationMocker;
template <typename Builder = DummyBuilder>
struct AfterMatchBuilder : public Builder
{
AfterMatchBuilder&
after(const InvocationMockerNamespace& ns, const std::string& name);
AfterMatchBuilder&
after(InvocationMockerNamespace* ns, const std::string& name);
AfterMatchBuilder&
after(const std::string& name);
virtual ~AfterMatchBuilder() {}
private:
void
setupOrderingAfterMatchers(InvocationMocker* mocker);
private:
virtual InvocationMocker* getMocker() const = 0;
};
MOCKCPP_NS_END
#include <mockcpp/AfterMatchBuilder.tcc>
#endif

View File

@@ -0,0 +1,58 @@
/***
mockcpp is a generic C/C++ mock framework.
Copyright (C) <2009> <Darwin Yuan: darwin.yuan@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
***/
#include <mockcpp/InvocationMockerNamespace.h>
#include <mockcpp/InvocationMocker.h>
#include <mockcpp/Method.h>
#include <mockcpp/AfterMatcher.h>
#include <mockcpp/PendingMatcher.h>
MOCKCPP_NS_START
//////////////////////////////////////////////////////////////////////
template <class Builder>
AfterMatchBuilder<Builder>&
AfterMatchBuilder<Builder>::after(const InvocationMockerNamespace& ns, const std::string& name)
{
return after(&const_cast<InvocationMockerNamespace&>(ns), name);
}
//////////////////////////////////////////////////////////////////////
template <class Builder>
AfterMatchBuilder<Builder>&
AfterMatchBuilder<Builder>::after(InvocationMockerNamespace* ns, const std::string& id)
{
getMocker()->addMatcher(
new PendingMatcher(
new AfterMatcher(), ns, id, getMocker()));
return *this;
}
//////////////////////////////////////////////////////////////////////
template <class Builder>
AfterMatchBuilder<Builder>&
AfterMatchBuilder<Builder>::after(const std::string& name)
{
return after(getMocker()->getMethod()->getNamespace(), name);
}
//////////////////////////////////////////////////////////////////////
MOCKCPP_NS_END

View File

@@ -0,0 +1,56 @@
/***
mockcpp is a generic C/C++ mock framework.
Copyright (C) <2009> <Darwin Yuan: darwin.yuan@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
***/
#ifndef __MOCKCPP_AFTER_MATCHER_H
#define __MOCKCPP_AFTER_MATCHER_H
#include <string>
#include <mockcpp/mockcpp.h>
#include <mockcpp/OrderingMatcher.h>
MOCKCPP_NS_START
struct InvocationMocker;
struct Invocation;
struct AfterMatcher : public OrderingMatcher
{
AfterMatcher();
bool matches(const Invocation& inv) const;
void increaseInvoked(const Invocation& inv);
std::string toString() const;
void verify(void);
bool isCompleted(void) const;
void setOrderingInvocationMocker(InvocationMocker* mocker);
private:
InvocationMocker* previousCall;
};
MOCKCPP_NS_END
#endif

View File

@@ -0,0 +1,24 @@
#ifndef __MOCKCPP_API_HOOK_H__
#define __MOCKCPP_API_HOOK_H__
#include <mockcpp/mockcpp.h>
MOCKCPP_NS_START
struct ApiHookImpl;
struct ApiHook
{
ApiHook ( const void* api
, const void* stub );
~ApiHook();
private:
ApiHookImpl* This;
};
MOCKCPP_NS_END
#endif

View File

@@ -0,0 +1,167 @@
#ifndef __MOCKCPP_API_HOOK_FUNCTOR_H__
#define __MOCKCPP_API_HOOK_FUNCTOR_H__
#include <mockcpp/mockcpp.h>
#include <mockcpp/GlobalMockObject.h>
#include <mockcpp/ArgumentsMacroHelpers.h>
MOCKCPP_NS_START
/////////////////////////////////////////////////////
template <typename F, unsigned int Seq>
struct ApiHookFunctor
{
};
const std::string empty_caller("");
#define __MOCKCPP_C_API_HOOK_FUNCTOR_DEF(n, CallingConvention) \
template<typename R DECL_TEMPLATE_ARGS(n), unsigned int Seq> \
struct ApiHookFunctor<R (CallingConvention *)(DECL_ARGS(n)), Seq> \
{ \
private: \
typedef R (CallingConvention *F) (DECL_ARGS(n)); \
\
static R CallingConvention hook(DECL_PARAMS_LIST(n)) \
{ \
return GlobalMockObject::instance.invoke<R>(apiAddress) \
(empty_caller, RefAny() DECL_REST_PARAMS(n)); \
} \
\
static bool appliedBy(F api) \
{ return apiAddress == reinterpret_cast<void*>(api); } \
\
static void* getHook() \
{ return reinterpret_cast<void*>(hook); } \
\
static void freeHook() \
{ if(--refCount == 0) apiAddress = 0; } \
public: \
\
static void* getApiHook(F api) \
{ \
if(!appliedBy(api)) return 0; \
++refCount; \
return getHook(); \
} \
\
static void* applyApiHook(F api) \
{ \
if(apiAddress != 0) return 0; \
apiAddress = reinterpret_cast<void*>(api); \
refCount = 1; \
return getHook(); \
} \
\
static bool freeApiHook(void* hook) \
{ \
if(getHook() != hook) return false; \
freeHook(); \
return true; \
} \
private: \
static void* apiAddress; \
static unsigned int refCount; \
}; \
template<typename R DECL_TEMPLATE_ARGS(n), unsigned int Seq> \
void* ApiHookFunctor<R (CallingConvention *)(DECL_ARGS(n)), Seq>::apiAddress = 0; \
template<typename R DECL_TEMPLATE_ARGS(n), unsigned int Seq> \
unsigned int ApiHookFunctor<R (CallingConvention *)(DECL_ARGS(n)), Seq>::refCount = 0
/* For C++ method */
#define __MOCKCPP_CXX_API_HOOK_FUNCTOR_DEF(n, CallingConvention, ConstConvention) \
template<typename C, typename R DECL_TEMPLATE_ARGS(n), unsigned int Seq> \
struct ApiHookFunctor<R (CallingConvention C::*)(DECL_ARGS(n)) ConstConvention, Seq> \
{ \
private: \
typedef ApiHookFunctor<R (CallingConvention C::*)(DECL_ARGS(n)) ConstConvention, Seq> ThisType; \
typedef R (CallingConvention C::*F) (DECL_ARGS(n)) ConstConvention; \
\
R CallingConvention hook(DECL_PARAMS_LIST(n)) \
{ \
C *This = reinterpret_cast<C *>(this); \
return GlobalMockObject::instance.invoke<R>(apiAddress) \
(empty_caller, This DECL_REST_PARAMS(n)); \
} \
\
static bool appliedBy(F api) \
{ return apiAddress == Details::methodToAddr(api); } \
\
static void* getHook() \
{ return Details::methodToAddr(&ThisType::hook); } \
\
static void freeHook() \
{ if(--refCount == 0) apiAddress = 0; } \
public: \
\
static void* getApiHook(F api) \
{ \
if(!appliedBy(api)) return 0; \
++refCount; \
return getHook(); \
} \
\
static void* applyApiHook(F api) \
{ \
if(apiAddress != 0) return 0; \
apiAddress = Details::methodToAddr(api); \
refCount = 1; \
return getHook(); \
} \
\
static bool freeApiHook(void* hook) \
{ \
if(getHook() != hook) return false; \
freeHook(); \
return true; \
} \
private: \
static void* apiAddress; \
static unsigned int refCount; \
}; \
template<typename C, typename R DECL_TEMPLATE_ARGS(n), unsigned int Seq> \
void* ApiHookFunctor<R (CallingConvention C::*)(DECL_ARGS(n)) ConstConvention, Seq>::apiAddress = 0; \
template<typename C, typename R DECL_TEMPLATE_ARGS(n), unsigned int Seq> \
unsigned int ApiHookFunctor<R (CallingConvention C::*)(DECL_ARGS(n)) ConstConvention, Seq>::refCount = 0
#ifdef WIN32
#if defined(_MSC_VER) && defined(BUILD_FOR_X86)
#define MOCKCPP_API_HOOK_FUNCTOR_DEF(n) \
__MOCKCPP_C_API_HOOK_FUNCTOR_DEF(n, ); \
__MOCKCPP_C_API_HOOK_FUNCTOR_DEF(n, __stdcall); \
__MOCKCPP_CXX_API_HOOK_FUNCTOR_DEF(n, , ); \
__MOCKCPP_CXX_API_HOOK_FUNCTOR_DEF(n, , const); \
__MOCKCPP_CXX_API_HOOK_FUNCTOR_DEF(n, __stdcall, ); \
__MOCKCPP_CXX_API_HOOK_FUNCTOR_DEF(n, __stdcall, const)
#else
#define MOCKCPP_API_HOOK_FUNCTOR_DEF(n) \
__MOCKCPP_C_API_HOOK_FUNCTOR_DEF(n, ); \
__MOCKCPP_CXX_API_HOOK_FUNCTOR_DEF(n, , ); \
__MOCKCPP_CXX_API_HOOK_FUNCTOR_DEF(n, , const)
#endif
#else
#define MOCKCPP_API_HOOK_FUNCTOR_DEF(n) \
__MOCKCPP_C_API_HOOK_FUNCTOR_DEF(n, ); \
__MOCKCPP_CXX_API_HOOK_FUNCTOR_DEF(n, , ); \
__MOCKCPP_CXX_API_HOOK_FUNCTOR_DEF(n, , const)
#endif
MOCKCPP_API_HOOK_FUNCTOR_DEF(0);
MOCKCPP_API_HOOK_FUNCTOR_DEF(1);
MOCKCPP_API_HOOK_FUNCTOR_DEF(2);
MOCKCPP_API_HOOK_FUNCTOR_DEF(3);
MOCKCPP_API_HOOK_FUNCTOR_DEF(4);
MOCKCPP_API_HOOK_FUNCTOR_DEF(5);
MOCKCPP_API_HOOK_FUNCTOR_DEF(6);
MOCKCPP_API_HOOK_FUNCTOR_DEF(7);
MOCKCPP_API_HOOK_FUNCTOR_DEF(8);
MOCKCPP_API_HOOK_FUNCTOR_DEF(9);
MOCKCPP_API_HOOK_FUNCTOR_DEF(10);
MOCKCPP_API_HOOK_FUNCTOR_DEF(11);
MOCKCPP_API_HOOK_FUNCTOR_DEF(12);
MOCKCPP_NS_END
#endif

View File

@@ -0,0 +1,75 @@
#ifndef __MOCKCPP_API_HOOK_GENERATOR_H__
#define __MOCKCPP_API_HOOK_GENERATOR_H__
#include <mockcpp/ApiHookFunctor.h>
MOCKCPP_NS_START
/////////////////////////////////////////////////////////////////
template <typename F, unsigned int Seq>
struct ApiHookGenerator
{
static void* findApiHook(F api)
{
void* hook;
(hook = ApiHookFunctor<F, Seq>::getApiHook(api)) ||
(hook = ApiHookGenerator<F, Seq-1>::findApiHook(api));
return hook;
}
static void* appyApiHook(F api)
{
void* hook;
(hook = ApiHookFunctor<F, Seq>::applyApiHook(api)) ||
(hook = ApiHookGenerator<F, Seq-1>::appyApiHook(api));
return hook;
}
static bool freeApiHook(void* hook)
{
return
(ApiHookFunctor<F, Seq>::freeApiHook(hook)) ||
(ApiHookGenerator<F, Seq-1>::freeApiHook(hook));
}
private:
};
/////////////////////////////////////////////////////////////////
template <typename F>
struct ApiHookGenerator<F, 0>
{
static void* findApiHook(F api)
{ return 0; }
static void* appyApiHook(F api)
{
oss_t oss;
oss << "Did you define too many mockers in a testcase? "
<< "Probably you should refine your design, "
<< "or you can reconfig ParameterizedApiHookHolder::maxSeq bigger, "
<< "it's the number of mockers in a testcase that with the same function prototype, "
<< "the bigger it is, the slower compiling is.";
MOCKCPP_REPORT_FAILURE(oss.str());
return 0;
}
static bool freeApiHook(void* hook)
{ return true; }
};
/////////////////////////////////////////////////////////////////
MOCKCPP_NS_END
#endif

View File

@@ -0,0 +1,19 @@
#ifndef __MOCKCPP_API_HOOK_HOLDER_H__
#define __MOCKCPP_API_HOOK_HOLDER_H__
#include <mockcpp/mockcpp.h>
MOCKCPP_NS_START
struct ApiHookHolder
{
virtual void * getApiHook() const = 0;
virtual ~ApiHookHolder() {}
};
MOCKCPP_NS_END
#endif

View File

@@ -0,0 +1,23 @@
#ifndef __MOCKCPP_API_HOOK_HOLDER_FACTORY_H__
#define __MOCKCPP_API_HOOK_HOLDER_FACTORY_H__
#include <mockcpp/ParameterizedApiHookHolder.h>
MOCKCPP_NS_START
struct ApiHookHolder;
struct ApiHookHolderFactory
{
template <typename F>
static ApiHookHolder* create(F api)
{
return new ParameterizedApiHookHolder<F>(api);
}
};
MOCKCPP_NS_END
#endif

View File

@@ -0,0 +1,50 @@
/***
mockcpp is a generic C/C++ mock framework.
Copyright (C) <2009> <Darwin Yuan: darwin.yuan@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
***/
#ifndef __MOCKCPP_API_HOOK_KEY_H__
#define __MOCKCPP_API_HOOK_KEY_H__
#include <mockcpp/mockcpp.h>
#include <mockcpp/ChainableMockMethodKey.h>
MOCKCPP_NS_START
struct ApiHook;
struct ApiHookHolder;
struct ApiHookKey
: public ChainableMockMethodKey
{
explicit ApiHookKey(const void* api);
ApiHookKey(const void* api, ApiHookHolder* hookHolder);
~ApiHookKey();
bool equals(const ChainableMockMethodKey * const rhs) const;
private:
ApiHook* hook;
ApiHookHolder* hookHolder;
const void* apiAddress;
};
MOCKCPP_NS_END
#endif

View File

@@ -0,0 +1,125 @@
#ifndef __MOCKCPP_API_HOOK_MOCKER_H__
#define __MOCKCPP_API_HOOK_MOCKER_H__
#include <mockcpp/mockcpp.h>
#include <mockcpp/GlobalMockObject.h>
#include <mockcpp/ApiHookHolderFactory.h>
#include <mockcpp/ArgumentsMacroHelpers.h>
#include <mockcpp/MethodInfoReader.h>
#include <mockcpp/DelegatedMethodGetter.h>
MOCKCPP_NS_START
struct mockAPIauto {};
template<typename API = mockAPIauto> struct mockAPI;
template<typename API> struct mockAPI
{
static InvocationMockBuilderGetter get(
const std::string& name, const std::string& type, API api)
{
return MOCKCPP_NS::GlobalMockObject::instance.method
( type.empty() ? name : name + " #" + type + "#"
, Details::methodToAddr(api)
, ApiHookHolderFactory::create(api));
}
template<typename C>
static InvocationMockBuilderGetter get_virtual(
const std::string& name, const std::string& type, const C *c, API api)
{
void ***vtbl = (void ***)c;
std::pair<unsigned int, unsigned int> indices =
getIndicesOfMethod<C, API>(api);
union { void *_addr; API _api; };
_addr = (*vtbl)[indices.second];
return MOCKCPP_NS::GlobalMockObject::instance.method
( type.empty() ? name : name + " #" + type + "#"
, _addr
, ApiHookHolderFactory::create(_api));
}
template<typename C>
static InvocationMockBuilderGetter get_virtual(
const std::string& name, const std::string& type, const C &c, API api)
{
return get_virtual(name, type, &c, api);
}
}; // struct mockAPI
template<> struct mockAPI<mockAPIauto>
{
#define __MOCKCPP_C_API_GET_FUNCTION_DEF(n, CallingConvention) \
template<typename R DECL_TEMPLATE_ARGS(n)> \
static InvocationMockBuilderGetter get( \
const std::string& name, const std::string& type, R (CallingConvention *api)(DECL_ARGS(n))) \
{ \
typedef R (CallingConvention *API)(DECL_ARGS(n)); \
return mockAPI<API>::get(name, type, api); \
}
#define __MOCKCPP_CXX_API_GET_FUNCTION_DEF(n, CallingConvention, ConstMethod) \
template<typename R, typename C DECL_TEMPLATE_ARGS(n)> \
static InvocationMockBuilderGetter get( \
const std::string& name, const std::string& type, R (CallingConvention C::*api)(DECL_ARGS(n)) ConstMethod) \
{ \
typedef R (CallingConvention C::*API)(DECL_ARGS(n)) ConstMethod; \
return mockAPI<API>::get(name, type, api); \
} \
template<typename R, typename C DECL_TEMPLATE_ARGS(n)> \
static InvocationMockBuilderGetter get_virtual( \
const std::string& name, const std::string& type, const C *c, R (CallingConvention C::*api)(DECL_ARGS(n)) ConstMethod) \
{ \
typedef R (CallingConvention C::*API)(DECL_ARGS(n)) ConstMethod; \
return mockAPI<API>::get_virtual(name, type, c, api); \
} \
template<typename R, typename C DECL_TEMPLATE_ARGS(n)> \
static InvocationMockBuilderGetter get_virtual( \
const std::string& name, const std::string& type, const C &c, R (CallingConvention C::*api)(DECL_ARGS(n)) ConstMethod) \
{ \
typedef R (CallingConvention C::*API)(DECL_ARGS(n)) ConstMethod; \
return mockAPI<API>::get_virtual(name, type, c, api); \
}
#ifdef WIN32
#if defined(_MSC_VER) && defined(BUILD_FOR_X86)
#define MOCKCPP_API_GET_FUNCTION_DEF(n) \
__MOCKCPP_C_API_GET_FUNCTION_DEF(n, ); \
__MOCKCPP_C_API_GET_FUNCTION_DEF(n, __stdcall); \
__MOCKCPP_CXX_API_GET_FUNCTION_DEF(n, , ); \
__MOCKCPP_CXX_API_GET_FUNCTION_DEF(n, , const); \
__MOCKCPP_CXX_API_GET_FUNCTION_DEF(n, __stdcall, ); \
__MOCKCPP_CXX_API_GET_FUNCTION_DEF(n, __stdcall, const)
#else
#define MOCKCPP_API_GET_FUNCTION_DEF(n) \
__MOCKCPP_C_API_GET_FUNCTION_DEF(n, ); \
__MOCKCPP_CXX_API_GET_FUNCTION_DEF(n, , ); \
__MOCKCPP_CXX_API_GET_FUNCTION_DEF(n, , const)
#endif
#else
#define MOCKCPP_API_GET_FUNCTION_DEF(n) \
__MOCKCPP_C_API_GET_FUNCTION_DEF(n, ); \
__MOCKCPP_CXX_API_GET_FUNCTION_DEF(n, , ); \
__MOCKCPP_CXX_API_GET_FUNCTION_DEF(n, , const)
#endif
MOCKCPP_API_GET_FUNCTION_DEF(0);
MOCKCPP_API_GET_FUNCTION_DEF(1);
MOCKCPP_API_GET_FUNCTION_DEF(2);
MOCKCPP_API_GET_FUNCTION_DEF(3);
MOCKCPP_API_GET_FUNCTION_DEF(4);
MOCKCPP_API_GET_FUNCTION_DEF(5);
MOCKCPP_API_GET_FUNCTION_DEF(6);
MOCKCPP_API_GET_FUNCTION_DEF(7);
MOCKCPP_API_GET_FUNCTION_DEF(8);
MOCKCPP_API_GET_FUNCTION_DEF(9);
MOCKCPP_API_GET_FUNCTION_DEF(10);
MOCKCPP_API_GET_FUNCTION_DEF(11);
MOCKCPP_API_GET_FUNCTION_DEF(12);
}; // struct mockAPI<mockAPIauto>
MOCKCPP_NS_END
#endif

View File

@@ -0,0 +1,43 @@
/***
mockcpp is a generic C/C++ mock framework.
Copyright (C) <2009> <Darwin Yuan: darwin.yuan@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
***/
#ifndef __MOCKCPP_ARGUMENTS_LIST_H_
#define __MOCKCPP_ARGUMENTS_LIST_H_
#include <mockcpp/mockcpp.h>
MOCKCPP_NS_START
/////////////////////////////////////////////////
struct UselessType {};
////////////////////////////////////////////////////
template <typename R
#include <mockcpp/ArgumentsListDef.h>
>
struct ArgumentsList {};
template <typename R
#include <mockcpp/ArgumentsListDef.h>
>
struct ArgumentsListConst {};
MOCKCPP_NS_END
#endif

View File

@@ -0,0 +1,13 @@
, typename P0 = UselessType
, typename P1 = UselessType
, typename P2 = UselessType
, typename P3 = UselessType
, typename P4 = UselessType
, typename P5 = UselessType
, typename P6 = UselessType
, typename P7 = UselessType
, typename P8 = UselessType
, typename P9 = UselessType
, typename P10 = UselessType
, typename P11 = UselessType
, typename P12 = UselessType

View File

@@ -0,0 +1 @@
Artificial dependency for a custom command.

View File

@@ -0,0 +1,67 @@
/***
mockcpp is a generic C/C++ mock framework.
Copyright (C) <2009> <Darwin Yuan: darwin.yuan@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
***/
#ifndef __MOCKCPP_ARGUMENTS_MACRO_HELPERS_H
#define __MOCKCPP_ARGUMENTS_MACRO_HELPERS_H
#include <mockcpp/RepeatMacros.h>
#define __ARG(n) MOCKP ## n
#define END_ARGS(n) __ARG(n)
#define ARGS(n) __ARG(n) ,
#define REST_ARGS(n) , __ARG(n)
#define __PARAM(n) p ## n
#define END_PARAMS(n) __PARAM(n)
#define PARAMS(n) __PARAM(n) ,
#define REST_PARAMS(n) , __PARAM(n)
#define TEMPLATE_ARG(n) typename __ARG(n)
#define TEMPLATE_ARGS(n) , TEMPLATE_ARG(n)
#define VOID_TEMPLATE_ARGS(n) typename __ARG(n),
#define __ARG_DECL(n) __ARG(n) __PARAM(n)
#define ARG_DECL(n) __ARG_DECL(n) ,
#define END_ARG_DECL(n) __ARG_DECL(n)
#define REST_ARG_DECL(n) , __ARG_DECL(n)
#define DECL_TEMPLATE_ARGS(n) SIMPLE_REPEAT(n, TEMPLATE_ARGS)
#define DECL_VARDIC_ARGS(n) SIMPLE_REPEAT(n, ARGS)
#define DECL_VARDIC_PARAM_LIST(n) SIMPLE_REPEAT(n, ARG_DECL)
#define DECL_VOID_TEMPLATE_ARGS(n) REPEAT(n, VOID_TEMPLATE_ARGS, TEMPLATE_ARG)
#define DECL_ARGS(n) REPEAT(n, ARGS, END_ARGS)
#define DECL_PARAMS(n) REPEAT(n, PARAMS, END_PARAMS)
#define DECL_PARAMS_LIST(n) REPEAT(n, ARG_DECL, END_ARG_DECL)
#define DECL_REST_ARGS(n) SIMPLE_REPEAT(n, REST_ARGS)
#define DECL_REST_PARAMS(n) SIMPLE_REPEAT(n, REST_PARAMS)
#define DECL_REST_ARG_DECL(n) SIMPLE_REPEAT(n, REST_ARG_DECL)
#define MOCKER_PP_CAT(a, b) MOCKER_PP_CAT_I(a, b)
#define MOCKER_PP_CAT_I(a, b) MOCKER_PP_CAT_II(~, a ## b)
#define MOCKER_PP_CAT_II(p, res) res
#define MOCKER_PP_VARIADIC_SIZE(...) MOCKER_PP_VARIADIC_SIZE_I(__VA_ARGS__)
#define MOCKER_PP_VARIADIC_SIZE_I(...) MOCKER_PP_VARIADIC_SIZE_II(MOCKER_PP_VARIADIC_SIZE_S(__VA_ARGS__, 64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1,))
#define MOCKER_PP_VARIADIC_SIZE_II(res) res
#define MOCKER_PP_VARIADIC_SIZE_S(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63, size, ...) size
#define MOCKER_PP_OVERLOAD(prefix, ...) MOCKER_PP_CAT(prefix, MOCKER_PP_VARIADIC_SIZE(__VA_ARGS__))
#endif

View File

@@ -0,0 +1,77 @@
/***
mockcpp is a generic C/C++ mock framework.
Copyright (C) <2009> <Darwin Yuan: darwin.yuan@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
***/
#ifndef __MOCKCPP_ARGUMENTS_MATCH_BUILDER_H
#define __MOCKCPP_ARGUMENTS_MATCH_BUILDER_H
#include <mockcpp/mockcpp.h>
#include <mockcpp/IsAnythingHelper.h>
#include <mockcpp/DummyBuilder.h>
MOCKCPP_NS_START
struct InvocationMocker;
struct Constraint;
template <typename Builder = DummyBuilder >
struct ArgumentsMatchBuilder : public Builder
{
Builder& with( const Any& c01 = any()
, const Any& c02 = any()
, const Any& c03 = any()
, const Any& c04 = any()
, const Any& c05 = any()
, const Any& c06 = any()
, const Any& c07 = any()
, const Any& c08 = any()
, const Any& c09 = any()
, const Any& c10 = any()
, const Any& c11 = any()
, const Any& c12 = any()
);
#if 0
Builder& with( Constraint* c01 = any()
, Constraint* c02 = any()
, Constraint* c03 = any()
, Constraint* c04 = any()
, Constraint* c05 = any()
, Constraint* c06 = any()
, Constraint* c07 = any()
, Constraint* c08 = any()
, Constraint* c09 = any()
, Constraint* c10 = any()
, Constraint* c11 = any()
, Constraint* c12 = any()
);
#endif
virtual ~ArgumentsMatchBuilder() {}
private:
virtual InvocationMocker* getMocker() const = 0;
};
MOCKCPP_NS_END
#include <mockcpp/ArgumentsMatchBuilder.tcc>
#endif

View File

@@ -0,0 +1,87 @@
/***
mockcpp is a generic C/C++ mock framework.
Copyright (C) <2009> <Darwin Yuan: darwin.yuan@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
***/
#include <mockcpp/InvocationMocker.h>
#include <mockcpp/Constraint.h>
#include <mockcpp/ConstraintSet.h>
#include <mockcpp/types/Any.h>
MOCKCPP_NS_START
template <typename Builder>
Builder&
ArgumentsMatchBuilder<Builder>::
with( const Any& c01
, const Any& c02
, const Any& c03
, const Any& c04
, const Any& c05
, const Any& c06
, const Any& c07
, const Any& c08
, const Any& c09
, const Any& c10
, const Any& c11
, const Any& c12
)
{
getMocker()->addMatcher(
new ConstraintSet( c01.getConstraint()
, c02.getConstraint()
, c03.getConstraint()
, c04.getConstraint()
, c05.getConstraint()
, c06.getConstraint()
, c07.getConstraint()
, c08.getConstraint()
, c09.getConstraint()
, c10.getConstraint()
, c11.getConstraint()
, c12.getConstraint()));
return *this;
}
#if 0
template <typename Builder>
Builder&
ArgumentsMatchBuilder<Builder>::
with( Constraint* c01
, Constraint* c02
, Constraint* c03
, Constraint* c04
, Constraint* c05
, Constraint* c06
, Constraint* c07
, Constraint* c08
, Constraint* c09
, Constraint* c10
, Constraint* c11
, Constraint* c12
)
{
getMocker()->addMatcher(
new ConstraintSet(c01, c02, c03, c04, c05, c06,
c07, c08, c09, c10, c11, c12));
return *this;
}
#endif
MOCKCPP_NS_END

View File

@@ -0,0 +1,61 @@
/***
mockcpp is a generic C/C++ mock framework.
Copyright (C) <2009> <Darwin Yuan: darwin.yuan@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
***/
#ifndef __MOCKCPP_ASSERTER_H
#define __MOCKCPP_ASSERTER_H
#include <mockcpp/mockcpp.h>
#include <mockcpp/AssertionFailedError.h>
MOCKCPP_NS_START
void assertTrue( unsigned srcline, const char* srcfile
, const std::string &message, bool condition);
void assertTrue( unsigned srcline, const char* srcfile
, bool condition);
void assertFalse(unsigned srcline, const char* srcfile
, const std::string &message , bool condition);
void assertFalse(unsigned srcline, const char* srcfile
, bool condition);
void fail(unsigned srcline, const char* srcfile,
const std::string &message);
void fail(unsigned srcline, const char* srcfile);
void assertEquals(unsigned srcline, const char* srcfile,
const std::string& message,
const char *expected, const char *actual);
void assertEquals(unsigned srcline, const char* srcfile,
const char *expected, const char *actual);
#define MOCKCPP_ASSERT_EQUALS_MESSAGE(msg, a, b) MOCKCPP_NS::assertEquals(__LINE__, __FILE__, msg, a, b)
#define MOCKCPP_ASSERT_EQUALS(a, b) MOCKCPP_NS::assertEquals(__LINE__, __FILE__, "invalid: " #a " == " #b, a, b)
#define MOCKCPP_ASSERT_TRUE_MESSAGE(msg, cond) MOCKCPP_NS::assertTrue(__LINE__, __FILE__, msg, cond)
#define MOCKCPP_ASSERT_FALSE_MESSAGE(msg, cond) MOCKCPP_NS::assertFalse(__LINE__, __FILE__, msg, cond)
#define MOCKCPP_FAIL(msg) MOCKCPP_NS::fail(__LINE__, __FILE__, msg)
MOCKCPP_NS_END
#endif

View File

@@ -0,0 +1,45 @@
/***
mockcpp is a generic C/C++ mock framework.
Copyright (C) <2009> <Darwin Yuan: darwin.yuan@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
***/
#ifndef __MOCKCPP_ASSERTION_FAILED_ERROR_H
#define __MOCKCPP_ASSERTION_FAILED_ERROR_H
#include <mockcpp/mockcpp.h>
#include <mockcpp/Exception.h>
MOCKCPP_NS_START
struct AssertionFailedError : public Exception
{
AssertionFailedError (unsigned srcline, const char* srcfile,
const std::string& message);
virtual ~AssertionFailedError() throw();
};
void
assertionFailed
( unsigned int line
, const char* file
, const std::string& message);
MOCKCPP_NS_END
#endif

View File

@@ -0,0 +1,59 @@
/***
mockcpp is a generic C/C++ mock framework.
Copyright (C) <2009> <Darwin Yuan: darwin.yuan@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
***/
#ifndef __MOCKCPP_BEFORE_MATCH_BUILDER_H
#define __MOCKCPP_BEFORE_MATCH_BUILDER_H
#include <mockcpp/mockcpp.h>
#include <mockcpp/DummyBuilder.h>
MOCKCPP_NS_START
struct InvocationMockerNamespace;
struct InvocationMocker;
template <typename Builder = DummyBuilder>
struct BeforeMatchBuilder : public Builder
{
BeforeMatchBuilder&
before(const InvocationMockerNamespace& ns, const std::string& name);
BeforeMatchBuilder&
before(InvocationMockerNamespace* ns, const std::string& name);
BeforeMatchBuilder&
before(const std::string& name);
virtual ~BeforeMatchBuilder() {}
private:
void
setupOrderingBeforeMatchers(InvocationMocker* mocker);
private:
virtual InvocationMocker* getMocker() const = 0;
};
MOCKCPP_NS_END
#include <mockcpp/BeforeMatchBuilder.tcc>
#endif

View File

@@ -0,0 +1,59 @@
/***
mockcpp is a generic C/C++ mock framework.
Copyright (C) <2009> <Darwin Yuan: darwin.yuan@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
***/
#include <mockcpp/InvocationMockerNamespace.h>
#include <mockcpp/InvocationMocker.h>
#include <mockcpp/Method.h>
#include <mockcpp/BeforeMatcher.h>
#include <mockcpp/PendingMatcher.h>
MOCKCPP_NS_START
//////////////////////////////////////////////////////////////////////
template <class Builder>
BeforeMatchBuilder<Builder>&
BeforeMatchBuilder<Builder>::before(const InvocationMockerNamespace& ns, const std::string& name)
{
return before(&const_cast<InvocationMockerNamespace&>(ns), name);
}
//////////////////////////////////////////////////////////////////////
template <class Builder>
BeforeMatchBuilder<Builder>&
BeforeMatchBuilder<Builder>::before(InvocationMockerNamespace* ns, const std::string& id)
{
getMocker()->addMatcher(
new PendingMatcher(
new BeforeMatcher(), ns , id , getMocker()));
return *this;
}
//////////////////////////////////////////////////////////////////////
template <class Builder>
BeforeMatchBuilder<Builder>&
BeforeMatchBuilder<Builder>::before(const std::string& name)
{
return before(getMocker()->getMethod()->getNamespace(), name);
}
//////////////////////////////////////////////////////////////////////
MOCKCPP_NS_END

View File

@@ -0,0 +1,56 @@
/***
mockcpp is a generic C/C++ mock framework.
Copyright (C) <2009> <Darwin Yuan: darwin.yuan@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
***/
#ifndef __MOCKCPP_BEFORE_MATCHER_H
#define __MOCKCPP_BEFORE_MATCHER_H
#include <mockcpp/mockcpp.h>
#include <mockcpp/OrderingMatcher.h>
#include <string>
MOCKCPP_NS_START
struct InvocationMocker;
struct Invocation;
struct BeforeMatcher : public OrderingMatcher
{
BeforeMatcher();
bool matches(const Invocation& inv) const;
void increaseInvoked(const Invocation& inv);
std::string toString() const;
void verify();
bool isCompleted(void) const;
void setOrderingInvocationMocker(InvocationMocker* mocker);
private:
InvocationMocker* previousCall;
};
MOCKCPP_NS_END
#endif

View File

@@ -0,0 +1,48 @@
/***
mockcpp is a generic C/C++ mock framework.
Copyright (C) <2009> <Darwin Yuan: darwin.yuan@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
***/
#ifndef __MOCKCPP_CALLER_MATCH_BUILDER_H
#define __MOCKCPP_CALLER_MATCH_BUILDER_H
#include <mockcpp/mockcpp.h>
#include <mockcpp/DummyBuilder.h>
#include <string>
MOCKCPP_NS_START
struct InvocationMocker;
template <typename Builder = DummyBuilder>
struct CallerMatchBuilder : public Builder
{
Builder& caller(const std::string& nameOfCaller);
virtual ~CallerMatchBuilder() {}
private:
virtual InvocationMocker* getMocker() const = 0;
};
MOCKCPP_NS_END
#include <mockcpp/CallerMatchBuilder.tcc>
#endif

View File

@@ -0,0 +1,37 @@
/***
mockcpp is a generic C/C++ mock framework.
Copyright (C) <2009> <Darwin Yuan: darwin.yuan@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
***/
#include <mockcpp/InvocationMocker.h>
#include <mockcpp/CallerMatcher.h>
MOCKCPP_NS_START
//////////////////////////////////////////////////////////////////////
template <class Builder>
Builder&
CallerMatchBuilder<Builder>::caller(const std::string& nameOfCaller)
{
getMocker()->addMatcher(new CallerMatcher(nameOfCaller));
return *this;
}
//////////////////////////////////////////////////////////////////////
MOCKCPP_NS_END

View File

@@ -0,0 +1,45 @@
/***
mockcpp is a generic C/C++ mock framework.
Copyright (C) <2009> <Darwin Yuan: darwin.yuan@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
***/
#ifndef __MOCKCPP_CALLER_MATCHER_H
#define __MOCKCPP_CALLER_MATCHER_H
#include <mockcpp/mockcpp.h>
#include <mockcpp/Matcher.h>
#include <string>
MOCKCPP_NS_START
struct Invocation;
struct CallerMatcher : public Matcher
{
CallerMatcher(const std::string& name);
bool matches(const Invocation& inv) const;
void increaseInvoked(const Invocation& inv);
void verify() ;
std::string toString() const ;
private:
std::string nameOfCaller;
};
MOCKCPP_NS_END
#endif

View File

@@ -0,0 +1,133 @@
/***
mockcpp is a generic C/C++ mock framework.
Copyright (C) <2009> <Darwin Yuan: darwin.yuan@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
***/
#ifndef __MOCKCPP_CHAINABLE_MOCK_METHOD_H
#define __MOCKCPP_CHAINABLE_MOCK_METHOD_H
#include <mockcpp/mockcpp.h>
#include <mockcpp/types/Any.h>
#include <mockcpp/types/AnyCast.h>
#include <mockcpp/Invocation.h>
#include <mockcpp/Invokable.h>
#include <mockcpp/Result.h>
#include <mockcpp/Asserter.h>
#include <mockcpp/ReportFailure.h>
MOCKCPP_NS_START
struct SelfDescribe;
template <typename RT>
struct ChainableMockMethodBase
{
ChainableMockMethodBase(Invokable* invokable_)
: invokable(invokable_)
{}
RT operator()(const std::string& nameOfCaller
, const RefAny& pThisPointer = RefAny()
, const RefAny& p01 = RefAny()
, const RefAny& p02 = RefAny()
, const RefAny& p03 = RefAny()
, const RefAny& p04 = RefAny()
, const RefAny& p05 = RefAny()
, const RefAny& p06 = RefAny()
, const RefAny& p07 = RefAny()
, const RefAny& p08 = RefAny()
, const RefAny& p09 = RefAny()
, const RefAny& p10 = RefAny()
, const RefAny& p11 = RefAny()
, const RefAny& p12 = RefAny()
)
{
SelfDescribe* resultProvider = 0;
try {
const Any& result = \
invokable->invoke(nameOfCaller, pThisPointer
, p01, p02, p03, p04, p05, p06
, p07, p08, p09, p10, p11, p12
, resultProvider);
return getResult(result, resultProvider);
} catch (std::exception& ex)
{
MOCKCPP_REPORT_FAILURE(ex.what());
}
const Any& dummyResult = Any();
return getResult(dummyResult, resultProvider);
}
virtual ~ChainableMockMethodBase() {}
protected:
virtual RT getResult(const Any& result, SelfDescribe*) = 0;
private:
Invokable* invokable;
};
//////////////////////////////////////////////////////////////////
template <typename RT>
struct ChainableMockMethod : public ChainableMockMethodBase<RT>
{
RT getResult(const Any& anyResult, SelfDescribe* resultProvider)
{
const Any& result = \
Result(any_castable<RT>(anyResult)
, typeid(RT)
, TypeString<RT>::value()
, resultProvider).getResult(anyResult);
MOCKCPP_ASSERT_FALSE_MESSAGE(
"The return value for a non-void method was not specified",
result.empty());
return any_cast<RT>(result);
}
public:
ChainableMockMethod(Invokable* invokable)
: ChainableMockMethodBase<RT>(invokable)
{}
};
//////////////////////////////////////////////////////////////////
template <>
struct ChainableMockMethod<void> : public ChainableMockMethodBase<void>
{
void getResult(const Any& result, SelfDescribe*)
{
}
public:
ChainableMockMethod(Invokable* invokable)
: ChainableMockMethodBase<void>(invokable)
{}
};
//////////////////////////////////////////////////////////////////
MOCKCPP_NS_END
#endif

View File

@@ -0,0 +1,54 @@
/***
mockcpp is a generic C/C++ mock framework.
Copyright (C) <2009> <Darwin Yuan: darwin.yuan@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
***/
#ifndef __MOCKCPP_CHAINABLE_MOCK_METHOD_CONTAINER_H
#define __MOCKCPP_CHAINABLE_MOCK_METHOD_CONTAINER_H
#include <mockcpp/mockcpp.h>
#include <string>
MOCKCPP_NS_START
struct ChainableMockMethodContainerImpl;
struct ChainableMockMethodKey;
struct ChainableMockMethodCore;
struct InvocationMocker;
///////////////////////////////////////////////////////////////
struct ChainableMockMethodContainer
{
ChainableMockMethodContainer();
~ChainableMockMethodContainer();
ChainableMockMethodCore* getMethod(ChainableMockMethodKey* key) const;
void addMethod(ChainableMockMethodKey* key, ChainableMockMethodCore* method);
InvocationMocker* findInvocationMocker(const std::string& id) const;
void reset();
void reset(ChainableMockMethodKey* key);
void verify();
private:
ChainableMockMethodContainerImpl* This;
};
MOCKCPP_NS_END
#endif

View File

@@ -0,0 +1,89 @@
/***
mockcpp is a generic C/C++ mock framework.
Copyright (C) <2009> <Darwin Yuan: darwin.yuan@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
***/
#ifndef __MOCKCPP_CHAINABLE_MOCK_METHOD_CORE_H
#define __MOCKCPP_CHAINABLE_MOCK_METHOD_CORE_H
#include <mockcpp/mockcpp.h>
#include <mockcpp/Method.h>
#include <mockcpp/InvocationMockerContainer.h>
#include <string>
MOCKCPP_NS_START
struct Stub;
struct ChainableMockMethodCoreImpl;
struct SelfDescribe;
struct InvokedRecorder;
struct InvocationMockerNamespace;
struct ChainableMockMethodCore
: public Method,
public InvocationMockerContainer
{
public:
ChainableMockMethodCore(const std::string& name,
InvocationMockerNamespace* ns);
~ChainableMockMethodCore();
// Method
const Any&
invoke( const std::string& nameOfCaller
, const RefAny& pThisPointer
, const RefAny& p1
, const RefAny& p2
, const RefAny& p3
, const RefAny& p4
, const RefAny& p5
, const RefAny& p6
, const RefAny& p7
, const RefAny& p8
, const RefAny& p9
, const RefAny& p10
, const RefAny& p11
, const RefAny& p12
, SelfDescribe* &resultProvider);
std::string& getName(void) const;
InvocationMockerNamespace* getNamespace() const;
public:
// InvocationMockContainer
InvocationMocker* getInvocationMocker(const std::string& id);
void addInvocationMocker(InvocationMocker* mocker);
void addDefaultInvocationMocker(InvocationMocker* mocker);
public:
// Others
void reset();
void verify();
private:
ChainableMockMethodCoreImpl* This;
};
MOCKCPP_NS_END
#endif

View File

@@ -0,0 +1,46 @@
/***
mockcpp is a generic C/C++ mock framework.
Copyright (C) <2009> <Darwin Yuan: darwin.yuan@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
***/
#ifndef __MOCKCPP_CHAINABLE_MOCK_METHOD_INDEX_KEY_H
#define __MOCKCPP_CHAINABLE_MOCK_METHOD_INDEX_KEY_H
#include <mockcpp/mockcpp.h>
#include <mockcpp/ChainableMockMethodKey.h>
#include <string>
MOCKCPP_NS_START
struct ChainableMockMethodIndexKey
: public ChainableMockMethodKey
{
ChainableMockMethodIndexKey(unsigned int vptrIndex, unsigned int vtblIndex);
bool equals(const ChainableMockMethodKey * const rhs) const;
unsigned int getIndex() const;
private:
unsigned int index;
};
MOCKCPP_NS_END
#endif

View File

@@ -0,0 +1,36 @@
/***
mockcpp is a generic C/C++ mock framework.
Copyright (C) <2009> <Darwin Yuan: darwin.yuan@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
***/
#ifndef __MOCKCPP_CHAINABLE_MOCK_METHOD_KEY_H
#define __MOCKCPP_CHAINABLE_MOCK_METHOD_KEY_H
#include <mockcpp/mockcpp.h>
MOCKCPP_NS_START
struct ChainableMockMethodKey
{
virtual bool equals(const ChainableMockMethodKey * const rhs) const = 0;
virtual ~ChainableMockMethodKey() {}
};
MOCKCPP_NS_END
#endif

View File

@@ -0,0 +1,46 @@
/***
mockcpp is a generic C/C++ mock framework.
Copyright (C) <2009> <Darwin Yuan: darwin.yuan@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
***/
#ifndef __MOCKCPP_CHAINABLE_MOCK_METHOD_NAME_KEY_H
#define __MOCKCPP_CHAINABLE_MOCK_METHOD_NAME_KEY_H
#include <mockcpp/mockcpp.h>
#include <mockcpp/ChainableMockMethodKey.h>
#include <string>
MOCKCPP_NS_START
struct ChainableMockMethodNameKey
: public ChainableMockMethodKey
{
ChainableMockMethodNameKey(const std::string& name);
bool equals(const ChainableMockMethodKey * const rhs) const;
std::string& getMethodName() const;
private:
std::string methodName;
};
MOCKCPP_NS_END
#endif

View File

@@ -0,0 +1,69 @@
/***
mockcpp is a generic C/C++ mock framework.
Copyright (C) <2009> <Darwin Yuan: darwin.yuan@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
***/
#ifndef __MOCKCPP_CHAINABLE_MOCK_OBJECT_H_
#define __MOCKCPP_CHAINABLE_MOCK_OBJECT_H_
#include <mockcpp/mockcpp.h>
#include <mockcpp/ChainableMockObjectBase.h>
#include <mockcpp/ChainableMockMethod.h>
#include <mockcpp/InvocationMockBuilderGetter.h>
#include <string>
MOCKCPP_NS_START
struct ChainableMockObjectImpl;
struct Invokable;
struct ChainableMockObject
: public ChainableMockObjectBase
{
public:
ChainableMockObject(const std::string& name);
~ChainableMockObject();
// Building-invocation-mocker interface -- Used in test case
InvocationMockBuilderGetter method(const std::string& name);
// Invoking interface -- Used in Functor
template <typename RT>
ChainableMockMethod<RT> invoke(const std::string& name)
{
return ChainableMockMethod<RT>(getInvokable(name));
}
void reset();
private:
// It's only for template-method invoke. we have to make it visible.
Invokable* getInvokable(const std::string& name);
private:
ChainableMockObjectImpl* This;
};
MOCKCPP_NS_END
#endif

View File

@@ -0,0 +1,75 @@
/***
mockcpp is a generic C/C++ mock framework.
Copyright (C) <2009> <Darwin Yuan: darwin.yuan@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
***/
#ifndef __MOCKCPP_CHAINABLE_MOCK_OBJECT_BASE_H
#define __MOCKCPP_CHAINABLE_MOCK_OBJECT_BASE_H
#include <mockcpp/mockcpp.h>
#include <mockcpp/InvocationMockerNamespace.h>
#include <mockcpp/ChainableMockMethodContainer.h>
#include <string>
MOCKCPP_NS_START
struct ChainableMockObjectBaseImpl;
struct InvocationMocker;
struct ChainableMockObjectBase
: public InvocationMockerNamespace
{
public:
~ChainableMockObjectBase();
const std::string& getName(void) const;
// InvocationMockerNamespace -- id("id");
InvocationMocker* getInvocationMocker(const std::string& id) const;
virtual void verify();
protected:
ChainableMockMethodContainer* getMethodContainer() const;
protected:
explicit ChainableMockObjectBase(const std::string& name);
ChainableMockObjectBase(const ChainableMockObjectBase&);
private:
ChainableMockObjectBase& operator=(const ChainableMockObjectBase&);
protected:
bool shared;
private:
ChainableMockObjectBaseImpl* This;
};
MOCKCPP_NS_END
#endif

View File

@@ -0,0 +1,254 @@
/***
mockcpp is a generic C/C++ mock framework.
Copyright (C) <2009> <Darwin Yuan: darwin.yuan@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
***/
#ifndef __MOCKCPP_CHAINING_MOCK_HELPER_H
#define __MOCKCPP_CHAINING_MOCK_HELPER_H
#include <boost/typeof/typeof.hpp>
#include <mockcpp/mockcpp.h>
#include <mockcpp/IsEqual.h>
#include <mockcpp/IsNotEqual.h>
#include <mockcpp/IsGreaterThan.h>
#include <mockcpp/IsLessThan.h>
#include <mockcpp/IsMirror.h>
#include <mockcpp/Spy.h>
#include <mockcpp/CheckWith.h>
#include <mockcpp/ProcessWith.h>
#include <mockcpp/OutBound.h>
#include <mockcpp/OutBoundPointer.h>
#include <mockcpp/IncrementStub.h>
#include <mockcpp/ThrowExceptionStub.h>
#include <mockcpp/TypelessStubAdapter.h>
#include <mockcpp/types/Any.h>
#include <mockcpp/ProcStub.h>
MOCKCPP_NS_START
struct Matcher;
struct Stub;
Matcher* once();
Matcher* never();
Matcher* atLeast(unsigned int times);
Matcher* atMost(unsigned int times);
Matcher* exactly(unsigned int times);
template <typename T>
Constraint* eq(const T& val)
{
return new IsEqual<T>(val);
}
template <typename T>
Constraint* neq(const T& val)
{
return new IsNotEqual<T>(val);
}
template <typename T>
Constraint* gt(const T& val)
{
return new IsGreaterThan<T>(val);
}
template <typename T>
Constraint* lt(const T& val)
{
return new IsLessThan<T>(val);
}
////////////////////////////////////////////////////////////////
#if 0
static inline Constraint* eq(const char* s)
{
return new IsEqual<const char*>(s);
}
#endif
template <typename T>
Constraint* spy(T& val)
{
return new Spy<T>(val);
}
template <typename Predict>
struct PredictTypeTraits
{
};
template <typename Predict, typename T>
struct PredictTypeTraits<bool (Predict::*)(T)>
{
typedef T ParaType;
};
template <typename Predict>
Constraint* checkWith(Predict pred)
{
typedef typename PredictTypeTraits<BOOST_TYPEOF(&Predict::operator())>::ParaType T;
return new CheckWith<T, Predict>(pred);
}
////////////////////////////////////////////////////////////////
template <typename T>
Constraint* checkWith(bool (*pred)(T))
{
return new CheckWith<T, bool (*)(T)>(pred);
}
////////////////////////////////////////////////////////////////
template <typename Proc>
Constraint* processWith(Proc proc)
{
typedef typename PredictTypeTraits<BOOST_TYPEOF(&Proc::operator())>::ParaType T;
return new ProcessWith<T, Proc>(proc);
}
////////////////////////////////////////////////////////////////
template <typename T>
Constraint* processWith(void (*proc)(T))
{
return new ProcessWith<T, void (*)(T)>(proc);
}
////////////////////////////////////////////////////////////////
template <typename T>
Constraint* outBound(const T& val, Constraint* constraint = 0)
{
return new OutBound<T>(val, constraint);
}
////////////////////////////////////////////////////////////////
// outBoundP
////////////////////////////////////////////////////////////////
template <typename T>
Constraint* outBoundP(T* p, size_t size, Constraint* constraint = 0)
{
return new OutBoundPointer<T*>(p, size, constraint);
}
////////////////////////////////////////////////////////////////
Constraint* outBoundP(void* p, size_t size, Constraint* constraint = 0);
////////////////////////////////////////////////////////////////
template <typename T>
Constraint* outBoundP(T* p, Constraint* constraint = 0)
{
return new OutBoundPointer<T*>(p, sizeof(T), constraint);
}
///////////////////////////////////////////////////////////////////
// mirror
///////////////////////////////////////////////////////////////////
#if defined(__GNUC__) && (__GNUC__ > 3)
template <typename T>
Constraint* mirror(const T& obj)
{
return new IsMirror<T>(obj);
}
#endif
///////////////////////////////////////////////////////////////////
template <typename T>
Constraint* mirror(T* p, size_t size = 0)
{
return new IsMirror<T*>(p, size);
}
///////////////////////////////////////////////////////////////////
Constraint* mirror(void* p, size_t size);
#if 0
Constraint* startWith(char*);
Constraint* startWith(const char*);
Constraint* startWith(unsigned char*);
Constraint* startWith(unsigned const char*);
#endif
Constraint* startWith(const std::string&);
#if 0
Constraint* endWith(char*);
Constraint* endWith(const char*);
Constraint* endWith(unsigned char*);
Constraint* endWith(unsigned const char*);
#endif
Constraint* endWith(const std::string&);
#if 0
Constraint* contains(char*);
Constraint* contains(const char*);
Constraint* contains(unsigned char*);
Constraint* contains(unsigned const char*);
#endif
Constraint* contains(const std::string&);
///////////////////////////////////////////////////////////////////
// smirror
///////////////////////////////////////////////////////////////////
Constraint* smirror(char* s);
Constraint* smirror(const char* s);
Constraint* smirror(unsigned char* s);
Constraint* smirror(const unsigned char* s);
///////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
Stub* die(int code = 0);
Stub* returnValue(const Any& val);
Stub* repeat(const Any& val, unsigned int repeatTimes);
Stub* ignoreReturnValue();
Stub* returnObjectList( const Any& o01
, const Any& o02 = Any()
, const Any& o03 = Any()
, const Any& o04 = Any()
, const Any& o05 = Any()
, const Any& o06 = Any()
, const Any& o07 = Any()
, const Any& o08 = Any()
, const Any& o09 = Any()
, const Any& o10 = Any()
, const Any& o11 = Any()
, const Any& o12 = Any());
template <typename T>
Stub* increase(const T& from, const T& to)
{
return new TypelessStubAdapter(new IncrementStub<T>(from, to));
}
template <typename T>
Stub* increase(const T& from)
{
return new TypelessStubAdapter(new IncrementStub<T>(from));
}
template <typename T>
Stub* throws(const T& ex)
{
return new TypelessStubAdapter(new ThrowExceptionStub<T>(ex));
}
MOCKCPP_NS_END
#endif

View File

@@ -0,0 +1,56 @@
/***
mockcpp is a generic C/C++ mock framework.
Copyright (C) <2009> <Darwin Yuan: darwin.yuan@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
***/
#ifndef __MOCKCPP_CHECK_WITH_H
#define __MOCKCPP_CHECK_WITH_H
#include <mockcpp/types/AnyCast.h>
#include <mockcpp/Constraint.h>
#include <mockcpp/Formatter.h>
MOCKCPP_NS_START
template <typename T, typename Predict>
struct CheckWith : public Constraint
{
CheckWith(Predict pred)
: predict(pred)
{}
bool eval(const RefAny& val) const
{
if(!any_castable<T>(val)) return false;
return predict(any_cast<T>(val));
}
std::string toString() const
{
return std::string("check(") +
MOCKCPP_NS::toTypeAndValueString(predict) +
std::string(")");
}
private:
mutable Predict predict;
};
MOCKCPP_NS_END
#endif

View File

@@ -0,0 +1,35 @@
/***
mockcpp is a generic C/C++ mock framework.
Copyright (C) <2010> <Darwin Yuan: darwin.yuan@gmail.com>
<Chen Guodong: sinojelly@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
***/
#ifndef __MOCKCPP_CODEMODIFIER_H__
#define __MOCKCPP_CODEMODIFIER_H__
#include <mockcpp/mockcpp.h>
MOCKCPP_NS_START
struct CodeModifier
{
// @TODO: 在modify里面加入Cache刷新
static bool modify(void *dest, const void *src, size_t size);
};
MOCKCPP_NS_END
#endif

View File

@@ -0,0 +1,40 @@
/***
mockcpp is a generic C/C++ mock framework.
Copyright (C) <2009> <Darwin Yuan: darwin.yuan@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
***/
#ifndef __MOCKCPP_CONSTRAINT_H
#define __MOCKCPP_CONSTRAINT_H
#include <string>
#include <mockcpp/types/RefAny.h>
MOCKCPP_NS_START
struct RefAny;
struct Constraint
{
virtual ~Constraint() {}
virtual bool eval(const RefAny& inv) const = 0;
virtual std::string toString() const = 0;
};
MOCKCPP_NS_END
#endif

View File

@@ -0,0 +1,64 @@
/***
mockcpp is a generic C/C++ mock framework.
Copyright (C) <2009> <Darwin Yuan: darwin.yuan@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
***/
#ifndef __MOCKCPP_CONSTRAINT_SET_H
#define __MOCKCPP_CONSTRAINT_SET_H
#include <mockcpp/mockcpp.h>
#include <mockcpp/StatelessMatcher.h>
#include <mockcpp/IsAnythingHelper.h>
MOCKCPP_NS_START
struct Invocation;
struct Constraint;
struct ConstraintSetImpl;
struct ConstraintSet: public StatelessMatcher
{
ConstraintSet( Constraint* p01 = any()
, Constraint* p02 = any()
, Constraint* p03 = any()
, Constraint* p04 = any()
, Constraint* p05 = any()
, Constraint* p06 = any()
, Constraint* p07 = any()
, Constraint* p08 = any()
, Constraint* p09 = any()
, Constraint* p10 = any()
, Constraint* p11 = any()
, Constraint* p12 = any()
);
~ConstraintSet();
virtual bool matches(const Invocation& inv) const;
virtual std::string toString() const;
virtual void verify(void);
private:
ConstraintSetImpl* This;
};
MOCKCPP_NS_END
#endif

View File

@@ -0,0 +1,57 @@
/***
mockcpp is a generic C/C++ mock framework.
Copyright (C) <2009> <Darwin Yuan: darwin.yuan@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
***/
#ifndef __MOCKCPP_DECORATED_CONSTRAINT_H
#define __MOCKCPP_DECORATED_CONSTRAINT_H
#include <mockcpp/mockcpp.h>
#include <mockcpp/Constraint.h>
MOCKCPP_NS_START
struct DecoratedConstraint : public Constraint
{
DecoratedConstraint(Constraint* constraint);
~DecoratedConstraint();
bool eval(const RefAny& val) const;
std::string toString() const;
virtual bool evalSelf(const RefAny& val) const = 0;
virtual std::string getName() const = 0;
virtual std::string getTypeAndValueString() const = 0;
protected:
bool hasDecoratedConstraint() const;
private:
std::string getDecoratedConstraintString() const;
private:
Constraint* decoratedConstraint;
};
MOCKCPP_NS_END
#endif

View File

@@ -0,0 +1,47 @@
/***
mockcpp is a generic C/C++ mock framework.
Copyright (C) <2009> <Darwin Yuan: darwin.yuan@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
***/
#ifndef __MOCKCPP_DEFAULT_BUIDLER_H_
#define __MOCKCPP_DEFAULT_BUIDLER_H_
#include <mockcpp/mockcpp.h>
#include <mockcpp/InvocationMockBuilder.h>
#include <mockcpp/CallerMatchBuilder.h>
#include <mockcpp/ArgumentsMatchBuilder.h>
#include <mockcpp/StubBuilder.h>
#include <mockcpp/MoreStubBuilder.h>
MOCKCPP_NS_START
///////////////////////////////////////////////
typedef InvocationMockBuilder<
CallerMatchBuilder<
ArgumentsMatchBuilder<
StubBuilder<
MoreStubBuilder<>
>
>
>
> DefaultBuilder;
///////////////////////////////////////////////
MOCKCPP_NS_END
#endif

View File

@@ -0,0 +1,40 @@
/***
mockcpp is a generic C/C++ mock framework.
Copyright (C) <2009> <Darwin Yuan: darwin.yuan@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
***/
#ifndef __MOCKCPP_DEFAULT_MATCHER_H
#define __MOCKCPP_DEFAULT_MATCHER_H
#include <mockcpp/mockcpp.h>
#include <mockcpp/Matcher.h>
MOCKCPP_NS_START
struct Invocation;
struct DefaultMatcher : public Matcher
{
bool matches(const Invocation& inv) const;
void increaseInvoked(const Invocation& inv);
void verify();
std::string toString() const;
};
MOCKCPP_NS_END
#endif

View File

@@ -0,0 +1,500 @@
MOCKCPP_SET_DEFAULT_METHOD(0, 0);
MOCKCPP_SET_DEFAULT_METHOD(0, 1);
MOCKCPP_SET_DEFAULT_METHOD(0, 2);
MOCKCPP_SET_DEFAULT_METHOD(0, 3);
MOCKCPP_SET_DEFAULT_METHOD(0, 4);
MOCKCPP_SET_DEFAULT_METHOD(0, 5);
MOCKCPP_SET_DEFAULT_METHOD(0, 6);
MOCKCPP_SET_DEFAULT_METHOD(0, 7);
MOCKCPP_SET_DEFAULT_METHOD(0, 8);
MOCKCPP_SET_DEFAULT_METHOD(0, 9);
MOCKCPP_SET_DEFAULT_METHOD(0, 10);
MOCKCPP_SET_DEFAULT_METHOD(0, 11);
MOCKCPP_SET_DEFAULT_METHOD(0, 12);
MOCKCPP_SET_DEFAULT_METHOD(0, 13);
MOCKCPP_SET_DEFAULT_METHOD(0, 14);
MOCKCPP_SET_DEFAULT_METHOD(0, 15);
MOCKCPP_SET_DEFAULT_METHOD(0, 16);
MOCKCPP_SET_DEFAULT_METHOD(0, 17);
MOCKCPP_SET_DEFAULT_METHOD(0, 18);
MOCKCPP_SET_DEFAULT_METHOD(0, 19);
MOCKCPP_SET_DEFAULT_METHOD(0, 20);
MOCKCPP_SET_DEFAULT_METHOD(0, 21);
MOCKCPP_SET_DEFAULT_METHOD(0, 22);
MOCKCPP_SET_DEFAULT_METHOD(0, 23);
MOCKCPP_SET_DEFAULT_METHOD(0, 24);
MOCKCPP_SET_DEFAULT_METHOD(0, 25);
MOCKCPP_SET_DEFAULT_METHOD(0, 26);
MOCKCPP_SET_DEFAULT_METHOD(0, 27);
MOCKCPP_SET_DEFAULT_METHOD(0, 28);
MOCKCPP_SET_DEFAULT_METHOD(0, 29);
MOCKCPP_SET_DEFAULT_METHOD(0, 30);
MOCKCPP_SET_DEFAULT_METHOD(0, 31);
MOCKCPP_SET_DEFAULT_METHOD(0, 32);
MOCKCPP_SET_DEFAULT_METHOD(0, 33);
MOCKCPP_SET_DEFAULT_METHOD(0, 34);
MOCKCPP_SET_DEFAULT_METHOD(0, 35);
MOCKCPP_SET_DEFAULT_METHOD(0, 36);
MOCKCPP_SET_DEFAULT_METHOD(0, 37);
MOCKCPP_SET_DEFAULT_METHOD(0, 38);
MOCKCPP_SET_DEFAULT_METHOD(0, 39);
MOCKCPP_SET_DEFAULT_METHOD(0, 40);
MOCKCPP_SET_DEFAULT_METHOD(0, 41);
MOCKCPP_SET_DEFAULT_METHOD(0, 42);
MOCKCPP_SET_DEFAULT_METHOD(0, 43);
MOCKCPP_SET_DEFAULT_METHOD(0, 44);
MOCKCPP_SET_DEFAULT_METHOD(0, 45);
MOCKCPP_SET_DEFAULT_METHOD(0, 46);
MOCKCPP_SET_DEFAULT_METHOD(0, 47);
MOCKCPP_SET_DEFAULT_METHOD(0, 48);
MOCKCPP_SET_DEFAULT_METHOD(0, 49);
MOCKCPP_SET_DEFAULT_METHOD(0, 50);
MOCKCPP_SET_DEFAULT_METHOD(0, 51);
MOCKCPP_SET_DEFAULT_METHOD(0, 52);
MOCKCPP_SET_DEFAULT_METHOD(0, 53);
MOCKCPP_SET_DEFAULT_METHOD(0, 54);
MOCKCPP_SET_DEFAULT_METHOD(0, 55);
MOCKCPP_SET_DEFAULT_METHOD(0, 56);
MOCKCPP_SET_DEFAULT_METHOD(0, 57);
MOCKCPP_SET_DEFAULT_METHOD(0, 58);
MOCKCPP_SET_DEFAULT_METHOD(0, 59);
MOCKCPP_SET_DEFAULT_METHOD(0, 60);
MOCKCPP_SET_DEFAULT_METHOD(0, 61);
MOCKCPP_SET_DEFAULT_METHOD(0, 62);
MOCKCPP_SET_DEFAULT_METHOD(0, 63);
MOCKCPP_SET_DEFAULT_METHOD(0, 64);
MOCKCPP_SET_DEFAULT_METHOD(0, 65);
MOCKCPP_SET_DEFAULT_METHOD(0, 66);
MOCKCPP_SET_DEFAULT_METHOD(0, 67);
MOCKCPP_SET_DEFAULT_METHOD(0, 68);
MOCKCPP_SET_DEFAULT_METHOD(0, 69);
MOCKCPP_SET_DEFAULT_METHOD(0, 70);
MOCKCPP_SET_DEFAULT_METHOD(0, 71);
MOCKCPP_SET_DEFAULT_METHOD(0, 72);
MOCKCPP_SET_DEFAULT_METHOD(0, 73);
MOCKCPP_SET_DEFAULT_METHOD(0, 74);
MOCKCPP_SET_DEFAULT_METHOD(0, 75);
MOCKCPP_SET_DEFAULT_METHOD(0, 76);
MOCKCPP_SET_DEFAULT_METHOD(0, 77);
MOCKCPP_SET_DEFAULT_METHOD(0, 78);
MOCKCPP_SET_DEFAULT_METHOD(0, 79);
MOCKCPP_SET_DEFAULT_METHOD(0, 80);
MOCKCPP_SET_DEFAULT_METHOD(0, 81);
MOCKCPP_SET_DEFAULT_METHOD(0, 82);
MOCKCPP_SET_DEFAULT_METHOD(0, 83);
MOCKCPP_SET_DEFAULT_METHOD(0, 84);
MOCKCPP_SET_DEFAULT_METHOD(0, 85);
MOCKCPP_SET_DEFAULT_METHOD(0, 86);
MOCKCPP_SET_DEFAULT_METHOD(0, 87);
MOCKCPP_SET_DEFAULT_METHOD(0, 88);
MOCKCPP_SET_DEFAULT_METHOD(0, 89);
MOCKCPP_SET_DEFAULT_METHOD(0, 90);
MOCKCPP_SET_DEFAULT_METHOD(0, 91);
MOCKCPP_SET_DEFAULT_METHOD(0, 92);
MOCKCPP_SET_DEFAULT_METHOD(0, 93);
MOCKCPP_SET_DEFAULT_METHOD(0, 94);
MOCKCPP_SET_DEFAULT_METHOD(0, 95);
MOCKCPP_SET_DEFAULT_METHOD(0, 96);
MOCKCPP_SET_DEFAULT_METHOD(0, 97);
MOCKCPP_SET_DEFAULT_METHOD(0, 98);
MOCKCPP_SET_DEFAULT_METHOD(0, 99);
MOCKCPP_SET_DEFAULT_METHOD(1, 0);
MOCKCPP_SET_DEFAULT_METHOD(1, 1);
MOCKCPP_SET_DEFAULT_METHOD(1, 2);
MOCKCPP_SET_DEFAULT_METHOD(1, 3);
MOCKCPP_SET_DEFAULT_METHOD(1, 4);
MOCKCPP_SET_DEFAULT_METHOD(1, 5);
MOCKCPP_SET_DEFAULT_METHOD(1, 6);
MOCKCPP_SET_DEFAULT_METHOD(1, 7);
MOCKCPP_SET_DEFAULT_METHOD(1, 8);
MOCKCPP_SET_DEFAULT_METHOD(1, 9);
MOCKCPP_SET_DEFAULT_METHOD(1, 10);
MOCKCPP_SET_DEFAULT_METHOD(1, 11);
MOCKCPP_SET_DEFAULT_METHOD(1, 12);
MOCKCPP_SET_DEFAULT_METHOD(1, 13);
MOCKCPP_SET_DEFAULT_METHOD(1, 14);
MOCKCPP_SET_DEFAULT_METHOD(1, 15);
MOCKCPP_SET_DEFAULT_METHOD(1, 16);
MOCKCPP_SET_DEFAULT_METHOD(1, 17);
MOCKCPP_SET_DEFAULT_METHOD(1, 18);
MOCKCPP_SET_DEFAULT_METHOD(1, 19);
MOCKCPP_SET_DEFAULT_METHOD(1, 20);
MOCKCPP_SET_DEFAULT_METHOD(1, 21);
MOCKCPP_SET_DEFAULT_METHOD(1, 22);
MOCKCPP_SET_DEFAULT_METHOD(1, 23);
MOCKCPP_SET_DEFAULT_METHOD(1, 24);
MOCKCPP_SET_DEFAULT_METHOD(1, 25);
MOCKCPP_SET_DEFAULT_METHOD(1, 26);
MOCKCPP_SET_DEFAULT_METHOD(1, 27);
MOCKCPP_SET_DEFAULT_METHOD(1, 28);
MOCKCPP_SET_DEFAULT_METHOD(1, 29);
MOCKCPP_SET_DEFAULT_METHOD(1, 30);
MOCKCPP_SET_DEFAULT_METHOD(1, 31);
MOCKCPP_SET_DEFAULT_METHOD(1, 32);
MOCKCPP_SET_DEFAULT_METHOD(1, 33);
MOCKCPP_SET_DEFAULT_METHOD(1, 34);
MOCKCPP_SET_DEFAULT_METHOD(1, 35);
MOCKCPP_SET_DEFAULT_METHOD(1, 36);
MOCKCPP_SET_DEFAULT_METHOD(1, 37);
MOCKCPP_SET_DEFAULT_METHOD(1, 38);
MOCKCPP_SET_DEFAULT_METHOD(1, 39);
MOCKCPP_SET_DEFAULT_METHOD(1, 40);
MOCKCPP_SET_DEFAULT_METHOD(1, 41);
MOCKCPP_SET_DEFAULT_METHOD(1, 42);
MOCKCPP_SET_DEFAULT_METHOD(1, 43);
MOCKCPP_SET_DEFAULT_METHOD(1, 44);
MOCKCPP_SET_DEFAULT_METHOD(1, 45);
MOCKCPP_SET_DEFAULT_METHOD(1, 46);
MOCKCPP_SET_DEFAULT_METHOD(1, 47);
MOCKCPP_SET_DEFAULT_METHOD(1, 48);
MOCKCPP_SET_DEFAULT_METHOD(1, 49);
MOCKCPP_SET_DEFAULT_METHOD(1, 50);
MOCKCPP_SET_DEFAULT_METHOD(1, 51);
MOCKCPP_SET_DEFAULT_METHOD(1, 52);
MOCKCPP_SET_DEFAULT_METHOD(1, 53);
MOCKCPP_SET_DEFAULT_METHOD(1, 54);
MOCKCPP_SET_DEFAULT_METHOD(1, 55);
MOCKCPP_SET_DEFAULT_METHOD(1, 56);
MOCKCPP_SET_DEFAULT_METHOD(1, 57);
MOCKCPP_SET_DEFAULT_METHOD(1, 58);
MOCKCPP_SET_DEFAULT_METHOD(1, 59);
MOCKCPP_SET_DEFAULT_METHOD(1, 60);
MOCKCPP_SET_DEFAULT_METHOD(1, 61);
MOCKCPP_SET_DEFAULT_METHOD(1, 62);
MOCKCPP_SET_DEFAULT_METHOD(1, 63);
MOCKCPP_SET_DEFAULT_METHOD(1, 64);
MOCKCPP_SET_DEFAULT_METHOD(1, 65);
MOCKCPP_SET_DEFAULT_METHOD(1, 66);
MOCKCPP_SET_DEFAULT_METHOD(1, 67);
MOCKCPP_SET_DEFAULT_METHOD(1, 68);
MOCKCPP_SET_DEFAULT_METHOD(1, 69);
MOCKCPP_SET_DEFAULT_METHOD(1, 70);
MOCKCPP_SET_DEFAULT_METHOD(1, 71);
MOCKCPP_SET_DEFAULT_METHOD(1, 72);
MOCKCPP_SET_DEFAULT_METHOD(1, 73);
MOCKCPP_SET_DEFAULT_METHOD(1, 74);
MOCKCPP_SET_DEFAULT_METHOD(1, 75);
MOCKCPP_SET_DEFAULT_METHOD(1, 76);
MOCKCPP_SET_DEFAULT_METHOD(1, 77);
MOCKCPP_SET_DEFAULT_METHOD(1, 78);
MOCKCPP_SET_DEFAULT_METHOD(1, 79);
MOCKCPP_SET_DEFAULT_METHOD(1, 80);
MOCKCPP_SET_DEFAULT_METHOD(1, 81);
MOCKCPP_SET_DEFAULT_METHOD(1, 82);
MOCKCPP_SET_DEFAULT_METHOD(1, 83);
MOCKCPP_SET_DEFAULT_METHOD(1, 84);
MOCKCPP_SET_DEFAULT_METHOD(1, 85);
MOCKCPP_SET_DEFAULT_METHOD(1, 86);
MOCKCPP_SET_DEFAULT_METHOD(1, 87);
MOCKCPP_SET_DEFAULT_METHOD(1, 88);
MOCKCPP_SET_DEFAULT_METHOD(1, 89);
MOCKCPP_SET_DEFAULT_METHOD(1, 90);
MOCKCPP_SET_DEFAULT_METHOD(1, 91);
MOCKCPP_SET_DEFAULT_METHOD(1, 92);
MOCKCPP_SET_DEFAULT_METHOD(1, 93);
MOCKCPP_SET_DEFAULT_METHOD(1, 94);
MOCKCPP_SET_DEFAULT_METHOD(1, 95);
MOCKCPP_SET_DEFAULT_METHOD(1, 96);
MOCKCPP_SET_DEFAULT_METHOD(1, 97);
MOCKCPP_SET_DEFAULT_METHOD(1, 98);
MOCKCPP_SET_DEFAULT_METHOD(1, 99);
MOCKCPP_SET_DEFAULT_METHOD(2, 0);
MOCKCPP_SET_DEFAULT_METHOD(2, 1);
MOCKCPP_SET_DEFAULT_METHOD(2, 2);
MOCKCPP_SET_DEFAULT_METHOD(2, 3);
MOCKCPP_SET_DEFAULT_METHOD(2, 4);
MOCKCPP_SET_DEFAULT_METHOD(2, 5);
MOCKCPP_SET_DEFAULT_METHOD(2, 6);
MOCKCPP_SET_DEFAULT_METHOD(2, 7);
MOCKCPP_SET_DEFAULT_METHOD(2, 8);
MOCKCPP_SET_DEFAULT_METHOD(2, 9);
MOCKCPP_SET_DEFAULT_METHOD(2, 10);
MOCKCPP_SET_DEFAULT_METHOD(2, 11);
MOCKCPP_SET_DEFAULT_METHOD(2, 12);
MOCKCPP_SET_DEFAULT_METHOD(2, 13);
MOCKCPP_SET_DEFAULT_METHOD(2, 14);
MOCKCPP_SET_DEFAULT_METHOD(2, 15);
MOCKCPP_SET_DEFAULT_METHOD(2, 16);
MOCKCPP_SET_DEFAULT_METHOD(2, 17);
MOCKCPP_SET_DEFAULT_METHOD(2, 18);
MOCKCPP_SET_DEFAULT_METHOD(2, 19);
MOCKCPP_SET_DEFAULT_METHOD(2, 20);
MOCKCPP_SET_DEFAULT_METHOD(2, 21);
MOCKCPP_SET_DEFAULT_METHOD(2, 22);
MOCKCPP_SET_DEFAULT_METHOD(2, 23);
MOCKCPP_SET_DEFAULT_METHOD(2, 24);
MOCKCPP_SET_DEFAULT_METHOD(2, 25);
MOCKCPP_SET_DEFAULT_METHOD(2, 26);
MOCKCPP_SET_DEFAULT_METHOD(2, 27);
MOCKCPP_SET_DEFAULT_METHOD(2, 28);
MOCKCPP_SET_DEFAULT_METHOD(2, 29);
MOCKCPP_SET_DEFAULT_METHOD(2, 30);
MOCKCPP_SET_DEFAULT_METHOD(2, 31);
MOCKCPP_SET_DEFAULT_METHOD(2, 32);
MOCKCPP_SET_DEFAULT_METHOD(2, 33);
MOCKCPP_SET_DEFAULT_METHOD(2, 34);
MOCKCPP_SET_DEFAULT_METHOD(2, 35);
MOCKCPP_SET_DEFAULT_METHOD(2, 36);
MOCKCPP_SET_DEFAULT_METHOD(2, 37);
MOCKCPP_SET_DEFAULT_METHOD(2, 38);
MOCKCPP_SET_DEFAULT_METHOD(2, 39);
MOCKCPP_SET_DEFAULT_METHOD(2, 40);
MOCKCPP_SET_DEFAULT_METHOD(2, 41);
MOCKCPP_SET_DEFAULT_METHOD(2, 42);
MOCKCPP_SET_DEFAULT_METHOD(2, 43);
MOCKCPP_SET_DEFAULT_METHOD(2, 44);
MOCKCPP_SET_DEFAULT_METHOD(2, 45);
MOCKCPP_SET_DEFAULT_METHOD(2, 46);
MOCKCPP_SET_DEFAULT_METHOD(2, 47);
MOCKCPP_SET_DEFAULT_METHOD(2, 48);
MOCKCPP_SET_DEFAULT_METHOD(2, 49);
MOCKCPP_SET_DEFAULT_METHOD(2, 50);
MOCKCPP_SET_DEFAULT_METHOD(2, 51);
MOCKCPP_SET_DEFAULT_METHOD(2, 52);
MOCKCPP_SET_DEFAULT_METHOD(2, 53);
MOCKCPP_SET_DEFAULT_METHOD(2, 54);
MOCKCPP_SET_DEFAULT_METHOD(2, 55);
MOCKCPP_SET_DEFAULT_METHOD(2, 56);
MOCKCPP_SET_DEFAULT_METHOD(2, 57);
MOCKCPP_SET_DEFAULT_METHOD(2, 58);
MOCKCPP_SET_DEFAULT_METHOD(2, 59);
MOCKCPP_SET_DEFAULT_METHOD(2, 60);
MOCKCPP_SET_DEFAULT_METHOD(2, 61);
MOCKCPP_SET_DEFAULT_METHOD(2, 62);
MOCKCPP_SET_DEFAULT_METHOD(2, 63);
MOCKCPP_SET_DEFAULT_METHOD(2, 64);
MOCKCPP_SET_DEFAULT_METHOD(2, 65);
MOCKCPP_SET_DEFAULT_METHOD(2, 66);
MOCKCPP_SET_DEFAULT_METHOD(2, 67);
MOCKCPP_SET_DEFAULT_METHOD(2, 68);
MOCKCPP_SET_DEFAULT_METHOD(2, 69);
MOCKCPP_SET_DEFAULT_METHOD(2, 70);
MOCKCPP_SET_DEFAULT_METHOD(2, 71);
MOCKCPP_SET_DEFAULT_METHOD(2, 72);
MOCKCPP_SET_DEFAULT_METHOD(2, 73);
MOCKCPP_SET_DEFAULT_METHOD(2, 74);
MOCKCPP_SET_DEFAULT_METHOD(2, 75);
MOCKCPP_SET_DEFAULT_METHOD(2, 76);
MOCKCPP_SET_DEFAULT_METHOD(2, 77);
MOCKCPP_SET_DEFAULT_METHOD(2, 78);
MOCKCPP_SET_DEFAULT_METHOD(2, 79);
MOCKCPP_SET_DEFAULT_METHOD(2, 80);
MOCKCPP_SET_DEFAULT_METHOD(2, 81);
MOCKCPP_SET_DEFAULT_METHOD(2, 82);
MOCKCPP_SET_DEFAULT_METHOD(2, 83);
MOCKCPP_SET_DEFAULT_METHOD(2, 84);
MOCKCPP_SET_DEFAULT_METHOD(2, 85);
MOCKCPP_SET_DEFAULT_METHOD(2, 86);
MOCKCPP_SET_DEFAULT_METHOD(2, 87);
MOCKCPP_SET_DEFAULT_METHOD(2, 88);
MOCKCPP_SET_DEFAULT_METHOD(2, 89);
MOCKCPP_SET_DEFAULT_METHOD(2, 90);
MOCKCPP_SET_DEFAULT_METHOD(2, 91);
MOCKCPP_SET_DEFAULT_METHOD(2, 92);
MOCKCPP_SET_DEFAULT_METHOD(2, 93);
MOCKCPP_SET_DEFAULT_METHOD(2, 94);
MOCKCPP_SET_DEFAULT_METHOD(2, 95);
MOCKCPP_SET_DEFAULT_METHOD(2, 96);
MOCKCPP_SET_DEFAULT_METHOD(2, 97);
MOCKCPP_SET_DEFAULT_METHOD(2, 98);
MOCKCPP_SET_DEFAULT_METHOD(2, 99);
MOCKCPP_SET_DEFAULT_METHOD(3, 0);
MOCKCPP_SET_DEFAULT_METHOD(3, 1);
MOCKCPP_SET_DEFAULT_METHOD(3, 2);
MOCKCPP_SET_DEFAULT_METHOD(3, 3);
MOCKCPP_SET_DEFAULT_METHOD(3, 4);
MOCKCPP_SET_DEFAULT_METHOD(3, 5);
MOCKCPP_SET_DEFAULT_METHOD(3, 6);
MOCKCPP_SET_DEFAULT_METHOD(3, 7);
MOCKCPP_SET_DEFAULT_METHOD(3, 8);
MOCKCPP_SET_DEFAULT_METHOD(3, 9);
MOCKCPP_SET_DEFAULT_METHOD(3, 10);
MOCKCPP_SET_DEFAULT_METHOD(3, 11);
MOCKCPP_SET_DEFAULT_METHOD(3, 12);
MOCKCPP_SET_DEFAULT_METHOD(3, 13);
MOCKCPP_SET_DEFAULT_METHOD(3, 14);
MOCKCPP_SET_DEFAULT_METHOD(3, 15);
MOCKCPP_SET_DEFAULT_METHOD(3, 16);
MOCKCPP_SET_DEFAULT_METHOD(3, 17);
MOCKCPP_SET_DEFAULT_METHOD(3, 18);
MOCKCPP_SET_DEFAULT_METHOD(3, 19);
MOCKCPP_SET_DEFAULT_METHOD(3, 20);
MOCKCPP_SET_DEFAULT_METHOD(3, 21);
MOCKCPP_SET_DEFAULT_METHOD(3, 22);
MOCKCPP_SET_DEFAULT_METHOD(3, 23);
MOCKCPP_SET_DEFAULT_METHOD(3, 24);
MOCKCPP_SET_DEFAULT_METHOD(3, 25);
MOCKCPP_SET_DEFAULT_METHOD(3, 26);
MOCKCPP_SET_DEFAULT_METHOD(3, 27);
MOCKCPP_SET_DEFAULT_METHOD(3, 28);
MOCKCPP_SET_DEFAULT_METHOD(3, 29);
MOCKCPP_SET_DEFAULT_METHOD(3, 30);
MOCKCPP_SET_DEFAULT_METHOD(3, 31);
MOCKCPP_SET_DEFAULT_METHOD(3, 32);
MOCKCPP_SET_DEFAULT_METHOD(3, 33);
MOCKCPP_SET_DEFAULT_METHOD(3, 34);
MOCKCPP_SET_DEFAULT_METHOD(3, 35);
MOCKCPP_SET_DEFAULT_METHOD(3, 36);
MOCKCPP_SET_DEFAULT_METHOD(3, 37);
MOCKCPP_SET_DEFAULT_METHOD(3, 38);
MOCKCPP_SET_DEFAULT_METHOD(3, 39);
MOCKCPP_SET_DEFAULT_METHOD(3, 40);
MOCKCPP_SET_DEFAULT_METHOD(3, 41);
MOCKCPP_SET_DEFAULT_METHOD(3, 42);
MOCKCPP_SET_DEFAULT_METHOD(3, 43);
MOCKCPP_SET_DEFAULT_METHOD(3, 44);
MOCKCPP_SET_DEFAULT_METHOD(3, 45);
MOCKCPP_SET_DEFAULT_METHOD(3, 46);
MOCKCPP_SET_DEFAULT_METHOD(3, 47);
MOCKCPP_SET_DEFAULT_METHOD(3, 48);
MOCKCPP_SET_DEFAULT_METHOD(3, 49);
MOCKCPP_SET_DEFAULT_METHOD(3, 50);
MOCKCPP_SET_DEFAULT_METHOD(3, 51);
MOCKCPP_SET_DEFAULT_METHOD(3, 52);
MOCKCPP_SET_DEFAULT_METHOD(3, 53);
MOCKCPP_SET_DEFAULT_METHOD(3, 54);
MOCKCPP_SET_DEFAULT_METHOD(3, 55);
MOCKCPP_SET_DEFAULT_METHOD(3, 56);
MOCKCPP_SET_DEFAULT_METHOD(3, 57);
MOCKCPP_SET_DEFAULT_METHOD(3, 58);
MOCKCPP_SET_DEFAULT_METHOD(3, 59);
MOCKCPP_SET_DEFAULT_METHOD(3, 60);
MOCKCPP_SET_DEFAULT_METHOD(3, 61);
MOCKCPP_SET_DEFAULT_METHOD(3, 62);
MOCKCPP_SET_DEFAULT_METHOD(3, 63);
MOCKCPP_SET_DEFAULT_METHOD(3, 64);
MOCKCPP_SET_DEFAULT_METHOD(3, 65);
MOCKCPP_SET_DEFAULT_METHOD(3, 66);
MOCKCPP_SET_DEFAULT_METHOD(3, 67);
MOCKCPP_SET_DEFAULT_METHOD(3, 68);
MOCKCPP_SET_DEFAULT_METHOD(3, 69);
MOCKCPP_SET_DEFAULT_METHOD(3, 70);
MOCKCPP_SET_DEFAULT_METHOD(3, 71);
MOCKCPP_SET_DEFAULT_METHOD(3, 72);
MOCKCPP_SET_DEFAULT_METHOD(3, 73);
MOCKCPP_SET_DEFAULT_METHOD(3, 74);
MOCKCPP_SET_DEFAULT_METHOD(3, 75);
MOCKCPP_SET_DEFAULT_METHOD(3, 76);
MOCKCPP_SET_DEFAULT_METHOD(3, 77);
MOCKCPP_SET_DEFAULT_METHOD(3, 78);
MOCKCPP_SET_DEFAULT_METHOD(3, 79);
MOCKCPP_SET_DEFAULT_METHOD(3, 80);
MOCKCPP_SET_DEFAULT_METHOD(3, 81);
MOCKCPP_SET_DEFAULT_METHOD(3, 82);
MOCKCPP_SET_DEFAULT_METHOD(3, 83);
MOCKCPP_SET_DEFAULT_METHOD(3, 84);
MOCKCPP_SET_DEFAULT_METHOD(3, 85);
MOCKCPP_SET_DEFAULT_METHOD(3, 86);
MOCKCPP_SET_DEFAULT_METHOD(3, 87);
MOCKCPP_SET_DEFAULT_METHOD(3, 88);
MOCKCPP_SET_DEFAULT_METHOD(3, 89);
MOCKCPP_SET_DEFAULT_METHOD(3, 90);
MOCKCPP_SET_DEFAULT_METHOD(3, 91);
MOCKCPP_SET_DEFAULT_METHOD(3, 92);
MOCKCPP_SET_DEFAULT_METHOD(3, 93);
MOCKCPP_SET_DEFAULT_METHOD(3, 94);
MOCKCPP_SET_DEFAULT_METHOD(3, 95);
MOCKCPP_SET_DEFAULT_METHOD(3, 96);
MOCKCPP_SET_DEFAULT_METHOD(3, 97);
MOCKCPP_SET_DEFAULT_METHOD(3, 98);
MOCKCPP_SET_DEFAULT_METHOD(3, 99);
MOCKCPP_SET_DEFAULT_METHOD(4, 0);
MOCKCPP_SET_DEFAULT_METHOD(4, 1);
MOCKCPP_SET_DEFAULT_METHOD(4, 2);
MOCKCPP_SET_DEFAULT_METHOD(4, 3);
MOCKCPP_SET_DEFAULT_METHOD(4, 4);
MOCKCPP_SET_DEFAULT_METHOD(4, 5);
MOCKCPP_SET_DEFAULT_METHOD(4, 6);
MOCKCPP_SET_DEFAULT_METHOD(4, 7);
MOCKCPP_SET_DEFAULT_METHOD(4, 8);
MOCKCPP_SET_DEFAULT_METHOD(4, 9);
MOCKCPP_SET_DEFAULT_METHOD(4, 10);
MOCKCPP_SET_DEFAULT_METHOD(4, 11);
MOCKCPP_SET_DEFAULT_METHOD(4, 12);
MOCKCPP_SET_DEFAULT_METHOD(4, 13);
MOCKCPP_SET_DEFAULT_METHOD(4, 14);
MOCKCPP_SET_DEFAULT_METHOD(4, 15);
MOCKCPP_SET_DEFAULT_METHOD(4, 16);
MOCKCPP_SET_DEFAULT_METHOD(4, 17);
MOCKCPP_SET_DEFAULT_METHOD(4, 18);
MOCKCPP_SET_DEFAULT_METHOD(4, 19);
MOCKCPP_SET_DEFAULT_METHOD(4, 20);
MOCKCPP_SET_DEFAULT_METHOD(4, 21);
MOCKCPP_SET_DEFAULT_METHOD(4, 22);
MOCKCPP_SET_DEFAULT_METHOD(4, 23);
MOCKCPP_SET_DEFAULT_METHOD(4, 24);
MOCKCPP_SET_DEFAULT_METHOD(4, 25);
MOCKCPP_SET_DEFAULT_METHOD(4, 26);
MOCKCPP_SET_DEFAULT_METHOD(4, 27);
MOCKCPP_SET_DEFAULT_METHOD(4, 28);
MOCKCPP_SET_DEFAULT_METHOD(4, 29);
MOCKCPP_SET_DEFAULT_METHOD(4, 30);
MOCKCPP_SET_DEFAULT_METHOD(4, 31);
MOCKCPP_SET_DEFAULT_METHOD(4, 32);
MOCKCPP_SET_DEFAULT_METHOD(4, 33);
MOCKCPP_SET_DEFAULT_METHOD(4, 34);
MOCKCPP_SET_DEFAULT_METHOD(4, 35);
MOCKCPP_SET_DEFAULT_METHOD(4, 36);
MOCKCPP_SET_DEFAULT_METHOD(4, 37);
MOCKCPP_SET_DEFAULT_METHOD(4, 38);
MOCKCPP_SET_DEFAULT_METHOD(4, 39);
MOCKCPP_SET_DEFAULT_METHOD(4, 40);
MOCKCPP_SET_DEFAULT_METHOD(4, 41);
MOCKCPP_SET_DEFAULT_METHOD(4, 42);
MOCKCPP_SET_DEFAULT_METHOD(4, 43);
MOCKCPP_SET_DEFAULT_METHOD(4, 44);
MOCKCPP_SET_DEFAULT_METHOD(4, 45);
MOCKCPP_SET_DEFAULT_METHOD(4, 46);
MOCKCPP_SET_DEFAULT_METHOD(4, 47);
MOCKCPP_SET_DEFAULT_METHOD(4, 48);
MOCKCPP_SET_DEFAULT_METHOD(4, 49);
MOCKCPP_SET_DEFAULT_METHOD(4, 50);
MOCKCPP_SET_DEFAULT_METHOD(4, 51);
MOCKCPP_SET_DEFAULT_METHOD(4, 52);
MOCKCPP_SET_DEFAULT_METHOD(4, 53);
MOCKCPP_SET_DEFAULT_METHOD(4, 54);
MOCKCPP_SET_DEFAULT_METHOD(4, 55);
MOCKCPP_SET_DEFAULT_METHOD(4, 56);
MOCKCPP_SET_DEFAULT_METHOD(4, 57);
MOCKCPP_SET_DEFAULT_METHOD(4, 58);
MOCKCPP_SET_DEFAULT_METHOD(4, 59);
MOCKCPP_SET_DEFAULT_METHOD(4, 60);
MOCKCPP_SET_DEFAULT_METHOD(4, 61);
MOCKCPP_SET_DEFAULT_METHOD(4, 62);
MOCKCPP_SET_DEFAULT_METHOD(4, 63);
MOCKCPP_SET_DEFAULT_METHOD(4, 64);
MOCKCPP_SET_DEFAULT_METHOD(4, 65);
MOCKCPP_SET_DEFAULT_METHOD(4, 66);
MOCKCPP_SET_DEFAULT_METHOD(4, 67);
MOCKCPP_SET_DEFAULT_METHOD(4, 68);
MOCKCPP_SET_DEFAULT_METHOD(4, 69);
MOCKCPP_SET_DEFAULT_METHOD(4, 70);
MOCKCPP_SET_DEFAULT_METHOD(4, 71);
MOCKCPP_SET_DEFAULT_METHOD(4, 72);
MOCKCPP_SET_DEFAULT_METHOD(4, 73);
MOCKCPP_SET_DEFAULT_METHOD(4, 74);
MOCKCPP_SET_DEFAULT_METHOD(4, 75);
MOCKCPP_SET_DEFAULT_METHOD(4, 76);
MOCKCPP_SET_DEFAULT_METHOD(4, 77);
MOCKCPP_SET_DEFAULT_METHOD(4, 78);
MOCKCPP_SET_DEFAULT_METHOD(4, 79);
MOCKCPP_SET_DEFAULT_METHOD(4, 80);
MOCKCPP_SET_DEFAULT_METHOD(4, 81);
MOCKCPP_SET_DEFAULT_METHOD(4, 82);
MOCKCPP_SET_DEFAULT_METHOD(4, 83);
MOCKCPP_SET_DEFAULT_METHOD(4, 84);
MOCKCPP_SET_DEFAULT_METHOD(4, 85);
MOCKCPP_SET_DEFAULT_METHOD(4, 86);
MOCKCPP_SET_DEFAULT_METHOD(4, 87);
MOCKCPP_SET_DEFAULT_METHOD(4, 88);
MOCKCPP_SET_DEFAULT_METHOD(4, 89);
MOCKCPP_SET_DEFAULT_METHOD(4, 90);
MOCKCPP_SET_DEFAULT_METHOD(4, 91);
MOCKCPP_SET_DEFAULT_METHOD(4, 92);
MOCKCPP_SET_DEFAULT_METHOD(4, 93);
MOCKCPP_SET_DEFAULT_METHOD(4, 94);
MOCKCPP_SET_DEFAULT_METHOD(4, 95);
MOCKCPP_SET_DEFAULT_METHOD(4, 96);
MOCKCPP_SET_DEFAULT_METHOD(4, 97);
MOCKCPP_SET_DEFAULT_METHOD(4, 98);
MOCKCPP_SET_DEFAULT_METHOD(4, 99);

View File

@@ -0,0 +1 @@
Artificial dependency for a custom command.

View File

@@ -0,0 +1,48 @@
/***
mockcpp is a generic C/C++ mock framework.
Copyright (C) <2009> <Darwin Yuan: darwin.yuan@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
***/
#ifndef __MOCKCPP_DEFAULT_STUB_H
#define __MOCKCPP_DEFAULT_STUB_H
#include <mockcpp/mockcpp.h>
#include <mockcpp/Stub.h>
MOCKCPP_NS_START
struct Any;
struct Invocation;
struct DefaultStub : public Stub
{
DefaultStub(Stub* stub);
~DefaultStub();
Any& invoke(const Invocation& inv);
std::string toString() const;
private:
Stub* defaultStub;
};
MOCKCPP_NS_END
#endif

View File

@@ -0,0 +1,76 @@
/***
mockcpp is a generic C/C++ mock framework.
Copyright (C) <2009> <Darwin Yuan: darwin.yuan@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
***/
#ifndef __MOCKCPP_DELEGATED_METHOD_H
#define __MOCKCPP_DELEGATED_METHOD_H
#include <mockcpp/mockcpp.h>
#include <mockcpp/ArgumentsList.h>
#include <mockcpp/VirtualTable.h>
#include <mockcpp/ChainableMockMethod.h>
#include <mockcpp/ArgumentsMacroHelpers.h>
#include <mockcpp/IndexInvokableGetter.h>
MOCKCPP_NS_START
/////////////////////////////////////////////////////////////////
template <int VPTRIndex, int VTBLIndex, typename ArgumentsList>
struct DelegatedMethod;
/////////////////////////////////////////////////////////////////
#define MOCKCPP_DELEGATED_METHOD_DEF(n) \
template <int VPTRIndex, int VTBLIndex, typename R DECL_TEMPLATE_ARGS(n)> \
struct DelegatedMethod<VPTRIndex, VTBLIndex, ArgumentsList<R DECL_REST_ARGS(n)> > \
{ \
enum { IsConst = 0 }; \
enum { NumberOfParameters = n }; \
\
R operator()(DECL_PARAMS_LIST(n)) \
{ \
IndexInvokableGetter* getter = \
VirtualTable::getInvokableGetter(this, VPTRIndex); \
return ChainableMockMethod<R>(getter->getInvokable(VPTRIndex, VTBLIndex)) \
("", RefAny() DECL_REST_PARAMS(n)); \
} \
}
/////////////////////////////////////////////////////////////////
#define MOCKCPP_CONST_DELEGATED_METHOD_DEF(n) \
template <int VPTRIndex, int VTBLIndex, typename R DECL_TEMPLATE_ARGS(n)> \
struct DelegatedMethod<VPTRIndex, VTBLIndex, ArgumentsListConst<R DECL_REST_ARGS(n)> > \
{ \
enum { IsConst = 1 }; \
enum { NumberOfParameters = n }; \
\
R operator()(DECL_PARAMS_LIST(n)) \
{ \
IndexInvokableGetter* getter = \
VirtualTable::getInvokableGetter(this, VPTRIndex); \
return ChainableMockMethod<R>(getter->getInvokable(VPTRIndex, VTBLIndex)) \
("", RefAny() DECL_REST_PARAMS(n)); \
} \
}
/////////////////////////////////////////////////////////////////
#include <mockcpp/DelegatedMethodDef.h>
MOCKCPP_NS_END
#endif

View File

@@ -0,0 +1,26 @@
MOCKCPP_DELEGATED_METHOD_DEF(0);
MOCKCPP_CONST_DELEGATED_METHOD_DEF(0);
MOCKCPP_DELEGATED_METHOD_DEF(1);
MOCKCPP_CONST_DELEGATED_METHOD_DEF(1);
MOCKCPP_DELEGATED_METHOD_DEF(2);
MOCKCPP_CONST_DELEGATED_METHOD_DEF(2);
MOCKCPP_DELEGATED_METHOD_DEF(3);
MOCKCPP_CONST_DELEGATED_METHOD_DEF(3);
MOCKCPP_DELEGATED_METHOD_DEF(4);
MOCKCPP_CONST_DELEGATED_METHOD_DEF(4);
MOCKCPP_DELEGATED_METHOD_DEF(5);
MOCKCPP_CONST_DELEGATED_METHOD_DEF(5);
MOCKCPP_DELEGATED_METHOD_DEF(6);
MOCKCPP_CONST_DELEGATED_METHOD_DEF(6);
MOCKCPP_DELEGATED_METHOD_DEF(7);
MOCKCPP_CONST_DELEGATED_METHOD_DEF(7);
MOCKCPP_DELEGATED_METHOD_DEF(8);
MOCKCPP_CONST_DELEGATED_METHOD_DEF(8);
MOCKCPP_DELEGATED_METHOD_DEF(9);
MOCKCPP_CONST_DELEGATED_METHOD_DEF(9);
MOCKCPP_DELEGATED_METHOD_DEF(10);
MOCKCPP_CONST_DELEGATED_METHOD_DEF(10);
MOCKCPP_DELEGATED_METHOD_DEF(11);
MOCKCPP_CONST_DELEGATED_METHOD_DEF(11);
MOCKCPP_DELEGATED_METHOD_DEF(12);
MOCKCPP_CONST_DELEGATED_METHOD_DEF(12);

View File

@@ -0,0 +1 @@
Artificial dependency for a custom command.

View File

@@ -0,0 +1,5 @@
DELEGATED_METHOD_GET_BY_VPTR(0, vtblIndex)
DELEGATED_METHOD_GET_BY_VPTR(1, vtblIndex)
DELEGATED_METHOD_GET_BY_VPTR(2, vtblIndex)
DELEGATED_METHOD_GET_BY_VPTR(3, vtblIndex)
DELEGATED_METHOD_GET_BY_VPTR(4, vtblIndex)

View File

@@ -0,0 +1 @@
Artificial dependency for a custom command.

View File

@@ -0,0 +1,100 @@
DELEGATED_METHOD_GET(VPTRIndex, 0)
DELEGATED_METHOD_GET(VPTRIndex, 1)
DELEGATED_METHOD_GET(VPTRIndex, 2)
DELEGATED_METHOD_GET(VPTRIndex, 3)
DELEGATED_METHOD_GET(VPTRIndex, 4)
DELEGATED_METHOD_GET(VPTRIndex, 5)
DELEGATED_METHOD_GET(VPTRIndex, 6)
DELEGATED_METHOD_GET(VPTRIndex, 7)
DELEGATED_METHOD_GET(VPTRIndex, 8)
DELEGATED_METHOD_GET(VPTRIndex, 9)
DELEGATED_METHOD_GET(VPTRIndex, 10)
DELEGATED_METHOD_GET(VPTRIndex, 11)
DELEGATED_METHOD_GET(VPTRIndex, 12)
DELEGATED_METHOD_GET(VPTRIndex, 13)
DELEGATED_METHOD_GET(VPTRIndex, 14)
DELEGATED_METHOD_GET(VPTRIndex, 15)
DELEGATED_METHOD_GET(VPTRIndex, 16)
DELEGATED_METHOD_GET(VPTRIndex, 17)
DELEGATED_METHOD_GET(VPTRIndex, 18)
DELEGATED_METHOD_GET(VPTRIndex, 19)
DELEGATED_METHOD_GET(VPTRIndex, 20)
DELEGATED_METHOD_GET(VPTRIndex, 21)
DELEGATED_METHOD_GET(VPTRIndex, 22)
DELEGATED_METHOD_GET(VPTRIndex, 23)
DELEGATED_METHOD_GET(VPTRIndex, 24)
DELEGATED_METHOD_GET(VPTRIndex, 25)
DELEGATED_METHOD_GET(VPTRIndex, 26)
DELEGATED_METHOD_GET(VPTRIndex, 27)
DELEGATED_METHOD_GET(VPTRIndex, 28)
DELEGATED_METHOD_GET(VPTRIndex, 29)
DELEGATED_METHOD_GET(VPTRIndex, 30)
DELEGATED_METHOD_GET(VPTRIndex, 31)
DELEGATED_METHOD_GET(VPTRIndex, 32)
DELEGATED_METHOD_GET(VPTRIndex, 33)
DELEGATED_METHOD_GET(VPTRIndex, 34)
DELEGATED_METHOD_GET(VPTRIndex, 35)
DELEGATED_METHOD_GET(VPTRIndex, 36)
DELEGATED_METHOD_GET(VPTRIndex, 37)
DELEGATED_METHOD_GET(VPTRIndex, 38)
DELEGATED_METHOD_GET(VPTRIndex, 39)
DELEGATED_METHOD_GET(VPTRIndex, 40)
DELEGATED_METHOD_GET(VPTRIndex, 41)
DELEGATED_METHOD_GET(VPTRIndex, 42)
DELEGATED_METHOD_GET(VPTRIndex, 43)
DELEGATED_METHOD_GET(VPTRIndex, 44)
DELEGATED_METHOD_GET(VPTRIndex, 45)
DELEGATED_METHOD_GET(VPTRIndex, 46)
DELEGATED_METHOD_GET(VPTRIndex, 47)
DELEGATED_METHOD_GET(VPTRIndex, 48)
DELEGATED_METHOD_GET(VPTRIndex, 49)
DELEGATED_METHOD_GET(VPTRIndex, 50)
DELEGATED_METHOD_GET(VPTRIndex, 51)
DELEGATED_METHOD_GET(VPTRIndex, 52)
DELEGATED_METHOD_GET(VPTRIndex, 53)
DELEGATED_METHOD_GET(VPTRIndex, 54)
DELEGATED_METHOD_GET(VPTRIndex, 55)
DELEGATED_METHOD_GET(VPTRIndex, 56)
DELEGATED_METHOD_GET(VPTRIndex, 57)
DELEGATED_METHOD_GET(VPTRIndex, 58)
DELEGATED_METHOD_GET(VPTRIndex, 59)
DELEGATED_METHOD_GET(VPTRIndex, 60)
DELEGATED_METHOD_GET(VPTRIndex, 61)
DELEGATED_METHOD_GET(VPTRIndex, 62)
DELEGATED_METHOD_GET(VPTRIndex, 63)
DELEGATED_METHOD_GET(VPTRIndex, 64)
DELEGATED_METHOD_GET(VPTRIndex, 65)
DELEGATED_METHOD_GET(VPTRIndex, 66)
DELEGATED_METHOD_GET(VPTRIndex, 67)
DELEGATED_METHOD_GET(VPTRIndex, 68)
DELEGATED_METHOD_GET(VPTRIndex, 69)
DELEGATED_METHOD_GET(VPTRIndex, 70)
DELEGATED_METHOD_GET(VPTRIndex, 71)
DELEGATED_METHOD_GET(VPTRIndex, 72)
DELEGATED_METHOD_GET(VPTRIndex, 73)
DELEGATED_METHOD_GET(VPTRIndex, 74)
DELEGATED_METHOD_GET(VPTRIndex, 75)
DELEGATED_METHOD_GET(VPTRIndex, 76)
DELEGATED_METHOD_GET(VPTRIndex, 77)
DELEGATED_METHOD_GET(VPTRIndex, 78)
DELEGATED_METHOD_GET(VPTRIndex, 79)
DELEGATED_METHOD_GET(VPTRIndex, 80)
DELEGATED_METHOD_GET(VPTRIndex, 81)
DELEGATED_METHOD_GET(VPTRIndex, 82)
DELEGATED_METHOD_GET(VPTRIndex, 83)
DELEGATED_METHOD_GET(VPTRIndex, 84)
DELEGATED_METHOD_GET(VPTRIndex, 85)
DELEGATED_METHOD_GET(VPTRIndex, 86)
DELEGATED_METHOD_GET(VPTRIndex, 87)
DELEGATED_METHOD_GET(VPTRIndex, 88)
DELEGATED_METHOD_GET(VPTRIndex, 89)
DELEGATED_METHOD_GET(VPTRIndex, 90)
DELEGATED_METHOD_GET(VPTRIndex, 91)
DELEGATED_METHOD_GET(VPTRIndex, 92)
DELEGATED_METHOD_GET(VPTRIndex, 93)
DELEGATED_METHOD_GET(VPTRIndex, 94)
DELEGATED_METHOD_GET(VPTRIndex, 95)
DELEGATED_METHOD_GET(VPTRIndex, 96)
DELEGATED_METHOD_GET(VPTRIndex, 97)
DELEGATED_METHOD_GET(VPTRIndex, 98)
DELEGATED_METHOD_GET(VPTRIndex, 99)

View File

@@ -0,0 +1 @@
Artificial dependency for a custom command.

View File

@@ -0,0 +1,84 @@
/***
mockcpp is a generic C/C++ mock framework.
Copyright (C) <2009> <Darwin Yuan: darwin.yuan@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
***/
#ifndef __MOCKCPP_DELEGATED_METHOD_GETTER_H
#define __MOCKCPP_DELEGATED_METHOD_GETTER_H
#include <mockcpp/mockcpp.h>
#include <mockcpp/MethodTypeTraits.h>
#include <mockcpp/DelegatedMethod.h>
#include <mockcpp/MethodInfoReader.h>
MOCKCPP_NS_START
#define DELEGATED_METHOD_GET(N, I) \
case I: \
{ \
return getAddrOfMethod(&DelegatedMethod<N, I, ArgumentsList>::operator()); \
} \
void maxVtblSizeTooBigError(unsigned int index);
template <int VPTRIndex, typename ArgumentsList>
struct DelegatedMethodGetter
{
static void* get(unsigned int index)
{
switch(index)
{
# include <mockcpp/DelegatedMethodGetDef.h>
default: break;
}
maxVtblSizeTooBigError(index);
return 0;
}
};
////////////////////////////////////////////////
#define DELEGATED_METHOD_GET_BY_VPTR(N, I) \
case N: \
{ \
return DelegatedMethodGetter<N, MethodArgumentsList>::get(I); \
}
void maxInheritanceTooBigError(unsigned int index);
template <typename C, typename Method>
void* getDelegatedFunction(unsigned int vptrIndex, unsigned int vtblIndex, Method m)
{
typedef typename MethodTypeTraits<C, Method>::MethodArgumentsList MethodArgumentsList;
switch(vptrIndex)
{
# include <mockcpp/DelegatedMethodGetByVptrDef.h>
default:
break;
}
maxInheritanceTooBigError(vptrIndex);
return 0;
}
MOCKCPP_NS_END
#endif

View File

@@ -0,0 +1,5 @@
MOCKCPP_GET_DESTRUCTOR_ADDR(0)
MOCKCPP_GET_DESTRUCTOR_ADDR(1)
MOCKCPP_GET_DESTRUCTOR_ADDR(2)
MOCKCPP_GET_DESTRUCTOR_ADDR(3)
MOCKCPP_GET_DESTRUCTOR_ADDR(4)

View File

@@ -0,0 +1 @@
Artificial dependency for a custom command.

View File

@@ -0,0 +1,58 @@
/***
mockcpp is a generic C/C++ mock framework.
Copyright (C) <2009> <Darwin Yuan: darwin.yuan@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
***/
#ifndef __MOCKCPP_DESTRUCTOR_CHECKER_H
#define __MOCKCPP_DESTRUCTOR_CHECKER_H
#include <algorithm>
#include <typeinfo>
#include <mockcpp/mockcpp.h>
#include <mockcpp/MethodIndiceChecker.h>
#include <mockcpp/ReportFailure.h>
MOCKCPP_NS_START
///////////////////////////////////////////////
template <typename Interface, typename Original>
std::pair<unsigned int, unsigned int> getIndexOfDestructor()
{
MethodIndiceChecker* checker = createMethodIndiceChecker(typeid(Original));
Interface* iface = (Original*) checker->getObject();
delete iface;
unsigned int vptrIndex = 0;
unsigned int vtblIndex = 0;
bool result = checker->getIndice(true, vptrIndex, vtblIndex);
delete checker;
MOCKCPP_ASSERT_TRUE("You are trying to mock an interface without virtual destructor", result);
return std::pair<unsigned int, unsigned int>
(vptrIndex, vtblIndex);
};
///////////////////////////////////////////////
MOCKCPP_NS_END
#endif

View File

@@ -0,0 +1,47 @@
/***
mockcpp is a generic C/C++ mock framework.
Copyright (C) <2009> <Darwin Yuan: darwin.yuan@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
***/
#ifndef __MOCKCPP_DIE_STUB_H
#define __MOCKCPP_DIE_STUB_H
#include <mockcpp/mockcpp.h>
#include <mockcpp/TypelessStub.h>
MOCKCPP_NS_START
struct DieStub : public TypelessStub
{
DieStub(int exitCode = 0);
bool isCompleted() const;
Any& invoke(void);
std::string toString(void) const;
const std::type_info& type() const;
private:
int code;
};
MOCKCPP_NS_END
#endif

View File

@@ -0,0 +1,31 @@
/***
mockcpp is a generic C/C++ mock framework.
Copyright (C) <2009> <Darwin Yuan: darwin.yuan@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
***/
#ifndef __MOCKCPP_DUMMY_BUILDER_H
#define __MOCKCPP_DUMMY_BUILDER_H
#include <mockcpp/mockcpp.h>
MOCKCPP_NS_START
struct DummyBuilder {};
MOCKCPP_NS_END
#endif

View File

@@ -0,0 +1,43 @@
/***
mockcpp is a generic C/C++ mock framework.
Copyright (C) <2009> <Darwin Yuan: darwin.yuan@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
***/
#ifndef __MOCKCPP_EQUALITY_UTIL_H
#define __MOCKCPP_EQUALITY_UTIL_H
#include <mockcpp/mockcpp.h>
#include <string.h>
MOCKCPP_NS_START
template <typename T>
bool isEqualComparison(const T &left, const T &right)
{
return left == right;
}
inline
bool isEqualComparison(const char* left, const char* right)
{
return !::strcmp(left, right);
}
MOCKCPP_NS_END
#endif // __MOCKCPP_EQUALITY_UTIL_H

View File

@@ -0,0 +1,56 @@
/***
mockcpp is a generic C/C++ mock framework.
Copyright (C) <2009> <Darwin Yuan: darwin.yuan@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
***/
#ifndef __MOCKCPP_EXCEPTION_H
#define __MOCKCPP_EXCEPTION_H
#include <mockcpp/mockcpp.h>
#include <string>
#include <exception>
MOCKCPP_NS_START
struct Exception
: public std::exception
{
Exception (unsigned srcline, const char* srcfile, const std::string &message);
virtual ~Exception() throw();
virtual std::string getMessage() const;
unsigned getSrcLine() const;
std::string getSrcFile() const;
virtual const char *what() const throw();
private:
std::string message;
unsigned srcline;
std::string srcfile;
mutable std::string what_helper;
};
MOCKCPP_NS_END
#endif

View File

@@ -0,0 +1,48 @@
/***
mockcpp is a generic C/C++ mock framework.
Copyright (C) <2009> <Darwin Yuan: darwin.yuan@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
***/
#ifndef __MOCKCPP_EXPECTS_MATCHER_H
#define __MOCKCPP_EXPECTS_MATCHER_H
#include <mockcpp/mockcpp.h>
#include <mockcpp/Matcher.h>
MOCKCPP_NS_START
struct Invocation;
struct Matcher;
struct ExpectsMatcher : public Matcher
{
ExpectsMatcher(Matcher*);
~ExpectsMatcher();
bool matches(const Invocation& inv) const;
void increaseInvoked(const Invocation& inv);
void verify();
std::string toString() const;
private:
Matcher* matcher;
};
MOCKCPP_NS_END
#endif

View File

@@ -0,0 +1,92 @@
/***
mockcpp is a generic C/C++ mock framework.
Copyright (C) <2009> <Darwin Yuan: darwin.yuan@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
***/
#ifndef __MOCKCPP_FORMATTER_H
#define __MOCKCPP_FORMATTER_H
#include <mockcpp/mockcpp.h>
#include <string>
#include <mockcpp/OutputStringStream.h>
#include <mockcpp/TypeString.h>
MOCKCPP_NS_START
///////////////////////////////////////////////////////
std::string toBufferString(void* buf, size_t size);
///////////////////////////////////////////////////////
template <typename T>
std::string toString(const T& val)
{
return MOCKCPP_NS::toBufferString((void*)&val, sizeof(val));
}
///////////////////////////////////////////////////////
std::string toPointerString(void*);
///////////////////////////////////////////////////////
template <typename T>
std::string toString(T* p)
{
return MOCKCPP_NS::toPointerString((void*)p);
}
///////////////////////////////////////////////////////
template <typename T>
std::string toString(const T* s)
{
return MOCKCPP_NS::toPointerString((void*)s);
}
///////////////////////////////////////////////////////
std::string toString(std::string s);
std::string toString(char* s);
std::string toString(const char* s);
std::string toString(float f);
std::string toString(double d);
std::string toString(bool b);
std::string toString(char c);
std::string toString(unsigned char c);
std::string toString(short s);
std::string toString(unsigned short s);
std::string toString(int i);
std::string toString(unsigned int i);
std::string toString(long l);
std::string toString(unsigned long l);
#if (MOCKCPP_SUPPORT_LONG_LONG == 1)
std::string toString(long long ll);
std::string toString(unsigned long long ll);
#endif
/////////////////////////////////////////////////////////////////
template <typename T>
std::string toTypeAndValueString(const T& val)
{
oss_t oss;
oss << "(" << MOCKCPP_NS::TypeString<T>::value() << ")"
<< MOCKCPP_NS::toString(val);
return oss.str();
}
MOCKCPP_NS_END
#endif

View File

@@ -0,0 +1,124 @@
/***
mockcpp is a generic C/C++ mock framework.
Copyright (C) <2009> <Darwin Yuan: darwin.yuan@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
***/
#ifndef __MOCKCPP_FUNCTOR_H
#define __MOCKCPP_FUNCTOR_H
#include <mockcpp/mockcpp.h>
#include <string>
#include <mockcpp/GlobalMockObject.h>
#include <mockcpp/ArgumentsMacroHelpers.h>
MOCKCPP_NS_START
/////////////////////////////////////////////
struct BaseFunctor
{
BaseFunctor(const std::string& fName, const char* cName)
: name(fName), nameOfCaller(cName) {}
std::string getName() const
{
return name;
}
std::string getNameOfCaller() const
{
return nameOfCaller;
}
private:
std::string name;
std::string nameOfCaller;
};
////////////////////////////////////////////
template <typename F>
struct Functor;
#define FUNCTOR_CONS() \
Functor(const std::string& name, const char* cName) \
: BaseFunctor(name, cName) \
{}
////////////////////////////////////////////
#define FUNCTOR_DEF(n) \
template <typename R DECL_TEMPLATE_ARGS(n)> \
struct Functor<R(DECL_ARGS(n))> : public BaseFunctor \
{ \
FUNCTOR_CONS() \
\
R operator()(DECL_PARAMS_LIST(n)) \
{ \
return GlobalMockObject::instance.invoke<R>(getName()) \
(getNameOfCaller() DECL_REST_PARAMS(n)); \
} \
}
FUNCTOR_DEF(0);
FUNCTOR_DEF(1);
FUNCTOR_DEF(2);
FUNCTOR_DEF(3);
FUNCTOR_DEF(4);
FUNCTOR_DEF(5);
FUNCTOR_DEF(6);
FUNCTOR_DEF(7);
FUNCTOR_DEF(8);
FUNCTOR_DEF(9);
FUNCTOR_DEF(10);
FUNCTOR_DEF(11);
FUNCTOR_DEF(12);
///////////////////////////////////////////////////////
#define VARDIC_FUNCTOR_DEF(n) \
template <typename R DECL_TEMPLATE_ARGS(n)> \
struct Functor<R(DECL_VARDIC_ARGS(n) ...)> : public BaseFunctor \
{ \
FUNCTOR_CONS() \
\
R operator()(const RefAny& p1 = RefAny(), const RefAny& p2 = RefAny(), \
const RefAny& p3 = RefAny(), const RefAny& p4 = RefAny(), \
const RefAny& p5 = RefAny(), const RefAny& p6 = RefAny(), \
const RefAny& p7 = RefAny(), const RefAny& p8 = RefAny(), \
const RefAny& p9 = RefAny(), const RefAny& p10 = RefAny(), \
const RefAny& p11 = RefAny(), const RefAny& p12 = RefAny()) \
{ \
return GlobalMockObject::instance.invoke<R>(getName()) \
(getNameOfCaller() DECL_REST_PARAMS(12)); \
} \
}
VARDIC_FUNCTOR_DEF(0);
VARDIC_FUNCTOR_DEF(1);
VARDIC_FUNCTOR_DEF(2);
VARDIC_FUNCTOR_DEF(3);
VARDIC_FUNCTOR_DEF(4);
VARDIC_FUNCTOR_DEF(5);
VARDIC_FUNCTOR_DEF(6);
VARDIC_FUNCTOR_DEF(7);
VARDIC_FUNCTOR_DEF(8);
/////////////////////////////////////////////////////////////////////////////
MOCKCPP_NS_END
#endif

View File

@@ -0,0 +1,65 @@
/***
mockcpp is a generic C/C++ mock framework.
Copyright (C) <2009> <Darwin Yuan: darwin.yuan@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
***/
#include <algorithm>
#include <typeinfo>
#include <mockcpp/mockcpp.h>
#include <mockcpp/MethodTypeTraits.h>
#include <mockcpp/MethodIndiceChecker.h>
MOCKCPP_NS_START
///////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////
template <typename Interface, typename Method>
std::pair<unsigned int, unsigned int>
getIndicesOfMethod(Method m)
{
typedef typename MethodTypeTraits<Interface, Method>::MethodType ExpectedMethodType;
ExpectedMethodType expectedMethod = m;
typedef void (Interface::*Checker)(void*);
Checker check = \
reinterpret_cast<Checker>(expectedMethod);
MethodIndiceChecker* checker = createMethodIndiceChecker(typeid(Interface));
Interface* iface = (Interface*)checker->getObject();
(iface->*check)(0);
unsigned int vptrIndex = 0;
unsigned int vtblIndex = 0;
bool result = checker->getIndice(false, vptrIndex, vtblIndex);
delete checker;
MOCKCPP_ASSERT_TRUE("You are trying to mock a non-pure-virtual object", result);
return std::pair<unsigned int, unsigned int>
(vptrIndex, vtblIndex);
};
///////////////////////////////////////////////////////////////////////
MOCKCPP_NS_END

View File

@@ -0,0 +1,65 @@
/***
mockcpp is a generic C/C++ mock framework.
Copyright (C) <2009> <Darwin Yuan: darwin.yuan@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
***/
#ifndef __MOCKCPP_GLOBAL_MOCK_OBJECT_H
#define __MOCKCPP_GLOBAL_MOCK_OBJECT_H
#include <mockcpp/mockcpp.h>
#if defined(MOCKCPP_USE_MOCKABLE)
# include <mockcpp/ChainableMockObject.h>
#else
# include <mockcpp/HookMockObject.h>
#endif
MOCKCPP_NS_START
#if defined(MOCKCPP_USE_MOCKABLE)
typedef ChainableMockObject MockObjectType;
#else
typedef HookMockObject MockObjectType;
#endif
struct GlobalMockObject
{
static void verify();
static void reset();
static void reset(const void* api);
static MockObjectType instance;
};
namespace Details {
template<typename Method>
void *methodToAddr(Method m)
{
union
{
void *addr_;
Method m_;
};
m_ = m;
return addr_;
}
} // namespace Details
MOCKCPP_NS_END
#endif

View File

@@ -0,0 +1,40 @@
/***
mockcpp is a generic C/C++ mock framework.
Copyright (C) <2009> <Darwin Yuan: darwin.yuan@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
***/
#ifndef __MOCKCPP_GNU_METHOD_INDICES_CHECKER_H
#define __MOCKCPP_GNU_METHOD_INDICES_CHECKER_H
#include <algorithm>
#include <mockcpp/mockcpp.h>
#include <mockcpp/GnuMethodInfoReader.h>
MOCKCPP_NS_START
template <typename Interface, typename Method>
std::pair<unsigned int, unsigned int>
getIndicesOfMethod(Method m)
{
unsigned int vptrIndex = getDeltaOfMethod<Interface, Method>(m);
unsigned int vtblIndex = getIndexOfMethod<Interface, Method>(m);
return std::pair<unsigned int, unsigned int>
(vptrIndex, vtblIndex);
}
MOCKCPP_NS_END
#endif

View File

@@ -0,0 +1,105 @@
/***
mockcpp is a generic C/C++ mock framework.
Copyright (C) <2009> <Darwin Yuan: darwin.yuan@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
***/
#ifndef __MOCKCPP_GNU_METHOD_INFO_READER_H
#define __MOCKCPP_GNU_METHOD_INFO_READER_H
#include <algorithm>
#include <mockcpp/mockcpp.h>
#include <mockcpp/OutputStringStream.h>
#include <mockcpp/MethodTypeTraits.h>
#include <mockcpp/ReportFailure.h>
#include <mockcpp/TypeString.h>
MOCKCPP_NS_START
///////////////////////////////////////////////////////////
struct GnuMethodDescription
{
union {
void* addr;
int index;
}u;
int delta;
};
///////////////////////////////////////////////////////////
template <typename Method>
union MethodDescriptionUnion
{
GnuMethodDescription desc;
Method method;
};
///////////////////////////////////////////////////////////
template <typename Method>
void* getAddrOfMethod(Method input)
{
MethodDescriptionUnion<Method> m;
m.method = input;
oss_t oss;
oss << "Method address should be even, please make sure the method "
<< TypeString<Method>::value() << " is NOT a virtual method";
MOCKCPP_ASSERT_TRUE(
oss.str(),
!(m.desc.u.index%2));
return m.desc.u.addr;
}
///////////////////////////////////////////////////////////
template <typename C, typename Method>
GnuMethodDescription getGnuDescOfVirtualMethod(Method input)
{
typedef typename MethodTypeTraits<C, Method>::MethodType ExpectedMethodType;
MethodDescriptionUnion<ExpectedMethodType> m;
m.method = input;
oss_t oss;
oss << "Virtual method address should be odd, please make sure the method "
<< TypeString<Method>::value() << " is a virtual method";
MOCKCPP_ASSERT_TRUE(
oss.str(),
(m.desc.u.index%2));
return m.desc;
}
///////////////////////////////////////////////////////////
template <typename C, typename Method>
unsigned int getIndexOfMethod(Method method)
{
return (getGnuDescOfVirtualMethod<C, Method>(method).u.index - 1)/sizeof(void*);
}
///////////////////////////////////////////////////////////
template <typename C, typename Method>
unsigned int getDeltaOfMethod(Method method)
{
return getGnuDescOfVirtualMethod<C, Method>(method).delta/sizeof(void*);
}
MOCKCPP_NS_END
#endif

View File

@@ -0,0 +1,64 @@
/***
mockcpp is a generic C/C++ mock framework.
Copyright (C) <2009> <Darwin Yuan: darwin.yuan@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
***/
#ifndef __MOCKCPP_HOOK_MOCK_OBJECT_H__
#define __MOCKCPP_HOOK_MOCK_OBJECT_H__
#include <mockcpp/mockcpp.h>
#include <mockcpp/ChainableMockObjectBase.h>
#include <mockcpp/InvocationMockBuilderGetter.h>
#include <mockcpp/ChainableMockMethod.h>
MOCKCPP_NS_START
struct ApiHookHolder;
struct HookMockObjectImpl;
struct HookMockObject : public ChainableMockObjectBase
{
HookMockObject(const std::string& name);
~HookMockObject();
// Building-invocation-mocker interface -- Used in test case
InvocationMockBuilderGetter method
( const std::string& name
, const void* api
, ApiHookHolder* holder);
// Invoking interface -- Used in Functor
template <typename RT>
ChainableMockMethod<RT> invoke(const void* api)
{
return ChainableMockMethod<RT>(getInvokable(api));
}
void reset();
void reset(const void* api);
private:
// It's only for template-method invoke. we have to make it visible.
Invokable* getInvokable(const void* api);
private:
HookMockObjectImpl* This;
};
MOCKCPP_NS_END
#endif

Some files were not shown because too many files have changed in this diff Show More