15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright (c) 2011 The Chromium Authors. All rights reserved.
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Use of this source code is governed by a BSD-style license that can be
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * found in the LICENSE file.
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)var voiceArray;
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)var trials = 3;
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)var resultMap = {};
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)var updateDependencyFunctions = [];
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)var testRunIndex = 0;
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)var emergencyStop = false;
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function $(id) {
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return document.getElementById(id);
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function isErrorEvent(evt) {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return (evt.type == 'error' ||
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          evt.type == 'interrupted' ||
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          evt.type == 'cancelled');
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function logEvent(callTime, testRunName, evt) {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var elapsed = ((new Date() - callTime) / 1000).toFixed(3);
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (elapsed.length < 7) {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    elapsed = ' ' + elapsed;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  console.log(elapsed + ' ' + testRunName + ': ' + JSON.stringify(evt));
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function logSpeakCall(utterance, options, callback) {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var optionsCopy = {};
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (var key in options) {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (key != 'onEvent') {
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      optionsCopy[key] = options[key];
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  console.log('Calling chrome.tts.speak(\'' +
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              utterance + '\', ' +
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              JSON.stringify(optionsCopy) + ')');
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (callback)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chrome.tts.speak(utterance, options, callback);
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chrome.tts.speak(utterance, options);
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)var tests = [
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    name: 'Baseline',
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    description: 'Ensures that the speech engine sends both start and ' +
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 'end events, and establishes a baseline time to speak a ' +
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 'key phrase, to compare other tests against.',
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dependencies: [],
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    trials: 3,
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    run: function(testRunName, voiceName, callback) {
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var callTime = new Date();
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var startTime;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var warnings = [];
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var errors = [];
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      logSpeakCall('Alpha Bravo Charlie Delta Echo', {
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        voiceName: voiceName,
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        onEvent: function(evt) {
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          logEvent(callTime, testRunName, evt);
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if (isErrorEvent(evt)) {
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            callback(false, null, []);
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          } else if (evt.type == 'start') {
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            startTime = new Date();
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (evt.charIndex != 0) {
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              errors.push('Error: start event should have a charIndex of 0.');
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          } else if (evt.type == 'end') {
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (startTime == undefined) {
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              errors.push('Error: no "start" event received!');
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              startTime = callTime;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (evt.charIndex != 30) {
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              errors.push('Error: end event should have a charIndex of 30.');
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            var endTime = new Date();
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (startTime - callTime > 1000) {
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              var delta = ((startTime - callTime) / 1000).toFixed(3);
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              warnings.push('Note: Delay of ' + delta +
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            ' before speech started. ' +
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            'Less than 1.0 s latency is recommended.');
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            var delta = (endTime - startTime) / 1000;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (delta < 1.0) {
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              warnings.push('Warning: Default speech rate seems too fast.');
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            } else if (delta > 3.0) {
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              warnings.push('Warning: Default speech rate seems too slow.');
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            callback(errors.length == 0, delta, warnings.concat(errors));
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      });
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    name: 'Fast',
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    description: 'Speaks twice as fast and compares the time to the baseline.',
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dependencies: ['Baseline'],
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    trials: 3,
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    run: function(testRunName, voiceName, callback) {
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var callTime = new Date();
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var startTime;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var errors = [];
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      logSpeakCall('Alpha Bravo Charlie Delta Echo', {
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        voiceName: voiceName,
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        rate: 2.0,
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        onEvent: function(evt) {
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          logEvent(callTime, testRunName, evt);
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if (isErrorEvent(evt)) {
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            callback(false, null, []);
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          } else if (evt.type == 'start') {
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            startTime = new Date();
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          } else if (evt.type == 'end') {
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (startTime == undefined)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              startTime = callTime;
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            var endTime = new Date();
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            var delta = (endTime - startTime) / 1000;
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            var relative = delta / resultMap['Baseline'];
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (relative < 0.35) {
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              errors.push('2x speech rate seems too fast.');
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            } else if (relative > 0.65) {
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              errors.push('2x speech rate seems too slow.');
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            callback(errors.length == 0, delta, errors);
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      });
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    name: 'Slow',
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    description: 'Speaks twice as slow and compares the time to the baseline.',
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dependencies: ['Baseline'],
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    trials: 3,
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    run: function(testRunName, voiceName, callback) {
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var callTime = new Date();
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var startTime;
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var errors = [];
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      logSpeakCall('Alpha Bravo Charlie Delta Echo', {
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        voiceName: voiceName,
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        rate: 0.5,
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        onEvent: function(evt) {
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          logEvent(callTime, testRunName, evt);
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if (isErrorEvent(evt)) {
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            callback(false, null, []);
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          } else if (evt.type == 'start') {
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            startTime = new Date();
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          } else if (evt.type == 'end') {
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (startTime == undefined)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              startTime = callTime;
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            var endTime = new Date();
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            var delta = (endTime - startTime) / 1000;
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            var relative = delta / resultMap['Baseline'];
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (relative < 1.6) {
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              errors.push('Half-speed speech rate seems too fast.');
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            } else if (relative > 2.4) {
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              errors.push('Half-speed speech rate seems too slow.');
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            callback(errors.length == 0, delta, errors);
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      });
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    name: 'Interrupt and restart',
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    description: 'Interrupts partway through a long sentence and then ' +
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 'the baseline utterance, to make sure that speech after ' +
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 'an interruption works correctly.',
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dependencies: ['Baseline'],
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    trials: 1,
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    run: function(testRunName, voiceName, callback) {
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var callTime = new Date();
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var startTime;
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var errors = [];
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      logSpeakCall('When in the course of human events it becomes ' +
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       'necessary for one people to dissolve the political ' +
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       'bands which have connected them ', {
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        voiceName: voiceName,
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        onEvent: function(evt) {
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          logEvent(callTime, testRunName, evt);
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      });
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      window.setTimeout(function() {
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        logSpeakCall('Alpha Bravo Charlie Delta Echo', {
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          voiceName: voiceName,
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          onEvent: function(evt) {
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            logEvent(callTime, testRunName, evt);
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (isErrorEvent(evt)) {
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              callback(false, null, []);
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            } else if (evt.type == 'start') {
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              startTime = new Date();
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            } else if (evt.type == 'end') {
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              if (startTime == undefined)
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                startTime = callTime;
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              var endTime = new Date();
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              var delta = (endTime - startTime) / 1000;
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              var relative = delta / resultMap['Baseline'];
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              if (relative < 0.9) {
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                errors.push('Interrupting speech seems too short.');
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              } else if (relative > 1.1) {
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                errors.push('Interrupting speech seems too long.');
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              }
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              callback(errors.length == 0, delta, errors);
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        });
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }, 4000);
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    name: 'Low volume',
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    description: '<b>Manual</b> test - verify that the volume is lower.',
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dependencies: [],
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    trials: 1,
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    run: function(testRunName, voiceName, callback) {
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var callTime = new Date();
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      logSpeakCall('Alpha Bravo Charlie Delta Echo', {
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        voiceName: voiceName,
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        volume: 0.5,
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        onEvent: function(evt) {
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          logEvent(callTime, testRunName, evt);
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if (isErrorEvent(evt)) {
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            callback(false, null, []);
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          } else if (evt.type == 'end') {
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            callback(true, null, []);
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      });
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    name: 'High pitch',
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    description: '<b>Manual</b> test - verify that the pitch is ' +
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 'moderately higher, but quite understandable.',
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dependencies: [],
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    trials: 1,
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    run: function(testRunName, voiceName, callback) {
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var callTime = new Date();
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      logSpeakCall('Alpha Bravo Charlie Delta Echo', {
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        voiceName: voiceName,
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pitch: 1.2,
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        onEvent: function(evt) {
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          logEvent(callTime, testRunName, evt);
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if (isErrorEvent(evt)) {
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            callback(false, null, []);
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          } else if (evt.type == 'end') {
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            callback(true, null, []);
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      });
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    name: 'Low pitch',
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    description: '<b>Manual</b> test - verify that the pitch is ' +
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 'moderately lower, but quite understandable.',
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dependencies: [],
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    trials: 1,
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    run: function(testRunName, voiceName, callback) {
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var callTime = new Date();
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      logSpeakCall('Alpha Bravo Charlie Delta Echo', {
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        voiceName: voiceName,
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pitch: 0.8,
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        onEvent: function(evt) {
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          logEvent(callTime, testRunName, evt);
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if (isErrorEvent(evt)) {
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            callback(false, null, []);
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          } else if (evt.type == 'end') {
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            callback(true, null, []);
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      });
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    name: 'Word and sentence callbacks',
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    description: 'Checks to see if proper word and sentence callbacks ' +
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 'are received.',
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dependencies: ['Baseline'],
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    trials: 1,
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    run: function(testRunName, voiceName, callback) {
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var callTime = new Date();
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var startTime;
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var errors = [];
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var wordExpected = [{min: 5, max: 6},
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          {min: 11, max: 12},
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          {min: 19, max: 20},
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          {min: 25, max: 26},
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          {min: 30, max: 32},
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          {min: 37, max: 38},
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          {min: 43, max: 44},
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          {min: 51, max: 52},
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          {min: 57, max: 58}];
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var sentenceExpected = [{min: 30, max: 32}]
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var wordCount = 0;
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var sentenceCount = 0;
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var lastWordTime = callTime;
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var lastSentenceTime = callTime;
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var avgWordTime = resultMap['Baseline'] / 5;
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      logSpeakCall('Alpha Bravo Charlie Delta Echo. ' +
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       'Alpha Bravo Charlie Delta Echo.', {
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        voiceName: voiceName,
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        onEvent: function(evt) {
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          logEvent(callTime, testRunName, evt);
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if (isErrorEvent(evt)) {
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            callback(false, null, []);
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          } else if (evt.type == 'start') {
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            startTime = new Date();
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            lastWordTime = startTime;
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            lastSentenceTime = startTime;
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          } else if (evt.type == 'word') {
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (evt.charIndex > 0 && evt.charIndex < 62) {
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              var min = wordExpected[wordCount].min;
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              var max = wordExpected[wordCount].max;
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              if (evt.charIndex < min || evt.charIndex > max) {
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                errors.push('Got word at charIndex ' + evt.charIndex + ', ' +
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            'was expecting next word callback charIndex ' +
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            'in the range ' + min + ':' + max + '.');
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              }
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              if (wordCount != 4) {
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                var delta = (new Date() - lastWordTime) / 1000;
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                if (delta < 0.6 * avgWordTime) {
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  errors.push('Word at charIndex ' + evt.charIndex +
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              ' came after only ' + delta.toFixed(3) +
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              ' s, which seems too short.');
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                } else if (delta > 1.3 * avgWordTime) {
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  errors.push('Word at charIndex ' + evt.charIndex +
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              ' came after ' + delta.toFixed(3) +
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              ' s, which seems too long.');
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                }
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              }
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              wordCount++;
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            lastWordTime = new Date();
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          } else if (evt.type == 'sentence') {
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (evt.charIndex > 0 && evt.charIndex < 62) {
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              var min = sentenceExpected[sentenceCount].min;
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              var max = sentenceExpected[sentenceCount].max;
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              if (evt.charIndex < min || evt.charIndex > max) {
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                errors.push('Got sentence at charIndex ' + evt.charIndex +
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            ', was expecting next callback charIndex ' +
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            'in the range ' + min + ':' + max + '.');
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              }
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              var delta = (new Date() - lastSentenceTime) / 1000;
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              if (delta < 0.75 * resultMap['Baseline']) {
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                errors.push('Sentence at charIndex ' + evt.charIndex +
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            ' came after only ' + delta.toFixed(3) +
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            ' s, which seems too short.');
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              } else if (delta > 1.25 * resultMap['Baseline']) {
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                errors.push('Sentence at charIndex ' + evt.charIndex +
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            ' came after ' + delta.toFixed(3) +
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            ' s, which seems too long.');
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              }
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              sentenceCount++;
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            lastSentenceTime = new Date();
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          } else if (evt.type == 'end') {
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (wordCount == 0) {
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              errors.push('Didn\'t get any word callbacks.');
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            } else if (wordCount < wordExpected.length) {
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              errors.push('Not enough word callbacks.');
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            } else if (wordCount > wordExpected.length) {
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              errors.push('Too many word callbacks.');
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (sentenceCount == 0) {
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              errors.push('Didn\'t get any sentence callbacks.');
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            } else if (sentenceCount < sentenceExpected.length) {
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              errors.push('Not enough sentence callbacks.');
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            } else if (sentenceCount > sentenceExpected.length) {
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              errors.push('Too many sentence callbacks.');
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (startTime == undefined) {
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              errors.push('Error: no "start" event received!');
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              startTime = callTime;
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            var endTime = new Date();
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            var delta = (endTime - startTime) / 1000;
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (delta < 2.5) {
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              errors.push('Default speech rate seems too fast.');
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            } else if (delta > 7.0) {
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              errors.push('Default speech rate seems too slow.');
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            callback(errors.length == 0, delta, errors);
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      });
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    name: 'Baseline Queueing Test',
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    description: 'Establishes a baseline time to speak a ' +
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 'sequence of three enqueued phrases, to compare ' +
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 'other tests against.',
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dependencies: [],
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    trials: 3,
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    run: function(testRunName, voiceName, callback) {
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var callTime = new Date();
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var startTime;
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var errors = [];
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      logSpeakCall('Alpha Alpha', {
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        voiceName: voiceName,
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        onEvent: function(evt) {
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          logEvent(callTime, testRunName, evt);
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if (isErrorEvent(evt)) {
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            callback(false, null, []);
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          } else if (evt.type == 'start') {
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            startTime = new Date();
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      });
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      logSpeakCall('Bravo bravo.', {
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        voiceName: voiceName,
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        enqueue: true,
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        onEvent: function(evt) {
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          logEvent(callTime, testRunName, evt);
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if (isErrorEvent(evt)) {
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            callback(false, null, []);
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      });
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      logSpeakCall('Charlie charlie', {
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        voiceName: voiceName,
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        enqueue: true,
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        onEvent: function(evt) {
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          logEvent(callTime, testRunName, evt);
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if (isErrorEvent(evt)) {
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            callback(false, null, []);
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          } else if (evt.type == 'end') {
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (startTime == undefined) {
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              errors.push('Error: no "start" event received!');
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              startTime = callTime;
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            var endTime = new Date();
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            var delta = (endTime - startTime) / 1000;
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            callback(errors.length == 0, delta, errors);
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      });
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    name: 'Interruption with Queueing',
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    description: 'Queue a sequence of three utterances, then before they ' +
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 'are finished, interrupt and queue a sequence of three ' +
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 'more utterances. Make sure that interrupting and ' +
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 'cancelling the previous utterances doesn\'t interfere ' +
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 'with the interrupting utterances.',
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dependencies: ['Baseline Queueing Test'],
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    trials: 1,
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    run: function(testRunName, voiceName, callback) {
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var callTime = new Date();
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var startTime;
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var errors = [];
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      logSpeakCall('Just when I\'m about to say something interesting,', {
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        voiceName: voiceName
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      });
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      logSpeakCall('it seems that I always get interrupted.', {
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        voiceName: voiceName,
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        enqueue: true,
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      });
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      logSpeakCall('How rude! Will you ever let me finish?', {
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        voiceName: voiceName,
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        enqueue: true,
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      });
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      window.setTimeout(function() {
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        logSpeakCall('Alpha Alpha', {
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          voiceName: voiceName,
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          onEvent: function(evt) {
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            logEvent(callTime, testRunName, evt);
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (isErrorEvent(evt)) {
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              callback(false, null, []);
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            } else if (evt.type == 'start') {
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              startTime = new Date();
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        });
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        logSpeakCall('Bravo bravo.', {
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          voiceName: voiceName,
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          enqueue: true,
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          onEvent: function(evt) {
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            logEvent(callTime, testRunName, evt);
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (isErrorEvent(evt)) {
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              callback(false, null, []);
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        });
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        logSpeakCall('Charlie charlie', {
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          voiceName: voiceName,
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          enqueue: true,
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          onEvent: function(evt) {
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            logEvent(callTime, testRunName, evt);
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (isErrorEvent(evt)) {
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              callback(false, null, []);
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            } else if (evt.type == 'end') {
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              if (startTime == undefined) {
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                errors.push('Error: no "start" event received!');
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                startTime = callTime;
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              }
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              var endTime = new Date();
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              var delta = (endTime - startTime) / 1000;
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              var relative = delta / resultMap['Baseline Queueing Test'];
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              if (relative < 0.9) {
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                errors.push('Interrupting speech seems too short.');
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              } else if (relative > 1.1) {
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                errors.push('Interrupting speech seems too long.');
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              }
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              callback(errors.length == 0, delta, errors);
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        });
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }, 4000);
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)];
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function updateDependencies() {
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (var i = 0; i < updateDependencyFunctions.length; i++) {
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    updateDependencyFunctions[i]();
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function registerTest(test) {
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var outer = document.createElement('div');
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  outer.className = 'outer';
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  $('container').appendChild(outer);
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var buttonWrap = document.createElement('div');
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  buttonWrap.className = 'buttonWrap';
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  outer.appendChild(buttonWrap);
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var button = document.createElement('button');
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  button.className = 'runTestButton';
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  button.innerText = test.name;
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  buttonWrap.appendChild(button);
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var busy = document.createElement('img');
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  busy.src = 'pacman.gif';
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  busy.alt = 'Busy indicator';
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  buttonWrap.appendChild(busy);
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  busy.style.visibility = 'hidden';
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var description = document.createElement('div');
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  description.className = 'description';
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  description.innerHTML = test.description;
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  outer.appendChild(description);
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var resultsWrap = document.createElement('div');
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resultsWrap.className = 'results';
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  outer.appendChild(resultsWrap);
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var results = [];
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (var j = 0; j < test.trials; j++) {
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var result = document.createElement('span');
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resultsWrap.appendChild(result);
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    results.push(result);
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var avg = document.createElement('span');
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  resultsWrap.appendChild(avg);
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var messagesWrap = document.createElement('div');
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  messagesWrap.className = 'messages';
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  outer.appendChild(messagesWrap);
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var totalTime;
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var successCount;
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  function finishTrials() {
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    busy.style.visibility = 'hidden';
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (successCount == test.trials) {
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      console.log('Test succeeded.');
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var success = document.createElement('div');
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      success.className = 'success';
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      success.innerText = 'Test succeeded.';
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      messagesWrap.appendChild(success);
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (totalTime > 0.0) {
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        var avgTime = totalTime / test.trials;
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        avg.className = 'result';
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        avg.innerText = 'Avg: ' + avgTime.toFixed(3) + ' s';
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        resultMap[test.name] = avgTime;
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        updateDependencies();
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      console.log('Test failed.');
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var failure = document.createElement('div');
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      failure.className = 'failure';
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      failure.innerText = 'Test failed.';
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      messagesWrap.appendChild(failure);
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  function runTest(index, voiceName) {
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (emergencyStop) {
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      busy.style.visibility = 'hidden';
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      emergencyStop = false;
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var testRunName = 'Test run ' + testRunIndex + ', ' +
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      test.name + ', trial ' + (index+1) + ' of ' +
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      test.trials;
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    console.log('*** Beginning ' + testRunName +
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                ' with voice ' + voiceName);
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test.run(testRunName, voiceName, function(success, resultTime, errors) {
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (success) {
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        successCount++;
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (var i = 0; i < errors.length; i++) {
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        console.log(errors[i]);
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        var error = document.createElement('div');
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        error.className = 'error';
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        error.innerText = errors[i];
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        messagesWrap.appendChild(error);
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (resultTime != null) {
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        results[index].className = 'result';
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        results[index].innerText = resultTime.toFixed(3) + ' s';
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        totalTime += resultTime;
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      index++;
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (index < test.trials) {
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        runTest(index, voiceName);
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      } else {
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        finishTrials();
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    });
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  button.addEventListener('click', function() {
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var voiceIndex = $('voices').selectedIndex - 1;
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (voiceIndex < 0) {
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      alert('Please select a voice first!');
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    testRunIndex++;
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    busy.style.visibility = 'visible';
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    totalTime = 0.0;
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    successCount = 0;
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    messagesWrap.innerHTML = '';
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var voiceName = voiceArray[voiceIndex].voiceName;
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    runTest(0, voiceName);
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }, false);
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  updateDependencyFunctions.push(function() {
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (var i = 0; i < test.dependencies.length; i++) {
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (resultMap[test.dependencies[i]] != undefined) {
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        button.disabled = false;
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        outer.className = 'outer';
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      } else {
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        button.disabled = true;
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        outer.className = 'outer disabled';
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  });
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function load() {
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var voice = localStorage['voice'];
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome.tts.getVoices(function(va) {
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    voiceArray = va;
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (var i = 0; i < voiceArray.length; i++) {
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var opt = document.createElement('option');
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var name = voiceArray[i].voiceName;
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (name == localStorage['voice']) {
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        opt.setAttribute('selected', '');
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      opt.setAttribute('value', name);
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      opt.innerText = voiceArray[i].voiceName;
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      $('voices').appendChild(opt);
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  });
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  $('voices').addEventListener('change', function() {
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var i = $('voices').selectedIndex;
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    localStorage['voice'] = $('voices').item(i).value;
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }, false);
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  $('stop').addEventListener('click', stop);
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (var i = 0; i < tests.length; i++) {
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    registerTest(tests[i]);
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  updateDependencies();
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function stop() {
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  console.log('*** Emergency stop!');
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  emergencyStop = true;
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome.tts.stop();
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)document.addEventListener('DOMContentLoaded', load);
695