helloworlddialogplugin_test.js 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. // Copyright 2008 The Closure Library Authors. All Rights Reserved.
  2. // Use of this source code is governed by the Apache License, Version 2.0.
  3. goog.provide('goog.demos.editor.HelloWorldDialogPluginTest');
  4. goog.setTestOnly('goog.demos.editor.HelloWorldDialogPluginTest');
  5. goog.require('goog.demos.editor.HelloWorldDialog');
  6. goog.require('goog.demos.editor.HelloWorldDialog.OkEvent');
  7. goog.require('goog.demos.editor.HelloWorldDialogPlugin');
  8. goog.require('goog.demos.editor.HelloWorldDialogPlugin.Command');
  9. goog.require('goog.dom');
  10. goog.require('goog.dom.NodeType');
  11. goog.require('goog.testing.ExpectedFailures');
  12. goog.require('goog.testing.MockControl');
  13. goog.require('goog.testing.MockRange');
  14. goog.require('goog.testing.PropertyReplacer');
  15. goog.require('goog.testing.editor.FieldMock');
  16. goog.require('goog.testing.editor.TestHelper');
  17. goog.require('goog.testing.editor.dom');
  18. goog.require('goog.testing.events');
  19. goog.require('goog.testing.jsunit');
  20. goog.require('goog.testing.mockmatchers.ArgumentMatcher');
  21. goog.require('goog.userAgent');
  22. var plugin;
  23. var mockCtrl;
  24. var mockField;
  25. var mockRange;
  26. var mockPlaceCursorNextTo;
  27. var stubs = new goog.testing.PropertyReplacer();
  28. var fieldObj;
  29. var CUSTOM_MESSAGE = 'Hello, cruel world...';
  30. var expectedFailures = new goog.testing.ExpectedFailures();
  31. function setUp() {
  32. mockCtrl = new goog.testing.MockControl();
  33. mockRange = new goog.testing.MockRange();
  34. mockCtrl.addMock(mockRange);
  35. mockField =
  36. new goog.testing.editor.FieldMock(undefined, undefined, mockRange);
  37. mockCtrl.addMock(mockField);
  38. mockPlaceCursorNextTo = mockCtrl.createFunctionMock('placeCursorNextTo');
  39. }
  40. function tearDown() {
  41. plugin.dispose();
  42. tearDownRealEditableField();
  43. expectedFailures.handleTearDown();
  44. stubs.reset();
  45. goog.dom.removeChildren(goog.dom.getElement('myField'));
  46. }
  47. /**
  48. * Tests that the plugin's dialog is properly created.
  49. */
  50. function testCreateDialog() {
  51. mockField.$replay();
  52. plugin = new goog.demos.editor.HelloWorldDialogPlugin();
  53. plugin.registerFieldObject(mockField);
  54. var dialog = plugin.createDialog(goog.dom.getDomHelper());
  55. assertTrue('Dialog should be of type goog.demos.editor.HelloWorldDialog',
  56. dialog instanceof goog.demos.editor.HelloWorldDialog);
  57. mockField.$verify();
  58. }
  59. /**
  60. * Tests that when the OK event fires the editable field is properly updated.
  61. */
  62. function testOk() {
  63. mockField.focus();
  64. mockField.dispatchBeforeChange();
  65. mockRange.removeContents();
  66. // Tests that an argument is a span with the custom message.
  67. var createdNodeMatcher = new goog.testing.mockmatchers.ArgumentMatcher(
  68. function(arg) {
  69. return arg.nodeType == goog.dom.NodeType.ELEMENT &&
  70. arg.tagName == goog.dom.TagName.SPAN &&
  71. goog.dom.getRawTextContent(arg) == CUSTOM_MESSAGE;
  72. });
  73. mockRange.insertNode(createdNodeMatcher, false);
  74. mockRange.$does(function(node, before) {
  75. return node;
  76. });
  77. mockPlaceCursorNextTo(createdNodeMatcher, false);
  78. stubs.set(goog.editor.range, 'placeCursorNextTo', mockPlaceCursorNextTo);
  79. mockField.dispatchSelectionChangeEvent();
  80. mockField.dispatchChange();
  81. mockCtrl.$replayAll();
  82. plugin = new goog.demos.editor.HelloWorldDialogPlugin();
  83. plugin.registerFieldObject(mockField);
  84. var dialog = plugin.createDialog(goog.dom.getDomHelper());
  85. // Mock of execCommand + clicking OK without actually opening the dialog.
  86. dialog.dispatchEvent(
  87. new goog.demos.editor.HelloWorldDialog.OkEvent(CUSTOM_MESSAGE));
  88. mockCtrl.$verifyAll();
  89. }
  90. /**
  91. * Setup a real editable field (instead of a mock) and register the plugin to
  92. * it.
  93. */
  94. function setUpRealEditableField() {
  95. fieldObj = new goog.editor.Field('myField', document);
  96. fieldObj.makeEditable();
  97. // Register the plugin to that field.
  98. plugin = new goog.demos.editor.HelloWorldDialogPlugin();
  99. fieldObj.registerPlugin(plugin);
  100. }
  101. /**
  102. * Tear down the real editable field.
  103. */
  104. function tearDownRealEditableField() {
  105. if (fieldObj) {
  106. fieldObj.makeUneditable();
  107. fieldObj.dispose();
  108. }
  109. }
  110. /**
  111. * Tests that the selection is cleared when the dialog opens and is
  112. * correctly restored after ok is clicked.
  113. */
  114. function testRestoreSelectionOnOk() {
  115. setUpRealEditableField();
  116. fieldObj.setHtml(false, '12345');
  117. var elem = fieldObj.getElement();
  118. var helper = new goog.testing.editor.TestHelper(elem);
  119. helper.select('12345', 1, '12345', 4); // Selects '234'.
  120. assertEquals('Incorrect text selected before dialog is opened',
  121. '234',
  122. fieldObj.getRange().getText());
  123. plugin.execCommand(
  124. goog.demos.editor.HelloWorldDialogPlugin.Command.HELLO_WORLD_DIALOG);
  125. // TODO(user): IE returns some bogus range when field doesn't have
  126. // selection. Remove the expectedFailure when robbyw fixes the issue.
  127. // NOTE(user): You can't remove the selection from a field in Opera without
  128. // blurring it.
  129. elem.parentNode.blur();
  130. expectedFailures.expectFailureFor(goog.userAgent.IE ||
  131. goog.userAgent.OPERA);
  132. try {
  133. assertNull('There should be no selection while dialog is open',
  134. fieldObj.getRange());
  135. } catch (e) {
  136. expectedFailures.handleException(e);
  137. }
  138. goog.testing.events.fireClickSequence(
  139. plugin.dialog_.getOkButtonElement());
  140. assertEquals('No text should be selected after clicking ok',
  141. '',
  142. fieldObj.getRange().getText());
  143. // Test that the caret is placed after the custom message.
  144. goog.testing.editor.dom.assertRangeBetweenText(
  145. 'Hello, world!', '5', fieldObj.getRange());
  146. }