Upstream version 9.37.197.0
[platform/framework/web/crosswalk.git] / src / third_party / WebKit / Source / bindings / v8 / ScriptPromiseResolverTest.cpp
1 /*
2  * Copyright (C) 2013 Google Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions are
6  * met:
7  *
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
13  * distribution.
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.
17  *
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.
29  */
30
31 #include "config.h"
32 #include "bindings/v8/ScriptPromiseResolver.h"
33
34 #include "bindings/v8/ScriptPromise.h"
35 #include "bindings/v8/V8Binding.h"
36
37 #include <gtest/gtest.h>
38 #include <v8.h>
39
40 namespace WebCore {
41
42 namespace {
43
44 class Function : public ScriptFunction {
45 public:
46     static PassOwnPtr<Function> create(v8::Isolate* isolate, String* value)
47     {
48         return adoptPtr(new Function(isolate, value));
49     }
50
51     virtual ScriptValue call(ScriptValue value) OVERRIDE
52     {
53         ASSERT(!value.isEmpty());
54         *m_value = toCoreString(value.v8Value()->ToString());
55         return value;
56     }
57
58 private:
59     Function(v8::Isolate* isolate, String* value) : ScriptFunction(isolate), m_value(value) { }
60
61     String* m_value;
62 };
63
64 class ScriptPromiseResolverTest : public testing::Test {
65 public:
66     ScriptPromiseResolverTest()
67         : m_scope(v8::Isolate::GetCurrent())
68     {
69         m_resolver = ScriptPromiseResolver::create(m_scope.scriptState());
70     }
71
72     virtual ~ScriptPromiseResolverTest()
73     {
74         // Run all pending microtasks here.
75         isolate()->RunMicrotasks();
76     }
77
78     v8::Isolate* isolate() { return m_scope.isolate(); }
79
80 protected:
81     RefPtr<ScriptPromiseResolver> m_resolver;
82     V8TestingScope m_scope;
83 };
84
85 TEST_F(ScriptPromiseResolverTest, initialState)
86 {
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));
91
92     EXPECT_EQ(String(), onFulfilled);
93     EXPECT_EQ(String(), onRejected);
94
95     isolate()->RunMicrotasks();
96
97     EXPECT_EQ(String(), onFulfilled);
98     EXPECT_EQ(String(), onRejected);
99 }
100
101 TEST_F(ScriptPromiseResolverTest, resolve)
102 {
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));
107
108     EXPECT_EQ(String(), onFulfilled);
109     EXPECT_EQ(String(), onRejected);
110
111     m_resolver->resolve("hello");
112     EXPECT_TRUE(m_resolver->promise().isEmpty());
113     isolate()->RunMicrotasks();
114
115     EXPECT_EQ("hello", onFulfilled);
116     EXPECT_EQ(String(), onRejected);
117 }
118
119 TEST_F(ScriptPromiseResolverTest, reject)
120 {
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));
125
126     EXPECT_EQ(String(), onFulfilled);
127     EXPECT_EQ(String(), onRejected);
128
129     m_resolver->reject("hello");
130     EXPECT_TRUE(m_resolver->promise().isEmpty());
131     isolate()->RunMicrotasks();
132
133     EXPECT_EQ(String(), onFulfilled);
134     EXPECT_EQ("hello", onRejected);
135 }
136
137 TEST_F(ScriptPromiseResolverTest, resolveOverResolve)
138 {
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));
143
144     EXPECT_EQ(String(), onFulfilled);
145     EXPECT_EQ(String(), onRejected);
146
147     m_resolver->resolve("hello");
148     EXPECT_TRUE(m_resolver->promise().isEmpty());
149     isolate()->RunMicrotasks();
150
151     EXPECT_EQ("hello", onFulfilled);
152     EXPECT_EQ(String(), onRejected);
153
154     m_resolver->resolve("world");
155     isolate()->RunMicrotasks();
156
157     EXPECT_EQ("hello", onFulfilled);
158     EXPECT_EQ(String(), onRejected);
159 }
160
161 TEST_F(ScriptPromiseResolverTest, rejectOverResolve)
162 {
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));
167
168     EXPECT_EQ(String(), onFulfilled);
169     EXPECT_EQ(String(), onRejected);
170
171     m_resolver->resolve("hello");
172     EXPECT_TRUE(m_resolver->promise().isEmpty());
173     isolate()->RunMicrotasks();
174
175     EXPECT_EQ("hello", onFulfilled);
176     EXPECT_EQ(String(), onRejected);
177
178     m_resolver->reject("world");
179     isolate()->RunMicrotasks();
180
181     EXPECT_EQ("hello", onFulfilled);
182     EXPECT_EQ(String(), onRejected);
183 }
184
185 } // namespace
186
187 } // namespace WebCore