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