<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<script type="text/javascript" src="nacltest.js"></script>
<script type="text/javascript" src="nacl_mozc_test_util.js"></script>
<script type="text/javascript" src="nacl_mozc.js"></script>
<script type="text/javascript" src="key_translator.js"></script>
<title>Chrome NaCl Mozc exntension Test</title>
</head>
<body>

<script type="text/javascript">

var CONTEXT_ID = 1;
var ENGINE_ID = 'dummy_id';

var tester = new Tester();

tester.addAsyncTest('OnKeyEventAsyncTest', function(status) {
  new mozc_test_util.Executer(status, function(registerer, mozc) {
    var requestId = 0;

    registerer(mozc.onActivate_.bind(mozc, ENGINE_ID), 0);

    registerer(mozc.onFocus_.bind(mozc, {
      contextID: CONTEXT_ID,
      type: 'text'
    }), 1);

    registerer(function() {
      original_api = chrome.input.ime.setComposition;
      chrome.input.ime.setComposition = function(param, callback) {
        chrome.input.ime.setComposition = original_api;
        // 'あ'
        status.assertEqual('\u3042', param.text);
      };

      mozc.onKeyEventAsync_(ENGINE_ID, {
        requestId: ++requestId,
        code: 'KeyA',
        key: 'a',
        type: 'keydown'
      });
    }, 1);

    registerer(function() {
      original_api = chrome.input.ime.setComposition;
      chrome.input.ime.setComposition = function(param, callback) {
        chrome.input.ime.setComposition = original_api;
        // 'ア'
        status.assertEqual('\u30A2', param.text);
      }

      mozc.onKeyEventAsync_(ENGINE_ID, {
        requestId: 2,
        code: '',  // code is not set while typing function keys.
        key: 'BrightnessUp',  // 'F7'
        type: 'keydown'
      });
    }, 1);

    registerer(function() {
      original_api = chrome.input.ime.commitText;
      chrome.input.ime.commitText = function(data) {
        chrome.input.ime.commitText = original_api;
        // 'ア'
        status.assertEqual(CONTEXT_ID, data.contextID);
        status.assertEqual('\u30A2', data.text);
      }

      mozc.onKeyEventAsync_(ENGINE_ID, {
        requestId: ++requestId,
        code: 'Enter',
        key: 'Enter',
        type: 'keydown'
      });
    }, 1);

    // All tests succeeded.
    registerer(status.pass.bind(status), 0);
  });
});

tester.run();

</script>

</body>
</html>
