14e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
24e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
34e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// found in the LICENSE file.
44e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
54e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)/**
64e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * TestFixture for kiosk app settings WebUI testing.
74e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @extends {testing.Test}
84e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @constructor
95c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu */
104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)function AppListStartPageWebUITest() {}
114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)/**
135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * Mock of audioContext.
145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * @constructor
155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) */
165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)function mockAudioContext() {
175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  this.sampleRate = 44100; /* some dummy number */
185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)mockAudioContext.prototype = {
215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  createMediaStreamSource: function(stream) {
22e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    return {connect: function(audioProc) {},
23e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch            disconnect: function() {}};
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  },
25e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  createScriptProcessor: function(bufSize, in_channels, out_channels) {
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return {connect: function(destination) {},
275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            disconnect: function() {}};
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)AppListStartPageWebUITest.prototype = {
324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  __proto__: testing.Test.prototype,
334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  /**
354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)   * Browser to app launcher start page.
364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)   */
374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  browsePreload: 'chrome://app-list/',
384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  /**
404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)   * Recommend apps data.
414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)   * @private
424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)   */
434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  recommendedApps_: [
444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    {
454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      'appId': 'app_id_1',
464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      'textTitle': 'app 1',
474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      'iconUrl': 'icon_url_1'
484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    },
494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    {
504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      'appId': 'app_id_2',
514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      'textTitle': 'app 2',
524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      'iconUrl': 'icon_url_2'
535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ],
554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  /**
575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   * Placeholder for mock speech recognizer.
585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   */
595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  speechRecognizer: null,
605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  /**
625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   * Sends the speech recognition result.
635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   *
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   * @param {string} result The testing result.
655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   * @param {boolean} isFinal Whether the result is final or not.
665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   */
675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  sendSpeechResult: function(result, isFinal) {
685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    var speechEvent = new Event('test');
695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Each result contains a list of alternatives and 'isFinal' flag.
705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    var speechResult = [{transcript: result}];
715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    speechResult.isFinal = isFinal;
725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    speechEvent.results = [speechResult];
735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    this.speechRecognizer.onresult(speechEvent);
745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  },
755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  /**
775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   * Registers the webkitSpeechRecognition mock for test.
785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   * @private
795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   */
805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  registerMockSpeechRecognition_: function() {
815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    var owner = this;
825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    function mockSpeechRecognition() {
835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      this.inSpeech_ = false;
845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      owner.speechRecognizer = this;
855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    mockSpeechRecognition.prototype = {
885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      start: function() {
895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        this.onstart();
905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      },
915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      abort: function() {
935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        if (this.inSpeech_)
945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          this.onspeechend();
955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        this.onerror(new Error());
965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        this.onend();
975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      }
985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    },
995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    window.webkitSpeechRecognition = mockSpeechRecognition;
1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  },
1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  /**
1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   * Mock of webkitGetUserMedia for start page.
1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   *
1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   * @private
1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   * @param {object} constraint The constraint parameter.
1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   * @param {Function} success The success callback.
1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   * @param {Function} error The error callback.
1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   */
1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  mockGetUserMedia_: function(constraint, success, error) {
112e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    function getAudioTracks() {
113e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    }
1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    assertTrue(constraint.audio);
1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    assertNotEquals(null, error, 'error callback must not be null');
116e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    var audioTracks = [];
117e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    for (var i = 0; i < 2; ++i) {
118e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      audioTracks.push(this.audioTrackMocks[i].proxy());
119e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    }
120e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    success({getAudioTracks: function() { return audioTracks; }});
1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  },
1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  /** @override */
1244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  preLoad: function() {
1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    this.makeAndRegisterMockHandler(['initialize',
1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                     'launchApp',
1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                     'setSpeechRecognitionState',
1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                     'speechResult']);
1294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    this.mockHandler.stubs().initialize().will(callFunction(function() {
1304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      appList.startPage.setRecommendedApps(this.recommendedApps_);
1314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }.bind(this)));
1324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    this.mockHandler.stubs().launchApp(ANYTHING);
1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    this.registerMockSpeechRecognition_();
135c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    window.AudioContext = mockAudioContext;
1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    navigator.webkitGetUserMedia = this.mockGetUserMedia_.bind(this);
137e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    this.audioTrackMocks = [mock(MediaStreamTrack), mock(MediaStreamTrack)];
1384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
1394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)};
1404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_F('AppListStartPageWebUITest', 'Basic', function() {
1424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  assertEquals(this.browsePreload, document.location.href);
1434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  var recommendedApp = $('start-page').querySelector('.recommended-apps');
1454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  assertEquals(this.recommendedApps_.length, recommendedApp.childElementCount);
1464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  for (var i = 0; i < recommendedApp.childElementCount; ++i) {
1474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    assertEquals(this.recommendedApps_[i].appId,
1484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                 recommendedApp.children[i].appId);
1494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
1504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)});
1514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_F('AppListStartPageWebUITest', 'ClickToLaunch', function() {
1534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  var recommendedApp = $('start-page').querySelector('.recommended-apps');
1544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  for (var i = 0; i < recommendedApp.childElementCount; ++i) {
1554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    this.mockHandler.expects(once()).launchApp(
1564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        [this.recommendedApps_[i].appId]);
1574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    cr.dispatchSimpleEvent(recommendedApp.children[i], 'click');
1584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
1594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)});
1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F('AppListStartPageWebUITest', 'SpeechRecognitionState', function() {
162c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  this.mockHandler.expects(once()).setSpeechRecognitionState('READY');
1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  appList.startPage.onAppListShown();
1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  this.mockHandler.expects(once()).setSpeechRecognitionState('RECOGNIZING');
1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  appList.startPage.toggleSpeechRecognition();
1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Mock4JS.verifyAllMocks();
1675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Mock4JS.clearMocksToVerify();
1685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  this.mockHandler.expects(once()).setSpeechRecognitionState('READY');
170e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  for (var i = 0; i < this.audioTrackMocks.length; ++i) {
171e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    this.audioTrackMocks[i].expects(once()).stop();
172e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  }
1735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  appList.startPage.toggleSpeechRecognition();
1745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Mock4JS.verifyAllMocks();
1755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Mock4JS.clearMocksToVerify();
1765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  this.mockHandler.expects(once()).setSpeechRecognitionState('RECOGNIZING');
1785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  appList.startPage.toggleSpeechRecognition();
1795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Mock4JS.verifyAllMocks();
1805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Mock4JS.clearMocksToVerify();
1815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  this.mockHandler.expects(once()).setSpeechRecognitionState('STOPPING');
1835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  this.mockHandler.expects(once()).setSpeechRecognitionState('READY');
184e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  for (var i = 0; i < this.audioTrackMocks.length; ++i) {
185e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    this.audioTrackMocks[i].expects(once()).stop();
186e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  }
1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  appList.startPage.onAppListHidden();
1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)});
1895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F('AppListStartPageWebUITest', 'SpeechRecognition', function() {
191c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  this.mockHandler.expects(once()).setSpeechRecognitionState('READY');
1925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  appList.startPage.onAppListShown();
1935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  this.mockHandler.expects(once()).setSpeechRecognitionState('RECOGNIZING');
1945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  appList.startPage.toggleSpeechRecognition();
1955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Mock4JS.verifyAllMocks();
1965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Mock4JS.clearMocksToVerify();
1975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  this.mockHandler.expects(once()).setSpeechRecognitionState('IN_SPEECH');
1995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  this.speechRecognizer.onspeechstart();
2005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Mock4JS.verifyAllMocks();
2015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Mock4JS.clearMocksToVerify();
2025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  this.mockHandler.expects(once()).speechResult('test,false');
2045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  this.sendSpeechResult('test', false);
2055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Mock4JS.verifyAllMocks();
2065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Mock4JS.clearMocksToVerify();
2075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  this.mockHandler.expects(once()).speechResult('test,true');
2095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  this.mockHandler.expects(once()).setSpeechRecognitionState('READY');
210e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  for (var i = 0; i < this.audioTrackMocks.length; ++i) {
211e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    this.audioTrackMocks[i].expects(once()).stop();
212e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  }
2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  this.sendSpeechResult('test', true);
2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)});
215