uia 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (90) hide show
  1. data/.rspec +1 -0
  2. data/ChangeLog +11 -0
  3. data/README.md +18 -1
  4. data/Rakefile +6 -1
  5. data/ext/UiaDll/UIA.Helper/Element.cs +52 -32
  6. data/ext/UiaDll/UiaDll.Test/AssemblyInfo.cpp +40 -0
  7. data/ext/UiaDll/UiaDll.Test/ElementInformationTest.cpp +89 -0
  8. data/ext/UiaDll/UiaDll.Test/ElementStub.h +59 -0
  9. data/ext/UiaDll/UiaDll.Test/ElementsTest.cpp +22 -0
  10. data/ext/UiaDll/UiaDll.Test/MemoryLeakDetector.h +47 -0
  11. data/ext/UiaDll/UiaDll.Test/ReadMe.txt +35 -0
  12. data/ext/UiaDll/UiaDll.Test/StringHelperTest.cpp +14 -0
  13. data/ext/UiaDll/UiaDll.Test/UiaDll.Test.cpp +16 -0
  14. data/ext/UiaDll/UiaDll.Test/UiaDll.Test.vcxproj +127 -0
  15. data/ext/UiaDll/UiaDll.Test/UiaDll.Test.vcxproj.filters +67 -0
  16. data/ext/UiaDll/UiaDll.Test/app.ico +0 -0
  17. data/ext/UiaDll/UiaDll.Test/app.rc +0 -0
  18. data/ext/UiaDll/UiaDll.Test/gmock/include/gmock/gmock-actions.h +1078 -0
  19. data/ext/UiaDll/UiaDll.Test/gmock/include/gmock/gmock-cardinalities.h +147 -0
  20. data/ext/UiaDll/UiaDll.Test/gmock/include/gmock/gmock-generated-actions.h +2415 -0
  21. data/ext/UiaDll/UiaDll.Test/gmock/include/gmock/gmock-generated-actions.h.pump +821 -0
  22. data/ext/UiaDll/UiaDll.Test/gmock/include/gmock/gmock-generated-function-mockers.h +991 -0
  23. data/ext/UiaDll/UiaDll.Test/gmock/include/gmock/gmock-generated-function-mockers.h.pump +265 -0
  24. data/ext/UiaDll/UiaDll.Test/gmock/include/gmock/gmock-generated-matchers.h +2190 -0
  25. data/ext/UiaDll/UiaDll.Test/gmock/include/gmock/gmock-generated-matchers.h.pump +674 -0
  26. data/ext/UiaDll/UiaDll.Test/gmock/include/gmock/gmock-generated-nice-strict.h +397 -0
  27. data/ext/UiaDll/UiaDll.Test/gmock/include/gmock/gmock-generated-nice-strict.h.pump +161 -0
  28. data/ext/UiaDll/UiaDll.Test/gmock/include/gmock/gmock-matchers.h +3986 -0
  29. data/ext/UiaDll/UiaDll.Test/gmock/include/gmock/gmock-more-actions.h +233 -0
  30. data/ext/UiaDll/UiaDll.Test/gmock/include/gmock/gmock-more-matchers.h +58 -0
  31. data/ext/UiaDll/UiaDll.Test/gmock/include/gmock/gmock-spec-builders.h +1791 -0
  32. data/ext/UiaDll/UiaDll.Test/gmock/include/gmock/gmock.h +94 -0
  33. data/ext/UiaDll/UiaDll.Test/gmock/include/gmock/internal/gmock-generated-internal-utils.h +279 -0
  34. data/ext/UiaDll/UiaDll.Test/gmock/include/gmock/internal/gmock-generated-internal-utils.h.pump +136 -0
  35. data/ext/UiaDll/UiaDll.Test/gmock/include/gmock/internal/gmock-internal-utils.h +498 -0
  36. data/ext/UiaDll/UiaDll.Test/gmock/include/gmock/internal/gmock-port.h +78 -0
  37. data/ext/UiaDll/UiaDll.Test/gmock/lib/gmock.lib +0 -0
  38. data/ext/UiaDll/UiaDll.Test/gmock/lib/gmockd.lib +0 -0
  39. data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/gtest-death-test.h +294 -0
  40. data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/gtest-message.h +250 -0
  41. data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/gtest-param-test.h +1421 -0
  42. data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/gtest-param-test.h.pump +487 -0
  43. data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/gtest-printers.h +855 -0
  44. data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/gtest-spi.h +232 -0
  45. data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/gtest-test-part.h +179 -0
  46. data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/gtest-typed-test.h +259 -0
  47. data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/gtest.h +2291 -0
  48. data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/gtest_pred_impl.h +358 -0
  49. data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/gtest_prod.h +58 -0
  50. data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/internal/gtest-death-test-internal.h +319 -0
  51. data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/internal/gtest-filepath.h +206 -0
  52. data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/internal/gtest-internal.h +1158 -0
  53. data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/internal/gtest-linked_ptr.h +233 -0
  54. data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/internal/gtest-param-util-generated.h +5143 -0
  55. data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/internal/gtest-param-util-generated.h.pump +301 -0
  56. data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/internal/gtest-param-util.h +619 -0
  57. data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/internal/gtest-port.h +1947 -0
  58. data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/internal/gtest-string.h +167 -0
  59. data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/internal/gtest-tuple.h +1012 -0
  60. data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/internal/gtest-tuple.h.pump +339 -0
  61. data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/internal/gtest-type-util.h +3331 -0
  62. data/ext/UiaDll/UiaDll.Test/gtest/include/gtest/internal/gtest-type-util.h.pump +297 -0
  63. data/ext/UiaDll/UiaDll.Test/gtest/lib/gtest.lib +0 -0
  64. data/ext/UiaDll/UiaDll.Test/gtest/lib/gtestd.lib +0 -0
  65. data/ext/UiaDll/UiaDll.Test/resource.h +3 -0
  66. data/ext/UiaDll/UiaDll.Test/stdafx.cpp +7 -0
  67. data/ext/UiaDll/UiaDll.Test/stdafx.h +7 -0
  68. data/ext/UiaDll/UiaDll.sln +15 -0
  69. data/ext/UiaDll/UiaDll/ArrayHelper.h +20 -2
  70. data/ext/UiaDll/UiaDll/ElementMethods.cpp +18 -0
  71. data/ext/UiaDll/UiaDll/ElementStructures.h +36 -24
  72. data/ext/UiaDll/UiaDll/StringHelper.h +16 -2
  73. data/ext/UiaDll/UiaDll/UiaDll.vcxproj +0 -2
  74. data/ext/UiaDll/UiaDll/UiaDll.vcxproj.filters +0 -6
  75. data/lib/uia.rb +23 -117
  76. data/lib/uia/element.rb +38 -0
  77. data/lib/uia/library.rb +60 -0
  78. data/lib/uia/library/constants.rb +85 -0
  79. data/lib/uia/library/structs.rb +85 -0
  80. data/lib/uia/version.rb +1 -1
  81. data/spec/app/FizzWare.NBuilder.dll +0 -0
  82. data/spec/app/UIA.Extensions.dll +0 -0
  83. data/spec/app/WindowsForms.exe +0 -0
  84. data/spec/spec_helper.rb +21 -0
  85. data/spec/uia/element_spec.rb +56 -0
  86. data/spec/uia_spec.rb +28 -0
  87. data/uia.gemspec +13 -10
  88. metadata +134 -8
  89. data/ext/UiaDll/UiaDll/ArrayHelper.cpp +0 -22
  90. data/ext/UiaDll/UiaDll/StringHelper.cpp +0 -17
