dom/tests/mochitest/ajax/scriptaculous/test/unit/builder_test.html

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/dom/tests/mochitest/ajax/scriptaculous/test/unit/builder_test.html	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,258 @@
     1.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
     1.5 +        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
     1.6 +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
     1.7 +<head>
     1.8 +  <title>script.aculo.us Unit test file</title>
     1.9 +  <meta http-equiv="content-type" content="text/html; charset=utf-8" />
    1.10 +  <script src="../../lib/prototype.js" type="text/javascript"></script>
    1.11 +  <script src="../../src/scriptaculous.js" type="text/javascript"></script>
    1.12 +  <script src="../../src/unittest.js" type="text/javascript"></script>
    1.13 +  <link rel="stylesheet" href="../test.css" type="text/css" />
    1.14 +</head>
    1.15 +<body>
    1.16 +<h1>script.aculo.us Unit test file</h1>
    1.17 +<p>
    1.18 +  Tests for builder.js
    1.19 +</p>
    1.20 +
    1.21 +<!-- Log output -->
    1.22 +<div id="testlog"> </div>
    1.23 +
    1.24 +<div id="result"></div>
    1.25 +
    1.26 +<!-- Tests follow -->
    1.27 +<script type="text/javascript" language="javascript" charset="utf-8">
    1.28 +// <![CDATA[
    1.29 +
    1.30 +  // Serializes a node and its contents to plain old HTML
    1.31 +  // IMPORTANT: style attributes can't be correctly serialized cross-browser wise,
    1.32 +  // so the contents of style attributes must match what IE thinks is correct
    1.33 +  function serializeNode(node){
    1.34 +    if(node.nodeType == 3) return node.nodeValue;
    1.35 +    node = $(node);
    1.36 +    var tag = node.tagName.toLowerCase();
    1.37 +    return '<' + ([tag].concat($A(node.attributes).map(function(attr){
    1.38 +      // Filter out stuff that we don't need
    1.39 +      if(attr.nodeName == '_extended' || attr.nodeName == '_counted' || 
    1.40 +        typeof attr.nodeValue == 'function' ||!Element.hasAttribute(node, attr.nodeName)) return;
    1.41 +      // remove trailing ; in style attributes on Firefox
    1.42 +      var value = node.readAttribute(attr.nodeName);
    1.43 +      if(attr.nodeName == 'style' && value.endsWith(';'))
    1.44 +        value = value.substr(0, value.length-1); 
    1.45 +      return attr.nodeName + '="' + value + '"'
    1.46 +    }).compact().sort())).join(' ') + '>' + $A(node.childNodes).map(serializeNode).join('') + 
    1.47 +    '</' + tag + '>';
    1.48 +  }
    1.49 +
    1.50 +  new Test.Unit.Runner({
    1.51 +
    1.52 +    setup: function() {
    1.53 +      $('result').innerHTML = '';
    1.54 +    },
    1.55 +
    1.56 +    testBuilderBasics: function() { with(this) {
    1.57 +      var element = Builder.node('div');
    1.58 +      assertEqual('DIV', element.nodeName);
    1.59 +
    1.60 +      var element = Builder.node('div',{id:'mydiv'})
    1.61 +      assertEqual('mydiv', element.id);
    1.62 +            
    1.63 +      var element = Builder.node('div',{id:'mydiv',className:'one two'})
    1.64 +      assertEqual('mydiv', element.id);
    1.65 +      assertEqual('one two', element.className);
    1.66 +      
    1.67 +      var element = Builder.node('span','text 123 <blah>');
    1.68 +      assertEqual('SPAN', element.nodeName);
    1.69 +      assertEqual('text 123 &lt;blah&gt;', element.innerHTML);
    1.70 +      
    1.71 +      var element = Builder.node('span',123);
    1.72 +      assertEqual('SPAN', element.nodeName);
    1.73 +      assertEqual('123', element.innerHTML);
    1.74 +      
    1.75 +      var element = Builder.node('span',['test']);
    1.76 +      assertEqual('SPAN', element.nodeName);
    1.77 +      assertEqual('test', element.innerHTML);
    1.78 +      
    1.79 +      var element = Builder.node('span',['test',123]);
    1.80 +      assertEqual('SPAN', element.nodeName);
    1.81 +      assertEqual('test123', element.innerHTML);
    1.82 +      
    1.83 +      var element = Builder.node('span',{},['test',123]);
    1.84 +      assertEqual('SPAN', element.nodeName);
    1.85 +      assertEqual('test123', element.innerHTML);
    1.86 +      
    1.87 +      var element = Builder.node('span',{id:'myspan'},['test',123]);
    1.88 +      assertEqual('SPAN', element.nodeName);
    1.89 +      assertEqual('myspan', element.id);
    1.90 +      assertEqual('test123', element.innerHTML);
    1.91 +      
    1.92 +      var element = Builder.node('div',[1,2,[3],[[[4],5],6],7,8,[[[[9]]],0]]);
    1.93 +      assertEqual('1234567890',element.innerHTML);
    1.94 +      
    1.95 +      var element = Builder.node('div',[1,'2',['3'],[[[4],'5'],6],7,'8',[[[['9']]],0]]);
    1.96 +      assertEqual('1234567890',element.innerHTML);
    1.97 +      
    1.98 +      var element = Builder.node('div',{id:'mydiv'},[1,2,[3],[[[4],5],6],7,8,[[[[9]]],0]]);
    1.99 +      assertEqual('1234567890',element.innerHTML);
   1.100 +      
   1.101 +      var element = Builder.node('div',{id:'mydiv'},[1,'2',['3'],[[[4],'5'],6],7,'8',[[[['9']]],0]]);
   1.102 +      assertEqual('1234567890',element.innerHTML);
   1.103 +      assertEqual(10, element.childNodes.length);
   1.104 +      
   1.105 +      var element = Builder.node('div', Builder.node('span'));
   1.106 +      assertEqual(1, element.childNodes.length);
   1.107 +      assertEqual('SPAN', element.childNodes[0].tagName);
   1.108 +      
   1.109 +      var element = Builder.node('div', {id:'mydiv'}, Builder.node('span'));
   1.110 +      assertEqual(1, element.childNodes.length);
   1.111 +      assertEqual('mydiv', element.id);
   1.112 +      assertEqual('SPAN', element.childNodes[0].tagName);
   1.113 +    }},
   1.114 +
   1.115 +    testBuilderClassAndFor: function() { with(this) {
   1.116 +      var elt = Builder.node('div', { className: 'demoClass' });
   1.117 +      assertEqual('demoClass', elt.className);
   1.118 +      var elt = Builder.node('label', { htmlFor: 'mydiv' });
   1.119 +      assertEqual('mydiv', elt.htmlFor);
   1.120 +    }},
   1.121 +    
   1.122 +    testBuilderAllXHTMLTags: function() { with(this) {
   1.123 +      var XHTML_TAGS = [
   1.124 +        'a','abbr','acronym','address','applet','area',
   1.125 +        'b','bdo','big','blockquote','br','button',
   1.126 +        'caption','cite','code','col','colgroup',
   1.127 +        'dd','del','dfn','div','dl','dt',
   1.128 +        'em',
   1.129 +        'fieldset','form',
   1.130 +        'h1','h2','h3','h4','h5','h6','hr',
   1.131 +        'i','iframe','img','input','ins',
   1.132 +        'kbd',
   1.133 +        'label','legend','li',
   1.134 +        'map',
   1.135 +        'object','ol','optgroup','option',
   1.136 +        'p','param','pre',
   1.137 +        'q',
   1.138 +        'samp','script','select','small','span','strong','style','sub','sup',
   1.139 +        'table','tbody','td','textarea','tfoot','th','thead','tr','tt',
   1.140 +        'ul','var']
   1.141 +        
   1.142 +      XHTML_TAGS.each(function(tag) {
   1.143 +        try {
   1.144 +          var element = Builder.node(tag);
   1.145 +          assertNotNull(element, 'Tag "'+tag+'" expected, but was null.');
   1.146 +          assertEqual(tag.toUpperCase(), element.nodeName);
   1.147 +        
   1.148 +          var element = Builder.node(tag,{id:'tag_'+tag+'_test_id'});
   1.149 +          assertEqual(tag.toUpperCase(), element.nodeName);
   1.150 +          assertEqual('tag_'+tag+'_test_id', element.id, 'Setting id attribute for "'+tag+'" failed!');
   1.151 +        } catch(e) {
   1.152 +          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.');
   1.153 +        }
   1.154 +      });
   1.155 +    }},
   1.156 +    
   1.157 +    // special case, because requires workarounds on IE and Firefox < 1.5
   1.158 +    testBuilderOptionTag: function() { with(this) {
   1.159 +      assertEqual('', Builder.node('option').innerHTML);
   1.160 +      assertEqual('test', Builder.node('option','test').innerHTML);
   1.161 +      assertEqual('', Builder.node('option',{className:'test'}).innerHTML);
   1.162 +      assertEqual('test', Builder.node('option',{className:'test'},'test').innerHTML);
   1.163 +      assertEqual('test', Builder.node('option',{},'test').innerHTML);
   1.164 +      
   1.165 +      var selectElement = Builder.node('select');
   1.166 +      var optionElement = Builder.node('option',{className:'test',id:'option_123'},123);
   1.167 +      selectElement.appendChild(optionElement);
   1.168 +      document.body.appendChild(selectElement);
   1.169 +      assertEqual('123', $('option_123').innerHTML);
   1.170 +    }},
   1.171 +    
   1.172 +    testBuilderContatenation: function() { with(this) {
   1.173 +      var element = Builder.node('div', [Builder.node('span')]);
   1.174 +      assertEqual('DIV', element.nodeName);
   1.175 +      assertEqual(1, element.childNodes.length);
   1.176 +      assertEqual('SPAN', element.firstChild.nodeName);
   1.177 +      
   1.178 +      var element = Builder.node('div', [Builder.node('span'),'text']);
   1.179 +      assertEqual(2, element.childNodes.length);
   1.180 +      assertEqual(0, element.firstChild.childNodes.length);
   1.181 +      assertEqual('DIV', element.nodeName);
   1.182 +      assertEqual('SPAN', element.firstChild.nodeName);
   1.183 +      assertEqual(3, element.firstChild.nextSibling.nodeType);
   1.184 +      
   1.185 +      var element = Builder.node('div', [Builder.node('span',[Builder.node('strong','blah')]),'text']);
   1.186 +      assertEqual(2, element.childNodes.length);
   1.187 +      assertEqual(1, element.firstChild.childNodes.length);
   1.188 +      assertEqual('DIV', element.nodeName);
   1.189 +      assertEqual('SPAN', element.firstChild.nodeName);
   1.190 +      assertEqual('STRONG', element.firstChild.firstChild.nodeName);
   1.191 +      assertEqual('blah', element.firstChild.firstChild.innerHTML);
   1.192 +      assertEqual(3, element.firstChild.nextSibling.nodeType);
   1.193 +    }},
   1.194 +  
   1.195 +    testBuilderComplexExample: function() { with(this) {      
   1.196 +      var element = Builder.node('div',{id:'ghosttrain'},[
   1.197 +        Builder.node('div',{style:'font-weight: bold; font-size: 11px'},[
   1.198 +          Builder.node('h1','Ghost Train'),
   1.199 +          "testtext", 2, 3, 4,
   1.200 +          Builder.node('ul',[
   1.201 +            Builder.node('li',{onclick:'alert(\'test\')'},'click me')
   1.202 +          ]),
   1.203 +        ]),
   1.204 +      ]);
   1.205 +      assertEqual('DIV', element.nodeName);
   1.206 +      
   1.207 +      $('result').appendChild(element);
   1.208 +      
   1.209 +      // browsers aren't sure about upper and lower case on elements
   1.210 +      assertEqual(
   1.211 +        '<div id="ghosttrain"><div style="font-weight: bold; font-size: 11px">' + 
   1.212 +        '<h1>Ghost Train</h1>testtext234<ul><li onclick="alert(\'test\')">click me</li></ul></div></div>',
   1.213 +        serializeNode($('result').childNodes[0]));
   1.214 +    }},
   1.215 +    
   1.216 +    testBuilderShortcuts: function() { with(this) {
   1.217 +      Builder.dump();
   1.218 +      
   1.219 +      var element = DIV(SPAN());
   1.220 +      assertEqual('SPAN', element.childNodes[0].tagName);
   1.221 +      
   1.222 +      var element = DIV({id:'test'},SPAN());
   1.223 +      assertEqual('SPAN', element.childNodes[0].tagName);
   1.224 +      
   1.225 +      var element = DIV({id:'ghosttrain'},[
   1.226 +         DIV({style:'font-weight: bold; font-size: 11px'},[
   1.227 +           H1('Ghost Train'),
   1.228 +           "testtext", 2, 3, 4,
   1.229 +           UL([
   1.230 +             LI({onclick:'alert(\'test\')'},'click me')
   1.231 +           ]),
   1.232 +         ]),
   1.233 +       ]);
   1.234 +      assertEqual('DIV', element.nodeName);
   1.235 +      
   1.236 +      $('result').appendChild(element);
   1.237 +      
   1.238 +      assertEqual(
   1.239 +        '<div id="ghosttrain"><div style="font-weight: bold; font-size: 11px">' +
   1.240 +        '<h1>Ghost Train</h1>testtext234<ul><li onclick="alert(\'test\')">click me</li></ul></div></div>',
   1.241 +        serializeNode($('result').childNodes[0]));
   1.242 +    }},
   1.243 +    
   1.244 +    testBuilderBuild: function() { with(this) {
   1.245 +      ['<span>this is <b>neat!</b></span>',' \n<span>this is <b>neat!</b></span>\n '].each(
   1.246 +        function(html){
   1.247 +          var node = Builder.build(html);
   1.248 +          assertEqual('<span>this is <b>neat!</b></span>', serializeNode(node));
   1.249 +        });
   1.250 +    }},
   1.251 +    
   1.252 +    testBuilderAttributeEscaping: function() { with(this) {
   1.253 +      var element = Builder.node('div',{blah:"<foo'bar&baz\"bat>"});
   1.254 +      assertEqual("<foo'bar&baz\"bat>", $(element).readAttribute('blah'));
   1.255 +    }}
   1.256 +
   1.257 +  });
   1.258 +// ]]>
   1.259 +</script>
   1.260 +</body>
   1.261 +</html>

mercurial