Skip to content

Commit

Permalink
This adds adds four macros when compiling using GTEST_OS_MAC:
Browse files Browse the repository at this point in the history
{ASSERT,EXPECT}_NS{NE,EQ}.  These test ObjC objects using |-isEqual:| and
prints failures using the |-description| selector.  This allows for better
debugging output with ObjC++ test cases.

BUG=http://code.google.com/p/googletest/issues/detail?id=303
TEST=Covered by unit tests.

Review URL: http://codereview.chromium.org/3028047

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@55180 0039d316-1c4b-4281-b951-d872f2087c98
  • Loading branch information
rsesek@chromium.org committed Aug 6, 2010
1 parent 8abe765 commit ecebcc9
Show file tree
Hide file tree
Showing 5 changed files with 151 additions and 0 deletions.
1 change: 1 addition & 0 deletions chrome/chrome_tests.gypi
Original file line number Diff line number Diff line change
Expand Up @@ -1233,6 +1233,7 @@
'test/v8_unit_test.cc',
'test/v8_unit_test.h',
'tools/convert_dict/convert_dict_unittest.cc',
'../testing/gtest_mac_unittest.mm',
'../third_party/cld/encodings/compact_lang_det/compact_lang_det_unittest_small.cc',
# TODO(jcampan): Create a separate unit test for these to allow us to
# test views completely decoupled from chrome.
Expand Down
2 changes: 2 additions & 0 deletions testing/gtest.gyp
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,8 @@
'conditions': [
['OS == "mac"', {
'sources': [
'gtest_mac.h',
'gtest_mac.mm',
'platform_test_mac.mm'
],
'link_settings': {
Expand Down
48 changes: 48 additions & 0 deletions testing/gtest_mac.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef TESTING_GTEST_MAC_H_
#define TESTING_GTEST_MAC_H_

#include <gtest/internal/gtest-port.h>
#include <gtest/gtest.h>

#ifdef GTEST_OS_MAC

#import <Foundation/Foundation.h>

namespace testing {
namespace internal {

// This overloaded version allows comparison between ObjC objects that conform
// to the NSObject protocol. Used to implement {ASSERT|EXPECT}_EQ().
GTEST_API_ AssertionResult CmpHelperNSEQ(const char* expected_expression,
const char* actual_expression,
id<NSObject> expected,
id<NSObject> actual);

// This overloaded version allows comparison between ObjC objects that conform
// to the NSObject protocol. Used to implement {ASSERT|EXPECT}_NE().
GTEST_API_ AssertionResult CmpHelperNSNE(const char* expected_expression,
const char* actual_expression,
id<NSObject> expected,
id<NSObject> actual);

} // namespace internal
} // namespace testing

// Tests that [expected isEqual:actual].
#define EXPECT_NSEQ(expected, actual) \
EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperNSEQ, expected, actual)
#define EXPECT_NSNE(val1, val2) \
EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperNSNE, val1, val2)

#define ASSERT_NSEQ(expected, actual) \
ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperNSEQ, expected, actual)
#define ASSERT_NSNE(val1, val2) \
ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperNSNE, val1, val2)

#endif // GTEST_OS_MAC

#endif // TESTING_GTEST_MAC_H_
53 changes: 53 additions & 0 deletions testing/gtest_mac.mm
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#import "gtest_mac.h"

#include <gtest/internal/gtest-port.h>
#include <gtest/internal/gtest-string.h>
#include <gtest/gtest.h>

#ifdef GTEST_OS_MAC

#import <Foundation/Foundation.h>

namespace testing {
namespace internal {

// This overloaded version allows comparison between ObjC objects that conform
// to the NSObject protocol. Used to implement {ASSERT|EXPECT}_EQ().
GTEST_API_ AssertionResult CmpHelperNSEQ(const char* expected_expression,
const char* actual_expression,
id<NSObject> expected,
id<NSObject> actual) {
if ([expected isEqual:actual]) {
return AssertionSuccess();
}
return EqFailure(expected_expression,
actual_expression,
String([[expected description] UTF8String]),
String([[actual description] UTF8String]),
false);
}

// This overloaded version allows comparison between ObjC objects that conform
// to the NSObject protocol. Used to implement {ASSERT|EXPECT}_NE().
GTEST_API_ AssertionResult CmpHelperNSNE(const char* expected_expression,
const char* actual_expression,
id<NSObject> expected,
id<NSObject> actual) {
if (![expected isEqual:actual]) {
return AssertionSuccess();
}
Message msg;
msg << "Expected: (" << expected_expression << ") != (" << actual_expression
<< "), actual: " << String([[expected description] UTF8String])
<< " vs " << String([[actual description] UTF8String]);
return AssertionFailure(msg);
}

} // namespace internal
} // namespace testing

#endif // GTEST_OS_MAC
47 changes: 47 additions & 0 deletions testing/gtest_mac_unittest.mm
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Note that while this file is in testing/ and tests GTest macros, it is built
// as part of Chromium's unit_tests target because the project does not build
// or run GTest's internal test suite.

#import "testing/gtest_mac.h"

#import <Foundation/Foundation.h>

#include "base/scoped_nsautorelease_pool.h"
#include "testing/gtest/include/gtest/internal/gtest-port.h"
#include "testing/gtest/include/gtest/gtest.h"

TEST(GTestMac, ExpectNSEQ) {
base::ScopedNSAutoreleasePool pool;

EXPECT_NSEQ(@"a", @"a");

NSString* s1 = [NSString stringWithUTF8String:"a"];
NSString* s2 = [NSString stringWithString:@"a"];
EXPECT_NE(s1, s2);
EXPECT_NSEQ(s1, s2);
}

TEST(GTestMac, AssertNSEQ) {
base::ScopedNSAutoreleasePool pool;

NSNumber* n1 = [NSNumber numberWithInt:42];
NSNumber* n2 = [NSNumber numberWithInt:42];
EXPECT_NE(n1, n2);
ASSERT_NSEQ(n1, n2);
}

TEST(GTestMac, ExpectNSNE) {
base::ScopedNSAutoreleasePool pool;

EXPECT_NSNE([NSNumber numberWithInt:2], [NSNumber numberWithInt:42]);
}

TEST(GTestMac, AssertNSNE) {
base::ScopedNSAutoreleasePool pool;

ASSERT_NSNE(@"a", @"b");
}

0 comments on commit ecebcc9

Please sign in to comment.