/* * Copyright 2009-2011 Mozilla Foundation and contributors * Licensed under the New BSD license. See LICENSE.txt or: * http://opensource.org/licenses/BSD-3-Clause */ /* * * * * * * * *********************************** WARNING *********************************** * * Do not edit this file without understanding where it comes from, * Your changes are likely to be overwritten without warning. * * This test file is generated using a level 25 wizard spell cast on the * test files that run in the browser as part of GCLI's test suite. * For details of how to cast the spell, see GCLI's Makefile.dryice.js * * For more information on GCLI see: * - https://github.com/mozilla/gcli/blob/master/docs/index.md * - https://wiki.mozilla.org/DevTools/Features/GCLI * * The original source for this file is: * https://github.com/mozilla/gcli/ * ******************************************************************************* * * * * * * * * * */ /////////////////////////////////////////////////////////////////////////////// var obj = {}; Components.utils.import("resource:///modules/gcli.jsm", obj); var define = obj.gcli._internal.define; var console = obj.gcli._internal.console; var Node = Components.interfaces.nsIDOMNode; /* * Copyright 2009-2011 Mozilla Foundation and contributors * Licensed under the New BSD license. See LICENSE.txt or: * http://opensource.org/licenses/BSD-3-Clause */ define('gclitest/index', ['require', 'exports', 'module' , 'gclitest/suite'], function(require, exports, module) { var examiner = require('gclitest/suite').examiner; /** * A simple proxy to examiner.run, for convenience - this is run from the * top level. */ exports.run = function(options) { examiner.run(options || {}); }; }); /* * Copyright 2009-2011 Mozilla Foundation and contributors * Licensed under the New BSD license. See LICENSE.txt or: * http://opensource.org/licenses/BSD-3-Clause */ define('gclitest/suite', ['require', 'exports', 'module' , 'gcli/index', 'test/examiner', 'gclitest/testTokenize', 'gclitest/testSplit', 'gclitest/testCli', 'gclitest/testExec', 'gclitest/testKeyboard', 'gclitest/testScratchpad', 'gclitest/testHistory', 'gclitest/testRequire', 'gclitest/testResource', 'gclitest/testJs', 'gclitest/testUtil'], function(require, exports, module) { // We need to make sure GCLI is initialized before we begin testing it require('gcli/index'); var examiner = require('test/examiner'); // It's tempting to want to unify these strings and make addSuite() do the // call to require(), however that breaks the build system which looks for // the strings passed to require examiner.addSuite('gclitest/testTokenize', require('gclitest/testTokenize')); examiner.addSuite('gclitest/testSplit', require('gclitest/testSplit')); examiner.addSuite('gclitest/testCli', require('gclitest/testCli')); examiner.addSuite('gclitest/testExec', require('gclitest/testExec')); examiner.addSuite('gclitest/testKeyboard', require('gclitest/testKeyboard')); examiner.addSuite('gclitest/testScratchpad', require('gclitest/testScratchpad')); examiner.addSuite('gclitest/testHistory', require('gclitest/testHistory')); examiner.addSuite('gclitest/testRequire', require('gclitest/testRequire')); examiner.addSuite('gclitest/testResource', require('gclitest/testResource')); examiner.addSuite('gclitest/testJs', require('gclitest/testJs')); examiner.addSuite('gclitest/testUtil', require('gclitest/testUtil')); exports.examiner = examiner; }); /* * Copyright 2009-2011 Mozilla Foundation and contributors * Licensed under the New BSD license. See LICENSE.txt or: * http://opensource.org/licenses/BSD-3-Clause */ define('test/examiner', ['require', 'exports', 'module' ], function(require, exports, module) { var examiner = exports; /** * Test harness data */ examiner.suites = {}; /** * The gap between tests when running async */ var delay = 10; var currentTest = null; var stati = { notrun: { index: 0, name: 'Skipped' }, executing: { index: 1, name: 'Executing' }, asynchronous: { index: 2, name: 'Waiting' }, pass: { index: 3, name: 'Pass' }, fail: { index: 4, name: 'Fail' } }; /** * Add a test suite. Generally used like: * test.addSuite('foo', require('path/to/foo')); */ examiner.addSuite = function(name, suite) { examiner.suites[name] = new Suite(name, suite); }; /** * Run the tests defined in the test suite synchronously * @param options How the tests are run. Properties include: * - window: The browser window object to run the tests against * - useFakeWindow: Use a test subset and a fake DOM to avoid a real document * - detailedResultLog: console.log test passes and failures in more detail */ examiner.run = function(options) { examiner._checkOptions(options); Object.keys(examiner.suites).forEach(function(suiteName) { var suite = examiner.suites[suiteName]; suite.run(options); }.bind(this)); if (options.detailedResultLog) { examiner.log(); } else { console.log('Completed test suite'); } return examiner.suites; }; /** * Check the options object. There should be either useFakeWindow or a window. * Setup the fake window if requested. */ examiner._checkOptions = function(options) { if (options.useFakeWindow) { // A minimum fake dom to get us through the JS tests var doc = { title: 'Fake DOM' }; var fakeWindow = { window: { document: doc }, document: doc }; options.window = fakeWindow; } if (!options.window) { throw new Error('Tests need either window or useFakeWindow'); } }; /** * Run all the tests asynchronously */ examiner.runAsync = function(options, callback) { examiner._checkOptions(options); this.runAsyncInternal(0, options, callback); }; /** * Run all the test suits asynchronously */ examiner.runAsyncInternal = function(i, options, callback) { if (i >= Object.keys(examiner.suites).length) { if (typeof callback === 'function') { callback(); } return; } var suiteName = Object.keys(examiner.suites)[i]; examiner.suites[suiteName].runAsync(options, function() { setTimeout(function() { examiner.runAsyncInternal(i + 1, options, callback); }.bind(this), delay); }.bind(this)); }; /** * */ examiner.reportToText = function() { return JSON.stringify(examiner.toRemote()); }; /** * Create a JSON object suitable for serialization */ examiner.toRemote = function() { return { suites: Object.keys(examiner.suites).map(function(suiteName) { return examiner.suites[suiteName].toRemote(); }.bind(this)) }; }; /** * Output a test summary to console.log */ examiner.log = function() { var remote = this.toRemote(); remote.suites.forEach(function(suite) { console.log(suite.name); suite.tests.forEach(function(test) { console.log('- ' + test.name, test.status.name, test.message || ''); }); }); }; /** * Used by assert to record a failure against the current test */ examiner.recordError = function(message) { if (!currentTest) { console.error('No currentTest for ' + message); return; } currentTest.status = stati.fail; if (Array.isArray(message)) { currentTest.messages.push.apply(currentTest.messages, message); } else { currentTest.messages.push(message); } }; /** * A suite is a group of tests */ function Suite(suiteName, suite) { this.name = suiteName; this.suite = suite; this.tests = {}; Object.keys(suite).forEach(function(testName) { if (testName !== 'setup' && testName !== 'shutdown') { var test = new Test(this, testName, suite[testName]); this.tests[testName] = test; } }.bind(this)); } /** * Run all the tests in this suite synchronously */ Suite.prototype.run = function(options) { if (typeof this.suite.setup == "function") { this.suite.setup(options); } Object.keys(this.tests).forEach(function(testName) { var test = this.tests[testName]; test.run(options); }.bind(this)); if (typeof this.suite.shutdown == "function") { this.suite.shutdown(options); } }; /** * Run all the tests in this suite asynchronously */ Suite.prototype.runAsync = function(options, callback) { if (typeof this.suite.setup == "function") { this.suite.setup(options); } this.runAsyncInternal(0, options, function() { if (typeof this.suite.shutdown == "function") { this.suite.shutdown(options); } if (typeof callback === 'function') { callback(); } }.bind(this)); }; /** * Function used by the async runners that can handle async recursion. */ Suite.prototype.runAsyncInternal = function(i, options, callback) { if (i >= Object.keys(this.tests).length) { if (typeof callback === 'function') { callback(); } return; } var testName = Object.keys(this.tests)[i]; this.tests[testName].runAsync(options, function() { setTimeout(function() { this.runAsyncInternal(i + 1, options, callback); }.bind(this), delay); }.bind(this)); }; /** * Create a JSON object suitable for serialization */ Suite.prototype.toRemote = function() { return { name: this.name, tests: Object.keys(this.tests).map(function(testName) { return this.tests[testName].toRemote(); }.bind(this)) }; }; /** * A test represents data about a single test function */ function Test(suite, name, func) { this.suite = suite; this.name = name; this.func = func; this.title = name.replace(/^test/, '').replace(/([A-Z])/g, ' $1'); this.messages = []; this.status = stati.notrun; } /** * Run just a single test */ Test.prototype.run = function(options) { currentTest = this; this.status = stati.executing; this.messages = []; try { this.func.apply(this.suite, [ options ]); } catch (ex) { this.status = stati.fail; this.messages.push('' + ex); console.error(ex); if (ex.stack) { console.error(ex.stack); } } if (this.status === stati.executing) { this.status = stati.pass; } currentTest = null; }; /** * Run all the tests in this suite asynchronously */ Test.prototype.runAsync = function(options, callback) { setTimeout(function() { this.run(options); if (typeof callback === 'function') { callback(); } }.bind(this), delay); }; /** * Create a JSON object suitable for serialization */ Test.prototype.toRemote = function() { return { name: this.name, title: this.title, status: this.status, messages: this.messages }; }; }); /* * Copyright 2009-2011 Mozilla Foundation and contributors * Licensed under the New BSD license. See LICENSE.txt or: * http://opensource.org/licenses/BSD-3-Clause */ define('gclitest/testTokenize', ['require', 'exports', 'module' , 'test/assert', 'gcli/cli', 'gcli/argument'], function(require, exports, module) { var test = require('test/assert'); var Requisition = require('gcli/cli').Requisition; var Argument = require('gcli/argument').Argument; var ScriptArgument = require('gcli/argument').ScriptArgument; exports.testBlanks = function() { var args; var requ = new Requisition(); args = requ._tokenize(''); test.is(1, args.length); test.is('', args[0].text); test.is('', args[0].prefix); test.is('', args[0].suffix); args = requ._tokenize(' '); test.is(1, args.length); test.is('', args[0].text); test.is(' ', args[0].prefix); test.is('', args[0].suffix); }; exports.testSimple = function() { var args; var requ = new Requisition(); args = requ._tokenize('s'); test.is(1, args.length); test.is('s', args[0].text); test.is('', args[0].prefix); test.is('', args[0].suffix); test.ok(args[0] instanceof Argument); args = requ._tokenize('s s'); test.is(2, args.length); test.is('s', args[0].text); test.is('', args[0].prefix); test.is('', args[0].suffix); test.ok(args[0] instanceof Argument); test.is('s', args[1].text); test.is(' ', args[1].prefix); test.is('', args[1].suffix); test.ok(args[1] instanceof Argument); }; exports.testJavascript = function() { var args; var requ = new Requisition(); args = requ._tokenize('{x}'); test.is(1, args.length); test.is('x', args[0].text); test.is('{', args[0].prefix); test.is('}', args[0].suffix); test.ok(args[0] instanceof ScriptArgument); args = requ._tokenize('{ x }'); test.is(1, args.length); test.is('x', args[0].text); test.is('{ ', args[0].prefix); test.is(' }', args[0].suffix); test.ok(args[0] instanceof ScriptArgument); args = requ._tokenize('{x} {y}'); test.is(2, args.length); test.is('x', args[0].text); test.is('{', args[0].prefix); test.is('}', args[0].suffix); test.ok(args[0] instanceof ScriptArgument); test.is('y', args[1].text); test.is(' {', args[1].prefix); test.is('}', args[1].suffix); test.ok(args[1] instanceof ScriptArgument); args = requ._tokenize('{x}{y}'); test.is(2, args.length); test.is('x', args[0].text); test.is('{', args[0].prefix); test.is('}', args[0].suffix); test.ok(args[0] instanceof ScriptArgument); test.is('y', args[1].text); test.is('{', args[1].prefix); test.is('}', args[1].suffix); test.ok(args[1] instanceof ScriptArgument); args = requ._tokenize('{'); test.is(1, args.length); test.is('', args[0].text); test.is('{', args[0].prefix); test.is('', args[0].suffix); test.ok(args[0] instanceof ScriptArgument); args = requ._tokenize('{ '); test.is(1, args.length); test.is('', args[0].text); test.is('{ ', args[0].prefix); test.is('', args[0].suffix); test.ok(args[0] instanceof ScriptArgument); args = requ._tokenize('{x'); test.is(1, args.length); test.is('x', args[0].text); test.is('{', args[0].prefix); test.is('', args[0].suffix); test.ok(args[0] instanceof ScriptArgument); }; exports.testRegularNesting = function() { var args; var requ = new Requisition(); args = requ._tokenize('{"x"}'); test.is(1, args.length); test.is('"x"', args[0].text); test.is('{', args[0].prefix); test.is('}', args[0].suffix); test.ok(args[0] instanceof ScriptArgument); args = requ._tokenize('{\'x\'}'); test.is(1, args.length); test.is('\'x\'', args[0].text); test.is('{', args[0].prefix); test.is('}', args[0].suffix); test.ok(args[0] instanceof ScriptArgument); args = requ._tokenize('"{x}"'); test.is(1, args.length); test.is('{x}', args[0].text); test.is('"', args[0].prefix); test.is('"', args[0].suffix); test.ok(args[0] instanceof Argument); args = requ._tokenize('\'{x}\''); test.is(1, args.length); test.is('{x}', args[0].text); test.is('\'', args[0].prefix); test.is('\'', args[0].suffix); test.ok(args[0] instanceof Argument); }; exports.testDeepNesting = function() { var args; var requ = new Requisition(); args = requ._tokenize('{{}}'); test.is(1, args.length); test.is('{}', args[0].text); test.is('{', args[0].prefix); test.is('}', args[0].suffix); test.ok(args[0] instanceof ScriptArgument); args = requ._tokenize('{{x} {y}}'); test.is(1, args.length); test.is('{x} {y}', args[0].text); test.is('{', args[0].prefix); test.is('}', args[0].suffix); test.ok(args[0] instanceof ScriptArgument); args = requ._tokenize('{{w} {{{x}}}} {y} {{{z}}}'); test.is(3, args.length); test.is('{w} {{{x}}}', args[0].text); test.is('{', args[0].prefix); test.is('}', args[0].suffix); test.ok(args[0] instanceof ScriptArgument); test.is('y', args[1].text); test.is(' {', args[1].prefix); test.is('}', args[1].suffix); test.ok(args[1] instanceof ScriptArgument); test.is('{{z}}', args[2].text); test.is(' {', args[2].prefix); test.is('}', args[2].suffix); test.ok(args[2] instanceof ScriptArgument); args = requ._tokenize('{{w} {{{x}}} {y} {{{z}}}'); test.is(1, args.length); test.is('{w} {{{x}}} {y} {{{z}}}', args[0].text); test.is('{', args[0].prefix); test.is('', args[0].suffix); test.ok(args[0] instanceof ScriptArgument); }; exports.testStrangeNesting = function() { var args; var requ = new Requisition(); // Note: When we get real JS parsing this should break args = requ._tokenize('{"x}"}'); test.is(2, args.length); test.is('"x', args[0].text); test.is('{', args[0].prefix); test.is('}', args[0].suffix); test.ok(args[0] instanceof ScriptArgument); test.is('}', args[1].text); test.is('"', args[1].prefix); test.is('', args[1].suffix); test.ok(args[1] instanceof Argument); }; exports.testComplex = function() { var args; var requ = new Requisition(); args = requ._tokenize(' 1234 \'12 34\''); test.is(2, args.length); test.is('1234', args[0].text); test.is(' ', args[0].prefix); test.is('', args[0].suffix); test.ok(args[0] instanceof Argument); test.is('12 34', args[1].text); test.is(' \'', args[1].prefix); test.is('\'', args[1].suffix); test.ok(args[1] instanceof Argument); args = requ._tokenize('12\'34 "12 34" \\'); // 12'34 "12 34" \ test.is(3, args.length); test.is('12\'34', args[0].text); test.is('', args[0].prefix); test.is('', args[0].suffix); test.ok(args[0] instanceof Argument); test.is('12 34', args[1].text); test.is(' "', args[1].prefix); test.is('"', args[1].suffix); test.ok(args[1] instanceof Argument); test.is('\\', args[2].text); test.is(' ', args[2].prefix); test.is('', args[2].suffix); test.ok(args[2] instanceof Argument); }; exports.testPathological = function() { var args; var requ = new Requisition(); args = requ._tokenize('a\\ b \\t\\n\\r \\\'x\\\" \'d'); // a_b \t\n\r \'x\" 'd test.is(4, args.length); test.is('a b', args[0].text); test.is('', args[0].prefix); test.is('', args[0].suffix); test.ok(args[0] instanceof Argument); test.is('\t\n\r', args[1].text); test.is(' ', args[1].prefix); test.is('', args[1].suffix); test.ok(args[1] instanceof Argument); test.is('\'x"', args[2].text); test.is(' ', args[2].prefix); test.is('', args[2].suffix); test.ok(args[2] instanceof Argument); test.is('d', args[3].text); test.is(' \'', args[3].prefix); test.is('', args[3].suffix); test.ok(args[3] instanceof Argument); }; }); /* * Copyright 2009-2011 Mozilla Foundation and contributors * Licensed under the New BSD license. See LICENSE.txt or: * http://opensource.org/licenses/BSD-3-Clause */ define('test/assert', ['require', 'exports', 'module' ], function(require, exports, module) { exports.ok = ok; exports.is = is; }); /* * Copyright 2009-2011 Mozilla Foundation and contributors * Licensed under the New BSD license. See LICENSE.txt or: * http://opensource.org/licenses/BSD-3-Clause */ define('gclitest/testSplit', ['require', 'exports', 'module' , 'test/assert', 'gclitest/commands', 'gcli/cli'], function(require, exports, module) { var test = require('test/assert'); var commands = require('gclitest/commands'); var Requisition = require('gcli/cli').Requisition; exports.setup = function() { commands.setup(); }; exports.shutdown = function() { commands.shutdown(); }; exports.testSimple = function() { var args; var requ = new Requisition(); args = requ._tokenize('s'); requ._split(args); test.is(0, args.length); test.is('s', requ.commandAssignment.getArg().text); }; exports.testFlatCommand = function() { var args; var requ = new Requisition(); args = requ._tokenize('tsv'); requ._split(args); test.is(0, args.length); test.is('tsv', requ.commandAssignment.getValue().name); args = requ._tokenize('tsv a b'); requ._split(args); test.is('tsv', requ.commandAssignment.getValue().name); test.is(2, args.length); test.is('a', args[0].text); test.is('b', args[1].text); }; exports.testJavascript = function() { var args; var requ = new Requisition(); args = requ._tokenize('{'); requ._split(args); test.is(1, args.length); test.is('', args[0].text); test.is('', requ.commandAssignment.getArg().text); test.is('{', requ.commandAssignment.getValue().name); }; // BUG 663081 - add tests for sub commands }); /* * Copyright 2009-2011 Mozilla Foundation and contributors * Licensed under the New BSD license. See LICENSE.txt or: * http://opensource.org/licenses/BSD-3-Clause */ define('gclitest/commands', ['require', 'exports', 'module' , 'gcli/canon', 'gcli/util', 'gcli/types/basic', 'gcli/types'], function(require, exports, module) { var commands = exports; var canon = require('gcli/canon'); var util = require('gcli/util'); var SelectionType = require('gcli/types/basic').SelectionType; var DeferredType = require('gcli/types/basic').DeferredType; var types = require('gcli/types'); /** * Registration and de-registration. */ commands.setup = function() { commands.option1.type = types.getType('number'); commands.option2.type = types.getType('boolean'); types.registerType(commands.optionType); types.registerType(commands.optionValue); canon.addCommand(commands.tsv); canon.addCommand(commands.tsr); canon.addCommand(commands.tse); canon.addCommand(commands.tsj); canon.addCommand(commands.tsb); canon.addCommand(commands.tss); canon.addCommand(commands.tsu); canon.addCommand(commands.tsn); canon.addCommand(commands.tsnDif); canon.addCommand(commands.tsnExt); canon.addCommand(commands.tsnExte); canon.addCommand(commands.tsnExten); canon.addCommand(commands.tsnExtend); canon.addCommand(commands.tselarr); canon.addCommand(commands.tsm); canon.addCommand(commands.tsg); }; commands.shutdown = function() { canon.removeCommand(commands.tsv); canon.removeCommand(commands.tsr); canon.removeCommand(commands.tse); canon.removeCommand(commands.tsj); canon.removeCommand(commands.tsb); canon.removeCommand(commands.tss); canon.removeCommand(commands.tsu); canon.removeCommand(commands.tsn); canon.removeCommand(commands.tsnDif); canon.removeCommand(commands.tsnExt); canon.removeCommand(commands.tsnExte); canon.removeCommand(commands.tsnExten); canon.removeCommand(commands.tsnExtend); canon.removeCommand(commands.tselarr); canon.removeCommand(commands.tsm); canon.removeCommand(commands.tsg); types.deregisterType(commands.optionType); types.deregisterType(commands.optionValue); }; commands.option1 = { type: types.getType('string') }; commands.option2 = { type: types.getType('number') }; commands.optionType = new SelectionType({ name: 'optionType', lookup: [ { name: 'option1', value: commands.option1 }, { name: 'option2', value: commands.option2 } ], noMatch: function() { this.lastOption = null; }, stringify: function(option) { this.lastOption = option; return SelectionType.prototype.stringify.call(this, option); }, parse: function(arg) { var conversion = SelectionType.prototype.parse.call(this, arg); this.lastOption = conversion.value; return conversion; } }); commands.optionValue = new DeferredType({ name: 'optionValue', defer: function() { if (commands.optionType.lastOption) { return commands.optionType.lastOption.type; } else { return types.getType('blank'); } } }); commands.commandExec = util.createEvent('commands.commandExec'); function createExec(name) { return function(args, context) { var data = { command: commands[name], args: args, context: context }; commands.commandExec(data); return data; }; } commands.tsv = { name: 'tsv', params: [ { name: 'optionType', type: 'optionType' }, { name: 'optionValue', type: 'optionValue' } ], exec: createExec('tsv') }; commands.tsr = { name: 'tsr', params: [ { name: 'text', type: 'string' } ], exec: createExec('tsr') }; commands.tse = { name: 'tse', params: [ { name: 'node', type: 'node' } ], exec: createExec('tse') }; commands.tsj = { name: 'tsj', params: [ { name: 'javascript', type: 'javascript' } ], exec: createExec('tsj') }; commands.tsb = { name: 'tsb', params: [ { name: 'toggle', type: 'boolean' } ], exec: createExec('tsb') }; commands.tss = { name: 'tss', exec: createExec('tss') }; commands.tsu = { name: 'tsu', params: [ { name: 'num', type: { name: 'number', max: 10, min: -5, step: 3 } } ], exec: createExec('tsu') }; commands.tsn = { name: 'tsn' }; commands.tsnDif = { name: 'tsn dif', params: [ { name: 'text', type: 'string' } ], exec: createExec('tsnDif') }; commands.tsnExt = { name: 'tsn ext', params: [ { name: 'text', type: 'string' } ], exec: createExec('tsnExt') }; commands.tsnExte = { name: 'tsn exte', params: [ { name: 'text', type: 'string' } ], exec: createExec('') }; commands.tsnExten = { name: 'tsn exten', params: [ { name: 'text', type: 'string' } ], exec: createExec('tsnExte') }; commands.tsnExtend = { name: 'tsn extend', params: [ { name: 'text', type: 'string' } ], exec: createExec('tsnExtend') }; commands.tselarr = { name: 'tselarr', params: [ { name: 'num', type: { name: 'selection', data: [ '1', '2', '3' ] } }, { name: 'arr', type: { name: 'array', subtype: 'string' } }, ], exec: createExec('tselarr') }; commands.tsm = { name: 'tsm', hidden: true, description: 'a 3-param test selection|string|number', params: [ { name: 'abc', type: { name: 'selection', data: [ 'a', 'b', 'c' ] } }, { name: 'txt', type: 'string' }, { name: 'num', type: { name: 'number', max: 42, min: 0 } }, ], exec: createExec('tsm') }; commands.tsg = { name: 'tsg', hidden: true, description: 'a param group test', params: [ { name: 'solo', type: { name: 'selection', data: [ 'aaa', 'bbb', 'ccc' ] } }, { group: 'First', params: [ { name: 'txt1', type: 'string', defaultValue: null }, { name: 'boolean1', type: 'boolean' } ] }, { group: 'Second', params: [ { name: 'txt2', type: 'string', defaultValue: 'd' }, { name: 'num2', type: { name: 'number', defaultValue: 42 } } ] } ], exec: createExec('tsg') }; }); /* * Copyright 2009-2011 Mozilla Foundation and contributors * Licensed under the New BSD license. See LICENSE.txt or: * http://opensource.org/licenses/BSD-3-Clause */ define('gclitest/testCli', ['require', 'exports', 'module' , 'gcli/cli', 'gcli/types', 'gclitest/commands', 'test/assert'], function(require, exports, module) { var Requisition = require('gcli/cli').Requisition; var Status = require('gcli/types').Status; var commands = require('gclitest/commands'); var test = require('test/assert'); exports.setup = function() { commands.setup(); }; exports.shutdown = function() { commands.shutdown(); }; var assign1; var assign2; var assignC; var requ; var debug = false; var status; var statuses; function update(input) { if (!requ) { requ = new Requisition(); } requ.update(input); if (debug) { console.log('####### TEST: typed="' + input.typed + '" cur=' + input.cursor.start + ' cli=', requ); } status = requ.getStatus(); assignC = requ.getAssignmentAt(input.cursor.start); statuses = requ.getInputStatusMarkup(input.cursor.start).map(function(s) { return Array(s.string.length + 1).join(s.status.toString()[0]); }).join(''); if (requ.commandAssignment.getValue()) { assign1 = requ.getAssignment(0); assign2 = requ.getAssignment(1); } else { assign1 = undefined; assign2 = undefined; } } function verifyPredictionsContains(name, predictions) { return predictions.every(function(prediction) { return name === prediction.name; }, this); } exports.testBlank = function() { update({ typed: '', cursor: { start: 0, end: 0 } }); test.is( '', statuses); test.is(Status.ERROR, status); test.is(-1, assignC.paramIndex); test.is(null, requ.commandAssignment.getValue()); update({ typed: ' ', cursor: { start: 1, end: 1 } }); test.is( 'V', statuses); test.is(Status.ERROR, status); test.is(-1, assignC.paramIndex); test.is(null, requ.commandAssignment.getValue()); update({ typed: ' ', cursor: { start: 0, end: 0 } }); test.is( 'V', statuses); test.is(Status.ERROR, status); test.is(-1, assignC.paramIndex); test.is(null, requ.commandAssignment.getValue()); }; exports.testIncompleteMultiMatch = function() { update({ typed: 't', cursor: { start: 1, end: 1 } }); test.is( 'I', statuses); test.is(Status.ERROR, status); test.is(-1, assignC.paramIndex); test.ok(assignC.getPredictions().length > 0); verifyPredictionsContains('tsv', assignC.getPredictions()); verifyPredictionsContains('tsr', assignC.getPredictions()); test.is(null, requ.commandAssignment.getValue()); }; exports.testIncompleteSingleMatch = function() { update({ typed: 'tselar', cursor: { start: 6, end: 6 } }); test.is( 'IIIIII', statuses); test.is(Status.ERROR, status); test.is(-1, assignC.paramIndex); test.is(1, assignC.getPredictions().length); test.is('tselarr', assignC.getPredictions()[0].name); test.is(null, requ.commandAssignment.getValue()); }; exports.testTsv = function() { update({ typed: 'tsv', cursor: { start: 3, end: 3 } }); test.is( 'VVV', statuses); test.is(Status.ERROR, status); test.is(-1, assignC.paramIndex); test.is('tsv', requ.commandAssignment.getValue().name); update({ typed: 'tsv ', cursor: { start: 4, end: 4 } }); test.is( 'VVVV', statuses); test.is(Status.ERROR, status); test.is(0, assignC.paramIndex); test.is('tsv', requ.commandAssignment.getValue().name); update({ typed: 'tsv ', cursor: { start: 2, end: 2 } }); test.is( 'VVVV', statuses); test.is(Status.ERROR, status); test.is(-1, assignC.paramIndex); test.is('tsv', requ.commandAssignment.getValue().name); update({ typed: 'tsv o', cursor: { start: 5, end: 5 } }); test.is( 'VVVVI', statuses); test.is(Status.ERROR, status); test.is(0, assignC.paramIndex); test.is(2, assignC.getPredictions().length); test.is(commands.option1, assignC.getPredictions()[0].value); test.is(commands.option2, assignC.getPredictions()[1].value); test.is('tsv', requ.commandAssignment.getValue().name); test.is('o', assign1.getArg().text); test.is(null, assign1.getValue()); update({ typed: 'tsv option', cursor: { start: 10, end: 10 } }); test.is( 'VVVVIIIIII', statuses); test.is(Status.ERROR, status); test.is(0, assignC.paramIndex); test.is(2, assignC.getPredictions().length); test.is(commands.option1, assignC.getPredictions()[0].value); test.is(commands.option2, assignC.getPredictions()[1].value); test.is('tsv', requ.commandAssignment.getValue().name); test.is('option', assign1.getArg().text); test.is(null, assign1.getValue()); update({ typed: 'tsv option', cursor: { start: 1, end: 1 } }); test.is( 'VVVVEEEEEE', statuses); test.is(Status.ERROR, status); test.is(-1, assignC.paramIndex); test.is('tsv', requ.commandAssignment.getValue().name); test.is('option', assign1.getArg().text); test.is(null, assign1.getValue()); update({ typed: 'tsv option ', cursor: { start: 11, end: 11 } }); test.is( 'VVVVEEEEEEV', statuses); test.is(Status.ERROR, status); test.is(1, assignC.paramIndex); test.is(0, assignC.getPredictions().length); test.is('tsv', requ.commandAssignment.getValue().name); test.is('option', assign1.getArg().text); test.is(null, assign1.getValue()); update({ typed: 'tsv option1', cursor: { start: 11, end: 11 } }); test.is( 'VVVVVVVVVVV', statuses); test.is(Status.ERROR, status); test.is('tsv', requ.commandAssignment.getValue().name); test.is('option1', assign1.getArg().text); test.is(commands.option1, assign1.getValue()); test.is(0, assignC.paramIndex); update({ typed: 'tsv option1 ', cursor: { start: 12, end: 12 } }); test.is( 'VVVVVVVVVVVV', statuses); test.is(Status.ERROR, status); test.is('tsv', requ.commandAssignment.getValue().name); test.is('option1', assign1.getArg().text); test.is(commands.option1, assign1.getValue()); test.is(1, assignC.paramIndex); update({ typed: 'tsv option1 6', cursor: { start: 13, end: 13 } }); test.is( 'VVVVVVVVVVVVV', statuses); test.is(Status.VALID, status); test.is('tsv', requ.commandAssignment.getValue().name); test.is('option1', assign1.getArg().text); test.is(commands.option1, assign1.getValue()); test.is('6', assign2.getArg().text); test.is(6, assign2.getValue()); test.is('number', typeof assign2.getValue()); test.is(1, assignC.paramIndex); update({ typed: 'tsv option2 6', cursor: { start: 13, end: 13 } }); test.is( 'VVVVVVVVVVVVE', statuses); test.is(Status.ERROR, status); test.is('tsv', requ.commandAssignment.getValue().name); test.is('option2', assign1.getArg().text); test.is(commands.option2, assign1.getValue()); test.is('6', assign2.getArg().text); test.is(null, assign2.getValue()); test.is(1, assignC.paramIndex); }; exports.testInvalid = function() { update({ typed: 'fred', cursor: { start: 4, end: 4 } }); test.is( 'EEEE', statuses); test.is('fred', requ.commandAssignment.getArg().text); test.is('', requ._unassigned.getArg().text); test.is(-1, assignC.paramIndex); update({ typed: 'fred ', cursor: { start: 5, end: 5 } }); test.is( 'EEEEV', statuses); test.is('fred', requ.commandAssignment.getArg().text); test.is('', requ._unassigned.getArg().text); test.is(-1, assignC.paramIndex); update({ typed: 'fred one', cursor: { start: 8, end: 8 } }); test.is( 'EEEEVEEE', statuses); test.is('fred', requ.commandAssignment.getArg().text); test.is('one', requ._unassigned.getArg().text); }; exports.testSingleString = function() { update({ typed: 'tsr', cursor: { start: 3, end: 3 } }); test.is( 'VVV', statuses); test.is(Status.ERROR, status); test.is('tsr', requ.commandAssignment.getValue().name); //test.is(undefined, assign1.getArg()); //test.is(undefined, assign1.getValue()); test.is(undefined, assign2); update({ typed: 'tsr ', cursor: { start: 4, end: 4 } }); test.is( 'VVVV', statuses); test.is(Status.ERROR, status); test.is('tsr', requ.commandAssignment.getValue().name); //test.is(undefined, assign1.getArg()); //test.is(undefined, assign1.getValue()); test.is(undefined, assign2); update({ typed: 'tsr h', cursor: { start: 5, end: 5 } }); test.is( 'VVVVV', statuses); test.is(Status.VALID, status); test.is('tsr', requ.commandAssignment.getValue().name); test.is('h', assign1.getArg().text); test.is('h', assign1.getValue()); update({ typed: 'tsr "h h"', cursor: { start: 9, end: 9 } }); test.is( 'VVVVVVVVV', statuses); test.is(Status.VALID, status); test.is('tsr', requ.commandAssignment.getValue().name); test.is('h h', assign1.getArg().text); test.is('h h', assign1.getValue()); update({ typed: 'tsr h h h', cursor: { start: 9, end: 9 } }); test.is( 'VVVVVVVVV', statuses); test.is('tsr', requ.commandAssignment.getValue().name); test.is('h h h', assign1.getArg().text); test.is('h h h', assign1.getValue()); }; // BUG 664203: Add test to see that a command without mandatory param -> ERROR exports.testSingleNumber = function() { update({ typed: 'tsu', cursor: { start: 3, end: 3 } }); test.is( 'VVV', statuses); test.is(Status.ERROR, status); test.is('tsu', requ.commandAssignment.getValue().name); //test.is(undefined, assign1.getArg()); test.is(null, assign1.getValue()); update({ typed: 'tsu ', cursor: { start: 4, end: 4 } }); test.is( 'VVVV', statuses); test.is(Status.ERROR, status); test.is('tsu', requ.commandAssignment.getValue().name); //test.is(undefined, assign1.getArg()); test.is(null, assign1.getValue()); update({ typed: 'tsu 1', cursor: { start: 5, end: 5 } }); test.is( 'VVVVV', statuses); test.is(Status.VALID, status); test.is('tsu', requ.commandAssignment.getValue().name); test.is('1', assign1.getArg().text); test.is(1, assign1.getValue()); test.is('number', typeof assign1.getValue()); update({ typed: 'tsu x', cursor: { start: 5, end: 5 } }); test.is( 'VVVVE', statuses); test.is(Status.ERROR, status); test.is('tsu', requ.commandAssignment.getValue().name); test.is('x', assign1.getArg().text); test.is(null, assign1.getValue()); }; exports.testNestedCommand = function() { update({ typed: 'tsn', cursor: { start: 3, end: 3 } }); test.is( 'III', statuses); test.is(Status.ERROR, status); test.is('tsn', requ.commandAssignment.getValue().name); test.is(undefined, assign1); update({ typed: 'tsn ', cursor: { start: 4, end: 4 } }); test.is( 'IIIV', statuses); test.is(Status.ERROR, status); test.is('tsn', requ.commandAssignment.getValue().name); test.is(undefined, assign1); update({ typed: 'tsn x', cursor: { start: 5, end: 5 } }); test.is( 'EEEVE', statuses); test.is(Status.ERROR, status); test.is('tsn x', requ.commandAssignment.getArg().text); test.is(undefined, assign1); update({ typed: 'tsn dif', cursor: { start: 7, end: 7 } }); test.is( 'VVVVVVV', statuses); test.is(Status.ERROR, status); test.is('tsn dif', requ.commandAssignment.getValue().name); //test.is(undefined, assign1.getArg()); //test.is(undefined, assign1.getValue()); update({ typed: 'tsn dif ', cursor: { start: 8, end: 8 } }); test.is( 'VVVVVVVV', statuses); test.is(Status.ERROR, status); test.is('tsn dif', requ.commandAssignment.getValue().name); //test.is(undefined, assign1.getArg()); //test.is(undefined, assign1.getValue()); update({ typed: 'tsn dif x', cursor: { start: 9, end: 9 } }); test.is( 'VVVVVVVVV', statuses); test.is(Status.VALID, status); test.is('tsn dif', requ.commandAssignment.getValue().name); test.is('x', assign1.getArg().text); test.is('x', assign1.getValue()); update({ typed: 'tsn ext', cursor: { start: 7, end: 7 } }); test.is( 'VVVVVVV', statuses); test.is(Status.ERROR, status); test.is('tsn ext', requ.commandAssignment.getValue().name); //test.is(undefined, assign1.getArg()); //test.is(undefined, assign1.getValue()); }; }); /* * Copyright 2009-2011 Mozilla Foundation and contributors * Licensed under the New BSD license. See LICENSE.txt or: * http://opensource.org/licenses/BSD-3-Clause */ define('gclitest/testExec', ['require', 'exports', 'module' , 'gcli/cli', 'gcli/types', 'gcli/canon', 'gclitest/commands', 'gcli/types/node', 'test/assert'], function(require, exports, module) { var Requisition = require('gcli/cli').Requisition; var Status = require('gcli/types').Status; var canon = require('gcli/canon'); var commands = require('gclitest/commands'); var nodetype = require('gcli/types/node'); var test = require('test/assert'); var actualExec; var actualOutput; exports.setup = function() { commands.setup(); commands.commandExec.add(onCommandExec); canon.commandOutputManager.addListener(onCommandOutput); }; exports.shutdown = function() { commands.shutdown(); commands.commandExec.remove(onCommandExec); canon.commandOutputManager.removeListener(onCommandOutput); }; function onCommandExec(ev) { actualExec = ev; } function onCommandOutput(ev) { actualOutput = ev.output; } function exec(command, expectedArgs) { var environment = {}; var requisition = new Requisition(environment); var reply = requisition.exec({ typed: command }); test.is(command.indexOf(actualExec.command.name), 0, 'Command name: ' + command); if (reply !== true) { test.ok(false, 'reply = false for command: ' + command); } if (expectedArgs == null) { test.ok(false, 'expectedArgs == null for ' + command); return; } if (actualExec.args == null) { test.ok(false, 'actualExec.args == null for ' + command); return; } test.is(Object.keys(expectedArgs).length, Object.keys(actualExec.args).length, 'Arg count: ' + command); Object.keys(expectedArgs).forEach(function(arg) { var expectedArg = expectedArgs[arg]; var actualArg = actualExec.args[arg]; if (Array.isArray(expectedArg)) { if (!Array.isArray(actualArg)) { test.ok(false, 'actual is not an array. ' + command + '/' + arg); return; } test.is(expectedArg.length, actualArg.length, 'Array length: ' + command + '/' + arg); for (var i = 0; i < expectedArg.length; i++) { test.is(expectedArg[i], actualArg[i], 'Member: "' + command + '/' + arg + '/' + i); } } else { test.is(expectedArg, actualArg, 'Command: "' + command + '" arg: ' + arg); } }); test.is(environment, actualExec.context.environment, 'Environment'); test.is(false, actualOutput.error, 'output error is false'); test.is(command, actualOutput.typed, 'command is typed'); test.ok(typeof actualOutput.canonical === 'string', 'canonical exists'); test.is(actualExec.args, actualOutput.args, 'actualExec.args is actualOutput.args'); } exports.testExec = function() { exec('tss', {}); // Bug 707008 - GCLI defered types don't work properly // exec('tsv option1 10', { optionType: commands.option1, optionValue: '10' }); // exec('tsv option2 10', { optionType: commands.option1, optionValue: 10 }); exec('tsr fred', { text: 'fred' }); exec('tsr fred bloggs', { text: 'fred bloggs' }); exec('tsr "fred bloggs"', { text: 'fred bloggs' }); exec('tsb', { toggle: false }); exec('tsb --toggle', { toggle: true }); exec('tsu 10', { num: 10 }); exec('tsu --num 10', { num: 10 }); // Bug 704829 - Enable GCLI Javascript parameters // The answer to this should be 2 exec('tsj { 1 + 1 }', { javascript: '1 + 1' }); var origDoc = nodetype.getDocument(); nodetype.setDocument(mockDoc); exec('tse :root', { node: mockBody }); nodetype.setDocument(origDoc); exec('tsn dif fred', { text: 'fred' }); exec('tsn exten fred', { text: 'fred' }); exec('tsn extend fred', { text: 'fred' }); exec('tselarr 1', { num: '1', arr: [ ] }); exec('tselarr 1 a', { num: '1', arr: [ 'a' ] }); exec('tselarr 1 a b', { num: '1', arr: [ 'a', 'b' ] }); exec('tsm a 10 10', { abc: 'a', txt: '10', num: 10 }); // Bug 707009 - GCLI doesn't always fill in default parameters properly // exec('tsg a', { solo: 'a', txt1: null, boolean1: false, txt2: 'd', num2: 42 }); }; var mockBody = { style: {} }; var mockDoc = { querySelectorAll: function(css) { if (css === ':root') { return { length: 1, item: function(i) { return mockBody; } }; } throw new Error('mockDoc.querySelectorAll(\'' + css + '\') error'); } }; }); /* * Copyright 2009-2011 Mozilla Foundation and contributors * Licensed under the New BSD license. See LICENSE.txt or: * http://opensource.org/licenses/BSD-3-Clause */ define('gclitest/testKeyboard', ['require', 'exports', 'module' , 'gcli/cli', 'gcli/types', 'gcli/canon', 'gclitest/commands', 'gcli/types/node', 'gcli/types/javascript', 'test/assert'], function(require, exports, module) { var Requisition = require('gcli/cli').Requisition; var Status = require('gcli/types').Status; var canon = require('gcli/canon'); var commands = require('gclitest/commands'); var nodetype = require('gcli/types/node'); var javascript = require('gcli/types/javascript'); var test = require('test/assert'); var tempWindow; exports.setup = function(options) { tempWindow = javascript.getGlobalObject(); javascript.setGlobalObject(options.window); commands.setup(); }; exports.shutdown = function(options) { commands.shutdown(); javascript.setGlobalObject(tempWindow); tempWindow = undefined; }; var COMPLETES_TO = 'complete'; var KEY_UPS_TO = 'keyup'; var KEY_DOWNS_TO = 'keydown'; function check(initial, action, after) { var requisition = new Requisition(); requisition.update({ typed: initial, cursor: { start: initial.length, end: initial.length } }); var assignment = requisition.getAssignmentAt(initial.length); switch (action) { case COMPLETES_TO: assignment.complete(); break; case KEY_UPS_TO: assignment.increment(); break; case KEY_DOWNS_TO: assignment.decrement(); break; } test.is(after, requisition.toString(), initial + ' + ' + action + ' -> ' + after); } exports.testComplete = function(options) { check('tsela', COMPLETES_TO, 'tselarr '); check('tsn di', COMPLETES_TO, 'tsn dif '); check('tsg a', COMPLETES_TO, 'tsg aaa '); check('{ wind', COMPLETES_TO, '{ window'); check('{ window.docum', COMPLETES_TO, '{ window.document'); // Bug 717228: This fails under node if (!options.isNode) { check('{ window.document.titl', COMPLETES_TO, '{ window.document.title '); } }; exports.testIncrDecr = function() { check('tsu -70', KEY_UPS_TO, 'tsu -5'); check('tsu -7', KEY_UPS_TO, 'tsu -5'); check('tsu -6', KEY_UPS_TO, 'tsu -5'); check('tsu -5', KEY_UPS_TO, 'tsu -3'); check('tsu -4', KEY_UPS_TO, 'tsu -3'); check('tsu -3', KEY_UPS_TO, 'tsu 0'); check('tsu -2', KEY_UPS_TO, 'tsu 0'); check('tsu -1', KEY_UPS_TO, 'tsu 0'); check('tsu 0', KEY_UPS_TO, 'tsu 3'); check('tsu 1', KEY_UPS_TO, 'tsu 3'); check('tsu 2', KEY_UPS_TO, 'tsu 3'); check('tsu 3', KEY_UPS_TO, 'tsu 6'); check('tsu 4', KEY_UPS_TO, 'tsu 6'); check('tsu 5', KEY_UPS_TO, 'tsu 6'); check('tsu 6', KEY_UPS_TO, 'tsu 9'); check('tsu 7', KEY_UPS_TO, 'tsu 9'); check('tsu 8', KEY_UPS_TO, 'tsu 9'); check('tsu 9', KEY_UPS_TO, 'tsu 10'); check('tsu 10', KEY_UPS_TO, 'tsu 10'); check('tsu 100', KEY_UPS_TO, 'tsu -5'); check('tsu -70', KEY_DOWNS_TO, 'tsu 10'); check('tsu -7', KEY_DOWNS_TO, 'tsu 10'); check('tsu -6', KEY_DOWNS_TO, 'tsu 10'); check('tsu -5', KEY_DOWNS_TO, 'tsu -5'); check('tsu -4', KEY_DOWNS_TO, 'tsu -5'); check('tsu -3', KEY_DOWNS_TO, 'tsu -5'); check('tsu -2', KEY_DOWNS_TO, 'tsu -3'); check('tsu -1', KEY_DOWNS_TO, 'tsu -3'); check('tsu 0', KEY_DOWNS_TO, 'tsu -3'); check('tsu 1', KEY_DOWNS_TO, 'tsu 0'); check('tsu 2', KEY_DOWNS_TO, 'tsu 0'); check('tsu 3', KEY_DOWNS_TO, 'tsu 0'); check('tsu 4', KEY_DOWNS_TO, 'tsu 3'); check('tsu 5', KEY_DOWNS_TO, 'tsu 3'); check('tsu 6', KEY_DOWNS_TO, 'tsu 3'); check('tsu 7', KEY_DOWNS_TO, 'tsu 6'); check('tsu 8', KEY_DOWNS_TO, 'tsu 6'); check('tsu 9', KEY_DOWNS_TO, 'tsu 6'); check('tsu 10', KEY_DOWNS_TO, 'tsu 9'); check('tsu 100', KEY_DOWNS_TO, 'tsu 10'); // Bug 707007 - GCLI increment and decrement operations cycle through // selection options in the wrong order check('tselarr 1', KEY_DOWNS_TO, 'tselarr 2'); check('tselarr 2', KEY_DOWNS_TO, 'tselarr 3'); check('tselarr 3', KEY_DOWNS_TO, 'tselarr 1'); check('tselarr 3', KEY_UPS_TO, 'tselarr 2'); }; }); /* * Copyright 2009-2011 Mozilla Foundation and contributors * Licensed under the New BSD license. See LICENSE.txt or: * http://opensource.org/licenses/BSD-3-Clause */ define('gclitest/testScratchpad', ['require', 'exports', 'module' , 'test/assert'], function(require, exports, module) { var test = require('test/assert'); var origScratchpad; exports.setup = function(options) { if (options.inputter) { origScratchpad = options.inputter.scratchpad; options.inputter.scratchpad = stubScratchpad; } }; exports.shutdown = function(options) { if (options.inputter) { options.inputter.scratchpad = origScratchpad; } }; var stubScratchpad = { shouldActivate: function(ev) { return true; }, activatedCount: 0, linkText: 'scratchpad.linkText' }; stubScratchpad.activate = function(value) { stubScratchpad.activatedCount++; return true; }; exports.testActivate = function(options) { if (!options.inputter) { console.log('No inputter. Skipping scratchpad tests'); return; } var ev = {}; stubScratchpad.activatedCount = 0; options.inputter.onKeyUp(ev); test.is(1, stubScratchpad.activatedCount, 'scratchpad is activated'); }; }); /* * Copyright 2009-2011 Mozilla Foundation and contributors * Licensed under the New BSD license. See LICENSE.txt or: * http://opensource.org/licenses/BSD-3-Clause */ define('gclitest/testHistory', ['require', 'exports', 'module' , 'test/assert', 'gcli/history'], function(require, exports, module) { var test = require('test/assert'); var History = require('gcli/history').History; exports.setup = function() { }; exports.shutdown = function() { }; exports.testSimpleHistory = function () { var history = new History({}); history.add('foo'); history.add('bar'); test.is('bar', history.backward()); test.is('foo', history.backward()); // Adding to the history again moves us back to the start of the history. history.add('quux'); test.is('quux', history.backward()); test.is('bar', history.backward()); test.is('foo', history.backward()); }; exports.testBackwardsPastIndex = function () { var history = new History({}); history.add('foo'); history.add('bar'); test.is('bar', history.backward()); test.is('foo', history.backward()); // Moving backwards past recorded history just keeps giving you the last // item. test.is('foo', history.backward()); }; exports.testForwardsPastIndex = function () { var history = new History({}); history.add('foo'); history.add('bar'); test.is('bar', history.backward()); test.is('foo', history.backward()); // Going forward through the history again. test.is('bar', history.forward()); // 'Present' time. test.is('', history.forward()); // Going to the 'future' just keeps giving us the empty string. test.is('', history.forward()); }; }); /* * Copyright 2009-2011 Mozilla Foundation and contributors * Licensed under the New BSD license. See LICENSE.txt or: * http://opensource.org/licenses/BSD-3-Clause */ define('gclitest/testRequire', ['require', 'exports', 'module' , 'test/assert', 'gclitest/requirable'], function(require, exports, module) { var test = require('test/assert'); exports.testWorking = function() { // There are lots of requirement tests that we could be doing here // The fact that we can get anything at all working is a testament to // require doing what it should - we don't need to test the var requireable = require('gclitest/requirable'); test.is('thing1', requireable.thing1); test.is(2, requireable.thing2); test.is(undefined, requireable.thing3); }; exports.testDomains = function() { var requireable = require('gclitest/requirable'); test.is(undefined, requireable.status); requireable.setStatus(null); test.is(null, requireable.getStatus()); test.is(undefined, requireable.status); requireable.setStatus('42'); test.is('42', requireable.getStatus()); test.is(undefined, requireable.status); if (define.Domain) { var domain = new define.Domain(); var requireable2 = domain.require('gclitest/requirable'); test.is(undefined, requireable2.status); test.is('initial', requireable2.getStatus()); requireable2.setStatus(999); test.is(999, requireable2.getStatus()); test.is(undefined, requireable2.status); test.is('42', requireable.getStatus()); test.is(undefined, requireable.status); } }; exports.testLeakage = function() { var requireable = require('gclitest/requirable'); test.is(undefined, requireable.setup); test.is(undefined, requireable.shutdown); test.is(undefined, requireable.testWorking); }; exports.testMultiImport = function() { var r1 = require('gclitest/requirable'); var r2 = require('gclitest/requirable'); test.is(r1, r2); }; exports.testUncompilable = function() { // This test is commented out because it breaks the RequireJS module // loader and because it causes console output and because testing failure // cases such as this is something of a luxury // It's not totally clear how a module loader should perform with unusable // modules, however at least it should go into a flat spin ... // GCLI mini_require reports an error as it should /* if (define.Domain) { try { var unrequireable = require('gclitest/unrequirable'); t.fail(); } catch (ex) { console.error(ex); } } */ }; exports.testRecursive = function() { // See Bug 658583 /* var recurse = require('gclitest/recurse'); */ }; }); /* * Copyright 2009-2011 Mozilla Foundation and contributors * Licensed under the New BSD license. See LICENSE.txt or: * http://opensource.org/licenses/BSD-3-Clause */ define('gclitest/requirable', ['require', 'exports', 'module' ], function(require, exports, module) { exports.thing1 = 'thing1'; exports.thing2 = 2; var status = 'initial'; exports.setStatus = function(aStatus) { status = aStatus; }; exports.getStatus = function() { return status; }; }); /* * Copyright 2009-2011 Mozilla Foundation and contributors * Licensed under the New BSD license. See LICENSE.txt or: * http://opensource.org/licenses/BSD-3-Clause */ define('gclitest/testResource', ['require', 'exports', 'module' , 'gcli/types/resource', 'gcli/types', 'test/assert'], function(require, exports, module) { var resource = require('gcli/types/resource'); var types = require('gcli/types'); var Status = require('gcli/types').Status; var test = require('test/assert'); var tempDocument; exports.setup = function(options) { tempDocument = resource.getDocument(); resource.setDocument(options.window.document); }; exports.shutdown = function(options) { resource.setDocument(tempDocument); tempDocument = undefined; }; exports.testPredictions = function(options) { if (options.useFakeWindow) { console.log('Skipping resource tests: options.useFakeWindow = true'); return; } var resource1 = types.getType('resource'); var predictions1 = resource1.parseString('').getPredictions(); test.ok(predictions1.length > 1, 'have resources'); predictions1.forEach(function(prediction) { checkPrediction(resource1, prediction); }); var resource2 = types.getType({ name: 'resource', include: 'text/javascript' }); var predictions2 = resource2.parseString('').getPredictions(); test.ok(predictions2.length > 1, 'have resources'); predictions2.forEach(function(prediction) { checkPrediction(resource2, prediction); }); var resource3 = types.getType({ name: 'resource', include: 'text/css' }); var predictions3 = resource3.parseString('').getPredictions(); // jsdom fails to support digging into stylesheets if (!options.isNode) { test.ok(predictions3.length > 1, 'have resources'); } predictions3.forEach(function(prediction) { checkPrediction(resource3, prediction); }); var resource4 = types.getType({ name: 'resource' }); var predictions4 = resource4.parseString('').getPredictions(); test.is(predictions1.length, predictions4.length, 'type spec'); test.is(predictions2.length + predictions3.length, predictions4.length, 'split'); }; function checkPrediction(res, prediction) { var name = prediction.name; var value = prediction.value; var conversion = res.parseString(name); test.is(conversion.getStatus(), Status.VALID, 'status VALID for ' + name); test.is(conversion.value, value, 'value for ' + name); var strung = res.stringify(value); test.is(strung, name, 'stringify for ' + name); test.is(typeof value.loadContents, 'function', 'resource for ' + name); test.is(typeof value.element, 'object', 'resource for ' + name); } }); /* * Copyright 2009-2011 Mozilla Foundation and contributors * Licensed under the New BSD license. See LICENSE.txt or: * http://opensource.org/licenses/BSD-3-Clause */ define('gclitest/testJs', ['require', 'exports', 'module' , 'gcli/cli', 'gcli/types', 'gcli/types/javascript', 'test/assert'], function(require, exports, module) { var Requisition = require('gcli/cli').Requisition; var Status = require('gcli/types').Status; var javascript = require('gcli/types/javascript'); var test = require('test/assert'); var debug = false; var requ; var assign; var status; var statuses; var tempWindow; exports.setup = function(options) { tempWindow = javascript.getGlobalObject(); javascript.setGlobalObject(options.window); Object.defineProperty(options.window, 'donteval', { get: function() { test.ok(false, 'donteval should not be used'); return { cant: '', touch: '', 'this': '' }; }, enumerable: true, configurable : true }); }; exports.shutdown = function(options) { delete options.window.donteval; javascript.setGlobalObject(tempWindow); tempWindow = undefined; }; function input(typed) { if (!requ) { requ = new Requisition(); } var cursor = { start: typed.length, end: typed.length }; var input = { typed: typed, cursor: cursor }; requ.update(input); if (debug) { console.log('####### TEST: typed="' + typed + '" cur=' + cursor.start + ' cli=', requ); } status = requ.getStatus(); statuses = requ.getInputStatusMarkup(input.cursor.start).map(function(s) { return Array(s.string.length + 1).join(s.status.toString()[0]); }).join(''); if (requ.commandAssignment.getValue()) { assign = requ.getAssignment(0); } else { assign = undefined; } } function predictionsHas(name) { return assign.getPredictions().some(function(prediction) { return name === prediction.name; }, this); } function check(expStatuses, expStatus, expAssign, expPredict) { test.is('{', requ.commandAssignment.getValue().name, 'is exec'); test.is(expStatuses, statuses, 'unexpected status markup'); test.is(expStatus.toString(), status.toString(), 'unexpected status'); test.is(expAssign, assign.getValue(), 'unexpected assignment'); if (expPredict != null) { var contains; if (Array.isArray(expPredict)) { expPredict.forEach(function(p) { contains = predictionsHas(p); test.ok(contains, 'missing prediction ' + p); }); } else if (typeof expPredict === 'number') { contains = true; test.is(assign.getPredictions().length, expPredict, 'prediction count'); if (assign.getPredictions().length !== expPredict) { assign.getPredictions().forEach(function(prediction) { console.log('actual prediction: ', prediction); }); } } else { contains = predictionsHas(expPredict); test.ok(contains, 'missing prediction ' + expPredict); } if (!contains) { console.log('Predictions: ' + assign.getPredictions().map(function(p) { return p.name; }).join(', ')); } } } exports.testBasic = function(options) { input('{'); check('V', Status.ERROR, ''); input('{ '); check('VV', Status.ERROR, ''); input('{ w'); check('VVI', Status.ERROR, 'w', 'window'); input('{ windo'); check('VVIIIII', Status.ERROR, 'windo', 'window'); input('{ window'); check('VVVVVVVV', Status.VALID, 'window'); input('{ window.d'); check('VVIIIIIIII', Status.ERROR, 'window.d', 'window.document'); input('{ window.document.title'); check('VVVVVVVVVVVVVVVVVVVVVVV', Status.VALID, 'window.document.title', 0); input('{ d'); check('VVI', Status.ERROR, 'd', 'document'); input('{ document.title'); check('VVVVVVVVVVVVVVVV', Status.VALID, 'document.title', 0); test.ok('donteval' in options.window, 'donteval exists'); input('{ don'); check('VVIII', Status.ERROR, 'don', 'donteval'); input('{ donteval'); check('VVVVVVVVVV', Status.VALID, 'donteval', 0); /* // This is a controversial test - technically we can tell that it's an error // because 'donteval.' is a syntax error, however donteval is unsafe so we // are playing safe by bailing out early. It's enough of a corner case that // I don't think it warrants fixing input('{ donteval.'); check('VVIIIIIIIII', Status.ERROR, 'donteval.', 0); */ input('{ donteval.cant'); check('VVVVVVVVVVVVVVV', Status.VALID, 'donteval.cant', 0); input('{ donteval.xxx'); check('VVVVVVVVVVVVVV', Status.VALID, 'donteval.xxx', 0); }; }); /* * Copyright 2009-2011 Mozilla Foundation and contributors * Licensed under the New BSD license. See LICENSE.txt or: * http://opensource.org/licenses/BSD-3-Clause */ define('gclitest/testUtil', ['require', 'exports', 'module' , 'gcli/util', 'test/assert'], function(require, exports, module) { var util = require('gcli/util'); var test = require('test/assert'); exports.testFindCssSelector = function(options) { if (options.useFakeWindow) { console.log('Skipping dom.findCssSelector tests due to useFakeWindow'); return; } var nodes = options.window.document.querySelectorAll('*'); for (var i = 0; i < nodes.length; i++) { var selector = util.dom.findCssSelector(nodes[i]); var matches = options.window.document.querySelectorAll(selector); test.is(matches.length, 1, 'multiple matches for ' + selector); test.is(matches[0], nodes[i], 'non-matching selector: ' + selector); } }; }); function undefine() { delete define.modules['gclitest/index']; delete define.modules['gclitest/suite']; delete define.modules['test/examiner']; delete define.modules['gclitest/testTokenize']; delete define.modules['test/assert']; delete define.modules['gclitest/testSplit']; delete define.modules['gclitest/commands']; delete define.modules['gclitest/testCli']; delete define.modules['gclitest/testExec']; delete define.modules['gclitest/testKeyboard']; delete define.modules['gclitest/testScratchpad']; delete define.modules['gclitest/testHistory']; delete define.modules['gclitest/testRequire']; delete define.modules['gclitest/requirable']; delete define.modules['gclitest/testResource']; delete define.modules['gclitest/testJs']; delete define.modules['gclitest/testUtil']; delete define.globalDomain.modules['gclitest/index']; delete define.globalDomain.modules['gclitest/suite']; delete define.globalDomain.modules['test/examiner']; delete define.globalDomain.modules['gclitest/testTokenize']; delete define.globalDomain.modules['test/assert']; delete define.globalDomain.modules['gclitest/testSplit']; delete define.globalDomain.modules['gclitest/commands']; delete define.globalDomain.modules['gclitest/testCli']; delete define.globalDomain.modules['gclitest/testExec']; delete define.globalDomain.modules['gclitest/testKeyboard']; delete define.globalDomain.modules['gclitest/testScratchpad']; delete define.globalDomain.modules['gclitest/testHistory']; delete define.globalDomain.modules['gclitest/testRequire']; delete define.globalDomain.modules['gclitest/requirable']; delete define.globalDomain.modules['gclitest/testResource']; delete define.globalDomain.modules['gclitest/testJs']; delete define.globalDomain.modules['gclitest/testUtil']; } registerCleanupFunction(function() { Services.prefs.clearUserPref("devtools.gcli.enable"); undefine(); obj = undefined; define = undefined; console = undefined; Node = undefined; }); function test() { Services.prefs.setBoolPref("devtools.gcli.enable", true); addTab("http://example.com/browser/browser/devtools/webconsole/test/test-console.html"); browser.addEventListener("DOMContentLoaded", onLoad, false); } function onLoad() { browser.removeEventListener("DOMContentLoaded", onLoad, false); var failed = false; try { openConsole(); var gcliterm = HUDService.getHudByWindow(content).gcliterm; var gclitest = define.globalDomain.require("gclitest/index"); gclitest.run({ window: gcliterm.document.defaultView, inputter: gcliterm.opts.console.inputter, requisition: gcliterm.opts.requistion }); } catch (ex) { failed = ex; console.error("Test Failure", ex); ok(false, "" + ex); } finally { closeConsole(); finish(); } if (failed) { throw failed; } }