headless-squirrel 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (130) hide show
  1. data/README.rdoc +55 -0
  2. data/Rakefile +27 -0
  3. data/bin/jstest +10 -0
  4. data/lib/headless_squirrel.rb +2 -0
  5. data/lib/headless_squirrel/console.rb +24 -0
  6. data/lib/headless_squirrel/runner.rb +70 -0
  7. data/lib/headless_squirrel/test.rb +17 -0
  8. data/lib/headless_squirrel/test_case.rb +158 -0
  9. data/test/fixtures/a_unit_test.html +27 -0
  10. data/test/fixtures/a_unit_test.js +22 -0
  11. data/test/fixtures/syntax_error.html +27 -0
  12. data/test/fixtures/syntax_error.js +5 -0
  13. data/test/fixtures/type_error.html +27 -0
  14. data/test/fixtures/type_error.js +1 -0
  15. data/test/regression/prototype/unit/ajax_test.html +29 -0
  16. data/test/regression/prototype/unit/array_test.html +28 -0
  17. data/test/regression/prototype/unit/assets/prototype.js +4900 -0
  18. data/test/regression/prototype/unit/assets/unittest.css +50 -0
  19. data/test/regression/prototype/unit/assets/unittest.js +615 -0
  20. data/test/regression/prototype/unit/assets/unittest_transport.js +1 -0
  21. data/test/regression/prototype/unit/base_test.html +27 -0
  22. data/test/regression/prototype/unit/class_test.html +27 -0
  23. data/test/regression/prototype/unit/date_test.html +27 -0
  24. data/test/regression/prototype/unit/dom_test.html +304 -0
  25. data/test/regression/prototype/unit/element_mixins_test.html +30 -0
  26. data/test/regression/prototype/unit/enumerable_test.html +35 -0
  27. data/test/regression/prototype/unit/event_test.html +31 -0
  28. data/test/regression/prototype/unit/fixtures/ajax.html +2 -0
  29. data/test/regression/prototype/unit/fixtures/ajax.js +42 -0
  30. data/test/regression/prototype/unit/fixtures/array.html +1 -0
  31. data/test/regression/prototype/unit/fixtures/class.js +83 -0
  32. data/test/regression/prototype/unit/fixtures/content.html +1 -0
  33. data/test/regression/prototype/unit/fixtures/data.json +1 -0
  34. data/test/regression/prototype/unit/fixtures/dom.css +84 -0
  35. data/test/regression/prototype/unit/fixtures/dom.html +278 -0
  36. data/test/regression/prototype/unit/fixtures/dom.js +17 -0
  37. data/test/regression/prototype/unit/fixtures/element_mixins.html +4 -0
  38. data/test/regression/prototype/unit/fixtures/element_mixins.js +2 -0
  39. data/test/regression/prototype/unit/fixtures/empty.html +0 -0
  40. data/test/regression/prototype/unit/fixtures/empty.js +1 -0
  41. data/test/regression/prototype/unit/fixtures/enumerable.html +8 -0
  42. data/test/regression/prototype/unit/fixtures/enumerable.js +23 -0
  43. data/test/regression/prototype/unit/fixtures/event.html +4 -0
  44. data/test/regression/prototype/unit/fixtures/form.html +108 -0
  45. data/test/regression/prototype/unit/fixtures/function.js +13 -0
  46. data/test/regression/prototype/unit/fixtures/hash.js +25 -0
  47. data/test/regression/prototype/unit/fixtures/hello.js +1 -0
  48. data/test/regression/prototype/unit/fixtures/logo.gif +0 -0
  49. data/test/regression/prototype/unit/fixtures/object.html +6 -0
  50. data/test/regression/prototype/unit/fixtures/object.js +7 -0
  51. data/test/regression/prototype/unit/fixtures/position.html +9 -0
  52. data/test/regression/prototype/unit/fixtures/selector.html +71 -0
  53. data/test/regression/prototype/unit/fixtures/string.js +8 -0
  54. data/test/regression/prototype/unit/fixtures/unittest.html +18 -0
  55. data/test/regression/prototype/unit/form_test.html +135 -0
  56. data/test/regression/prototype/unit/function_test.html +27 -0
  57. data/test/regression/prototype/unit/hash_test.html +27 -0
  58. data/test/regression/prototype/unit/number_test.html +27 -0
  59. data/test/regression/prototype/unit/object_test.html +32 -0
  60. data/test/regression/prototype/unit/periodical_executer_test.html +27 -0
  61. data/test/regression/prototype/unit/position_test.html +36 -0
  62. data/test/regression/prototype/unit/prototype_test.html +27 -0
  63. data/test/regression/prototype/unit/range_test.html +27 -0
  64. data/test/regression/prototype/unit/regexp_test.html +27 -0
  65. data/test/regression/prototype/unit/selector_test.html +98 -0
  66. data/test/regression/prototype/unit/string_test.html +27 -0
  67. data/test/regression/prototype/unit/tests/ajax_test.js +379 -0
  68. data/test/regression/prototype/unit/tests/array_test.js +186 -0
  69. data/test/regression/prototype/unit/tests/base_test.js +43 -0
  70. data/test/regression/prototype/unit/tests/class_test.js +136 -0
  71. data/test/regression/prototype/unit/tests/date_test.js +5 -0
  72. data/test/regression/prototype/unit/tests/dom_test.js +1493 -0
  73. data/test/regression/prototype/unit/tests/element_mixins_test.js +32 -0
  74. data/test/regression/prototype/unit/tests/enumerable_test.js +271 -0
  75. data/test/regression/prototype/unit/tests/event_test.js +235 -0
  76. data/test/regression/prototype/unit/tests/form_test.js +382 -0
  77. data/test/regression/prototype/unit/tests/function_test.js +133 -0
  78. data/test/regression/prototype/unit/tests/hash_test.js +178 -0
  79. data/test/regression/prototype/unit/tests/number_test.js +44 -0
  80. data/test/regression/prototype/unit/tests/object_test.js +180 -0
  81. data/test/regression/prototype/unit/tests/periodical_executer_test.js +15 -0
  82. data/test/regression/prototype/unit/tests/position_test.js +44 -0
  83. data/test/regression/prototype/unit/tests/prototype_test.js +43 -0
  84. data/test/regression/prototype/unit/tests/range_test.js +58 -0
  85. data/test/regression/prototype/unit/tests/regexp_test.js +42 -0
  86. data/test/regression/prototype/unit/tests/selector_test.js +408 -0
  87. data/test/regression/prototype/unit/tests/string_test.js +548 -0
  88. data/test/regression/prototype/unit/tests/unittest_test.js +148 -0
  89. data/test/regression/prototype/unit/unittest_test.html +45 -0
  90. data/test/regression/prototype/upstream +1 -0
  91. data/test/regression/scriptaculous/unit/_ajax_inplaceeditor_ipce_alt_text.html +1 -0
  92. data/test/regression/scriptaculous/unit/_ajax_inplaceeditor_ipce_collection.js +1 -0
  93. data/test/regression/scriptaculous/unit/_ajax_inplaceeditor_result.html +1 -0
  94. data/test/regression/scriptaculous/unit/_ajax_inplaceeditor_result2.html +1 -0
  95. data/test/regression/scriptaculous/unit/_ajax_inplaceeditor_tagged.html +1 -0
  96. data/test/regression/scriptaculous/unit/_ajax_inplaceeditor_text.html +1 -0
  97. data/test/regression/scriptaculous/unit/_ajax_updater_result.html +20 -0
  98. data/test/regression/scriptaculous/unit/_autocomplete_result.html +11 -0
  99. data/test/regression/scriptaculous/unit/_autocomplete_result_nobr.html +1 -0
  100. data/test/regression/scriptaculous/unit/ajax_autocompleter_test.html +243 -0
  101. data/test/regression/scriptaculous/unit/ajax_inplaceeditor_test.html +895 -0
  102. data/test/regression/scriptaculous/unit/assets/builder.js +134 -0
  103. data/test/regression/scriptaculous/unit/assets/controls.js +963 -0
  104. data/test/regression/scriptaculous/unit/assets/dragdrop.js +973 -0
  105. data/test/regression/scriptaculous/unit/assets/effects.js +1122 -0
  106. data/test/regression/scriptaculous/unit/assets/javascripttest.rb +203 -0
  107. data/test/regression/scriptaculous/unit/assets/prototype.js +4320 -0
  108. data/test/regression/scriptaculous/unit/assets/scriptaculous.js +66 -0
  109. data/test/regression/scriptaculous/unit/assets/slider.js +273 -0
  110. data/test/regression/scriptaculous/unit/assets/sound.js +57 -0
  111. data/test/regression/scriptaculous/unit/assets/unittest.js +566 -0
  112. data/test/regression/scriptaculous/unit/bdd_test.html +150 -0
  113. data/test/regression/scriptaculous/unit/builder_test.html +262 -0
  114. data/test/regression/scriptaculous/unit/dragdrop_test.html +131 -0
  115. data/test/regression/scriptaculous/unit/effects_test.html +547 -0
  116. data/test/regression/scriptaculous/unit/element_test.html +116 -0
  117. data/test/regression/scriptaculous/unit/icon.png +0 -0
  118. data/test/regression/scriptaculous/unit/index.html +70 -0
  119. data/test/regression/scriptaculous/unit/loading_test.html +41 -0
  120. data/test/regression/scriptaculous/unit/position_clone_test.html +312 -0
  121. data/test/regression/scriptaculous/unit/slider_test.html +437 -0
  122. data/test/regression/scriptaculous/unit/sortable_test.html +205 -0
  123. data/test/regression/scriptaculous/unit/string_test.html +71 -0
  124. data/test/regression/scriptaculous/unit/unittest_test.html +154 -0
  125. data/test/regression/scriptaculous/upstream +1 -0
  126. data/test/test_helper.rb +20 -0
  127. data/test/unit/runner_test.rb +165 -0
  128. data/test/unit/test_case_test.rb +207 -0
  129. data/test/unit/test_test.rb +24 -0
  130. metadata +209 -0
