| /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */ |
| /* This Source Code Form is subject to the terms of the Mozilla Public |
| * License, v. 2.0. If a copy of the MPL was not distributed with this |
| * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
| |
| //----------------------------------------------------------------------------- |
| var BUGNUMBER = 312385; |
| var summary = 'Generic methods with null or undefined |this|'; |
| var actual = ''; |
| var expect = true; |
| var voids = [null, undefined]; |
| |
| |
| function noop() { } |
| |
| var generics = { |
| String: [{ substring: [] }, |
| { toLowerCase: [] }, |
| { toUpperCase: [] }, |
| { charAt: [] }, |
| { charCodeAt: [] }, |
| { indexOf: [] }, |
| { lastIndexOf: [] }, |
| { toLocaleLowerCase: [] }, |
| { toLocaleUpperCase: [] }, |
| { localeCompare: [] }, |
| { match: [/(?:)/] }, // match(regexp) |
| { search: [] }, |
| { replace: [] }, |
| { split: [] }, |
| { substr: [] }, |
| { concat: [] }, |
| { slice: [] }], |
| |
| Array: [{ join: [] }, |
| { reverse: [] }, |
| { sort: [] }, |
| // { push: [0] }, // push(item1, ...) |
| // { pop: [] }, |
| // { shift: [] }, |
| { unshift: [] }, |
| // { splice: [0, 0, 1] }, // splice(start, deleteCount, item1, ...) |
| { concat: [] }, |
| { indexOf: [] }, |
| { lastIndexOf: [] }, |
| // forEach is excluded since it does not return a value... |
| /* { forEach: [noop] }, // forEach(callback, thisObj) */ |
| { map: [noop] }, // map(callback, thisObj) |
| { filter: [noop] }, // filter(callback, thisObj) |
| { some: [noop] }, // some(callback, thisObj) |
| { every: [noop] } // every(callback, thisObj) |
| ] |
| }; |
| |
| printBugNumber(BUGNUMBER); |
| printStatus (summary); |
| |
| var global = this; |
| |
| for (var c in generics) |
| { |
| var methods = generics[c]; |
| for (var i = 0; i < methods.length; i++) |
| { |
| var method = methods[i]; |
| |
| for (var methodname in method) |
| { |
| for (var v = 0; v < voids.length; v++) |
| { |
| var Constructor = global[c] |
| |
| var argsLen = method[methodname].length; |
| assertEq(argsLen === 0 || argsLen === 1, true, "not all arities handled"); |
| |
| var generic = Constructor[methodname]; |
| var prototypy = Constructor.prototype[methodname]; |
| |
| assertEq(typeof generic, "function"); |
| assertEq(typeof prototypy, "function"); |
| |
| // GENERIC METHOD TESTING |
| |
| try |
| { |
| switch (method[methodname].length) |
| { |
| case 0: |
| generic(voids[v]); |
| break; |
| |
| case 1: |
| generic(voids[v], method[methodname][0]); |
| break; |
| } |
| throw new Error(c + "." + methodname + " must throw for null or " + |
| "undefined first argument"); |
| } |
| catch (e) |
| { |
| assertEq(e instanceof TypeError, true, |
| "Didn't get a TypeError for " + c + "." + methodname + |
| " called with null or undefined first argument"); |
| } |
| |
| |
| // PROTOTYPE METHOD TESTING |
| |
| try |
| { |
| prototypy.apply(voids[v], method[methodname][0]); |
| throw new Error(c + ".prototype." + methodname + " must throw " + |
| "for null or undefined this"); |
| } |
| catch (e) |
| { |
| assertEq(e instanceof TypeError, true, |
| c + ".prototype." + methodname + "didn't throw a " + |
| "TypeError when called with null or undefined this"); |
| } |
| } |
| } |
| } |
| } |
| |
| if (typeof reportCompare === "function") |
| reportCompare(true, true); |
| |
| print("Tests finished."); |