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,547 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
2
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
4
+ <head>
5
+ <title>script.aculo.us Unit test file</title>
6
+ <meta http-equiv="content-type" content="text/html; charset=utf-8" />
7
+ <script src="assets/prototype.js" type="text/javascript"></script>
8
+ <script src="assets/scriptaculous.js" type="text/javascript"></script>
9
+ <script src="assets/unittest.js" type="text/javascript"></script>
10
+ <link rel="stylesheet" href="../test.css" type="text/css" />
11
+ <style type="text/css" media="screen">
12
+ #rotfl {
13
+ color: red;
14
+ font-family: serif;
15
+ font-style: italic;
16
+ font-size: 40px;
17
+ background: #fed;
18
+ padding: 1em;
19
+ width: 400px;
20
+ }
21
+ .final {
22
+ color: #fff;
23
+ font-style: italic;
24
+ background: #000;
25
+ opacity: 0.5;
26
+ }
27
+ body div.final {
28
+ font-size: 20px;
29
+ }
30
+ </style>
31
+ </head>
32
+ <body>
33
+ <h1>script.aculo.us Unit test file</h1>
34
+ <p>
35
+ Tests for effects.js
36
+ </p>
37
+
38
+ <!-- generated elements go in here -->
39
+ <div id="sandbox"></div>
40
+
41
+ <!-- Log output -->
42
+ <div id="testlog"> </div>
43
+
44
+ <div class="morphing blub" style="font-size:25px;color:#f00">Well</div>
45
+ <div class="morphing">You know</div>
46
+ <div id="blah" style="border:1px solid black;width:100px">Whoo-hoo!</div>
47
+
48
+ <div id="error_message">ERROR MESSAGE</div>
49
+ <div id="error_message_2">SECOND ERROR MESSAGE</div>
50
+ <div id="error_message_3" style="border:1px solid red; width:100px; color: #f00">THIRD ERROR MESSAGE</div>
51
+
52
+ <ul class="error-list" id="error_test_ul">
53
+ <li>Lorem ipsum dolor sit amet, consectetur adipisicing elit,</li>
54
+ <li>sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</li>
55
+ <li>Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris</li>
56
+ <li>nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in</li>
57
+ <li>reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.</li>
58
+ </ul>
59
+
60
+ <div id="rotfl">ROTFL</div>
61
+
62
+ <div id="tween">foo!</div>
63
+
64
+ <!-- Tests follow -->
65
+ <script type="text/javascript" language="javascript" charset="utf-8">
66
+ // <![CDATA[
67
+
68
+ var TAGS =
69
+ ['div','span','ol','ul','table','p','h1','h2','h3','h4','h5','h6'];
70
+
71
+ var COMBINED_EFFECTS =
72
+ ['Fade','Appear','BlindUp','BlindDown','Puff','SwitchOff','DropOut','Shake',
73
+ 'SlideUp','SlideDown','Pulsate','Squish','Fold','Grow','Shrink'];
74
+
75
+ var COMBINED_RJS_EFFECTS = $w('fade appear blind_up blind_down puff switch_off '+
76
+ 'drop_out shake slide_up slide_down pulsate squish fold grow shrink');
77
+
78
+ var tmp, tmp2;
79
+
80
+ new Test.Unit.Runner({
81
+
82
+ setup: function() { with (this) {
83
+ $('sandbox').innerHTML = "";
84
+ }},
85
+
86
+ teardown: function() { with(this) {
87
+ // remove all queued effects
88
+ Effect.Queue.each(function(e) { e.cancel() });
89
+ }},
90
+
91
+ testExceptionOnNonExistingElement: function() { with(this) {
92
+ assertRaise('ElementDoesNotExistError',
93
+ function(){new Effect.Opacity('nothing-to-see-here')});
94
+ assertRaise('ElementDoesNotExistError',
95
+ function(){new Effect.Move('nothing-to-see-here')});
96
+ assertRaise('ElementDoesNotExistError',
97
+ function(){new Effect.Scale('nothing-to-see-here')});
98
+ assertRaise('ElementDoesNotExistError',
99
+ function(){new Effect.Highlight('nothing-to-see-here')});
100
+ }},
101
+
102
+ testCallbacks: function() { with(this) {
103
+ tmp = tmp2 = 0;
104
+ var e1 = new Effect.Opacity('sandbox',{from:1.0,to:0.5,duration:0.5,
105
+ beforeStart: function() { tmp++ },
106
+ beforeStartInternal: function() { tmp++ },
107
+ beforeSetup: function() { tmp++ },
108
+ beforeSetupInternal: function() { tmp++ },
109
+ afterSetup: function() { tmp++ },
110
+ afterSetupInternal: function() { tmp++ },
111
+ beforeUpdate: function() { tmp2++ },
112
+ beforeUpdateInternal: function() { tmp2++ },
113
+ beforeFinish: function() { tmp++ },
114
+ beforeFinishInternal: function() { tmp++ },
115
+ afterFinish: function() { tmp++ },
116
+ afterFinishInternal: function() { tmp++ }
117
+ });
118
+ wait(1000, function() {
119
+ assertEqual(10, tmp);
120
+ assert(tmp2 > 0);
121
+ });
122
+ }},
123
+
124
+ testEvent: function() { with(this) {
125
+ tmp = 0;
126
+ new Effect.Event({ afterFinish:function(){ tmp++ }, position:'end'});
127
+ wait(100, function() {
128
+ assertEqual(1, tmp);
129
+ });
130
+ }},
131
+
132
+ testTransition: function() { with(this) {
133
+ // false implies linear
134
+ var e = new Effect.Opacity('sandbox',{transition:false,from:0.0,to:0.25,duration:0.5});
135
+ assert(e.options.transition == Effect.Transitions.linear);
136
+
137
+ wait(1000, function() {
138
+ assertEqual(0.25, $('sandbox').getStyle('opacity'));
139
+ // default to sinoidal
140
+ var e = new Effect.Opacity('sandbox',{from:0.0,to:0.25,duration:0.5});
141
+ assert(e.options.transition == Effect.Transitions.sinoidal);
142
+ wait(1000, function() {
143
+ assertEqual(0.25, $('sandbox').getStyle('opacity'));
144
+
145
+ var transitions = [
146
+ { transition: Effect.Transitions.linear, expected: 1 },
147
+ { transition: Effect.Transitions.sinoidal, expected: 1 },
148
+ { transition: Effect.Transitions.reverse, expected: 0 },
149
+ { transition: Effect.Transitions.flicker, expected: 1 },
150
+ { transition: Effect.Transitions.wobble, expected: 1 },
151
+ { transition: Effect.Transitions.pulse, expected: 1 },
152
+ { transition: Effect.Transitions.none, expected: 0 }
153
+ ];
154
+
155
+ transitions.each(function(t){
156
+ var e = new Effect.Opacity('sandbox',{sync:true, from:0, to: 1, transition:t.transition});
157
+ assert(e.options.transition == t.transition);
158
+ e.render(1.0);
159
+ assertEqual(t.expected, e.position, t.transition);
160
+ });
161
+
162
+ });
163
+ });
164
+ }},
165
+
166
+ testInspect: function() { with(this) {
167
+ var e1 = new Effect.Opacity('sandbox',{from:1.0,to:0.5,duration:0.5});
168
+ info( e1.inspect() );
169
+ assertEqual(0, e1.inspect().indexOf('#<Effect:'));
170
+ assert(e1.inspect().indexOf('idle')>0);
171
+ wait(1000, function() {
172
+ assert(e1.inspect().indexOf('finished')>0);
173
+ });
174
+ }},
175
+
176
+ testDefaultOptions: function() { with(this) {
177
+ var oldDefaultOptions = Object.extend({},Effect.DefaultOptions);
178
+
179
+ assertEqual(1.0, Effect.DefaultOptions.duration);
180
+ Effect.DefaultOptions.duration = 0.5;
181
+ var e1 = new Effect.Opacity('sandbox');
182
+ assertEqual(0.5, e1.options.duration);
183
+
184
+ wait(750, function() {
185
+ assertEqual('finished', e1.state);
186
+ Effect.DefaultOptions = oldDefaultOptions;
187
+ });
188
+ }},
189
+
190
+ testEffectsQueue: function() { with(this) {
191
+ var e1 = new Effect.Highlight('sandbox');
192
+ var e2 = new Effect.Appear('sandbox');
193
+
194
+ assertEqual(2, Effect.Queue.effects.length);
195
+
196
+ tmp = 0;
197
+ Effect.Queue.each(function(e) { tmp++ });
198
+ assertEqual(2, tmp);
199
+
200
+ // the internal interval timer should be active
201
+ assertNotNull(Effect.Queue.interval);
202
+ e1.cancel();
203
+ e2.cancel();
204
+ assertEqual(0, Effect.Queue.effects.length);
205
+
206
+ // should be inactive after all effects are removed from queue
207
+ assertNull(Effect.Queue.interval);
208
+
209
+ // should be in e3,e1,e2 order
210
+ var e1 = new Effect.Highlight('sandbox');
211
+ var e2 = new Effect.Appear('sandbox',{queue:'end'});
212
+ var e3 = new Effect.Fade('sandbox',{queue:'front'});
213
+ assert(e2.startOn > e1.startOn);
214
+ assert(e3.startOn < e1.startOn);
215
+ assert(e3.startOn < e2.startOn);
216
+ assertEqual(3, Effect.Queue.effects.length);
217
+
218
+ Effect.Queue.each(function(e) { e.cancel() });
219
+ assertEqual(0, Effect.Queue.effects.length);
220
+ }},
221
+
222
+ testScopedEffectsQueue: function() { with(this) {
223
+ var e1 = new Effect.Highlight('sandbox', {queue: {scope:'myscope'} } );
224
+ var e2 = new Effect.Appear('sandbox', {queue: {scope:'myscope'} } );
225
+ var e3 = new Effect.Highlight('sandbox', {queue: {scope:'secondscope'} } );
226
+ var e4 = new Effect.Appear('sandbox');
227
+
228
+ assertEqual(2, Effect.Queues.get('myscope').effects.length);
229
+ assertEqual(1, Effect.Queues.get('secondscope').effects.length);
230
+ assertEqual(1, Effect.Queues.get('global').effects.length);
231
+ assertEqual(Effect.Queue.effects.length, Effect.Queues.get('global').effects.length);
232
+
233
+ var tmp = 0;
234
+ Effect.Queues.get('myscope').effects.each(function(e) { tmp++ });
235
+ assertEqual(2, tmp);
236
+
237
+ // the internal interval timer should be active
238
+ assertNotNull(Effect.Queues.get('myscope').interval);
239
+ assertNotNull(Effect.Queues.get('secondscope').interval);
240
+ assertNotNull(Effect.Queues.get('global').interval);
241
+
242
+ e1.cancel(); e2.cancel(); e3.cancel(); e4.cancel();
243
+
244
+ assertEqual(0, Effect.Queues.get('myscope').effects.length);
245
+ assertEqual(0, Effect.Queues.get('secondscope').effects.length);
246
+ assertEqual(0, Effect.Queues.get('global').effects.length);
247
+
248
+ // should be inactive after all effects are removed from queues
249
+ assertNull(Effect.Queues.get('myscope').interval);
250
+ assertNull(Effect.Queues.get('secondscope').interval);
251
+ assertNull(Effect.Queues.get('global').interval);
252
+
253
+ // should be in e3 and e4 together and then e1,e2 order
254
+ var e1 = new Effect.Highlight('sandbox', {queue: {scope:'myscope'} } );
255
+ var e2 = new Effect.Appear('sandbox', {queue: {position: 'end', scope:'myscope'} } );
256
+ var e3 = new Effect.Fade('sandbox', {queue: {position: 'front', scope:'myscope'} } );
257
+ var e4 = new Effect.Appear('sandbox');
258
+ assert(e2.startOn > e1.startOn);
259
+ assert(e3.startOn < e1.startOn);
260
+ assert(e3.startOn < e2.startOn);
261
+ assert(e3.startOn = e4.startOn);
262
+ assertEqual(3, Effect.Queues.get('myscope').effects.length);
263
+
264
+ Effect.Queues.get('myscope').each(function(e) { e.cancel() });
265
+ assertEqual(0, Effect.Queues.get('myscope').effects.length);
266
+
267
+ Effect.Queues.get('global').each(function(e) { e.cancel() });
268
+ assertEqual(0, Effect.Queues.get('global').effects.length);
269
+
270
+ // should only allow the first two effects and ignore the third
271
+ var e1 = new Effect.Highlight('sandbox', {queue: {scope:'myscope', limit: 2} } );
272
+ var e2 = new Effect.Appear('sandbox', {queue: {position: 'end', scope:'myscope', limit: 2} } );
273
+ var e3 = new Effect.Fade('sandbox', {queue: {position: 'front', scope:'myscope', limit: 2} } );
274
+
275
+ assertEqual(2, Effect.Queues.get('myscope').effects.length);
276
+ }},
277
+
278
+ testEffectMultiple: function() { with(this) {
279
+ $('sandbox').appendChild(Builder.node('div',{id:'test_1'}));
280
+ $('sandbox').appendChild(Builder.node('div',{id:'test_2'},[Builder.node('div',{id:'test_2a'})]));
281
+ $('sandbox').appendChild(Builder.node('div',{id:'test_3'}));
282
+
283
+ // only direct child elements
284
+ Effect.multiple('sandbox',Effect.Fade);
285
+ assertEqual(3, Effect.Queue.effects.length);
286
+
287
+ Effect.Queue.each(function(e) { e.cancel() });
288
+ assertEqual(0, Effect.Queue.effects.length);
289
+
290
+ // call with array
291
+ Effect.multiple(['test_1','test_3'],Effect.Puff);
292
+ assertEqual(2, Effect.Queue.effects.length);
293
+ }},
294
+
295
+ testEffectTagifyText: function() { with(this) {
296
+ $('sandbox').innerHTML = "Blah<strong>bleb</strong> Blub";
297
+ assertEqual(3, $('sandbox').childNodes.length);
298
+ Effect.tagifyText('sandbox');
299
+ assertEqual(10, $('sandbox').childNodes.length);
300
+
301
+ Effect.multiple('sandbox', Effect.Fade);
302
+ assertEqual(10, Effect.Queue.effects.length);
303
+ }},
304
+
305
+ testEffectParallel: function() { with(this) {
306
+ assert( new Effect.Parallel() );
307
+ assert( new Effect.Parallel([]) );
308
+ assert( new Effect.Parallel([],{}) );
309
+ assert( new Effect.Parallel([
310
+ new Effect.Event({sync:true})
311
+ ],{ duration: 2}) );
312
+ }},
313
+
314
+ testEffectTween: function() { with(this) {
315
+ // basic initialization
316
+ assert(new Effect.Tween(null,0,0,function(){}));
317
+ assert(new Effect.Tween(null,0,0,{duration:0.1},function(){}));
318
+
319
+ // fun with objects
320
+ var object = {
321
+ blech: 2,
322
+ foo: function(p){
323
+ this.bar = p;
324
+ }
325
+ };
326
+ assert(new Effect.Tween(object,0,1,{transition:Effect.Transitions.reverse},'blech'));
327
+ assert(new Effect.Tween(object,0,1,'foo'));
328
+
329
+ // fun with elements
330
+ assert(new Effect.Tween('tween',50,1,'update'));
331
+
332
+ wait(1500, function(){
333
+ assertEqual(0, object.blech);
334
+ assertEqual(1, object.bar);
335
+ assertEqual('1', $('tween').innerHTML);
336
+ });
337
+ }},
338
+
339
+ // test if all combined effects correctly initialize themselves
340
+ testCombinedEffectsInitialize: function() { with(this) {
341
+ COMBINED_EFFECTS.each(function(fx,idx){
342
+ info('Effect.'+fx);
343
+ $('sandbox').innerHTML = "";
344
+ $('sandbox').appendChild(
345
+ Builder.node('div',{id:'test_element'},
346
+ Builder.node('span','test'))); //some effects require a child element
347
+
348
+ // should work with new Effect.Blah syntax
349
+ var effect = new Effect[fx]('test_element');
350
+ assertEqual(0, effect.currentFrame);
351
+
352
+ // and without the 'new'
353
+ var effect = Effect[fx]('test_element');
354
+ assertEqual(0, effect.currentFrame);
355
+
356
+ // visualEffect
357
+ assert($('test_element') == $('test_element').visualEffect(COMBINED_RJS_EFFECTS[idx]));
358
+
359
+ // direct element extension
360
+ var method = COMBINED_EFFECTS[idx].charAt(0).toLowerCase() + COMBINED_EFFECTS[idx].substring(1)
361
+ assert($('test_element') == $('test_element')[method]());
362
+
363
+ // options parsing (shake, squish and grow are special here)
364
+ if(!['Shake','Squish','Grow'].include(fx)) {
365
+ var effect = Effect[fx]('test_element',{duration:2.0});
366
+ assertEqual(2.0, effect.options.duration, fx);
367
+ }
368
+ });
369
+ }},
370
+
371
+ testSynchronizedEffects: function() { with(this) {
372
+ var e1 = new Effect.Fade('sandbox',{sync:true});
373
+ wait(250, function() {
374
+ // effect should still be at frame 0
375
+ assertEqual(0, e1.currentFrame);
376
+ assertEqual('idle', e1.state);
377
+ e1.render(0.01);
378
+
379
+ // no frame count for sync effects
380
+ assertEqual(0, e1.currentFrame);
381
+ assertEqual('running', e1.state);
382
+ });
383
+ }},
384
+
385
+ testEffectPosition: function() { with(this) {
386
+ var testeffect = new Effect.Opacity('sandbox',{
387
+ afterSetup: function(effect) { effect.frames = 0; },
388
+ afterUpdate: function(effect) { effect.frames++; $('sandbox').update(effect.position); },
389
+ duration: 0.5, from: 1.0, to: 0.5
390
+ });
391
+ assertNull(testeffect.position);
392
+ assertEqual('idle', testeffect.state);
393
+ wait(1000, function() {
394
+ info('Rendered ' + testeffect.frames + ' frames in .5 seconds ' +
395
+ '(~' + (testeffect.frames/0.5) + 'fps of a possible 60fps, ' +
396
+ 'note that this can exceed 60fps because of additional last frame rendering)');
397
+ assertEqual('0.5', $('sandbox').innerHTML);
398
+ assertEqual(0.5, testeffect.position);
399
+ assertEqual('finished', testeffect.state);
400
+ });
401
+ }},
402
+
403
+ testRenderPerformance: function() { with(this) {
404
+ info('The render() method is generated on a per-effect basis')
405
+ var e = new Effect.Opacity('sandbox',{sync:true});
406
+ benchmark(function(){
407
+ e.render(0.5);
408
+ },1000, 'Without events');
409
+ var e = new Effect.Opacity('sandbox',{sync:true,afterUpdate:function(){return}});
410
+ benchmark(function(){
411
+ e.render(0.5);
412
+ },1000, 'With afterUpdate event');
413
+ }},
414
+
415
+ testElementMorph: function() { with(this) {
416
+ $('error_test_ul').morph('font-size:40px', {duration: 0.5}).setStyle({marginRight:'17px'});
417
+ $('error_message_2').morph({
418
+ fontSize: '20px',
419
+ color: '#f00',
420
+ backgroundColor: '#ffffff'
421
+ },
422
+ {
423
+ duration:0.5
424
+ });
425
+ $('error_message_3').morph('final', {duration:0.5});
426
+ wait(1000,function(){
427
+ assertEqual('17px', $('error_test_ul').getStyle('margin-right'));
428
+ assertEqual('40px', $('error_test_ul').getStyle('font-size'));
429
+ assertEqual('#ffffff', $('error_message_2').getStyle('background-color').parseColor());
430
+ assertEqual('20px', $('error_message_2').getStyle('font-size'));
431
+ assertEqual('italic', $('error_message_3').getStyle('font-style'));
432
+ assertEqual('20px', $('error_message_3').getStyle('font-size'));
433
+ assertEqual(.5, $('error_message_3').getStyle('opacity'));
434
+ assertEqual('', $('error_message_3').style.fontSize);
435
+ });
436
+ }},
437
+
438
+ testElementMorphChaining: function() { with(this) {
439
+ $('error_message').morph('font-size:17px').morph('opacity:0',{delay:2});
440
+ wait(3100,function(){ // 2000ms delay + 1000ms default duration
441
+ assertEqual(0, $('error_message').getStyle('opacity'));
442
+ });
443
+ }},
444
+
445
+ testTransformBySelector: function() { with(this) {
446
+ new Effect.Transform([
447
+ { 'ul.error-list li': 'font-size:20px;text-indent:40pt' }
448
+ ],{ duration: 0.5 }).play();
449
+
450
+ wait(700,function(){
451
+ var idx = 0;
452
+ $A($('error_test_ul').cleanWhitespace().childNodes).each(function(node){
453
+ assertEqual('20px', $(node).getStyle('font-size'));
454
+ assertEqual('40pt', $(node).getStyle('text-indent'));
455
+ idx++;
456
+ });
457
+ assertEqual(5, idx);
458
+ });
459
+ }},
460
+
461
+ testTransformUsesCSSClassPresets: function() { with(this) {
462
+ assertEqual('40px', $('rotfl').getStyle('font-size'));
463
+
464
+ // Render the effect at half-way through, font-size should be
465
+ // exactly half-way between original and target
466
+ new Effect.Transform([
467
+ { 'rotfl': 'font-size:20px;text-indent:40pt;background-color:#888' }
468
+ ],{ sync:true }).play().render(0.5);
469
+
470
+ wait(1100,function(){
471
+ // should be 30px = 40px + (20px-40px)/2
472
+ assertEqual('30px', $('rotfl').getStyle('font-size'));
473
+ });
474
+ }},
475
+
476
+ testTransformMultiple: function() { with(this) {
477
+ var transformation = new Effect.Transform([
478
+ { 'div.morphing': 'font-size:20px;padding-left:40em;opacity:0.5' },
479
+ { 'blah' :
480
+ 'width:480px;border-width:10px;border-right-width:20px;' +
481
+ 'margin:20px;margin-bottom:-20px;font-size:30px;' +
482
+ 'background:#954' }
483
+ ],{ duration: 0.5 });
484
+
485
+ var generatedEffect = transformation.play();
486
+
487
+ assertEqual(3, generatedEffect.effects.length);
488
+
489
+ wait(700, function(){
490
+ // have a look at the generated color transforms for the 3rd found element
491
+ // which is the "blah" div
492
+ assertEqual('blah', generatedEffect.effects[2].element.id);
493
+ assertEnumEqual([255,255,255],
494
+ generatedEffect.effects[2].transforms.detect( function(transform){
495
+ return (transform.style == 'backgroundColor')
496
+ }).originalValue);
497
+ assertEnumEqual([153,85,68],
498
+ generatedEffect.effects[2].transforms.detect( function(transform){
499
+ return (transform.style == 'backgroundColor')
500
+ }).targetValue);
501
+
502
+ assertEqual('20px', $$('div.morphing').first().getStyle('font-size'));
503
+ assertEqual('20px', $$('div.morphing').last().getStyle('font-size'));
504
+ assertEqual('30px', $('blah').getStyle('font-size'));
505
+
506
+ // border-width/border-right-width should be set independently
507
+ assertEqual('10px', $('blah').getStyle('border-top-width'));
508
+ assertEqual('10px', $('blah').getStyle('border-bottom-width'));
509
+ assertEqual('10px', $('blah').getStyle('border-left-width'));
510
+ assertEqual('20px', $('blah').getStyle('border-right-width'));
511
+
512
+ // colors should assume transition from
513
+ // #ffffff (white) if original was transparent
514
+ // we now should have arrived at the given color
515
+ assertEqual('#995544', $('blah').getStyle('background-color').parseColor());
516
+
517
+ // play again = should have same values
518
+ transformation.play();
519
+ wait(700, function(){
520
+ assertEqual('20px', $$('div.morphing').first().getStyle('font-size'));
521
+ assertEqual('20px', $$('div.morphing').last().getStyle('font-size'));
522
+ assertEqual('30px', $('blah').getStyle('font-size'));
523
+
524
+ $('blah').setStyle({fontSize:'100px'});
525
+ assertEqual('100px', $('blah').getStyle('font-size'));
526
+ transformation.play();
527
+ wait(700, function(){
528
+ assertEqual('30px', $('blah').getStyle('font-size'));
529
+
530
+ new Effect.Transform([
531
+ { 'blah': 'color: #80d980; background: #208020' }
532
+ ],{ duration: 1.1 }).play();
533
+ wait(1500, function(){
534
+ assertEqual('#80d980', $('blah').getStyle('color').parseColor());
535
+ assertEqual('#208020', $('blah').getStyle('background-color').parseColor());
536
+ });
537
+ });
538
+ });
539
+ });
540
+ }}
541
+
542
+ });
543
+
544
+ // ]]>
545
+ </script>
546
+ </body>
547
+ </html>