/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */ /* vim: set ft=javascript ts=2 et sw=2 tw=80: */ /* Any copyright is dedicated to the Public Domain. * http://creativecommons.org/publicdomain/zero/1.0/ */ "use strict"; /* Test case that ensures Array and other list types are not sorted in variables * view. * * The tested types are: * - Array * - Int8Array * - Int16Array * - Int32Array * - Uint8Array * - Uint16Array * - Uint32Array * - Uint8ClampedArray * - Float32Array * - Float64Array * - NodeList */ function test() { const TEST_URI = "data:text/html;charset=utf-8, \ \ \ Test document for bug 977500 \ \ \
\
\
\
\
\
\
\
\
\
\
\
\ \ "; let jsterm; function* runner() { const typedArrayTypes = ["Int8Array", "Int16Array", "Int32Array", "Uint8Array", "Uint16Array", "Uint32Array", "Uint8ClampedArray", "Float32Array", "Float64Array"]; const {tab} = yield loadTab(TEST_URI); const hud = yield openConsole(tab); jsterm = hud.jsterm; // Create an ArrayBuffer of 80 bytes to test TypedArrays. 80 bytes is // enough to get 10 items in all different TypedArrays. yield jsterm.execute("let buf = new ArrayBuffer(80);"); // Array yield testNotSorted("Array(0,1,2,3,4,5,6,7,8,9,10)"); // NodeList yield testNotSorted("document.querySelectorAll('div')"); // Object yield testSorted("Object({'hello':1,1:5,10:2,4:2,'abc':1})"); // Typed arrays. for (let type of typedArrayTypes) { yield testNotSorted("new " + type + "(buf)"); } } /** * A helper that ensures the properties are not sorted when an object * specified by aObject is inspected. * * @param string aObject * A string that, once executed, creates and returns the object to * inspect. */ function* testNotSorted(aObject) { info("Testing " + aObject); let deferred = promise.defer(); jsterm.once("variablesview-fetched", (_, aVar) => deferred.resolve(aVar)); jsterm.execute("inspect(" + aObject + ")"); let variableScope = yield deferred.promise; ok(variableScope, "Variables view opened"); // If the properties are sorted: keys = ["0", "1", "10",...] <- incorrect // If the properties are not sorted: keys = ["0", "1", "2",...] <- correct let keyIterator = variableScope._store.keys(); is(keyIterator.next().value, "0", "First key is 0"); is(keyIterator.next().value, "1", "Second key is 1"); // If the properties are sorted, the next one will be 10. is(keyIterator.next().value, "2", "Third key is 2, not 10"); } /** * A helper that ensures the properties are sorted when an object * specified by aObject is inspected. * * @param string aObject * A string that, once executed, creates and returns the object to * inspect. */ function* testSorted(aObject) { info("Testing " + aObject); let deferred = promise.defer(); jsterm.once("variablesview-fetched", (_, aVar) => deferred.resolve(aVar)); jsterm.execute("inspect(" + aObject + ")"); let variableScope = yield deferred.promise; ok(variableScope, "Variables view opened"); // If the properties are sorted: // keys = ["1", "4", "10",..., "abc", "hello"] <- correct // If the properties are not sorted: // keys = ["1", "10", "4",...] <- incorrect let keyIterator = variableScope._store.keys(); is(keyIterator.next().value, "1", "First key should be 1"); is(keyIterator.next().value, "4", "Second key should be 4"); // If the properties are sorted, the next one will be 10. is(keyIterator.next().value, "10", "Third key is 10"); // If sorted next properties should be "abc" then "hello" is(keyIterator.next().value, "abc", "Fourth key is abc"); is(keyIterator.next().value, "hello", "Fifth key is hello"); } Task.spawn(runner).then(finishTest); }