2 * Copyright (C) 2013 Google Inc. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are
8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above
11 * copyright notice, this list of conditions and the following disclaimer
12 * in the documentation and/or other materials provided with the
14 * * Neither the name of Google Inc. nor the names of its
15 * contributors may be used to endorse or promote products derived from
16 * this software without specific prior written permission.
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 #include "bindings/v8/ScriptPromiseResolver.h"
34 #include "bindings/v8/ScriptPromise.h"
35 #include "bindings/v8/V8Binding.h"
37 #include <gtest/gtest.h>
44 class Function : public ScriptFunction {
46 static PassOwnPtr<Function> create(v8::Isolate* isolate, String* value)
48 return adoptPtr(new Function(isolate, value));
51 virtual ScriptValue call(ScriptValue value) OVERRIDE
53 ASSERT(!value.isEmpty());
54 *m_value = toCoreString(value.v8Value()->ToString());
59 Function(v8::Isolate* isolate, String* value) : ScriptFunction(isolate), m_value(value) { }
64 class ScriptPromiseResolverTest : public testing::Test {
66 ScriptPromiseResolverTest()
67 : m_scope(v8::Isolate::GetCurrent())
69 m_resolver = ScriptPromiseResolver::create(m_scope.scriptState());
72 virtual ~ScriptPromiseResolverTest()
74 // Run all pending microtasks here.
75 isolate()->RunMicrotasks();
78 v8::Isolate* isolate() { return m_scope.isolate(); }
81 RefPtr<ScriptPromiseResolver> m_resolver;
82 V8TestingScope m_scope;
85 TEST_F(ScriptPromiseResolverTest, initialState)
87 ScriptPromise promise = m_resolver->promise();
88 ASSERT_FALSE(promise.isEmpty());
89 String onFulfilled, onRejected;
90 promise.then(Function::create(isolate(), &onFulfilled), Function::create(isolate(), &onRejected));
92 EXPECT_EQ(String(), onFulfilled);
93 EXPECT_EQ(String(), onRejected);
95 isolate()->RunMicrotasks();
97 EXPECT_EQ(String(), onFulfilled);
98 EXPECT_EQ(String(), onRejected);
101 TEST_F(ScriptPromiseResolverTest, resolve)
103 ScriptPromise promise = m_resolver->promise();
104 ASSERT_FALSE(promise.isEmpty());
105 String onFulfilled, onRejected;
106 promise.then(Function::create(isolate(), &onFulfilled), Function::create(isolate(), &onRejected));
108 EXPECT_EQ(String(), onFulfilled);
109 EXPECT_EQ(String(), onRejected);
111 m_resolver->resolve("hello");
112 EXPECT_TRUE(m_resolver->promise().isEmpty());
113 isolate()->RunMicrotasks();
115 EXPECT_EQ("hello", onFulfilled);
116 EXPECT_EQ(String(), onRejected);
119 TEST_F(ScriptPromiseResolverTest, reject)
121 ScriptPromise promise = m_resolver->promise();
122 ASSERT_FALSE(promise.isEmpty());
123 String onFulfilled, onRejected;
124 promise.then(Function::create(isolate(), &onFulfilled), Function::create(isolate(), &onRejected));
126 EXPECT_EQ(String(), onFulfilled);
127 EXPECT_EQ(String(), onRejected);
129 m_resolver->reject("hello");
130 EXPECT_TRUE(m_resolver->promise().isEmpty());
131 isolate()->RunMicrotasks();
133 EXPECT_EQ(String(), onFulfilled);
134 EXPECT_EQ("hello", onRejected);
137 TEST_F(ScriptPromiseResolverTest, resolveOverResolve)
139 ScriptPromise promise = m_resolver->promise();
140 ASSERT_FALSE(promise.isEmpty());
141 String onFulfilled, onRejected;
142 promise.then(Function::create(isolate(), &onFulfilled), Function::create(isolate(), &onRejected));
144 EXPECT_EQ(String(), onFulfilled);
145 EXPECT_EQ(String(), onRejected);
147 m_resolver->resolve("hello");
148 EXPECT_TRUE(m_resolver->promise().isEmpty());
149 isolate()->RunMicrotasks();
151 EXPECT_EQ("hello", onFulfilled);
152 EXPECT_EQ(String(), onRejected);
154 m_resolver->resolve("world");
155 isolate()->RunMicrotasks();
157 EXPECT_EQ("hello", onFulfilled);
158 EXPECT_EQ(String(), onRejected);
161 TEST_F(ScriptPromiseResolverTest, rejectOverResolve)
163 ScriptPromise promise = m_resolver->promise();
164 ASSERT_FALSE(promise.isEmpty());
165 String onFulfilled, onRejected;
166 promise.then(Function::create(isolate(), &onFulfilled), Function::create(isolate(), &onRejected));
168 EXPECT_EQ(String(), onFulfilled);
169 EXPECT_EQ(String(), onRejected);
171 m_resolver->resolve("hello");
172 EXPECT_TRUE(m_resolver->promise().isEmpty());
173 isolate()->RunMicrotasks();
175 EXPECT_EQ("hello", onFulfilled);
176 EXPECT_EQ(String(), onRejected);
178 m_resolver->reject("world");
179 isolate()->RunMicrotasks();
181 EXPECT_EQ("hello", onFulfilled);
182 EXPECT_EQ(String(), onRejected);
187 } // namespace WebCore