diff options
Diffstat (limited to 'third_party/jstemplate/jstemplate_example.js')
-rw-r--r-- | third_party/jstemplate/jstemplate_example.js | 232 |
1 files changed, 232 insertions, 0 deletions
diff --git a/third_party/jstemplate/jstemplate_example.js b/third_party/jstemplate/jstemplate_example.js new file mode 100644 index 0000000..b9e2faf --- /dev/null +++ b/third_party/jstemplate/jstemplate_example.js @@ -0,0 +1,232 @@ +// Copyright 2006 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or +// implied. See the License for the specific language governing +// permissions and limitations under the License. +/** + * @pageoverview Some logic for the jstemplates test pages. + * + * @author Steffen Meschkat (mesch@google.com) + */ + + +function elem(id) { + return document.getElementById(id); +} + +/** + * Are we actively profiling JstProcessor? + * @type boolean + */ +var profiling = false; + +logHtml = function(html) { + elem('log').innerHTML += html + '<br/>'; +}; + + +/** + * Initializer for interactive test: copies the value from the actual + * template HTML into a text area to make the HTML source visible. + */ +function jsinit() { + elem('template').value = elem('tc').innerHTML; +} + + +/** + * Interactive test. + * + * @param {boolean} reprocess If true, reprocesses the output of the + * previous invocation. + */ +function jstest(reprocess) { + var jstext = elem('js').value; + var input = jsEval(jstext); + var t; + if (reprocess) { + t = elem('out'); + } else { + elem('tc').innerHTML = elem('template').value; + t = jstGetTemplate('t'); + elem('out').innerHTML = ''; + elem('out').appendChild(t); + } + if (profiling) Profiler.reset(); + jstProcess(new JsEvalContext(input), t); + if (profiling) Profiler.dump(); + elem('html').value = elem('out').innerHTML; +} + + +/** + * Performance test: jst initial processing. + * + * @param {Object} data Test data to apply the template to. + */ +function perf1(data) { + elem('out').innerHTML = ''; + var t = jstGetTemplate('t1'); + elem('out').appendChild(t); + if (profiling) Profiler.reset(); + jstProcess(new JsEvalContext(data), t); + if (profiling) Profiler.dump(); +} + + +/** + * Performance test: jst reprocessing or previous processing output. + * + * @param {Object} data Test data to apply the template to. + */ +function perf1a(data) { + if (profiling) Profiler.reset(); + jstProcess(new JsEvalContext(data), elemOrDie('out')); + if (profiling) Profiler.dump(); +} + + +/** + * Performance test: jst initial processing, with display:none during + * processing. + * + * @param {Object} data Test data to apply the template to. + */ +function perf1b(data) { + var o = elem('out'); + o.innerHTML = ''; + var t = jstGetTemplate('t1'); + o.appendChild(t); + displayNone(o); + if (profiling) Profiler.reset(); + jstProcess(new JsEvalContext(data), t); + if (profiling) Profiler.dump(); + displayDefault(o); +} + + +/** + * Performance test: create output procedurally as string and assign + * to innerHTML. + * + * @param {Object} data Test data to apply the template to. + */ +function perf2(data) { + var t = []; + t.push("<table><tr><th>item</th><th>label</th><th>address</th></tr>"); + for (var i = 0; i < data.entries.length; ++i) { + var e = data.entries[i]; + t.push("<tr><td>" + i + "</td><td>" + e.label + "</td><td>" + + e.address + "</td></tr>"); + } + t.push("</table>"); + elem("out").innerHTML = t.join(''); +} + + +/** + * A test runner for a test. Does the timing. @constructor + * + * @param {number} times number of iterations the test is executed. + * @param {Function} test The test to execute. + * @param {Function} result Function will be called with the execution + * time as argument. + */ +function TestRun(times, test, result) { + this.count_ = 0; + this.times_ = times; + this.test_ = test; + this.result_ = result; + this.start_ = (new Date).valueOf(); + this.run_(); +} + + +/** + * Executes the test run. + */ +TestRun.prototype.run_ = function() { + if (this.count_ < this.times_) { + this.test_(this.count_); + this.count_ += 1; + objectSetTimeout(this, this.run_, 0); + } else { + this.stop_ = (new Date).valueOf(); + this.result_(this.stop_ - this.start_); + } +}; + + +/** + * Creates a testrun function for test count invocations of function + * f, whose runtime will be output to the element with is given in + * result. + * + * @param {Object} data The test data object. + * @param {Function} f + * @param {number} count + * @param {string} result +*/ +function createTestRun(count, test) { + var data = { + entries: [] + }; + for (var i = 0; i < count; ++i) { + data.entries.push({ label: "label" + i, address: "address" + i }); + } + // This function is passed to the TimeoutSequence, and receives the + // TimeoutSequence as argument on invocation. + return function(s) { + new TestRun(1, function(i) { + window[test](data); + }, function(time) { + elem(test + '-' + count).innerHTML = time + 'ms'; + s.run(); + }); + }; +} + +/** + * Runs all tests the given number of times. Invoked from the HTML page. + * + * @param {number} count + */ +function jsperf(count) { + elemOrDie('log').innerHTML = ''; + profiling = !!elemOrDie('profile').checked; + if (profiling && !JstProcessor.profiling_) { + JstProcessor.profiling_ = true; + Profiler.monitorAll(proto(JstProcessor), false); + } + + var s = new TimeoutSequence(null, null, true); + + s.add(createTestRun(count, "perf1")); + s.add(createTestRun(count, "perf1b")); + s.add(createTestRun(count, "perf1a")); + s.add(createTestRun(count, "perf2")); + + s.run(); +} + +function run(test, count) { + var data = { + entries: [] + }; + for (var i = 0; i < count; ++i) { + data.entries.push({ label: "label" + i, address: "address" + i }); + } + new TestRun(1, function() { + window[test](data); + }, function(time) { + elem(test + '-' + count).innerHTML = time + 'ms'; + }); +} |