aboutsummaryrefslogtreecommitdiff
path: root/contexts/data/lib/closure-library/closure/goog/editor/plugin_test.html
blob: 264cc0ce4b5ef1658562182e42256f92cde1ee89 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
<!--
  All Rights Reserved.

  Tests for goog.editor.Plugin.

  @author nicksantos@google.com (Nick Santos)
--><html>
<!--
Copyright 2008 The Closure Library Authors. All Rights Reserved.

Use of this source code is governed by the Apache License, Version 2.0.
See the COPYING file for details.
-->
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>Editor Unit Tests - goog.editor.Plugin</title>
<script src='../base.js'></script>
<script src='../deps.js'></script>
<script>
  goog.require('goog.editor.Field');
  goog.require('goog.editor.Plugin');
  goog.require('goog.functions');
  goog.require('goog.userAgent');
  goog.require('goog.testing.StrictMock');
  goog.require('goog.testing.jsunit');
</script>
</head>
<body>

<script>

var plugin;
var fieldObject;


function setUp() {
  plugin = new goog.editor.Plugin();
  fieldObject = {};
}


function tearDown() {
  plugin.dispose();
}


function testRegisterFieldObject() {
  plugin.registerFieldObject(fieldObject);
  assertEquals('Register field object must be stored in protected field.',
      fieldObject, plugin.fieldObject);

  assertFalse('Newly registered plugin must not be enabled.',
      plugin.isEnabled(fieldObject));
}


function testUnregisterFieldObject() {
  plugin.registerFieldObject(fieldObject);
  plugin.enable(fieldObject);
  plugin.unregisterFieldObject(fieldObject);

  assertNull('fieldObject property must be undefined after ' +
      'unregistering a field object.', plugin.fieldObject);
  assertFalse('Unregistered field object must not be enabled',
      plugin.isEnabled(fieldObject));
}


function testEnable() {
  plugin.registerFieldObject(fieldObject);
  plugin.enable(fieldObject);

  assertTrue('Enabled field object must be enabled according to isEnabled().',
      plugin.isEnabled(fieldObject));
}


function testDisable() {
  plugin.registerFieldObject(fieldObject);
  plugin.enable(fieldObject);
  plugin.disable(fieldObject);

  assertFalse('Disabled field object must be disabled according to ' +
      'isEnabled().', plugin.isEnabled(fieldObject));
}


function testIsEnabled() {
  // Other base cases covered while testing enable() and disable().
  
  assertFalse('Unregistered field object must be disabled according ' +
              'to isEnabled().', plugin.isEnabled(fieldObject));
}


function testIsSupportedCommand() {
  assertFalse('Base plugin class must not support any commands.',
      plugin.isSupportedCommand('+indent'))
}

function testExecCommand() {
  var mockField = new goog.testing.StrictMock(goog.editor.Field);
  plugin.registerFieldObject(mockField);

  if (goog.userAgent.GECKO) {
    mockField.stopChangeEvents(true, true);
  }
  mockField.dispatchBeforeChange();
  // Note(user): dispatch change turns back on (delayed) change events.
  mockField.dispatchChange();
  mockField.dispatchSelectionChangeEvent();
  mockField.$replay();

  var passedCommand, passedArg;
  plugin.execCommandInternal = function(command, arg){
    passedCommand = command;
    passedArg = arg;
  };
  plugin.execCommand('+indent', true);

  // Verify that execCommand dispatched the expected events.
  mockField.$verify();
  mockField.$reset();
  // Verify that execCommandInternal was called with the correct arguments.
  assertEquals('+indent', passedCommand);
  assertTrue(passedArg);

  plugin.isSilentCommand = goog.functions.constant(true);
  mockField.$replay();
  plugin.execCommand('+outdent', false);
  // Verify that execCommand on a silent plugin dispatched no events.
  mockField.$verify();
  // Verify that execCommandInternal was called with the correct arguments.
  assertEquals('+outdent', passedCommand);
  assertFalse(passedArg);
}

/**
 * Regression test for http://b/issue?id=1471355 .
 */
function testExecCommandException() {
  var mockField = new goog.testing.StrictMock(goog.editor.Field);
  plugin.registerFieldObject(mockField);
  plugin.execCommandInternal = function() {
    throw 1;
  };

  if (goog.userAgent.GECKO) {
    mockField.stopChangeEvents(true, true);
  }
  mockField.dispatchBeforeChange();
  // Note(user): dispatch change turns back on (delayed) change events.
  mockField.dispatchChange();
  mockField.dispatchSelectionChangeEvent();
  mockField.$replay();

  assertThrows('Exception should not be swallowed', function() {
    plugin.execCommand();
  });

  // Verifies that cleanup is done despite the exception.
  mockField.$verify();
}

function testDisposed() {
  plugin.registerFieldObject(fieldObject);
  plugin.dispose();
  assert(plugin.getDisposed());
  assertNull('Disposed plugin must not have a field object.',
      plugin.fieldObject);
  assertFalse('Disposed plugin must not have an enabled field object.',
      plugin.isEnabled(fieldObject));
}

function testIsAndSetAutoDispose() {
  assertTrue('Plugin must start auto-disposable', plugin.isAutoDispose());

  plugin.setAutoDispose(false);
  assertFalse(plugin.isAutoDispose());

  plugin.setAutoDispose(true);
  assertTrue(plugin.isAutoDispose());
}

</script>
</body>
</html>