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