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="../../lib/prototype.js" type="text/javascript"></script> |
---|
8 | <script src="../../src/scriptaculous.js" type="text/javascript"></script> |
---|
9 | <script src="../../src/unittest.js" type="text/javascript"></script> |
---|
10 | <link rel="stylesheet" href="../test.css" type="text/css" /> |
---|
11 | </head> |
---|
12 | <body> |
---|
13 | <h1>script.aculo.us Unit test file</h1> |
---|
14 | <p> |
---|
15 | Tests for builder.js |
---|
16 | </p> |
---|
17 | |
---|
18 | <!-- Log output --> |
---|
19 | <div id="testlog"> </div> |
---|
20 | |
---|
21 | <div id="result"></div> |
---|
22 | |
---|
23 | <!-- Tests follow --> |
---|
24 | <script type="text/javascript" language="javascript" charset="utf-8"> |
---|
25 | // <![CDATA[ |
---|
26 | |
---|
27 | // Serializes a node and it's contents to plain old HTML |
---|
28 | // IMPORTANT: style attributes can't be correctly serialized cross-browser wise, |
---|
29 | // so the contents of style attributes must match what IE thinks is correct |
---|
30 | function serializeNode(node){ |
---|
31 | if(node.nodeType == 3) return node.nodeValue; |
---|
32 | node = $(node); |
---|
33 | var tag = node.tagName.toLowerCase(); |
---|
34 | return '<' + ([tag].concat($A(node.attributes).map(function(attr){ |
---|
35 | // Filter out stuff that we don't need |
---|
36 | if(attr.nodeName == '_extended' || attr.nodeName == '_counted' || |
---|
37 | typeof attr.nodeValue == 'function' ||!Element.hasAttribute(node, attr.nodeName)) return; |
---|
38 | // remove trailing ; in style attributes on Firefox |
---|
39 | var value = node.readAttribute(attr.nodeName); |
---|
40 | if(attr.nodeName == 'style' && value.endsWith(';')) |
---|
41 | value = value.substr(0, value.length-1); |
---|
42 | return attr.nodeName + '="' + value + '"' |
---|
43 | }).compact().sort())).join(' ') + '>' + $A(node.childNodes).map(serializeNode).join('') + |
---|
44 | '</' + tag + '>'; |
---|
45 | } |
---|
46 | |
---|
47 | new Test.Unit.Runner({ |
---|
48 | |
---|
49 | setup: function() { |
---|
50 | $('result').innerHTML = ''; |
---|
51 | }, |
---|
52 | |
---|
53 | testBuilderBasics: function() { with(this) { |
---|
54 | var element = Builder.node('div'); |
---|
55 | assertEqual('DIV', element.nodeName); |
---|
56 | |
---|
57 | var element = Builder.node('div',{id:'mydiv'}) |
---|
58 | assertEqual('mydiv', element.id); |
---|
59 | |
---|
60 | var element = Builder.node('div',{id:'mydiv',className:'one two'}) |
---|
61 | assertEqual('mydiv', element.id); |
---|
62 | assertEqual('one two', element.className); |
---|
63 | |
---|
64 | var element = Builder.node('span','text 123 <blah>'); |
---|
65 | assertEqual('SPAN', element.nodeName); |
---|
66 | assertEqual('text 123 <blah>', element.innerHTML); |
---|
67 | |
---|
68 | var element = Builder.node('span',123); |
---|
69 | assertEqual('SPAN', element.nodeName); |
---|
70 | assertEqual('123', element.innerHTML); |
---|
71 | |
---|
72 | var element = Builder.node('span',['test']); |
---|
73 | assertEqual('SPAN', element.nodeName); |
---|
74 | assertEqual('test', element.innerHTML); |
---|
75 | |
---|
76 | var element = Builder.node('span',['test',123]); |
---|
77 | assertEqual('SPAN', element.nodeName); |
---|
78 | assertEqual('test123', element.innerHTML); |
---|
79 | |
---|
80 | var element = Builder.node('span',{},['test',123]); |
---|
81 | assertEqual('SPAN', element.nodeName); |
---|
82 | assertEqual('test123', element.innerHTML); |
---|
83 | |
---|
84 | var element = Builder.node('span',{id:'myspan'},['test',123]); |
---|
85 | assertEqual('SPAN', element.nodeName); |
---|
86 | assertEqual('myspan', element.id); |
---|
87 | assertEqual('test123', element.innerHTML); |
---|
88 | |
---|
89 | var element = Builder.node('div',[1,2,[3],[[[4],5],6],7,8,[[[[9]]],0]]); |
---|
90 | assertEqual('1234567890',element.innerHTML); |
---|
91 | |
---|
92 | var element = Builder.node('div',[1,'2',['3'],[[[4],'5'],6],7,'8',[[[['9']]],0]]); |
---|
93 | assertEqual('1234567890',element.innerHTML); |
---|
94 | |
---|
95 | var element = Builder.node('div',{id:'mydiv'},[1,2,[3],[[[4],5],6],7,8,[[[[9]]],0]]); |
---|
96 | assertEqual('1234567890',element.innerHTML); |
---|
97 | |
---|
98 | var element = Builder.node('div',{id:'mydiv'},[1,'2',['3'],[[[4],'5'],6],7,'8',[[[['9']]],0]]); |
---|
99 | assertEqual('1234567890',element.innerHTML); |
---|
100 | assertEqual(10, element.childNodes.length); |
---|
101 | |
---|
102 | var element = Builder.node('div', Builder.node('span')); |
---|
103 | assertEqual(1, element.childNodes.length); |
---|
104 | assertEqual('SPAN', element.childNodes[0].tagName); |
---|
105 | |
---|
106 | var element = Builder.node('div', {id:'mydiv'}, Builder.node('span')); |
---|
107 | assertEqual(1, element.childNodes.length); |
---|
108 | assertEqual('mydiv', element.id); |
---|
109 | assertEqual('SPAN', element.childNodes[0].tagName); |
---|
110 | }}, |
---|
111 | |
---|
112 | testBuilderClassAndFor: function() { with(this) { |
---|
113 | var elt = Builder.node('div', { className: 'demoClass' }); |
---|
114 | assertEqual('demoClass', elt.className); |
---|
115 | var elt = Builder.node('label', { htmlFor: 'mydiv' }); |
---|
116 | assertEqual('mydiv', elt.htmlFor); |
---|
117 | }}, |
---|
118 | |
---|
119 | testBuilderAllXHTMLTags: function() { with(this) { |
---|
120 | var XHTML_TAGS = [ |
---|
121 | 'a','abbr','acronym','address','applet','area', |
---|
122 | 'b','bdo','big','blockquote','br','button', |
---|
123 | 'caption','cite','code','col','colgroup', |
---|
124 | 'dd','del','dfn','div','dl','dt', |
---|
125 | 'em', |
---|
126 | 'fieldset','form', |
---|
127 | 'h1','h2','h3','h4','h5','h6','hr', |
---|
128 | 'i','iframe','img','input','ins', |
---|
129 | 'kbd', |
---|
130 | 'label','legend','li', |
---|
131 | 'map', |
---|
132 | 'object','ol','optgroup','option', |
---|
133 | 'p','param','pre', |
---|
134 | 'q', |
---|
135 | 'samp','script','select','small','span','strong','style','sub','sup', |
---|
136 | 'table','tbody','td','textarea','tfoot','th','thead','tr','tt', |
---|
137 | 'ul','var'] |
---|
138 | |
---|
139 | XHTML_TAGS.each(function(tag) { |
---|
140 | try { |
---|
141 | var element = Builder.node(tag); |
---|
142 | assertNotNull(element, 'Tag "'+tag+'" expected, but was null.'); |
---|
143 | assertEqual(tag.toUpperCase(), element.nodeName); |
---|
144 | |
---|
145 | var element = Builder.node(tag,{id:'tag_'+tag+'_test_id'}); |
---|
146 | assertEqual(tag.toUpperCase(), element.nodeName); |
---|
147 | assertEqual('tag_'+tag+'_test_id', element.id, 'Setting id attribute for "'+tag+'" failed!'); |
---|
148 | } catch(e) { |
---|
149 | assert(false, 'Error while creating node of type '+tag+'. Note: Firefox bug in 1.0.X on option and optgroup, fixed in 1.5b1. Internet Explorer 6 doesn\'t support the ABBR tag and has no standard DOM implementation for tables.'); |
---|
150 | } |
---|
151 | }); |
---|
152 | }}, |
---|
153 | |
---|
154 | // special case, because requires workarounds on IE and Firefox < 1.5 |
---|
155 | testBuilderOptionTag: function() { with(this) { |
---|
156 | assertEqual('', Builder.node('option').innerHTML); |
---|
157 | assertEqual('test', Builder.node('option','test').innerHTML); |
---|
158 | assertEqual('', Builder.node('option',{className:'test'}).innerHTML); |
---|
159 | assertEqual('test', Builder.node('option',{className:'test'},'test').innerHTML); |
---|
160 | assertEqual('test', Builder.node('option',{},'test').innerHTML); |
---|
161 | |
---|
162 | var selectElement = Builder.node('select'); |
---|
163 | var optionElement = Builder.node('option',{className:'test',id:'option_123'},123); |
---|
164 | selectElement.appendChild(optionElement); |
---|
165 | document.body.appendChild(selectElement); |
---|
166 | assertEqual('123', $('option_123').innerHTML); |
---|
167 | }}, |
---|
168 | |
---|
169 | testBuilderContatenation: function() { with(this) { |
---|
170 | var element = Builder.node('div', [Builder.node('span')]); |
---|
171 | assertEqual('DIV', element.nodeName); |
---|
172 | assertEqual(1, element.childNodes.length); |
---|
173 | assertEqual('SPAN', element.firstChild.nodeName); |
---|
174 | |
---|
175 | var element = Builder.node('div', [Builder.node('span'),'text']); |
---|
176 | assertEqual(2, element.childNodes.length); |
---|
177 | assertEqual(0, element.firstChild.childNodes.length); |
---|
178 | assertEqual('DIV', element.nodeName); |
---|
179 | assertEqual('SPAN', element.firstChild.nodeName); |
---|
180 | assertEqual(3, element.firstChild.nextSibling.nodeType); |
---|
181 | |
---|
182 | var element = Builder.node('div', [Builder.node('span',[Builder.node('strong','blah')]),'text']); |
---|
183 | assertEqual(2, element.childNodes.length); |
---|
184 | assertEqual(1, element.firstChild.childNodes.length); |
---|
185 | assertEqual('DIV', element.nodeName); |
---|
186 | assertEqual('SPAN', element.firstChild.nodeName); |
---|
187 | assertEqual('STRONG', element.firstChild.firstChild.nodeName); |
---|
188 | assertEqual('blah', element.firstChild.firstChild.innerHTML); |
---|
189 | assertEqual(3, element.firstChild.nextSibling.nodeType); |
---|
190 | }}, |
---|
191 | |
---|
192 | testBuilderComplexExample: function() { with(this) { |
---|
193 | var element = Builder.node('div',{id:'ghosttrain'},[ |
---|
194 | Builder.node('div',{style:'font-weight: bold; font-size: 11px'},[ |
---|
195 | Builder.node('h1','Ghost Train'), |
---|
196 | "testtext", 2, 3, 4, |
---|
197 | Builder.node('ul',[ |
---|
198 | Builder.node('li',{onclick:'alert(\'test\')'},'click me') |
---|
199 | ]), |
---|
200 | ]), |
---|
201 | ]); |
---|
202 | assertEqual('DIV', element.nodeName); |
---|
203 | |
---|
204 | $('result').appendChild(element); |
---|
205 | |
---|
206 | // browsers aren't sure about upper and lower case on elements |
---|
207 | assertEqual( |
---|
208 | '<div id="ghosttrain"><div style="font-weight: bold; font-size: 11px">' + |
---|
209 | '<h1>Ghost Train</h1>testtext234<ul><li onclick="alert(\'test\')">click me</li></ul></div></div>', |
---|
210 | serializeNode($('result').childNodes[0])); |
---|
211 | }}, |
---|
212 | |
---|
213 | testBuilderShortcuts: function() { with(this) { |
---|
214 | Builder.dump(); |
---|
215 | |
---|
216 | var element = DIV(SPAN()); |
---|
217 | assertEqual('SPAN', element.childNodes[0].tagName); |
---|
218 | |
---|
219 | var element = DIV({id:'test'},SPAN()); |
---|
220 | assertEqual('SPAN', element.childNodes[0].tagName); |
---|
221 | |
---|
222 | var element = DIV({id:'ghosttrain'},[ |
---|
223 | DIV({style:'font-weight: bold; font-size: 11px'},[ |
---|
224 | H1('Ghost Train'), |
---|
225 | "testtext", 2, 3, 4, |
---|
226 | UL([ |
---|
227 | LI({onclick:'alert(\'test\')'},'click me') |
---|
228 | ]), |
---|
229 | ]), |
---|
230 | ]); |
---|
231 | assertEqual('DIV', element.nodeName); |
---|
232 | |
---|
233 | $('result').appendChild(element); |
---|
234 | |
---|
235 | assertEqual( |
---|
236 | '<div id="ghosttrain"><div style="font-weight: bold; font-size: 11px">' + |
---|
237 | '<h1>Ghost Train</h1>testtext234<ul><li onclick="alert(\'test\')">click me</li></ul></div></div>', |
---|
238 | serializeNode($('result').childNodes[0])); |
---|
239 | }}, |
---|
240 | |
---|
241 | testBuilderBuild: function() { with(this) { |
---|
242 | ['<span>this is <b>neat!</b></span>',' \n<span>this is <b>neat!</b></span>\n '].each( |
---|
243 | function(html){ |
---|
244 | var node = Builder.build(html); |
---|
245 | assertEqual('<span>this is <b>neat!</b></span>', serializeNode(node)); |
---|
246 | }); |
---|
247 | }}, |
---|
248 | |
---|
249 | testBuilderAttributeEscaping: function() { with(this) { |
---|
250 | var element = Builder.node('div',{blah:"<foo'bar&baz\"bat>"}); |
---|
251 | assertEqual("<foo'bar&baz\"bat>", $(element).readAttribute('blah')); |
---|
252 | }} |
---|
253 | |
---|
254 | }); |
---|
255 | // ]]> |
---|
256 | </script> |
---|
257 | </body> |
---|
258 | </html> |
---|