gtest_mac.mm 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. // Copyright (c) 2010 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #import "gtest_mac.h"
  5. #include <string>
  6. #include "testing/gtest/include/gtest/gtest.h"
  7. #include "third_party/googletest/src/googletest/include/gtest/internal/gtest-port.h"
  8. #include "third_party/googletest/src/googletest/include/gtest/internal/gtest-string.h"
  9. #ifdef GTEST_OS_MAC
  10. #import <Foundation/Foundation.h>
  11. namespace testing {
  12. namespace internal {
  13. static std::string StringFromNSString(NSString* string) {
  14. // Note that -[NSString UTF8String] is banned in chromium code because
  15. // base::SysNSStringToUTF8() is safer, but //testing isn't allowed to depend
  16. // on //base, so deliberately ignore that function ban.
  17. const char* utf_string = [string UTF8String];
  18. return utf_string ? std::string(utf_string) : std::string("(nil nsstring)");
  19. }
  20. // Handles nil values for |obj| properly by using safe printing of %@ in
  21. // -stringWithFormat:.
  22. std::string StringDescription(id<NSObject> obj) {
  23. return StringFromNSString([NSString stringWithFormat:@"%@", obj]);
  24. }
  25. // This overloaded version allows comparison between ObjC objects that conform
  26. // to the NSObject protocol. Used to implement {ASSERT|EXPECT}_EQ().
  27. GTEST_API_ AssertionResult CmpHelperNSEQ(const char* expected_expression,
  28. const char* actual_expression,
  29. id<NSObject> expected,
  30. id<NSObject> actual) {
  31. if (expected == actual || [expected isEqual:actual]) {
  32. return AssertionSuccess();
  33. }
  34. return EqFailure(expected_expression, actual_expression,
  35. StringDescription(expected), StringDescription(actual),
  36. false);
  37. }
  38. // This overloaded version allows comparison between ObjC objects that conform
  39. // to the NSObject protocol. Used to implement {ASSERT|EXPECT}_NE().
  40. GTEST_API_ AssertionResult CmpHelperNSNE(const char* expected_expression,
  41. const char* actual_expression,
  42. id<NSObject> expected,
  43. id<NSObject> actual) {
  44. if (expected != actual && ![expected isEqual:actual]) {
  45. return AssertionSuccess();
  46. }
  47. Message msg;
  48. msg << "Expected: (" << expected_expression << ") != (" << actual_expression
  49. << "), actual: " << StringDescription(expected)
  50. << " vs " << StringDescription(actual);
  51. return AssertionFailure(msg);
  52. }
  53. #if !defined(GTEST_OS_IOS)
  54. GTEST_API_ AssertionResult CmpHelperNSEQ(const char* expected_expression,
  55. const char* actual_expression,
  56. const NSRect& expected,
  57. const NSRect& actual) {
  58. if (NSEqualRects(expected, actual)) {
  59. return AssertionSuccess();
  60. }
  61. return EqFailure(expected_expression, actual_expression,
  62. StringFromNSString(NSStringFromRect(expected)),
  63. StringFromNSString(NSStringFromRect(actual)), false);
  64. }
  65. GTEST_API_ AssertionResult CmpHelperNSNE(const char* expected_expression,
  66. const char* actual_expression,
  67. const NSRect& expected,
  68. const NSRect& actual) {
  69. if (!NSEqualRects(expected, actual)) {
  70. return AssertionSuccess();
  71. }
  72. Message msg;
  73. msg << "Expected: (" << expected_expression << ") != (" << actual_expression
  74. << "), actual: " << StringFromNSString(NSStringFromRect(expected))
  75. << " vs " << StringFromNSString(NSStringFromRect(actual));
  76. return AssertionFailure(msg);
  77. }
  78. GTEST_API_ AssertionResult CmpHelperNSEQ(const char* expected_expression,
  79. const char* actual_expression,
  80. const NSPoint& expected,
  81. const NSPoint& actual) {
  82. if (NSEqualPoints(expected, actual)) {
  83. return AssertionSuccess();
  84. }
  85. return EqFailure(expected_expression, actual_expression,
  86. StringFromNSString(NSStringFromPoint(expected)),
  87. StringFromNSString(NSStringFromPoint(actual)), false);
  88. }
  89. GTEST_API_ AssertionResult CmpHelperNSNE(const char* expected_expression,
  90. const char* actual_expression,
  91. const NSPoint& expected,
  92. const NSPoint& actual) {
  93. if (!NSEqualPoints(expected, actual)) {
  94. return AssertionSuccess();
  95. }
  96. Message msg;
  97. msg << "Expected: (" << expected_expression << ") != (" << actual_expression
  98. << "), actual: " << StringFromNSString(NSStringFromPoint(expected))
  99. << " vs " << StringFromNSString(NSStringFromPoint(actual));
  100. return AssertionFailure(msg);
  101. }
  102. GTEST_API_ AssertionResult CmpHelperNSEQ(const char* expected_expression,
  103. const char* actual_expression,
  104. const NSRange& expected,
  105. const NSRange& actual) {
  106. if (NSEqualRanges(expected, actual)) {
  107. return AssertionSuccess();
  108. }
  109. return EqFailure(expected_expression, actual_expression,
  110. StringFromNSString(NSStringFromRange(expected)),
  111. StringFromNSString(NSStringFromRange(actual)), false);
  112. }
  113. GTEST_API_ AssertionResult CmpHelperNSNE(const char* expected_expression,
  114. const char* actual_expression,
  115. const NSRange& expected,
  116. const NSRange& actual) {
  117. if (!NSEqualRanges(expected, actual)) {
  118. return AssertionSuccess();
  119. }
  120. Message msg;
  121. msg << "Expected: (" << expected_expression << ") != (" << actual_expression
  122. << "), actual: " << StringFromNSString(NSStringFromRange(expected))
  123. << " vs " << StringFromNSString(NSStringFromRange(actual));
  124. return AssertionFailure(msg);
  125. }
  126. #endif // !GTEST_OS_IOS
  127. } // namespace internal
  128. } // namespace testing
  129. #endif // GTEST_OS_MAC