@@ -0,0 +1,382 @@
1
+ // sweet sweet additional assertions
2
+ Object.extend(Test.Unit.Testcase.prototype, {
3
+ assertEnabled: function() {
4
+ for (var i = 0, element; element = arguments[i]; i++) {
5
+ this.assert(!$(element).disabled, Test.Unit.inspect(element) + ' was disabled');
6
+ }
7
+ },
8
+ assertDisabled: function() {
9
+ for (var i = 0, element; element = arguments[i]; i++) {
10
+ this.assert($(element).disabled, Test.Unit.inspect(element) + ' was enabled');
11
+ }
12
+ }
13
+ });
14
+
15
+ new Test.Unit.Runner({
16
+
17
+ // Make sure to set defaults in the test forms, as some browsers override this
18
+ // with previously entered values on page reload
19
+ setup: function(){
20
+ $$('form').each(function(f){ f.reset() });
21
+ // hidden value does not reset (for some reason)
22
+ $('bigform')['tf_hidden'].value = '';
23
+ },
24
+
25
+ testDollarF: function(){
26
+ this.assertEqual("4", $F("input_enabled"));
27
+ },
28
+
29
+ testFormReset: function() {
30
+ this.assert(!Object.isUndefined(Form.reset('form').reset));
31
+ },
32
+
33
+ testFormElementEventObserver: function(){
34
+ var callbackCounter = 0;
35
+ var observer = new Form.Element.EventObserver('input_enabled', function(){
36
+ callbackCounter++;
37
+ });
38
+
39
+ this.assertEqual(0, callbackCounter);
40
+ $('input_enabled').value = 'boo!';
41
+ observer.onElementEvent(); // can't test the event directly, simulating
42
+ this.assertEqual(1, callbackCounter);
43
+ },
44
+
45
+ testFormElementObserver: function(){
46
+ var timedCounter = 0;
47
+ // First part: regular field
48
+ var observer = new Form.Element.Observer('input_enabled', 0.5, function() {
49
+ ++timedCounter;
50
+ });
51
+
52
+ // Test it's unchanged yet
53
+ this.assertEqual(0, timedCounter);
54
+ // Test it doesn't change on first check
55
+ this.wait(550, function() {
56
+ this.assertEqual(0, timedCounter);
57
+ // Change, test it doesn't immediately change
58
+ $('input_enabled').value = 'yowza!';
59
+ this.assertEqual(0, timedCounter);
60
+ // Test it changes on next check, but not again on the next
61
+ this.wait(550, function() {
62
+ this.assertEqual(1, timedCounter);
63
+ this.wait(550, function() {
64
+ this.assertEqual(1, timedCounter);
65
+ observer.stop();
66
+ });
67
+ });
68
+ });
69
+
70
+ // Second part: multiple-select
71
+ [1, 2, 3].each(function(index) {
72
+ $('multiSel1_opt' + index).selected = (1 == index);
73
+ });
74
+ timedCounter = 0;
75
+ observer = new Form.Element.Observer('multiSel1', 0.5, function() {
76
+ ++timedCounter;
77
+ });
78
+
79
+ // Test it's unchanged yet
80
+ this.assertEqual(0, timedCounter);
81
+ // Test it doesn't change on first check
82
+ this.wait(550, function() {
83
+ this.assertEqual(0, timedCounter);
84
+ // Change, test it doesn't immediately change
85
+ // NOTE: it is important that the 3rd be re-selected, for the
86
+ // serialize form to obtain the expected value :-)
87
+ $('multiSel1_opt3').selected = true;
88
+ this.assertEqual(0, timedCounter);
89
+ // Test it changes on next check, but not again on the next
90
+ this.wait(550, function() {
91
+ this.assertEqual(1, timedCounter);
92
+ this.wait(550, function() {
93
+ this.assertEqual(1, timedCounter);
94
+ observer.stop();
95
+ });
96
+ });
97
+ });
98
+ },
99
+
100
+ testFormObserver: function(){
101
+ var timedCounter = 0;
102
+ // should work the same way was Form.Element.Observer
103
+ var observer = new Form.Observer('form', 0.5, function(form, value) {
104
+ ++timedCounter;
105
+ });
106
+
107
+ // Test it's unchanged yet
108
+ this.assertEqual(0, timedCounter);
109
+ // Test it doesn't change on first check
110
+ this.wait(550, function() {
111
+ this.assertEqual(0, timedCounter);
112
+ // Change, test it doesn't immediately change
113
+ $('input_enabled').value = 'yowza!';
114
+ this.assertEqual(0, timedCounter);
115
+ // Test it changes on next check, but not again on the next
116
+ this.wait(550, function() {
117
+ this.assertEqual(1, timedCounter);
118
+ this.wait(550, function() {
119
+ this.assertEqual(1, timedCounter);
120
+ observer.stop();
121
+ });
122
+ });
123
+ });
124
+ },
125
+
126
+ testFormEnabling: function(){
127
+ var form = $('bigform')
128
+ var input1 = $('dummy_disabled');
129
+ var input2 = $('focus_text');
130
+
131
+ this.assertDisabled(input1);
132
+ this.assertEnabled(input2);
133
+
134
+ form.disable();
135
+ this.assertDisabled(input1, input2);
136
+ form.enable();
137
+ this.assertEnabled(input1, input2);
138
+ input1.disable();
139
+ this.assertDisabled(input1);
140
+
141
+ // non-form elements:
142
+ var fieldset = $('selects_fieldset');
143
+ var fields = fieldset.immediateDescendants();
144
+ fields.each(function(select) { this.assertEnabled(select) }, this);
145
+
146
+ Form.disable(fieldset)
147
+ fields.each(function(select) { this.assertDisabled(select) }, this);
148
+
149
+ Form.enable(fieldset)
150
+ fields.each(function(select) { this.assertEnabled(select) }, this);
151
+ },
152
+
153
+ testFormElementEnabling: function(){
154
+ var field = $('input_disabled');
155
+ field.enable();
156
+ this.assertEnabled(field);
157
+ field.disable();
158
+ this.assertDisabled(field);
159
+
160
+ var field = $('input_enabled');
161
+ this.assertEnabled(field);
162
+ field.disable();
163
+ this.assertDisabled(field);
164
+ field.enable();
165
+ this.assertEnabled(field);
166
+ },
167
+
168
+ // due to the lack of a DOM hasFocus() API method,
169
+ // we're simulating things here a little bit
170
+ testFormActivating: function(){
171
+ // Firefox, IE, and Safari 2+
172
+ function getSelection(element){
173
+ try {
174
+ if (typeof element.selectionStart == 'number') {
175
+ return element.value.substring(element.selectionStart, element.selectionEnd);
176
+ } else if (document.selection && document.selection.createRange) {
177
+ return document.selection.createRange().text;
178
+ }
179
+ }
180
+ catch(e){ return null }
181
+ }
182
+
183
+ // Form.focusFirstElement shouldn't focus disabled elements
184
+ var element = Form.findFirstElement('bigform');
185
+ this.assertEqual('submit', element.id);
186
+
187
+ // Test IE doesn't select text on buttons
188
+ Form.focusFirstElement('bigform');
189
+ if(document.selection) this.assertEqual('', getSelection(element));
190
+
191
+ // Form.Element.activate shouldn't select text on buttons
192
+ element = $('focus_text');
193
+ this.assertEqual('', getSelection(element));
194
+
195
+ // Form.Element.activate should select text on text input elements
196
+ element.activate();
197
+ this.assertEqual('Hello', getSelection(element));
198
+
199
+ // Form.Element.activate shouldn't raise an exception when the form or field is hidden
200
+ this.assertNothingRaised(function() {
201
+ $('form_focus_hidden').focusFirstElement();
202
+ });
203
+ },
204
+
205
+ testFormGetElements: function() {
206
+ var elements = Form.getElements('various'),
207
+ names = $w('tf_selectOne tf_textarea tf_checkbox tf_selectMany tf_text tf_radio tf_hidden tf_password');
208
+ this.assertEnumEqual(names, elements.pluck('name'))
209
+ },
210
+
211
+ testFormGetInputs: function() {
212
+ var form = $('form');
213
+ [form.getInputs(), Form.getInputs(form)].each(function(inputs){
214
+ this.assertEqual(inputs.length, 5);
215
+ this.assert(inputs instanceof Array);
216
+ this.assert(inputs.all(function(input) { return (input.tagName == "INPUT"); }));
217
+ }, this);
218
+ },
219
+
220
+ testFormFindFirstElement: function() {
221
+ this.assertEqual($('ffe_checkbox'), $('ffe').findFirstElement());
222
+ this.assertEqual($('ffe_ti_submit'), $('ffe_ti').findFirstElement());
223
+ this.assertEqual($('ffe_ti2_checkbox'), $('ffe_ti2').findFirstElement());
224
+ },
225
+
226
+ testFormSerialize: function() {
227
+ // form is initially empty
228
+ var form = $('bigform');
229
+ var expected = { tf_selectOne:'', tf_textarea:'', tf_text:'', tf_hidden:'', tf_password:'' };
230
+ this.assertHashEqual(expected, Form.serialize('various', true));
231
+
232
+ // set up some stuff
233
+ form['tf_selectOne'].selectedIndex = 1;
234
+ form['tf_textarea'].value = "boo hoo!";
235
+ form['tf_text'].value = "123öäü";
236
+ form['tf_hidden'].value = "moo%hoo&test";
237
+ form['tf_password'].value = 'sekrit code';
238
+ form['tf_checkbox'].checked = true;
239
+ form['tf_radio'].checked = true;
240
+ var expected = { tf_selectOne:1, tf_textarea:"boo hoo!", tf_text:"123öäü",
241
+ tf_hidden:"moo%hoo&test", tf_password:'sekrit code', tf_checkbox:'on', tf_radio:'on' }
242
+
243
+ // return params
244
+ this.assertHashEqual(expected, Form.serialize('various', true));
245
+ // return string
246
+ this.assertEnumEqual(Object.toQueryString(expected).split('&').sort(),
247
+ Form.serialize('various').split('&').sort());
248
+ this.assertEqual('string', typeof $('form').serialize({ hash:false }));
249
+
250
+ // Checks that disabled element is not included in serialized form.
251
+ $('input_enabled').enable();
252
+ this.assertHashEqual({ val1:4, action:'blah', first_submit:'Commit it!' },
253
+ $('form').serialize(true));
254
+
255
+ // should not eat empty values for duplicate names
256
+ $('checkbox_hack').checked = false;
257
+ var data = Form.serialize('value_checks', true);
258
+ this.assertEnumEqual(['', 'siamese'], data['twin']);
259
+ this.assertEqual('0', data['checky']);
260
+
261
+ $('checkbox_hack').checked = true;
262
+ this.assertEnumEqual($w('1 0'), Form.serialize('value_checks', true)['checky']);
263
+
264
+ // all kinds of SELECT controls
265
+ var params = Form.serialize('selects_fieldset', true);
266
+ var expected = { 'nvm[]':['One', 'Three'], evu:'', 'evm[]':['', 'Three'] };
267
+ this.assertHashEqual(expected, params);
268
+ params = Form.serialize('selects_wrapper', true);
269
+ this.assertHashEqual(Object.extend(expected, { vu:1, 'vm[]':[1, 3], nvu:'One' }), params);
270
+
271
+ // explicit submit button
272
+ this.assertHashEqual({ val1:4, action:'blah', second_submit:'Delete it!' },
273
+ $('form').serialize({ submit: 'second_submit' }));
274
+ this.assertHashEqual({ val1:4, action:'blah' },
275
+ $('form').serialize({ submit: false }));
276
+ this.assertHashEqual({ val1:4, action:'blah' },
277
+ $('form').serialize({ submit: 'inexistent' }));
278
+
279
+ // file input should not be serialized
280
+ this.assertEqual('', $('form_with_file_input').serialize());
281
+ },
282
+
283
+ testFormMethodsOnExtendedElements: function() {
284
+ var form = $('form');
285
+ this.assertEqual(Form.serialize('form'), form.serialize());
286
+ this.assertEqual(Form.Element.serialize('input_enabled'), $('input_enabled').serialize());
287
+ this.assertNotEqual(form.serialize, $('input_enabled').serialize);
288
+
289
+ Element.addMethods('INPUT', { anInputMethod: function(input) { return 'input' } });
290
+ Element.addMethods('SELECT', { aSelectMethod: function(select) { return 'select' } });
291
+
292
+ form = $('bigform');
293
+ var input = form['tf_text'], select = form['tf_selectOne'];
294
+ input._extendedByPrototype = select._extendedByPrototype = void 0;
295
+
296
+ this.assert($(input).anInputMethod);
297
+ this.assert(!input.aSelectMethod);
298
+ this.assertEqual('input', input.anInputMethod());
299
+
300
+ this.assert($(select).aSelectMethod);
301
+ this.assert(!select.anInputMethod);
302
+ this.assertEqual('select', select.aSelectMethod());
303
+ },
304
+
305
+ testFormRequest: function() {
306
+ var request = $("form").request();
307
+ this.assert($("form").hasAttribute("method"));
308
+ this.assert(request.url.include("fixtures/empty.js?val1=4"));
309
+ this.assertEqual("get", request.method);
310
+
311
+ request = $("form").request({ method: "put", parameters: {val2: "hello"} });
312
+ this.assert(request.url.endsWith("fixtures/empty.js"));
313
+ this.assertEqual(4, request.options.parameters['val1']);
314
+ this.assertEqual('hello', request.options.parameters['val2']);
315
+ this.assertEqual("post", request.method);
316
+ this.assertEqual("put", request.parameters['_method']);
317
+
318
+ // with empty action attribute
319
+ request = $("ffe").request({ method: 'post' });
320
+ this.assert(request.url.include("/form_test.html"),
321
+ 'wrong default action for form element with empty action attribute');
322
+ },
323
+
324
+ testFormElementMethodsChaining: function(){
325
+ var methods = $w('clear activate disable enable'),
326
+ formElements = $('form').getElements();
327
+ methods.each(function(method){
328
+ formElements.each(function(element){
329
+ var returned = element[method]();
330
+ this.assertIdentical(element, returned);
331
+ }, this);
332
+ }, this);
333
+ },
334
+
335
+ testSetValue: function(){
336
+ // text input
337
+ var input = $('input_enabled'), oldValue = input.getValue();
338
+ this.assertEqual(input, input.setValue('foo'), 'setValue chaining is broken');
339
+ this.assertEqual('foo', input.getValue(), 'value improperly set');
340
+ input.setValue(oldValue);
341
+ this.assertEqual(oldValue, input.getValue(), 'value improperly restored to original');
342
+
343
+ // checkbox
344
+ input = $('checkbox_hack');
345
+ input.setValue(false);
346
+ this.assertEqual(null, input.getValue(), 'checkbox should be unchecked');
347
+ input.setValue(true);
348
+ this.assertEqual("1", input.getValue(), 'checkbox should be checked');
349
+ // selectbox
350
+ input = $('bigform')['vu'];
351
+ input.setValue('3');
352
+ this.assertEqual('3', input.getValue(), 'single select option improperly set');
353
+ input.setValue('1');
354
+ this.assertEqual('1', input.getValue());
355
+ // multiple select
356
+ input = $('bigform')['vm[]'];
357
+ input.setValue(['2', '3']);
358
+ this.assertEnumEqual(['2', '3'], input.getValue(),
359
+ 'multiple select options improperly set');
360
+ input.setValue(['1', '3']);
361
+ this.assertEnumEqual(['1', '3'], input.getValue());
362
+ },
363
+
364
+ testSerializeFormTroublesomeNames: function() {
365
+ var el = new Element('form', {
366
+ action: '/'
367
+ });
368
+ var input = new Element('input', {
369
+ type: 'text',
370
+ name: 'length',
371
+ value: 'foo'
372
+ });
373
+ var input2 = new Element('input', {
374
+ type: 'text',
375
+ name: 'bar',
376
+ value: 'baz'
377
+ });
378
+ el.appendChild(input);
379
+ el.appendChild(input2);
380
+ this.assertHashEqual({ length: 'foo', bar: 'baz' }, el.serialize(true));
381
+ }
382
+ });
@@ -0,0 +1,133 @@
1
+ new Test.Unit.Runner({
2
+ testFunctionArgumentNames: function() {
3
+ this.assertEnumEqual([], (function() {}).argumentNames());
4
+ this.assertEnumEqual(["one"], (function(one) {}).argumentNames());
5
+ this.assertEnumEqual(["one", "two", "three"], (function(one, two, three) {}).argumentNames());
6
+ this.assertEnumEqual(["one", "two", "three"], (function( one , two
7
+ , three ) {}).argumentNames());
8
+ this.assertEqual("$super", (function($super) {}).argumentNames().first());
9
+
10
+ function named1() {};
11
+ this.assertEnumEqual([], named1.argumentNames());
12
+ function named2(one) {};
13
+ this.assertEnumEqual(["one"], named2.argumentNames());
14
+ function named3(one, two, three) {};
15
+ this.assertEnumEqual(["one", "two", "three"], named3.argumentNames());
16
+ function named4(one,
17
+ two,
18
+
19
+ three) {}
20
+ this.assertEnumEqual($w('one two three'), named4.argumentNames());
21
+ function named5(/*foo*/ foo, /* bar */ bar, /*****/ baz) {}
22
+ this.assertEnumEqual($w("foo bar baz"), named5.argumentNames());
23
+ function named6(
24
+ /*foo*/ foo,
25
+ /**/bar,
26
+ /* baz */ /* baz */ baz,
27
+ // Skip a line just to screw with the regex...
28
+ /* thud */ thud) {}
29
+ this.assertEnumEqual($w("foo bar baz thud"), named6.argumentNames());
30
+ },
31
+
32
+ testFunctionBind: function() {
33
+ function methodWithoutArguments() { return this.hi };
34
+ function methodWithArguments() { return this.hi + ',' + $A(arguments).join(',') };
35
+ var func = Prototype.emptyFunction;
36
+
37
+ this.assertIdentical(func, func.bind());
38
+ this.assertIdentical(func, func.bind(undefined));
39
+ this.assertNotIdentical(func, func.bind(null));
40
+
41
+ this.assertEqual('without', methodWithoutArguments.bind({ hi: 'without' })());
42
+ this.assertEqual('with,arg1,arg2', methodWithArguments.bind({ hi: 'with' })('arg1','arg2'));
43
+ this.assertEqual('withBindArgs,arg1,arg2',
44
+ methodWithArguments.bind({ hi: 'withBindArgs' }, 'arg1', 'arg2')());
45
+ this.assertEqual('withBindArgsAndArgs,arg1,arg2,arg3,arg4',
46
+ methodWithArguments.bind({ hi: 'withBindArgsAndArgs' }, 'arg1', 'arg2')('arg3', 'arg4'));
47
+ },
48
+
49
+ testFunctionCurry: function() {
50
+ var split = function(delimiter, string) { return string.split(delimiter); };
51
+ var splitOnColons = split.curry(":");
52
+ this.assertNotIdentical(split, splitOnColons);
53
+ this.assertEnumEqual(split(":", "0:1:2:3:4:5"), splitOnColons("0:1:2:3:4:5"));
54
+ this.assertIdentical(split, split.curry());
55
+ },
56
+
57
+ testFunctionDelay: function() {
58
+ window.delayed = undefined;
59
+ var delayedFunction = function() { window.delayed = true; };
60
+ var delayedFunctionWithArgs = function() { window.delayedWithArgs = $A(arguments).join(' '); };
61
+ delayedFunction.delay(0.8);
62
+ delayedFunctionWithArgs.delay(0.8, 'hello', 'world');
63
+ this.assertUndefined(window.delayed);
64
+ this.wait(1000, function() {
65
+ this.assert(window.delayed);
66
+ this.assertEqual('hello world', window.delayedWithArgs);
67
+ });
68
+ },
69
+
70
+ testFunctionWrap: function() {
71
+ function sayHello(){
72
+ return 'hello world';
73
+ };
74
+
75
+ this.assertEqual('HELLO WORLD', sayHello.wrap(function(proceed) {
76
+ return proceed().toUpperCase();
77
+ })());
78
+
79
+ var temp = String.prototype.capitalize;
80
+ String.prototype.capitalize = String.prototype.capitalize.wrap(function(proceed, eachWord) {
81
+ if(eachWord && this.include(' ')) return this.split(' ').map(function(str){
82
+ return str.capitalize();
83
+ }).join(' ');
84
+ return proceed();
85
+ });
86
+ this.assertEqual('Hello world', 'hello world'.capitalize());
87
+ this.assertEqual('Hello World', 'hello world'.capitalize(true));
88
+ this.assertEqual('Hello', 'hello'.capitalize());
89
+ String.prototype.capitalize = temp;
90
+ },
91
+
92
+ testFunctionDefer: function() {
93
+ window.deferred = undefined;
94
+ var deferredFunction = function() { window.deferred = true; };
95
+ deferredFunction.defer();
96
+ this.assertUndefined(window.deferred);
97
+ this.wait(50, function() {
98
+ this.assert(window.deferred);
99
+
100
+ window.deferredValue = 0;
101
+ var deferredFunction2 = function(arg) { window.deferredValue = arg; };
102
+ deferredFunction2.defer('test');
103
+ this.wait(50, function() {
104
+ this.assertEqual('test', window.deferredValue);
105
+ });
106
+ });
107
+ },
108
+
109
+ testFunctionMethodize: function() {
110
+ var Foo = { bar: function(baz) { return baz } };
111
+ var baz = { quux: Foo.bar.methodize() };
112
+
113
+ this.assertEqual(Foo.bar.methodize(), baz.quux);
114
+ this.assertEqual(baz, Foo.bar(baz));
115
+ this.assertEqual(baz, baz.quux());
116
+ },
117
+
118
+ testBindAsEventListener: function() {
119
+ for( var i = 0; i < 10; ++i ){
120
+ var div = document.createElement('div');
121
+ div.setAttribute('id','test-'+i);
122
+ document.body.appendChild(div);
123
+ var tobj = new TestObj();
124
+ var eventTest = { test: true };
125
+ var call = tobj.assertingEventHandler.bindAsEventListener(tobj,
126
+ this.assertEqual.bind(this, eventTest),
127
+ this.assertEqual.bind(this, arg1),
128
+ this.assertEqual.bind(this, arg2),
129
+ this.assertEqual.bind(this, arg3), arg1, arg2, arg3 );
130
+ call(eventTest);
131
+ }
132
+ }
133
+ });