15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright 2006 Google Inc.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Licensed under the Apache License, Version 2.0 (the "License");
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// you may not use this file except in compliance with the License.
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// You may obtain a copy of the License at
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://www.apache.org/licenses/LICENSE-2.0
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Unless required by applicable law or agreed to in writing, software
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// distributed under the License is distributed on an "AS IS" BASIS,
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// implied. See the License for the specific language governing
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// permissions and limitations under the License.
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @author Steffen Meschkat (mesch@google.com)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @fileoverview Unittest and examples for jstemplates.
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function jstWrap(data, template) {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return jstProcess(new JsEvalContext(data), template);
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function testJstSelect() {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Template cardinality from jsselect.
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var t = document.getElementById('t1');
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var d = {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    items: [ 'A', 'B', 'C', '' ]
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  jstWrap(d, t);
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var h = t.innerHTML;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var clone = domCloneNode(t);
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertTrue(/>A<\/div>/.test(h));
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertTrue(/>B<\/div>/.test(h));
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertTrue(/>C<\/div>/.test(h));
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertTrue(/><\/div>/.test(h));
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reprocessing with identical data.
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  jstWrap(d, t);
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertAttributesMatch(t, clone);
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reprocessing with changed data.
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  d.items[1] = 'BB';
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  jstWrap(d, t);
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  h = t.innerHTML;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertTrue(/>A<\/div>/.test(h));
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertFalse(/>B<\/div>/.test(h));
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertTrue(/>BB<\/div>/.test(h));
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertTrue(/>C<\/div>/.test(h));
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reprocessing with dropped data.
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  d.items.pop();
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  d.items.pop();
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  jstWrap(d, t);
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  h = t.innerHTML;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertTrue(/>A<\/div>/.test(h));
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertTrue(/>BB<\/div>/.test(h));
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertFalse(/>C<\/div>/.test(h));
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertFalse(/><\/div>/.test(h));
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reprocessing with dropped data, once more.
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  d.items.pop();
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  jstWrap(d, t);
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  h = t.innerHTML;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertTrue(/>A<\/div>/.test(h));
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertFalse(/>BB<\/div>/.test(h));
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertFalse(/>C<\/div>/.test(h));
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reprocessing with empty data -- the last template instance is
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // preserved, and only hidden.
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  d.items.pop();
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  jstWrap(d, t);
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertTrue(/>A<\/div>/.test(h));
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertFalse(/>BB<\/div>/.test(h));
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertFalse(/>C<\/div>/.test(h));
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reprocessing with added data.
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  d.items.push('D');
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  jstWrap(d, t);
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  h = t.innerHTML;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertFalse(/>A<\/div>/.test(h));
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertTrue(/>D<\/div>/.test(h));
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function testJstDisplay() {
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var t = document.getElementById('t2');
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var d = {
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    display: true
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  jstWrap(d, t);
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var h = t.innerHTML;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertFalse(/display:\s*none/.test(h));
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  d.display = false;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  jstWrap(d, t);
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  h = t.innerHTML;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertTrue(/display:\s*none/.test(h));
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that 'this' within js expressions is the template node
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  t = document.getElementById('t2a');
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  d = {
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    showId: 'x'
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  jstWrap(d, t);
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  h = t.innerHTML;
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertFalse(/display:\s*none/.test(h));
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  d.showId = 'y';
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  jstWrap(d, t);
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  h = t.innerHTML;
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertTrue(/display:\s*none/.test(h));
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function stringContains(str, sub) {
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return str.indexOf(sub) != -1;
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function testJseval() {
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var data = {};
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var counter = 0;
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var ctx = new JsEvalContext(data);
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ctx.setVariable("callback1", function() {
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ++counter;
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  });
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ctx.setVariable("callback2", function() {
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    counter *= 2;
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  });
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  jstProcess(ctx, document.getElementById('testJseval1'));
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertEquals("testJseval1", 1, counter);
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  jstProcess(ctx, document.getElementById('testJseval2'));
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertEquals("testJseval2", 4, counter);
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function testJstValues() {
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var t = document.getElementById('t3');
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var d = {};
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  jstWrap(d, t);
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var h = t.innerHTML;
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertTrue(stringContains(h, 'http://maps.google.com/'));
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var t3a = document.getElementById('t3a');
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertEquals('http://maps.google.com/', t3a.foo.bar.baz);
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertEquals('http://maps.google.com/', t3a.bar);
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertEquals('red', t3a.style.backgroundColor);
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function testJstTransclude() {
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var t = document.getElementById('t4');
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var p = document.getElementById('parent');
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var d = {};
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  jstWrap(d, t);
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var h = p.innerHTML;
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertTrue(h, stringContains(h, 'http://maps.google.com/'));
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function assertAttributesMatch(first, second) {
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertEquals('assertAttributesMatch: number of child nodes',
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               jsLength(first.childNodes), jsLength(second.childNodes));
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var b = second.firstChild;
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (var a = first.firstChild; a; a = a.nextSibling) {
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var att = a.attributes;
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (att) {
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assertTrue(b.attributes != null);
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assertEquals('assertAttributesMatch: number of attribute nodes',
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   att.length, b.attributes.length);
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (var i = 0; i < jsLength(att); i++) {
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        var a = att[i];
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        assertEquals('assertAttributesMatch: value of attribute ' + a.name,
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     a.value, b.getAttribute(a.name));
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assertNull(b.attributes);
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    b = b.nextSibling;
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function testJsskip() {
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var div = domCreateElement(document, "DIV");
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  div.innerHTML = [
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      '<div jseval="outercallback()" jsskip="1">',
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      '<div jseval="innercallback()">',
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      '</div>',
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      '</div>'
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ].join('');
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var data = {};
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var ctx = new JsEvalContext(data);
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var outerCalled = false;
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ctx.setVariable("outercallback", function() {
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    outerCalled = true;
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  });
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var innerCalled = false;
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ctx.setVariable("innercallback", function() {
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    innerCalled = true;
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  });
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  jstProcess(ctx, div);
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertTrue(outerCalled);
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertFalse(innerCalled);
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function testScalarContext() {
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var t = document.getElementById('testScalarContext');
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  jstWrap(true, t);
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertTrue(/>true</.test(t.innerHTML));
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  jstWrap(false, t);
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertTrue(/>false</.test(t.innerHTML));
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  jstWrap(0, t);
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertTrue(/>0</.test(t.innerHTML));
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  jstWrap("foo", t);
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertTrue(/>foo</.test(t.innerHTML));
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  jstWrap(undefined, t);
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertTrue(/>undefined</.test(t.innerHTML));
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  jstWrap(null, t);
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertTrue(/>null</.test(t.innerHTML));
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function testJstLoadTemplate() {
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var wrapperId = 'testJstLoadTemplateWrapper';
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var id = 'testJstLoadTemplate';
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  jstLoadTemplate_(document, '<div id="' + id + '">content</div>', wrapperId);
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var wrapperElem = document.getElementById(wrapperId);
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertTrue('Expected wrapper element to be in document',
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             !!wrapperElem);
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var newTemplate = document.getElementById(id);
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertTrue('Expected newly loaded template to be in document',
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             !!newTemplate);
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertTrue('Expected wrapper to be grandparent of template',
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             newTemplate.parentNode.parentNode == wrapperElem);
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure the next template loaded with the same wrapper id re-uses the
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // wrapper element.
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var id2 = 'testJstLoadTemplate2';
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  jstLoadTemplate_(document, '<div id="' + id2 + '">content</div>', wrapperId);
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var newTemplate2 = document.getElementById(id2);
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertTrue('Expected newly loaded template to be in document',
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             !!newTemplate2);
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertTrue('Expected wrapper to be grandparent of template',
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             newTemplate2.parentNode.parentNode == wrapperElem);
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function testJstGetTemplateFromDom() {
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var element;
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Get by id a template in the document
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Success
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  element = jstGetTemplate('t1');
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertTrue("Asserted jstGetTemplate('t1') to return a dom element",
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             !!element);
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Failure
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  element = jstGetTemplate('asdf');
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertFalse("Asserted jstGetTemplate('asdf') to return null",
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              !!element);
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function testJstGetTemplateFromFunction() {
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var element;
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Fetch a jstemplate by id from within a html string, passed via a function.
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  function returnHtmlWithId(id) {
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var html =
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        '<div>' +
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        '<div id="' + id + '">Here is the template</div>' +
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        '</div>';
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return html;
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Success
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  element = jstGetTemplate('template',
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           partial(returnHtmlWithId, 'template'));
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertTrue("Expected jstGetTemplate('template') to return a dom element",
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             !!element);
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Failure
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  element = jstGetTemplate('asdf',
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           partial(returnHtmlWithId, 'zxcv'));
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertFalse("Expected jstGetTemplate('zxcv') to return null",
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              !!element);
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function testPrepareNode() {
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var id, node;
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reset the cache so we're testing from a known state.
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  JstProcessor.jstCache_ = {};
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  JstProcessor.jstCache_[0] = {};
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Skip pre-processed nodes.  Preprocessed nodes are those with a
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // PROP_jstcache property.
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var t = document.getElementById('t1');
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var caches = [];
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  caches.push(JstProcessor.prepareNode_(t));
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  caches.push(JstProcessor.prepareNode_(t));
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertEquals('The same cache should be returned on each call to prepareNode',
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               caches[0], caches[1]);
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Preprocessing a node with a jst attribute should return a valid struct
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  id = 'testPrepareNodeWithAttributes';
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  jstLoadTemplate_(document, '<div id="' + id + '" jsskip="1"></div>');
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  node = document.getElementById(id);
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var cache = JstProcessor.prepareNode_(node);
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  try {
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var jsskip = cache['jsskip']({}, {});
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } catch (e) {
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fail('Exception when evaluating jsskip from cache');
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertEquals(1, jsskip);
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function testPrepareNodeWithNoAttributes() {
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Preprocessing a node with no jst attributes should return null
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var id = 'testPrepareNodeNoAttributes';
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  jstLoadTemplate_(document, '<div id="' + id + '"></div>');
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var node = document.getElementById(id);
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertEquals('prepareNode with no jst attributes should return default',
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               JstProcessor.jstcache_[0], JstProcessor.prepareNode_(node));
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function testJsVars() {
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var template = document.createElement('div');
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  document.body.appendChild(template);
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  template.innerHTML = '<div jsvars="foo:\'foo\';bar:true;$baz:1"></div>';
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var context = new JsEvalContext;
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  jstProcess(context, template);
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertEquals('foo', context.getVariable('foo'));
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertEquals(1, context.getVariable('$baz'));
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertTrue(context.getVariable('bar'));
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertUndefined(context.getVariable('foobar'));
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function testCacheReuse() {
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var template = document.createElement('div');
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  document.body.appendChild(template);
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  template.innerHTML =
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    '<div jsvars="foo:\'foo\';bar:true;$baz:1"></div>' +
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    '<span jsvars="foo:\'foo\';bar:true;$baz:1"></span>';
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  JstProcessor.prepareTemplate_(template);
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertEquals(template.firstChild.getAttribute(ATT_jstcache),
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               template.lastChild.getAttribute(ATT_jstcache));
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
357