headless-squirrel 0.5.1

Sign up to get free protection for your applications and to get access to all the features.
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>