| /* |
| * Copyright (C) 2011 Google Inc. All rights reserved. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions |
| * are met: |
| * 1. Redistributions of source code must retain the above copyright |
| * notice, this list of conditions and the following disclaimer. |
| * 2. Redistributions in binary form must reproduce the above copyright |
| * notice, this list of conditions and the following disclaimer in the |
| * documentation and/or other materials provided with the distribution. |
| * |
| * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' |
| * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, |
| * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
| * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS |
| * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
| * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
| * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
| * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
| * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
| * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF |
| * THE POSSIBILITY OF SUCH DAMAGE. |
| */ |
| |
| (function () { |
| |
| module("base"); |
| |
| test("joinPath", 1, function() { |
| var value = base.joinPath("path/to", "test.html"); |
| equals(value, "path/to/test.html"); |
| }); |
| |
| test("endsWith", 9, function() { |
| ok(base.endsWith("xyz", "")); |
| ok(base.endsWith("xyz", "z")); |
| ok(base.endsWith("xyz", "yz")); |
| ok(base.endsWith("xyz", "xyz")); |
| ok(!base.endsWith("xyz", "wxyz")); |
| ok(!base.endsWith("xyz", "gwxyz")); |
| ok(base.endsWith("", "")); |
| ok(!base.endsWith("", "z")); |
| ok(!base.endsWith("xyxy", "yx")); |
| }); |
| |
| test("trimExtension", 6, function() { |
| equals(base.trimExtension("xyz"), "xyz"); |
| equals(base.trimExtension("xy.z"), "xy"); |
| equals(base.trimExtension("x.yz"), "x"); |
| equals(base.trimExtension("x.y.z"), "x.y"); |
| equals(base.trimExtension(".xyz"), ""); |
| equals(base.trimExtension(""), ""); |
| }); |
| |
| test("joinPath with empty parent", 1, function() { |
| var value = base.joinPath("", "test.html"); |
| equals(value, "test.html"); |
| }); |
| |
| test("dirName", 3, function() { |
| equals(base.dirName("foo.html"), "foo.html"); |
| equals(base.dirName("foo/bar.html"), "foo"); |
| equals(base.dirName("foo/bar/baz.html"), "foo/bar"); |
| }); |
| |
| test("uniquifyArray", 5, function() { |
| deepEqual(base.uniquifyArray([]), []); |
| deepEqual(base.uniquifyArray(["a"]), ["a"]); |
| deepEqual(base.uniquifyArray(["a", "b"]), ["a", "b"]); |
| deepEqual(base.uniquifyArray(["a", "b", "b"]), ["a", "b"]); |
| deepEqual(base.uniquifyArray(["a", "b", "b", "a"]), ["a", "b"]); |
| }); |
| |
| test("flattenArray", 5, function() { |
| deepEqual(base.flattenArray([]), []); |
| deepEqual(base.flattenArray([["a"]]), ["a"]); |
| deepEqual(base.flattenArray([["a"], ["b"]]), ["a", "b"]); |
| deepEqual(base.flattenArray([["a"], ["b", "c"]]), ["a", "b", "c"]); |
| deepEqual(base.flattenArray([["a"], [], ["b"]]), ["a", "b"]); |
| }); |
| |
| test("callInParallel", 4, function() { |
| var expectedCall = [true, true, true]; |
| var expectCompletionCallback = true; |
| |
| base.callInParallel([ |
| function(callback) { |
| ok(expectedCall[0]); |
| expectedCall[0] = false; |
| callback(); |
| }, |
| function(callback) { |
| ok(expectedCall[1]); |
| expectedCall[1] = false; |
| callback(); |
| }, |
| function(callback) { |
| ok(expectedCall[2]); |
| expectedCall[2] = false; |
| callback(); |
| }, |
| ], function() { |
| ok(expectCompletionCallback); |
| expectCompletionCallback = false; |
| }) |
| }); |
| |
| test("RequestTracker", 5, function() { |
| var ready = false; |
| var tracker = new base.RequestTracker(1, function() { |
| ok(ready); |
| }); |
| ready = true; |
| tracker.requestComplete(); |
| ready = false; |
| |
| tracker = new base.RequestTracker(2, function(parameter) { |
| ok(ready); |
| equals(parameter, 'argument'); |
| }, ['argument']); |
| tracker.requestComplete(); |
| ready = true; |
| tracker.requestComplete(); |
| ready = false; |
| |
| tracker = new base.RequestTracker(0, function() { |
| ok(true); |
| }); |
| tracker.requestComplete(); |
| |
| tracker = new base.RequestTracker(0); |
| tracker.requestComplete(); |
| // Should not barf. |
| ok(true); |
| }); |
| |
| test("filterDictionary", 3, function() { |
| var dictionary = { |
| 'foo': 43, |
| 'bar': 11 |
| }; |
| deepEqual(base.filterDictionary(dictionary, function() { return true; }), { |
| "foo": 43, |
| "bar": 11 |
| }); |
| deepEqual(base.filterDictionary(dictionary, function() { return false; }), { }); |
| deepEqual(base.filterDictionary(dictionary, function(key) { return key == 'foo'; }), { |
| "foo": 43 |
| }); |
| }); |
| |
| test("mapDictionary", 3, function() { |
| deepEqual(base.mapDictionary({}, function(value) { return value - 10; }), {}); |
| var dictionary = { |
| 'foo': 43, |
| 'bar': 11 |
| }; |
| deepEqual(base.mapDictionary(dictionary, function(value) { return value - 10; }), { |
| "foo": 33, |
| "bar": 1 |
| }); |
| deepEqual(base.mapDictionary(dictionary, function(value) { |
| if (value > 20) |
| return value - 20; |
| }), { |
| "foo": 23, |
| }); |
| }); |
| |
| test("filterTree", 2, function() { |
| var tree = { |
| 'path': { |
| 'to': { |
| 'test.html': { |
| 'actual': 'PASS', |
| 'expected': 'FAIL' |
| } |
| }, |
| 'another.html': { |
| 'actual': 'TEXT', |
| 'expected': 'PASS' |
| } |
| } |
| } |
| |
| function isLeaf(node) |
| { |
| return !!node.actual; |
| } |
| |
| function actualIsText(node) |
| { |
| return node.actual == 'TEXT'; |
| } |
| |
| var all = base.filterTree(tree, isLeaf, function() { return true }); |
| deepEqual(all, { |
| 'path/to/test.html': { |
| 'actual': 'PASS', |
| 'expected': 'FAIL' |
| }, |
| 'path/another.html': { |
| 'actual': 'TEXT', |
| 'expected': 'PASS' |
| } |
| }); |
| |
| var text = base.filterTree(tree, isLeaf, actualIsText); |
| deepEqual(text, { |
| 'path/another.html': { |
| 'actual': 'TEXT', |
| 'expected': 'PASS' |
| } |
| }); |
| }); |
| |
| test("UpdateTracker", 20, function() { |
| var dict; |
| |
| function dumpKeys() |
| { |
| var updates = [] |
| dict.forEach(function(item, key, updated) { |
| updates.push(key); |
| }); |
| return updates; |
| } |
| |
| function dumpUpdatedKeys() |
| { |
| var updates = [] |
| dict.forEach(function(item, key, updated) { |
| updated && updates.push(key); |
| }); |
| return updates; |
| } |
| |
| |
| dict = new base.UpdateTracker(); |
| dict.update("5", {}); |
| deepEqual(dumpUpdatedKeys(), ["5"]); |
| dict.update("6", {}); |
| dict.update("7", {}); |
| deepEqual(dumpUpdatedKeys(), ["5", "6", "7"]); |
| deepEqual(dict.get("6"), {}); |
| ok(dict.exists("7")); |
| dict.purge(); |
| deepEqual(dumpUpdatedKeys(), []); |
| deepEqual(dumpKeys(), ["5", "6", "7"]); |
| dict.update("5", {}); |
| deepEqual(dumpUpdatedKeys(), ["5"]); |
| dict.update("4", {}); |
| deepEqual(dumpUpdatedKeys(), ["4", "5"]); |
| deepEqual(dumpKeys(), ["4", "5", "6", "7"]); |
| dict.purge(); |
| deepEqual(dumpKeys(), ["4", "5"]); |
| deepEqual(dumpUpdatedKeys(), []); |
| dict.purge(); |
| deepEqual(dumpKeys(), []); |
| |
| var removeCount = 0; |
| dict.update("one"); |
| deepEqual(dumpUpdatedKeys(), ["one"]); |
| dict.update("two"); |
| deepEqual(dumpUpdatedKeys(), ["one", "two"]); |
| dict.update("three"); |
| dict.purge(); |
| deepEqual(dumpKeys(), ["one", "three", "two"]); |
| dict.update("two"); |
| dict.purge(function() { |
| removeCount++; |
| }); |
| deepEqual(dumpKeys(), ["two"]); |
| equal(removeCount, 2); |
| dict.update("four"); |
| var removeCounter = { count: 0 }; |
| dict.purge(function() { |
| this.count++; |
| }, removeCounter); |
| equal(removeCounter.count, 1); |
| dict.purge(function() { |
| equal(String(this), "four"); |
| }); |
| |
| dict = new base.UpdateTracker(); |
| dict.update("one"); |
| var thisObject = {} |
| dict.forEach(function(item) { |
| equal(this, thisObject); |
| }, thisObject); |
| |
| }); |
| |
| test("extends", 14, function() { |
| |
| var LikeDiv = base.extends("div", { |
| init: function() { |
| this.textContent = "awesome"; |
| }, |
| method: function(msg) { |
| return 42; |
| } |
| }); |
| |
| var LikeLikeDiv = base.extends(LikeDiv, { |
| init: function() { |
| this.className = "like"; |
| } |
| }); |
| |
| var LikeP = base.extends("p", { |
| init: function(content) { |
| this.textContent = content |
| } |
| }); |
| |
| var LikeProgress = base.extends("progress", { |
| init: function() { |
| this.max = 100; |
| this.value = 10; |
| } |
| }); |
| |
| var LikeLikeProgress = base.extends(LikeProgress, { |
| completed: function() { |
| this.value = 100; |
| } |
| }); |
| |
| document.body.appendChild(new LikeDiv()); |
| equals(document.body.lastChild.tagName, "DIV"); |
| equals(document.body.lastChild.innerHTML, "awesome"); |
| equals(document.body.lastChild.method(), 42); |
| document.body.removeChild(document.body.lastChild); |
| |
| document.body.appendChild(new LikeLikeDiv()); |
| equals(document.body.lastChild.tagName, "DIV"); |
| equals(document.body.lastChild.innerHTML, "awesome"); |
| equals(document.body.lastChild.method(), 42); |
| equals(document.body.lastChild.className, "like"); |
| document.body.removeChild(document.body.lastChild); |
| |
| document.body.appendChild(new LikeP("super")); |
| equals(document.body.lastChild.tagName, "P"); |
| equals(document.body.lastChild.innerHTML, "super"); |
| raises(function() { |
| document.body.lastChild.method(); |
| }); |
| document.body.removeChild(document.body.lastChild); |
| |
| document.body.appendChild(new LikeProgress()); |
| equals(document.body.lastChild.tagName, "PROGRESS"); |
| // Safari 5.1 lacks the <progress> element. |
| // equals(document.body.lastChild.position, 0.1); |
| equals(document.body.lastChild.innerHTML, ""); |
| raises(function() { |
| document.body.lastChild.method(); |
| }); |
| document.body.removeChild(document.body.lastChild); |
| |
| document.body.appendChild(new LikeLikeProgress()); |
| equals(document.body.lastChild.tagName, "PROGRESS"); |
| // Safari 5.1 lacks the <progress> element. |
| // equals(document.body.lastChild.position, 0.1); |
| document.body.lastChild.completed(); |
| // Safari 5.1 lacks the <progress> element. |
| // equals(document.body.lastChild.position, 1); |
| document.body.removeChild(document.body.lastChild); |
| }); |
| |
| test("relativizeTime", 14, function() { |
| var time = new Date(); |
| equals(base.relativizeTime(time), "Just now"); |
| time.setMinutes(time.getMinutes() - 1); |
| equals(base.relativizeTime(time), "1 minute ago"); |
| time.setMinutes(time.getMinutes() - 1); |
| equals(base.relativizeTime(time), "2 minutes ago"); |
| time.setMinutes(time.getMinutes() - 1); |
| equals(base.relativizeTime(time), "3 minutes ago"); |
| time.setMinutes(time.getMinutes() - 56); |
| equals(base.relativizeTime(time), "59 minutes ago"); |
| time.setMinutes(time.getMinutes() - 1); |
| equals(base.relativizeTime(time), "1 hour ago"); |
| time.setMinutes(time.getMinutes() - 29); |
| equals(base.relativizeTime(time), "1 hour ago"); |
| time.setMinutes(time.getMinutes() - 2); |
| equals(base.relativizeTime(time), "2 hours ago"); |
| time.setMinutes(time.getMinutes() - 29); |
| equals(base.relativizeTime(time), "2 hours ago"); |
| time.setHours(time.getHours() - 1); |
| equals(base.relativizeTime(time), "3 hours ago"); |
| time.setHours(time.getHours() - 20); |
| equals(base.relativizeTime(time), "23 hours ago"); |
| time.setHours(time.getHours() - 1); |
| equals(base.relativizeTime(time), "1 day ago"); |
| time.setDate(time.getDate() - 1); |
| equals(base.relativizeTime(time), "2 days ago"); |
| time.setDate(time.getDate() - 998); |
| equals(base.relativizeTime(time), "1000 days ago"); |
| }); |
| |
| test("getURLParameter", 1, function() { |
| ok(!base.getURLParameter('non-existant')); |
| }); |
| |
| test("parseJSONP", 6, function() { |
| deepEqual(base.parseJSONP(""), {}); |
| deepEqual(base.parseJSONP('p({"key": "value"})'), {"key": "value"}); |
| deepEqual(base.parseJSONP('ADD_RESULTS({"dummy":"data"});'), {"dummy":"data"}); |
| deepEqual(base.parseJSONP('{"dummy":"data"}'), {"dummy":"data"}); |
| deepEqual(base.parseJSONP('ADD_RESULTS({"builder(1)":"data"});'), {"builder(1)":"data"}); |
| deepEqual(base.parseJSONP('{"builder(1)":"data"}'), {"builder(1)":"data"}); |
| }); |
| |
| })(); |