@@ -0,0 +1,498 @@
1
+ // Copyright 2007, 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: wan@google.com (Zhanyong Wan)
31
+
32
+ // Google Mock - a framework for writing C++ mock classes.
33
+ //
34
+ // This file defines some utilities useful for implementing Google
35
+ // Mock. They are subject to change without notice, so please DO NOT
36
+ // USE THEM IN USER CODE.
37
+
38
+ #ifndef GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_INTERNAL_UTILS_H_
39
+ #define GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_INTERNAL_UTILS_H_
40
+
41
+ #include <stdio.h>
42
+ #include <ostream> // NOLINT
43
+ #include <string>
44
+
45
+ #include "gmock/internal/gmock-generated-internal-utils.h"
46
+ #include "gmock/internal/gmock-port.h"
47
+ #include "gtest/gtest.h"
48
+
49
+ namespace testing {
50
+ namespace internal {
51
+
52
+ // Converts an identifier name to a space-separated list of lower-case
53
+ // words. Each maximum substring of the form [A-Za-z][a-z]*|\d+ is
54
+ // treated as one word. For example, both "FooBar123" and
55
+ // "foo_bar_123" are converted to "foo bar 123".
56
+ GTEST_API_ string ConvertIdentifierNameToWords(const char* id_name);
57
+
58
+ // PointeeOf<Pointer>::type is the type of a value pointed to by a
59
+ // Pointer, which can be either a smart pointer or a raw pointer. The
60
+ // following default implementation is for the case where Pointer is a
61
+ // smart pointer.
62
+ template <typename Pointer>
63
+ struct PointeeOf {
64
+ // Smart pointer classes define type element_type as the type of
65
+ // their pointees.
66
+ typedef typename Pointer::element_type type;
67
+ };
68
+ // This specialization is for the raw pointer case.
69
+ template <typename T>
70
+ struct PointeeOf<T*> { typedef T type; }; // NOLINT
71
+
72
+ // GetRawPointer(p) returns the raw pointer underlying p when p is a
73
+ // smart pointer, or returns p itself when p is already a raw pointer.
74
+ // The following default implementation is for the smart pointer case.
75
+ template <typename Pointer>
76
+ inline const typename Pointer::element_type* GetRawPointer(const Pointer& p) {
77
+ return p.get();
78
+ }
79
+ // This overloaded version is for the raw pointer case.
80
+ template <typename Element>
81
+ inline Element* GetRawPointer(Element* p) { return p; }
82
+
83
+ // This comparator allows linked_ptr to be stored in sets.
84
+ template <typename T>
85
+ struct LinkedPtrLessThan {
86
+ bool operator()(const ::testing::internal::linked_ptr<T>& lhs,
87
+ const ::testing::internal::linked_ptr<T>& rhs) const {
88
+ return lhs.get() < rhs.get();
89
+ }
90
+ };
91
+
92
+ // Symbian compilation can be done with wchar_t being either a native
93
+ // type or a typedef. Using Google Mock with OpenC without wchar_t
94
+ // should require the definition of _STLP_NO_WCHAR_T.
95
+ //
96
+ // MSVC treats wchar_t as a native type usually, but treats it as the
97
+ // same as unsigned short when the compiler option /Zc:wchar_t- is
98
+ // specified. It defines _NATIVE_WCHAR_T_DEFINED symbol when wchar_t
99
+ // is a native type.
100
+ #if (GTEST_OS_SYMBIAN && defined(_STLP_NO_WCHAR_T)) || \
101
+ (defined(_MSC_VER) && !defined(_NATIVE_WCHAR_T_DEFINED))
102
+ // wchar_t is a typedef.
103
+ #else
104
+ # define GMOCK_WCHAR_T_IS_NATIVE_ 1
105
+ #endif
106
+
107
+ // signed wchar_t and unsigned wchar_t are NOT in the C++ standard.
108
+ // Using them is a bad practice and not portable. So DON'T use them.
109
+ //
110
+ // Still, Google Mock is designed to work even if the user uses signed
111
+ // wchar_t or unsigned wchar_t (obviously, assuming the compiler
112
+ // supports them).
113
+ //
114
+ // To gcc,
115
+ // wchar_t == signed wchar_t != unsigned wchar_t == unsigned int
116
+ #ifdef __GNUC__
117
+ // signed/unsigned wchar_t are valid types.
118
+ # define GMOCK_HAS_SIGNED_WCHAR_T_ 1
119
+ #endif
120
+
121
+ // In what follows, we use the term "kind" to indicate whether a type
122
+ // is bool, an integer type (excluding bool), a floating-point type,
123
+ // or none of them. This categorization is useful for determining
124
+ // when a matcher argument type can be safely converted to another
125
+ // type in the implementation of SafeMatcherCast.
126
+ enum TypeKind {
127
+ kBool, kInteger, kFloatingPoint, kOther
128
+ };
129
+
130
+ // KindOf<T>::value is the kind of type T.
131
+ template <typename T> struct KindOf {
132
+ enum { value = kOther }; // The default kind.
133
+ };
134
+
135
+ // This macro declares that the kind of 'type' is 'kind'.
136
+ #define GMOCK_DECLARE_KIND_(type, kind) \
137
+ template <> struct KindOf<type> { enum { value = kind }; }
138
+
139
+ GMOCK_DECLARE_KIND_(bool, kBool);
140
+
141
+ // All standard integer types.
142
+ GMOCK_DECLARE_KIND_(char, kInteger);
143
+ GMOCK_DECLARE_KIND_(signed char, kInteger);
144
+ GMOCK_DECLARE_KIND_(unsigned char, kInteger);
145
+ GMOCK_DECLARE_KIND_(short, kInteger); // NOLINT
146
+ GMOCK_DECLARE_KIND_(unsigned short, kInteger); // NOLINT
147
+ GMOCK_DECLARE_KIND_(int, kInteger);
148
+ GMOCK_DECLARE_KIND_(unsigned int, kInteger);
149
+ GMOCK_DECLARE_KIND_(long, kInteger); // NOLINT
150
+ GMOCK_DECLARE_KIND_(unsigned long, kInteger); // NOLINT
151
+
152
+ #if GMOCK_WCHAR_T_IS_NATIVE_
153
+ GMOCK_DECLARE_KIND_(wchar_t, kInteger);
154
+ #endif
155
+
156
+ // Non-standard integer types.
157
+ GMOCK_DECLARE_KIND_(Int64, kInteger);
158
+ GMOCK_DECLARE_KIND_(UInt64, kInteger);
159
+
160
+ // All standard floating-point types.
161
+ GMOCK_DECLARE_KIND_(float, kFloatingPoint);
162
+ GMOCK_DECLARE_KIND_(double, kFloatingPoint);
163
+ GMOCK_DECLARE_KIND_(long double, kFloatingPoint);
164
+
165
+ #undef GMOCK_DECLARE_KIND_
166
+
167
+ // Evaluates to the kind of 'type'.
168
+ #define GMOCK_KIND_OF_(type) \
169
+ static_cast< ::testing::internal::TypeKind>( \
170
+ ::testing::internal::KindOf<type>::value)
171
+
172
+ // Evaluates to true iff integer type T is signed.
173
+ #define GMOCK_IS_SIGNED_(T) (static_cast<T>(-1) < 0)
174
+
175
+ // LosslessArithmeticConvertibleImpl<kFromKind, From, kToKind, To>::value
176
+ // is true iff arithmetic type From can be losslessly converted to
177
+ // arithmetic type To.
178
+ //
179
+ // It's the user's responsibility to ensure that both From and To are
180
+ // raw (i.e. has no CV modifier, is not a pointer, and is not a
181
+ // reference) built-in arithmetic types, kFromKind is the kind of
182
+ // From, and kToKind is the kind of To; the value is
183
+ // implementation-defined when the above pre-condition is violated.
184
+ template <TypeKind kFromKind, typename From, TypeKind kToKind, typename To>
185
+ struct LosslessArithmeticConvertibleImpl : public false_type {};
186
+
187
+ // Converting bool to bool is lossless.
188
+ template <>
189
+ struct LosslessArithmeticConvertibleImpl<kBool, bool, kBool, bool>
190
+ : public true_type {}; // NOLINT
191
+
192
+ // Converting bool to any integer type is lossless.
193
+ template <typename To>
194
+ struct LosslessArithmeticConvertibleImpl<kBool, bool, kInteger, To>
195
+ : public true_type {}; // NOLINT
196
+
197
+ // Converting bool to any floating-point type is lossless.
198
+ template <typename To>
199
+ struct LosslessArithmeticConvertibleImpl<kBool, bool, kFloatingPoint, To>
200
+ : public true_type {}; // NOLINT
201
+
202
+ // Converting an integer to bool is lossy.
203
+ template <typename From>
204
+ struct LosslessArithmeticConvertibleImpl<kInteger, From, kBool, bool>
205
+ : public false_type {}; // NOLINT
206
+
207
+ // Converting an integer to another non-bool integer is lossless iff
208
+ // the target type's range encloses the source type's range.
209
+ template <typename From, typename To>
210
+ struct LosslessArithmeticConvertibleImpl<kInteger, From, kInteger, To>
211
+ : public bool_constant<
212
+ // When converting from a smaller size to a larger size, we are
213
+ // fine as long as we are not converting from signed to unsigned.
214
+ ((sizeof(From) < sizeof(To)) &&
215
+ (!GMOCK_IS_SIGNED_(From) || GMOCK_IS_SIGNED_(To))) ||
216
+ // When converting between the same size, the signedness must match.
217
+ ((sizeof(From) == sizeof(To)) &&
218
+ (GMOCK_IS_SIGNED_(From) == GMOCK_IS_SIGNED_(To)))> {}; // NOLINT
219
+
220
+ #undef GMOCK_IS_SIGNED_
221
+
222
+ // Converting an integer to a floating-point type may be lossy, since
223
+ // the format of a floating-point number is implementation-defined.
224
+ template <typename From, typename To>
225
+ struct LosslessArithmeticConvertibleImpl<kInteger, From, kFloatingPoint, To>
226
+ : public false_type {}; // NOLINT
227
+
228
+ // Converting a floating-point to bool is lossy.
229
+ template <typename From>
230
+ struct LosslessArithmeticConvertibleImpl<kFloatingPoint, From, kBool, bool>
231
+ : public false_type {}; // NOLINT
232
+
233
+ // Converting a floating-point to an integer is lossy.
234
+ template <typename From, typename To>
235
+ struct LosslessArithmeticConvertibleImpl<kFloatingPoint, From, kInteger, To>
236
+ : public false_type {}; // NOLINT
237
+
238
+ // Converting a floating-point to another floating-point is lossless
239
+ // iff the target type is at least as big as the source type.
240
+ template <typename From, typename To>
241
+ struct LosslessArithmeticConvertibleImpl<
242
+ kFloatingPoint, From, kFloatingPoint, To>
243
+ : public bool_constant<sizeof(From) <= sizeof(To)> {}; // NOLINT
244
+
245
+ // LosslessArithmeticConvertible<From, To>::value is true iff arithmetic
246
+ // type From can be losslessly converted to arithmetic type To.
247
+ //
248
+ // It's the user's responsibility to ensure that both From and To are
249
+ // raw (i.e. has no CV modifier, is not a pointer, and is not a
250
+ // reference) built-in arithmetic types; the value is
251
+ // implementation-defined when the above pre-condition is violated.
252
+ template <typename From, typename To>
253
+ struct LosslessArithmeticConvertible
254
+ : public LosslessArithmeticConvertibleImpl<
255
+ GMOCK_KIND_OF_(From), From, GMOCK_KIND_OF_(To), To> {}; // NOLINT
256
+
257
+ // This interface knows how to report a Google Mock failure (either
258
+ // non-fatal or fatal).
259
+ class FailureReporterInterface {
260
+ public:
261
+ // The type of a failure (either non-fatal or fatal).
262
+ enum FailureType {
263
+ kNonfatal, kFatal
264
+ };
265
+
266
+ virtual ~FailureReporterInterface() {}
267
+
268
+ // Reports a failure that occurred at the given source file location.
269
+ virtual void ReportFailure(FailureType type, const char* file, int line,
270
+ const string& message) = 0;
271
+ };
272
+
273
+ // Returns the failure reporter used by Google Mock.
274
+ GTEST_API_ FailureReporterInterface* GetFailureReporter();
275
+
276
+ // Asserts that condition is true; aborts the process with the given
277
+ // message if condition is false. We cannot use LOG(FATAL) or CHECK()
278
+ // as Google Mock might be used to mock the log sink itself. We
279
+ // inline this function to prevent it from showing up in the stack
280
+ // trace.
281
+ inline void Assert(bool condition, const char* file, int line,
282
+ const string& msg) {
283
+ if (!condition) {
284
+ GetFailureReporter()->ReportFailure(FailureReporterInterface::kFatal,
285
+ file, line, msg);
286
+ }
287
+ }
288
+ inline void Assert(bool condition, const char* file, int line) {
289
+ Assert(condition, file, line, "Assertion failed.");
290
+ }
291
+
292
+ // Verifies that condition is true; generates a non-fatal failure if
293
+ // condition is false.
294
+ inline void Expect(bool condition, const char* file, int line,
295
+ const string& msg) {
296
+ if (!condition) {
297
+ GetFailureReporter()->ReportFailure(FailureReporterInterface::kNonfatal,
298
+ file, line, msg);
299
+ }
300
+ }
301
+ inline void Expect(bool condition, const char* file, int line) {
302
+ Expect(condition, file, line, "Expectation failed.");
303
+ }
304
+
305
+ // Severity level of a log.
306
+ enum LogSeverity {
307
+ kInfo = 0,
308
+ kWarning = 1
309
+ };
310
+
311
+ // Valid values for the --gmock_verbose flag.
312
+
313
+ // All logs (informational and warnings) are printed.
314
+ const char kInfoVerbosity[] = "info";
315
+ // Only warnings are printed.
316
+ const char kWarningVerbosity[] = "warning";
317
+ // No logs are printed.
318
+ const char kErrorVerbosity[] = "error";
319
+
320
+ // Returns true iff a log with the given severity is visible according
321
+ // to the --gmock_verbose flag.
322
+ GTEST_API_ bool LogIsVisible(LogSeverity severity);
323
+
324
+ // Prints the given message to stdout iff 'severity' >= the level
325
+ // specified by the --gmock_verbose flag. If stack_frames_to_skip >=
326
+ // 0, also prints the stack trace excluding the top
327
+ // stack_frames_to_skip frames. In opt mode, any positive
328
+ // stack_frames_to_skip is treated as 0, since we don't know which
329
+ // function calls will be inlined by the compiler and need to be
330
+ // conservative.
331
+ GTEST_API_ void Log(LogSeverity severity,
332
+ const string& message,
333
+ int stack_frames_to_skip);
334
+
335
+ // TODO(wan@google.com): group all type utilities together.
336
+
337
+ // Type traits.
338
+
339
+ // is_reference<T>::value is non-zero iff T is a reference type.
340
+ template <typename T> struct is_reference : public false_type {};
341
+ template <typename T> struct is_reference<T&> : public true_type {};
342
+
343
+ // type_equals<T1, T2>::value is non-zero iff T1 and T2 are the same type.
344
+ template <typename T1, typename T2> struct type_equals : public false_type {};
345
+ template <typename T> struct type_equals<T, T> : public true_type {};
346
+
347
+ // remove_reference<T>::type removes the reference from type T, if any.
348
+ template <typename T> struct remove_reference { typedef T type; }; // NOLINT
349
+ template <typename T> struct remove_reference<T&> { typedef T type; }; // NOLINT
350
+
351
+ // DecayArray<T>::type turns an array type U[N] to const U* and preserves
352
+ // other types. Useful for saving a copy of a function argument.
353
+ template <typename T> struct DecayArray { typedef T type; }; // NOLINT
354
+ template <typename T, size_t N> struct DecayArray<T[N]> {
355
+ typedef const T* type;
356
+ };
357
+ // Sometimes people use arrays whose size is not available at the use site
358
+ // (e.g. extern const char kNamePrefix[]). This specialization covers that
359
+ // case.
360
+ template <typename T> struct DecayArray<T[]> {
361
+ typedef const T* type;
362
+ };
363
+
364
+ // Invalid<T>() returns an invalid value of type T. This is useful
365
+ // when a value of type T is needed for compilation, but the statement
366
+ // will not really be executed (or we don't care if the statement
367
+ // crashes).
368
+ template <typename T>
369
+ inline T Invalid() {
370
+ return const_cast<typename remove_reference<T>::type&>(
371
+ *static_cast<volatile typename remove_reference<T>::type*>(NULL));
372
+ }
373
+ template <>
374
+ inline void Invalid<void>() {}
375
+
376
+ // Given a raw type (i.e. having no top-level reference or const
377
+ // modifier) RawContainer that's either an STL-style container or a
378
+ // native array, class StlContainerView<RawContainer> has the
379
+ // following members:
380
+ //
381
+ // - type is a type that provides an STL-style container view to
382
+ // (i.e. implements the STL container concept for) RawContainer;
383
+ // - const_reference is a type that provides a reference to a const
384
+ // RawContainer;
385
+ // - ConstReference(raw_container) returns a const reference to an STL-style
386
+ // container view to raw_container, which is a RawContainer.
387
+ // - Copy(raw_container) returns an STL-style container view of a
388
+ // copy of raw_container, which is a RawContainer.
389
+ //
390
+ // This generic version is used when RawContainer itself is already an
391
+ // STL-style container.
392
+ template <class RawContainer>
393
+ class StlContainerView {
394
+ public:
395
+ typedef RawContainer type;
396
+ typedef const type& const_reference;
397
+
398
+ static const_reference ConstReference(const RawContainer& container) {
399
+ // Ensures that RawContainer is not a const type.
400
+ testing::StaticAssertTypeEq<RawContainer,
401
+ GTEST_REMOVE_CONST_(RawContainer)>();
402
+ return container;
403
+ }
404
+ static type Copy(const RawContainer& container) { return container; }
405
+ };
406
+
407
+ // This specialization is used when RawContainer is a native array type.
408
+ template <typename Element, size_t N>
409
+ class StlContainerView<Element[N]> {
410
+ public:
411
+ typedef GTEST_REMOVE_CONST_(Element) RawElement;
412
+ typedef internal::NativeArray<RawElement> type;
413
+ // NativeArray<T> can represent a native array either by value or by
414
+ // reference (selected by a constructor argument), so 'const type'
415
+ // can be used to reference a const native array. We cannot
416
+ // 'typedef const type& const_reference' here, as that would mean
417
+ // ConstReference() has to return a reference to a local variable.
418
+ typedef const type const_reference;
419
+
420
+ static const_reference ConstReference(const Element (&array)[N]) {
421
+ // Ensures that Element is not a const type.
422
+ testing::StaticAssertTypeEq<Element, RawElement>();
423
+ #if GTEST_OS_SYMBIAN
424
+ // The Nokia Symbian compiler confuses itself in template instantiation
425
+ // for this call without the cast to Element*:
426
+ // function call '[testing::internal::NativeArray<char *>].NativeArray(
427
+ // {lval} const char *[4], long, testing::internal::RelationToSource)'
428
+ // does not match
429
+ // 'testing::internal::NativeArray<char *>::NativeArray(
430
+ // char *const *, unsigned int, testing::internal::RelationToSource)'
431
+ // (instantiating: 'testing::internal::ContainsMatcherImpl
432
+ // <const char * (&)[4]>::Matches(const char * (&)[4]) const')
433
+ // (instantiating: 'testing::internal::StlContainerView<char *[4]>::
434
+ // ConstReference(const char * (&)[4])')
435
+ // (and though the N parameter type is mismatched in the above explicit
436
+ // conversion of it doesn't help - only the conversion of the array).
437
+ return type(const_cast<Element*>(&array[0]), N, kReference);
438
+ #else
439
+ return type(array, N, kReference);
440
+ #endif // GTEST_OS_SYMBIAN
441
+ }
442
+ static type Copy(const Element (&array)[N]) {
443
+ #if GTEST_OS_SYMBIAN
444
+ return type(const_cast<Element*>(&array[0]), N, kCopy);
445
+ #else
446
+ return type(array, N, kCopy);
447
+ #endif // GTEST_OS_SYMBIAN
448
+ }
449
+ };
450
+
451
+ // This specialization is used when RawContainer is a native array
452
+ // represented as a (pointer, size) tuple.
453
+ template <typename ElementPointer, typename Size>
454
+ class StlContainerView< ::std::tr1::tuple<ElementPointer, Size> > {
455
+ public:
456
+ typedef GTEST_REMOVE_CONST_(
457
+ typename internal::PointeeOf<ElementPointer>::type) RawElement;
458
+ typedef internal::NativeArray<RawElement> type;
459
+ typedef const type const_reference;
460
+
461
+ static const_reference ConstReference(
462
+ const ::std::tr1::tuple<ElementPointer, Size>& array) {
463
+ using ::std::tr1::get;
464
+ return type(get<0>(array), get<1>(array), kReference);
465
+ }
466
+ static type Copy(const ::std::tr1::tuple<ElementPointer, Size>& array) {
467
+ using ::std::tr1::get;
468
+ return type(get<0>(array), get<1>(array), kCopy);
469
+ }
470
+ };
471
+
472
+ // The following specialization prevents the user from instantiating
473
+ // StlContainer with a reference type.
474
+ template <typename T> class StlContainerView<T&>;
475
+
476
+ // A type transform to remove constness from the first part of a pair.
477
+ // Pairs like that are used as the value_type of associative containers,
478
+ // and this transform produces a similar but assignable pair.
479
+ template <typename T>
480
+ struct RemoveConstFromKey {
481
+ typedef T type;
482
+ };
483
+
484
+ // Partially specialized to remove constness from std::pair<const K, V>.
485
+ template <typename K, typename V>
486
+ struct RemoveConstFromKey<std::pair<const K, V> > {
487
+ typedef std::pair<K, V> type;
488
+ };
489
+
490
+ // Mapping from booleans to types. Similar to boost::bool_<kValue> and
491
+ // std::integral_constant<bool, kValue>.
492
+ template <bool kValue>
493
+ struct BooleanConstant {};
494
+
495
+ } // namespace internal
496
+ } // namespace testing
497
+
498
+ #endif // GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_INTERNAL_UTILS_H_