OLD | NEW |
(Empty) | |
| 1 // Copyright 2014 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 "config.h" |
| 6 #include "core/html/StableState.h" |
| 7 |
| 8 #include "wtf/Functional.h" |
| 9 |
| 10 #include <gmock/gmock.h> |
| 11 #include <gtest/gtest.h> |
| 12 |
| 13 using WebCore::StableState; |
| 14 |
| 15 namespace { |
| 16 |
| 17 class MockAwaiter : public StableState::Awaiter { |
| 18 public: |
| 19 MOCK_METHOD0(didAwaitStableState, void()); |
| 20 }; |
| 21 |
| 22 TEST(StableState, Await) |
| 23 { |
| 24 MockAwaiter awaiter; |
| 25 EXPECT_CALL(awaiter, didAwaitStableState()).Times(0); |
| 26 StableState::await(awaiter); |
| 27 } |
| 28 |
| 29 TEST(StableState, AwaitProvide) |
| 30 { |
| 31 MockAwaiter awaiter; |
| 32 EXPECT_CALL(awaiter, didAwaitStableState()).Times(1); |
| 33 StableState::await(awaiter); |
| 34 StableState::provide(); |
| 35 } |
| 36 |
| 37 TEST(StableState, AwaitProvideTwice) |
| 38 { |
| 39 MockAwaiter awaiter; |
| 40 EXPECT_CALL(awaiter, didAwaitStableState()).Times(1); |
| 41 StableState::await(awaiter); |
| 42 StableState::provide(); |
| 43 StableState::provide(); |
| 44 } |
| 45 |
| 46 TEST(StableState, AwaitTwiceProvide) |
| 47 { |
| 48 MockAwaiter awaiter; |
| 49 EXPECT_CALL(awaiter, didAwaitStableState()).Times(1); |
| 50 StableState::await(awaiter); |
| 51 StableState::await(awaiter); |
| 52 StableState::provide(); |
| 53 } |
| 54 |
| 55 TEST(StableState, AwaitProvideAwaitProvide) |
| 56 { |
| 57 MockAwaiter awaiter; |
| 58 EXPECT_CALL(awaiter, didAwaitStableState()).Times(2); |
| 59 StableState::await(awaiter); |
| 60 StableState::provide(); |
| 61 StableState::await(awaiter); |
| 62 StableState::provide(); |
| 63 } |
| 64 |
| 65 TEST(StableState, TwoAwaiters) |
| 66 { |
| 67 MockAwaiter awaiter1; |
| 68 MockAwaiter awaiter2; |
| 69 EXPECT_CALL(awaiter1, didAwaitStableState()).Times(1); |
| 70 EXPECT_CALL(awaiter2, didAwaitStableState()).Times(1); |
| 71 StableState::await(awaiter1); |
| 72 StableState::await(awaiter2); |
| 73 StableState::provide(); |
| 74 } |
| 75 |
| 76 // Test that awaiting in the callback has no effect. |
| 77 |
| 78 class RecursiveAwaiter : public StableState::Awaiter { |
| 79 public: |
| 80 MOCK_METHOD0(callback, void()); |
| 81 virtual void didAwaitStableState() OVERRIDE |
| 82 { |
| 83 callback(); |
| 84 StableState::await(*this); |
| 85 } |
| 86 }; |
| 87 |
| 88 TEST(StableState, AwaitDuringProvide) |
| 89 { |
| 90 RecursiveAwaiter awaiter; |
| 91 EXPECT_CALL(awaiter, callback()).Times(1); |
| 92 StableState::await(awaiter); |
| 93 StableState::provide(); |
| 94 StableState::provide(); |
| 95 } |
| 96 |
| 97 // Test that a class can await a stable state and invoke one of two callbacks |
| 98 // without inheriting StableState::Awaiter or having state bits. |
| 99 |
| 100 class MockCallbacks { |
| 101 public: |
| 102 MOCK_METHOD0(callback1, void()); |
| 103 MOCK_METHOD0(callback2, void()); |
| 104 }; |
| 105 |
| 106 class ClosureAwaiter : public StableState::Awaiter { |
| 107 public: |
| 108 ClosureAwaiter(const Closure& closure) : m_closure(closure) { } |
| 109 virtual void didAwaitStableState() OVERRIDE |
| 110 { |
| 111 m_closure(); |
| 112 delete this; |
| 113 } |
| 114 private: |
| 115 Closure m_closure; |
| 116 }; |
| 117 |
| 118 TEST(StableState, ClosureAwaiter) |
| 119 { |
| 120 MockCallbacks callbacks; |
| 121 EXPECT_CALL(callbacks, callback1()).Times(2); |
| 122 EXPECT_CALL(callbacks, callback2()).Times(1); |
| 123 StableState::await(*new ClosureAwaiter(bind(&MockCallbacks::callback1, &call
backs))); |
| 124 StableState::await(*new ClosureAwaiter(bind(&MockCallbacks::callback2, &call
backs))); |
| 125 StableState::await(*new ClosureAwaiter(bind(&MockCallbacks::callback1, &call
backs))); |
| 126 StableState::provide(); |
| 127 } |
| 128 |
| 129 } // namespace |
OLD | NEW |