3 <script type=
"text/javascript" src=
"/MochiKit/MockDOM.js"></script>
4 <script type=
"text/javascript" src=
"/MochiKit/Base.js"></script>
5 <script type=
"text/javascript" src=
"/MochiKit/Iter.js"></script>
6 <script type=
"text/javascript" src=
"/MochiKit/DOM.js"></script>
7 <script type=
"text/javascript" src=
"/MochiKit/Style.js"></script>
8 <script type=
"text/javascript" src=
"../SimpleTest/SimpleTest.js"></script>
9 <link rel=
"stylesheet" type=
"text/css" href=
"../SimpleTest/test.css">
13 <div style=
"display: none;">
15 <select name=
"select">
16 <option value=
"foo" selected=
"selected">foo
</option>
17 <option value=
"bar">bar
</option>
18 <option value=
"baz">baz
</option>
20 <select name=
"selmultiple" multiple=
"multiple">
21 <option value=
"bar" selected=
"selected">bar
</option>
22 <option value=
"baz" selected=
"selected">baz
</option>
23 <option value=
"foo">foo
</option>
25 <input type=
"hidden" name=
"hidden" value=
"test" />
26 <input type=
"radio" name=
"radio_off" value=
"1" />
27 <input type=
"radio" name=
"radio_off" value=
"2" />
28 <input type=
"radio" name=
"radio_off" value=
"3" />
29 <input type=
"radio" name=
"radio_on" value=
"1" />
30 <input type=
"radio" name=
"radio_on" value=
"2" checked=
"checked" />
31 <input type=
"radio" name=
"radio_on" value=
"3" />
33 <form id=
"form_test2">
34 <select name=
"selempty">
35 <option value=
"" selected=
"selected">foo
</option>
37 <select name=
"selempty2">
38 <option selected=
"selected">foo
</option>
44 <script type=
"text/javascript">
48 o
= {"blah": function () { lst
.push("original"); }};
49 addToCallStack(o
, "blah", function () { lst
.push("new"); }, true);
50 addToCallStack(o
, "blah", function () { lst
.push("stuff"); }, true);
51 is( typeof(o
.blah
), 'function', 'addToCallStack has a function' );
52 is( o
.blah
.callStack
.length
, 3, 'callStack length 3' );
54 is( lst
.join(" "), "original new stuff", "callStack in correct order" );
55 is( o
.blah
, null, "set to null" );
57 o
= {"blah": function () { lst
.push("original"); }};
58 addToCallStack(o
, "blah",
59 function () { lst
.push("new"); return false;}, false);
60 addToCallStack(o
, "blah", function () { lst
.push("stuff"); }, false);
62 is( lst
.join(" "), "original new", "callStack in correct order (abort)" );
64 is( lst
.join(" "), "original new original new", "callStack in correct order (again)" );
67 is( escapeHTML("<>\"&bar"), "<>"&bar", "escapeHTML" ); // for emacs highlighting: "
69 var isDOM = function (value
, expected
, message
) {
70 is( escapeHTML(toHTML(value
)), escapeHTML(expected
), message
);
73 var d
= document
.createElement('span');
74 updateNodeAttributes(d
, {"foo": "bar", "baz": "wibble"});
75 isDOM( d
, '<span baz="wibble" foo="bar"/>', "updateNodeAttributes" );
77 var d
= document
.createElement('span');
78 appendChildNodes(d
, 'word up', [document
.createElement('span')]);
79 isDOM( d
, '<span>word up<span/></span>', 'appendChildNodes' );
81 replaceChildNodes(d
, 'Think Different');
82 isDOM( d
, '<span>Think Different</span>', 'replaceChildNodes' );
84 d
= createDOM("span");
85 isDOM( d
, "<span/>", "createDOM empty" );
88 d
= createDOM("span", {"foo": "bar", "baz": "wibble"});
89 isDOM( d
, '<span baz="wibble" foo="bar"/>', "createDOM attributes" );
91 d
= createDOM("span", {"foo": "bar", "baz": "wibble"}, "one", "two", "three");
92 is( getNodeAttribute(d
, 'foo'), "bar", "createDOM attribute" );
93 is( getNodeAttribute(d
, 'baz'), "wibble", "createDOM attribute" );
94 is( scrapeText(d
), "onetwothree", "createDOM contents" );
96 isDOM( d
, '<span baz="wibble" foo="bar">onetwothree</span>', "createDOM contents" );
98 d
= createDOM("span", null, function (f
) {
99 return this.nodeName
.toLowerCase() + "hi" + f
.nodeName
.toLowerCase();});
100 isDOM( d
, '<span>spanhispan</span>', 'createDOM function call' );
102 d
= createDOM("span", null, {msg
: "hi", dom: function (f
) {
103 return f
.nodeName
.toLowerCase() + this.msg
; }});
104 isDOM( d
, '<span>spanhi</span>', 'createDOM this.dom() call' );
106 d
= createDOM("span", null, {msg
: "hi", __dom__: function (f
) {
107 return f
.nodeName
.toLowerCase() + this.msg
; }});
108 isDOM( d
, '<span>spanhi</span>', 'createDOM this.__dom__() call' );
110 d
= createDOM("span", null, range(4));
111 isDOM( d
, '<span>0123</span>', 'createDOM iterable' );
114 var d
= {"taco": "pork"};
115 registerDOMConverter("taco",
116 function (o
) { return !isUndefinedOrNull(o
.taco
); },
117 function (o
) { return "Goddamn, I like " + o
.taco
+ " tacos"; }
119 d
= createDOM("span", null, d
);
120 // not yet public API
121 domConverters
.unregister("taco");
123 isDOM( d
, "<span>Goddamn, I like pork tacos</span>", "createDOM with custom converter" );
126 escapeHTML(toHTML(SPAN(null))),
127 escapeHTML(toHTML(createDOM("span", null))),
128 "createDOMFunc vs createDOM"
131 is( scrapeText(d
), "Goddamn, I like pork tacos", "scrape OK" );
132 is( scrapeText(d
, true).join(""), "Goddamn, I like pork tacos", "scrape Array OK" );
134 var st
= DIV(null, STRONG(null, "d"), "oor ", STRONG(null, "f", SPAN(null, "r"), "a"), "me");
135 is( scrapeText(st
), "door frame", "scrape in-order" );
138 ok( !isUndefinedOrNull(getElement("test")), "getElement might work" );
139 ok( !isUndefinedOrNull($("test")), "$alias$$ CASH MONEY alias might work" );
141 d
= createDOM("span", null, "one", "two");
142 swapDOM(d
.childNodes
[0], document
.createTextNode("uno"));
143 isDOM( d
, "<span>unotwo</span>", "swapDOM" );
145 is( scrapeText(d
, true).join(" "), "uno two", "multi-node scrapeText" );
149 addLoadEvent (async test?)
153 d
= createDOM("span", {"class": "foo"});
154 setElementClass(d
, "bar baz");
155 ok( d
.className
== "bar baz", "setElementClass");
156 toggleElementClass("bar", d
);
157 ok( d
.className
== "baz", "toggleElementClass: " + d
.className
);
158 toggleElementClass("bar", d
);
159 ok( hasElementClass(d
, "baz", "bar"),
160 "toggleElementClass 2: " + d
.className
);
161 addElementClass(d
, "bar");
162 ok( hasElementClass(d
, "baz", "bar"),
163 "toggleElementClass 3: " + d
.className
);
164 ok( addElementClass(d
, "blah"), "addElementClass return");
165 ok( hasElementClass(d
, "baz", "bar", "blah"), "addElementClass action");
166 ok( !hasElementClass(d
, "not"), "hasElementClass single");
167 ok( !hasElementClass(d
, "baz", "not"), "hasElementClass multiple");
168 ok( removeElementClass(d
, "blah"), "removeElementClass" );
169 ok( !removeElementClass(d
, "blah"), "removeElementClass again" );
170 ok( !hasElementClass(d
, "blah"), "removeElementClass again (hasElement)" );
171 removeElementClass(d
, "baz");
172 ok( !swapElementClass(d
, "blah", "baz"), "false swapElementClass" );
173 ok( !hasElementClass(d
, "baz"), "false swapElementClass from" );
174 ok( !hasElementClass(d
, "blah"), "false swapElementClass to" );
175 addElementClass(d
, "blah");
176 ok( swapElementClass(d
, "blah", "baz"), "swapElementClass" );
177 ok( hasElementClass(d
, "baz"), "swapElementClass has toClass" );
178 ok( !hasElementClass(d
, "blah"), "swapElementClass !has fromClass" );
179 ok( !swapElementClass(d
, "blah", "baz"), "swapElementClass twice" );
180 ok( hasElementClass(d
, "baz"), "swapElementClass has toClass" );
181 ok( !hasElementClass(d
, "blah"), "swapElementClass !has fromClass" );
187 TBODY({"class": "foo bar", "id":"tbody0"},
188 TR({"class": "foo", "id":"tr0"}),
189 TR({"class": "bar", "id":"tr1"})
193 var matchElements
= getElementsByTagAndClassName
;
195 map(itemgetter("id"), matchElements(null, "foo", t
)).join(" "),
197 "getElementsByTagAndClassName found all tags with foo class"
200 map(itemgetter("id"), matchElements("tr", "foo", t
)).join(" "),
202 "getElementsByTagAndClassName found all tr tags with foo class"
205 map(itemgetter("id"), matchElements("tr", null, t
)).join(" "),
207 "getElementsByTagAndClassName found all tr tags"
210 var oldDoc
= document
;
211 var doc
= MochiKit
.MockDOM
.createDocument();
212 is( currentDocument(), document
, "currentDocument() correct" );
213 withDocument(doc
, function () {
214 ok( document
!= doc
, "global doc unchanged" );
215 is( currentDocument(), doc
, "currentDocument() correct" );
217 var span
= SPAN(null, "foo", h1
);
218 appendChildNodes(currentDocument().body
, span
);
220 is( document
, oldDoc
, "doc restored" );
221 is( doc
.childNodes
.length
, 1, "doc has one child" );
222 is( doc
.body
.childNodes
.length
, 1, "body has one child" );
223 var sp
= doc
.body
.childNodes
[0];
224 is( sp
.nodeName
, "SPAN", "only child is SPAN" );
225 is( sp
.childNodes
.length
, 2, "SPAN has two childNodes" );
226 is( sp
.childNodes
[0].nodeValue
, "foo", "first node is text" );
227 is( sp
.childNodes
[1].nodeName
, "H1", "second child is H1" );
229 is( currentDocument(), document
, "currentDocument() correct" );
231 withDocument(doc
, function () {
232 ok( document
!= doc
, "global doc unchanged" );
233 is( currentDocument(), doc
, "currentDocument() correct" );
234 throw new Error("foo");
236 ok( false, "didn't throw" );
241 doc
= MochiKit
.MockDOM
.createDocument();
243 withDocument(doc
, function () {
244 frm
= FORM({name
: "ignore"},
245 INPUT({name
:"foo", value
:"bar"}),
246 INPUT({name
:"foo", value
:"bar"}),
247 INPUT({name
:"baz", value
:"bar"})
250 var kv
= formContents(frm
);
251 is( kv
[0].join(","), "foo,foo,baz", "mock formContents names" );
252 is( kv
[1].join(","), "bar,bar,bar", "mock formContents values" );
253 is( queryString(frm
), "foo=bar&foo=bar&baz=bar", "mock queryString hook" );
255 var kv
= formContents("form_test");
256 is( kv
[0].join(","), "select,selmultiple,selmultiple,hidden,radio_on", "formContents names" );
257 is( kv
[1].join(","), "foo,bar,baz,test,2", "formContents values" );
258 is( queryString("form_test"), "select=foo&selmultiple=bar&selmultiple=baz&hidden=test&radio_on=2", "queryString hook" );
259 kv
= formContents("form_test2");
260 is( kv
[0].join(","), "selempty,selempty2", "formContents names empty option values" );
261 is( kv
[1].join(","), ",foo", "formContents empty option values" );
262 is( queryString("form_test2"), "selempty=&selempty2=foo", "queryString empty option values" );
264 var d
= DIV(null, SPAN(), " \n\t", SPAN(), "foo", SPAN(), " ");
265 is( d
.childNodes
.length
, 6, "removeEmptyNodes test conditions correct" );
266 removeEmptyTextNodes(d
);
267 is( d
.childNodes
.length
, 4, "removeEmptyNodes" );
269 ok( true, "test suite finished!");
274 var s
= "test suite failure!\n";
278 // ensure unique keys?!
280 s
+= k
+ ": " + err
[k
] + "\n";