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.
Files changed (51) hide show
  1. data/ChangeLog +5 -1
  2. data/lib/uia/version.rb +1 -1
  3. data/uia.gemspec +3 -1
  4. metadata +1 -48
  5. data/ext/UiaDll/UiaDll.Test/gmock/include/gmock/gmock-actions.h +0 -1078
  6. data/ext/UiaDll/UiaDll.Test/gmock/include/gmock/gmock-cardinalities.h +0 -147
  7. data/ext/UiaDll/UiaDll.Test/gmock/include/gmock/gmock-generated-actions.h +0 -2415
  8. data/ext/UiaDll/UiaDll.Test/gmock/include/gmock/gmock-generated-actions.h.pump +0 -821
  9. data/ext/UiaDll/UiaDll.Test/gmock/include/gmock/gmock-generated-function-mockers.h +0 -991
  10. data/ext/UiaDll/UiaDll.Test/gmock/include/gmock/gmock-generated-function-mockers.h.pump +0 -265
  11. data/ext/UiaDll/UiaDll.Test/gmock/include/gmock/gmock-generated-matchers.h +0 -2190
  12. data/ext/UiaDll/UiaDll.Test/gmock/include/gmock/gmock-generated-matchers.h.pump +0 -674
  13. data/ext/UiaDll/UiaDll.Test/gmock/include/gmock/gmock-generated-nice-strict.h +0 -397
  14. data/ext/UiaDll/UiaDll.Test/gmock/include/gmock/gmock-generated-nice-strict.h.pump +0 -161
  15. data/ext/UiaDll/UiaDll.Test/gmock/include/gmock/gmock-matchers.h +0 -3986
  16. data/ext/UiaDll/UiaDll.Test/gmock/include/gmock/gmock-more-actions.h +0 -233
  17. data/ext/UiaDll/UiaDll.Test/gmock/include/gmock/gmock-more-matchers.h +0 -58
  18. data/ext/UiaDll/UiaDll.Test/gmock/include/gmock/gmock-spec-builders.h +0 -1791
  19. data/ext/UiaDll/UiaDll.Test/gmock/include/gmock/gmock.h +0 -94
  20. data/ext/UiaDll/UiaDll.Test/gmock/include/gmock/internal/gmock-generated-internal-utils.h +0 -279
  21. data/ext/UiaDll/UiaDll.Test/gmock/include/gmock/internal/gmock-generated-internal-utils.h.pump +0 -136
  22. data/ext/UiaDll/UiaDll.Test/gmock/include/gmock/internal/gmock-internal-utils.h +0 -498
  23. data/ext/UiaDll/UiaDll.Test/gmock/include/gmock/internal/gmock-port.h +0 -78
  24. data/ext/UiaDll/UiaDll.Test/gmock/lib/gmock.lib +0 -0
  25. data/ext/UiaDll/UiaDll.Test/gmock/lib/gmockd.lib +0 -0
  26. data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/gtest-death-test.h +0 -294
  27. data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/gtest-message.h +0 -250
  28. data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/gtest-param-test.h +0 -1421
  29. data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/gtest-param-test.h.pump +0 -487
  30. data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/gtest-printers.h +0 -855
  31. data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/gtest-spi.h +0 -232
  32. data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/gtest-test-part.h +0 -179
  33. data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/gtest-typed-test.h +0 -259
  34. data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/gtest.h +0 -2291
  35. data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/gtest_pred_impl.h +0 -358
  36. data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/gtest_prod.h +0 -58
  37. data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/internal/gtest-death-test-internal.h +0 -319
  38. data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/internal/gtest-filepath.h +0 -206
  39. data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/internal/gtest-internal.h +0 -1158
  40. data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/internal/gtest-linked_ptr.h +0 -233
  41. data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/internal/gtest-param-util-generated.h +0 -5143
  42. data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/internal/gtest-param-util-generated.h.pump +0 -301
  43. data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/internal/gtest-param-util.h +0 -619
  44. data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/internal/gtest-port.h +0 -1947
  45. data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/internal/gtest-string.h +0 -167
  46. data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/internal/gtest-tuple.h +0 -1012
  47. data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/internal/gtest-tuple.h.pump +0 -339
  48. data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/internal/gtest-type-util.h +0 -3331
  49. data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/internal/gtest-type-util.h.pump +0 -297
  50. data/ext/UiaDll/UiaDll.Test/gtest/lib/gtest.lib +0 -0
  51. 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_