uia 0.0.5 → 0.0.5.1
Sign up to get free protection for your applications and to get access to all the features.
- data/ChangeLog +5 -1
- data/lib/uia/version.rb +1 -1
- data/uia.gemspec +3 -1
- metadata +1 -48
- data/ext/UiaDll/UiaDll.Test/gmock/include/gmock/gmock-actions.h +0 -1078
- data/ext/UiaDll/UiaDll.Test/gmock/include/gmock/gmock-cardinalities.h +0 -147
- data/ext/UiaDll/UiaDll.Test/gmock/include/gmock/gmock-generated-actions.h +0 -2415
- data/ext/UiaDll/UiaDll.Test/gmock/include/gmock/gmock-generated-actions.h.pump +0 -821
- data/ext/UiaDll/UiaDll.Test/gmock/include/gmock/gmock-generated-function-mockers.h +0 -991
- data/ext/UiaDll/UiaDll.Test/gmock/include/gmock/gmock-generated-function-mockers.h.pump +0 -265
- data/ext/UiaDll/UiaDll.Test/gmock/include/gmock/gmock-generated-matchers.h +0 -2190
- data/ext/UiaDll/UiaDll.Test/gmock/include/gmock/gmock-generated-matchers.h.pump +0 -674
- data/ext/UiaDll/UiaDll.Test/gmock/include/gmock/gmock-generated-nice-strict.h +0 -397
- data/ext/UiaDll/UiaDll.Test/gmock/include/gmock/gmock-generated-nice-strict.h.pump +0 -161
- data/ext/UiaDll/UiaDll.Test/gmock/include/gmock/gmock-matchers.h +0 -3986
- data/ext/UiaDll/UiaDll.Test/gmock/include/gmock/gmock-more-actions.h +0 -233
- data/ext/UiaDll/UiaDll.Test/gmock/include/gmock/gmock-more-matchers.h +0 -58
- data/ext/UiaDll/UiaDll.Test/gmock/include/gmock/gmock-spec-builders.h +0 -1791
- data/ext/UiaDll/UiaDll.Test/gmock/include/gmock/gmock.h +0 -94
- data/ext/UiaDll/UiaDll.Test/gmock/include/gmock/internal/gmock-generated-internal-utils.h +0 -279
- data/ext/UiaDll/UiaDll.Test/gmock/include/gmock/internal/gmock-generated-internal-utils.h.pump +0 -136
- data/ext/UiaDll/UiaDll.Test/gmock/include/gmock/internal/gmock-internal-utils.h +0 -498
- data/ext/UiaDll/UiaDll.Test/gmock/include/gmock/internal/gmock-port.h +0 -78
- data/ext/UiaDll/UiaDll.Test/gmock/lib/gmock.lib +0 -0
- data/ext/UiaDll/UiaDll.Test/gmock/lib/gmockd.lib +0 -0
- data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/gtest-death-test.h +0 -294
- data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/gtest-message.h +0 -250
- data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/gtest-param-test.h +0 -1421
- data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/gtest-param-test.h.pump +0 -487
- data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/gtest-printers.h +0 -855
- data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/gtest-spi.h +0 -232
- data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/gtest-test-part.h +0 -179
- data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/gtest-typed-test.h +0 -259
- data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/gtest.h +0 -2291
- data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/gtest_pred_impl.h +0 -358
- data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/gtest_prod.h +0 -58
- data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/internal/gtest-death-test-internal.h +0 -319
- data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/internal/gtest-filepath.h +0 -206
- data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/internal/gtest-internal.h +0 -1158
- data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/internal/gtest-linked_ptr.h +0 -233
- data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/internal/gtest-param-util-generated.h +0 -5143
- data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/internal/gtest-param-util-generated.h.pump +0 -301
- data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/internal/gtest-param-util.h +0 -619
- data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/internal/gtest-port.h +0 -1947
- data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/internal/gtest-string.h +0 -167
- data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/internal/gtest-tuple.h +0 -1012
- data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/internal/gtest-tuple.h.pump +0 -339
- data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/internal/gtest-type-util.h +0 -3331
- data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/internal/gtest-type-util.h.pump +0 -297
- data/ext/UiaDll/UiaDll.Test/gtest/lib/gtest.lib +0 -0
- data/ext/UiaDll/UiaDll.Test/gtest/lib/gtestd.lib +0 -0
@@ -1,206 +0,0 @@
|
|
1
|
-
// Copyright 2008, Google Inc.
|
2
|
-
// All rights reserved.
|
3
|
-
//
|
4
|
-
// Redistribution and use in source and binary forms, with or without
|
5
|
-
// modification, are permitted provided that the following conditions are
|
6
|
-
// met:
|
7
|
-
//
|
8
|
-
// * Redistributions of source code must retain the above copyright
|
9
|
-
// notice, this list of conditions and the following disclaimer.
|
10
|
-
// * Redistributions in binary form must reproduce the above
|
11
|
-
// copyright notice, this list of conditions and the following disclaimer
|
12
|
-
// in the documentation and/or other materials provided with the
|
13
|
-
// distribution.
|
14
|
-
// * Neither the name of Google Inc. nor the names of its
|
15
|
-
// contributors may be used to endorse or promote products derived from
|
16
|
-
// this software without specific prior written permission.
|
17
|
-
//
|
18
|
-
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
19
|
-
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
20
|
-
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
21
|
-
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
22
|
-
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
23
|
-
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
24
|
-
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
25
|
-
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
26
|
-
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
27
|
-
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
28
|
-
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
29
|
-
//
|
30
|
-
// Author: keith.ray@gmail.com (Keith Ray)
|
31
|
-
//
|
32
|
-
// Google Test filepath utilities
|
33
|
-
//
|
34
|
-
// This header file declares classes and functions used internally by
|
35
|
-
// Google Test. They are subject to change without notice.
|
36
|
-
//
|
37
|
-
// This file is #included in <gtest/internal/gtest-internal.h>.
|
38
|
-
// Do not include this header file separately!
|
39
|
-
|
40
|
-
#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_
|
41
|
-
#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_
|
42
|
-
|
43
|
-
#include "gtest/internal/gtest-string.h"
|
44
|
-
|
45
|
-
namespace testing {
|
46
|
-
namespace internal {
|
47
|
-
|
48
|
-
// FilePath - a class for file and directory pathname manipulation which
|
49
|
-
// handles platform-specific conventions (like the pathname separator).
|
50
|
-
// Used for helper functions for naming files in a directory for xml output.
|
51
|
-
// Except for Set methods, all methods are const or static, which provides an
|
52
|
-
// "immutable value object" -- useful for peace of mind.
|
53
|
-
// A FilePath with a value ending in a path separator ("like/this/") represents
|
54
|
-
// a directory, otherwise it is assumed to represent a file. In either case,
|
55
|
-
// it may or may not represent an actual file or directory in the file system.
|
56
|
-
// Names are NOT checked for syntax correctness -- no checking for illegal
|
57
|
-
// characters, malformed paths, etc.
|
58
|
-
|
59
|
-
class GTEST_API_ FilePath {
|
60
|
-
public:
|
61
|
-
FilePath() : pathname_("") { }
|
62
|
-
FilePath(const FilePath& rhs) : pathname_(rhs.pathname_) { }
|
63
|
-
|
64
|
-
explicit FilePath(const std::string& pathname) : pathname_(pathname) {
|
65
|
-
Normalize();
|
66
|
-
}
|
67
|
-
|
68
|
-
FilePath& operator=(const FilePath& rhs) {
|
69
|
-
Set(rhs);
|
70
|
-
return *this;
|
71
|
-
}
|
72
|
-
|
73
|
-
void Set(const FilePath& rhs) {
|
74
|
-
pathname_ = rhs.pathname_;
|
75
|
-
}
|
76
|
-
|
77
|
-
const std::string& string() const { return pathname_; }
|
78
|
-
const char* c_str() const { return pathname_.c_str(); }
|
79
|
-
|
80
|
-
// Returns the current working directory, or "" if unsuccessful.
|
81
|
-
static FilePath GetCurrentDir();
|
82
|
-
|
83
|
-
// Given directory = "dir", base_name = "test", number = 0,
|
84
|
-
// extension = "xml", returns "dir/test.xml". If number is greater
|
85
|
-
// than zero (e.g., 12), returns "dir/test_12.xml".
|
86
|
-
// On Windows platform, uses \ as the separator rather than /.
|
87
|
-
static FilePath MakeFileName(const FilePath& directory,
|
88
|
-
const FilePath& base_name,
|
89
|
-
int number,
|
90
|
-
const char* extension);
|
91
|
-
|
92
|
-
// Given directory = "dir", relative_path = "test.xml",
|
93
|
-
// returns "dir/test.xml".
|
94
|
-
// On Windows, uses \ as the separator rather than /.
|
95
|
-
static FilePath ConcatPaths(const FilePath& directory,
|
96
|
-
const FilePath& relative_path);
|
97
|
-
|
98
|
-
// Returns a pathname for a file that does not currently exist. The pathname
|
99
|
-
// will be directory/base_name.extension or
|
100
|
-
// directory/base_name_<number>.extension if directory/base_name.extension
|
101
|
-
// already exists. The number will be incremented until a pathname is found
|
102
|
-
// that does not already exist.
|
103
|
-
// Examples: 'dir/foo_test.xml' or 'dir/foo_test_1.xml'.
|
104
|
-
// There could be a race condition if two or more processes are calling this
|
105
|
-
// function at the same time -- they could both pick the same filename.
|
106
|
-
static FilePath GenerateUniqueFileName(const FilePath& directory,
|
107
|
-
const FilePath& base_name,
|
108
|
-
const char* extension);
|
109
|
-
|
110
|
-
// Returns true iff the path is "".
|
111
|
-
bool IsEmpty() const { return pathname_.empty(); }
|
112
|
-
|
113
|
-
// If input name has a trailing separator character, removes it and returns
|
114
|
-
// the name, otherwise return the name string unmodified.
|
115
|
-
// On Windows platform, uses \ as the separator, other platforms use /.
|
116
|
-
FilePath RemoveTrailingPathSeparator() const;
|
117
|
-
|
118
|
-
// Returns a copy of the FilePath with the directory part removed.
|
119
|
-
// Example: FilePath("path/to/file").RemoveDirectoryName() returns
|
120
|
-
// FilePath("file"). If there is no directory part ("just_a_file"), it returns
|
121
|
-
// the FilePath unmodified. If there is no file part ("just_a_dir/") it
|
122
|
-
// returns an empty FilePath ("").
|
123
|
-
// On Windows platform, '\' is the path separator, otherwise it is '/'.
|
124
|
-
FilePath RemoveDirectoryName() const;
|
125
|
-
|
126
|
-
// RemoveFileName returns the directory path with the filename removed.
|
127
|
-
// Example: FilePath("path/to/file").RemoveFileName() returns "path/to/".
|
128
|
-
// If the FilePath is "a_file" or "/a_file", RemoveFileName returns
|
129
|
-
// FilePath("./") or, on Windows, FilePath(".\\"). If the filepath does
|
130
|
-
// not have a file, like "just/a/dir/", it returns the FilePath unmodified.
|
131
|
-
// On Windows platform, '\' is the path separator, otherwise it is '/'.
|
132
|
-
FilePath RemoveFileName() const;
|
133
|
-
|
134
|
-
// Returns a copy of the FilePath with the case-insensitive extension removed.
|
135
|
-
// Example: FilePath("dir/file.exe").RemoveExtension("EXE") returns
|
136
|
-
// FilePath("dir/file"). If a case-insensitive extension is not
|
137
|
-
// found, returns a copy of the original FilePath.
|
138
|
-
FilePath RemoveExtension(const char* extension) const;
|
139
|
-
|
140
|
-
// Creates directories so that path exists. Returns true if successful or if
|
141
|
-
// the directories already exist; returns false if unable to create
|
142
|
-
// directories for any reason. Will also return false if the FilePath does
|
143
|
-
// not represent a directory (that is, it doesn't end with a path separator).
|
144
|
-
bool CreateDirectoriesRecursively() const;
|
145
|
-
|
146
|
-
// Create the directory so that path exists. Returns true if successful or
|
147
|
-
// if the directory already exists; returns false if unable to create the
|
148
|
-
// directory for any reason, including if the parent directory does not
|
149
|
-
// exist. Not named "CreateDirectory" because that's a macro on Windows.
|
150
|
-
bool CreateFolder() const;
|
151
|
-
|
152
|
-
// Returns true if FilePath describes something in the file-system,
|
153
|
-
// either a file, directory, or whatever, and that something exists.
|
154
|
-
bool FileOrDirectoryExists() const;
|
155
|
-
|
156
|
-
// Returns true if pathname describes a directory in the file-system
|
157
|
-
// that exists.
|
158
|
-
bool DirectoryExists() const;
|
159
|
-
|
160
|
-
// Returns true if FilePath ends with a path separator, which indicates that
|
161
|
-
// it is intended to represent a directory. Returns false otherwise.
|
162
|
-
// This does NOT check that a directory (or file) actually exists.
|
163
|
-
bool IsDirectory() const;
|
164
|
-
|
165
|
-
// Returns true if pathname describes a root directory. (Windows has one
|
166
|
-
// root directory per disk drive.)
|
167
|
-
bool IsRootDirectory() const;
|
168
|
-
|
169
|
-
// Returns true if pathname describes an absolute path.
|
170
|
-
bool IsAbsolutePath() const;
|
171
|
-
|
172
|
-
private:
|
173
|
-
// Replaces multiple consecutive separators with a single separator.
|
174
|
-
// For example, "bar///foo" becomes "bar/foo". Does not eliminate other
|
175
|
-
// redundancies that might be in a pathname involving "." or "..".
|
176
|
-
//
|
177
|
-
// A pathname with multiple consecutive separators may occur either through
|
178
|
-
// user error or as a result of some scripts or APIs that generate a pathname
|
179
|
-
// with a trailing separator. On other platforms the same API or script
|
180
|
-
// may NOT generate a pathname with a trailing "/". Then elsewhere that
|
181
|
-
// pathname may have another "/" and pathname components added to it,
|
182
|
-
// without checking for the separator already being there.
|
183
|
-
// The script language and operating system may allow paths like "foo//bar"
|
184
|
-
// but some of the functions in FilePath will not handle that correctly. In
|
185
|
-
// particular, RemoveTrailingPathSeparator() only removes one separator, and
|
186
|
-
// it is called in CreateDirectoriesRecursively() assuming that it will change
|
187
|
-
// a pathname from directory syntax (trailing separator) to filename syntax.
|
188
|
-
//
|
189
|
-
// On Windows this method also replaces the alternate path separator '/' with
|
190
|
-
// the primary path separator '\\', so that for example "bar\\/\\foo" becomes
|
191
|
-
// "bar\\foo".
|
192
|
-
|
193
|
-
void Normalize();
|
194
|
-
|
195
|
-
// Returns a pointer to the last occurence of a valid path separator in
|
196
|
-
// the FilePath. On Windows, for example, both '/' and '\' are valid path
|
197
|
-
// separators. Returns NULL if no path separator was found.
|
198
|
-
const char* FindLastPathSeparator() const;
|
199
|
-
|
200
|
-
std::string pathname_;
|
201
|
-
}; // class FilePath
|
202
|
-
|
203
|
-
} // namespace internal
|
204
|
-
} // namespace testing
|
205
|
-
|
206
|
-
#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_
|
@@ -1,1158 +0,0 @@
|
|
1
|
-
// Copyright 2005, Google Inc.
|
2
|
-
// All rights reserved.
|
3
|
-
//
|
4
|
-
// Redistribution and use in source and binary forms, with or without
|
5
|
-
// modification, are permitted provided that the following conditions are
|
6
|
-
// met:
|
7
|
-
//
|
8
|
-
// * Redistributions of source code must retain the above copyright
|
9
|
-
// notice, this list of conditions and the following disclaimer.
|
10
|
-
// * Redistributions in binary form must reproduce the above
|
11
|
-
// copyright notice, this list of conditions and the following disclaimer
|
12
|
-
// in the documentation and/or other materials provided with the
|
13
|
-
// distribution.
|
14
|
-
// * Neither the name of Google Inc. nor the names of its
|
15
|
-
// contributors may be used to endorse or promote products derived from
|
16
|
-
// this software without specific prior written permission.
|
17
|
-
//
|
18
|
-
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
19
|
-
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
20
|
-
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
21
|
-
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
22
|
-
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
23
|
-
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
24
|
-
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
25
|
-
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
26
|
-
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
27
|
-
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
28
|
-
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
29
|
-
//
|
30
|
-
// Authors: wan@google.com (Zhanyong Wan), eefacm@gmail.com (Sean Mcafee)
|
31
|
-
//
|
32
|
-
// The Google C++ Testing Framework (Google Test)
|
33
|
-
//
|
34
|
-
// This header file declares functions and macros used internally by
|
35
|
-
// Google Test. They are subject to change without notice.
|
36
|
-
|
37
|
-
#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_
|
38
|
-
#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_
|
39
|
-
|
40
|
-
#include "gtest/internal/gtest-port.h"
|
41
|
-
|
42
|
-
#if GTEST_OS_LINUX
|
43
|
-
# include <stdlib.h>
|
44
|
-
# include <sys/types.h>
|
45
|
-
# include <sys/wait.h>
|
46
|
-
# include <unistd.h>
|
47
|
-
#endif // GTEST_OS_LINUX
|
48
|
-
|
49
|
-
#if GTEST_HAS_EXCEPTIONS
|
50
|
-
# include <stdexcept>
|
51
|
-
#endif
|
52
|
-
|
53
|
-
#include <ctype.h>
|
54
|
-
#include <float.h>
|
55
|
-
#include <string.h>
|
56
|
-
#include <iomanip>
|
57
|
-
#include <limits>
|
58
|
-
#include <set>
|
59
|
-
|
60
|
-
#include "gtest/gtest-message.h"
|
61
|
-
#include "gtest/internal/gtest-string.h"
|
62
|
-
#include "gtest/internal/gtest-filepath.h"
|
63
|
-
#include "gtest/internal/gtest-type-util.h"
|
64
|
-
|
65
|
-
// Due to C++ preprocessor weirdness, we need double indirection to
|
66
|
-
// concatenate two tokens when one of them is __LINE__. Writing
|
67
|
-
//
|
68
|
-
// foo ## __LINE__
|
69
|
-
//
|
70
|
-
// will result in the token foo__LINE__, instead of foo followed by
|
71
|
-
// the current line number. For more details, see
|
72
|
-
// http://www.parashift.com/c++-faq-lite/misc-technical-issues.html#faq-39.6
|
73
|
-
#define GTEST_CONCAT_TOKEN_(foo, bar) GTEST_CONCAT_TOKEN_IMPL_(foo, bar)
|
74
|
-
#define GTEST_CONCAT_TOKEN_IMPL_(foo, bar) foo ## bar
|
75
|
-
|
76
|
-
class ProtocolMessage;
|
77
|
-
namespace proto2 { class Message; }
|
78
|
-
|
79
|
-
namespace testing {
|
80
|
-
|
81
|
-
// Forward declarations.
|
82
|
-
|
83
|
-
class AssertionResult; // Result of an assertion.
|
84
|
-
class Message; // Represents a failure message.
|
85
|
-
class Test; // Represents a test.
|
86
|
-
class TestInfo; // Information about a test.
|
87
|
-
class TestPartResult; // Result of a test part.
|
88
|
-
class UnitTest; // A collection of test cases.
|
89
|
-
|
90
|
-
template <typename T>
|
91
|
-
::std::string PrintToString(const T& value);
|
92
|
-
|
93
|
-
namespace internal {
|
94
|
-
|
95
|
-
struct TraceInfo; // Information about a trace point.
|
96
|
-
class ScopedTrace; // Implements scoped trace.
|
97
|
-
class TestInfoImpl; // Opaque implementation of TestInfo
|
98
|
-
class UnitTestImpl; // Opaque implementation of UnitTest
|
99
|
-
|
100
|
-
// How many times InitGoogleTest() has been called.
|
101
|
-
GTEST_API_ extern int g_init_gtest_count;
|
102
|
-
|
103
|
-
// The text used in failure messages to indicate the start of the
|
104
|
-
// stack trace.
|
105
|
-
GTEST_API_ extern const char kStackTraceMarker[];
|
106
|
-
|
107
|
-
// Two overloaded helpers for checking at compile time whether an
|
108
|
-
// expression is a null pointer literal (i.e. NULL or any 0-valued
|
109
|
-
// compile-time integral constant). Their return values have
|
110
|
-
// different sizes, so we can use sizeof() to test which version is
|
111
|
-
// picked by the compiler. These helpers have no implementations, as
|
112
|
-
// we only need their signatures.
|
113
|
-
//
|
114
|
-
// Given IsNullLiteralHelper(x), the compiler will pick the first
|
115
|
-
// version if x can be implicitly converted to Secret*, and pick the
|
116
|
-
// second version otherwise. Since Secret is a secret and incomplete
|
117
|
-
// type, the only expression a user can write that has type Secret* is
|
118
|
-
// a null pointer literal. Therefore, we know that x is a null
|
119
|
-
// pointer literal if and only if the first version is picked by the
|
120
|
-
// compiler.
|
121
|
-
char IsNullLiteralHelper(Secret* p);
|
122
|
-
char (&IsNullLiteralHelper(...))[2]; // NOLINT
|
123
|
-
|
124
|
-
// A compile-time bool constant that is true if and only if x is a
|
125
|
-
// null pointer literal (i.e. NULL or any 0-valued compile-time
|
126
|
-
// integral constant).
|
127
|
-
#ifdef GTEST_ELLIPSIS_NEEDS_POD_
|
128
|
-
// We lose support for NULL detection where the compiler doesn't like
|
129
|
-
// passing non-POD classes through ellipsis (...).
|
130
|
-
# define GTEST_IS_NULL_LITERAL_(x) false
|
131
|
-
#else
|
132
|
-
# define GTEST_IS_NULL_LITERAL_(x) \
|
133
|
-
(sizeof(::testing::internal::IsNullLiteralHelper(x)) == 1)
|
134
|
-
#endif // GTEST_ELLIPSIS_NEEDS_POD_
|
135
|
-
|
136
|
-
// Appends the user-supplied message to the Google-Test-generated message.
|
137
|
-
GTEST_API_ std::string AppendUserMessage(
|
138
|
-
const std::string& gtest_msg, const Message& user_msg);
|
139
|
-
|
140
|
-
#if GTEST_HAS_EXCEPTIONS
|
141
|
-
|
142
|
-
// This exception is thrown by (and only by) a failed Google Test
|
143
|
-
// assertion when GTEST_FLAG(throw_on_failure) is true (if exceptions
|
144
|
-
// are enabled). We derive it from std::runtime_error, which is for
|
145
|
-
// errors presumably detectable only at run time. Since
|
146
|
-
// std::runtime_error inherits from std::exception, many testing
|
147
|
-
// frameworks know how to extract and print the message inside it.
|
148
|
-
class GTEST_API_ GoogleTestFailureException : public ::std::runtime_error {
|
149
|
-
public:
|
150
|
-
explicit GoogleTestFailureException(const TestPartResult& failure);
|
151
|
-
};
|
152
|
-
|
153
|
-
#endif // GTEST_HAS_EXCEPTIONS
|
154
|
-
|
155
|
-
// A helper class for creating scoped traces in user programs.
|
156
|
-
class GTEST_API_ ScopedTrace {
|
157
|
-
public:
|
158
|
-
// The c'tor pushes the given source file location and message onto
|
159
|
-
// a trace stack maintained by Google Test.
|
160
|
-
ScopedTrace(const char* file, int line, const Message& message);
|
161
|
-
|
162
|
-
// The d'tor pops the info pushed by the c'tor.
|
163
|
-
//
|
164
|
-
// Note that the d'tor is not virtual in order to be efficient.
|
165
|
-
// Don't inherit from ScopedTrace!
|
166
|
-
~ScopedTrace();
|
167
|
-
|
168
|
-
private:
|
169
|
-
GTEST_DISALLOW_COPY_AND_ASSIGN_(ScopedTrace);
|
170
|
-
} GTEST_ATTRIBUTE_UNUSED_; // A ScopedTrace object does its job in its
|
171
|
-
// c'tor and d'tor. Therefore it doesn't
|
172
|
-
// need to be used otherwise.
|
173
|
-
|
174
|
-
// Constructs and returns the message for an equality assertion
|
175
|
-
// (e.g. ASSERT_EQ, EXPECT_STREQ, etc) failure.
|
176
|
-
//
|
177
|
-
// The first four parameters are the expressions used in the assertion
|
178
|
-
// and their values, as strings. For example, for ASSERT_EQ(foo, bar)
|
179
|
-
// where foo is 5 and bar is 6, we have:
|
180
|
-
//
|
181
|
-
// expected_expression: "foo"
|
182
|
-
// actual_expression: "bar"
|
183
|
-
// expected_value: "5"
|
184
|
-
// actual_value: "6"
|
185
|
-
//
|
186
|
-
// The ignoring_case parameter is true iff the assertion is a
|
187
|
-
// *_STRCASEEQ*. When it's true, the string " (ignoring case)" will
|
188
|
-
// be inserted into the message.
|
189
|
-
GTEST_API_ AssertionResult EqFailure(const char* expected_expression,
|
190
|
-
const char* actual_expression,
|
191
|
-
const std::string& expected_value,
|
192
|
-
const std::string& actual_value,
|
193
|
-
bool ignoring_case);
|
194
|
-
|
195
|
-
// Constructs a failure message for Boolean assertions such as EXPECT_TRUE.
|
196
|
-
GTEST_API_ std::string GetBoolAssertionFailureMessage(
|
197
|
-
const AssertionResult& assertion_result,
|
198
|
-
const char* expression_text,
|
199
|
-
const char* actual_predicate_value,
|
200
|
-
const char* expected_predicate_value);
|
201
|
-
|
202
|
-
// This template class represents an IEEE floating-point number
|
203
|
-
// (either single-precision or double-precision, depending on the
|
204
|
-
// template parameters).
|
205
|
-
//
|
206
|
-
// The purpose of this class is to do more sophisticated number
|
207
|
-
// comparison. (Due to round-off error, etc, it's very unlikely that
|
208
|
-
// two floating-points will be equal exactly. Hence a naive
|
209
|
-
// comparison by the == operation often doesn't work.)
|
210
|
-
//
|
211
|
-
// Format of IEEE floating-point:
|
212
|
-
//
|
213
|
-
// The most-significant bit being the leftmost, an IEEE
|
214
|
-
// floating-point looks like
|
215
|
-
//
|
216
|
-
// sign_bit exponent_bits fraction_bits
|
217
|
-
//
|
218
|
-
// Here, sign_bit is a single bit that designates the sign of the
|
219
|
-
// number.
|
220
|
-
//
|
221
|
-
// For float, there are 8 exponent bits and 23 fraction bits.
|
222
|
-
//
|
223
|
-
// For double, there are 11 exponent bits and 52 fraction bits.
|
224
|
-
//
|
225
|
-
// More details can be found at
|
226
|
-
// http://en.wikipedia.org/wiki/IEEE_floating-point_standard.
|
227
|
-
//
|
228
|
-
// Template parameter:
|
229
|
-
//
|
230
|
-
// RawType: the raw floating-point type (either float or double)
|
231
|
-
template <typename RawType>
|
232
|
-
class FloatingPoint {
|
233
|
-
public:
|
234
|
-
// Defines the unsigned integer type that has the same size as the
|
235
|
-
// floating point number.
|
236
|
-
typedef typename TypeWithSize<sizeof(RawType)>::UInt Bits;
|
237
|
-
|
238
|
-
// Constants.
|
239
|
-
|
240
|
-
// # of bits in a number.
|
241
|
-
static const size_t kBitCount = 8*sizeof(RawType);
|
242
|
-
|
243
|
-
// # of fraction bits in a number.
|
244
|
-
static const size_t kFractionBitCount =
|
245
|
-
std::numeric_limits<RawType>::digits - 1;
|
246
|
-
|
247
|
-
// # of exponent bits in a number.
|
248
|
-
static const size_t kExponentBitCount = kBitCount - 1 - kFractionBitCount;
|
249
|
-
|
250
|
-
// The mask for the sign bit.
|
251
|
-
static const Bits kSignBitMask = static_cast<Bits>(1) << (kBitCount - 1);
|
252
|
-
|
253
|
-
// The mask for the fraction bits.
|
254
|
-
static const Bits kFractionBitMask =
|
255
|
-
~static_cast<Bits>(0) >> (kExponentBitCount + 1);
|
256
|
-
|
257
|
-
// The mask for the exponent bits.
|
258
|
-
static const Bits kExponentBitMask = ~(kSignBitMask | kFractionBitMask);
|
259
|
-
|
260
|
-
// How many ULP's (Units in the Last Place) we want to tolerate when
|
261
|
-
// comparing two numbers. The larger the value, the more error we
|
262
|
-
// allow. A 0 value means that two numbers must be exactly the same
|
263
|
-
// to be considered equal.
|
264
|
-
//
|
265
|
-
// The maximum error of a single floating-point operation is 0.5
|
266
|
-
// units in the last place. On Intel CPU's, all floating-point
|
267
|
-
// calculations are done with 80-bit precision, while double has 64
|
268
|
-
// bits. Therefore, 4 should be enough for ordinary use.
|
269
|
-
//
|
270
|
-
// See the following article for more details on ULP:
|
271
|
-
// http://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/
|
272
|
-
static const size_t kMaxUlps = 4;
|
273
|
-
|
274
|
-
// Constructs a FloatingPoint from a raw floating-point number.
|
275
|
-
//
|
276
|
-
// On an Intel CPU, passing a non-normalized NAN (Not a Number)
|
277
|
-
// around may change its bits, although the new value is guaranteed
|
278
|
-
// to be also a NAN. Therefore, don't expect this constructor to
|
279
|
-
// preserve the bits in x when x is a NAN.
|
280
|
-
explicit FloatingPoint(const RawType& x) { u_.value_ = x; }
|
281
|
-
|
282
|
-
// Static methods
|
283
|
-
|
284
|
-
// Reinterprets a bit pattern as a floating-point number.
|
285
|
-
//
|
286
|
-
// This function is needed to test the AlmostEquals() method.
|
287
|
-
static RawType ReinterpretBits(const Bits bits) {
|
288
|
-
FloatingPoint fp(0);
|
289
|
-
fp.u_.bits_ = bits;
|
290
|
-
return fp.u_.value_;
|
291
|
-
}
|
292
|
-
|
293
|
-
// Returns the floating-point number that represent positive infinity.
|
294
|
-
static RawType Infinity() {
|
295
|
-
return ReinterpretBits(kExponentBitMask);
|
296
|
-
}
|
297
|
-
|
298
|
-
// Returns the maximum representable finite floating-point number.
|
299
|
-
static RawType Max();
|
300
|
-
|
301
|
-
// Non-static methods
|
302
|
-
|
303
|
-
// Returns the bits that represents this number.
|
304
|
-
const Bits &bits() const { return u_.bits_; }
|
305
|
-
|
306
|
-
// Returns the exponent bits of this number.
|
307
|
-
Bits exponent_bits() const { return kExponentBitMask & u_.bits_; }
|
308
|
-
|
309
|
-
// Returns the fraction bits of this number.
|
310
|
-
Bits fraction_bits() const { return kFractionBitMask & u_.bits_; }
|
311
|
-
|
312
|
-
// Returns the sign bit of this number.
|
313
|
-
Bits sign_bit() const { return kSignBitMask & u_.bits_; }
|
314
|
-
|
315
|
-
// Returns true iff this is NAN (not a number).
|
316
|
-
bool is_nan() const {
|
317
|
-
// It's a NAN if the exponent bits are all ones and the fraction
|
318
|
-
// bits are not entirely zeros.
|
319
|
-
return (exponent_bits() == kExponentBitMask) && (fraction_bits() != 0);
|
320
|
-
}
|
321
|
-
|
322
|
-
// Returns true iff this number is at most kMaxUlps ULP's away from
|
323
|
-
// rhs. In particular, this function:
|
324
|
-
//
|
325
|
-
// - returns false if either number is (or both are) NAN.
|
326
|
-
// - treats really large numbers as almost equal to infinity.
|
327
|
-
// - thinks +0.0 and -0.0 are 0 DLP's apart.
|
328
|
-
bool AlmostEquals(const FloatingPoint& rhs) const {
|
329
|
-
// The IEEE standard says that any comparison operation involving
|
330
|
-
// a NAN must return false.
|
331
|
-
if (is_nan() || rhs.is_nan()) return false;
|
332
|
-
|
333
|
-
return DistanceBetweenSignAndMagnitudeNumbers(u_.bits_, rhs.u_.bits_)
|
334
|
-
<= kMaxUlps;
|
335
|
-
}
|
336
|
-
|
337
|
-
private:
|
338
|
-
// The data type used to store the actual floating-point number.
|
339
|
-
union FloatingPointUnion {
|
340
|
-
RawType value_; // The raw floating-point number.
|
341
|
-
Bits bits_; // The bits that represent the number.
|
342
|
-
};
|
343
|
-
|
344
|
-
// Converts an integer from the sign-and-magnitude representation to
|
345
|
-
// the biased representation. More precisely, let N be 2 to the
|
346
|
-
// power of (kBitCount - 1), an integer x is represented by the
|
347
|
-
// unsigned number x + N.
|
348
|
-
//
|
349
|
-
// For instance,
|
350
|
-
//
|
351
|
-
// -N + 1 (the most negative number representable using
|
352
|
-
// sign-and-magnitude) is represented by 1;
|
353
|
-
// 0 is represented by N; and
|
354
|
-
// N - 1 (the biggest number representable using
|
355
|
-
// sign-and-magnitude) is represented by 2N - 1.
|
356
|
-
//
|
357
|
-
// Read http://en.wikipedia.org/wiki/Signed_number_representations
|
358
|
-
// for more details on signed number representations.
|
359
|
-
static Bits SignAndMagnitudeToBiased(const Bits &sam) {
|
360
|
-
if (kSignBitMask & sam) {
|
361
|
-
// sam represents a negative number.
|
362
|
-
return ~sam + 1;
|
363
|
-
} else {
|
364
|
-
// sam represents a positive number.
|
365
|
-
return kSignBitMask | sam;
|
366
|
-
}
|
367
|
-
}
|
368
|
-
|
369
|
-
// Given two numbers in the sign-and-magnitude representation,
|
370
|
-
// returns the distance between them as an unsigned number.
|
371
|
-
static Bits DistanceBetweenSignAndMagnitudeNumbers(const Bits &sam1,
|
372
|
-
const Bits &sam2) {
|
373
|
-
const Bits biased1 = SignAndMagnitudeToBiased(sam1);
|
374
|
-
const Bits biased2 = SignAndMagnitudeToBiased(sam2);
|
375
|
-
return (biased1 >= biased2) ? (biased1 - biased2) : (biased2 - biased1);
|
376
|
-
}
|
377
|
-
|
378
|
-
FloatingPointUnion u_;
|
379
|
-
};
|
380
|
-
|
381
|
-
// We cannot use std::numeric_limits<T>::max() as it clashes with the max()
|
382
|
-
// macro defined by <windows.h>.
|
383
|
-
template <>
|
384
|
-
inline float FloatingPoint<float>::Max() { return FLT_MAX; }
|
385
|
-
template <>
|
386
|
-
inline double FloatingPoint<double>::Max() { return DBL_MAX; }
|
387
|
-
|
388
|
-
// Typedefs the instances of the FloatingPoint template class that we
|
389
|
-
// care to use.
|
390
|
-
typedef FloatingPoint<float> Float;
|
391
|
-
typedef FloatingPoint<double> Double;
|
392
|
-
|
393
|
-
// In order to catch the mistake of putting tests that use different
|
394
|
-
// test fixture classes in the same test case, we need to assign
|
395
|
-
// unique IDs to fixture classes and compare them. The TypeId type is
|
396
|
-
// used to hold such IDs. The user should treat TypeId as an opaque
|
397
|
-
// type: the only operation allowed on TypeId values is to compare
|
398
|
-
// them for equality using the == operator.
|
399
|
-
typedef const void* TypeId;
|
400
|
-
|
401
|
-
template <typename T>
|
402
|
-
class TypeIdHelper {
|
403
|
-
public:
|
404
|
-
// dummy_ must not have a const type. Otherwise an overly eager
|
405
|
-
// compiler (e.g. MSVC 7.1 & 8.0) may try to merge
|
406
|
-
// TypeIdHelper<T>::dummy_ for different Ts as an "optimization".
|
407
|
-
static bool dummy_;
|
408
|
-
};
|
409
|
-
|
410
|
-
template <typename T>
|
411
|
-
bool TypeIdHelper<T>::dummy_ = false;
|
412
|
-
|
413
|
-
// GetTypeId<T>() returns the ID of type T. Different values will be
|
414
|
-
// returned for different types. Calling the function twice with the
|
415
|
-
// same type argument is guaranteed to return the same ID.
|
416
|
-
template <typename T>
|
417
|
-
TypeId GetTypeId() {
|
418
|
-
// The compiler is required to allocate a different
|
419
|
-
// TypeIdHelper<T>::dummy_ variable for each T used to instantiate
|
420
|
-
// the template. Therefore, the address of dummy_ is guaranteed to
|
421
|
-
// be unique.
|
422
|
-
return &(TypeIdHelper<T>::dummy_);
|
423
|
-
}
|
424
|
-
|
425
|
-
// Returns the type ID of ::testing::Test. Always call this instead
|
426
|
-
// of GetTypeId< ::testing::Test>() to get the type ID of
|
427
|
-
// ::testing::Test, as the latter may give the wrong result due to a
|
428
|
-
// suspected linker bug when compiling Google Test as a Mac OS X
|
429
|
-
// framework.
|
430
|
-
GTEST_API_ TypeId GetTestTypeId();
|
431
|
-
|
432
|
-
// Defines the abstract factory interface that creates instances
|
433
|
-
// of a Test object.
|
434
|
-
class TestFactoryBase {
|
435
|
-
public:
|
436
|
-
virtual ~TestFactoryBase() {}
|
437
|
-
|
438
|
-
// Creates a test instance to run. The instance is both created and destroyed
|
439
|
-
// within TestInfoImpl::Run()
|
440
|
-
virtual Test* CreateTest() = 0;
|
441
|
-
|
442
|
-
protected:
|
443
|
-
TestFactoryBase() {}
|
444
|
-
|
445
|
-
private:
|
446
|
-
GTEST_DISALLOW_COPY_AND_ASSIGN_(TestFactoryBase);
|
447
|
-
};
|
448
|
-
|
449
|
-
// This class provides implementation of TeastFactoryBase interface.
|
450
|
-
// It is used in TEST and TEST_F macros.
|
451
|
-
template <class TestClass>
|
452
|
-
class TestFactoryImpl : public TestFactoryBase {
|
453
|
-
public:
|
454
|
-
virtual Test* CreateTest() { return new TestClass; }
|
455
|
-
};
|
456
|
-
|
457
|
-
#if GTEST_OS_WINDOWS
|
458
|
-
|
459
|
-
// Predicate-formatters for implementing the HRESULT checking macros
|
460
|
-
// {ASSERT|EXPECT}_HRESULT_{SUCCEEDED|FAILED}
|
461
|
-
// We pass a long instead of HRESULT to avoid causing an
|
462
|
-
// include dependency for the HRESULT type.
|
463
|
-
GTEST_API_ AssertionResult IsHRESULTSuccess(const char* expr,
|
464
|
-
long hr); // NOLINT
|
465
|
-
GTEST_API_ AssertionResult IsHRESULTFailure(const char* expr,
|
466
|
-
long hr); // NOLINT
|
467
|
-
|
468
|
-
#endif // GTEST_OS_WINDOWS
|
469
|
-
|
470
|
-
// Types of SetUpTestCase() and TearDownTestCase() functions.
|
471
|
-
typedef void (*SetUpTestCaseFunc)();
|
472
|
-
typedef void (*TearDownTestCaseFunc)();
|
473
|
-
|
474
|
-
// Creates a new TestInfo object and registers it with Google Test;
|
475
|
-
// returns the created object.
|
476
|
-
//
|
477
|
-
// Arguments:
|
478
|
-
//
|
479
|
-
// test_case_name: name of the test case
|
480
|
-
// name: name of the test
|
481
|
-
// type_param the name of the test's type parameter, or NULL if
|
482
|
-
// this is not a typed or a type-parameterized test.
|
483
|
-
// value_param text representation of the test's value parameter,
|
484
|
-
// or NULL if this is not a type-parameterized test.
|
485
|
-
// fixture_class_id: ID of the test fixture class
|
486
|
-
// set_up_tc: pointer to the function that sets up the test case
|
487
|
-
// tear_down_tc: pointer to the function that tears down the test case
|
488
|
-
// factory: pointer to the factory that creates a test object.
|
489
|
-
// The newly created TestInfo instance will assume
|
490
|
-
// ownership of the factory object.
|
491
|
-
GTEST_API_ TestInfo* MakeAndRegisterTestInfo(
|
492
|
-
const char* test_case_name,
|
493
|
-
const char* name,
|
494
|
-
const char* type_param,
|
495
|
-
const char* value_param,
|
496
|
-
TypeId fixture_class_id,
|
497
|
-
SetUpTestCaseFunc set_up_tc,
|
498
|
-
TearDownTestCaseFunc tear_down_tc,
|
499
|
-
TestFactoryBase* factory);
|
500
|
-
|
501
|
-
// If *pstr starts with the given prefix, modifies *pstr to be right
|
502
|
-
// past the prefix and returns true; otherwise leaves *pstr unchanged
|
503
|
-
// and returns false. None of pstr, *pstr, and prefix can be NULL.
|
504
|
-
GTEST_API_ bool SkipPrefix(const char* prefix, const char** pstr);
|
505
|
-
|
506
|
-
#if GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
|
507
|
-
|
508
|
-
// State of the definition of a type-parameterized test case.
|
509
|
-
class GTEST_API_ TypedTestCasePState {
|
510
|
-
public:
|
511
|
-
TypedTestCasePState() : registered_(false) {}
|
512
|
-
|
513
|
-
// Adds the given test name to defined_test_names_ and return true
|
514
|
-
// if the test case hasn't been registered; otherwise aborts the
|
515
|
-
// program.
|
516
|
-
bool AddTestName(const char* file, int line, const char* case_name,
|
517
|
-
const char* test_name) {
|
518
|
-
if (registered_) {
|
519
|
-
fprintf(stderr, "%s Test %s must be defined before "
|
520
|
-
"REGISTER_TYPED_TEST_CASE_P(%s, ...).\n",
|
521
|
-
FormatFileLocation(file, line).c_str(), test_name, case_name);
|
522
|
-
fflush(stderr);
|
523
|
-
posix::Abort();
|
524
|
-
}
|
525
|
-
defined_test_names_.insert(test_name);
|
526
|
-
return true;
|
527
|
-
}
|
528
|
-
|
529
|
-
// Verifies that registered_tests match the test names in
|
530
|
-
// defined_test_names_; returns registered_tests if successful, or
|
531
|
-
// aborts the program otherwise.
|
532
|
-
const char* VerifyRegisteredTestNames(
|
533
|
-
const char* file, int line, const char* registered_tests);
|
534
|
-
|
535
|
-
private:
|
536
|
-
bool registered_;
|
537
|
-
::std::set<const char*> defined_test_names_;
|
538
|
-
};
|
539
|
-
|
540
|
-
// Skips to the first non-space char after the first comma in 'str';
|
541
|
-
// returns NULL if no comma is found in 'str'.
|
542
|
-
inline const char* SkipComma(const char* str) {
|
543
|
-
const char* comma = strchr(str, ',');
|
544
|
-
if (comma == NULL) {
|
545
|
-
return NULL;
|
546
|
-
}
|
547
|
-
while (IsSpace(*(++comma))) {}
|
548
|
-
return comma;
|
549
|
-
}
|
550
|
-
|
551
|
-
// Returns the prefix of 'str' before the first comma in it; returns
|
552
|
-
// the entire string if it contains no comma.
|
553
|
-
inline std::string GetPrefixUntilComma(const char* str) {
|
554
|
-
const char* comma = strchr(str, ',');
|
555
|
-
return comma == NULL ? str : std::string(str, comma);
|
556
|
-
}
|
557
|
-
|
558
|
-
// TypeParameterizedTest<Fixture, TestSel, Types>::Register()
|
559
|
-
// registers a list of type-parameterized tests with Google Test. The
|
560
|
-
// return value is insignificant - we just need to return something
|
561
|
-
// such that we can call this function in a namespace scope.
|
562
|
-
//
|
563
|
-
// Implementation note: The GTEST_TEMPLATE_ macro declares a template
|
564
|
-
// template parameter. It's defined in gtest-type-util.h.
|
565
|
-
template <GTEST_TEMPLATE_ Fixture, class TestSel, typename Types>
|
566
|
-
class TypeParameterizedTest {
|
567
|
-
public:
|
568
|
-
// 'index' is the index of the test in the type list 'Types'
|
569
|
-
// specified in INSTANTIATE_TYPED_TEST_CASE_P(Prefix, TestCase,
|
570
|
-
// Types). Valid values for 'index' are [0, N - 1] where N is the
|
571
|
-
// length of Types.
|
572
|
-
static bool Register(const char* prefix, const char* case_name,
|
573
|
-
const char* test_names, int index) {
|
574
|
-
typedef typename Types::Head Type;
|
575
|
-
typedef Fixture<Type> FixtureClass;
|
576
|
-
typedef typename GTEST_BIND_(TestSel, Type) TestClass;
|
577
|
-
|
578
|
-
// First, registers the first type-parameterized test in the type
|
579
|
-
// list.
|
580
|
-
MakeAndRegisterTestInfo(
|
581
|
-
(std::string(prefix) + (prefix[0] == '\0' ? "" : "/") + case_name + "/"
|
582
|
-
+ StreamableToString(index)).c_str(),
|
583
|
-
GetPrefixUntilComma(test_names).c_str(),
|
584
|
-
GetTypeName<Type>().c_str(),
|
585
|
-
NULL, // No value parameter.
|
586
|
-
GetTypeId<FixtureClass>(),
|
587
|
-
TestClass::SetUpTestCase,
|
588
|
-
TestClass::TearDownTestCase,
|
589
|
-
new TestFactoryImpl<TestClass>);
|
590
|
-
|
591
|
-
// Next, recurses (at compile time) with the tail of the type list.
|
592
|
-
return TypeParameterizedTest<Fixture, TestSel, typename Types::Tail>
|
593
|
-
::Register(prefix, case_name, test_names, index + 1);
|
594
|
-
}
|
595
|
-
};
|
596
|
-
|
597
|
-
// The base case for the compile time recursion.
|
598
|
-
template <GTEST_TEMPLATE_ Fixture, class TestSel>
|
599
|
-
class TypeParameterizedTest<Fixture, TestSel, Types0> {
|
600
|
-
public:
|
601
|
-
static bool Register(const char* /*prefix*/, const char* /*case_name*/,
|
602
|
-
const char* /*test_names*/, int /*index*/) {
|
603
|
-
return true;
|
604
|
-
}
|
605
|
-
};
|
606
|
-
|
607
|
-
// TypeParameterizedTestCase<Fixture, Tests, Types>::Register()
|
608
|
-
// registers *all combinations* of 'Tests' and 'Types' with Google
|
609
|
-
// Test. The return value is insignificant - we just need to return
|
610
|
-
// something such that we can call this function in a namespace scope.
|
611
|
-
template <GTEST_TEMPLATE_ Fixture, typename Tests, typename Types>
|
612
|
-
class TypeParameterizedTestCase {
|
613
|
-
public:
|
614
|
-
static bool Register(const char* prefix, const char* case_name,
|
615
|
-
const char* test_names) {
|
616
|
-
typedef typename Tests::Head Head;
|
617
|
-
|
618
|
-
// First, register the first test in 'Test' for each type in 'Types'.
|
619
|
-
TypeParameterizedTest<Fixture, Head, Types>::Register(
|
620
|
-
prefix, case_name, test_names, 0);
|
621
|
-
|
622
|
-
// Next, recurses (at compile time) with the tail of the test list.
|
623
|
-
return TypeParameterizedTestCase<Fixture, typename Tests::Tail, Types>
|
624
|
-
::Register(prefix, case_name, SkipComma(test_names));
|
625
|
-
}
|
626
|
-
};
|
627
|
-
|
628
|
-
// The base case for the compile time recursion.
|
629
|
-
template <GTEST_TEMPLATE_ Fixture, typename Types>
|
630
|
-
class TypeParameterizedTestCase<Fixture, Templates0, Types> {
|
631
|
-
public:
|
632
|
-
static bool Register(const char* /*prefix*/, const char* /*case_name*/,
|
633
|
-
const char* /*test_names*/) {
|
634
|
-
return true;
|
635
|
-
}
|
636
|
-
};
|
637
|
-
|
638
|
-
#endif // GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
|
639
|
-
|
640
|
-
// Returns the current OS stack trace as an std::string.
|
641
|
-
//
|
642
|
-
// The maximum number of stack frames to be included is specified by
|
643
|
-
// the gtest_stack_trace_depth flag. The skip_count parameter
|
644
|
-
// specifies the number of top frames to be skipped, which doesn't
|
645
|
-
// count against the number of frames to be included.
|
646
|
-
//
|
647
|
-
// For example, if Foo() calls Bar(), which in turn calls
|
648
|
-
// GetCurrentOsStackTraceExceptTop(..., 1), Foo() will be included in
|
649
|
-
// the trace but Bar() and GetCurrentOsStackTraceExceptTop() won't.
|
650
|
-
GTEST_API_ std::string GetCurrentOsStackTraceExceptTop(
|
651
|
-
UnitTest* unit_test, int skip_count);
|
652
|
-
|
653
|
-
// Helpers for suppressing warnings on unreachable code or constant
|
654
|
-
// condition.
|
655
|
-
|
656
|
-
// Always returns true.
|
657
|
-
GTEST_API_ bool AlwaysTrue();
|
658
|
-
|
659
|
-
// Always returns false.
|
660
|
-
inline bool AlwaysFalse() { return !AlwaysTrue(); }
|
661
|
-
|
662
|
-
// Helper for suppressing false warning from Clang on a const char*
|
663
|
-
// variable declared in a conditional expression always being NULL in
|
664
|
-
// the else branch.
|
665
|
-
struct GTEST_API_ ConstCharPtr {
|
666
|
-
ConstCharPtr(const char* str) : value(str) {}
|
667
|
-
operator bool() const { return true; }
|
668
|
-
const char* value;
|
669
|
-
};
|
670
|
-
|
671
|
-
// A simple Linear Congruential Generator for generating random
|
672
|
-
// numbers with a uniform distribution. Unlike rand() and srand(), it
|
673
|
-
// doesn't use global state (and therefore can't interfere with user
|
674
|
-
// code). Unlike rand_r(), it's portable. An LCG isn't very random,
|
675
|
-
// but it's good enough for our purposes.
|
676
|
-
class GTEST_API_ Random {
|
677
|
-
public:
|
678
|
-
static const UInt32 kMaxRange = 1u << 31;
|
679
|
-
|
680
|
-
explicit Random(UInt32 seed) : state_(seed) {}
|
681
|
-
|
682
|
-
void Reseed(UInt32 seed) { state_ = seed; }
|
683
|
-
|
684
|
-
// Generates a random number from [0, range). Crashes if 'range' is
|
685
|
-
// 0 or greater than kMaxRange.
|
686
|
-
UInt32 Generate(UInt32 range);
|
687
|
-
|
688
|
-
private:
|
689
|
-
UInt32 state_;
|
690
|
-
GTEST_DISALLOW_COPY_AND_ASSIGN_(Random);
|
691
|
-
};
|
692
|
-
|
693
|
-
// Defining a variable of type CompileAssertTypesEqual<T1, T2> will cause a
|
694
|
-
// compiler error iff T1 and T2 are different types.
|
695
|
-
template <typename T1, typename T2>
|
696
|
-
struct CompileAssertTypesEqual;
|
697
|
-
|
698
|
-
template <typename T>
|
699
|
-
struct CompileAssertTypesEqual<T, T> {
|
700
|
-
};
|
701
|
-
|
702
|
-
// Removes the reference from a type if it is a reference type,
|
703
|
-
// otherwise leaves it unchanged. This is the same as
|
704
|
-
// tr1::remove_reference, which is not widely available yet.
|
705
|
-
template <typename T>
|
706
|
-
struct RemoveReference { typedef T type; }; // NOLINT
|
707
|
-
template <typename T>
|
708
|
-
struct RemoveReference<T&> { typedef T type; }; // NOLINT
|
709
|
-
|
710
|
-
// A handy wrapper around RemoveReference that works when the argument
|
711
|
-
// T depends on template parameters.
|
712
|
-
#define GTEST_REMOVE_REFERENCE_(T) \
|
713
|
-
typename ::testing::internal::RemoveReference<T>::type
|
714
|
-
|
715
|
-
// Removes const from a type if it is a const type, otherwise leaves
|
716
|
-
// it unchanged. This is the same as tr1::remove_const, which is not
|
717
|
-
// widely available yet.
|
718
|
-
template <typename T>
|
719
|
-
struct RemoveConst { typedef T type; }; // NOLINT
|
720
|
-
template <typename T>
|
721
|
-
struct RemoveConst<const T> { typedef T type; }; // NOLINT
|
722
|
-
|
723
|
-
// MSVC 8.0, Sun C++, and IBM XL C++ have a bug which causes the above
|
724
|
-
// definition to fail to remove the const in 'const int[3]' and 'const
|
725
|
-
// char[3][4]'. The following specialization works around the bug.
|
726
|
-
template <typename T, size_t N>
|
727
|
-
struct RemoveConst<const T[N]> {
|
728
|
-
typedef typename RemoveConst<T>::type type[N];
|
729
|
-
};
|
730
|
-
|
731
|
-
#if defined(_MSC_VER) && _MSC_VER < 1400
|
732
|
-
// This is the only specialization that allows VC++ 7.1 to remove const in
|
733
|
-
// 'const int[3] and 'const int[3][4]'. However, it causes trouble with GCC
|
734
|
-
// and thus needs to be conditionally compiled.
|
735
|
-
template <typename T, size_t N>
|
736
|
-
struct RemoveConst<T[N]> {
|
737
|
-
typedef typename RemoveConst<T>::type type[N];
|
738
|
-
};
|
739
|
-
#endif
|
740
|
-
|
741
|
-
// A handy wrapper around RemoveConst that works when the argument
|
742
|
-
// T depends on template parameters.
|
743
|
-
#define GTEST_REMOVE_CONST_(T) \
|
744
|
-
typename ::testing::internal::RemoveConst<T>::type
|
745
|
-
|
746
|
-
// Turns const U&, U&, const U, and U all into U.
|
747
|
-
#define GTEST_REMOVE_REFERENCE_AND_CONST_(T) \
|
748
|
-
GTEST_REMOVE_CONST_(GTEST_REMOVE_REFERENCE_(T))
|
749
|
-
|
750
|
-
// Adds reference to a type if it is not a reference type,
|
751
|
-
// otherwise leaves it unchanged. This is the same as
|
752
|
-
// tr1::add_reference, which is not widely available yet.
|
753
|
-
template <typename T>
|
754
|
-
struct AddReference { typedef T& type; }; // NOLINT
|
755
|
-
template <typename T>
|
756
|
-
struct AddReference<T&> { typedef T& type; }; // NOLINT
|
757
|
-
|
758
|
-
// A handy wrapper around AddReference that works when the argument T
|
759
|
-
// depends on template parameters.
|
760
|
-
#define GTEST_ADD_REFERENCE_(T) \
|
761
|
-
typename ::testing::internal::AddReference<T>::type
|
762
|
-
|
763
|
-
// Adds a reference to const on top of T as necessary. For example,
|
764
|
-
// it transforms
|
765
|
-
//
|
766
|
-
// char ==> const char&
|
767
|
-
// const char ==> const char&
|
768
|
-
// char& ==> const char&
|
769
|
-
// const char& ==> const char&
|
770
|
-
//
|
771
|
-
// The argument T must depend on some template parameters.
|
772
|
-
#define GTEST_REFERENCE_TO_CONST_(T) \
|
773
|
-
GTEST_ADD_REFERENCE_(const GTEST_REMOVE_REFERENCE_(T))
|
774
|
-
|
775
|
-
// ImplicitlyConvertible<From, To>::value is a compile-time bool
|
776
|
-
// constant that's true iff type From can be implicitly converted to
|
777
|
-
// type To.
|
778
|
-
template <typename From, typename To>
|
779
|
-
class ImplicitlyConvertible {
|
780
|
-
private:
|
781
|
-
// We need the following helper functions only for their types.
|
782
|
-
// They have no implementations.
|
783
|
-
|
784
|
-
// MakeFrom() is an expression whose type is From. We cannot simply
|
785
|
-
// use From(), as the type From may not have a public default
|
786
|
-
// constructor.
|
787
|
-
static From MakeFrom();
|
788
|
-
|
789
|
-
// These two functions are overloaded. Given an expression
|
790
|
-
// Helper(x), the compiler will pick the first version if x can be
|
791
|
-
// implicitly converted to type To; otherwise it will pick the
|
792
|
-
// second version.
|
793
|
-
//
|
794
|
-
// The first version returns a value of size 1, and the second
|
795
|
-
// version returns a value of size 2. Therefore, by checking the
|
796
|
-
// size of Helper(x), which can be done at compile time, we can tell
|
797
|
-
// which version of Helper() is used, and hence whether x can be
|
798
|
-
// implicitly converted to type To.
|
799
|
-
static char Helper(To);
|
800
|
-
static char (&Helper(...))[2]; // NOLINT
|
801
|
-
|
802
|
-
// We have to put the 'public' section after the 'private' section,
|
803
|
-
// or MSVC refuses to compile the code.
|
804
|
-
public:
|
805
|
-
// MSVC warns about implicitly converting from double to int for
|
806
|
-
// possible loss of data, so we need to temporarily disable the
|
807
|
-
// warning.
|
808
|
-
#ifdef _MSC_VER
|
809
|
-
# pragma warning(push) // Saves the current warning state.
|
810
|
-
# pragma warning(disable:4244) // Temporarily disables warning 4244.
|
811
|
-
|
812
|
-
static const bool value =
|
813
|
-
sizeof(Helper(ImplicitlyConvertible::MakeFrom())) == 1;
|
814
|
-
# pragma warning(pop) // Restores the warning state.
|
815
|
-
#elif defined(__BORLANDC__)
|
816
|
-
// C++Builder cannot use member overload resolution during template
|
817
|
-
// instantiation. The simplest workaround is to use its C++0x type traits
|
818
|
-
// functions (C++Builder 2009 and above only).
|
819
|
-
static const bool value = __is_convertible(From, To);
|
820
|
-
#else
|
821
|
-
static const bool value =
|
822
|
-
sizeof(Helper(ImplicitlyConvertible::MakeFrom())) == 1;
|
823
|
-
#endif // _MSV_VER
|
824
|
-
};
|
825
|
-
template <typename From, typename To>
|
826
|
-
const bool ImplicitlyConvertible<From, To>::value;
|
827
|
-
|
828
|
-
// IsAProtocolMessage<T>::value is a compile-time bool constant that's
|
829
|
-
// true iff T is type ProtocolMessage, proto2::Message, or a subclass
|
830
|
-
// of those.
|
831
|
-
template <typename T>
|
832
|
-
struct IsAProtocolMessage
|
833
|
-
: public bool_constant<
|
834
|
-
ImplicitlyConvertible<const T*, const ::ProtocolMessage*>::value ||
|
835
|
-
ImplicitlyConvertible<const T*, const ::proto2::Message*>::value> {
|
836
|
-
};
|
837
|
-
|
838
|
-
// When the compiler sees expression IsContainerTest<C>(0), if C is an
|
839
|
-
// STL-style container class, the first overload of IsContainerTest
|
840
|
-
// will be viable (since both C::iterator* and C::const_iterator* are
|
841
|
-
// valid types and NULL can be implicitly converted to them). It will
|
842
|
-
// be picked over the second overload as 'int' is a perfect match for
|
843
|
-
// the type of argument 0. If C::iterator or C::const_iterator is not
|
844
|
-
// a valid type, the first overload is not viable, and the second
|
845
|
-
// overload will be picked. Therefore, we can determine whether C is
|
846
|
-
// a container class by checking the type of IsContainerTest<C>(0).
|
847
|
-
// The value of the expression is insignificant.
|
848
|
-
//
|
849
|
-
// Note that we look for both C::iterator and C::const_iterator. The
|
850
|
-
// reason is that C++ injects the name of a class as a member of the
|
851
|
-
// class itself (e.g. you can refer to class iterator as either
|
852
|
-
// 'iterator' or 'iterator::iterator'). If we look for C::iterator
|
853
|
-
// only, for example, we would mistakenly think that a class named
|
854
|
-
// iterator is an STL container.
|
855
|
-
//
|
856
|
-
// Also note that the simpler approach of overloading
|
857
|
-
// IsContainerTest(typename C::const_iterator*) and
|
858
|
-
// IsContainerTest(...) doesn't work with Visual Age C++ and Sun C++.
|
859
|
-
typedef int IsContainer;
|
860
|
-
template <class C>
|
861
|
-
IsContainer IsContainerTest(int /* dummy */,
|
862
|
-
typename C::iterator* /* it */ = NULL,
|
863
|
-
typename C::const_iterator* /* const_it */ = NULL) {
|
864
|
-
return 0;
|
865
|
-
}
|
866
|
-
|
867
|
-
typedef char IsNotContainer;
|
868
|
-
template <class C>
|
869
|
-
IsNotContainer IsContainerTest(long /* dummy */) { return '\0'; }
|
870
|
-
|
871
|
-
// EnableIf<condition>::type is void when 'Cond' is true, and
|
872
|
-
// undefined when 'Cond' is false. To use SFINAE to make a function
|
873
|
-
// overload only apply when a particular expression is true, add
|
874
|
-
// "typename EnableIf<expression>::type* = 0" as the last parameter.
|
875
|
-
template<bool> struct EnableIf;
|
876
|
-
template<> struct EnableIf<true> { typedef void type; }; // NOLINT
|
877
|
-
|
878
|
-
// Utilities for native arrays.
|
879
|
-
|
880
|
-
// ArrayEq() compares two k-dimensional native arrays using the
|
881
|
-
// elements' operator==, where k can be any integer >= 0. When k is
|
882
|
-
// 0, ArrayEq() degenerates into comparing a single pair of values.
|
883
|
-
|
884
|
-
template <typename T, typename U>
|
885
|
-
bool ArrayEq(const T* lhs, size_t size, const U* rhs);
|
886
|
-
|
887
|
-
// This generic version is used when k is 0.
|
888
|
-
template <typename T, typename U>
|
889
|
-
inline bool ArrayEq(const T& lhs, const U& rhs) { return lhs == rhs; }
|
890
|
-
|
891
|
-
// This overload is used when k >= 1.
|
892
|
-
template <typename T, typename U, size_t N>
|
893
|
-
inline bool ArrayEq(const T(&lhs)[N], const U(&rhs)[N]) {
|
894
|
-
return internal::ArrayEq(lhs, N, rhs);
|
895
|
-
}
|
896
|
-
|
897
|
-
// This helper reduces code bloat. If we instead put its logic inside
|
898
|
-
// the previous ArrayEq() function, arrays with different sizes would
|
899
|
-
// lead to different copies of the template code.
|
900
|
-
template <typename T, typename U>
|
901
|
-
bool ArrayEq(const T* lhs, size_t size, const U* rhs) {
|
902
|
-
for (size_t i = 0; i != size; i++) {
|
903
|
-
if (!internal::ArrayEq(lhs[i], rhs[i]))
|
904
|
-
return false;
|
905
|
-
}
|
906
|
-
return true;
|
907
|
-
}
|
908
|
-
|
909
|
-
// Finds the first element in the iterator range [begin, end) that
|
910
|
-
// equals elem. Element may be a native array type itself.
|
911
|
-
template <typename Iter, typename Element>
|
912
|
-
Iter ArrayAwareFind(Iter begin, Iter end, const Element& elem) {
|
913
|
-
for (Iter it = begin; it != end; ++it) {
|
914
|
-
if (internal::ArrayEq(*it, elem))
|
915
|
-
return it;
|
916
|
-
}
|
917
|
-
return end;
|
918
|
-
}
|
919
|
-
|
920
|
-
// CopyArray() copies a k-dimensional native array using the elements'
|
921
|
-
// operator=, where k can be any integer >= 0. When k is 0,
|
922
|
-
// CopyArray() degenerates into copying a single value.
|
923
|
-
|
924
|
-
template <typename T, typename U>
|
925
|
-
void CopyArray(const T* from, size_t size, U* to);
|
926
|
-
|
927
|
-
// This generic version is used when k is 0.
|
928
|
-
template <typename T, typename U>
|
929
|
-
inline void CopyArray(const T& from, U* to) { *to = from; }
|
930
|
-
|
931
|
-
// This overload is used when k >= 1.
|
932
|
-
template <typename T, typename U, size_t N>
|
933
|
-
inline void CopyArray(const T(&from)[N], U(*to)[N]) {
|
934
|
-
internal::CopyArray(from, N, *to);
|
935
|
-
}
|
936
|
-
|
937
|
-
// This helper reduces code bloat. If we instead put its logic inside
|
938
|
-
// the previous CopyArray() function, arrays with different sizes
|
939
|
-
// would lead to different copies of the template code.
|
940
|
-
template <typename T, typename U>
|
941
|
-
void CopyArray(const T* from, size_t size, U* to) {
|
942
|
-
for (size_t i = 0; i != size; i++) {
|
943
|
-
internal::CopyArray(from[i], to + i);
|
944
|
-
}
|
945
|
-
}
|
946
|
-
|
947
|
-
// The relation between an NativeArray object (see below) and the
|
948
|
-
// native array it represents.
|
949
|
-
enum RelationToSource {
|
950
|
-
kReference, // The NativeArray references the native array.
|
951
|
-
kCopy // The NativeArray makes a copy of the native array and
|
952
|
-
// owns the copy.
|
953
|
-
};
|
954
|
-
|
955
|
-
// Adapts a native array to a read-only STL-style container. Instead
|
956
|
-
// of the complete STL container concept, this adaptor only implements
|
957
|
-
// members useful for Google Mock's container matchers. New members
|
958
|
-
// should be added as needed. To simplify the implementation, we only
|
959
|
-
// support Element being a raw type (i.e. having no top-level const or
|
960
|
-
// reference modifier). It's the client's responsibility to satisfy
|
961
|
-
// this requirement. Element can be an array type itself (hence
|
962
|
-
// multi-dimensional arrays are supported).
|
963
|
-
template <typename Element>
|
964
|
-
class NativeArray {
|
965
|
-
public:
|
966
|
-
// STL-style container typedefs.
|
967
|
-
typedef Element value_type;
|
968
|
-
typedef Element* iterator;
|
969
|
-
typedef const Element* const_iterator;
|
970
|
-
|
971
|
-
// Constructs from a native array.
|
972
|
-
NativeArray(const Element* array, size_t count, RelationToSource relation) {
|
973
|
-
Init(array, count, relation);
|
974
|
-
}
|
975
|
-
|
976
|
-
// Copy constructor.
|
977
|
-
NativeArray(const NativeArray& rhs) {
|
978
|
-
Init(rhs.array_, rhs.size_, rhs.relation_to_source_);
|
979
|
-
}
|
980
|
-
|
981
|
-
~NativeArray() {
|
982
|
-
// Ensures that the user doesn't instantiate NativeArray with a
|
983
|
-
// const or reference type.
|
984
|
-
static_cast<void>(StaticAssertTypeEqHelper<Element,
|
985
|
-
GTEST_REMOVE_REFERENCE_AND_CONST_(Element)>());
|
986
|
-
if (relation_to_source_ == kCopy)
|
987
|
-
delete[] array_;
|
988
|
-
}
|
989
|
-
|
990
|
-
// STL-style container methods.
|
991
|
-
size_t size() const { return size_; }
|
992
|
-
const_iterator begin() const { return array_; }
|
993
|
-
const_iterator end() const { return array_ + size_; }
|
994
|
-
bool operator==(const NativeArray& rhs) const {
|
995
|
-
return size() == rhs.size() &&
|
996
|
-
ArrayEq(begin(), size(), rhs.begin());
|
997
|
-
}
|
998
|
-
|
999
|
-
private:
|
1000
|
-
// Initializes this object; makes a copy of the input array if
|
1001
|
-
// 'relation' is kCopy.
|
1002
|
-
void Init(const Element* array, size_t a_size, RelationToSource relation) {
|
1003
|
-
if (relation == kReference) {
|
1004
|
-
array_ = array;
|
1005
|
-
} else {
|
1006
|
-
Element* const copy = new Element[a_size];
|
1007
|
-
CopyArray(array, a_size, copy);
|
1008
|
-
array_ = copy;
|
1009
|
-
}
|
1010
|
-
size_ = a_size;
|
1011
|
-
relation_to_source_ = relation;
|
1012
|
-
}
|
1013
|
-
|
1014
|
-
const Element* array_;
|
1015
|
-
size_t size_;
|
1016
|
-
RelationToSource relation_to_source_;
|
1017
|
-
|
1018
|
-
GTEST_DISALLOW_ASSIGN_(NativeArray);
|
1019
|
-
};
|
1020
|
-
|
1021
|
-
} // namespace internal
|
1022
|
-
} // namespace testing
|
1023
|
-
|
1024
|
-
#define GTEST_MESSAGE_AT_(file, line, message, result_type) \
|
1025
|
-
::testing::internal::AssertHelper(result_type, file, line, message) \
|
1026
|
-
= ::testing::Message()
|
1027
|
-
|
1028
|
-
#define GTEST_MESSAGE_(message, result_type) \
|
1029
|
-
GTEST_MESSAGE_AT_(__FILE__, __LINE__, message, result_type)
|
1030
|
-
|
1031
|
-
#define GTEST_FATAL_FAILURE_(message) \
|
1032
|
-
return GTEST_MESSAGE_(message, ::testing::TestPartResult::kFatalFailure)
|
1033
|
-
|
1034
|
-
#define GTEST_NONFATAL_FAILURE_(message) \
|
1035
|
-
GTEST_MESSAGE_(message, ::testing::TestPartResult::kNonFatalFailure)
|
1036
|
-
|
1037
|
-
#define GTEST_SUCCESS_(message) \
|
1038
|
-
GTEST_MESSAGE_(message, ::testing::TestPartResult::kSuccess)
|
1039
|
-
|
1040
|
-
// Suppresses MSVC warnings 4072 (unreachable code) for the code following
|
1041
|
-
// statement if it returns or throws (or doesn't return or throw in some
|
1042
|
-
// situations).
|
1043
|
-
#define GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement) \
|
1044
|
-
if (::testing::internal::AlwaysTrue()) { statement; }
|
1045
|
-
|
1046
|
-
#define GTEST_TEST_THROW_(statement, expected_exception, fail) \
|
1047
|
-
GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
|
1048
|
-
if (::testing::internal::ConstCharPtr gtest_msg = "") { \
|
1049
|
-
bool gtest_caught_expected = false; \
|
1050
|
-
try { \
|
1051
|
-
GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
|
1052
|
-
} \
|
1053
|
-
catch (expected_exception const&) { \
|
1054
|
-
gtest_caught_expected = true; \
|
1055
|
-
} \
|
1056
|
-
catch (...) { \
|
1057
|
-
gtest_msg.value = \
|
1058
|
-
"Expected: " #statement " throws an exception of type " \
|
1059
|
-
#expected_exception ".\n Actual: it throws a different type."; \
|
1060
|
-
goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \
|
1061
|
-
} \
|
1062
|
-
if (!gtest_caught_expected) { \
|
1063
|
-
gtest_msg.value = \
|
1064
|
-
"Expected: " #statement " throws an exception of type " \
|
1065
|
-
#expected_exception ".\n Actual: it throws nothing."; \
|
1066
|
-
goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \
|
1067
|
-
} \
|
1068
|
-
} else \
|
1069
|
-
GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__): \
|
1070
|
-
fail(gtest_msg.value)
|
1071
|
-
|
1072
|
-
#define GTEST_TEST_NO_THROW_(statement, fail) \
|
1073
|
-
GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
|
1074
|
-
if (::testing::internal::AlwaysTrue()) { \
|
1075
|
-
try { \
|
1076
|
-
GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
|
1077
|
-
} \
|
1078
|
-
catch (...) { \
|
1079
|
-
goto GTEST_CONCAT_TOKEN_(gtest_label_testnothrow_, __LINE__); \
|
1080
|
-
} \
|
1081
|
-
} else \
|
1082
|
-
GTEST_CONCAT_TOKEN_(gtest_label_testnothrow_, __LINE__): \
|
1083
|
-
fail("Expected: " #statement " doesn't throw an exception.\n" \
|
1084
|
-
" Actual: it throws.")
|
1085
|
-
|
1086
|
-
#define GTEST_TEST_ANY_THROW_(statement, fail) \
|
1087
|
-
GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
|
1088
|
-
if (::testing::internal::AlwaysTrue()) { \
|
1089
|
-
bool gtest_caught_any = false; \
|
1090
|
-
try { \
|
1091
|
-
GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
|
1092
|
-
} \
|
1093
|
-
catch (...) { \
|
1094
|
-
gtest_caught_any = true; \
|
1095
|
-
} \
|
1096
|
-
if (!gtest_caught_any) { \
|
1097
|
-
goto GTEST_CONCAT_TOKEN_(gtest_label_testanythrow_, __LINE__); \
|
1098
|
-
} \
|
1099
|
-
} else \
|
1100
|
-
GTEST_CONCAT_TOKEN_(gtest_label_testanythrow_, __LINE__): \
|
1101
|
-
fail("Expected: " #statement " throws an exception.\n" \
|
1102
|
-
" Actual: it doesn't.")
|
1103
|
-
|
1104
|
-
|
1105
|
-
// Implements Boolean test assertions such as EXPECT_TRUE. expression can be
|
1106
|
-
// either a boolean expression or an AssertionResult. text is a textual
|
1107
|
-
// represenation of expression as it was passed into the EXPECT_TRUE.
|
1108
|
-
#define GTEST_TEST_BOOLEAN_(expression, text, actual, expected, fail) \
|
1109
|
-
GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
|
1110
|
-
if (const ::testing::AssertionResult gtest_ar_ = \
|
1111
|
-
::testing::AssertionResult(expression)) \
|
1112
|
-
; \
|
1113
|
-
else \
|
1114
|
-
fail(::testing::internal::GetBoolAssertionFailureMessage(\
|
1115
|
-
gtest_ar_, text, #actual, #expected).c_str())
|
1116
|
-
|
1117
|
-
#define GTEST_TEST_NO_FATAL_FAILURE_(statement, fail) \
|
1118
|
-
GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
|
1119
|
-
if (::testing::internal::AlwaysTrue()) { \
|
1120
|
-
::testing::internal::HasNewFatalFailureHelper gtest_fatal_failure_checker; \
|
1121
|
-
GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
|
1122
|
-
if (gtest_fatal_failure_checker.has_new_fatal_failure()) { \
|
1123
|
-
goto GTEST_CONCAT_TOKEN_(gtest_label_testnofatal_, __LINE__); \
|
1124
|
-
} \
|
1125
|
-
} else \
|
1126
|
-
GTEST_CONCAT_TOKEN_(gtest_label_testnofatal_, __LINE__): \
|
1127
|
-
fail("Expected: " #statement " doesn't generate new fatal " \
|
1128
|
-
"failures in the current thread.\n" \
|
1129
|
-
" Actual: it does.")
|
1130
|
-
|
1131
|
-
// Expands to the name of the class that implements the given test.
|
1132
|
-
#define GTEST_TEST_CLASS_NAME_(test_case_name, test_name) \
|
1133
|
-
test_case_name##_##test_name##_Test
|
1134
|
-
|
1135
|
-
// Helper macro for defining tests.
|
1136
|
-
#define GTEST_TEST_(test_case_name, test_name, parent_class, parent_id)\
|
1137
|
-
class GTEST_TEST_CLASS_NAME_(test_case_name, test_name) : public parent_class {\
|
1138
|
-
public:\
|
1139
|
-
GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {}\
|
1140
|
-
private:\
|
1141
|
-
virtual void TestBody();\
|
1142
|
-
static ::testing::TestInfo* const test_info_ GTEST_ATTRIBUTE_UNUSED_;\
|
1143
|
-
GTEST_DISALLOW_COPY_AND_ASSIGN_(\
|
1144
|
-
GTEST_TEST_CLASS_NAME_(test_case_name, test_name));\
|
1145
|
-
};\
|
1146
|
-
\
|
1147
|
-
::testing::TestInfo* const GTEST_TEST_CLASS_NAME_(test_case_name, test_name)\
|
1148
|
-
::test_info_ =\
|
1149
|
-
::testing::internal::MakeAndRegisterTestInfo(\
|
1150
|
-
#test_case_name, #test_name, NULL, NULL, \
|
1151
|
-
(parent_id), \
|
1152
|
-
parent_class::SetUpTestCase, \
|
1153
|
-
parent_class::TearDownTestCase, \
|
1154
|
-
new ::testing::internal::TestFactoryImpl<\
|
1155
|
-
GTEST_TEST_CLASS_NAME_(test_case_name, test_name)>);\
|
1156
|
-
void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody()
|
1157
|
-
|
1158
|
-
#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_
|