1// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "chrome/browser/ui/cocoa/run_loop_testing.h"
6
7#import <Foundation/Foundation.h>
8
9#include "base/mac/scoped_nsobject.h"
10#include "testing/gtest/include/gtest/gtest.h"
11
12@interface TestDelayed : NSObject {
13 @private
14  BOOL didWork_;
15  TestDelayed* next_;
16}
17@property(readonly, nonatomic) BOOL didWork;
18@property(assign, nonatomic) TestDelayed* next;
19@end
20
21@implementation TestDelayed
22@synthesize didWork = didWork_;
23@synthesize next = next_;
24
25- (id)init {
26  if ((self = [super init])) {
27    [self performSelector:@selector(doWork) withObject:nil afterDelay:0];
28  }
29  return self;
30}
31
32- (void)doWork {
33  didWork_ = YES;
34  [next_ performSelector:@selector(doWork) withObject:nil afterDelay:0];
35}
36@end
37
38TEST(RunLoopTesting, RunAllPending) {
39  base::scoped_nsobject<TestDelayed> tester([[TestDelayed alloc] init]);
40  EXPECT_FALSE([tester didWork]);
41
42  chrome::testing::NSRunLoopRunAllPending();
43
44  EXPECT_TRUE([tester didWork]);
45}
46
47TEST(RunLoopTesting, NestedWork) {
48  base::scoped_nsobject<TestDelayed> tester([[TestDelayed alloc] init]);
49  base::scoped_nsobject<TestDelayed> nested([[TestDelayed alloc] init]);
50  [tester setNext:nested];
51
52  EXPECT_FALSE([tester didWork]);
53  EXPECT_FALSE([nested didWork]);
54
55  chrome::testing::NSRunLoopRunAllPending();
56
57  EXPECT_TRUE([tester didWork]);
58  EXPECT_TRUE([nested didWork]);
59}
60