Index: chrome/browser/cocoa/cocoa_test_helper.h |
=================================================================== |
--- chrome/browser/cocoa/cocoa_test_helper.h (revision 29916) |
+++ chrome/browser/cocoa/cocoa_test_helper.h (working copy) |
@@ -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 @@ |
} |
}; |
+// 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 @@ |
// Set |window_| to pretend to be key and make |aView| its |
// firstResponder. |
void makeFirstResponder(NSView* aView) { |
+ [window_ makeFirstResponder:aView]; |
[window_ setPretendIsKeyWindow:YES]; |
- [window_ makeFirstResponder:aView]; |
} |
// Clear |window_| firstResponder and stop pretending to be key. |
void clearFirstResponder() { |
+ [window_ setPretendIsKeyWindow:NO]; |
[window_ makeFirstResponder:nil]; |
- [window_ setPretendIsKeyWindow:NO]; |
} |
private: |