mirror of
https://github.com/Ascend/ascend-docker-runtime.git
synced 2025-10-17 00:40:37 +08:00
Match-id-515db564370c501883bd877581f460290f764189
This commit is contained in:
3
cli/.gitignore
vendored
Normal file
3
cli/.gitignore
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
.idea
|
||||
cmake-build-debug
|
||||
.vscode
|
1
cli/README.txt
Normal file
1
cli/README.txt
Normal file
@@ -0,0 +1 @@
|
||||
ascend-docker-cli
|
5
cli/src/CMakeLists.txt
Normal file
5
cli/src/CMakeLists.txt
Normal 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
666
cli/src/main.c
Normal 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
157
cli/test/CMakeLists.txt
Normal 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)
|
220
cli/test/include/gtest/UdpSocket.h
Normal file
220
cli/test/include/gtest/UdpSocket.h
Normal 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); /*设置串口打印重定向到文件时,本进程范围内不覆盖之前的打印*/
|
||||
|
||||
};
|
||||
|
||||
}
|
283
cli/test/include/gtest/gtest-death-test.h
Normal file
283
cli/test/include/gtest/gtest-death-test.h
Normal 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_
|
230
cli/test/include/gtest/gtest-message.h
Normal file
230
cli/test/include/gtest/gtest-message.h
Normal 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_
|
1421
cli/test/include/gtest/gtest-param-test.h
Normal file
1421
cli/test/include/gtest/gtest-param-test.h
Normal file
File diff suppressed because it is too large
Load Diff
796
cli/test/include/gtest/gtest-printers.h
Normal file
796
cli/test/include/gtest/gtest-printers.h
Normal 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_
|
232
cli/test/include/gtest/gtest-spi.h
Normal file
232
cli/test/include/gtest/gtest-spi.h
Normal 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(\
|
||||
>est_failures, ::testing::TestPartResult::kFatalFailure, (substr));\
|
||||
{\
|
||||
::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
|
||||
::testing::ScopedFakeTestPartResultReporter:: \
|
||||
INTERCEPT_ONLY_CURRENT_THREAD, >est_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(\
|
||||
>est_failures, ::testing::TestPartResult::kFatalFailure, (substr));\
|
||||
{\
|
||||
::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
|
||||
::testing::ScopedFakeTestPartResultReporter:: \
|
||||
INTERCEPT_ALL_THREADS, >est_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(\
|
||||
>est_failures, ::testing::TestPartResult::kNonFatalFailure, \
|
||||
(substr));\
|
||||
{\
|
||||
::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
|
||||
::testing::ScopedFakeTestPartResultReporter:: \
|
||||
INTERCEPT_ONLY_CURRENT_THREAD, >est_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(\
|
||||
>est_failures, ::testing::TestPartResult::kNonFatalFailure, \
|
||||
(substr));\
|
||||
{\
|
||||
::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
|
||||
::testing::ScopedFakeTestPartResultReporter::INTERCEPT_ALL_THREADS,\
|
||||
>est_failures);\
|
||||
if (::testing::internal::AlwaysTrue()) { statement; }\
|
||||
}\
|
||||
} while (::testing::internal::AlwaysFalse())
|
||||
|
||||
#endif // GTEST_INCLUDE_GTEST_GTEST_SPI_H_
|
180
cli/test/include/gtest/gtest-test-part.h
Normal file
180
cli/test/include/gtest/gtest-test-part.h
Normal 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_
|
259
cli/test/include/gtest/gtest-typed-test.h
Normal file
259
cli/test/include/gtest/gtest-typed-test.h
Normal 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_
|
2552
cli/test/include/gtest/gtest.h
Normal file
2552
cli/test/include/gtest/gtest.h
Normal file
File diff suppressed because it is too large
Load Diff
371
cli/test/include/gtest/gtest_pred_impl.h
Normal file
371
cli/test/include/gtest/gtest_pred_impl.h
Normal 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_
|
58
cli/test/include/gtest/gtest_prod.h
Normal file
58
cli/test/include/gtest/gtest_prod.h
Normal 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_
|
308
cli/test/include/gtest/internal/gtest-death-test-internal.h
Normal file
308
cli/test/include/gtest/internal/gtest-death-test-internal.h
Normal 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, >est_regex, \
|
||||
__FILE__, __LINE__, >est_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_
|
210
cli/test/include/gtest/internal/gtest-filepath.h
Normal file
210
cli/test/include/gtest/internal/gtest-filepath.h
Normal 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_
|
1280
cli/test/include/gtest/internal/gtest-internal.h
Normal file
1280
cli/test/include/gtest/internal/gtest-internal.h
Normal file
File diff suppressed because it is too large
Load Diff
233
cli/test/include/gtest/internal/gtest-linked_ptr.h
Normal file
233
cli/test/include/gtest/internal/gtest-linked_ptr.h
Normal 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_
|
4822
cli/test/include/gtest/internal/gtest-param-util-generated.h
Normal file
4822
cli/test/include/gtest/internal/gtest-param-util-generated.h
Normal file
File diff suppressed because it is too large
Load Diff
@@ -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 ¤t_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_
|
628
cli/test/include/gtest/internal/gtest-param-util.h
Normal file
628
cli/test/include/gtest/internal/gtest-param-util.h
Normal 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(¶meter_);
|
||||
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_
|
1782
cli/test/include/gtest/internal/gtest-port.h
Normal file
1782
cli/test/include/gtest/internal/gtest-port.h
Normal file
File diff suppressed because it is too large
Load Diff
350
cli/test/include/gtest/internal/gtest-string.h
Normal file
350
cli/test/include/gtest/internal/gtest-string.h
Normal 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_
|
968
cli/test/include/gtest/internal/gtest-tuple.h
Normal file
968
cli/test/include/gtest/internal/gtest-tuple.h
Normal 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_
|
336
cli/test/include/gtest/internal/gtest-tuple.h.pump
Normal file
336
cli/test/include/gtest/internal/gtest-tuple.h.pump
Normal 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_
|
3330
cli/test/include/gtest/internal/gtest-type-util.h
Normal file
3330
cli/test/include/gtest/internal/gtest-type-util.h
Normal file
File diff suppressed because it is too large
Load Diff
296
cli/test/include/gtest/internal/gtest-type-util.h.pump
Normal file
296
cli/test/include/gtest/internal/gtest-type-util.h.pump
Normal 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_
|
27093
cli/test/include/gtest/msxml6.h
Normal file
27093
cli/test/include/gtest/msxml6.h
Normal file
File diff suppressed because it is too large
Load Diff
3934
cli/test/include/gtest/msxml6.idl
Normal file
3934
cli/test/include/gtest/msxml6.idl
Normal file
File diff suppressed because it is too large
Load Diff
660
cli/test/include/gtest/msxml6did.h
Normal file
660
cli/test/include/gtest/msxml6did.h
Normal 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
|
294
cli/test/include/gtest/tinystr.h
Normal file
294
cli/test/include/gtest/tinystr.h
Normal 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
|
1511
cli/test/include/gtest/tinyxml.h
Normal file
1511
cli/test/include/gtest/tinyxml.h
Normal file
File diff suppressed because it is too large
Load Diff
58
cli/test/include/mockcpp/AfterMatchBuilder.h
Normal file
58
cli/test/include/mockcpp/AfterMatchBuilder.h
Normal 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
|
||||
|
58
cli/test/include/mockcpp/AfterMatchBuilder.tcc
Normal file
58
cli/test/include/mockcpp/AfterMatchBuilder.tcc
Normal 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
|
||||
|
||||
|
56
cli/test/include/mockcpp/AfterMatcher.h
Normal file
56
cli/test/include/mockcpp/AfterMatcher.h
Normal 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
|
||||
|
24
cli/test/include/mockcpp/ApiHook.h
Normal file
24
cli/test/include/mockcpp/ApiHook.h
Normal 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
|
167
cli/test/include/mockcpp/ApiHookFunctor.h
Normal file
167
cli/test/include/mockcpp/ApiHookFunctor.h
Normal 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
|
||||
|
75
cli/test/include/mockcpp/ApiHookGenerator.h
Normal file
75
cli/test/include/mockcpp/ApiHookGenerator.h
Normal 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
|
||||
|
19
cli/test/include/mockcpp/ApiHookHolder.h
Normal file
19
cli/test/include/mockcpp/ApiHookHolder.h
Normal 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
|
||||
|
23
cli/test/include/mockcpp/ApiHookHolderFactory.h
Normal file
23
cli/test/include/mockcpp/ApiHookHolderFactory.h
Normal 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
|
||||
|
50
cli/test/include/mockcpp/ApiHookKey.h
Normal file
50
cli/test/include/mockcpp/ApiHookKey.h
Normal 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
|
||||
|
125
cli/test/include/mockcpp/ApiHookMocker.h
Normal file
125
cli/test/include/mockcpp/ApiHookMocker.h
Normal 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
|
||||
|
43
cli/test/include/mockcpp/ArgumentsList.h
Normal file
43
cli/test/include/mockcpp/ArgumentsList.h
Normal 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
|
13
cli/test/include/mockcpp/ArgumentsListDef.h
Normal file
13
cli/test/include/mockcpp/ArgumentsListDef.h
Normal 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
|
1
cli/test/include/mockcpp/ArgumentsListDef.h.rule
Normal file
1
cli/test/include/mockcpp/ArgumentsListDef.h.rule
Normal file
@@ -0,0 +1 @@
|
||||
Artificial dependency for a custom command.
|
67
cli/test/include/mockcpp/ArgumentsMacroHelpers.h
Normal file
67
cli/test/include/mockcpp/ArgumentsMacroHelpers.h
Normal 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
|
||||
|
77
cli/test/include/mockcpp/ArgumentsMatchBuilder.h
Normal file
77
cli/test/include/mockcpp/ArgumentsMatchBuilder.h
Normal 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
|
||||
|
87
cli/test/include/mockcpp/ArgumentsMatchBuilder.tcc
Normal file
87
cli/test/include/mockcpp/ArgumentsMatchBuilder.tcc
Normal 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
|
||||
|
||||
|
61
cli/test/include/mockcpp/Asserter.h
Normal file
61
cli/test/include/mockcpp/Asserter.h
Normal 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
|
||||
|
45
cli/test/include/mockcpp/AssertionFailedError.h
Normal file
45
cli/test/include/mockcpp/AssertionFailedError.h
Normal 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
|
||||
|
59
cli/test/include/mockcpp/BeforeMatchBuilder.h
Normal file
59
cli/test/include/mockcpp/BeforeMatchBuilder.h
Normal 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
|
||||
|
59
cli/test/include/mockcpp/BeforeMatchBuilder.tcc
Normal file
59
cli/test/include/mockcpp/BeforeMatchBuilder.tcc
Normal 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
|
||||
|
||||
|
56
cli/test/include/mockcpp/BeforeMatcher.h
Normal file
56
cli/test/include/mockcpp/BeforeMatcher.h
Normal 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
|
||||
|
48
cli/test/include/mockcpp/CallerMatchBuilder.h
Normal file
48
cli/test/include/mockcpp/CallerMatchBuilder.h
Normal 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
|
37
cli/test/include/mockcpp/CallerMatchBuilder.tcc
Normal file
37
cli/test/include/mockcpp/CallerMatchBuilder.tcc
Normal 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
|
45
cli/test/include/mockcpp/CallerMatcher.h
Normal file
45
cli/test/include/mockcpp/CallerMatcher.h
Normal 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
|
133
cli/test/include/mockcpp/ChainableMockMethod.h
Normal file
133
cli/test/include/mockcpp/ChainableMockMethod.h
Normal 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
|
||||
|
54
cli/test/include/mockcpp/ChainableMockMethodContainer.h
Normal file
54
cli/test/include/mockcpp/ChainableMockMethodContainer.h
Normal 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
|
||||
|
89
cli/test/include/mockcpp/ChainableMockMethodCore.h
Normal file
89
cli/test/include/mockcpp/ChainableMockMethodCore.h
Normal 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
|
||||
|
46
cli/test/include/mockcpp/ChainableMockMethodIndexKey.h
Normal file
46
cli/test/include/mockcpp/ChainableMockMethodIndexKey.h
Normal 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
|
||||
|
36
cli/test/include/mockcpp/ChainableMockMethodKey.h
Normal file
36
cli/test/include/mockcpp/ChainableMockMethodKey.h
Normal 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
|
||||
|
46
cli/test/include/mockcpp/ChainableMockMethodNameKey.h
Normal file
46
cli/test/include/mockcpp/ChainableMockMethodNameKey.h
Normal 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
|
||||
|
69
cli/test/include/mockcpp/ChainableMockObject.h
Normal file
69
cli/test/include/mockcpp/ChainableMockObject.h
Normal 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
|
||||
|
75
cli/test/include/mockcpp/ChainableMockObjectBase.h
Normal file
75
cli/test/include/mockcpp/ChainableMockObjectBase.h
Normal 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
|
||||
|
254
cli/test/include/mockcpp/ChainingMockHelper.h
Normal file
254
cli/test/include/mockcpp/ChainingMockHelper.h
Normal 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
|
||||
|
56
cli/test/include/mockcpp/CheckWith.h
Normal file
56
cli/test/include/mockcpp/CheckWith.h
Normal 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
|
35
cli/test/include/mockcpp/CodeModifier.h
Normal file
35
cli/test/include/mockcpp/CodeModifier.h
Normal 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
|
40
cli/test/include/mockcpp/Constraint.h
Normal file
40
cli/test/include/mockcpp/Constraint.h
Normal 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
|
||||
|
64
cli/test/include/mockcpp/ConstraintSet.h
Normal file
64
cli/test/include/mockcpp/ConstraintSet.h
Normal 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
|
||||
|
57
cli/test/include/mockcpp/DecoratedConstraint.h
Normal file
57
cli/test/include/mockcpp/DecoratedConstraint.h
Normal 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
|
||||
|
47
cli/test/include/mockcpp/DefaultBuilder.h
Normal file
47
cli/test/include/mockcpp/DefaultBuilder.h
Normal 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
|
||||
|
40
cli/test/include/mockcpp/DefaultMatcher.h
Normal file
40
cli/test/include/mockcpp/DefaultMatcher.h
Normal 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
|
||||
|
500
cli/test/include/mockcpp/DefaultMethodAddrGetterDef.h
Normal file
500
cli/test/include/mockcpp/DefaultMethodAddrGetterDef.h
Normal 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);
|
@@ -0,0 +1 @@
|
||||
Artificial dependency for a custom command.
|
48
cli/test/include/mockcpp/DefaultStub.h
Normal file
48
cli/test/include/mockcpp/DefaultStub.h
Normal 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
|
||||
|
76
cli/test/include/mockcpp/DelegatedMethod.h
Normal file
76
cli/test/include/mockcpp/DelegatedMethod.h
Normal 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
|
||||
|
26
cli/test/include/mockcpp/DelegatedMethodDef.h
Normal file
26
cli/test/include/mockcpp/DelegatedMethodDef.h
Normal 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);
|
1
cli/test/include/mockcpp/DelegatedMethodDef.h.rule
Normal file
1
cli/test/include/mockcpp/DelegatedMethodDef.h.rule
Normal file
@@ -0,0 +1 @@
|
||||
Artificial dependency for a custom command.
|
5
cli/test/include/mockcpp/DelegatedMethodGetByVptrDef.h
Normal file
5
cli/test/include/mockcpp/DelegatedMethodGetByVptrDef.h
Normal 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)
|
@@ -0,0 +1 @@
|
||||
Artificial dependency for a custom command.
|
100
cli/test/include/mockcpp/DelegatedMethodGetDef.h
Normal file
100
cli/test/include/mockcpp/DelegatedMethodGetDef.h
Normal 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)
|
1
cli/test/include/mockcpp/DelegatedMethodGetDef.h.rule
Normal file
1
cli/test/include/mockcpp/DelegatedMethodGetDef.h.rule
Normal file
@@ -0,0 +1 @@
|
||||
Artificial dependency for a custom command.
|
84
cli/test/include/mockcpp/DelegatedMethodGetter.h
Normal file
84
cli/test/include/mockcpp/DelegatedMethodGetter.h
Normal 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
|
||||
|
5
cli/test/include/mockcpp/DestructorAddrGetterDef.h
Normal file
5
cli/test/include/mockcpp/DestructorAddrGetterDef.h
Normal 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)
|
1
cli/test/include/mockcpp/DestructorAddrGetterDef.h.rule
Normal file
1
cli/test/include/mockcpp/DestructorAddrGetterDef.h.rule
Normal file
@@ -0,0 +1 @@
|
||||
Artificial dependency for a custom command.
|
58
cli/test/include/mockcpp/DestructorChecker.h
Normal file
58
cli/test/include/mockcpp/DestructorChecker.h
Normal 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
|
||||
|
47
cli/test/include/mockcpp/DieStub.h
Normal file
47
cli/test/include/mockcpp/DieStub.h
Normal 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
|
||||
|
31
cli/test/include/mockcpp/DummyBuilder.h
Normal file
31
cli/test/include/mockcpp/DummyBuilder.h
Normal 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
|
||||
|
43
cli/test/include/mockcpp/EqualityUtil.h
Normal file
43
cli/test/include/mockcpp/EqualityUtil.h
Normal 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
|
||||
|
56
cli/test/include/mockcpp/Exception.h
Normal file
56
cli/test/include/mockcpp/Exception.h
Normal 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
|
||||
|
48
cli/test/include/mockcpp/ExpectsMatcher.h
Normal file
48
cli/test/include/mockcpp/ExpectsMatcher.h
Normal 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
|
||||
|
92
cli/test/include/mockcpp/Formatter.h
Normal file
92
cli/test/include/mockcpp/Formatter.h
Normal 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
|
||||
|
124
cli/test/include/mockcpp/Functor.h
Normal file
124
cli/test/include/mockcpp/Functor.h
Normal 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
|
||||
|
65
cli/test/include/mockcpp/GenericMethodIndicesChecker.h
Normal file
65
cli/test/include/mockcpp/GenericMethodIndicesChecker.h
Normal 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
|
||||
|
65
cli/test/include/mockcpp/GlobalMockObject.h
Normal file
65
cli/test/include/mockcpp/GlobalMockObject.h
Normal 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
|
||||
|
40
cli/test/include/mockcpp/GnuMethodIndicesChecker.h
Normal file
40
cli/test/include/mockcpp/GnuMethodIndicesChecker.h
Normal 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
|
||||
|
105
cli/test/include/mockcpp/GnuMethodInfoReader.h
Normal file
105
cli/test/include/mockcpp/GnuMethodInfoReader.h
Normal 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
|
||||
|
64
cli/test/include/mockcpp/HookMockObject.h
Normal file
64
cli/test/include/mockcpp/HookMockObject.h
Normal 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
Reference in New Issue
Block a user