[chromium] move most of the remaining mocks to TestRunner library
[WebKit-https.git] / Tools / DumpRenderTree / chromium / TestRunner / src / MockWebSpeechRecognizer.cpp
1 /*
2  * Copyright (C) 2012 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
6  * are met:
7  *
8  * 1.  Redistributions of source code must retain the above copyright
9  *     notice, this list of conditions and the following disclaimer.
10  * 2.  Redistributions in binary form must reproduce the above copyright
11  *     notice, this list of conditions and the following disclaimer in the
12  *     documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
15  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
16  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
17  * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
18  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
19  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
20  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
21  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
23  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #include "config.h"
27 #include "MockWebSpeechRecognizer.h"
28
29 #include "WebSpeechRecognitionResult.h"
30 #include "WebSpeechRecognizerClient.h"
31 #include "WebTestDelegate.h"
32
33 using namespace WebKit;
34 using namespace std;
35
36 namespace WebTestRunner {
37
38 namespace {
39
40 // Task class for calling a client function that does not take any parameters.
41 typedef void (WebSpeechRecognizerClient::*ClientFunctionPointer)(const WebSpeechRecognitionHandle&);
42 class ClientCallTask : public MockWebSpeechRecognizer::Task {
43 public:
44     ClientCallTask(MockWebSpeechRecognizer* mock, ClientFunctionPointer function)
45         : MockWebSpeechRecognizer::Task(mock)
46         , m_function(function)
47     {
48     }
49
50     virtual void run() OVERRIDE { (m_recognizer->client()->*m_function)(m_recognizer->handle()); }
51
52 private:
53     ClientFunctionPointer m_function;
54 };
55
56 // Task for delivering a result event.
57 class ResultTask : public MockWebSpeechRecognizer::Task {
58 public:
59     ResultTask(MockWebSpeechRecognizer* mock, const WebString transcript, float confidence)
60         : MockWebSpeechRecognizer::Task(mock)
61         , m_transcript(transcript)
62         , m_confidence(confidence)
63     {
64     }
65
66     virtual void run() OVERRIDE
67     {
68         WebVector<WebString> transcripts(static_cast<size_t>(1));
69         WebVector<float> confidences(static_cast<size_t>(1));
70         transcripts[0] = m_transcript;
71         confidences[0] = m_confidence;
72         WebVector<WebSpeechRecognitionResult> finalResults(static_cast<size_t>(1));
73         WebVector<WebSpeechRecognitionResult> interimResults;
74         finalResults[0].assign(transcripts, confidences, true);
75
76         m_recognizer->client()->didReceiveResults(m_recognizer->handle(), finalResults, interimResults);
77     }
78
79 private:
80     WebString m_transcript;
81     float m_confidence;
82 };
83
84 // Task for delivering a nomatch event.
85 class NoMatchTask : public MockWebSpeechRecognizer::Task {
86 public:
87     NoMatchTask(MockWebSpeechRecognizer* mock) : MockWebSpeechRecognizer::Task(mock) { }
88     virtual void run() OVERRIDE { m_recognizer->client()->didReceiveNoMatch(m_recognizer->handle(), WebSpeechRecognitionResult()); }
89 };
90
91 // Task for delivering an error event.
92 class ErrorTask : public MockWebSpeechRecognizer::Task {
93 public:
94     ErrorTask(MockWebSpeechRecognizer* mock, WebSpeechRecognizerClient::ErrorCode code, const WebString& message)
95         : MockWebSpeechRecognizer::Task(mock)
96         , m_code(code)
97         , m_message(message)
98     {
99     }
100
101     virtual void run() OVERRIDE { m_recognizer->client()->didReceiveError(m_recognizer->handle(), m_message, m_code); }
102
103 private:
104     WebSpeechRecognizerClient::ErrorCode m_code;
105     WebString m_message;
106 };
107
108 } // namespace
109
110 MockWebSpeechRecognizer::MockWebSpeechRecognizer()
111     : m_wasAborted(false)
112     , m_taskQueueRunning(false)
113     , m_delegate(0)
114 {
115 }
116
117 MockWebSpeechRecognizer::~MockWebSpeechRecognizer()
118 {
119     clearTaskQueue();
120 }
121
122 void MockWebSpeechRecognizer::setDelegate(WebTestDelegate* delegate)
123 {
124     m_delegate = delegate;
125 }
126
127 void MockWebSpeechRecognizer::start(const WebSpeechRecognitionHandle& handle, const WebSpeechRecognitionParams& params, WebSpeechRecognizerClient* client)
128 {
129     m_wasAborted = false;
130     m_handle = handle;
131     m_client = client;
132
133     m_taskQueue.push_back(new ClientCallTask(this, &WebSpeechRecognizerClient::didStart));
134     m_taskQueue.push_back(new ClientCallTask(this, &WebSpeechRecognizerClient::didStartAudio));
135     m_taskQueue.push_back(new ClientCallTask(this, &WebSpeechRecognizerClient::didStartSound));
136
137     if (!m_mockTranscripts.empty()) {
138         WEBKIT_ASSERT(m_mockTranscripts.size() == m_mockConfidences.size());
139
140         for (size_t i = 0; i < m_mockTranscripts.size(); ++i)
141             m_taskQueue.push_back(new ResultTask(this, m_mockTranscripts[i], m_mockConfidences[i]));
142
143         m_mockTranscripts.clear();
144         m_mockConfidences.clear();
145     } else
146         m_taskQueue.push_back(new NoMatchTask(this));
147
148     m_taskQueue.push_back(new ClientCallTask(this, &WebSpeechRecognizerClient::didEndSound));
149     m_taskQueue.push_back(new ClientCallTask(this, &WebSpeechRecognizerClient::didEndAudio));
150     m_taskQueue.push_back(new ClientCallTask(this, &WebSpeechRecognizerClient::didEnd));
151
152     startTaskQueue();
153 }
154
155 void MockWebSpeechRecognizer::stop(const WebSpeechRecognitionHandle& handle, WebSpeechRecognizerClient* client)
156 {
157     m_handle = handle;
158     m_client = client;
159
160     // FIXME: Implement.
161     WEBKIT_ASSERT_NOT_REACHED();
162 }
163
164 void MockWebSpeechRecognizer::abort(const WebSpeechRecognitionHandle& handle, WebSpeechRecognizerClient* client)
165 {
166     m_handle = handle;
167     m_client = client;
168
169     clearTaskQueue();
170     m_wasAborted = true;
171     m_taskQueue.push_back(new ClientCallTask(this, &WebSpeechRecognizerClient::didEnd));
172     startTaskQueue();
173 }
174
175 void MockWebSpeechRecognizer::addMockResult(const WebString& transcript, float confidence)
176 {
177     m_mockTranscripts.push_back(transcript);
178     m_mockConfidences.push_back(confidence);
179 }
180
181 void MockWebSpeechRecognizer::setError(const WebString& error, const WebString& message)
182 {
183     WebSpeechRecognizerClient::ErrorCode code;
184     if (error == "OtherError")
185         code = WebSpeechRecognizerClient::OtherError;
186     else if (error == "NoSpeechError")
187         code = WebSpeechRecognizerClient::NoSpeechError;
188     else if (error == "AbortedError")
189         code = WebSpeechRecognizerClient::AbortedError;
190     else if (error == "AudioCaptureError")
191         code = WebSpeechRecognizerClient::AudioCaptureError;
192     else if (error == "NetworkError")
193         code = WebSpeechRecognizerClient::NetworkError;
194     else if (error == "NotAllowedError")
195         code = WebSpeechRecognizerClient::NotAllowedError;
196     else if (error == "ServiceNotAllowedError")
197         code = WebSpeechRecognizerClient::ServiceNotAllowedError;
198     else if (error == "BadGrammarError")
199         code = WebSpeechRecognizerClient::BadGrammarError;
200     else if (error == "LanguageNotSupportedError")
201         code = WebSpeechRecognizerClient::LanguageNotSupportedError;
202     else
203         return;
204
205     clearTaskQueue();
206     m_taskQueue.push_back(new ErrorTask(this, code, message));
207     m_taskQueue.push_back(new ClientCallTask(this, &WebSpeechRecognizerClient::didEnd));
208     startTaskQueue();
209 }
210
211 void MockWebSpeechRecognizer::startTaskQueue()
212 {
213     if (m_taskQueueRunning)
214         return;
215     m_delegate->postTask(new StepTask(this));
216     m_taskQueueRunning = true;
217 }
218
219 void MockWebSpeechRecognizer::clearTaskQueue()
220 {
221     while (!m_taskQueue.empty()) {
222         delete m_taskQueue.front();
223         m_taskQueue.pop_front();
224     }
225     m_taskQueueRunning = false;
226 }
227
228 void MockWebSpeechRecognizer::StepTask::runIfValid()
229 {
230     if (m_object->m_taskQueue.empty()) {
231         m_object->m_taskQueueRunning = false;
232         return;
233     }
234
235     Task* task = m_object->m_taskQueue.front();
236     m_object->m_taskQueue.pop_front();
237     task->run();
238     delete task;
239
240     if (m_object->m_taskQueue.empty()) {
241         m_object->m_taskQueueRunning = false;
242         return;
243     }
244
245     m_object->m_delegate->postTask(new StepTask(m_object));
246 }
247
248 }