OLD | NEW |
1 // Copyright 2007, Google Inc. | 1 // Copyright 2007, Google Inc. |
2 // All rights reserved. | 2 // All rights reserved. |
3 // | 3 // |
4 // Redistribution and use in source and binary forms, with or without | 4 // Redistribution and use in source and binary forms, with or without |
5 // modification, are permitted provided that the following conditions are | 5 // modification, are permitted provided that the following conditions are |
6 // met: | 6 // met: |
7 // | 7 // |
8 // * Redistributions of source code must retain the above copyright | 8 // * Redistributions of source code must retain the above copyright |
9 // notice, this list of conditions and the following disclaimer. | 9 // notice, this list of conditions and the following disclaimer. |
10 // * Redistributions in binary form must reproduce the above | 10 // * Redistributions in binary form must reproduce the above |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
89 EXPECT_EQ("foo bar", ConvertIdentifierNameToWords("_foo_bar_")); | 89 EXPECT_EQ("foo bar", ConvertIdentifierNameToWords("_foo_bar_")); |
90 EXPECT_EQ("foo and bar", ConvertIdentifierNameToWords("_foo__and_bar")); | 90 EXPECT_EQ("foo and bar", ConvertIdentifierNameToWords("_foo__and_bar")); |
91 } | 91 } |
92 | 92 |
93 TEST(ConvertIdentifierNameToWordsTest, WorksWhenNameIsMixture) { | 93 TEST(ConvertIdentifierNameToWordsTest, WorksWhenNameIsMixture) { |
94 EXPECT_EQ("foo bar 123", ConvertIdentifierNameToWords("Foo_bar123")); | 94 EXPECT_EQ("foo bar 123", ConvertIdentifierNameToWords("Foo_bar123")); |
95 EXPECT_EQ("chapter 11 section 1", | 95 EXPECT_EQ("chapter 11 section 1", |
96 ConvertIdentifierNameToWords("_Chapter11Section_1_")); | 96 ConvertIdentifierNameToWords("_Chapter11Section_1_")); |
97 } | 97 } |
98 | 98 |
99 // Tests that CompileAssertTypesEqual compiles when the type arguments are | |
100 // equal. | |
101 TEST(CompileAssertTypesEqual, CompilesWhenTypesAreEqual) { | |
102 CompileAssertTypesEqual<void, void>(); | |
103 CompileAssertTypesEqual<int*, int*>(); | |
104 } | |
105 | |
106 // Tests that RemoveReference does not affect non-reference types. | |
107 TEST(RemoveReferenceTest, DoesNotAffectNonReferenceType) { | |
108 CompileAssertTypesEqual<int, RemoveReference<int>::type>(); | |
109 CompileAssertTypesEqual<const char, RemoveReference<const char>::type>(); | |
110 } | |
111 | |
112 // Tests that RemoveReference removes reference from reference types. | |
113 TEST(RemoveReferenceTest, RemovesReference) { | |
114 CompileAssertTypesEqual<int, RemoveReference<int&>::type>(); | |
115 CompileAssertTypesEqual<const char, RemoveReference<const char&>::type>(); | |
116 } | |
117 | |
118 // Tests GMOCK_REMOVE_REFERENCE_. | |
119 | |
120 template <typename T1, typename T2> | |
121 void TestGMockRemoveReference() { | |
122 CompileAssertTypesEqual<T1, GMOCK_REMOVE_REFERENCE_(T2)>(); | |
123 } | |
124 | |
125 TEST(RemoveReferenceTest, MacroVersion) { | |
126 TestGMockRemoveReference<int, int>(); | |
127 TestGMockRemoveReference<const char, const char&>(); | |
128 } | |
129 | |
130 | |
131 // Tests that RemoveConst does not affect non-const types. | |
132 TEST(RemoveConstTest, DoesNotAffectNonConstType) { | |
133 CompileAssertTypesEqual<int, RemoveConst<int>::type>(); | |
134 CompileAssertTypesEqual<char&, RemoveConst<char&>::type>(); | |
135 } | |
136 | |
137 // Tests that RemoveConst removes const from const types. | |
138 TEST(RemoveConstTest, RemovesConst) { | |
139 CompileAssertTypesEqual<int, RemoveConst<const int>::type>(); | |
140 CompileAssertTypesEqual<char[2], RemoveConst<const char[2]>::type>(); | |
141 CompileAssertTypesEqual<char[2][3], RemoveConst<const char[2][3]>::type>(); | |
142 } | |
143 | |
144 // Tests GMOCK_REMOVE_CONST_. | |
145 | |
146 template <typename T1, typename T2> | |
147 void TestGMockRemoveConst() { | |
148 CompileAssertTypesEqual<T1, GMOCK_REMOVE_CONST_(T2)>(); | |
149 } | |
150 | |
151 TEST(RemoveConstTest, MacroVersion) { | |
152 TestGMockRemoveConst<int, int>(); | |
153 TestGMockRemoveConst<double&, double&>(); | |
154 TestGMockRemoveConst<char, const char>(); | |
155 } | |
156 | |
157 // Tests that AddReference does not affect reference types. | |
158 TEST(AddReferenceTest, DoesNotAffectReferenceType) { | |
159 CompileAssertTypesEqual<int&, AddReference<int&>::type>(); | |
160 CompileAssertTypesEqual<const char&, AddReference<const char&>::type>(); | |
161 } | |
162 | |
163 // Tests that AddReference adds reference to non-reference types. | |
164 TEST(AddReferenceTest, AddsReference) { | |
165 CompileAssertTypesEqual<int&, AddReference<int>::type>(); | |
166 CompileAssertTypesEqual<const char&, AddReference<const char>::type>(); | |
167 } | |
168 | |
169 // Tests GMOCK_ADD_REFERENCE_. | |
170 | |
171 template <typename T1, typename T2> | |
172 void TestGMockAddReference() { | |
173 CompileAssertTypesEqual<T1, GMOCK_ADD_REFERENCE_(T2)>(); | |
174 } | |
175 | |
176 TEST(AddReferenceTest, MacroVersion) { | |
177 TestGMockAddReference<int&, int>(); | |
178 TestGMockAddReference<const char&, const char&>(); | |
179 } | |
180 | |
181 // Tests GMOCK_REFERENCE_TO_CONST_. | |
182 | |
183 template <typename T1, typename T2> | |
184 void TestGMockReferenceToConst() { | |
185 CompileAssertTypesEqual<T1, GMOCK_REFERENCE_TO_CONST_(T2)>(); | |
186 } | |
187 | |
188 TEST(GMockReferenceToConstTest, Works) { | |
189 TestGMockReferenceToConst<const char&, char>(); | |
190 TestGMockReferenceToConst<const int&, const int>(); | |
191 TestGMockReferenceToConst<const double&, double>(); | |
192 TestGMockReferenceToConst<const string&, const string&>(); | |
193 } | |
194 | |
195 TEST(PointeeOfTest, WorksForSmartPointers) { | 99 TEST(PointeeOfTest, WorksForSmartPointers) { |
196 CompileAssertTypesEqual<const char, | 100 CompileAssertTypesEqual<const char, |
197 PointeeOf<internal::linked_ptr<const char> >::type>(); | 101 PointeeOf<internal::linked_ptr<const char> >::type>(); |
198 } | 102 } |
199 | 103 |
200 TEST(PointeeOfTest, WorksForRawPointers) { | 104 TEST(PointeeOfTest, WorksForRawPointers) { |
201 CompileAssertTypesEqual<int, PointeeOf<int*>::type>(); | 105 CompileAssertTypesEqual<int, PointeeOf<int*>::type>(); |
202 CompileAssertTypesEqual<const char, PointeeOf<const char*>::type>(); | 106 CompileAssertTypesEqual<const char, PointeeOf<const char*>::type>(); |
203 CompileAssertTypesEqual<void, PointeeOf<void*>::type>(); | 107 CompileAssertTypesEqual<void, PointeeOf<void*>::type>(); |
204 } | 108 } |
205 | 109 |
206 TEST(GetRawPointerTest, WorksForSmartPointers) { | 110 TEST(GetRawPointerTest, WorksForSmartPointers) { |
207 const char* const raw_p4 = new const char('a'); // NOLINT | 111 const char* const raw_p4 = new const char('a'); // NOLINT |
208 const internal::linked_ptr<const char> p4(raw_p4); | 112 const internal::linked_ptr<const char> p4(raw_p4); |
209 EXPECT_EQ(raw_p4, GetRawPointer(p4)); | 113 EXPECT_EQ(raw_p4, GetRawPointer(p4)); |
210 } | 114 } |
211 | 115 |
212 TEST(GetRawPointerTest, WorksForRawPointers) { | 116 TEST(GetRawPointerTest, WorksForRawPointers) { |
213 int* p = NULL; | 117 int* p = NULL; |
214 // Don't use EXPECT_EQ as no NULL-testing magic on Symbian. | 118 // Don't use EXPECT_EQ as no NULL-testing magic on Symbian. |
215 EXPECT_TRUE(NULL == GetRawPointer(p)); | 119 EXPECT_TRUE(NULL == GetRawPointer(p)); |
216 int n = 1; | 120 int n = 1; |
217 EXPECT_EQ(&n, GetRawPointer(&n)); | 121 EXPECT_EQ(&n, GetRawPointer(&n)); |
218 } | 122 } |
219 | 123 |
| 124 // Tests KindOf<T>. |
| 125 |
220 class Base {}; | 126 class Base {}; |
221 class Derived : public Base {}; | 127 class Derived : public Base {}; |
222 | 128 |
223 // Tests that ImplicitlyConvertible<T1, T2>::value is a compile-time constant. | |
224 TEST(ImplicitlyConvertibleTest, ValueIsCompileTimeConstant) { | |
225 GMOCK_COMPILE_ASSERT_((ImplicitlyConvertible<int, int>::value), const_true); | |
226 GMOCK_COMPILE_ASSERT_((!ImplicitlyConvertible<void*, int*>::value), | |
227 const_false); | |
228 } | |
229 | |
230 // Tests that ImplicitlyConvertible<T1, T2>::value is true when T1 can | |
231 // be implicitly converted to T2. | |
232 TEST(ImplicitlyConvertibleTest, ValueIsTrueWhenConvertible) { | |
233 EXPECT_TRUE((ImplicitlyConvertible<int, double>::value)); | |
234 EXPECT_TRUE((ImplicitlyConvertible<double, int>::value)); | |
235 EXPECT_TRUE((ImplicitlyConvertible<int*, void*>::value)); | |
236 EXPECT_TRUE((ImplicitlyConvertible<int*, const int*>::value)); | |
237 EXPECT_TRUE((ImplicitlyConvertible<Derived&, const Base&>::value)); | |
238 EXPECT_TRUE((ImplicitlyConvertible<const Base, Base>::value)); | |
239 } | |
240 | |
241 // Tests that ImplicitlyConvertible<T1, T2>::value is false when T1 | |
242 // cannot be implicitly converted to T2. | |
243 TEST(ImplicitlyConvertibleTest, ValueIsFalseWhenNotConvertible) { | |
244 EXPECT_FALSE((ImplicitlyConvertible<double, int*>::value)); | |
245 EXPECT_FALSE((ImplicitlyConvertible<void*, int*>::value)); | |
246 EXPECT_FALSE((ImplicitlyConvertible<const int*, int*>::value)); | |
247 EXPECT_FALSE((ImplicitlyConvertible<Base&, Derived&>::value)); | |
248 } | |
249 | |
250 // Tests KindOf<T>. | |
251 | |
252 TEST(KindOfTest, Bool) { | 129 TEST(KindOfTest, Bool) { |
253 EXPECT_EQ(kBool, GMOCK_KIND_OF_(bool)); // NOLINT | 130 EXPECT_EQ(kBool, GMOCK_KIND_OF_(bool)); // NOLINT |
254 } | 131 } |
255 | 132 |
256 TEST(KindOfTest, Integer) { | 133 TEST(KindOfTest, Integer) { |
257 EXPECT_EQ(kInteger, GMOCK_KIND_OF_(char)); // NOLINT | 134 EXPECT_EQ(kInteger, GMOCK_KIND_OF_(char)); // NOLINT |
258 EXPECT_EQ(kInteger, GMOCK_KIND_OF_(signed char)); // NOLINT | 135 EXPECT_EQ(kInteger, GMOCK_KIND_OF_(signed char)); // NOLINT |
259 EXPECT_EQ(kInteger, GMOCK_KIND_OF_(unsigned char)); // NOLINT | 136 EXPECT_EQ(kInteger, GMOCK_KIND_OF_(unsigned char)); // NOLINT |
260 EXPECT_EQ(kInteger, GMOCK_KIND_OF_(short)); // NOLINT | 137 EXPECT_EQ(kInteger, GMOCK_KIND_OF_(short)); // NOLINT |
261 EXPECT_EQ(kInteger, GMOCK_KIND_OF_(unsigned short)); // NOLINT | 138 EXPECT_EQ(kInteger, GMOCK_KIND_OF_(unsigned short)); // NOLINT |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
375 EXPECT_FALSE((LosslessArithmeticConvertible<double, float>::value)); | 252 EXPECT_FALSE((LosslessArithmeticConvertible<double, float>::value)); |
376 if (sizeof(double) == sizeof(long double)) { // NOLINT | 253 if (sizeof(double) == sizeof(long double)) { // NOLINT |
377 // In some implementations (e.g. MSVC), double and long double | 254 // In some implementations (e.g. MSVC), double and long double |
378 // have the same size. | 255 // have the same size. |
379 EXPECT_TRUE((LosslessArithmeticConvertible<long double, double>::value)); | 256 EXPECT_TRUE((LosslessArithmeticConvertible<long double, double>::value)); |
380 } else { | 257 } else { |
381 EXPECT_FALSE((LosslessArithmeticConvertible<long double, double>::value)); | 258 EXPECT_FALSE((LosslessArithmeticConvertible<long double, double>::value)); |
382 } | 259 } |
383 } | 260 } |
384 | 261 |
385 // Tests that IsAProtocolMessage<T>::value is a compile-time constant. | |
386 TEST(IsAProtocolMessageTest, ValueIsCompileTimeConstant) { | |
387 GMOCK_COMPILE_ASSERT_(IsAProtocolMessage<ProtocolMessage>::value, const_true); | |
388 GMOCK_COMPILE_ASSERT_(!IsAProtocolMessage<int>::value, const_false); | |
389 } | |
390 | |
391 // Tests that IsAProtocolMessage<T>::value is true when T is | |
392 // ProtocolMessage or a sub-class of it. | |
393 TEST(IsAProtocolMessageTest, ValueIsTrueWhenTypeIsAProtocolMessage) { | |
394 EXPECT_TRUE(IsAProtocolMessage< ::proto2::Message>::value); | |
395 EXPECT_TRUE(IsAProtocolMessage<ProtocolMessage>::value); | |
396 #if GMOCK_HAS_PROTOBUF_ | |
397 EXPECT_TRUE(IsAProtocolMessage<const TestMessage>::value); | |
398 #endif // GMOCK_HAS_PROTOBUF_ | |
399 } | |
400 | |
401 // Tests that IsAProtocolMessage<T>::value is false when T is neither | |
402 // ProtocolMessage nor a sub-class of it. | |
403 TEST(IsAProtocolMessageTest, ValueIsFalseWhenTypeIsNotAProtocolMessage) { | |
404 EXPECT_FALSE(IsAProtocolMessage<int>::value); | |
405 EXPECT_FALSE(IsAProtocolMessage<const Base>::value); | |
406 } | |
407 | |
408 // Tests IsContainerTest. | |
409 | |
410 class NonContainer {}; | |
411 | |
412 TEST(IsContainerTestTest, WorksForNonContainer) { | |
413 EXPECT_EQ(sizeof(IsNotContainer), sizeof(IsContainerTest<int>(0))); | |
414 EXPECT_EQ(sizeof(IsNotContainer), sizeof(IsContainerTest<char[5]>(0))); | |
415 EXPECT_EQ(sizeof(IsNotContainer), sizeof(IsContainerTest<NonContainer>(0))); | |
416 } | |
417 | |
418 TEST(IsContainerTestTest, WorksForContainer) { | |
419 EXPECT_EQ(sizeof(IsContainer), | |
420 sizeof(IsContainerTest<std::vector<bool> >(0))); | |
421 EXPECT_EQ(sizeof(IsContainer), | |
422 sizeof(IsContainerTest<std::map<int, double> >(0))); | |
423 } | |
424 | |
425 // Tests the TupleMatches() template function. | 262 // Tests the TupleMatches() template function. |
426 | 263 |
427 TEST(TupleMatchesTest, WorksForSize0) { | 264 TEST(TupleMatchesTest, WorksForSize0) { |
428 tuple<> matchers; | 265 tuple<> matchers; |
429 tuple<> values; | 266 tuple<> values; |
430 | 267 |
431 EXPECT_TRUE(TupleMatches(matchers, values)); | 268 EXPECT_TRUE(TupleMatches(matchers, values)); |
432 } | 269 } |
433 | 270 |
434 TEST(TupleMatchesTest, WorksForSize1) { | 271 TEST(TupleMatchesTest, WorksForSize1) { |
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
558 "^\nTest log\\.\nStack trace:\n")); | 395 "^\nTest log\\.\nStack trace:\n")); |
559 } else { | 396 } else { |
560 EXPECT_STREQ("", GetCapturedStdout().c_str()); | 397 EXPECT_STREQ("", GetCapturedStdout().c_str()); |
561 } | 398 } |
562 GMOCK_FLAG(verbose) = old_flag; | 399 GMOCK_FLAG(verbose) = old_flag; |
563 } | 400 } |
564 | 401 |
565 // Tests that when the stack_frames_to_skip parameter is negative, | 402 // Tests that when the stack_frames_to_skip parameter is negative, |
566 // Log() doesn't include the stack trace in the output. | 403 // Log() doesn't include the stack trace in the output. |
567 TEST(LogTest, NoStackTraceWhenStackFramesToSkipIsNegative) { | 404 TEST(LogTest, NoStackTraceWhenStackFramesToSkipIsNegative) { |
| 405 const string saved_flag = GMOCK_FLAG(verbose); |
568 GMOCK_FLAG(verbose) = kInfoVerbosity; | 406 GMOCK_FLAG(verbose) = kInfoVerbosity; |
569 CaptureStdout(); | 407 CaptureStdout(); |
570 Log(INFO, "Test log.\n", -1); | 408 Log(INFO, "Test log.\n", -1); |
571 EXPECT_STREQ("\nTest log.\n", GetCapturedStdout().c_str()); | 409 EXPECT_STREQ("\nTest log.\n", GetCapturedStdout().c_str()); |
| 410 GMOCK_FLAG(verbose) = saved_flag; |
572 } | 411 } |
573 | 412 |
574 // Tests that in opt mode, a positive stack_frames_to_skip argument is | 413 // Tests that in opt mode, a positive stack_frames_to_skip argument is |
575 // treated as 0. | 414 // treated as 0. |
576 TEST(LogTest, NoSkippingStackFrameInOptMode) { | 415 TEST(LogTest, NoSkippingStackFrameInOptMode) { |
577 CaptureStdout(); | 416 CaptureStdout(); |
578 Log(WARNING, "Test log.\n", 100); | 417 Log(WARNING, "Test log.\n", 100); |
579 const String log = GetCapturedStdout(); | 418 const String log = GetCapturedStdout(); |
580 #if defined(NDEBUG) && GTEST_GOOGLE3_MODE_ | 419 #if defined(NDEBUG) && GTEST_GOOGLE3_MODE_ |
581 // In opt mode, no stack frame should be skipped. | 420 // In opt mode, no stack frame should be skipped. |
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
728 } | 567 } |
729 | 568 |
730 // Verifies that ON_CALL prints provided _ argument. | 569 // Verifies that ON_CALL prints provided _ argument. |
731 TEST(OnCallTest, LogsAnythingArgument) { | 570 TEST(OnCallTest, LogsAnythingArgument) { |
732 EXPECT_THAT(GrabOutput(OnCallAnyArgumentLogger, kInfoVerbosity), | 571 EXPECT_THAT(GrabOutput(OnCallAnyArgumentLogger, kInfoVerbosity), |
733 HasSubstr("ON_CALL(mock, TestMethodArg(_)")); | 572 HasSubstr("ON_CALL(mock, TestMethodArg(_)")); |
734 } | 573 } |
735 | 574 |
736 #endif // GTEST_HAS_STREAM_REDIRECTION_ | 575 #endif // GTEST_HAS_STREAM_REDIRECTION_ |
737 | 576 |
738 // Tests ArrayEq(). | |
739 | |
740 TEST(ArrayEqTest, WorksForDegeneratedArrays) { | |
741 EXPECT_TRUE(ArrayEq(5, 5L)); | |
742 EXPECT_FALSE(ArrayEq('a', 0)); | |
743 } | |
744 | |
745 TEST(ArrayEqTest, WorksForOneDimensionalArrays) { | |
746 const int a[] = { 0, 1 }; | |
747 long b[] = { 0, 1 }; | |
748 EXPECT_TRUE(ArrayEq(a, b)); | |
749 EXPECT_TRUE(ArrayEq(a, 2, b)); | |
750 | |
751 b[0] = 2; | |
752 EXPECT_FALSE(ArrayEq(a, b)); | |
753 EXPECT_FALSE(ArrayEq(a, 1, b)); | |
754 } | |
755 | |
756 TEST(ArrayEqTest, WorksForTwoDimensionalArrays) { | |
757 const char a[][3] = { "hi", "lo" }; | |
758 const char b[][3] = { "hi", "lo" }; | |
759 const char c[][3] = { "hi", "li" }; | |
760 | |
761 EXPECT_TRUE(ArrayEq(a, b)); | |
762 EXPECT_TRUE(ArrayEq(a, 2, b)); | |
763 | |
764 EXPECT_FALSE(ArrayEq(a, c)); | |
765 EXPECT_FALSE(ArrayEq(a, 2, c)); | |
766 } | |
767 | |
768 // Tests ArrayAwareFind(). | |
769 | |
770 TEST(ArrayAwareFindTest, WorksForOneDimensionalArray) { | |
771 const char a[] = "hello"; | |
772 EXPECT_EQ(a + 4, ArrayAwareFind(a, a + 5, 'o')); | |
773 EXPECT_EQ(a + 5, ArrayAwareFind(a, a + 5, 'x')); | |
774 } | |
775 | |
776 TEST(ArrayAwareFindTest, WorksForTwoDimensionalArray) { | |
777 int a[][2] = { { 0, 1 }, { 2, 3 }, { 4, 5 } }; | |
778 const int b[2] = { 2, 3 }; | |
779 EXPECT_EQ(a + 1, ArrayAwareFind(a, a + 3, b)); | |
780 | |
781 const int c[2] = { 6, 7 }; | |
782 EXPECT_EQ(a + 3, ArrayAwareFind(a, a + 3, c)); | |
783 } | |
784 | |
785 // Tests CopyArray(). | |
786 | |
787 TEST(CopyArrayTest, WorksForDegeneratedArrays) { | |
788 int n = 0; | |
789 CopyArray('a', &n); | |
790 EXPECT_EQ('a', n); | |
791 } | |
792 | |
793 TEST(CopyArrayTest, WorksForOneDimensionalArrays) { | |
794 const char a[3] = "hi"; | |
795 int b[3]; | |
796 CopyArray(a, &b); | |
797 EXPECT_TRUE(ArrayEq(a, b)); | |
798 | |
799 int c[3]; | |
800 CopyArray(a, 3, c); | |
801 EXPECT_TRUE(ArrayEq(a, c)); | |
802 } | |
803 | |
804 TEST(CopyArrayTest, WorksForTwoDimensionalArrays) { | |
805 const int a[2][3] = { { 0, 1, 2 }, { 3, 4, 5 } }; | |
806 int b[2][3]; | |
807 CopyArray(a, &b); | |
808 EXPECT_TRUE(ArrayEq(a, b)); | |
809 | |
810 int c[2][3]; | |
811 CopyArray(a, 2, c); | |
812 EXPECT_TRUE(ArrayEq(a, c)); | |
813 } | |
814 | |
815 // Tests NativeArray. | |
816 | |
817 TEST(NativeArrayTest, ConstructorFromArrayWorks) { | |
818 const int a[3] = { 0, 1, 2 }; | |
819 NativeArray<int> na(a, 3, kReference); | |
820 EXPECT_EQ(3U, na.size()); | |
821 EXPECT_EQ(a, na.begin()); | |
822 } | |
823 | |
824 TEST(NativeArrayTest, CreatesAndDeletesCopyOfArrayWhenAskedTo) { | |
825 typedef int Array[2]; | |
826 Array* a = new Array[1]; | |
827 (*a)[0] = 0; | |
828 (*a)[1] = 1; | |
829 NativeArray<int> na(*a, 2, kCopy); | |
830 EXPECT_NE(*a, na.begin()); | |
831 delete[] a; | |
832 EXPECT_EQ(0, na.begin()[0]); | |
833 EXPECT_EQ(1, na.begin()[1]); | |
834 | |
835 // We rely on the heap checker to verify that na deletes the copy of | |
836 // array. | |
837 } | |
838 | |
839 TEST(NativeArrayTest, TypeMembersAreCorrect) { | |
840 StaticAssertTypeEq<char, NativeArray<char>::value_type>(); | |
841 StaticAssertTypeEq<int[2], NativeArray<int[2]>::value_type>(); | |
842 | |
843 StaticAssertTypeEq<const char*, NativeArray<char>::const_iterator>(); | |
844 StaticAssertTypeEq<const bool(*)[2], NativeArray<bool[2]>::const_iterator>(); | |
845 } | |
846 | |
847 TEST(NativeArrayTest, MethodsWork) { | |
848 const int a[3] = { 0, 1, 2 }; | |
849 NativeArray<int> na(a, 3, kCopy); | |
850 ASSERT_EQ(3U, na.size()); | |
851 EXPECT_EQ(3, na.end() - na.begin()); | |
852 | |
853 NativeArray<int>::const_iterator it = na.begin(); | |
854 EXPECT_EQ(0, *it); | |
855 ++it; | |
856 EXPECT_EQ(1, *it); | |
857 it++; | |
858 EXPECT_EQ(2, *it); | |
859 ++it; | |
860 EXPECT_EQ(na.end(), it); | |
861 | |
862 EXPECT_THAT(na, Eq(na)); | |
863 | |
864 NativeArray<int> na2(a, 3, kReference); | |
865 EXPECT_THAT(na, Eq(na2)); | |
866 | |
867 const int b1[3] = { 0, 1, 1 }; | |
868 const int b2[4] = { 0, 1, 2, 3 }; | |
869 EXPECT_THAT(na, Not(Eq(NativeArray<int>(b1, 3, kReference)))); | |
870 EXPECT_THAT(na, Not(Eq(NativeArray<int>(b2, 4, kCopy)))); | |
871 } | |
872 | |
873 TEST(NativeArrayTest, WorksForTwoDimensionalArray) { | |
874 const char a[2][3] = { "hi", "lo" }; | |
875 NativeArray<char[3]> na(a, 2, kReference); | |
876 ASSERT_EQ(2U, na.size()); | |
877 EXPECT_EQ(a, na.begin()); | |
878 } | |
879 | |
880 // Tests StlContainerView. | 577 // Tests StlContainerView. |
881 | 578 |
882 TEST(StlContainerViewTest, WorksForStlContainer) { | 579 TEST(StlContainerViewTest, WorksForStlContainer) { |
883 StaticAssertTypeEq<std::vector<int>, | 580 StaticAssertTypeEq<std::vector<int>, |
884 StlContainerView<std::vector<int> >::type>(); | 581 StlContainerView<std::vector<int> >::type>(); |
885 StaticAssertTypeEq<const std::vector<double>&, | 582 StaticAssertTypeEq<const std::vector<double>&, |
886 StlContainerView<std::vector<double> >::const_reference>(); | 583 StlContainerView<std::vector<double> >::const_reference>(); |
887 | 584 |
888 typedef std::vector<char> Chars; | 585 typedef std::vector<char> Chars; |
889 Chars v1; | 586 Chars v1; |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
946 EXPECT_EQ(2, a3.begin()[2]); | 643 EXPECT_EQ(2, a3.begin()[2]); |
947 | 644 |
948 // Makes sure a1 and a3 aren't aliases. | 645 // Makes sure a1 and a3 aren't aliases. |
949 a1[0] = 3; | 646 a1[0] = 3; |
950 EXPECT_EQ(0, a3.begin()[0]); | 647 EXPECT_EQ(0, a3.begin()[0]); |
951 } | 648 } |
952 | 649 |
953 } // namespace | 650 } // namespace |
954 } // namespace internal | 651 } // namespace internal |
955 } // namespace testing | 652 } // namespace testing |
OLD | NEW |