summaryrefslogtreecommitdiffstats
path: root/chrome/browser/cocoa/cocoa_test_helper.h
diff options
context:
space:
mode:
authordmaclach@chromium.org <dmaclach@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-10-23 19:41:04 +0000
committerdmaclach@chromium.org <dmaclach@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-10-23 19:41:04 +0000
commitc743b0591ddaa6b2d550be938153c273853e167e (patch)
tree7aec146b0deef8ef7899d1c12237f7809cc0c731 /chrome/browser/cocoa/cocoa_test_helper.h
parent72512a9af1270285600905f0084cd0cd730688b2 (diff)
downloadchromium_src-c743b0591ddaa6b2d550be938153c273853e167e.zip
chromium_src-c743b0591ddaa6b2d550be938153c273853e167e.tar.gz
chromium_src-c743b0591ddaa6b2d550be938153c273853e167e.tar.bz2
Basic test class that is going to replace CocoaTestHelper and CocoaNoWindowTestHelper.
Is responsible for bootstrapping cocoa and verifying that all windows are closed down correctly between tests. Also includes a macro for doing some very repetitive view testing that we had multiple copies of. I included a single changed over test so that you can see the difference. BUG=none TEST=none Review URL: http://codereview.chromium.org/327010 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@29928 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/cocoa/cocoa_test_helper.h')
-rw-r--r--chrome/browser/cocoa/cocoa_test_helper.h100
1 files changed, 93 insertions, 7 deletions
diff --git a/chrome/browser/cocoa/cocoa_test_helper.h b/chrome/browser/cocoa/cocoa_test_helper.h
index 1627391..f980790 100644
--- a/chrome/browser/cocoa/cocoa_test_helper.h
+++ b/chrome/browser/cocoa/cocoa_test_helper.h
@@ -6,18 +6,21 @@
#define CHROME_BROWSER_COCOA_COCOA_TEST_HELPER_H_
#import <Cocoa/Cocoa.h>
+#include <vector>
#include "base/debug_util.h"
#include "base/file_path.h"
#include "base/mac_util.h"
#include "base/path_service.h"
+#import "base/scoped_nsautorelease_pool.h"
#import "base/scoped_nsobject.h"
+#include "base/scoped_ptr.h"
#include "chrome/common/chrome_constants.h"
+#include "testing/platform_test.h"
// Background windows normally will not display things such as focus
// rings. This class allows -isKeyWindow to be manipulated to test
// such things.
-
@interface CocoaTestHelperWindow : NSWindow {
@private
BOOL pretendIsKeyWindow_;
@@ -29,6 +32,15 @@
// Init with a default frame.
- (id)init;
+// Sets the responder passed in as first responder, and sets the window
+// so that it will return "YES" if asked if it key window. It does not actually
+// make the window key.
+- (void)makePretendKeyWindowAndSetFirstResponder:(NSResponder*)responder;
+
+// Clears the first responder duty for the window and returns the window
+// to being non-key.
+- (void)clearPretendKeyWindowAndFirstResponder;
+
// Set value to return for -isKeyWindow.
- (void)setPretendIsKeyWindow:(BOOL)isKeyWindow;
@@ -36,6 +48,77 @@
@end
+// A test class that all tests that depend on AppKit should inherit from.
+// Sets up NSApplication and paths correctly, and makes sure that any windows
+// created in the test are closed down properly by the test. If you need to
+// inherit from a different test class, but need to set up the AppKit runtime
+// environment, you can call BootstrapCocoa directly from your test class. You
+// will have to deal with windows on your own though.
+class CocoaTest : public PlatformTest {
+ public:
+ // Sets up AppKit and paths correctly for unit tests. If you can't inherit
+ // from CocoaTest but are going to be using any AppKit features directly,
+ // or indirectly, you should be calling this from the c'tor or SetUp methods
+ // of your test class.
+ static void BootstrapCocoa();
+
+ CocoaTest();
+ virtual ~CocoaTest();
+
+ // Must be called by subclasses that override TearDown. We verify that it
+ // is called in our destructor. Takes care of making sure that all windows
+ // are closed off correctly. If your tests open windows, they must be sure
+ // to close them before CocoaTest::TearDown is called. A standard way of doing
+ // this would be to create them in SetUp (after calling CocoaTest::Setup) and
+ // then close them in TearDown before calling CocoaTest::TearDown.
+ virtual void TearDown();
+
+ // Retuns a test window that can be used by views and other UI objects
+ // as part of their tests. Is created lazily, and will be closed correctly
+ // in CocoaTest::TearDown. Note that it is a CocoaTestHelperWindow which
+ // has special handling for being Key.
+ CocoaTestHelperWindow* test_window();
+
+ private:
+ // Return a vector of currently open windows. Note that it is a vector
+ // instead of an NSArray because we don't want any retains placed on the
+ // windows in it and that the windows in this list may no longer be valid
+ // NSWindows any time after this returns. You can only use the pointer values
+ // in the vector for comparison purposes.
+ static std::vector<NSWindow*> ApplicationWindows();
+
+ bool called_tear_down_;
+ base::ScopedNSAutoreleasePool pool_;
+ std::vector<NSWindow*> initial_windows_;
+ // Strong. Lazily created. This isn't wrapped in a scoped_nsobject because
+ // we want to call [close] to destroy it rather than calling [release]. We
+ // want to verify that [close] is actually removing our window and that it's
+ // not hanging around because releaseWhenClosed was set to "no" on the window.
+ // It isn't wrapped in a different wrapper class to close it because we
+ // need to close it at a very specific time; just before we enter our clean
+ // up loop in TearDown.
+ CocoaTestHelperWindow* test_window_;
+};
+
+// A macro defining a standard set of tests to run on a view. Since we can't
+// inherit tests, this macro saves us a lot of duplicate code. Handles simply
+// displaying the view to make sure it won't crash, as well as removing it
+// from a window. All tests that work with NSView subclasses and/or
+// NSViewController subclasses should use it.
+#define TEST_VIEW(test_fixture, view_member_name) \
+ TEST_F(test_fixture, AddRemove##test_fixture) { \
+ scoped_nsobject<NSView> view([view_member_name retain]); \
+ EXPECT_EQ([test_window() contentView], [view_member_name superview]); \
+ [view_member_name removeFromSuperview]; \
+ EXPECT_FALSE([view_member_name superview]); \
+ } \
+ TEST_F(test_fixture, Display##test_fixture) { \
+ [view_member_name display]; \
+ }
+
+// The classes below are deprecated and will be removed shortly. Do not write
+// any tests based on them.
+
// A class that initializes Cocoa and sets up resources for many of our
// Cocoa controller unit tests. It does several key things:
// - Creates and displays an empty Cocoa window for views to live in
@@ -48,10 +131,10 @@
// testing::Test.
// Provides the Cocoa goodness without the extraneous window.
-// TODO(shess): It might make more sense to have CocoaTest as a
-// PlatformTest subclass which adds the Cocoa magic, then
-// CocoaViewTest as a further subclass which provides a convenience
-// window.
+
+// DEPRECATED
+// TODO(dmaclach): remove as soon as I can get my other CLs in that get rid
+// of any dependencies on this. 10/30/09 at the latest.
class CocoaNoWindowTestHelper {
public:
CocoaNoWindowTestHelper() {
@@ -70,6 +153,9 @@ class CocoaNoWindowTestHelper {
}
};
+// DEPRECATED
+// TODO(dmaclach): remove as soon as I can get my other CLs in that get rid
+// of any dependencies on this. 10/30/09 at the latest.
class CocoaTestHelper : public CocoaNoWindowTestHelper {
public:
CocoaTestHelper() {
@@ -88,14 +174,14 @@ class CocoaTestHelper : public CocoaNoWindowTestHelper {
// Set |window_| to pretend to be key and make |aView| its
// firstResponder.
void makeFirstResponder(NSView* aView) {
- [window_ setPretendIsKeyWindow:YES];
[window_ makeFirstResponder:aView];
+ [window_ setPretendIsKeyWindow:YES];
}
// Clear |window_| firstResponder and stop pretending to be key.
void clearFirstResponder() {
- [window_ makeFirstResponder:nil];
[window_ setPretendIsKeyWindow:NO];
+ [window_ makeFirstResponder:nil];
}
private: