4819 lines
152 KiB
JavaScript
4819 lines
152 KiB
JavaScript
|
var require = function (file, cwd) {
|
||
|
var resolved = require.resolve(file, cwd || '/');
|
||
|
var mod = require.modules[resolved];
|
||
|
if (!mod) throw new Error(
|
||
|
'Failed to resolve module ' + file + ', tried ' + resolved
|
||
|
);
|
||
|
var res = mod._cached ? mod._cached : mod();
|
||
|
return res;
|
||
|
}
|
||
|
|
||
|
require.paths = [];
|
||
|
require.modules = {};
|
||
|
require.extensions = [".js",".coffee"];
|
||
|
|
||
|
require._core = {
|
||
|
'assert': true,
|
||
|
'events': true,
|
||
|
'fs': true,
|
||
|
'path': true,
|
||
|
'vm': true
|
||
|
};
|
||
|
|
||
|
require.resolve = (function () {
|
||
|
return function (x, cwd) {
|
||
|
if (!cwd) cwd = '/';
|
||
|
|
||
|
if (require._core[x]) return x;
|
||
|
var path = require.modules.path();
|
||
|
var y = cwd || '.';
|
||
|
|
||
|
if (x.match(/^(?:\.\.?\/|\/)/)) {
|
||
|
var m = loadAsFileSync(path.resolve(y, x))
|
||
|
|| loadAsDirectorySync(path.resolve(y, x));
|
||
|
if (m) return m;
|
||
|
}
|
||
|
|
||
|
var n = loadNodeModulesSync(x, y);
|
||
|
if (n) return n;
|
||
|
|
||
|
throw new Error("Cannot find module '" + x + "'");
|
||
|
|
||
|
function loadAsFileSync (x) {
|
||
|
if (require.modules[x]) {
|
||
|
return x;
|
||
|
}
|
||
|
|
||
|
for (var i = 0; i < require.extensions.length; i++) {
|
||
|
var ext = require.extensions[i];
|
||
|
if (require.modules[x + ext]) return x + ext;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function loadAsDirectorySync (x) {
|
||
|
x = x.replace(/\/+$/, '');
|
||
|
var pkgfile = x + '/package.json';
|
||
|
if (require.modules[pkgfile]) {
|
||
|
var pkg = require.modules[pkgfile]();
|
||
|
var b = pkg.browserify;
|
||
|
if (typeof b === 'object' && b.main) {
|
||
|
var m = loadAsFileSync(path.resolve(x, b.main));
|
||
|
if (m) return m;
|
||
|
}
|
||
|
else if (typeof b === 'string') {
|
||
|
var m = loadAsFileSync(path.resolve(x, b));
|
||
|
if (m) return m;
|
||
|
}
|
||
|
else if (pkg.main) {
|
||
|
var m = loadAsFileSync(path.resolve(x, pkg.main));
|
||
|
if (m) return m;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return loadAsFileSync(x + '/index');
|
||
|
}
|
||
|
|
||
|
function loadNodeModulesSync (x, start) {
|
||
|
var dirs = nodeModulesPathsSync(start);
|
||
|
for (var i = 0; i < dirs.length; i++) {
|
||
|
var dir = dirs[i];
|
||
|
var m = loadAsFileSync(dir + '/' + x);
|
||
|
if (m) return m;
|
||
|
var n = loadAsDirectorySync(dir + '/' + x);
|
||
|
if (n) return n;
|
||
|
}
|
||
|
|
||
|
var m = loadAsFileSync(x);
|
||
|
if (m) return m;
|
||
|
}
|
||
|
|
||
|
function nodeModulesPathsSync (start) {
|
||
|
var parts;
|
||
|
if (start === '/') parts = [ '' ];
|
||
|
else parts = path.normalize(start).split('/');
|
||
|
|
||
|
var dirs = [];
|
||
|
for (var i = parts.length - 1; i >= 0; i--) {
|
||
|
if (parts[i] === 'node_modules') continue;
|
||
|
var dir = parts.slice(0, i + 1).join('/') + '/node_modules';
|
||
|
dirs.push(dir);
|
||
|
}
|
||
|
|
||
|
return dirs;
|
||
|
}
|
||
|
};
|
||
|
})();
|
||
|
|
||
|
require.alias = function (from, to) {
|
||
|
var path = require.modules.path();
|
||
|
var res = null;
|
||
|
try {
|
||
|
res = require.resolve(from + '/package.json', '/');
|
||
|
}
|
||
|
catch (err) {
|
||
|
res = require.resolve(from, '/');
|
||
|
}
|
||
|
var basedir = path.dirname(res);
|
||
|
|
||
|
var keys = Object_keys(require.modules);
|
||
|
|
||
|
for (var i = 0; i < keys.length; i++) {
|
||
|
var key = keys[i];
|
||
|
if (key.slice(0, basedir.length + 1) === basedir + '/') {
|
||
|
var f = key.slice(basedir.length);
|
||
|
require.modules[to + f] = require.modules[basedir + f];
|
||
|
}
|
||
|
else if (key === basedir) {
|
||
|
require.modules[to] = require.modules[basedir];
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
|
||
|
require.define = function (filename, fn) {
|
||
|
var dirname = require._core[filename]
|
||
|
? ''
|
||
|
: require.modules.path().dirname(filename)
|
||
|
;
|
||
|
|
||
|
var require_ = function (file) {
|
||
|
return require(file, dirname)
|
||
|
};
|
||
|
require_.resolve = function (name) {
|
||
|
return require.resolve(name, dirname);
|
||
|
};
|
||
|
require_.modules = require.modules;
|
||
|
require_.define = require.define;
|
||
|
var module_ = { exports : {} };
|
||
|
|
||
|
require.modules[filename] = function () {
|
||
|
require.modules[filename]._cached = module_.exports;
|
||
|
fn.call(
|
||
|
module_.exports,
|
||
|
require_,
|
||
|
module_,
|
||
|
module_.exports,
|
||
|
dirname,
|
||
|
filename
|
||
|
);
|
||
|
require.modules[filename]._cached = module_.exports;
|
||
|
return module_.exports;
|
||
|
};
|
||
|
};
|
||
|
|
||
|
var Object_keys = Object.keys || function (obj) {
|
||
|
var res = [];
|
||
|
for (var key in obj) res.push(key)
|
||
|
return res;
|
||
|
};
|
||
|
|
||
|
if (typeof process === 'undefined') process = {};
|
||
|
|
||
|
if (!process.nextTick) process.nextTick = function (fn) {
|
||
|
setTimeout(fn, 0);
|
||
|
};
|
||
|
|
||
|
if (!process.title) process.title = 'browser';
|
||
|
|
||
|
if (!process.binding) process.binding = function (name) {
|
||
|
if (name === 'evals') return require('vm')
|
||
|
else throw new Error('No such module')
|
||
|
};
|
||
|
|
||
|
if (!process.cwd) process.cwd = function () { return '.' };
|
||
|
|
||
|
require.define("path", function (require, module, exports, __dirname, __filename) {
|
||
|
function filter (xs, fn) {
|
||
|
var res = [];
|
||
|
for (var i = 0; i < xs.length; i++) {
|
||
|
if (fn(xs[i], i, xs)) res.push(xs[i]);
|
||
|
}
|
||
|
return res;
|
||
|
}
|
||
|
|
||
|
// resolves . and .. elements in a path array with directory names there
|
||
|
// must be no slashes, empty elements, or device names (c:\) in the array
|
||
|
// (so also no leading and trailing slashes - it does not distinguish
|
||
|
// relative and absolute paths)
|
||
|
function normalizeArray(parts, allowAboveRoot) {
|
||
|
// if the path tries to go above the root, `up` ends up > 0
|
||
|
var up = 0;
|
||
|
for (var i = parts.length; i >= 0; i--) {
|
||
|
var last = parts[i];
|
||
|
if (last == '.') {
|
||
|
parts.splice(i, 1);
|
||
|
} else if (last === '..') {
|
||
|
parts.splice(i, 1);
|
||
|
up++;
|
||
|
} else if (up) {
|
||
|
parts.splice(i, 1);
|
||
|
up--;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// if the path is allowed to go above the root, restore leading ..s
|
||
|
if (allowAboveRoot) {
|
||
|
for (; up--; up) {
|
||
|
parts.unshift('..');
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return parts;
|
||
|
}
|
||
|
|
||
|
// Regex to split a filename into [*, dir, basename, ext]
|
||
|
// posix version
|
||
|
var splitPathRe = /^(.+\/(?!$)|\/)?((?:.+?)?(\.[^.]*)?)$/;
|
||
|
|
||
|
// path.resolve([from ...], to)
|
||
|
// posix version
|
||
|
exports.resolve = function() {
|
||
|
var resolvedPath = '',
|
||
|
resolvedAbsolute = false;
|
||
|
|
||
|
for (var i = arguments.length; i >= -1 && !resolvedAbsolute; i--) {
|
||
|
var path = (i >= 0)
|
||
|
? arguments[i]
|
||
|
: process.cwd();
|
||
|
|
||
|
// Skip empty and invalid entries
|
||
|
if (typeof path !== 'string' || !path) {
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
resolvedPath = path + '/' + resolvedPath;
|
||
|
resolvedAbsolute = path.charAt(0) === '/';
|
||
|
}
|
||
|
|
||
|
// At this point the path should be resolved to a full absolute path, but
|
||
|
// handle relative paths to be safe (might happen when process.cwd() fails)
|
||
|
|
||
|
// Normalize the path
|
||
|
resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function(p) {
|
||
|
return !!p;
|
||
|
}), !resolvedAbsolute).join('/');
|
||
|
|
||
|
return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.';
|
||
|
};
|
||
|
|
||
|
// path.normalize(path)
|
||
|
// posix version
|
||
|
exports.normalize = function(path) {
|
||
|
var isAbsolute = path.charAt(0) === '/',
|
||
|
trailingSlash = path.slice(-1) === '/';
|
||
|
|
||
|
// Normalize the path
|
||
|
path = normalizeArray(filter(path.split('/'), function(p) {
|
||
|
return !!p;
|
||
|
}), !isAbsolute).join('/');
|
||
|
|
||
|
if (!path && !isAbsolute) {
|
||
|
path = '.';
|
||
|
}
|
||
|
if (path && trailingSlash) {
|
||
|
path += '/';
|
||
|
}
|
||
|
|
||
|
return (isAbsolute ? '/' : '') + path;
|
||
|
};
|
||
|
|
||
|
|
||
|
// posix version
|
||
|
exports.join = function() {
|
||
|
var paths = Array.prototype.slice.call(arguments, 0);
|
||
|
return exports.normalize(filter(paths, function(p, index) {
|
||
|
return p && typeof p === 'string';
|
||
|
}).join('/'));
|
||
|
};
|
||
|
|
||
|
|
||
|
exports.dirname = function(path) {
|
||
|
var dir = splitPathRe.exec(path)[1] || '';
|
||
|
var isWindows = false;
|
||
|
if (!dir) {
|
||
|
// No dirname
|
||
|
return '.';
|
||
|
} else if (dir.length === 1 ||
|
||
|
(isWindows && dir.length <= 3 && dir.charAt(1) === ':')) {
|
||
|
// It is just a slash or a drive letter with a slash
|
||
|
return dir;
|
||
|
} else {
|
||
|
// It is a full dirname, strip trailing slash
|
||
|
return dir.substring(0, dir.length - 1);
|
||
|
}
|
||
|
};
|
||
|
|
||
|
|
||
|
exports.basename = function(path, ext) {
|
||
|
var f = splitPathRe.exec(path)[2] || '';
|
||
|
// TODO: make this comparison case-insensitive on windows?
|
||
|
if (ext && f.substr(-1 * ext.length) === ext) {
|
||
|
f = f.substr(0, f.length - ext.length);
|
||
|
}
|
||
|
return f;
|
||
|
};
|
||
|
|
||
|
|
||
|
exports.extname = function(path) {
|
||
|
return splitPathRe.exec(path)[3] || '';
|
||
|
};
|
||
|
|
||
|
});
|
||
|
|
||
|
require.define("/node_modules/cucumber-html/package.json", function (require, module, exports, __dirname, __filename) {
|
||
|
module.exports = {"main":"./src/main/resources/cucumber/formatter/formatter"}
|
||
|
});
|
||
|
|
||
|
require.define("/node_modules/cucumber-html/src/main/resources/cucumber/formatter/formatter.js", function (require, module, exports, __dirname, __filename) {
|
||
|
var CucumberHTML = {};
|
||
|
|
||
|
CucumberHTML.DOMFormatter = function(rootNode) {
|
||
|
var currentUri;
|
||
|
var currentFeature;
|
||
|
var currentElement;
|
||
|
var currentSteps;
|
||
|
|
||
|
var currentStepIndex;
|
||
|
var currentStep;
|
||
|
var $templates = $(CucumberHTML.templates);
|
||
|
|
||
|
this.uri = function(uri) {
|
||
|
currentUri = uri;
|
||
|
};
|
||
|
|
||
|
this.feature = function(feature) {
|
||
|
currentFeature = blockElement(rootNode, feature, 'feature');
|
||
|
};
|
||
|
|
||
|
this.background = function(background) {
|
||
|
currentElement = featureElement(background, 'background');
|
||
|
currentStepIndex = 1;
|
||
|
};
|
||
|
|
||
|
this.scenario = function(scenario) {
|
||
|
currentElement = featureElement(scenario, 'scenario');
|
||
|
currentStepIndex = 1;
|
||
|
};
|
||
|
|
||
|
this.scenarioOutline = function(scenarioOutline) {
|
||
|
currentElement = featureElement(scenarioOutline, 'scenario_outline');
|
||
|
currentStepIndex = 1;
|
||
|
};
|
||
|
|
||
|
this.step = function(step) {
|
||
|
var stepElement = $('.step', $templates).clone();
|
||
|
stepElement.appendTo(currentSteps);
|
||
|
populate(stepElement, step, 'step');
|
||
|
|
||
|
if (step.doc_string) {
|
||
|
docString = $('.doc_string', $templates).clone();
|
||
|
docString.appendTo(stepElement);
|
||
|
// TODO: use a syntax highlighter based on the content_type
|
||
|
docString.text(step.doc_string.value);
|
||
|
}
|
||
|
if (step.rows) {
|
||
|
dataTable = $('.data_table', $templates).clone();
|
||
|
dataTable.appendTo(stepElement);
|
||
|
var tBody = dataTable.find('tbody');
|
||
|
$.each(step.rows, function(index, row) {
|
||
|
var tr = $('<tr></tr>').appendTo(tBody);
|
||
|
$.each(row.cells, function(index, cell) {
|
||
|
var td = $('<td>' + cell + '</td>').appendTo(tBody);
|
||
|
});
|
||
|
});
|
||
|
}
|
||
|
};
|
||
|
|
||
|
this.examples = function(examples) {
|
||
|
var examplesElement = blockElement(currentElement.children('details'), examples, 'examples');
|
||
|
var examplesTable = $('.examples_table', $templates).clone();
|
||
|
examplesTable.appendTo(examplesElement.children('details'));
|
||
|
|
||
|
$.each(examples.rows, function(index, row) {
|
||
|
var parent = index == 0 ? examplesTable.find('thead') : examplesTable.find('tbody');
|
||
|
var tr = $('<tr></tr>').appendTo(parent);
|
||
|
$.each(row.cells, function(index, cell) {
|
||
|
var td = $('<td>' + cell + '</td>').appendTo(tr);
|
||
|
});
|
||
|
});
|
||
|
};
|
||
|
|
||
|
this.match = function(match) {
|
||
|
currentStep = currentSteps.find('li:nth-child(' + currentStepIndex + ')');
|
||
|
currentStepIndex++;
|
||
|
};
|
||
|
|
||
|
this.result = function(result) {
|
||
|
currentStep.addClass(result.status);
|
||
|
currentElement.addClass(result.status);
|
||
|
var isLastStep = currentSteps.find('li:nth-child(' + currentStepIndex + ')').length == 0;
|
||
|
if(isLastStep) {
|
||
|
if(currentSteps.find('.failed').length == 0) {
|
||
|
// No failed steps. Collapse it.
|
||
|
currentElement.find('details').removeAttr('open');
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
|
||
|
this.embedding = function(mimeType, data) {
|
||
|
if(mimeType.match(/^image\//)) {
|
||
|
currentStep.append("<div><img src='" + data + "'></div>");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function featureElement(statement, itemtype) {
|
||
|
var e = blockElement(currentFeature.children('details'), statement, itemtype);
|
||
|
|
||
|
currentSteps = $('.steps', $templates).clone();
|
||
|
currentSteps.appendTo(e.children('details'));
|
||
|
|
||
|
return e;
|
||
|
}
|
||
|
|
||
|
function blockElement(parent, statement, itemtype) {
|
||
|
var e = $('.blockelement', $templates).clone();
|
||
|
e.appendTo(parent);
|
||
|
return populate(e, statement, itemtype);
|
||
|
}
|
||
|
|
||
|
function populate(e, statement, itemtype) {
|
||
|
populateTags(e, statement.tags);
|
||
|
populateComments(e, statement.comments);
|
||
|
e.find('.keyword').text(statement.keyword);
|
||
|
e.find('.name').text(statement.name);
|
||
|
e.find('.description').text(statement.description);
|
||
|
e.attr('itemtype', 'http://cukes.info/microformat/' + itemtype);
|
||
|
e.addClass(itemtype);
|
||
|
return e;
|
||
|
}
|
||
|
|
||
|
function populateComments(e, comments) {
|
||
|
if (comments !== undefined) {
|
||
|
var commentsNode = $('.comments', $templates).clone().prependTo(e.find('.header'));
|
||
|
$.each(comments, function(index, comment) {
|
||
|
var commentNode = $('.comment', $templates).clone().appendTo(commentsNode);
|
||
|
commentNode.text(comment.value);
|
||
|
});
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function populateTags(e, tags) {
|
||
|
if (tags !== undefined) {
|
||
|
var tagsNode = $('.tags', $templates).clone().prependTo(e.find('.header'));
|
||
|
$.each(tags, function(index, tag) {
|
||
|
var tagNode = $('.tag', $templates).clone().appendTo(tagsNode);
|
||
|
tagNode.text(tag.name);
|
||
|
});
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
|
||
|
CucumberHTML.templates = '<div>\
|
||
|
<section class="blockelement" itemscope>\
|
||
|
<details open>\
|
||
|
<summary class="header">\
|
||
|
<span class="keyword" itemprop="keyword">Keyword</span>: <span itemprop="name" class="name">This is the block name</span>\
|
||
|
</summary>\
|
||
|
<div itemprop="description" class="description">The description goes here</div>\
|
||
|
</details>\
|
||
|
</section>\
|
||
|
\
|
||
|
<ol class="steps"></ol>\
|
||
|
\
|
||
|
<ol>\
|
||
|
<li class="step"><span class="keyword" itemprop="keyword">Keyword</span><span class="name" itemprop="name">Name</span></li>\
|
||
|
</ol>\
|
||
|
\
|
||
|
<pre class="doc_string"></pre>\
|
||
|
\
|
||
|
<table class="data_table">\
|
||
|
<tbody>\
|
||
|
</tbody>\
|
||
|
</table>\
|
||
|
\
|
||
|
<table class="examples_table">\
|
||
|
<thead></thead>\
|
||
|
<tbody></tbody>\
|
||
|
</table>\
|
||
|
\
|
||
|
<section class="embed">\
|
||
|
<img itemprop="screenshot" class="screenshot" />\
|
||
|
</section>\
|
||
|
<div class="tags"></div>\
|
||
|
<span class="tag"></span>\
|
||
|
<div class="comments"></div>\
|
||
|
<div class="comment"></div>\
|
||
|
<div>';
|
||
|
|
||
|
if (typeof module !== 'undefined') {
|
||
|
module.exports = CucumberHTML;
|
||
|
}
|
||
|
});
|
||
|
|
||
|
require.define("/cucumber.js", function (require, module, exports, __dirname, __filename) {
|
||
|
var Cucumber = function(featureSource, supportCodeInitializer, options) {
|
||
|
var configuration = Cucumber.VolatileConfiguration(featureSource, supportCodeInitializer, options);
|
||
|
var runtime = Cucumber.Runtime(configuration);
|
||
|
return runtime;
|
||
|
};
|
||
|
Cucumber.Ast = require('./cucumber/ast');
|
||
|
// browserify won't load ./cucumber/cli and throw an exception:
|
||
|
try { Cucumber.Cli = require('./cucumber/cli'); } catch(e) {}
|
||
|
Cucumber.Debug = require('./cucumber/debug'); // Untested namespace
|
||
|
Cucumber.Listener = require('./cucumber/listener');
|
||
|
Cucumber.Parser = require('./cucumber/parser');
|
||
|
Cucumber.Runtime = require('./cucumber/runtime');
|
||
|
Cucumber.SupportCode = require('./cucumber/support_code');
|
||
|
Cucumber.TagGroupParser = require('./cucumber/tag_group_parser');
|
||
|
Cucumber.Type = require('./cucumber/type');
|
||
|
Cucumber.Util = require('./cucumber/util');
|
||
|
Cucumber.VolatileConfiguration = require('./cucumber/volatile_configuration');
|
||
|
|
||
|
Cucumber.VERSION = "0.2.9";
|
||
|
|
||
|
module.exports = Cucumber;
|
||
|
|
||
|
});
|
||
|
|
||
|
require.define("/cucumber/ast.js", function (require, module, exports, __dirname, __filename) {
|
||
|
var Ast = {};
|
||
|
Ast.Assembler = require('./ast/assembler');
|
||
|
Ast.Background = require('./ast/background');
|
||
|
Ast.DataTable = require('./ast/data_table');
|
||
|
Ast.DocString = require('./ast/doc_string');
|
||
|
Ast.Feature = require('./ast/feature');
|
||
|
Ast.Features = require('./ast/features');
|
||
|
Ast.Filter = require('./ast/filter');
|
||
|
Ast.Scenario = require('./ast/scenario');
|
||
|
Ast.Step = require('./ast/step');
|
||
|
Ast.Tag = require('./ast/tag');
|
||
|
module.exports = Ast;
|
||
|
|
||
|
});
|
||
|
|
||
|
require.define("/cucumber/ast/assembler.js", function (require, module, exports, __dirname, __filename) {
|
||
|
var Assembler = function(features, filter) {
|
||
|
var currentFeature, currentScenarioOrBackground, currentStep;
|
||
|
var stashedTags = [];
|
||
|
|
||
|
var self = {
|
||
|
setCurrentFeature: function setCurrentFeature(feature) {
|
||
|
currentFeature = feature;
|
||
|
self.setCurrentScenarioOrBackground(undefined);
|
||
|
},
|
||
|
|
||
|
getCurrentFeature: function getCurrentFeature() {
|
||
|
return currentFeature;
|
||
|
},
|
||
|
|
||
|
setCurrentScenarioOrBackground: function setCurrentScenarioOrBackground(scenarioOrBackground) {
|
||
|
currentScenarioOrBackground = scenarioOrBackground;
|
||
|
self.setCurrentStep(undefined);
|
||
|
},
|
||
|
|
||
|
getCurrentScenarioOrBackground: function getCurrentScenarioOrBackground() {
|
||
|
return currentScenarioOrBackground;
|
||
|
},
|
||
|
|
||
|
setCurrentStep: function setCurrentStep(step) {
|
||
|
currentStep = step;
|
||
|
},
|
||
|
|
||
|
getCurrentStep: function getCurrentStep() {
|
||
|
return currentStep;
|
||
|
},
|
||
|
|
||
|
stashTag: function stashTag(tag) {
|
||
|
stashedTags.push(tag);
|
||
|
},
|
||
|
|
||
|
revealTags: function revealTags() {
|
||
|
var revealedTags = stashedTags;
|
||
|
stashedTags = [];
|
||
|
return revealedTags;
|
||
|
},
|
||
|
|
||
|
applyCurrentFeatureTagsToElement: function applyCurrentFeatureTagsToElement(element) {
|
||
|
var currentFeature = self.getCurrentFeature();
|
||
|
var featureTags = currentFeature.getTags();
|
||
|
element.addTags(featureTags);
|
||
|
},
|
||
|
|
||
|
applyStashedTagsToElement: function applyStashedTagsToElement(element) {
|
||
|
var revealedTags = self.revealTags();
|
||
|
element.addTags(revealedTags);
|
||
|
},
|
||
|
|
||
|
insertBackground: function insertBackground(background) {
|
||
|
self.setCurrentScenarioOrBackground(background);
|
||
|
var currentFeature = self.getCurrentFeature();
|
||
|
currentFeature.addBackground(background);
|
||
|
},
|
||
|
|
||
|
insertDataTableRow: function insertDataTableRow(dataTableRow) {
|
||
|
var currentStep = self.getCurrentStep();
|
||
|
currentStep.attachDataTableRow(dataTableRow);
|
||
|
},
|
||
|
|
||
|
insertDocString: function insertDocString(docString) {
|
||
|
var currentStep = self.getCurrentStep();
|
||
|
currentStep.attachDocString(docString);
|
||
|
},
|
||
|
|
||
|
insertFeature: function insertFeature(feature) {
|
||
|
self.applyStashedTagsToElement(feature);
|
||
|
self.setCurrentFeature(feature);
|
||
|
features.addFeature(feature);
|
||
|
},
|
||
|
|
||
|
insertScenario: function insertScenario(scenario) {
|
||
|
self.applyCurrentFeatureTagsToElement(scenario);
|
||
|
self.applyStashedTagsToElement(scenario);
|
||
|
self.setCurrentScenarioOrBackground(scenario);
|
||
|
if (filter.isScenarioEnrolled(scenario)) {
|
||
|
var currentFeature = self.getCurrentFeature();
|
||
|
currentFeature.addScenario(scenario);
|
||
|
}
|
||
|
},
|
||
|
|
||
|
insertStep: function insertStep(step) {
|
||
|
self.setCurrentStep(step);
|
||
|
var currentScenarioOrBackground = self.getCurrentScenarioOrBackground();
|
||
|
currentScenarioOrBackground.addStep(step);
|
||
|
},
|
||
|
|
||
|
insertTag: function insertTag(tag) {
|
||
|
self.stashTag(tag);
|
||
|
}
|
||
|
};
|
||
|
return self;
|
||
|
};
|
||
|
|
||
|
module.exports = Assembler;
|
||
|
|
||
|
});
|
||
|
|
||
|
require.define("/cucumber/ast/background.js", function (require, module, exports, __dirname, __filename) {
|
||
|
var Background = function(keyword, name, description, line) {
|
||
|
var Cucumber = require('../../cucumber');
|
||
|
|
||
|
var steps = Cucumber.Type.Collection();
|
||
|
|
||
|
var self = {
|
||
|
getKeyword: function getKeyword() {
|
||
|
return keyword;
|
||
|
},
|
||
|
|
||
|
getName: function getName() {
|
||
|
return name;
|
||
|
},
|
||
|
|
||
|
getDescription: function getDescription() {
|
||
|
return description;
|
||
|
},
|
||
|
|
||
|
getLine: function getLine() {
|
||
|
return line;
|
||
|
},
|
||
|
|
||
|
addStep: function addStep(step) {
|
||
|
var lastStep = self.getLastStep();
|
||
|
step.setPreviousStep(lastStep);
|
||
|
steps.add(step);
|
||
|
},
|
||
|
|
||
|
getLastStep: function getLastStep() {
|
||
|
return steps.getLast();
|
||
|
},
|
||
|
|
||
|
getSteps: function getSteps() {
|
||
|
return steps;
|
||
|
}
|
||
|
};
|
||
|
return self;
|
||
|
};
|
||
|
module.exports = Background;
|
||
|
|
||
|
});
|
||
|
|
||
|
require.define("/cucumber/ast/data_table.js", function (require, module, exports, __dirname, __filename) {
|
||
|
var DataTable = function() {
|
||
|
var Cucumber = require('../../cucumber');
|
||
|
|
||
|
var rows = Cucumber.Type.Collection();
|
||
|
|
||
|
var self = {
|
||
|
attachRow: function attachRow(row) {
|
||
|
rows.add(row);
|
||
|
},
|
||
|
|
||
|
getContents: function getContents() {
|
||
|
return self;
|
||
|
},
|
||
|
|
||
|
raw: function raw() {
|
||
|
rawRows = [];
|
||
|
rows.syncForEach(function(row) {
|
||
|
var rawRow = row.raw();
|
||
|
rawRows.push(rawRow);
|
||
|
});
|
||
|
return rawRows;
|
||
|
},
|
||
|
|
||
|
hashes: function hashes() {
|
||
|
var raw = self.raw();
|
||
|
var hashDataTable = Cucumber.Type.HashDataTable(raw);
|
||
|
var rawHashDataTable = hashDataTable.raw();
|
||
|
return rawHashDataTable;
|
||
|
}
|
||
|
};
|
||
|
return self;
|
||
|
};
|
||
|
DataTable.Row = require('./data_table/row');
|
||
|
module.exports = DataTable;
|
||
|
|
||
|
});
|
||
|
|
||
|
require.define("/cucumber/ast/data_table/row.js", function (require, module, exports, __dirname, __filename) {
|
||
|
var Row = function(cells, line) {
|
||
|
var Cucumber = require('../../../cucumber');
|
||
|
|
||
|
self = {
|
||
|
raw: function raw() {
|
||
|
return cells;
|
||
|
}
|
||
|
};
|
||
|
return self;
|
||
|
}
|
||
|
module.exports = Row;
|
||
|
|
||
|
});
|
||
|
|
||
|
require.define("/cucumber/ast/doc_string.js", function (require, module, exports, __dirname, __filename) {
|
||
|
var DocString = function(contentType, contents, line) {
|
||
|
var self = {
|
||
|
getContents: function getContents() {
|
||
|
return contents;
|
||
|
},
|
||
|
|
||
|
getContentType: function getContentType() {
|
||
|
return contentType;
|
||
|
},
|
||
|
|
||
|
getLine: function getLine() {
|
||
|
return line;
|
||
|
}
|
||
|
};
|
||
|
return self;
|
||
|
};
|
||
|
module.exports = DocString;
|
||
|
|
||
|
});
|
||
|
|
||
|
require.define("/cucumber/ast/feature.js", function (require, module, exports, __dirname, __filename) {
|
||
|
var Feature = function(keyword, name, description, line) {
|
||
|
var Cucumber = require('../../cucumber');
|
||
|
|
||
|
var background;
|
||
|
var scenarios = Cucumber.Type.Collection();
|
||
|
var tags = [];
|
||
|
|
||
|
var self = {
|
||
|
getKeyword: function getKeyword() {
|
||
|
return keyword;
|
||
|
},
|
||
|
|
||
|
getName: function getName() {
|
||
|
return name;
|
||
|
},
|
||
|
|
||
|
getDescription: function getDescription() {
|
||
|
return description;
|
||
|
},
|
||
|
|
||
|
getLine: function getLine() {
|
||
|
return line;
|
||
|
},
|
||
|
|
||
|
addBackground: function addBackground(newBackground) {
|
||
|
background = newBackground;
|
||
|
},
|
||
|
|
||
|
getBackground: function getBackground() {
|
||
|
return background;
|
||
|
},
|
||
|
|
||
|
hasBackground: function hasBackground() {
|
||
|
return (typeof(background) != 'undefined');
|
||
|
},
|
||
|
|
||
|
addScenario: function addScenario(scenario) {
|
||
|
var background = self.getBackground();
|
||
|
scenario.setBackground(background);
|
||
|
scenarios.add(scenario);
|
||
|
},
|
||
|
|
||
|
getLastScenario: function getLastScenario() {
|
||
|
return scenarios.getLast();
|
||
|
},
|
||
|
|
||
|
addTags: function setTags(newTags) {
|
||
|
tags = tags.concat(newTags);
|
||
|
},
|
||
|
|
||
|
getTags: function getTags() {
|
||
|
return tags;
|
||
|
},
|
||
|
|
||
|
acceptVisitor: function acceptVisitor(visitor, callback) {
|
||
|
self.instructVisitorToVisitBackground(visitor, function() {
|
||
|
self.instructVisitorToVisitScenarios(visitor, callback);
|
||
|
});
|
||
|
},
|
||
|
|
||
|
instructVisitorToVisitBackground: function instructVisitorToVisitBackground(visitor, callback) {
|
||
|
if (self.hasBackground()) {
|
||
|
var background = self.getBackground();
|
||
|
visitor.visitBackground(background, callback);
|
||
|
} else {
|
||
|
callback();
|
||
|
}
|
||
|
},
|
||
|
|
||
|
instructVisitorToVisitScenarios: function instructVisitorToVisitScenarios(visitor, callback) {
|
||
|
scenarios.forEach(function(scenario, iterate) {
|
||
|
visitor.visitScenario(scenario, iterate);
|
||
|
}, callback);
|
||
|
}
|
||
|
};
|
||
|
return self;
|
||
|
};
|
||
|
module.exports = Feature;
|
||
|
|
||
|
});
|
||
|
|
||
|
require.define("/cucumber/ast/features.js", function (require, module, exports, __dirname, __filename) {
|
||
|
var Features = function() {
|
||
|
var Cucumber = require('../../cucumber');
|
||
|
|
||
|
var features = Cucumber.Type.Collection();
|
||
|
|
||
|
var self = {
|
||
|
addFeature: function addFeature(feature) {
|
||
|
features.add(feature);
|
||
|
},
|
||
|
|
||
|
getLastFeature: function getLastFeature() {
|
||
|
return features.getLast();
|
||
|
},
|
||
|
|
||
|
acceptVisitor: function acceptVisitor(visitor, callback) {
|
||
|
features.forEach(function(feature, iterate) {
|
||
|
visitor.visitFeature(feature, iterate);
|
||
|
}, callback);
|
||
|
}
|
||
|
};
|
||
|
return self;
|
||
|
};
|
||
|
module.exports = Features;
|
||
|
|
||
|
});
|
||
|
|
||
|
require.define("/cucumber/ast/filter.js", function (require, module, exports, __dirname, __filename) {
|
||
|
var _ = require('underscore');
|
||
|
|
||
|
var Filter = function(rules) {
|
||
|
var self = {
|
||
|
isScenarioEnrolled: function isScenarioEnrolled(scenario) {
|
||
|
var enrolled = _.all(rules, function(rule) {
|
||
|
return rule.isSatisfiedByElement(scenario);
|
||
|
});
|
||
|
return enrolled;
|
||
|
}
|
||
|
};
|
||
|
return self;
|
||
|
};
|
||
|
Filter.AnyOfTagsRule = require('./filter/any_of_tags_rule');
|
||
|
Filter.ElementMatchingTagSpec = require('./filter/element_matching_tag_spec');
|
||
|
module.exports = Filter;
|
||
|
});
|
||
|
|
||
|
require.define("/node_modules/underscore/package.json", function (require, module, exports, __dirname, __filename) {
|
||
|
module.exports = {"main":"underscore.js"}
|
||
|
});
|
||
|
|
||
|
require.define("/node_modules/underscore/underscore.js", function (require, module, exports, __dirname, __filename) {
|
||
|
// Underscore.js 1.2.2
|
||
|
// (c) 2011 Jeremy Ashkenas, DocumentCloud Inc.
|
||
|
// Underscore is freely distributable under the MIT license.
|
||
|
// Portions of Underscore are inspired or borrowed from Prototype,
|
||
|
// Oliver Steele's Functional, and John Resig's Micro-Templating.
|
||
|
// For all details and documentation:
|
||
|
// http://documentcloud.github.com/underscore
|
||
|
|
||
|
(function() {
|
||
|
|
||
|
// Baseline setup
|
||
|
// --------------
|
||
|
|
||
|
// Establish the root object, `window` in the browser, or `global` on the server.
|
||
|
var root = this;
|
||
|
|
||
|
// Save the previous value of the `_` variable.
|
||
|
var previousUnderscore = root._;
|
||
|
|
||
|
// Establish the object that gets returned to break out of a loop iteration.
|
||
|
var breaker = {};
|
||
|
|
||
|
// Save bytes in the minified (but not gzipped) version:
|
||
|
var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype;
|
||
|
|
||
|
// Create quick reference variables for speed access to core prototypes.
|
||
|
var slice = ArrayProto.slice,
|
||
|
unshift = ArrayProto.unshift,
|
||
|
toString = ObjProto.toString,
|
||
|
hasOwnProperty = ObjProto.hasOwnProperty;
|
||
|
|
||
|
// All **ECMAScript 5** native function implementations that we hope to use
|
||
|
// are declared here.
|
||
|
var
|
||
|
nativeForEach = ArrayProto.forEach,
|
||
|
nativeMap = ArrayProto.map,
|
||
|
nativeReduce = ArrayProto.reduce,
|
||
|
nativeReduceRight = ArrayProto.reduceRight,
|
||
|
nativeFilter = ArrayProto.filter,
|
||
|
nativeEvery = ArrayProto.every,
|
||
|
nativeSome = ArrayProto.some,
|
||
|
nativeIndexOf = ArrayProto.indexOf,
|
||
|
nativeLastIndexOf = ArrayProto.lastIndexOf,
|
||
|
nativeIsArray = Array.isArray,
|
||
|
nativeKeys = Object.keys,
|
||
|
nativeBind = FuncProto.bind;
|
||
|
|
||
|
// Create a safe reference to the Underscore object for use below.
|
||
|
var _ = function(obj) { return new wrapper(obj); };
|
||
|
|
||
|
// Export the Underscore object for **Node.js** and **"CommonJS"**, with
|
||
|
// backwards-compatibility for the old `require()` API. If we're not in
|
||
|
// CommonJS, add `_` to the global object.
|
||
|
if (typeof exports !== 'undefined') {
|
||
|
if (typeof module !== 'undefined' && module.exports) {
|
||
|
exports = module.exports = _;
|
||
|
}
|
||
|
exports._ = _;
|
||
|
} else if (typeof define === 'function' && define.amd) {
|
||
|
// Register as a named module with AMD.
|
||
|
define('underscore', function() {
|
||
|
return _;
|
||
|
});
|
||
|
} else {
|
||
|
// Exported as a string, for Closure Compiler "advanced" mode.
|
||
|
root['_'] = _;
|
||
|
}
|
||
|
|
||
|
// Current version.
|
||
|
_.VERSION = '1.2.2';
|
||
|
|
||
|
// Collection Functions
|
||
|
// --------------------
|
||
|
|
||
|
// The cornerstone, an `each` implementation, aka `forEach`.
|
||
|
// Handles objects with the built-in `forEach`, arrays, and raw objects.
|
||
|
// Delegates to **ECMAScript 5**'s native `forEach` if available.
|
||
|
var each = _.each = _.forEach = function(obj, iterator, context) {
|
||
|
if (obj == null) return;
|
||
|
if (nativeForEach && obj.forEach === nativeForEach) {
|
||
|
obj.forEach(iterator, context);
|
||
|
} else if (obj.length === +obj.length) {
|
||
|
for (var i = 0, l = obj.length; i < l; i++) {
|
||
|
if (i in obj && iterator.call(context, obj[i], i, obj) === breaker) return;
|
||
|
}
|
||
|
} else {
|
||
|
for (var key in obj) {
|
||
|
if (hasOwnProperty.call(obj, key)) {
|
||
|
if (iterator.call(context, obj[key], key, obj) === breaker) return;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
|
||
|
// Return the results of applying the iterator to each element.
|
||
|
// Delegates to **ECMAScript 5**'s native `map` if available.
|
||
|
_.map = function(obj, iterator, context) {
|
||
|
var results = [];
|
||
|
if (obj == null) return results;
|
||
|
if (nativeMap && obj.map === nativeMap) return obj.map(iterator, context);
|
||
|
each(obj, function(value, index, list) {
|
||
|
results[results.length] = iterator.call(context, value, index, list);
|
||
|
});
|
||
|
return results;
|
||
|
};
|
||
|
|
||
|
// **Reduce** builds up a single result from a list of values, aka `inject`,
|
||
|
// or `foldl`. Delegates to **ECMAScript 5**'s native `reduce` if available.
|
||
|
_.reduce = _.foldl = _.inject = function(obj, iterator, memo, context) {
|
||
|
var initial = memo !== void 0;
|
||
|
if (obj == null) obj = [];
|
||
|
if (nativeReduce && obj.reduce === nativeReduce) {
|
||
|
if (context) iterator = _.bind(iterator, context);
|
||
|
return initial ? obj.reduce(iterator, memo) : obj.reduce(iterator);
|
||
|
}
|
||
|
each(obj, function(value, index, list) {
|
||
|
if (!initial) {
|
||
|
memo = value;
|
||
|
initial = true;
|
||
|
} else {
|
||
|
memo = iterator.call(context, memo, value, index, list);
|
||
|
}
|
||
|
});
|
||
|
if (!initial) throw new TypeError("Reduce of empty array with no initial value");
|
||
|
return memo;
|
||
|
};
|
||
|
|
||
|
// The right-associative version of reduce, also known as `foldr`.
|
||
|
// Delegates to **ECMAScript 5**'s native `reduceRight` if available.
|
||
|
_.reduceRight = _.foldr = function(obj, iterator, memo, context) {
|
||
|
if (obj == null) obj = [];
|
||
|
if (nativeReduceRight && obj.reduceRight === nativeReduceRight) {
|
||
|
if (context) iterator = _.bind(iterator, context);
|
||
|
return memo !== void 0 ? obj.reduceRight(iterator, memo) : obj.reduceRight(iterator);
|
||
|
}
|
||
|
var reversed = (_.isArray(obj) ? obj.slice() : _.toArray(obj)).reverse();
|
||
|
return _.reduce(reversed, iterator, memo, context);
|
||
|
};
|
||
|
|
||
|
// Return the first value which passes a truth test. Aliased as `detect`.
|
||
|
_.find = _.detect = function(obj, iterator, context) {
|
||
|
var result;
|
||
|
any(obj, function(value, index, list) {
|
||
|
if (iterator.call(context, value, index, list)) {
|
||
|
result = value;
|
||
|
return true;
|
||
|
}
|
||
|
});
|
||
|
return result;
|
||
|
};
|
||
|
|
||
|
// Return all the elements that pass a truth test.
|
||
|
// Delegates to **ECMAScript 5**'s native `filter` if available.
|
||
|
// Aliased as `select`.
|
||
|
_.filter = _.select = function(obj, iterator, context) {
|
||
|
var results = [];
|
||
|
if (obj == null) return results;
|
||
|
if (nativeFilter && obj.filter === nativeFilter) return obj.filter(iterator, context);
|
||
|
each(obj, function(value, index, list) {
|
||
|
if (iterator.call(context, value, index, list)) results[results.length] = value;
|
||
|
});
|
||
|
return results;
|
||
|
};
|
||
|
|
||
|
// Return all the elements for which a truth test fails.
|
||
|
_.reject = function(obj, iterator, context) {
|
||
|
var results = [];
|
||
|
if (obj == null) return results;
|
||
|
each(obj, function(value, index, list) {
|
||
|
if (!iterator.call(context, value, index, list)) results[results.length] = value;
|
||
|
});
|
||
|
return results;
|
||
|
};
|
||
|
|
||
|
// Determine whether all of the elements match a truth test.
|
||
|
// Delegates to **ECMAScript 5**'s native `every` if available.
|
||
|
// Aliased as `all`.
|
||
|
_.every = _.all = function(obj, iterator, context) {
|
||
|
var result = true;
|
||
|
if (obj == null) return result;
|
||
|
if (nativeEvery && obj.every === nativeEvery) return obj.every(iterator, context);
|
||
|
each(obj, function(value, index, list) {
|
||
|
if (!(result = result && iterator.call(context, value, index, list))) return breaker;
|
||
|
});
|
||
|
return result;
|
||
|
};
|
||
|
|
||
|
// Determine if at least one element in the object matches a truth test.
|
||
|
// Delegates to **ECMAScript 5**'s native `some` if available.
|
||
|
// Aliased as `any`.
|
||
|
var any = _.some = _.any = function(obj, iterator, context) {
|
||
|
iterator = iterator || _.identity;
|
||
|
var result = false;
|
||
|
if (obj == null) return result;
|
||
|
if (nativeSome && obj.some === nativeSome) return obj.some(iterator, context);
|
||
|
each(obj, function(value, index, list) {
|
||
|
if (result || (result = iterator.call(context, value, index, list))) return breaker;
|
||
|
});
|
||
|
return !!result;
|
||
|
};
|
||
|
|
||
|
// Determine if a given value is included in the array or object using `===`.
|
||
|
// Aliased as `contains`.
|
||
|
_.include = _.contains = function(obj, target) {
|
||
|
var found = false;
|
||
|
if (obj == null) return found;
|
||
|
if (nativeIndexOf && obj.indexOf === nativeIndexOf) return obj.indexOf(target) != -1;
|
||
|
found = any(obj, function(value) {
|
||
|
return value === target;
|
||
|
});
|
||
|
return found;
|
||
|
};
|
||
|
|
||
|
// Invoke a method (with arguments) on every item in a collection.
|
||
|
_.invoke = function(obj, method) {
|
||
|
var args = slice.call(arguments, 2);
|
||
|
return _.map(obj, function(value) {
|
||
|
return (method.call ? method || value : value[method]).apply(value, args);
|
||
|
});
|
||
|
};
|
||
|
|
||
|
// Convenience version of a common use case of `map`: fetching a property.
|
||
|
_.pluck = function(obj, key) {
|
||
|
return _.map(obj, function(value){ return value[key]; });
|
||
|
};
|
||
|
|
||
|
// Return the maximum element or (element-based computation).
|
||
|
_.max = function(obj, iterator, context) {
|
||
|
if (!iterator && _.isArray(obj)) return Math.max.apply(Math, obj);
|
||
|
if (!iterator && _.isEmpty(obj)) return -Infinity;
|
||
|
var result = {computed : -Infinity};
|
||
|
each(obj, function(value, index, list) {
|
||
|
var computed = iterator ? iterator.call(context, value, index, list) : value;
|
||
|
computed >= result.computed && (result = {value : value, computed : computed});
|
||
|
});
|
||
|
return result.value;
|
||
|
};
|
||
|
|
||
|
// Return the minimum element (or element-based computation).
|
||
|
_.min = function(obj, iterator, context) {
|
||
|
if (!iterator && _.isArray(obj)) return Math.min.apply(Math, obj);
|
||
|
if (!iterator && _.isEmpty(obj)) return Infinity;
|
||
|
var result = {computed : Infinity};
|
||
|
each(obj, function(value, index, list) {
|
||
|
var computed = iterator ? iterator.call(context, value, index, list) : value;
|
||
|
computed < result.computed && (result = {value : value, computed : computed});
|
||
|
});
|
||
|
return result.value;
|
||
|
};
|
||
|
|
||
|
// Shuffle an array.
|
||
|
_.shuffle = function(obj) {
|
||
|
var shuffled = [], rand;
|
||
|
each(obj, function(value, index, list) {
|
||
|
if (index == 0) {
|
||
|
shuffled[0] = value;
|
||
|
} else {
|
||
|
rand = Math.floor(Math.random() * (index + 1));
|
||
|
shuffled[index] = shuffled[rand];
|
||
|
shuffled[rand] = value;
|
||
|
}
|
||
|
});
|
||
|
return shuffled;
|
||
|
};
|
||
|
|
||
|
// Sort the object's values by a criterion produced by an iterator.
|
||
|
_.sortBy = function(obj, iterator, context) {
|
||
|
return _.pluck(_.map(obj, function(value, index, list) {
|
||
|
return {
|
||
|
value : value,
|
||
|
criteria : iterator.call(context, value, index, list)
|
||
|
};
|
||
|
}).sort(function(left, right) {
|
||
|
var a = left.criteria, b = right.criteria;
|
||
|
return a < b ? -1 : a > b ? 1 : 0;
|
||
|
}), 'value');
|
||
|
};
|
||
|
|
||
|
// Groups the object's values by a criterion. Pass either a string attribute
|
||
|
// to group by, or a function that returns the criterion.
|
||
|
_.groupBy = function(obj, val) {
|
||
|
var result = {};
|
||
|
var iterator = _.isFunction(val) ? val : function(obj) { return obj[val]; };
|
||
|
each(obj, function(value, index) {
|
||
|
var key = iterator(value, index);
|
||
|
(result[key] || (result[key] = [])).push(value);
|
||
|
});
|
||
|
return result;
|
||
|
};
|
||
|
|
||
|
// Use a comparator function to figure out at what index an object should
|
||
|
// be inserted so as to maintain order. Uses binary search.
|
||
|
_.sortedIndex = function(array, obj, iterator) {
|
||
|
iterator || (iterator = _.identity);
|
||
|
var low = 0, high = array.length;
|
||
|
while (low < high) {
|
||
|
var mid = (low + high) >> 1;
|
||
|
iterator(array[mid]) < iterator(obj) ? low = mid + 1 : high = mid;
|
||
|
}
|
||
|
return low;
|
||
|
};
|
||
|
|
||
|
// Safely convert anything iterable into a real, live array.
|
||
|
_.toArray = function(iterable) {
|
||
|
if (!iterable) return [];
|
||
|
if (iterable.toArray) return iterable.toArray();
|
||
|
if (_.isArray(iterable)) return slice.call(iterable);
|
||
|
if (_.isArguments(iterable)) return slice.call(iterable);
|
||
|
return _.values(iterable);
|
||
|
};
|
||
|
|
||
|
// Return the number of elements in an object.
|
||
|
_.size = function(obj) {
|
||
|
return _.toArray(obj).length;
|
||
|
};
|
||
|
|
||
|
// Array Functions
|
||
|
// ---------------
|
||
|
|
||
|
// Get the first element of an array. Passing **n** will return the first N
|
||
|
// values in the array. Aliased as `head`. The **guard** check allows it to work
|
||
|
// with `_.map`.
|
||
|
_.first = _.head = function(array, n, guard) {
|
||
|
return (n != null) && !guard ? slice.call(array, 0, n) : array[0];
|
||
|
};
|
||
|
|
||
|
// Returns everything but the last entry of the array. Especcialy useful on
|
||
|
// the arguments object. Passing **n** will return all the values in
|
||
|
// the array, excluding the last N. The **guard** check allows it to work with
|
||
|
// `_.map`.
|
||
|
_.initial = function(array, n, guard) {
|
||
|
return slice.call(array, 0, array.length - ((n == null) || guard ? 1 : n));
|
||
|
};
|
||
|
|
||
|
// Get the last element of an array. Passing **n** will return the last N
|
||
|
// values in the array. The **guard** check allows it to work with `_.map`.
|
||
|
_.last = function(array, n, guard) {
|
||
|
if ((n != null) && !guard) {
|
||
|
return slice.call(array, Math.max(array.length - n, 0));
|
||
|
} else {
|
||
|
return array[array.length - 1];
|
||
|
}
|
||
|
};
|
||
|
|
||
|
// Returns everything but the first entry of the array. Aliased as `tail`.
|
||
|
// Especially useful on the arguments object. Passing an **index** will return
|
||
|
// the rest of the values in the array from that index onward. The **guard**
|
||
|
// check allows it to work with `_.map`.
|
||
|
_.rest = _.tail = function(array, index, guard) {
|
||
|
return slice.call(array, (index == null) || guard ? 1 : index);
|
||
|
};
|
||
|
|
||
|
// Trim out all falsy values from an array.
|
||
|
_.compact = function(array) {
|
||
|
return _.filter(array, function(value){ return !!value; });
|
||
|
};
|
||
|
|
||
|
// Return a completely flattened version of an array.
|
||
|
_.flatten = function(array, shallow) {
|
||
|
return _.reduce(array, function(memo, value) {
|
||
|
if (_.isArray(value)) return memo.concat(shallow ? value : _.flatten(value));
|
||
|
memo[memo.length] = value;
|
||
|
return memo;
|
||
|
}, []);
|
||
|
};
|
||
|
|
||
|
// Return a version of the array that does not contain the specified value(s).
|
||
|
_.without = function(array) {
|
||
|
return _.difference(array, slice.call(arguments, 1));
|
||
|
};
|
||
|
|
||
|
// Produce a duplicate-free version of the array. If the array has already
|
||
|
// been sorted, you have the option of using a faster algorithm.
|
||
|
// Aliased as `unique`.
|
||
|
_.uniq = _.unique = function(array, isSorted, iterator) {
|
||
|
var initial = iterator ? _.map(array, iterator) : array;
|
||
|
var result = [];
|
||
|
_.reduce(initial, function(memo, el, i) {
|
||
|
if (0 == i || (isSorted === true ? _.last(memo) != el : !_.include(memo, el))) {
|
||
|
memo[memo.length] = el;
|
||
|
result[result.length] = array[i];
|
||
|
}
|
||
|
return memo;
|
||
|
}, []);
|
||
|
return result;
|
||
|
};
|
||
|
|
||
|
// Produce an array that contains the union: each distinct element from all of
|
||
|
// the passed-in arrays.
|
||
|
_.union = function() {
|
||
|
return _.uniq(_.flatten(arguments, true));
|
||
|
};
|
||
|
|
||
|
// Produce an array that contains every item shared between all the
|
||
|
// passed-in arrays. (Aliased as "intersect" for back-compat.)
|
||
|
_.intersection = _.intersect = function(array) {
|
||
|
var rest = slice.call(arguments, 1);
|
||
|
return _.filter(_.uniq(array), function(item) {
|
||
|
return _.every(rest, function(other) {
|
||
|
return _.indexOf(other, item) >= 0;
|
||
|
});
|
||
|
});
|
||
|
};
|
||
|
|
||
|
// Take the difference between one array and another.
|
||
|
// Only the elements present in just the first array will remain.
|
||
|
_.difference = function(array, other) {
|
||
|
return _.filter(array, function(value){ return !_.include(other, value); });
|
||
|
};
|
||
|
|
||
|
// Zip together multiple lists into a single array -- elements that share
|
||
|
// an index go together.
|
||
|
_.zip = function() {
|
||
|
var args = slice.call(arguments);
|
||
|
var length = _.max(_.pluck(args, 'length'));
|
||
|
var results = new Array(length);
|
||
|
for (var i = 0; i < length; i++) results[i] = _.pluck(args, "" + i);
|
||
|
return results;
|
||
|
};
|
||
|
|
||
|
// If the browser doesn't supply us with indexOf (I'm looking at you, **MSIE**),
|
||
|
// we need this function. Return the position of the first occurrence of an
|
||
|
// item in an array, or -1 if the item is not included in the array.
|
||
|
// Delegates to **ECMAScript 5**'s native `indexOf` if available.
|
||
|
// If the array is large and already in sort order, pass `true`
|
||
|
// for **isSorted** to use binary search.
|
||
|
_.indexOf = function(array, item, isSorted) {
|
||
|
if (array == null) return -1;
|
||
|
var i, l;
|
||
|
if (isSorted) {
|
||
|
i = _.sortedIndex(array, item);
|
||
|
return array[i] === item ? i : -1;
|
||
|
}
|
||
|
if (nativeIndexOf && array.indexOf === nativeIndexOf) return array.indexOf(item);
|
||
|
for (i = 0, l = array.length; i < l; i++) if (array[i] === item) return i;
|
||
|
return -1;
|
||
|
};
|
||
|
|
||
|
// Delegates to **ECMAScript 5**'s native `lastIndexOf` if available.
|
||
|
_.lastIndexOf = function(array, item) {
|
||
|
if (array == null) return -1;
|
||
|
if (nativeLastIndexOf && array.lastIndexOf === nativeLastIndexOf) return array.lastIndexOf(item);
|
||
|
var i = array.length;
|
||
|
while (i--) if (array[i] === item) return i;
|
||
|
return -1;
|
||
|
};
|
||
|
|
||
|
// Generate an integer Array containing an arithmetic progression. A port of
|
||
|
// the native Python `range()` function. See
|
||
|
// [the Python documentation](http://docs.python.org/library/functions.html#range).
|
||
|
_.range = function(start, stop, step) {
|
||
|
if (arguments.length <= 1) {
|
||
|
stop = start || 0;
|
||
|
start = 0;
|
||
|
}
|
||
|
step = arguments[2] || 1;
|
||
|
|
||
|
var len = Math.max(Math.ceil((stop - start) / step), 0);
|
||
|
var idx = 0;
|
||
|
var range = new Array(len);
|
||
|
|
||
|
while(idx < len) {
|
||
|
range[idx++] = start;
|
||
|
start += step;
|
||
|
}
|
||
|
|
||
|
return range;
|
||
|
};
|
||
|
|
||
|
// Function (ahem) Functions
|
||
|
// ------------------
|
||
|
|
||
|
// Reusable constructor function for prototype setting.
|
||
|
var ctor = function(){};
|
||
|
|
||
|
// Create a function bound to a given object (assigning `this`, and arguments,
|
||
|
// optionally). Binding with arguments is also known as `curry`.
|
||
|
// Delegates to **ECMAScript 5**'s native `Function.bind` if available.
|
||
|
// We check for `func.bind` first, to fail fast when `func` is undefined.
|
||
|
_.bind = function bind(func, context) {
|
||
|
var bound, args;
|
||
|
if (func.bind === nativeBind && nativeBind) return nativeBind.apply(func, slice.call(arguments, 1));
|
||
|
if (!_.isFunction(func)) throw new TypeError;
|
||
|
args = slice.call(arguments, 2);
|
||
|
return bound = function() {
|
||
|
if (!(this instanceof bound)) return func.apply(context, args.concat(slice.call(arguments)));
|
||
|
ctor.prototype = func.prototype;
|
||
|
var self = new ctor;
|
||
|
var result = func.apply(self, args.concat(slice.call(arguments)));
|
||
|
if (Object(result) === result) return result;
|
||
|
return self;
|
||
|
};
|
||
|
};
|
||
|
|
||
|
// Bind all of an object's methods to that object. Useful for ensuring that
|
||
|
// all callbacks defined on an object belong to it.
|
||
|
_.bindAll = function(obj) {
|
||
|
var funcs = slice.call(arguments, 1);
|
||
|
if (funcs.length == 0) funcs = _.functions(obj);
|
||
|
each(funcs, function(f) { obj[f] = _.bind(obj[f], obj); });
|
||
|
return obj;
|
||
|
};
|
||
|
|
||
|
// Memoize an expensive function by storing its results.
|
||
|
_.memoize = function(func, hasher) {
|
||
|
var memo = {};
|
||
|
hasher || (hasher = _.identity);
|
||
|
return function() {
|
||
|
var key = hasher.apply(this, arguments);
|
||
|
return hasOwnProperty.call(memo, key) ? memo[key] : (memo[key] = func.apply(this, arguments));
|
||
|
};
|
||
|
};
|
||
|
|
||
|
// Delays a function for the given number of milliseconds, and then calls
|
||
|
// it with the arguments supplied.
|
||
|
_.delay = function(func, wait) {
|
||
|
var args = slice.call(arguments, 2);
|
||
|
return setTimeout(function(){ return func.apply(func, args); }, wait);
|
||
|
};
|
||
|
|
||
|
// Defers a function, scheduling it to run after the current call stack has
|
||
|
// cleared.
|
||
|
_.defer = function(func) {
|
||
|
return _.delay.apply(_, [func, 1].concat(slice.call(arguments, 1)));
|
||
|
};
|
||
|
|
||
|
// Returns a function, that, when invoked, will only be triggered at most once
|
||
|
// during a given window of time.
|
||
|
_.throttle = function(func, wait) {
|
||
|
var context, args, timeout, throttling, more;
|
||
|
var whenDone = _.debounce(function(){ more = throttling = false; }, wait);
|
||
|
return function() {
|
||
|
context = this; args = arguments;
|
||
|
var later = function() {
|
||
|
timeout = null;
|
||
|
if (more) func.apply(context, args);
|
||
|
whenDone();
|
||
|
};
|
||
|
if (!timeout) timeout = setTimeout(later, wait);
|
||
|
if (throttling) {
|
||
|
more = true;
|
||
|
} else {
|
||
|
func.apply(context, args);
|
||
|
}
|
||
|
whenDone();
|
||
|
throttling = true;
|
||
|
};
|
||
|
};
|
||
|
|
||
|
// Returns a function, that, as long as it continues to be invoked, will not
|
||
|
// be triggered. The function will be called after it stops being called for
|
||
|
// N milliseconds.
|
||
|
_.debounce = function(func, wait) {
|
||
|
var timeout;
|
||
|
return function() {
|
||
|
var context = this, args = arguments;
|
||
|
var later = function() {
|
||
|
timeout = null;
|
||
|
func.apply(context, args);
|
||
|
};
|
||
|
clearTimeout(timeout);
|
||
|
timeout = setTimeout(later, wait);
|
||
|
};
|
||
|
};
|
||
|
|
||
|
// Returns a function that will be executed at most one time, no matter how
|
||
|
// often you call it. Useful for lazy initialization.
|
||
|
_.once = function(func) {
|
||
|
var ran = false, memo;
|
||
|
return function() {
|
||
|
if (ran) return memo;
|
||
|
ran = true;
|
||
|
return memo = func.apply(this, arguments);
|
||
|
};
|
||
|
};
|
||
|
|
||
|
// Returns the first function passed as an argument to the second,
|
||
|
// allowing you to adjust arguments, run code before and after, and
|
||
|
// conditionally execute the original function.
|
||
|
_.wrap = function(func, wrapper) {
|
||
|
return function() {
|
||
|
var args = [func].concat(slice.call(arguments));
|
||
|
return wrapper.apply(this, args);
|
||
|
};
|
||
|
};
|
||
|
|
||
|
// Returns a function that is the composition of a list of functions, each
|
||
|
// consuming the return value of the function that follows.
|
||
|
_.compose = function() {
|
||
|
var funcs = slice.call(arguments);
|
||
|
return function() {
|
||
|
var args = slice.call(arguments);
|
||
|
for (var i = funcs.length - 1; i >= 0; i--) {
|
||
|
args = [funcs[i].apply(this, args)];
|
||
|
}
|
||
|
return args[0];
|
||
|
};
|
||
|
};
|
||
|
|
||
|
// Returns a function that will only be executed after being called N times.
|
||
|
_.after = function(times, func) {
|
||
|
if (times <= 0) return func();
|
||
|
return function() {
|
||
|
if (--times < 1) { return func.apply(this, arguments); }
|
||
|
};
|
||
|
};
|
||
|
|
||
|
// Object Functions
|
||
|
// ----------------
|
||
|
|
||
|
// Retrieve the names of an object's properties.
|
||
|
// Delegates to **ECMAScript 5**'s native `Object.keys`
|
||
|
_.keys = nativeKeys || function(obj) {
|
||
|
if (obj !== Object(obj)) throw new TypeError('Invalid object');
|
||
|
var keys = [];
|
||
|
for (var key in obj) if (hasOwnProperty.call(obj, key)) keys[keys.length] = key;
|
||
|
return keys;
|
||
|
};
|
||
|
|
||
|
// Retrieve the values of an object's properties.
|
||
|
_.values = function(obj) {
|
||
|
return _.map(obj, _.identity);
|
||
|
};
|
||
|
|
||
|
// Return a sorted list of the function names available on the object.
|
||
|
// Aliased as `methods`
|
||
|
_.functions = _.methods = function(obj) {
|
||
|
var names = [];
|
||
|
for (var key in obj) {
|
||
|
if (_.isFunction(obj[key])) names.push(key);
|
||
|
}
|
||
|
return names.sort();
|
||
|
};
|
||
|
|
||
|
// Extend a given object with all the properties in passed-in object(s).
|
||
|
_.extend = function(obj) {
|
||
|
each(slice.call(arguments, 1), function(source) {
|
||
|
for (var prop in source) {
|
||
|
if (source[prop] !== void 0) obj[prop] = source[prop];
|
||
|
}
|
||
|
});
|
||
|
return obj;
|
||
|
};
|
||
|
|
||
|
// Fill in a given object with default properties.
|
||
|
_.defaults = function(obj) {
|
||
|
each(slice.call(arguments, 1), function(source) {
|
||
|
for (var prop in source) {
|
||
|
if (obj[prop] == null) obj[prop] = source[prop];
|
||
|
}
|
||
|
});
|
||
|
return obj;
|
||
|
};
|
||
|
|
||
|
// Create a (shallow-cloned) duplicate of an object.
|
||
|
_.clone = function(obj) {
|
||
|
if (!_.isObject(obj)) return obj;
|
||
|
return _.isArray(obj) ? obj.slice() : _.extend({}, obj);
|
||
|
};
|
||
|
|
||
|
// Invokes interceptor with the obj, and then returns obj.
|
||
|
// The primary purpose of this method is to "tap into" a method chain, in
|
||
|
// order to perform operations on intermediate results within the chain.
|
||
|
_.tap = function(obj, interceptor) {
|
||
|
interceptor(obj);
|
||
|
return obj;
|
||
|
};
|
||
|
|
||
|
// Internal recursive comparison function.
|
||
|
function eq(a, b, stack) {
|
||
|
// Identical objects are equal. `0 === -0`, but they aren't identical.
|
||
|
// See the Harmony `egal` proposal: http://wiki.ecmascript.org/doku.php?id=harmony:egal.
|
||
|
if (a === b) return a !== 0 || 1 / a == 1 / b;
|
||
|
// A strict comparison is necessary because `null == undefined`.
|
||
|
if (a == null || b == null) return a === b;
|
||
|
// Unwrap any wrapped objects.
|
||
|
if (a._chain) a = a._wrapped;
|
||
|
if (b._chain) b = b._wrapped;
|
||
|
// Invoke a custom `isEqual` method if one is provided.
|
||
|
if (_.isFunction(a.isEqual)) return a.isEqual(b);
|
||
|
if (_.isFunction(b.isEqual)) return b.isEqual(a);
|
||
|
// Compare `[[Class]]` names.
|
||
|
var className = toString.call(a);
|
||
|
if (className != toString.call(b)) return false;
|
||
|
switch (className) {
|
||
|
// Strings, numbers, dates, and booleans are compared by value.
|
||
|
case '[object String]':
|
||
|
// Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is
|
||
|
// equivalent to `new String("5")`.
|
||
|
return String(a) == String(b);
|
||
|
case '[object Number]':
|
||
|
a = +a;
|
||
|
b = +b;
|
||
|
// `NaN`s are equivalent, but non-reflexive. An `egal` comparison is performed for
|
||
|
// other numeric values.
|
||
|
return a != a ? b != b : (a == 0 ? 1 / a == 1 / b : a == b);
|
||
|
case '[object Date]':
|
||
|
case '[object Boolean]':
|
||
|
// Coerce dates and booleans to numeric primitive values. Dates are compared by their
|
||
|
// millisecond representations. Note that invalid dates with millisecond representations
|
||
|
// of `NaN` are not equivalent.
|
||
|
return +a == +b;
|
||
|
// RegExps are compared by their source patterns and flags.
|
||
|
case '[object RegExp]':
|
||
|
return a.source == b.source &&
|
||
|
a.global == b.global &&
|
||
|
a.multiline == b.multiline &&
|
||
|
a.ignoreCase == b.ignoreCase;
|
||
|
}
|
||
|
if (typeof a != 'object' || typeof b != 'object') return false;
|
||
|
// Assume equality for cyclic structures. The algorithm for detecting cyclic
|
||
|
// structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.
|
||
|
var length = stack.length;
|
||
|
while (length--) {
|
||
|
// Linear search. Performance is inversely proportional to the number of
|
||
|
// unique nested structures.
|
||
|
if (stack[length] == a) return true;
|
||
|
}
|
||
|
// Add the first object to the stack of traversed objects.
|
||
|
stack.push(a);
|
||
|
var size = 0, result = true;
|
||
|
// Recursively compare objects and arrays.
|
||
|
if (className == '[object Array]') {
|
||
|
// Compare array lengths to determine if a deep comparison is necessary.
|
||
|
size = a.length;
|
||
|
result = size == b.length;
|
||
|
if (result) {
|
||
|
// Deep compare the contents, ignoring non-numeric properties.
|
||
|
while (size--) {
|
||
|
// Ensure commutative equality for sparse arrays.
|
||
|
if (!(result = size in a == size in b && eq(a[size], b[size], stack))) break;
|
||
|
}
|
||
|
}
|
||
|
} else {
|
||
|
// Objects with different constructors are not equivalent.
|
||
|
if ("constructor" in a != "constructor" in b || a.constructor != b.constructor) return false;
|
||
|
// Deep compare objects.
|
||
|
for (var key in a) {
|
||
|
if (hasOwnProperty.call(a, key)) {
|
||
|
// Count the expected number of properties.
|
||
|
size++;
|
||
|
// Deep compare each member.
|
||
|
if (!(result = hasOwnProperty.call(b, key) && eq(a[key], b[key], stack))) break;
|
||
|
}
|
||
|
}
|
||
|
// Ensure that both objects contain the same number of properties.
|
||
|
if (result) {
|
||
|
for (key in b) {
|
||
|
if (hasOwnProperty.call(b, key) && !(size--)) break;
|
||
|
}
|
||
|
result = !size;
|
||
|
}
|
||
|
}
|
||
|
// Remove the first object from the stack of traversed objects.
|
||
|
stack.pop();
|
||
|
return result;
|
||
|
}
|
||
|
|
||
|
// Perform a deep comparison to check if two objects are equal.
|
||
|
_.isEqual = function(a, b) {
|
||
|
return eq(a, b, []);
|
||
|
};
|
||
|
|
||
|
// Is a given array, string, or object empty?
|
||
|
// An "empty" object has no enumerable own-properties.
|
||
|
_.isEmpty = function(obj) {
|
||
|
if (_.isArray(obj) || _.isString(obj)) return obj.length === 0;
|
||
|
for (var key in obj) if (hasOwnProperty.call(obj, key)) return false;
|
||
|
return true;
|
||
|
};
|
||
|
|
||
|
// Is a given value a DOM element?
|
||
|
_.isElement = function(obj) {
|
||
|
return !!(obj && obj.nodeType == 1);
|
||
|
};
|
||
|
|
||
|
// Is a given value an array?
|
||
|
// Delegates to ECMA5's native Array.isArray
|
||
|
_.isArray = nativeIsArray || function(obj) {
|
||
|
return toString.call(obj) == '[object Array]';
|
||
|
};
|
||
|
|
||
|
// Is a given variable an object?
|
||
|
_.isObject = function(obj) {
|
||
|
return obj === Object(obj);
|
||
|
};
|
||
|
|
||
|
// Is a given variable an arguments object?
|
||
|
if (toString.call(arguments) == '[object Arguments]') {
|
||
|
_.isArguments = function(obj) {
|
||
|
return toString.call(obj) == '[object Arguments]';
|
||
|
};
|
||
|
} else {
|
||
|
_.isArguments = function(obj) {
|
||
|
return !!(obj && hasOwnProperty.call(obj, 'callee'));
|
||
|
};
|
||
|
}
|
||
|
|
||
|
// Is a given value a function?
|
||
|
_.isFunction = function(obj) {
|
||
|
return toString.call(obj) == '[object Function]';
|
||
|
};
|
||
|
|
||
|
// Is a given value a string?
|
||
|
_.isString = function(obj) {
|
||
|
return toString.call(obj) == '[object String]';
|
||
|
};
|
||
|
|
||
|
// Is a given value a number?
|
||
|
_.isNumber = function(obj) {
|
||
|
return toString.call(obj) == '[object Number]';
|
||
|
};
|
||
|
|
||
|
// Is the given value `NaN`?
|
||
|
_.isNaN = function(obj) {
|
||
|
// `NaN` is the only value for which `===` is not reflexive.
|
||
|
return obj !== obj;
|
||
|
};
|
||
|
|
||
|
// Is a given value a boolean?
|
||
|
_.isBoolean = function(obj) {
|
||
|
return obj === true || obj === false || toString.call(obj) == '[object Boolean]';
|
||
|
};
|
||
|
|
||
|
// Is a given value a date?
|
||
|
_.isDate = function(obj) {
|
||
|
return toString.call(obj) == '[object Date]';
|
||
|
};
|
||
|
|
||
|
// Is the given value a regular expression?
|
||
|
_.isRegExp = function(obj) {
|
||
|
return toString.call(obj) == '[object RegExp]';
|
||
|
};
|
||
|
|
||
|
// Is a given value equal to null?
|
||
|
_.isNull = function(obj) {
|
||
|
return obj === null;
|
||
|
};
|
||
|
|
||
|
// Is a given variable undefined?
|
||
|
_.isUndefined = function(obj) {
|
||
|
return obj === void 0;
|
||
|
};
|
||
|
|
||
|
// Utility Functions
|
||
|
// -----------------
|
||
|
|
||
|
// Run Underscore.js in *noConflict* mode, returning the `_` variable to its
|
||
|
// previous owner. Returns a reference to the Underscore object.
|
||
|
_.noConflict = function() {
|
||
|
root._ = previousUnderscore;
|
||
|
return this;
|
||
|
};
|
||
|
|
||
|
// Keep the identity function around for default iterators.
|
||
|
_.identity = function(value) {
|
||
|
return value;
|
||
|
};
|
||
|
|
||
|
// Run a function **n** times.
|
||
|
_.times = function (n, iterator, context) {
|
||
|
for (var i = 0; i < n; i++) iterator.call(context, i);
|
||
|
};
|
||
|
|
||
|
// Escape a string for HTML interpolation.
|
||
|
_.escape = function(string) {
|
||
|
return (''+string).replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"').replace(/'/g, ''').replace(/\//g,'/');
|
||
|
};
|
||
|
|
||
|
// Add your own custom functions to the Underscore object, ensuring that
|
||
|
// they're correctly added to the OOP wrapper as well.
|
||
|
_.mixin = function(obj) {
|
||
|
each(_.functions(obj), function(name){
|
||
|
addToWrapper(name, _[name] = obj[name]);
|
||
|
});
|
||
|
};
|
||
|
|
||
|
// Generate a unique integer id (unique within the entire client session).
|
||
|
// Useful for temporary DOM ids.
|
||
|
var idCounter = 0;
|
||
|
_.uniqueId = function(prefix) {
|
||
|
var id = idCounter++;
|
||
|
return prefix ? prefix + id : id;
|
||
|
};
|
||
|
|
||
|
// By default, Underscore uses ERB-style template delimiters, change the
|
||
|
// following template settings to use alternative delimiters.
|
||
|
_.templateSettings = {
|
||
|
evaluate : /<%([\s\S]+?)%>/g,
|
||
|
interpolate : /<%=([\s\S]+?)%>/g,
|
||
|
escape : /<%-([\s\S]+?)%>/g
|
||
|
};
|
||
|
|
||
|
// JavaScript micro-templating, similar to John Resig's implementation.
|
||
|
// Underscore templating handles arbitrary delimiters, preserves whitespace,
|
||
|
// and correctly escapes quotes within interpolated code.
|
||
|
_.template = function(str, data) {
|
||
|
var c = _.templateSettings;
|
||
|
var tmpl = 'var __p=[],print=function(){__p.push.apply(__p,arguments);};' +
|
||
|
'with(obj||{}){__p.push(\'' +
|
||
|
str.replace(/\\/g, '\\\\')
|
||
|
.replace(/'/g, "\\'")
|
||
|
.replace(c.escape, function(match, code) {
|
||
|
return "',_.escape(" + code.replace(/\\'/g, "'") + "),'";
|
||
|
})
|
||
|
.replace(c.interpolate, function(match, code) {
|
||
|
return "'," + code.replace(/\\'/g, "'") + ",'";
|
||
|
})
|
||
|
.replace(c.evaluate || null, function(match, code) {
|
||
|
return "');" + code.replace(/\\'/g, "'")
|
||
|
.replace(/[\r\n\t]/g, ' ') + ";__p.push('";
|
||
|
})
|
||
|
.replace(/\r/g, '\\r')
|
||
|
.replace(/\n/g, '\\n')
|
||
|
.replace(/\t/g, '\\t')
|
||
|
+ "');}return __p.join('');";
|
||
|
var func = new Function('obj', '_', tmpl);
|
||
|
return data ? func(data, _) : function(data) { return func(data, _) };
|
||
|
};
|
||
|
|
||
|
// The OOP Wrapper
|
||
|
// ---------------
|
||
|
|
||
|
// If Underscore is called as a function, it returns a wrapped object that
|
||
|
// can be used OO-style. This wrapper holds altered versions of all the
|
||
|
// underscore functions. Wrapped objects may be chained.
|
||
|
var wrapper = function(obj) { this._wrapped = obj; };
|
||
|
|
||
|
// Expose `wrapper.prototype` as `_.prototype`
|
||
|
_.prototype = wrapper.prototype;
|
||
|
|
||
|
// Helper function to continue chaining intermediate results.
|
||
|
var result = function(obj, chain) {
|
||
|
return chain ? _(obj).chain() : obj;
|
||
|
};
|
||
|
|
||
|
// A method to easily add functions to the OOP wrapper.
|
||
|
var addToWrapper = function(name, func) {
|
||
|
wrapper.prototype[name] = function() {
|
||
|
var args = slice.call(arguments);
|
||
|
unshift.call(args, this._wrapped);
|
||
|
return result(func.apply(_, args), this._chain);
|
||
|
};
|
||
|
};
|
||
|
|
||
|
// Add all of the Underscore functions to the wrapper object.
|
||
|
_.mixin(_);
|
||
|
|
||
|
// Add all mutator Array functions to the wrapper.
|
||
|
each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {
|
||
|
var method = ArrayProto[name];
|
||
|
wrapper.prototype[name] = function() {
|
||
|
method.apply(this._wrapped, arguments);
|
||
|
return result(this._wrapped, this._chain);
|
||
|
};
|
||
|
});
|
||
|
|
||
|
// Add all accessor Array functions to the wrapper.
|
||
|
each(['concat', 'join', 'slice'], function(name) {
|
||
|
var method = ArrayProto[name];
|
||
|
wrapper.prototype[name] = function() {
|
||
|
return result(method.apply(this._wrapped, arguments), this._chain);
|
||
|
};
|
||
|
});
|
||
|
|
||
|
// Start chaining a wrapped Underscore object.
|
||
|
wrapper.prototype.chain = function() {
|
||
|
this._chain = true;
|
||
|
return this;
|
||
|
};
|
||
|
|
||
|
// Extracts the result from a wrapped and chained object.
|
||
|
wrapper.prototype.value = function() {
|
||
|
return this._wrapped;
|
||
|
};
|
||
|
|
||
|
}).call(this);
|
||
|
|
||
|
});
|
||
|
|
||
|
require.define("/cucumber/ast/filter/any_of_tags_rule.js", function (require, module, exports, __dirname, __filename) {
|
||
|
var _ = require('underscore');
|
||
|
|
||
|
var AnyOfTagsRule = function(tags) {
|
||
|
var Cucumber = require('../../../cucumber');
|
||
|
|
||
|
var self = {
|
||
|
isSatisfiedByElement: function isSatisfiedByElement(element) {
|
||
|
var satisfied = _.any(tags, function(tag) {
|
||
|
var spec = Cucumber.Ast.Filter.ElementMatchingTagSpec(tag);
|
||
|
return spec.isMatching(element);
|
||
|
});
|
||
|
return satisfied;
|
||
|
}
|
||
|
};
|
||
|
return self;
|
||
|
};
|
||
|
module.exports = AnyOfTagsRule;
|
||
|
|
||
|
});
|
||
|
|
||
|
require.define("/cucumber/ast/filter/element_matching_tag_spec.js", function (require, module, exports, __dirname, __filename) {
|
||
|
var _ = require('underscore');
|
||
|
|
||
|
var ElementMatchingTagSpec = function(tagName) {
|
||
|
var self = {
|
||
|
isMatching: function isMatching(element) {
|
||
|
var elementTags = element.getTags();
|
||
|
var matching;
|
||
|
if (self.isExpectingTag())
|
||
|
matching = _.any(elementTags, self.isTagSatisfying);
|
||
|
else
|
||
|
matching = _.all(elementTags, self.isTagSatisfying);
|
||
|
return matching;
|
||
|
},
|
||
|
|
||
|
isTagSatisfying: function isTagSatisfying(tag) {
|
||
|
var checkedTagName = tag.getName();
|
||
|
var satisfying;
|
||
|
if (self.isExpectingTag())
|
||
|
satisfying = checkedTagName == tagName;
|
||
|
else {
|
||
|
var negatedCheckedTagName = ElementMatchingTagSpec.NEGATION_CHARACTER + checkedTagName;
|
||
|
satisfying = negatedCheckedTagName != tagName;
|
||
|
}
|
||
|
return satisfying;
|
||
|
},
|
||
|
|
||
|
isExpectingTag: function isExpectingTag() {
|
||
|
var expectingTag = tagName[0] != ElementMatchingTagSpec.NEGATION_CHARACTER;
|
||
|
return expectingTag;
|
||
|
}
|
||
|
};
|
||
|
return self;
|
||
|
};
|
||
|
ElementMatchingTagSpec.NEGATION_CHARACTER = '~';
|
||
|
module.exports = ElementMatchingTagSpec;
|
||
|
|
||
|
});
|
||
|
|
||
|
require.define("/cucumber/ast/scenario.js", function (require, module, exports, __dirname, __filename) {
|
||
|
var Scenario = function(keyword, name, description, line) {
|
||
|
var Cucumber = require('../../cucumber');
|
||
|
|
||
|
var background;
|
||
|
var steps = Cucumber.Type.Collection();
|
||
|
var tags = [];
|
||
|
|
||
|
var self = {
|
||
|
setBackground: function setBackground(newBackground) {
|
||
|
background = newBackground;
|
||
|
},
|
||
|
|
||
|
getKeyword: function getKeyword() {
|
||
|
return keyword;
|
||
|
},
|
||
|
|
||
|
getName: function getName() {
|
||
|
return name;
|
||
|
},
|
||
|
|
||
|
getDescription: function getDescription() {
|
||
|
return description;
|
||
|
},
|
||
|
|
||
|
getLine: function getLine() {
|
||
|
return line;
|
||
|
},
|
||
|
|
||
|
getBackground: function getBackground() {
|
||
|
return background;
|
||
|
},
|
||
|
|
||
|
addStep: function addStep(step) {
|
||
|
var lastStep = self.getLastStep();
|
||
|
step.setPreviousStep(lastStep);
|
||
|
steps.add(step);
|
||
|
},
|
||
|
|
||
|
getLastStep: function getLastStep() {
|
||
|
return steps.getLast();
|
||
|
},
|
||
|
|
||
|
addTags: function setTags(newTags) {
|
||
|
tags = tags.concat(newTags);
|
||
|
},
|
||
|
|
||
|
getTags: function getTags() {
|
||
|
return tags;
|
||
|
},
|
||
|
|
||
|
acceptVisitor: function acceptVisitor(visitor, callback) {
|
||
|
self.instructVisitorToVisitBackgroundSteps(visitor, function() {
|
||
|
self.instructVisitorToVisitScenarioSteps(visitor, callback);
|
||
|
});
|
||
|
},
|
||
|
|
||
|
instructVisitorToVisitBackgroundSteps: function instructVisitorToVisitBackgroundSteps(visitor, callback) {
|
||
|
var background = self.getBackground();
|
||
|
if (typeof(background) != 'undefined') {
|
||
|
var steps = background.getSteps();
|
||
|
self.instructVisitorToVisitSteps(visitor, steps, callback);
|
||
|
} else {
|
||
|
callback();
|
||
|
}
|
||
|
},
|
||
|
|
||
|
instructVisitorToVisitScenarioSteps: function instructVisitorToVisitScenarioSteps(visitor, callback) {
|
||
|
self.instructVisitorToVisitSteps(visitor, steps, callback);
|
||
|
},
|
||
|
|
||
|
instructVisitorToVisitSteps: function instructVisitorToVisitSteps(visitor, steps, callback) {
|
||
|
steps.forEach(function(step, iterate) {
|
||
|
visitor.visitStep(step, iterate);
|
||
|
}, callback);
|
||
|
}
|
||
|
};
|
||
|
return self;
|
||
|
};
|
||
|
module.exports = Scenario;
|
||
|
|
||
|
});
|
||
|
|
||
|
require.define("/cucumber/ast/step.js", function (require, module, exports, __dirname, __filename) {
|
||
|
var Step = function(keyword, name, line) {
|
||
|
var Cucumber = require('../../cucumber');
|
||
|
var docString, dataTable, previousStep;
|
||
|
|
||
|
var self = {
|
||
|
setPreviousStep: function setPreviousStep(newPreviousStep) {
|
||
|
previousStep = newPreviousStep;
|
||
|
},
|
||
|
|
||
|
getKeyword: function getKeyword() {
|
||
|
return keyword;
|
||
|
},
|
||
|
|
||
|
getName: function getName() {
|
||
|
return name;
|
||
|
},
|
||
|
|
||
|
getLine: function getLine() {
|
||
|
return line;
|
||
|
},
|
||
|
|
||
|
getPreviousStep: function getPreviousStep() {
|
||
|
return previousStep;
|
||
|
},
|
||
|
|
||
|
hasPreviousStep: function hasPreviousStep() {
|
||
|
return !!previousStep;
|
||
|
},
|
||
|
|
||
|
getAttachment: function getAttachment() {
|
||
|
var attachment;
|
||
|
if (self.hasDocString()) {
|
||
|
attachment = self.getDocString();
|
||
|
} else if (self.hasDataTable()) {
|
||
|
attachment = self.getDataTable();
|
||
|
}
|
||
|
return attachment;
|
||
|
},
|
||
|
|
||
|
getDocString: function getDocString() { return docString; },
|
||
|
|
||
|
getDataTable: function getDataTable() { return dataTable; },
|
||
|
|
||
|
hasDocString: function hasDocString() {
|
||
|
return !!docString;
|
||
|
},
|
||
|
|
||
|
hasDataTable: function hasDataTable() {
|
||
|
return !!dataTable;
|
||
|
},
|
||
|
|
||
|
attachDocString: function attachDocString(_docString) { docString = _docString; },
|
||
|
|
||
|
attachDataTable: function attachDataTable(_dataTable) { dataTable = _dataTable; },
|
||
|
|
||
|
attachDataTableRow: function attachDataTableRow(row) {
|
||
|
self.ensureDataTableIsAttached();
|
||
|
var dataTable = self.getDataTable();
|
||
|
dataTable.attachRow(row);
|
||
|
},
|
||
|
|
||
|
ensureDataTableIsAttached: function ensureDataTableIsAttached() {
|
||
|
var dataTable = self.getDataTable();
|
||
|
if (!dataTable) {
|
||
|
dataTable = Cucumber.Ast.DataTable();
|
||
|
self.attachDataTable(dataTable);
|
||
|
}
|
||
|
},
|
||
|
|
||
|
isOutcomeStep: function isOutcomeStep() {
|
||
|
var isOutcomeStep =
|
||
|
self.hasOutcomeStepKeyword() || self.isRepeatingOutcomeStep();
|
||
|
return isOutcomeStep;
|
||
|
},
|
||
|
|
||
|
isEventStep: function isEventStep() {
|
||
|
var isEventStep =
|
||
|
self.hasEventStepKeyword() || self.isRepeatingEventStep();
|
||
|
return isEventStep;
|
||
|
},
|
||
|
|
||
|
hasOutcomeStepKeyword: function hasOutcomeStepKeyword() {
|
||
|
var hasOutcomeStepKeyword =
|
||
|
keyword == Step.OUTCOME_STEP_KEYWORD;
|
||
|
return hasOutcomeStepKeyword;
|
||
|
},
|
||
|
|
||
|
hasEventStepKeyword: function hasEventStepKeyword() {
|
||
|
var hasEventStepKeyword =
|
||
|
keyword == Step.EVENT_STEP_KEYWORD;
|
||
|
return hasEventStepKeyword;
|
||
|
},
|
||
|
|
||
|
isRepeatingOutcomeStep: function isRepeatingOutcomeStep() {
|
||
|
var isRepeatingOutcomeStep =
|
||
|
self.hasRepeatStepKeyword() && self.isPrecededByOutcomeStep();
|
||
|
return isRepeatingOutcomeStep;
|
||
|
},
|
||
|
|
||
|
isRepeatingEventStep: function isRepeatingEventStep() {
|
||
|
var isRepeatingEventStep =
|
||
|
self.hasRepeatStepKeyword() && self.isPrecededByEventStep();
|
||
|
return isRepeatingEventStep;
|
||
|
},
|
||
|
|
||
|
hasRepeatStepKeyword: function hasRepeatStepKeyword() {
|
||
|
var hasRepeatStepKeyword =
|
||
|
keyword == Step.AND_STEP_KEYWORD || keyword == Step.BUT_STEP_KEYWORD || keyword == Step.STAR_STEP_KEYWORD;
|
||
|
return hasRepeatStepKeyword;
|
||
|
},
|
||
|
|
||
|
isPrecededByOutcomeStep: function isPrecededByOutcomeStep() {
|
||
|
var isPrecededByOutcomeStep = false;
|
||
|
|
||
|
if (self.hasPreviousStep()) {
|
||
|
var previousStep = self.getPreviousStep();
|
||
|
var isPrecededByOutcomeStep = previousStep.isOutcomeStep();
|
||
|
}
|
||
|
return isPrecededByOutcomeStep;
|
||
|
},
|
||
|
|
||
|
isPrecededByEventStep: function isPrecededByEventStep() {
|
||
|
var isPrecededByEventStep = false;
|
||
|
|
||
|
if (self.hasPreviousStep()) {
|
||
|
var previousStep = self.getPreviousStep();
|
||
|
var isPrecededByEventStep = previousStep.isEventStep();
|
||
|
}
|
||
|
return isPrecededByEventStep;
|
||
|
},
|
||
|
|
||
|
acceptVisitor: function acceptVisitor(visitor, callback) {
|
||
|
self.execute(visitor, function(stepResult) {
|
||
|
visitor.visitStepResult(stepResult, callback);
|
||
|
});
|
||
|
},
|
||
|
|
||
|
execute: function execute(visitor, callback) {
|
||
|
var stepDefinition = visitor.lookupStepDefinitionByName(name);
|
||
|
var world = visitor.getWorld();
|
||
|
var attachment = self.getAttachment();
|
||
|
stepDefinition.invoke(name, world, attachment, callback);
|
||
|
}
|
||
|
};
|
||
|
return self;
|
||
|
};
|
||
|
Step.EVENT_STEP_KEYWORD = 'When ';
|
||
|
Step.OUTCOME_STEP_KEYWORD = 'Then ';
|
||
|
Step.AND_STEP_KEYWORD = 'And ';
|
||
|
Step.BUT_STEP_KEYWORD = 'But ';
|
||
|
Step.STAR_STEP_KEYWORD = '* ';
|
||
|
module.exports = Step;
|
||
|
|
||
|
});
|
||
|
|
||
|
require.define("/cucumber/ast/tag.js", function (require, module, exports, __dirname, __filename) {
|
||
|
var Tag = function(name, line) {
|
||
|
var Cucumber = require('../../cucumber');
|
||
|
|
||
|
var self = {
|
||
|
getName: function getName() {
|
||
|
return name;
|
||
|
}
|
||
|
};
|
||
|
return self;
|
||
|
};
|
||
|
module.exports = Tag;
|
||
|
});
|
||
|
|
||
|
require.define("/cucumber/debug.js", function (require, module, exports, __dirname, __filename) {
|
||
|
var Debug = {
|
||
|
TODO: function TODO(description) {
|
||
|
return function() { throw(new Error("IMPLEMENT ME: " + description)); };
|
||
|
},
|
||
|
|
||
|
warn: function warn(string, caption, level) {
|
||
|
if (Debug.isMessageLeveltoBeDisplayed(level))
|
||
|
process.stdout.write(Debug.warningString(string, caption));
|
||
|
},
|
||
|
|
||
|
notice: function notice(string, caption, level) {
|
||
|
if (Debug.isMessageLeveltoBeDisplayed(level))
|
||
|
process.stdout.write(Debug.noticeString(string, caption));
|
||
|
},
|
||
|
|
||
|
warningString: function warningString(string, caption) {
|
||
|
caption = caption || 'debug-warning';
|
||
|
return "\033[30;43m" + caption + ":\033[0m \033[33m" + string + "\033[0m"
|
||
|
},
|
||
|
|
||
|
noticeString: function noticeString(string, caption) {
|
||
|
caption = caption || 'debug-notice';
|
||
|
return "\033[30;46m" + caption + ":\033[0m \033[36m" + string + "\033[0m"
|
||
|
},
|
||
|
|
||
|
prefix: function prefix() {
|
||
|
return ;
|
||
|
},
|
||
|
|
||
|
isMessageLeveltoBeDisplayed: function isMessageLeveltoBeDisplayed(level) {
|
||
|
if (process.env) {
|
||
|
level = level || 3; // default level
|
||
|
return (level <= process.env['DEBUG_LEVEL']);
|
||
|
} else {
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
Debug.SimpleAstListener = require('./debug/simple_ast_listener');
|
||
|
module.exports = Debug;
|
||
|
|
||
|
});
|
||
|
|
||
|
require.define("/cucumber/debug/simple_ast_listener.js", function (require, module, exports, __dirname, __filename) {
|
||
|
var SimpleAstListener = function(options) {
|
||
|
var logs = '';
|
||
|
var failed = false;
|
||
|
var beforeEachScenarioCallbacks = [];
|
||
|
var currentStep;
|
||
|
|
||
|
if (!options)
|
||
|
var options = {};
|
||
|
|
||
|
var self = {
|
||
|
hear: function hear(event, callback) {
|
||
|
switch(event.getName()) {
|
||
|
case 'BeforeFeature':
|
||
|
self.hearBeforeFeature(event.getPayloadItem('feature'), callback);
|
||
|
break;
|
||
|
case 'BeforeScenario':
|
||
|
self.hearBeforeScenario(event.getPayloadItem('scenario'), callback);
|
||
|
break;
|
||
|
case 'BeforeStep':
|
||
|
self.hearBeforeStep(event.getPayloadItem('step'), callback);
|
||
|
break;
|
||
|
case 'StepResult':
|
||
|
self.hearStepResult(event.getPayloadItem('stepResult'), callback);
|
||
|
break;
|
||
|
default:
|
||
|
callback();
|
||
|
}
|
||
|
},
|
||
|
|
||
|
hearBeforeFeature: function hearBeforeFeature(feature, callback) {
|
||
|
log("Feature: " + feature.getName());
|
||
|
var description = feature.getDescription();
|
||
|
if (description != "")
|
||
|
log(description, 1);
|
||
|
callback();
|
||
|
},
|
||
|
|
||
|
hearBeforeScenario: function hearBeforeScenario(scenario, callback) {
|
||
|
beforeEachScenarioCallbacks.forEach(function(func) {
|
||
|
func();
|
||
|
});
|
||
|
log("");
|
||
|
log(scenario.getKeyword() + ": " + scenario.getName(), 1);
|
||
|
callback();
|
||
|
},
|
||
|
|
||
|
hearBeforeStep: function hearBeforeStep(step, callback) {
|
||
|
currentStep = step;
|
||
|
callback();
|
||
|
},
|
||
|
|
||
|
hearStepResult: function hearStepResult(stepResult, callback) {
|
||
|
log(currentStep.getKeyword() + currentStep.getName(), 2);
|
||
|
if (currentStep.hasDocString()) {
|
||
|
log('"""', 3);
|
||
|
log(currentStep.getDocString().getContents(), 3);
|
||
|
log('"""', 3);
|
||
|
};
|
||
|
callback();
|
||
|
},
|
||
|
|
||
|
getLogs: function getLogs() {
|
||
|
return logs;
|
||
|
},
|
||
|
|
||
|
featuresPassed: function featuresPassed() {
|
||
|
return !failed;
|
||
|
},
|
||
|
|
||
|
beforeEachScenarioDo: function beforeEachScenarioDo(func) {
|
||
|
beforeEachScenarioCallbacks.push(func);
|
||
|
}
|
||
|
};
|
||
|
return self;
|
||
|
|
||
|
function log(message, indentation) {
|
||
|
if (indentation)
|
||
|
message = indent(message, indentation);
|
||
|
logs = logs + message + "\n";
|
||
|
if (options['logToConsole'])
|
||
|
console.log(message);
|
||
|
if (typeof(options['logToFunction']) == 'function')
|
||
|
options['logToFunction'](message);
|
||
|
};
|
||
|
|
||
|
function indent(text, indentation) {
|
||
|
var indented;
|
||
|
text.split("\n").forEach(function(line) {
|
||
|
var prefix = new Array(indentation + 1).join(" ");
|
||
|
line = prefix + line;
|
||
|
indented = (typeof(indented) == 'undefined' ? line : indented + "\n" + line);
|
||
|
});
|
||
|
return indented;
|
||
|
};
|
||
|
};
|
||
|
module.exports = SimpleAstListener;
|
||
|
|
||
|
});
|
||
|
|
||
|
require.define("/cucumber/listener.js", function (require, module, exports, __dirname, __filename) {
|
||
|
var Listener = {};
|
||
|
Listener.ProgressFormatter = require('./listener/progress_formatter');
|
||
|
module.exports = Listener;
|
||
|
|
||
|
});
|
||
|
|
||
|
require.define("/cucumber/listener/progress_formatter.js", function (require, module, exports, __dirname, __filename) {
|
||
|
var ProgressFormatter = function(options) {
|
||
|
var Cucumber = require('../../cucumber');
|
||
|
|
||
|
var logs = "";
|
||
|
var failedScenarioLogBuffer = "";
|
||
|
var undefinedStepLogBuffer = "";
|
||
|
var passedScenarioCount = 0;
|
||
|
var undefinedScenarioCount = 0;
|
||
|
var pendingScenarioCount = 0;
|
||
|
var failedScenarioCount = 0;
|
||
|
var passedStepCount = 0;
|
||
|
var failedStepCount = 0;
|
||
|
var skippedStepCount = 0;
|
||
|
var undefinedStepCount = 0;
|
||
|
var pendingStepCount = 0;
|
||
|
var currentScenarioFailing = false;
|
||
|
var currentScenarioUndefined = false;
|
||
|
var currentScenarioPending = false;
|
||
|
var failedStepResults = Cucumber.Type.Collection();
|
||
|
|
||
|
if (!options)
|
||
|
options = {};
|
||
|
if (options['logToConsole'] == undefined)
|
||
|
options['logToConsole'] = true;
|
||
|
var self = {
|
||
|
log: function log(string) {
|
||
|
logs += string;
|
||
|
if (options['logToConsole'])
|
||
|
process.stdout.write(string);
|
||
|
if (typeof(options['logToFunction']) == 'function')
|
||
|
options['logToFunction'](string);
|
||
|
},
|
||
|
|
||
|
getLogs: function getLogs() {
|
||
|
return logs;
|
||
|
},
|
||
|
|
||
|
hear: function hear(event, callback) {
|
||
|
if (self.hasHandlerForEvent(event)) {
|
||
|
var handler = self.getHandlerForEvent(event);
|
||
|
handler(event, callback);
|
||
|
} else {
|
||
|
callback();
|
||
|
}
|
||
|
},
|
||
|
|
||
|
hasHandlerForEvent: function hasHandlerForEvent(event) {
|
||
|
var handlerName = self.buildHandlerNameForEvent(event);
|
||
|
return self[handlerName] != undefined;
|
||
|
},
|
||
|
|
||
|
buildHandlerNameForEvent: function buildHandlerNameForEvent(event) {
|
||
|
var handlerName =
|
||
|
ProgressFormatter.EVENT_HANDLER_NAME_PREFIX +
|
||
|
event.getName() +
|
||
|
ProgressFormatter.EVENT_HANDLER_NAME_SUFFIX;
|
||
|
return handlerName;
|
||
|
},
|
||
|
|
||
|
getHandlerForEvent: function getHandlerForEvent(event) {
|
||
|
var eventHandlerName = self.buildHandlerNameForEvent(event);
|
||
|
return self[eventHandlerName];
|
||
|
},
|
||
|
|
||
|
handleBeforeScenarioEvent: function handleBeforeScenarioEvent(event, callback) {
|
||
|
self.prepareBeforeScenario();
|
||
|
callback();
|
||
|
},
|
||
|
|
||
|
handleStepResultEvent: function handleStepResult(event, callback) {
|
||
|
var stepResult = event.getPayloadItem('stepResult');
|
||
|
if (stepResult.isSuccessful())
|
||
|
self.handleSuccessfulStepResult();
|
||
|
else if (stepResult.isPending())
|
||
|
self.handlePendingStepResult();
|
||
|
else if (stepResult.isSkipped())
|
||
|
self.handleSkippedStepResult();
|
||
|
else if (stepResult.isUndefined())
|
||
|
self.handleUndefinedStepResult(stepResult);
|
||
|
else
|
||
|
self.handleFailedStepResult(stepResult);
|
||
|
callback();
|
||
|
},
|
||
|
|
||
|
handleSuccessfulStepResult: function handleSuccessfulStepResult() {
|
||
|
self.witnessPassedStep();
|
||
|
self.log(ProgressFormatter.PASSED_STEP_CHARACTER);
|
||
|
},
|
||
|
|
||
|
handlePendingStepResult: function handlePendingStepResult() {
|
||
|
self.witnessPendingStep();
|
||
|
self.markCurrentScenarioAsPending();
|
||
|
self.log(ProgressFormatter.PENDING_STEP_CHARACTER);
|
||
|
},
|
||
|
|
||
|
handleSkippedStepResult: function handleSkippedStepResult() {
|
||
|
self.witnessSkippedStep();
|
||
|
self.log(ProgressFormatter.SKIPPED_STEP_CHARACTER);
|
||
|
},
|
||
|
|
||
|
handleUndefinedStepResult: function handleUndefinedStepResult(stepResult) {
|
||
|
var step = stepResult.getStep();
|
||
|
self.storeUndefinedStep(step);
|
||
|
self.witnessUndefinedStep();
|
||
|
self.markCurrentScenarioAsUndefined();
|
||
|
self.log(ProgressFormatter.UNDEFINED_STEP_CHARACTER);
|
||
|
},
|
||
|
|
||
|
handleFailedStepResult: function handleFailedStepResult(stepResult) {
|
||
|
self.storeFailedStepResult(stepResult);
|
||
|
self.witnessFailedStep();
|
||
|
self.markCurrentScenarioAsFailing();
|
||
|
self.log(ProgressFormatter.FAILED_STEP_CHARACTER);
|
||
|
},
|
||
|
|
||
|
handleAfterFeaturesEvent: function handleAfterFeaturesEvent(event, callback) {
|
||
|
self.logSummary();
|
||
|
callback();
|
||
|
},
|
||
|
|
||
|
handleAfterScenarioEvent: function handleAfterScenarioEvent(event, callback) {
|
||
|
if (self.isCurrentScenarioFailing()) {
|
||
|
var scenario = event.getPayloadItem('scenario');
|
||
|
self.storeFailedScenario(scenario);
|
||
|
self.witnessFailedScenario();
|
||
|
} else if (self.isCurrentScenarioUndefined()) {
|
||
|
self.witnessUndefinedScenario();
|
||
|
} else if (self.isCurrentScenarioPending()) {
|
||
|
self.witnessPendingScenario();
|
||
|
} else {
|
||
|
self.witnessPassedScenario();
|
||
|
}
|
||
|
callback();
|
||
|
},
|
||
|
|
||
|
prepareBeforeScenario: function prepareBeforeScenario() {
|
||
|
currentScenarioFailing = false;
|
||
|
currentScenarioPending = false;
|
||
|
currentScenarioUndefined = false;
|
||
|
},
|
||
|
|
||
|
markCurrentScenarioAsFailing: function markCurrentScenarioAsFailing() {
|
||
|
currentScenarioFailing = true;
|
||
|
},
|
||
|
|
||
|
markCurrentScenarioAsUndefined: function markCurrentScenarioAsUndefined() {
|
||
|
currentScenarioUndefined = true;
|
||
|
},
|
||
|
|
||
|
markCurrentScenarioAsPending: function markCurrentScenarioAsPending() {
|
||
|
currentScenarioPending = true;
|
||
|
},
|
||
|
|
||
|
isCurrentScenarioFailing: function isCurrentScenarioFailing() {
|
||
|
return currentScenarioFailing;
|
||
|
},
|
||
|
|
||
|
isCurrentScenarioUndefined: function isCurrentScenarioUndefined() {
|
||
|
return currentScenarioUndefined;
|
||
|
},
|
||
|
|
||
|
isCurrentScenarioPending: function isCurrentScenarioPending() {
|
||
|
return currentScenarioPending;
|
||
|
},
|
||
|
|
||
|
storeFailedStepResult: function storeFailedStepResult(failedStepResult) {
|
||
|
failedStepResults.add(failedStepResult);
|
||
|
},
|
||
|
|
||
|
storeFailedScenario: function storeFailedScenario(failedScenario) {
|
||
|
var name = failedScenario.getName();
|
||
|
var line = failedScenario.getLine();
|
||
|
self.appendStringToFailedScenarioLogBuffer(":" + line + " # Scenario: " + name);
|
||
|
},
|
||
|
|
||
|
storeUndefinedStep: function storeUndefinedStep(step) {
|
||
|
var snippetBuilder = Cucumber.SupportCode.StepDefinitionSnippetBuilder(step);
|
||
|
var snippet = snippetBuilder.buildSnippet();
|
||
|
self.appendStringToUndefinedStepLogBuffer(snippet);
|
||
|
},
|
||
|
|
||
|
appendStringToFailedScenarioLogBuffer: function appendStringToFailedScenarioLogBuffer(string) {
|
||
|
failedScenarioLogBuffer += string + "\n";
|
||
|
},
|
||
|
|
||
|
appendStringToUndefinedStepLogBuffer: function appendStringToUndefinedStepLogBuffer(string) {
|
||
|
if (undefinedStepLogBuffer.indexOf(string) == -1)
|
||
|
undefinedStepLogBuffer += string + "\n";
|
||
|
},
|
||
|
|
||
|
getFailedScenarioLogBuffer: function getFailedScenarioLogBuffer() {
|
||
|
return failedScenarioLogBuffer;
|
||
|
},
|
||
|
|
||
|
getUndefinedStepLogBuffer: function getUndefinedStepLogBuffer() {
|
||
|
return undefinedStepLogBuffer;
|
||
|
},
|
||
|
|
||
|
logSummary: function logSummary() {
|
||
|
self.log("\n\n");
|
||
|
if (self.witnessedAnyFailedStep())
|
||
|
self.logFailedStepResults();
|
||
|
self.logScenariosSummary();
|
||
|
self.logStepsSummary();
|
||
|
if (self.witnessedAnyUndefinedStep())
|
||
|
self.logUndefinedStepSnippets();
|
||
|
},
|
||
|
|
||
|
logFailedStepResults: function logFailedStepResults() {
|
||
|
self.log("(::) failed steps (::)\n\n");
|
||
|
failedStepResults.syncForEach(function(stepResult) {
|
||
|
self.logFailedStepResult(stepResult);
|
||
|
});
|
||
|
self.log("Failing scenarios:\n");
|
||
|
var failedScenarios = self.getFailedScenarioLogBuffer();
|
||
|
self.log(failedScenarios);
|
||
|
self.log("\n");
|
||
|
},
|
||
|
|
||
|
logFailedStepResult: function logFailedStepResult(stepResult) {
|
||
|
var failureMessage = stepResult.getFailureException();
|
||
|
self.log(failureMessage.stack || failureMessage);
|
||
|
self.log("\n\n");
|
||
|
},
|
||
|
|
||
|
logScenariosSummary: function logScenariosSummary() {
|
||
|
var scenarioCount = self.getScenarioCount();
|
||
|
var passedScenarioCount = self.getPassedScenarioCount();
|
||
|
var undefinedScenarioCount = self.getUndefinedScenarioCount();
|
||
|
var pendingScenarioCount = self.getPendingScenarioCount();
|
||
|
var failedScenarioCount = self.getFailedScenarioCount();
|
||
|
var details = [];
|
||
|
|
||
|
self.log(scenarioCount + " scenario" + (scenarioCount != 1 ? "s" : ""));
|
||
|
if (scenarioCount > 0 ) {
|
||
|
if (failedScenarioCount > 0)
|
||
|
details.push(failedScenarioCount + " failed");
|
||
|
if (undefinedScenarioCount > 0)
|
||
|
details.push(undefinedScenarioCount + " undefined");
|
||
|
if (pendingScenarioCount > 0)
|
||
|
details.push(pendingScenarioCount + " pending");
|
||
|
if (passedScenarioCount > 0)
|
||
|
details.push(passedScenarioCount + " passed");
|
||
|
self.log(" (" + details.join(', ') + ")");
|
||
|
}
|
||
|
self.log("\n");
|
||
|
},
|
||
|
|
||
|
logStepsSummary: function logStepsSummary() {
|
||
|
var stepCount = self.getStepCount();
|
||
|
var passedStepCount = self.getPassedStepCount();
|
||
|
var undefinedStepCount = self.getUndefinedStepCount();
|
||
|
var skippedStepCount = self.getSkippedStepCount();
|
||
|
var pendingStepCount = self.getPendingStepCount();
|
||
|
var failedStepCount = self.getFailedStepCount();
|
||
|
var details = [];
|
||
|
|
||
|
self.log(stepCount + " step" + (stepCount != 1 ? "s" : ""));
|
||
|
if (stepCount > 0) {
|
||
|
if (failedStepCount > 0)
|
||
|
details.push(failedStepCount + " failed");
|
||
|
if (undefinedStepCount > 0)
|
||
|
details.push(undefinedStepCount + " undefined");
|
||
|
if (pendingStepCount > 0)
|
||
|
details.push(pendingStepCount + " pending");
|
||
|
if (skippedStepCount > 0)
|
||
|
details.push(skippedStepCount + " skipped");
|
||
|
if (passedStepCount > 0)
|
||
|
details.push(passedStepCount + " passed");
|
||
|
self.log(" (" + details.join(', ') + ")");
|
||
|
}
|
||
|
self.log("\n");
|
||
|
},
|
||
|
|
||
|
logUndefinedStepSnippets: function logUndefinedStepSnippets() {
|
||
|
var undefinedStepLogBuffer = self.getUndefinedStepLogBuffer();
|
||
|
self.log("\nYou can implement step definitions for undefined steps with these snippets:\n\n");
|
||
|
self.log(undefinedStepLogBuffer);
|
||
|
},
|
||
|
|
||
|
witnessPassedScenario: function witnessPassedScenario() {
|
||
|
passedScenarioCount++;
|
||
|
},
|
||
|
|
||
|
witnessUndefinedScenario: function witnessUndefinedScenario() {
|
||
|
undefinedScenarioCount++;
|
||
|
},
|
||
|
|
||
|
witnessPendingScenario: function witnessPendingScenario() {
|
||
|
pendingScenarioCount++;
|
||
|
},
|
||
|
|
||
|
witnessFailedScenario: function witnessFailedScenario() {
|
||
|
failedScenarioCount++;
|
||
|
},
|
||
|
|
||
|
witnessPassedStep: function witnessPassedStep() {
|
||
|
passedStepCount++;
|
||
|
},
|
||
|
|
||
|
witnessUndefinedStep: function witnessUndefinedStep() {
|
||
|
undefinedStepCount++;
|
||
|
},
|
||
|
|
||
|
witnessPendingStep: function witnessPendingStep() {
|
||
|
pendingStepCount++;
|
||
|
},
|
||
|
|
||
|
witnessFailedStep: function witnessFailedStep() {
|
||
|
failedStepCount++;
|
||
|
},
|
||
|
|
||
|
witnessSkippedStep: function witnessSkippedStep() {
|
||
|
skippedStepCount++;
|
||
|
},
|
||
|
|
||
|
getScenarioCount: function getScenarioCount() {
|
||
|
var scenarioCount =
|
||
|
self.getPassedScenarioCount() +
|
||
|
self.getUndefinedScenarioCount() +
|
||
|
self.getPendingScenarioCount() +
|
||
|
self.getFailedScenarioCount();
|
||
|
return scenarioCount;
|
||
|
},
|
||
|
|
||
|
getPassedScenarioCount: function getPassedScenarioCount() {
|
||
|
return passedScenarioCount;
|
||
|
},
|
||
|
|
||
|
getUndefinedScenarioCount: function getUndefinedScenarioCount() {
|
||
|
return undefinedScenarioCount;
|
||
|
},
|
||
|
|
||
|
getPendingScenarioCount: function getPendingScenarioCount() {
|
||
|
return pendingScenarioCount;
|
||
|
},
|
||
|
|
||
|
getFailedScenarioCount: function getFailedScenarioCount() {
|
||
|
return failedScenarioCount;
|
||
|
},
|
||
|
|
||
|
getStepCount: function getStepCount() {
|
||
|
var stepCount =
|
||
|
self.getPassedStepCount() +
|
||
|
self.getUndefinedStepCount() +
|
||
|
self.getSkippedStepCount() +
|
||
|
self.getPendingStepCount() +
|
||
|
self.getFailedStepCount();
|
||
|
return stepCount;
|
||
|
},
|
||
|
|
||
|
getPassedStepCount: function getPassedStepCount() {
|
||
|
return passedStepCount;
|
||
|
},
|
||
|
|
||
|
getPendingStepCount: function getPendingStepCount() {
|
||
|
return pendingStepCount;
|
||
|
},
|
||
|
|
||
|
getFailedStepCount: function getFailedStepCount() {
|
||
|
return failedStepCount;
|
||
|
},
|
||
|
|
||
|
getSkippedStepCount: function getSkippedStepCount() {
|
||
|
return skippedStepCount;
|
||
|
},
|
||
|
|
||
|
getUndefinedStepCount: function getUndefinedStepCount() {
|
||
|
return undefinedStepCount;
|
||
|
},
|
||
|
|
||
|
witnessedAnyFailedStep: function witnessedAnyFailedStep() {
|
||
|
return failedStepCount > 0;
|
||
|
},
|
||
|
|
||
|
witnessedAnyUndefinedStep: function witnessedAnyUndefinedStep() {
|
||
|
return undefinedStepCount > 0;
|
||
|
}
|
||
|
};
|
||
|
return self;
|
||
|
};
|
||
|
ProgressFormatter.PASSED_STEP_CHARACTER = '.';
|
||
|
ProgressFormatter.SKIPPED_STEP_CHARACTER = '-';
|
||
|
ProgressFormatter.UNDEFINED_STEP_CHARACTER = 'U';
|
||
|
ProgressFormatter.PENDING_STEP_CHARACTER = 'P';
|
||
|
ProgressFormatter.FAILED_STEP_CHARACTER = 'F';
|
||
|
ProgressFormatter.EVENT_HANDLER_NAME_PREFIX = 'handle';
|
||
|
ProgressFormatter.EVENT_HANDLER_NAME_SUFFIX = 'Event';
|
||
|
module.exports = ProgressFormatter;
|
||
|
|
||
|
});
|
||
|
|
||
|
require.define("/cucumber/parser.js", function (require, module, exports, __dirname, __filename) {
|
||
|
var Parser = function(featureSources, astFilter) {
|
||
|
var Gherkin = require('gherkin');
|
||
|
var Cucumber = require('../cucumber');
|
||
|
|
||
|
var features = Cucumber.Ast.Features();
|
||
|
var astAssembler = Cucumber.Ast.Assembler(features, astFilter);
|
||
|
|
||
|
var self = {
|
||
|
parse: function parse() {
|
||
|
var Lexer = Gherkin.Lexer('en');
|
||
|
var lexer = new Lexer(self.getEventHandlers());
|
||
|
for (i in featureSources) {
|
||
|
var featureSource = featureSources[i][Parser.FEATURE_NAME_SOURCE_PAIR_SOURCE_INDEX];
|
||
|
lexer.scan(featureSource);
|
||
|
}
|
||
|
return features;
|
||
|
},
|
||
|
|
||
|
getEventHandlers: function getEventHandlers() {
|
||
|
return {
|
||
|
background: self.handleBackground,
|
||
|
comment: self.handleComment,
|
||
|
doc_string: self.handleDocString,
|
||
|
eof: self.handleEof,
|
||
|
feature: self.handleFeature,
|
||
|
row: self.handleDataTableRow,
|
||
|
scenario: self.handleScenario,
|
||
|
step: self.handleStep,
|
||
|
tag: self.handleTag
|
||
|
};
|
||
|
},
|
||
|
|
||
|
handleTag: function handleTag(tag, line) {
|
||
|
var tag = Cucumber.Ast.Tag(tag, line);
|
||
|
astAssembler.insertTag(tag);
|
||
|
},
|
||
|
|
||
|
handleBackground: function handleBackground(keyword, name, description, line) {
|
||
|
var background = Cucumber.Ast.Background(keyword, name, description, line);
|
||
|
astAssembler.insertBackground(background);
|
||
|
},
|
||
|
|
||
|
handleComment: function handleComment() {},
|
||
|
|
||
|
handleDocString: function handleDocString(contentType, string, line) {
|
||
|
var docString = Cucumber.Ast.DocString(contentType, string, line);
|
||
|
astAssembler.insertDocString(docString);
|
||
|
},
|
||
|
|
||
|
handleEof: function handleEof() {},
|
||
|
|
||
|
handleFeature: function handleFeature(keyword, name, description, line) {
|
||
|
var feature = Cucumber.Ast.Feature(keyword, name, description, line);
|
||
|
astAssembler.insertFeature(feature);
|
||
|
},
|
||
|
|
||
|
handleDataTableRow: function handleDataTableRow(cells, line) {
|
||
|
var dataTableRow = Cucumber.Ast.DataTable.Row(cells, line);
|
||
|
astAssembler.insertDataTableRow(dataTableRow);
|
||
|
},
|
||
|
|
||
|
handleScenario: function handleScenario(keyword, name, description, line) {
|
||
|
var scenario = Cucumber.Ast.Scenario(keyword, name, description, line);
|
||
|
astAssembler.insertScenario(scenario);
|
||
|
},
|
||
|
|
||
|
handleStep: function handleStep(keyword, name, line) {
|
||
|
var step = Cucumber.Ast.Step(keyword, name, line);
|
||
|
astAssembler.insertStep(step);
|
||
|
}
|
||
|
};
|
||
|
return self;
|
||
|
};
|
||
|
Parser.FEATURE_NAME_SOURCE_PAIR_SOURCE_INDEX = 1;
|
||
|
module.exports = Parser;
|
||
|
|
||
|
});
|
||
|
|
||
|
require.define("/node_modules/gherkin/package.json", function (require, module, exports, __dirname, __filename) {
|
||
|
module.exports = {"main":"./lib/gherkin"}
|
||
|
});
|
||
|
|
||
|
require.define("/node_modules/gherkin/lib/gherkin.js", function (require, module, exports, __dirname, __filename) {
|
||
|
exports.Lexer = function(lang) {
|
||
|
return require('./gherkin/lexer/' + lang).Lexer;
|
||
|
};
|
||
|
|
||
|
exports.connect = function(path) {
|
||
|
var gherkinFiles = require('connect').static(__dirname);
|
||
|
|
||
|
return function(req, res, next) {
|
||
|
if(req.url.indexOf(path) == 0) {
|
||
|
req.url = req.url.slice(path.length);
|
||
|
gherkinFiles(req, res, next);
|
||
|
} else {
|
||
|
next();
|
||
|
}
|
||
|
};
|
||
|
};
|
||
|
});
|
||
|
|
||
|
require.define("/cucumber/runtime.js", function (require, module, exports, __dirname, __filename) {
|
||
|
var Runtime = function(configuration) {
|
||
|
var Cucumber = require('../cucumber');
|
||
|
|
||
|
var listeners = Cucumber.Type.Collection();
|
||
|
|
||
|
var self = {
|
||
|
start: function start(callback) {
|
||
|
if (typeof(callback) !== 'function')
|
||
|
throw new Error(Runtime.START_MISSING_CALLBACK_ERROR);
|
||
|
var features = self.getFeatures();
|
||
|
var supportCodeLibrary = self.getSupportCodeLibrary();
|
||
|
var astTreeWalker = Runtime.AstTreeWalker(features, supportCodeLibrary, listeners);
|
||
|
astTreeWalker.walk(callback);
|
||
|
},
|
||
|
|
||
|
attachListener: function attachListener(listener) {
|
||
|
listeners.add(listener);
|
||
|
},
|
||
|
|
||
|
getFeatures: function getFeatures() {
|
||
|
var featureSources = configuration.getFeatureSources();
|
||
|
var astFilter = configuration.getAstFilter();
|
||
|
var parser = Cucumber.Parser(featureSources, astFilter);
|
||
|
var features = parser.parse();
|
||
|
return features;
|
||
|
},
|
||
|
|
||
|
getSupportCodeLibrary: function getSupportCodeLibrary() {
|
||
|
var supportCodeLibrary = configuration.getSupportCodeLibrary();
|
||
|
return supportCodeLibrary;
|
||
|
}
|
||
|
};
|
||
|
return self;
|
||
|
};
|
||
|
Runtime.START_MISSING_CALLBACK_ERROR = "Cucumber.Runtime.start() expects a callback";
|
||
|
Runtime.AstTreeWalker = require('./runtime/ast_tree_walker');
|
||
|
Runtime.SuccessfulStepResult = require('./runtime/successful_step_result');
|
||
|
Runtime.PendingStepResult = require('./runtime/pending_step_result');
|
||
|
Runtime.FailedStepResult = require('./runtime/failed_step_result');
|
||
|
Runtime.SkippedStepResult = require('./runtime/skipped_step_result');
|
||
|
Runtime.UndefinedStepResult = require('./runtime/undefined_step_result');
|
||
|
module.exports = Runtime;
|
||
|
|
||
|
});
|
||
|
|
||
|
require.define("/cucumber/runtime/ast_tree_walker.js", function (require, module, exports, __dirname, __filename) {
|
||
|
var AstTreeWalker = function(features, supportCodeLibrary, listeners) {
|
||
|
var Cucumber = require('../../cucumber');
|
||
|
|
||
|
var listeners;
|
||
|
var world;
|
||
|
var allFeaturesSucceded = true;
|
||
|
var skippingSteps = false;
|
||
|
|
||
|
var self = {
|
||
|
walk: function walk(callback) {
|
||
|
self.visitFeatures(features, function() {
|
||
|
var featuresResult = self.didAllFeaturesSucceed();
|
||
|
callback(featuresResult);
|
||
|
});
|
||
|
},
|
||
|
|
||
|
visitFeatures: function visitFeatures(features, callback) {
|
||
|
var event = AstTreeWalker.Event(AstTreeWalker.FEATURES_EVENT_NAME);
|
||
|
self.broadcastEventAroundUserFunction(
|
||
|
event,
|
||
|
function(callback) { features.acceptVisitor(self, callback); },
|
||
|
callback
|
||
|
);
|
||
|
},
|
||
|
|
||
|
visitFeature: function visitFeature(feature, callback) {
|
||
|
var payload = { feature: feature };
|
||
|
var event = AstTreeWalker.Event(AstTreeWalker.FEATURE_EVENT_NAME, payload);
|
||
|
self.broadcastEventAroundUserFunction(
|
||
|
event,
|
||
|
function(callback) { feature.acceptVisitor(self, callback); },
|
||
|
callback
|
||
|
);
|
||
|
},
|
||
|
|
||
|
visitBackground: function visitBackground(background, callback) {
|
||
|
var payload = { background: background };
|
||
|
var event = AstTreeWalker.Event(AstTreeWalker.BACKGROUND_EVENT_NAME, payload);
|
||
|
self.broadcastEvent(event, callback);
|
||
|
},
|
||
|
|
||
|
visitScenario: function visitScenario(scenario, callback) {
|
||
|
supportCodeLibrary.instantiateNewWorld(function(world) {
|
||
|
self.setWorld(world);
|
||
|
self.witnessNewScenario();
|
||
|
var payload = { scenario: scenario };
|
||
|
var event = AstTreeWalker.Event(AstTreeWalker.SCENARIO_EVENT_NAME, payload);
|
||
|
var hookedUpScenarioVisit = supportCodeLibrary.hookUpFunction(
|
||
|
function(callback) { scenario.acceptVisitor(self, callback); },
|
||
|
scenario,
|
||
|
world
|
||
|
);
|
||
|
self.broadcastEventAroundUserFunction(
|
||
|
event,
|
||
|
hookedUpScenarioVisit,
|
||
|
callback
|
||
|
);
|
||
|
});
|
||
|
},
|
||
|
|
||
|
visitStep: function visitStep(step, callback) {
|
||
|
var payload = { step: step };
|
||
|
var event = AstTreeWalker.Event(AstTreeWalker.STEP_EVENT_NAME, payload);
|
||
|
self.broadcastEventAroundUserFunction(
|
||
|
event,
|
||
|
function(callback) {
|
||
|
self.processStep(step, callback);
|
||
|
},
|
||
|
callback
|
||
|
);
|
||
|
},
|
||
|
|
||
|
visitStepResult: function visitStepResult(stepResult, callback) {
|
||
|
if (stepResult.isFailed())
|
||
|
self.witnessFailedStep();
|
||
|
else if (stepResult.isPending())
|
||
|
self.witnessPendingStep();
|
||
|
var payload = { stepResult: stepResult };
|
||
|
var event = AstTreeWalker.Event(AstTreeWalker.STEP_RESULT_EVENT_NAME, payload);
|
||
|
self.broadcastEvent(event, callback);
|
||
|
},
|
||
|
|
||
|
broadcastEventAroundUserFunction: function broadcastEventAroundUserFunction(event, userFunction, callback) {
|
||
|
var userFunctionWrapper = self.wrapUserFunctionAndAfterEventBroadcast(userFunction, event, callback);
|
||
|
self.broadcastBeforeEvent(event, userFunctionWrapper);
|
||
|
},
|
||
|
|
||
|
wrapUserFunctionAndAfterEventBroadcast: function wrapUserFunctionAndAfterEventBroadcast(userFunction, event, callback) {
|
||
|
var callAfterEventBroadcast = self.wrapAfterEventBroadcast(event, callback);
|
||
|
return function callUserFunctionAndBroadcastAfterEvent() {
|
||
|
userFunction(callAfterEventBroadcast);
|
||
|
};
|
||
|
},
|
||
|
|
||
|
wrapAfterEventBroadcast: function wrapAfterEventBroadcast(event, callback) {
|
||
|
return function() { self.broadcastAfterEvent(event, callback); };
|
||
|
},
|
||
|
|
||
|
broadcastBeforeEvent: function broadcastBeforeEvent(event, callback) {
|
||
|
var preEvent = event.replicateAsPreEvent();
|
||
|
self.broadcastEvent(preEvent, callback);
|
||
|
},
|
||
|
|
||
|
broadcastAfterEvent: function broadcastAfterEvent(event, callback) {
|
||
|
var postEvent = event.replicateAsPostEvent();
|
||
|
self.broadcastEvent(postEvent, callback);
|
||
|
},
|
||
|
|
||
|
broadcastEvent: function broadcastEvent(event, callback) {
|
||
|
listeners.forEach(
|
||
|
function(listener, callback) { listener.hear(event, callback); },
|
||
|
callback
|
||
|
);
|
||
|
},
|
||
|
|
||
|
lookupStepDefinitionByName: function lookupStepDefinitionByName(stepName) {
|
||
|
return supportCodeLibrary.lookupStepDefinitionByName(stepName);
|
||
|
},
|
||
|
|
||
|
setWorld: function setWorld(newWorld) {
|
||
|
world = newWorld;
|
||
|
},
|
||
|
|
||
|
getWorld: function getWorld() {
|
||
|
return world;
|
||
|
},
|
||
|
|
||
|
isStepUndefined: function isStepUndefined(step) {
|
||
|
var stepName = step.getName();
|
||
|
return !supportCodeLibrary.isStepDefinitionNameDefined(stepName);
|
||
|
},
|
||
|
|
||
|
didAllFeaturesSucceed: function didAllFeaturesSucceed() {
|
||
|
return allFeaturesSucceded;
|
||
|
},
|
||
|
|
||
|
witnessFailedStep: function witnessFailedStep() {
|
||
|
allFeaturesSucceded = false;
|
||
|
skippingSteps = true;
|
||
|
},
|
||
|
|
||
|
witnessPendingStep: function witnessPendingStep() {
|
||
|
skippingSteps = true;
|
||
|
},
|
||
|
|
||
|
witnessUndefinedStep: function witnessUndefinedStep() {
|
||
|
skippingSteps = true;
|
||
|
},
|
||
|
|
||
|
witnessNewScenario: function witnessNewScenario() {
|
||
|
skippingSteps = false;
|
||
|
},
|
||
|
|
||
|
isSkippingSteps: function isSkippingSteps() {
|
||
|
return skippingSteps;
|
||
|
},
|
||
|
|
||
|
processStep: function processStep(step, callback) {
|
||
|
if (self.isStepUndefined(step)) {
|
||
|
self.witnessUndefinedStep();
|
||
|
self.skipUndefinedStep(step, callback);
|
||
|
} else if (self.isSkippingSteps()) {
|
||
|
self.skipStep(step, callback);
|
||
|
} else {
|
||
|
self.executeStep(step, callback);
|
||
|
}
|
||
|
},
|
||
|
|
||
|
executeStep: function executeStep(step, callback) {
|
||
|
step.acceptVisitor(self, callback);
|
||
|
},
|
||
|
|
||
|
skipStep: function skipStep(step, callback) {
|
||
|
var skippedStepResult = Cucumber.Runtime.SkippedStepResult({step: step});
|
||
|
var payload = { stepResult: skippedStepResult };
|
||
|
var event = AstTreeWalker.Event(AstTreeWalker.STEP_RESULT_EVENT_NAME, payload);
|
||
|
self.broadcastEvent(event, callback);
|
||
|
},
|
||
|
|
||
|
skipUndefinedStep: function skipUndefinedStep(step, callback) {
|
||
|
var undefinedStepResult = Cucumber.Runtime.UndefinedStepResult({step: step});
|
||
|
var payload = { stepResult: undefinedStepResult };
|
||
|
var event = AstTreeWalker.Event(AstTreeWalker.STEP_RESULT_EVENT_NAME, payload);
|
||
|
self.broadcastEvent(event, callback);
|
||
|
}
|
||
|
};
|
||
|
return self;
|
||
|
};
|
||
|
AstTreeWalker.FEATURES_EVENT_NAME = 'Features';
|
||
|
AstTreeWalker.FEATURE_EVENT_NAME = 'Feature';
|
||
|
AstTreeWalker.BACKGROUND_EVENT_NAME = 'Background';
|
||
|
AstTreeWalker.SCENARIO_EVENT_NAME = 'Scenario';
|
||
|
AstTreeWalker.STEP_EVENT_NAME = 'Step';
|
||
|
AstTreeWalker.STEP_RESULT_EVENT_NAME = 'StepResult';
|
||
|
AstTreeWalker.BEFORE_EVENT_NAME_PREFIX = 'Before';
|
||
|
AstTreeWalker.AFTER_EVENT_NAME_PREFIX = 'After';
|
||
|
AstTreeWalker.NON_EVENT_LEADING_PARAMETERS_COUNT = 0;
|
||
|
AstTreeWalker.NON_EVENT_TRAILING_PARAMETERS_COUNT = 2;
|
||
|
AstTreeWalker.Event = require('./ast_tree_walker/event');
|
||
|
module.exports = AstTreeWalker;
|
||
|
|
||
|
});
|
||
|
|
||
|
require.define("/cucumber/runtime/ast_tree_walker/event.js", function (require, module, exports, __dirname, __filename) {
|
||
|
var Event = function(name, payload) {
|
||
|
var AstTreeWalker = require('../ast_tree_walker');
|
||
|
|
||
|
var self = {
|
||
|
getName: function getName() {
|
||
|
return name;
|
||
|
},
|
||
|
|
||
|
getPayloadItem: function getPayloadItem(itemName) {
|
||
|
return payload[itemName];
|
||
|
},
|
||
|
|
||
|
replicateAsPreEvent: function replicateAsPreEvent() {
|
||
|
var newName = buildBeforeEventName(name);
|
||
|
return AstTreeWalker.Event(newName, payload);
|
||
|
},
|
||
|
|
||
|
replicateAsPostEvent: function replicateAsPostEvent() {
|
||
|
var newName = buildAfterEventName(name);
|
||
|
return AstTreeWalker.Event(newName, payload);
|
||
|
},
|
||
|
|
||
|
occurredOn: function occurredOn(eventName) {
|
||
|
return eventName == name;
|
||
|
},
|
||
|
|
||
|
occurredAfter: function occurredAfter(eventName) {
|
||
|
var afterEventName = buildAfterEventName(eventName);
|
||
|
return afterEventName == name;
|
||
|
}
|
||
|
};
|
||
|
|
||
|
function buildBeforeEventName(eventName) {
|
||
|
return AstTreeWalker.BEFORE_EVENT_NAME_PREFIX + eventName;
|
||
|
}
|
||
|
|
||
|
function buildAfterEventName(eventName) {
|
||
|
return AstTreeWalker.AFTER_EVENT_NAME_PREFIX + eventName;
|
||
|
}
|
||
|
|
||
|
return self;
|
||
|
};
|
||
|
module.exports = Event;
|
||
|
|
||
|
});
|
||
|
|
||
|
require.define("/cucumber/runtime/successful_step_result.js", function (require, module, exports, __dirname, __filename) {
|
||
|
var SuccessfulStepResult = function() {
|
||
|
var self = {
|
||
|
isFailed: function isFailed() { return false; },
|
||
|
isPending: function isPending() { return false; },
|
||
|
isSkipped: function isSkipped() { return false; },
|
||
|
isSuccessful: function isSuccessful() { return true; },
|
||
|
isUndefined: function isUndefined() { return false; }
|
||
|
};
|
||
|
return self;
|
||
|
};
|
||
|
module.exports = SuccessfulStepResult;
|
||
|
|
||
|
});
|
||
|
|
||
|
require.define("/cucumber/runtime/pending_step_result.js", function (require, module, exports, __dirname, __filename) {
|
||
|
var PendingStepResult = function() {
|
||
|
var self = {
|
||
|
isFailed: function isFailed() { return false; },
|
||
|
isPending: function isPending() { return true; },
|
||
|
isSkipped: function isSkipped() { return false; },
|
||
|
isSuccessful: function isSuccessful() { return false; },
|
||
|
isUndefined: function isUndefined() { return false; }
|
||
|
};
|
||
|
return self;
|
||
|
};
|
||
|
module.exports = PendingStepResult;
|
||
|
|
||
|
});
|
||
|
|
||
|
require.define("/cucumber/runtime/failed_step_result.js", function (require, module, exports, __dirname, __filename) {
|
||
|
var FailedStepResult = function(failureException) {
|
||
|
var self = {
|
||
|
isFailed: function isFailed() { return true; },
|
||
|
isPending: function isPending() { return false; },
|
||
|
isSkipped: function isSkipped() { return false; },
|
||
|
isSuccessful: function isSuccessful() { return false; },
|
||
|
isUndefined: function isUndefined() { return false; },
|
||
|
|
||
|
getFailureException: function getFailureException() {
|
||
|
return failureException;
|
||
|
}
|
||
|
};
|
||
|
return self;
|
||
|
};
|
||
|
module.exports = FailedStepResult;
|
||
|
|
||
|
});
|
||
|
|
||
|
require.define("/cucumber/runtime/skipped_step_result.js", function (require, module, exports, __dirname, __filename) {
|
||
|
var SkippedStepResult = function(payload) {
|
||
|
var self = {
|
||
|
isFailed: function isFailed() { return false; },
|
||
|
isPending: function isPending() { return false; },
|
||
|
isSkipped: function isSkipped() { return true; },
|
||
|
isSuccessful: function isSuccessful() { return false; },
|
||
|
isUndefined: function isUndefined() { return false; },
|
||
|
|
||
|
getStep: function getStep() {
|
||
|
return payload['step'];
|
||
|
}
|
||
|
};
|
||
|
return self;
|
||
|
};
|
||
|
module.exports = SkippedStepResult;
|
||
|
|
||
|
});
|
||
|
|
||
|
require.define("/cucumber/runtime/undefined_step_result.js", function (require, module, exports, __dirname, __filename) {
|
||
|
var UndefinedStepResult = function(payload) {
|
||
|
var self = {
|
||
|
isFailed: function isFailed() { return false; },
|
||
|
isPending: function isPending() { return false; },
|
||
|
isSkipped: function isSkipped() { return false; },
|
||
|
isSuccessful: function isSuccessful() { return false; },
|
||
|
isUndefined: function isUndefined() { return true; },
|
||
|
|
||
|
getStep: function getStep() {
|
||
|
return payload['step'];
|
||
|
}
|
||
|
};
|
||
|
return self;
|
||
|
};
|
||
|
module.exports = UndefinedStepResult;
|
||
|
|
||
|
});
|
||
|
|
||
|
require.define("/cucumber/support_code.js", function (require, module, exports, __dirname, __filename) {
|
||
|
var SupportCode = {};
|
||
|
SupportCode.Hook = require('./support_code/hook');
|
||
|
SupportCode.Library = require('./support_code/library');
|
||
|
SupportCode.StepDefinition = require('./support_code/step_definition');
|
||
|
SupportCode.StepDefinitionSnippetBuilder = require('./support_code/step_definition_snippet_builder');
|
||
|
SupportCode.WorldConstructor = require('./support_code/world_constructor');
|
||
|
module.exports = SupportCode;
|
||
|
|
||
|
});
|
||
|
|
||
|
require.define("/cucumber/support_code/hook.js", function (require, module, exports, __dirname, __filename) {
|
||
|
var _ = require('underscore');
|
||
|
|
||
|
var Hook = function(code, options) {
|
||
|
var Cucumber = require('../../cucumber');
|
||
|
|
||
|
var tags = options['tags'] || [];
|
||
|
|
||
|
var self = {
|
||
|
invokeBesideScenario: function invokeBesideScenario(scenario, world, callback) {
|
||
|
if (self.appliesToScenario(scenario))
|
||
|
code.call(world, callback);
|
||
|
else
|
||
|
callback(function(endPostScenarioAroundHook) { endPostScenarioAroundHook(); });
|
||
|
},
|
||
|
|
||
|
appliesToScenario: function appliesToScenario(scenario) {
|
||
|
var astFilter = self.getAstFilter();
|
||
|
return astFilter.isScenarioEnrolled(scenario);
|
||
|
},
|
||
|
|
||
|
getAstFilter: function getAstFilter() {
|
||
|
var tagGroups = Cucumber.TagGroupParser.getTagGroupsFromStrings(tags);
|
||
|
var rules = _.map(tagGroups, function(tagGroup) {
|
||
|
var rule = Cucumber.Ast.Filter.AnyOfTagsRule(tagGroup);
|
||
|
return rule;
|
||
|
});
|
||
|
var astFilter = Cucumber.Ast.Filter(rules);
|
||
|
return astFilter;
|
||
|
}
|
||
|
};
|
||
|
return self;
|
||
|
};
|
||
|
module.exports = Hook;
|
||
|
|
||
|
});
|
||
|
|
||
|
require.define("/cucumber/support_code/library.js", function (require, module, exports, __dirname, __filename) {
|
||
|
var Library = function(supportCodeDefinition) {
|
||
|
var MISSING_WORLD_INSTANCE_ERROR = "World constructor called back without World instance.";
|
||
|
var Cucumber = require('../../cucumber');
|
||
|
|
||
|
var stepDefinitions = Cucumber.Type.Collection();
|
||
|
var hooker = Cucumber.SupportCode.Library.Hooker();
|
||
|
var worldConstructor = Cucumber.SupportCode.WorldConstructor();
|
||
|
|
||
|
var self = {
|
||
|
lookupStepDefinitionByName: function lookupStepDefinitionByName(name) {
|
||
|
var matchingStepDefinition;
|
||
|
|
||
|
stepDefinitions.syncForEach(function(stepDefinition) {
|
||
|
if (stepDefinition.matchesStepName(name)) {
|
||
|
matchingStepDefinition = stepDefinition;
|
||
|
}
|
||
|
});
|
||
|
return matchingStepDefinition;
|
||
|
},
|
||
|
|
||
|
isStepDefinitionNameDefined: function isStepDefinitionNameDefined(name) {
|
||
|
var stepDefinition = self.lookupStepDefinitionByName(name);
|
||
|
return (stepDefinition != undefined);
|
||
|
},
|
||
|
|
||
|
hookUpFunction: function hookUpFunction(userFunction, scenario, world) {
|
||
|
var hookedUpFunction = hooker.hookUpFunction(userFunction, scenario, world);
|
||
|
return hookedUpFunction;
|
||
|
},
|
||
|
|
||
|
defineAroundHook: function defineAroundHook() {
|
||
|
var tagGroupStrings = Cucumber.Util.Arguments(arguments);
|
||
|
var code = tagGroupStrings.pop();
|
||
|
hooker.addAroundHookCode(code, {tags: tagGroupStrings});
|
||
|
},
|
||
|
|
||
|
defineBeforeHook: function defineBeforeHook() {
|
||
|
var tagGroupStrings = Cucumber.Util.Arguments(arguments);
|
||
|
var code = tagGroupStrings.pop();
|
||
|
hooker.addBeforeHookCode(code, {tags: tagGroupStrings});
|
||
|
},
|
||
|
|
||
|
defineAfterHook: function defineAfterHook() {
|
||
|
var tagGroupStrings = Cucumber.Util.Arguments(arguments);
|
||
|
var code = tagGroupStrings.pop();
|
||
|
hooker.addAfterHookCode(code, {tags: tagGroupStrings});
|
||
|
},
|
||
|
|
||
|
defineStep: function defineStep(name, code) {
|
||
|
var stepDefinition = Cucumber.SupportCode.StepDefinition(name, code);
|
||
|
stepDefinitions.add(stepDefinition);
|
||
|
},
|
||
|
|
||
|
instantiateNewWorld: function instantiateNewWorld(callback) {
|
||
|
new worldConstructor(function(world) {
|
||
|
if (!world) {
|
||
|
throw new Error(MISSING_WORLD_INSTANCE_ERROR);
|
||
|
}
|
||
|
process.nextTick(function() { // release the constructor
|
||
|
callback(world);
|
||
|
});
|
||
|
});
|
||
|
}
|
||
|
};
|
||
|
|
||
|
var supportCodeHelper = {
|
||
|
Around : self.defineAroundHook,
|
||
|
Before : self.defineBeforeHook,
|
||
|
After : self.defineAfterHook,
|
||
|
Given : self.defineStep,
|
||
|
When : self.defineStep,
|
||
|
Then : self.defineStep,
|
||
|
defineStep : self.defineStep,
|
||
|
World : worldConstructor
|
||
|
};
|
||
|
supportCodeDefinition.call(supportCodeHelper);
|
||
|
worldConstructor = supportCodeHelper.World;
|
||
|
|
||
|
return self;
|
||
|
};
|
||
|
Library.Hooker = require('./library/hooker');
|
||
|
module.exports = Library;
|
||
|
|
||
|
});
|
||
|
|
||
|
require.define("/cucumber/support_code/library/hooker.js", function (require, module, exports, __dirname, __filename) {
|
||
|
var Hooker = function() {
|
||
|
var Cucumber = require('../../../cucumber');
|
||
|
|
||
|
var aroundHooks = Cucumber.Type.Collection();
|
||
|
var beforeHooks = Cucumber.Type.Collection();
|
||
|
var afterHooks = Cucumber.Type.Collection();
|
||
|
|
||
|
var self = {
|
||
|
addAroundHookCode: function addAroundHookCode(code, options) {
|
||
|
var aroundHook = Cucumber.SupportCode.Hook(code, options);
|
||
|
aroundHooks.add(aroundHook);
|
||
|
},
|
||
|
|
||
|
addBeforeHookCode: function addBeforeHookCode(code, options) {
|
||
|
var beforeHook = Cucumber.SupportCode.Hook(code, options);
|
||
|
beforeHooks.add(beforeHook);
|
||
|
},
|
||
|
|
||
|
addAfterHookCode: function addAfterHookCode(code, options) {
|
||
|
var afterHook = Cucumber.SupportCode.Hook(code, options);
|
||
|
afterHooks.unshift(afterHook);
|
||
|
},
|
||
|
|
||
|
hookUpFunction: function hookUpFunction(userFunction, scenario, world) {
|
||
|
var hookedUpFunction = function(callback) {
|
||
|
var postScenarioAroundHookCallbacks = Cucumber.Type.Collection();
|
||
|
aroundHooks.forEach(callPreScenarioAroundHook, callBeforeHooks);
|
||
|
|
||
|
function callPreScenarioAroundHook(aroundHook, preScenarioAroundHookCallback) {
|
||
|
aroundHook.invokeBesideScenario(scenario, world, function(postScenarioAroundHookCallback) {
|
||
|
postScenarioAroundHookCallbacks.unshift(postScenarioAroundHookCallback);
|
||
|
preScenarioAroundHookCallback();
|
||
|
});
|
||
|
}
|
||
|
|
||
|
function callBeforeHooks() {
|
||
|
self.triggerBeforeHooks(scenario, world, callUserFunction);
|
||
|
}
|
||
|
|
||
|
function callUserFunction() {
|
||
|
userFunction(callAfterHooks);
|
||
|
}
|
||
|
|
||
|
function callAfterHooks() {
|
||
|
self.triggerAfterHooks(scenario, world, callPostScenarioAroundHooks);
|
||
|
}
|
||
|
|
||
|
function callPostScenarioAroundHooks() {
|
||
|
postScenarioAroundHookCallbacks.forEach(
|
||
|
callPostScenarioAroundHook,
|
||
|
callback
|
||
|
);
|
||
|
}
|
||
|
|
||
|
function callPostScenarioAroundHook(postScenarioAroundHookCallback, callback) {
|
||
|
postScenarioAroundHookCallback.call(world, callback);
|
||
|
}
|
||
|
};
|
||
|
return hookedUpFunction;
|
||
|
},
|
||
|
|
||
|
triggerBeforeHooks: function triggerBeforeHooks(scenario, world, callback) {
|
||
|
beforeHooks.forEach(function(beforeHook, callback) {
|
||
|
beforeHook.invokeBesideScenario(scenario, world, callback);
|
||
|
}, callback);
|
||
|
},
|
||
|
|
||
|
triggerAfterHooks: function triggerAfterHooks(scenario, world, callback) {
|
||
|
afterHooks.forEach(function(afterHook, callback) {
|
||
|
afterHook.invokeBesideScenario(scenario, world, callback);
|
||
|
}, callback);
|
||
|
}
|
||
|
};
|
||
|
return self;
|
||
|
};
|
||
|
module.exports = Hooker;
|
||
|
|
||
|
});
|
||
|
|
||
|
require.define("/cucumber/support_code/step_definition.js", function (require, module, exports, __dirname, __filename) {
|
||
|
var StepDefinition = function(regexp, code) {
|
||
|
var Cucumber = require('../../cucumber');
|
||
|
|
||
|
var self = {
|
||
|
matchesStepName: function matchesStepName(stepName) {
|
||
|
return regexp.test(stepName);
|
||
|
},
|
||
|
|
||
|
invoke: function invoke(stepName, world, stepAttachment, callback) {
|
||
|
var codeCallback = function() {
|
||
|
var successfulStepResult = Cucumber.Runtime.SuccessfulStepResult();
|
||
|
callback(successfulStepResult);
|
||
|
};
|
||
|
|
||
|
codeCallback.pending = function pending(reason) {
|
||
|
var pendingStepResult = Cucumber.Runtime.PendingStepResult(reason);
|
||
|
callback(pendingStepResult);
|
||
|
};
|
||
|
|
||
|
codeCallback.fail = function fail(failureReason) {
|
||
|
var failedStepResult = Cucumber.Runtime.FailedStepResult(failureReason);
|
||
|
callback(failedStepResult);
|
||
|
};
|
||
|
|
||
|
var parameters = self.buildInvocationParameters(stepName, stepAttachment, codeCallback);
|
||
|
try {
|
||
|
code.apply(world, parameters);
|
||
|
} catch (exception) {
|
||
|
if (exception)
|
||
|
Cucumber.Debug.warn(exception.stack || exception, 'exception inside feature', 3);
|
||
|
codeCallback.fail(exception);
|
||
|
}
|
||
|
},
|
||
|
|
||
|
buildInvocationParameters: function buildInvocationParameters(stepName, stepAttachment, callback) {
|
||
|
var parameters = regexp.exec(stepName);
|
||
|
parameters.shift();
|
||
|
if (stepAttachment) {
|
||
|
var contents = stepAttachment.getContents();
|
||
|
parameters.push(contents);
|
||
|
}
|
||
|
parameters.push(callback);
|
||
|
return parameters;
|
||
|
}
|
||
|
};
|
||
|
return self;
|
||
|
};
|
||
|
module.exports = StepDefinition;
|
||
|
|
||
|
});
|
||
|
|
||
|
require.define("/cucumber/support_code/step_definition_snippet_builder.js", function (require, module, exports, __dirname, __filename) {
|
||
|
var _ = require('underscore');
|
||
|
|
||
|
var StepDefinitionSnippetBuilder = function(step) {
|
||
|
var Cucumber = require('../../cucumber');
|
||
|
|
||
|
var self = {
|
||
|
buildSnippet: function buildSnippet() {
|
||
|
var functionName = self.buildStepDefinitionFunctionName();
|
||
|
var pattern = self.buildStepDefinitionPattern();
|
||
|
var parameters = self.buildStepDefinitionParameters();
|
||
|
var snippet =
|
||
|
StepDefinitionSnippetBuilder.STEP_DEFINITION_START +
|
||
|
functionName +
|
||
|
StepDefinitionSnippetBuilder.STEP_DEFINITION_INNER1 +
|
||
|
pattern +
|
||
|
StepDefinitionSnippetBuilder.STEP_DEFINITION_INNER2 +
|
||
|
parameters +
|
||
|
StepDefinitionSnippetBuilder.STEP_DEFINITION_END;
|
||
|
return snippet;
|
||
|
},
|
||
|
|
||
|
buildStepDefinitionFunctionName: function buildStepDefinitionFunctionName() {
|
||
|
var functionName;
|
||
|
if (step.isOutcomeStep())
|
||
|
functionName = StepDefinitionSnippetBuilder.OUTCOME_STEP_DEFINITION_FUNCTION_NAME;
|
||
|
else if (step.isEventStep())
|
||
|
functionName = StepDefinitionSnippetBuilder.EVENT_STEP_DEFINITION_FUNCTION_NAME;
|
||
|
else
|
||
|
functionName = StepDefinitionSnippetBuilder.CONTEXT_STEP_DEFINITION_FUNCTION_NAME;
|
||
|
return functionName;
|
||
|
},
|
||
|
|
||
|
buildStepDefinitionPattern: function buildStepDefinitionPattern() {
|
||
|
var stepName = step.getName();
|
||
|
var escapedStepName = Cucumber.Util.RegExp.escapeString(stepName);
|
||
|
var parameterizedStepName = self.parameterizeStepName(escapedStepName);
|
||
|
var pattern =
|
||
|
StepDefinitionSnippetBuilder.PATTERN_START +
|
||
|
parameterizedStepName +
|
||
|
StepDefinitionSnippetBuilder.PATTERN_END
|
||
|
return pattern;
|
||
|
},
|
||
|
|
||
|
buildStepDefinitionParameters: function buildStepDefinitionParameters() {
|
||
|
var parameters = self.getStepDefinitionPatternMatchingGroupParameters();
|
||
|
if (step.hasDocString())
|
||
|
parameters = parameters.concat([StepDefinitionSnippetBuilder.STEP_DEFINITION_DOC_STRING]);
|
||
|
else if (step.hasDataTable())
|
||
|
parameters = parameters.concat([StepDefinitionSnippetBuilder.STEP_DEFINITION_DATA_TABLE]);
|
||
|
var parametersAndCallback =
|
||
|
parameters.concat([StepDefinitionSnippetBuilder.STEP_DEFINITION_CALLBACK]);
|
||
|
var parameterString = parametersAndCallback.join(StepDefinitionSnippetBuilder.FUNCTION_PARAMETER_SEPARATOR);
|
||
|
return parameterString;
|
||
|
},
|
||
|
|
||
|
getStepDefinitionPatternMatchingGroupParameters: function getStepDefinitionPatternMatchingGroupParameters() {
|
||
|
var parameterCount = self.countStepDefinitionPatternMatchingGroups();
|
||
|
var parameters = [];
|
||
|
_(parameterCount).times(function(n) {
|
||
|
var offset = n + 1;
|
||
|
parameters.push('arg' + offset);
|
||
|
});
|
||
|
return parameters;
|
||
|
},
|
||
|
|
||
|
countStepDefinitionPatternMatchingGroups: function countStepDefinitionPatternMatchingGroups() {
|
||
|
var stepDefinitionPattern = self.buildStepDefinitionPattern();
|
||
|
var numberMatchingGroupCount =
|
||
|
Cucumber.Util.String.count(stepDefinitionPattern, StepDefinitionSnippetBuilder.NUMBER_MATCHING_GROUP);
|
||
|
var quotedStringMatchingGroupCount =
|
||
|
Cucumber.Util.String.count(stepDefinitionPattern, StepDefinitionSnippetBuilder.QUOTED_STRING_MATCHING_GROUP);
|
||
|
var count = numberMatchingGroupCount + quotedStringMatchingGroupCount;
|
||
|
return count;
|
||
|
},
|
||
|
|
||
|
parameterizeStepName: function parameterizeStepName(stepName) {
|
||
|
var parameterizedStepName =
|
||
|
stepName
|
||
|
.replace(StepDefinitionSnippetBuilder.NUMBER_PATTERN, StepDefinitionSnippetBuilder.NUMBER_MATCHING_GROUP)
|
||
|
.replace(StepDefinitionSnippetBuilder.QUOTED_STRING_PATTERN, StepDefinitionSnippetBuilder.QUOTED_STRING_MATCHING_GROUP);
|
||
|
return parameterizedStepName;
|
||
|
}
|
||
|
};
|
||
|
return self;
|
||
|
};
|
||
|
|
||
|
StepDefinitionSnippetBuilder.STEP_DEFINITION_START = 'this.';
|
||
|
StepDefinitionSnippetBuilder.STEP_DEFINITION_INNER1 = '(';
|
||
|
StepDefinitionSnippetBuilder.STEP_DEFINITION_INNER2 = ', function(';
|
||
|
StepDefinitionSnippetBuilder.STEP_DEFINITION_END = ") {\n // express the regexp above with the code you wish you had\n callback.pending();\n});\n";
|
||
|
StepDefinitionSnippetBuilder.STEP_DEFINITION_DOC_STRING = 'string';
|
||
|
StepDefinitionSnippetBuilder.STEP_DEFINITION_DATA_TABLE = 'table';
|
||
|
StepDefinitionSnippetBuilder.STEP_DEFINITION_CALLBACK = 'callback';
|
||
|
StepDefinitionSnippetBuilder.PATTERN_START = '/^';
|
||
|
StepDefinitionSnippetBuilder.PATTERN_END = '$/';
|
||
|
StepDefinitionSnippetBuilder.CONTEXT_STEP_DEFINITION_FUNCTION_NAME = 'Given';
|
||
|
StepDefinitionSnippetBuilder.EVENT_STEP_DEFINITION_FUNCTION_NAME = 'When';
|
||
|
StepDefinitionSnippetBuilder.OUTCOME_STEP_DEFINITION_FUNCTION_NAME = 'Then';
|
||
|
StepDefinitionSnippetBuilder.NUMBER_PATTERN = /\d+/gi;
|
||
|
StepDefinitionSnippetBuilder.NUMBER_MATCHING_GROUP = '(\\d+)';
|
||
|
StepDefinitionSnippetBuilder.QUOTED_STRING_PATTERN = /"[^"]*"/gi;
|
||
|
StepDefinitionSnippetBuilder.QUOTED_STRING_MATCHING_GROUP = '"([^"]*)"';
|
||
|
StepDefinitionSnippetBuilder.FUNCTION_PARAMETER_SEPARATOR = ', ';
|
||
|
module.exports = StepDefinitionSnippetBuilder;
|
||
|
|
||
|
});
|
||
|
|
||
|
require.define("/cucumber/support_code/world_constructor.js", function (require, module, exports, __dirname, __filename) {
|
||
|
var WorldConstructor = function() {
|
||
|
return function(callback) { callback(this) };
|
||
|
};
|
||
|
module.exports = WorldConstructor;
|
||
|
|
||
|
});
|
||
|
|
||
|
require.define("/cucumber/tag_group_parser.js", function (require, module, exports, __dirname, __filename) {
|
||
|
var _ = require('underscore');
|
||
|
|
||
|
var TagGroupParser = function(tagGroupString) {
|
||
|
var self = {
|
||
|
parse: function parse() {
|
||
|
var splitTags = tagGroupString.split(TagGroupParser.TAG_SEPARATOR);
|
||
|
var trimmedTags = _.map(splitTags, function(tag) { return tag.trim(); });
|
||
|
return trimmedTags;
|
||
|
}
|
||
|
};
|
||
|
return self;
|
||
|
};
|
||
|
|
||
|
TagGroupParser.getTagGroupsFromStrings = function getTagGroupsFromStrings(tagGroupStrings) {
|
||
|
var Cucumber = require('../cucumber');
|
||
|
|
||
|
var tagGroups = _.map(tagGroupStrings, function(tagOptionValue) {
|
||
|
var tagGroupParser = Cucumber.TagGroupParser(tagOptionValue);
|
||
|
var tagGroup = tagGroupParser.parse();
|
||
|
return tagGroup;
|
||
|
});
|
||
|
return tagGroups;
|
||
|
};
|
||
|
|
||
|
TagGroupParser.TAG_SEPARATOR = ',';
|
||
|
module.exports = TagGroupParser;
|
||
|
|
||
|
});
|
||
|
|
||
|
require.define("/cucumber/type.js", function (require, module, exports, __dirname, __filename) {
|
||
|
var Type = {};
|
||
|
Type.Collection = require('./type/collection');
|
||
|
Type.HashDataTable = require('./type/hash_data_table');
|
||
|
Type.String = require('./type/string');
|
||
|
module.exports = Type;
|
||
|
|
||
|
});
|
||
|
|
||
|
require.define("/cucumber/type/collection.js", function (require, module, exports, __dirname, __filename) {
|
||
|
var Collection = function() {
|
||
|
var items = new Array();
|
||
|
var self = {
|
||
|
add: function add(item) { items.push(item); },
|
||
|
unshift: function unshift(item) { items.unshift(item); },
|
||
|
getLast: function getLast() { return items[items.length-1]; },
|
||
|
syncForEach: function syncForEach(userFunction) { items.forEach(userFunction); },
|
||
|
forEach: function forEach(userFunction, callback) {
|
||
|
var itemsCopy = items.slice(0);
|
||
|
function iterate() {
|
||
|
if (itemsCopy.length > 0) {
|
||
|
processItem();
|
||
|
} else {
|
||
|
callback();
|
||
|
};
|
||
|
}
|
||
|
function processItem() {
|
||
|
var item = itemsCopy.shift();
|
||
|
userFunction(item, function() {
|
||
|
iterate();
|
||
|
});
|
||
|
};
|
||
|
iterate();
|
||
|
},
|
||
|
length: function length() { return items.length; }
|
||
|
};
|
||
|
return self;
|
||
|
};
|
||
|
module.exports = Collection;
|
||
|
|
||
|
});
|
||
|
|
||
|
require.define("/cucumber/type/hash_data_table.js", function (require, module, exports, __dirname, __filename) {
|
||
|
var HashDataTable = function(rawArray) {
|
||
|
var self = {
|
||
|
raw: function raw() {
|
||
|
var hashKeys = self.getHashKeys();
|
||
|
var hashValueArrays = self.getHashValueArrays();
|
||
|
var hashes = self.createHashesFromKeysAndValueArrays(hashKeys, hashValueArrays);
|
||
|
return hashes;
|
||
|
},
|
||
|
|
||
|
getHashKeys: function getHashKeys() {
|
||
|
return rawArray[0];
|
||
|
},
|
||
|
|
||
|
getHashValueArrays: function getHashValueArrays() {
|
||
|
var _rawArray = [].concat(rawArray);
|
||
|
_rawArray.shift();
|
||
|
return _rawArray;
|
||
|
},
|
||
|
|
||
|
createHashesFromKeysAndValueArrays: function createHashesFromKeysAndValueArrays(keys, valueArrays) {
|
||
|
var hashes = [];
|
||
|
valueArrays.forEach(function(values) {
|
||
|
var hash = self.createHashFromKeysAndValues(keys, values);
|
||
|
hashes.push(hash);
|
||
|
});
|
||
|
return hashes;
|
||
|
},
|
||
|
|
||
|
createHashFromKeysAndValues: function createHashFromKeysAndValues(keys, values) {
|
||
|
var hash = {};
|
||
|
var len = keys.length;
|
||
|
for (var i = 0; i < len; i++) {
|
||
|
hash[keys[i]] = values[i];
|
||
|
}
|
||
|
return hash;
|
||
|
}
|
||
|
};
|
||
|
return self;
|
||
|
};
|
||
|
|
||
|
module.exports = HashDataTable;
|
||
|
});
|
||
|
|
||
|
require.define("/cucumber/type/string.js", function (require, module, exports, __dirname, __filename) {
|
||
|
if(!String.prototype.trim) {
|
||
|
String.prototype.trim = function () {
|
||
|
return this.replace(/^\s+|\s+$/g,'');
|
||
|
};
|
||
|
}
|
||
|
module.exports = String;
|
||
|
|
||
|
});
|
||
|
|
||
|
require.define("/cucumber/util.js", function (require, module, exports, __dirname, __filename) {
|
||
|
var Util = {};
|
||
|
Util.Arguments = require('./util/arguments');
|
||
|
Util.RegExp = require('./util/reg_exp');
|
||
|
Util.String = require('./util/string');
|
||
|
module.exports = Util;
|
||
|
|
||
|
});
|
||
|
|
||
|
require.define("/cucumber/util/arguments.js", function (require, module, exports, __dirname, __filename) {
|
||
|
var Arguments = function Arguments(argumentsObject) {
|
||
|
return Array.prototype.slice.call(argumentsObject);
|
||
|
};
|
||
|
module.exports = Arguments;
|
||
|
});
|
||
|
|
||
|
require.define("/cucumber/util/reg_exp.js", function (require, module, exports, __dirname, __filename) {
|
||
|
var RegExp = {
|
||
|
escapeString: function escapeString(string) {
|
||
|
var escaped = string.replace(RegExp.ESCAPE_PATTERN, RegExp.ESCAPE_REPLACEMENT);
|
||
|
return escaped;
|
||
|
}
|
||
|
};
|
||
|
|
||
|
RegExp.ESCAPE_PATTERN = /[-[\]{}()*+?.\\^$|#\n\/]/g;
|
||
|
RegExp.ESCAPE_REPLACEMENT = "\\$&";
|
||
|
module.exports = RegExp;
|
||
|
|
||
|
});
|
||
|
|
||
|
require.define("/cucumber/util/string.js", function (require, module, exports, __dirname, __filename) {
|
||
|
var String = {
|
||
|
count: function count(hayStack, needle) {
|
||
|
var splitHayStack = hayStack.split(needle);
|
||
|
return splitHayStack.length - 1;
|
||
|
}
|
||
|
};
|
||
|
module.exports = String;
|
||
|
|
||
|
});
|
||
|
|
||
|
require.define("/cucumber/volatile_configuration.js", function (require, module, exports, __dirname, __filename) {
|
||
|
var VolatileConfiguration = function VolatileConfiguration(featureSource, supportCodeInitializer, options) {
|
||
|
var Cucumber = require('../cucumber');
|
||
|
|
||
|
var supportCodeLibrary = Cucumber.SupportCode.Library(supportCodeInitializer);
|
||
|
|
||
|
options = options || {};
|
||
|
var tagGroupStrings = options['tags'] || [];
|
||
|
|
||
|
var self = {
|
||
|
getFeatureSources: function getFeatureSources() {
|
||
|
var featureNameSourcePair = [VolatileConfiguration.FEATURE_SOURCE_NAME, featureSource];
|
||
|
return [featureNameSourcePair];
|
||
|
},
|
||
|
|
||
|
getAstFilter: function getAstFilter() {
|
||
|
var tagRules = self.getTagAstFilterRules();
|
||
|
var astFilter = Cucumber.Ast.Filter(tagRules);
|
||
|
return astFilter;
|
||
|
},
|
||
|
|
||
|
getSupportCodeLibrary: function getSupportCodeLibrary() {
|
||
|
return supportCodeLibrary;
|
||
|
},
|
||
|
|
||
|
getTagAstFilterRules: function getTagAstFilterRules() {
|
||
|
var rules = [];
|
||
|
tagGroupStrings.forEach(function(tagGroupString) {
|
||
|
var rule = self.buildAstFilterRuleFromTagGroupString(tagGroupString);
|
||
|
rules.push(rule);
|
||
|
});
|
||
|
return rules;
|
||
|
},
|
||
|
|
||
|
buildAstFilterRuleFromTagGroupString: function buildAstFilterRuleFromTagGroupString(tagGroupString) {
|
||
|
var tagGroupParser = Cucumber.TagGroupParser(tagGroupString);
|
||
|
var tagGroup = tagGroupParser.parse();
|
||
|
var rule = Cucumber.Ast.Filter.AnyOfTagsRule(tagGroup);
|
||
|
return rule;
|
||
|
}
|
||
|
};
|
||
|
return self;
|
||
|
};
|
||
|
VolatileConfiguration.FEATURE_SOURCE_NAME = "(feature)";
|
||
|
module.exports = VolatileConfiguration;
|
||
|
|
||
|
});
|
||
|
|
||
|
require.define("/node_modules/gherkin/lib/gherkin/lexer/en.js", function (require, module, exports, __dirname, __filename) {
|
||
|
|
||
|
/* line 1 "/Users/ahellesoy/scm/gherkin/tasks/../ragel/i18n/en.js.rl" */
|
||
|
;(function() {
|
||
|
|
||
|
|
||
|
/* line 126 "/Users/ahellesoy/scm/gherkin/tasks/../ragel/i18n/en.js.rl" */
|
||
|
|
||
|
|
||
|
|
||
|
/* line 11 "js/lib/gherkin/lexer/en.js" */
|
||
|
const _lexer_actions = [
|
||
|
0, 1, 0, 1, 1, 1, 2, 1,
|
||
|
3, 1, 4, 1, 5, 1, 6, 1,
|
||
|
7, 1, 8, 1, 9, 1, 10, 1,
|
||
|
11, 1, 12, 1, 13, 1, 16, 1,
|
||
|
17, 1, 18, 1, 19, 1, 20, 1,
|
||
|
21, 1, 22, 1, 23, 2, 2, 18,
|
||
|
2, 3, 4, 2, 13, 0, 2, 14,
|
||
|
15, 2, 17, 0, 2, 17, 1, 2,
|
||
|
17, 16, 2, 17, 19, 2, 18, 6,
|
||
|
2, 18, 7, 2, 18, 8, 2, 18,
|
||
|
9, 2, 18, 10, 2, 18, 16, 2,
|
||
|
20, 21, 2, 22, 0, 2, 22, 1,
|
||
|
2, 22, 16, 2, 22, 19, 3, 4,
|
||
|
14, 15, 3, 5, 14, 15, 3, 11,
|
||
|
14, 15, 3, 12, 14, 15, 3, 13,
|
||
|
14, 15, 3, 14, 15, 18, 3, 17,
|
||
|
0, 11, 3, 17, 14, 15, 4, 2,
|
||
|
14, 15, 18, 4, 3, 4, 14, 15,
|
||
|
4, 17, 0, 14, 15, 5, 17, 0,
|
||
|
11, 14, 15
|
||
|
];
|
||
|
|
||
|
const _lexer_key_offsets = [
|
||
|
0, 0, 19, 37, 38, 39, 41, 43,
|
||
|
48, 53, 58, 63, 67, 71, 73, 74,
|
||
|
75, 76, 77, 78, 79, 80, 81, 82,
|
||
|
83, 84, 85, 86, 87, 88, 89, 91,
|
||
|
93, 98, 105, 110, 111, 112, 114, 115,
|
||
|
116, 117, 118, 119, 120, 121, 122, 123,
|
||
|
124, 125, 140, 142, 144, 146, 148, 150,
|
||
|
152, 154, 156, 158, 160, 162, 164, 166,
|
||
|
168, 170, 188, 189, 190, 191, 192, 193,
|
||
|
194, 195, 196, 197, 198, 205, 207, 209,
|
||
|
211, 213, 215, 217, 219, 220, 221, 222,
|
||
|
223, 224, 225, 226, 227, 228, 239, 241,
|
||
|
243, 245, 247, 249, 251, 253, 255, 257,
|
||
|
259, 261, 263, 265, 267, 269, 271, 273,
|
||
|
275, 277, 279, 281, 283, 285, 287, 289,
|
||
|
291, 293, 295, 297, 299, 301, 303, 305,
|
||
|
307, 309, 311, 313, 315, 317, 319, 321,
|
||
|
323, 325, 327, 331, 334, 336, 338, 340,
|
||
|
342, 344, 346, 348, 350, 352, 354, 356,
|
||
|
357, 358, 359, 360, 361, 362, 363, 364,
|
||
|
365, 366, 367, 370, 372, 373, 374, 375,
|
||
|
376, 377, 378, 379, 380, 381, 396, 398,
|
||
|
400, 402, 404, 406, 408, 410, 412, 414,
|
||
|
416, 418, 420, 422, 424, 426, 428, 430,
|
||
|
432, 434, 436, 438, 440, 442, 444, 446,
|
||
|
448, 450, 452, 454, 456, 458, 460, 462,
|
||
|
464, 466, 468, 470, 472, 473, 474, 475,
|
||
|
476, 477, 478, 479, 480, 495, 497, 499,
|
||
|
501, 503, 505, 507, 509, 511, 513, 515,
|
||
|
517, 519, 521, 523, 525, 527, 529, 532,
|
||
|
534, 536, 538, 540, 542, 544, 546, 548,
|
||
|
550, 552, 554, 556, 558, 560, 562, 564,
|
||
|
566, 568, 570, 572, 574, 576, 578, 580,
|
||
|
582, 584, 586, 589, 592, 594, 596, 598,
|
||
|
600, 602, 604, 606, 608, 610, 612, 614,
|
||
|
616, 617, 621, 627, 630, 632, 638, 656,
|
||
|
658, 660, 662, 664, 666, 668, 670, 672,
|
||
|
674, 676, 678, 680, 682, 684, 686, 688,
|
||
|
690, 692, 694, 696, 698, 700, 703, 706,
|
||
|
708, 710, 712, 714, 716, 718, 720, 722,
|
||
|
724, 726, 728, 730, 731, 732, 733
|
||
|
];
|
||
|
|
||
|
const _lexer_trans_keys = [
|
||
|
10, 32, 34, 35, 37, 42, 64, 65,
|
||
|
66, 69, 70, 71, 83, 84, 87, 124,
|
||
|
239, 9, 13, 10, 32, 34, 35, 37,
|
||
|
42, 64, 65, 66, 69, 70, 71, 83,
|
||
|
84, 87, 124, 9, 13, 34, 34, 10,
|
||
|
13, 10, 13, 10, 32, 34, 9, 13,
|
||
|
10, 32, 34, 9, 13, 10, 32, 34,
|
||
|
9, 13, 10, 32, 34, 9, 13, 10,
|
||
|
32, 9, 13, 10, 32, 9, 13, 10,
|
||
|
13, 10, 95, 70, 69, 65, 84, 85,
|
||
|
82, 69, 95, 69, 78, 68, 95, 37,
|
||
|
32, 10, 13, 10, 13, 13, 32, 64,
|
||
|
9, 10, 9, 10, 13, 32, 64, 11,
|
||
|
12, 10, 32, 64, 9, 13, 110, 100,
|
||
|
97, 117, 99, 107, 103, 114, 111, 117,
|
||
|
110, 100, 58, 10, 10, 10, 32, 35,
|
||
|
37, 42, 64, 65, 66, 70, 71, 83,
|
||
|
84, 87, 9, 13, 10, 95, 10, 70,
|
||
|
10, 69, 10, 65, 10, 84, 10, 85,
|
||
|
10, 82, 10, 69, 10, 95, 10, 69,
|
||
|
10, 78, 10, 68, 10, 95, 10, 37,
|
||
|
10, 32, 10, 32, 34, 35, 37, 42,
|
||
|
64, 65, 66, 69, 70, 71, 83, 84,
|
||
|
87, 124, 9, 13, 120, 97, 109, 112,
|
||
|
108, 101, 115, 58, 10, 10, 10, 32,
|
||
|
35, 70, 124, 9, 13, 10, 101, 10,
|
||
|
97, 10, 116, 10, 117, 10, 114, 10,
|
||
|
101, 10, 58, 101, 97, 116, 117, 114,
|
||
|
101, 58, 10, 10, 10, 32, 35, 37,
|
||
|
64, 66, 69, 70, 83, 9, 13, 10,
|
||
|
95, 10, 70, 10, 69, 10, 65, 10,
|
||
|
84, 10, 85, 10, 82, 10, 69, 10,
|
||
|
95, 10, 69, 10, 78, 10, 68, 10,
|
||
|
95, 10, 37, 10, 97, 10, 99, 10,
|
||
|
107, 10, 103, 10, 114, 10, 111, 10,
|
||
|
117, 10, 110, 10, 100, 10, 58, 10,
|
||
|
120, 10, 97, 10, 109, 10, 112, 10,
|
||
|
108, 10, 101, 10, 115, 10, 101, 10,
|
||
|
97, 10, 116, 10, 117, 10, 114, 10,
|
||
|
101, 10, 99, 10, 101, 10, 110, 10,
|
||
|
97, 10, 114, 10, 105, 10, 111, 10,
|
||
|
32, 58, 115, 10, 79, 84, 10, 117,
|
||
|
10, 116, 10, 108, 10, 105, 10, 110,
|
||
|
10, 101, 10, 109, 10, 112, 10, 108,
|
||
|
10, 97, 10, 116, 105, 118, 101, 110,
|
||
|
99, 101, 110, 97, 114, 105, 111, 32,
|
||
|
58, 115, 79, 84, 117, 116, 108, 105,
|
||
|
110, 101, 58, 10, 10, 10, 32, 35,
|
||
|
37, 42, 64, 65, 66, 70, 71, 83,
|
||
|
84, 87, 9, 13, 10, 95, 10, 70,
|
||
|
10, 69, 10, 65, 10, 84, 10, 85,
|
||
|
10, 82, 10, 69, 10, 95, 10, 69,
|
||
|
10, 78, 10, 68, 10, 95, 10, 37,
|
||
|
10, 32, 10, 110, 10, 100, 10, 117,
|
||
|
10, 116, 10, 101, 10, 97, 10, 116,
|
||
|
10, 117, 10, 114, 10, 101, 10, 58,
|
||
|
10, 105, 10, 118, 10, 101, 10, 110,
|
||
|
10, 99, 10, 101, 10, 110, 10, 97,
|
||
|
10, 114, 10, 105, 10, 111, 10, 104,
|
||
|
101, 109, 112, 108, 97, 116, 10, 10,
|
||
|
10, 32, 35, 37, 42, 64, 65, 66,
|
||
|
70, 71, 83, 84, 87, 9, 13, 10,
|
||
|
95, 10, 70, 10, 69, 10, 65, 10,
|
||
|
84, 10, 85, 10, 82, 10, 69, 10,
|
||
|
95, 10, 69, 10, 78, 10, 68, 10,
|
||
|
95, 10, 37, 10, 32, 10, 110, 10,
|
||
|
100, 10, 97, 117, 10, 99, 10, 107,
|
||
|
10, 103, 10, 114, 10, 111, 10, 117,
|
||
|
10, 110, 10, 100, 10, 58, 10, 116,
|
||
|
10, 101, 10, 97, 10, 116, 10, 117,
|
||
|
10, 114, 10, 101, 10, 105, 10, 118,
|
||
|
10, 101, 10, 110, 10, 99, 10, 101,
|
||
|
10, 110, 10, 97, 10, 114, 10, 105,
|
||
|
10, 111, 10, 32, 58, 10, 79, 84,
|
||
|
10, 117, 10, 116, 10, 108, 10, 105,
|
||
|
10, 110, 10, 101, 10, 109, 10, 112,
|
||
|
10, 108, 10, 97, 10, 116, 10, 104,
|
||
|
104, 32, 124, 9, 13, 10, 32, 92,
|
||
|
124, 9, 13, 10, 92, 124, 10, 92,
|
||
|
10, 32, 92, 124, 9, 13, 10, 32,
|
||
|
34, 35, 37, 42, 64, 65, 66, 69,
|
||
|
70, 71, 83, 84, 87, 124, 9, 13,
|
||
|
10, 110, 10, 100, 10, 117, 10, 116,
|
||
|
10, 101, 10, 97, 10, 116, 10, 117,
|
||
|
10, 114, 10, 101, 10, 58, 10, 105,
|
||
|
10, 118, 10, 101, 10, 110, 10, 99,
|
||
|
10, 101, 10, 110, 10, 97, 10, 114,
|
||
|
10, 105, 10, 111, 10, 32, 58, 10,
|
||
|
79, 84, 10, 117, 10, 116, 10, 108,
|
||
|
10, 105, 10, 110, 10, 101, 10, 109,
|
||
|
10, 112, 10, 108, 10, 97, 10, 116,
|
||
|
10, 104, 116, 187, 191, 0
|
||
|
];
|
||
|
|
||
|
const _lexer_single_lengths = [
|
||
|
0, 17, 16, 1, 1, 2, 2, 3,
|
||
|
3, 3, 3, 2, 2, 2, 1, 1,
|
||
|
1, 1, 1, 1, 1, 1, 1, 1,
|
||
|
1, 1, 1, 1, 1, 1, 2, 2,
|
||
|
3, 5, 3, 1, 1, 2, 1, 1,
|
||
|
1, 1, 1, 1, 1, 1, 1, 1,
|
||
|
1, 13, 2, 2, 2, 2, 2, 2,
|
||
|
2, 2, 2, 2, 2, 2, 2, 2,
|
||
|
2, 16, 1, 1, 1, 1, 1, 1,
|
||
|
1, 1, 1, 1, 5, 2, 2, 2,
|
||
|
2, 2, 2, 2, 1, 1, 1, 1,
|
||
|
1, 1, 1, 1, 1, 9, 2, 2,
|
||
|
2, 2, 2, 2, 2, 2, 2, 2,
|
||
|
2, 2, 2, 2, 2, 2, 2, 2,
|
||
|
2, 2, 2, 2, 2, 2, 2, 2,
|
||
|
2, 2, 2, 2, 2, 2, 2, 2,
|
||
|
2, 2, 2, 2, 2, 2, 2, 2,
|
||
|
2, 2, 4, 3, 2, 2, 2, 2,
|
||
|
2, 2, 2, 2, 2, 2, 2, 1,
|
||
|
1, 1, 1, 1, 1, 1, 1, 1,
|
||
|
1, 1, 3, 2, 1, 1, 1, 1,
|
||
|
1, 1, 1, 1, 1, 13, 2, 2,
|
||
|
2, 2, 2, 2, 2, 2, 2, 2,
|
||
|
2, 2, 2, 2, 2, 2, 2, 2,
|
||
|
2, 2, 2, 2, 2, 2, 2, 2,
|
||
|
2, 2, 2, 2, 2, 2, 2, 2,
|
||
|
2, 2, 2, 2, 1, 1, 1, 1,
|
||
|
1, 1, 1, 1, 13, 2, 2, 2,
|
||
|
2, 2, 2, 2, 2, 2, 2, 2,
|
||
|
2, 2, 2, 2, 2, 2, 3, 2,
|
||
|
2, 2, 2, 2, 2, 2, 2, 2,
|
||
|
2, 2, 2, 2, 2, 2, 2, 2,
|
||
|
2, 2, 2, 2, 2, 2, 2, 2,
|
||
|
2, 2, 3, 3, 2, 2, 2, 2,
|
||
|
2, 2, 2, 2, 2, 2, 2, 2,
|
||
|
1, 2, 4, 3, 2, 4, 16, 2,
|
||
|
2, 2, 2, 2, 2, 2, 2, 2,
|
||
|
2, 2, 2, 2, 2, 2, 2, 2,
|
||
|
2, 2, 2, 2, 2, 3, 3, 2,
|
||
|
2, 2, 2, 2, 2, 2, 2, 2,
|
||
|
2, 2, 2, 1, 1, 1, 0
|
||
|
];
|
||
|
|
||
|
const _lexer_range_lengths = [
|
||
|
0, 1, 1, 0, 0, 0, 0, 1,
|
||
|
1, 1, 1, 1, 1, 0, 0, 0,
|
||
|
0, 0, 0, 0, 0, 0, 0, 0,
|
||
|
0, 0, 0, 0, 0, 0, 0, 0,
|
||
|
1, 1, 1, 0, 0, 0, 0, 0,
|
||
|
0, 0, 0, 0, 0, 0, 0, 0,
|
||
|
0, 1, 0, 0, 0, 0, 0, 0,
|
||
|
0, 0, 0, 0, 0, 0, 0, 0,
|
||
|
0, 1, 0, 0, 0, 0, 0, 0,
|
||
|
0, 0, 0, 0, 1, 0, 0, 0,
|
||
|
0, 0, 0, 0, 0, 0, 0, 0,
|
||
|
0, 0, 0, 0, 0, 1, 0, 0,
|
||
|
0, 0, 0, 0, 0, 0, 0, 0,
|
||
|
0, 0, 0, 0, 0, 0, 0, 0,
|
||
|
0, 0, 0, 0, 0, 0, 0, 0,
|
||
|
0, 0, 0, 0, 0, 0, 0, 0,
|
||
|
0, 0, 0, 0, 0, 0, 0, 0,
|
||
|
0, 0, 0, 0, 0, 0, 0, 0,
|
||
|
0, 0, 0, 0, 0, 0, 0, 0,
|
||
|
0, 0, 0, 0, 0, 0, 0, 0,
|
||
|
0, 0, 0, 0, 0, 0, 0, 0,
|
||
|
0, 0, 0, 0, 0, 1, 0, 0,
|
||
|
0, 0, 0, 0, 0, 0, 0, 0,
|
||
|
0, 0, 0, 0, 0, 0, 0, 0,
|
||
|
0, 0, 0, 0, 0, 0, 0, 0,
|
||
|
0, 0, 0, 0, 0, 0, 0, 0,
|
||
|
0, 0, 0, 0, 0, 0, 0, 0,
|
||
|
0, 0, 0, 0, 1, 0, 0, 0,
|
||
|
0, 0, 0, 0, 0, 0, 0, 0,
|
||
|
0, 0, 0, 0, 0, 0, 0, 0,
|
||
|
0, 0, 0, 0, 0, 0, 0, 0,
|
||
|
0, 0, 0, 0, 0, 0, 0, 0,
|
||
|
0, 0, 0, 0, 0, 0, 0, 0,
|
||
|
0, 0, 0, 0, 0, 0, 0, 0,
|
||
|
0, 0, 0, 0, 0, 0, 0, 0,
|
||
|
0, 1, 1, 0, 0, 1, 1, 0,
|
||
|
0, 0, 0, 0, 0, 0, 0, 0,
|
||
|
0, 0, 0, 0, 0, 0, 0, 0,
|
||
|
0, 0, 0, 0, 0, 0, 0, 0,
|
||
|
0, 0, 0, 0, 0, 0, 0, 0,
|
||
|
0, 0, 0, 0, 0, 0, 0
|
||
|
];
|
||
|
|
||
|
const _lexer_index_offsets = [
|
||
|
0, 0, 19, 37, 39, 41, 44, 47,
|
||
|
52, 57, 62, 67, 71, 75, 78, 80,
|
||
|
82, 84, 86, 88, 90, 92, 94, 96,
|
||
|
98, 100, 102, 104, 106, 108, 110, 113,
|
||
|
116, 121, 128, 133, 135, 137, 140, 142,
|
||
|
144, 146, 148, 150, 152, 154, 156, 158,
|
||
|
160, 162, 177, 180, 183, 186, 189, 192,
|
||
|
195, 198, 201, 204, 207, 210, 213, 216,
|
||
|
219, 222, 240, 242, 244, 246, 248, 250,
|
||
|
252, 254, 256, 258, 260, 267, 270, 273,
|
||
|
276, 279, 282, 285, 288, 290, 292, 294,
|
||
|
296, 298, 300, 302, 304, 306, 317, 320,
|
||
|
323, 326, 329, 332, 335, 338, 341, 344,
|
||
|
347, 350, 353, 356, 359, 362, 365, 368,
|
||
|
371, 374, 377, 380, 383, 386, 389, 392,
|
||
|
395, 398, 401, 404, 407, 410, 413, 416,
|
||
|
419, 422, 425, 428, 431, 434, 437, 440,
|
||
|
443, 446, 449, 454, 458, 461, 464, 467,
|
||
|
470, 473, 476, 479, 482, 485, 488, 491,
|
||
|
493, 495, 497, 499, 501, 503, 505, 507,
|
||
|
509, 511, 513, 517, 520, 522, 524, 526,
|
||
|
528, 530, 532, 534, 536, 538, 553, 556,
|
||
|
559, 562, 565, 568, 571, 574, 577, 580,
|
||
|
583, 586, 589, 592, 595, 598, 601, 604,
|
||
|
607, 610, 613, 616, 619, 622, 625, 628,
|
||
|
631, 634, 637, 640, 643, 646, 649, 652,
|
||
|
655, 658, 661, 664, 667, 669, 671, 673,
|
||
|
675, 677, 679, 681, 683, 698, 701, 704,
|
||
|
707, 710, 713, 716, 719, 722, 725, 728,
|
||
|
731, 734, 737, 740, 743, 746, 749, 753,
|
||
|
756, 759, 762, 765, 768, 771, 774, 777,
|
||
|
780, 783, 786, 789, 792, 795, 798, 801,
|
||
|
804, 807, 810, 813, 816, 819, 822, 825,
|
||
|
828, 831, 834, 838, 842, 845, 848, 851,
|
||
|
854, 857, 860, 863, 866, 869, 872, 875,
|
||
|
878, 880, 884, 890, 894, 897, 903, 921,
|
||
|
924, 927, 930, 933, 936, 939, 942, 945,
|
||
|
948, 951, 954, 957, 960, 963, 966, 969,
|
||
|
972, 975, 978, 981, 984, 987, 991, 995,
|
||
|
998, 1001, 1004, 1007, 1010, 1013, 1016, 1019,
|
||
|
1022, 1025, 1028, 1031, 1033, 1035, 1037
|
||
|
];
|
||
|
|
||
|
const _lexer_indicies = [
|
||
|
2, 1, 3, 4, 5, 6, 7, 8,
|
||
|
9, 10, 11, 12, 13, 14, 14, 15,
|
||
|
16, 1, 0, 2, 1, 3, 4, 5,
|
||
|
6, 7, 8, 9, 10, 11, 12, 13,
|
||
|
14, 14, 15, 1, 0, 17, 0, 18,
|
||
|
0, 20, 21, 19, 23, 24, 22, 27,
|
||
|
26, 28, 26, 25, 31, 30, 32, 30,
|
||
|
29, 31, 30, 33, 30, 29, 31, 30,
|
||
|
34, 30, 29, 36, 35, 35, 0, 2,
|
||
|
37, 37, 0, 39, 40, 38, 2, 0,
|
||
|
41, 0, 42, 0, 43, 0, 44, 0,
|
||
|
45, 0, 46, 0, 47, 0, 48, 0,
|
||
|
49, 0, 50, 0, 51, 0, 52, 0,
|
||
|
53, 0, 54, 0, 55, 0, 57, 58,
|
||
|
56, 60, 61, 59, 0, 0, 0, 0,
|
||
|
62, 63, 64, 63, 63, 66, 65, 62,
|
||
|
2, 67, 7, 67, 0, 68, 0, 69,
|
||
|
0, 70, 71, 0, 72, 0, 73, 0,
|
||
|
74, 0, 75, 0, 76, 0, 77, 0,
|
||
|
78, 0, 79, 0, 80, 0, 82, 81,
|
||
|
84, 83, 84, 85, 86, 87, 88, 86,
|
||
|
89, 90, 91, 92, 93, 94, 94, 85,
|
||
|
83, 84, 95, 83, 84, 96, 83, 84,
|
||
|
97, 83, 84, 98, 83, 84, 99, 83,
|
||
|
84, 100, 83, 84, 101, 83, 84, 102,
|
||
|
83, 84, 103, 83, 84, 104, 83, 84,
|
||
|
105, 83, 84, 106, 83, 84, 107, 83,
|
||
|
84, 108, 83, 84, 109, 83, 111, 110,
|
||
|
112, 113, 114, 115, 116, 117, 118, 119,
|
||
|
120, 121, 122, 123, 123, 124, 110, 0,
|
||
|
125, 0, 126, 0, 127, 0, 128, 0,
|
||
|
129, 0, 130, 0, 131, 0, 132, 0,
|
||
|
134, 133, 136, 135, 136, 137, 138, 139,
|
||
|
138, 137, 135, 136, 140, 135, 136, 141,
|
||
|
135, 136, 142, 135, 136, 143, 135, 136,
|
||
|
144, 135, 136, 145, 135, 136, 146, 135,
|
||
|
147, 0, 148, 0, 149, 0, 150, 0,
|
||
|
151, 0, 152, 0, 153, 0, 155, 154,
|
||
|
157, 156, 157, 158, 159, 160, 159, 161,
|
||
|
162, 163, 164, 158, 156, 157, 165, 156,
|
||
|
157, 166, 156, 157, 167, 156, 157, 168,
|
||
|
156, 157, 169, 156, 157, 170, 156, 157,
|
||
|
171, 156, 157, 172, 156, 157, 173, 156,
|
||
|
157, 174, 156, 157, 175, 156, 157, 176,
|
||
|
156, 157, 177, 156, 157, 178, 156, 157,
|
||
|
179, 156, 157, 180, 156, 157, 181, 156,
|
||
|
157, 182, 156, 157, 183, 156, 157, 184,
|
||
|
156, 157, 185, 156, 157, 186, 156, 157,
|
||
|
187, 156, 157, 188, 156, 157, 189, 156,
|
||
|
157, 190, 156, 157, 191, 156, 157, 192,
|
||
|
156, 157, 193, 156, 157, 194, 156, 157,
|
||
|
187, 156, 157, 195, 156, 157, 196, 156,
|
||
|
157, 197, 156, 157, 198, 156, 157, 199,
|
||
|
156, 157, 187, 156, 157, 200, 156, 157,
|
||
|
201, 156, 157, 202, 156, 157, 203, 156,
|
||
|
157, 204, 156, 157, 205, 156, 157, 206,
|
||
|
156, 157, 207, 188, 187, 156, 157, 208,
|
||
|
209, 156, 157, 210, 156, 157, 211, 156,
|
||
|
157, 212, 156, 157, 213, 156, 157, 199,
|
||
|
156, 157, 214, 156, 157, 215, 156, 157,
|
||
|
216, 156, 157, 217, 156, 157, 218, 156,
|
||
|
157, 199, 156, 219, 0, 220, 0, 221,
|
||
|
0, 69, 0, 222, 0, 223, 0, 224,
|
||
|
0, 225, 0, 226, 0, 227, 0, 228,
|
||
|
0, 229, 230, 131, 0, 231, 232, 0,
|
||
|
233, 0, 234, 0, 235, 0, 236, 0,
|
||
|
237, 0, 238, 0, 239, 0, 241, 240,
|
||
|
243, 242, 243, 244, 245, 246, 247, 245,
|
||
|
248, 249, 250, 251, 252, 253, 253, 244,
|
||
|
242, 243, 254, 242, 243, 255, 242, 243,
|
||
|
256, 242, 243, 257, 242, 243, 258, 242,
|
||
|
243, 259, 242, 243, 260, 242, 243, 261,
|
||
|
242, 243, 262, 242, 243, 263, 242, 243,
|
||
|
264, 242, 243, 265, 242, 243, 266, 242,
|
||
|
243, 267, 242, 243, 268, 242, 243, 269,
|
||
|
242, 243, 270, 242, 243, 271, 242, 243,
|
||
|
270, 242, 243, 272, 242, 243, 273, 242,
|
||
|
243, 274, 242, 243, 275, 242, 243, 276,
|
||
|
242, 243, 277, 242, 243, 268, 242, 243,
|
||
|
278, 242, 243, 279, 242, 243, 280, 242,
|
||
|
243, 270, 242, 243, 281, 242, 243, 282,
|
||
|
242, 243, 283, 242, 243, 284, 242, 243,
|
||
|
285, 242, 243, 286, 242, 243, 277, 242,
|
||
|
243, 279, 242, 287, 0, 288, 0, 289,
|
||
|
0, 290, 0, 291, 0, 237, 0, 293,
|
||
|
292, 295, 294, 295, 296, 297, 298, 299,
|
||
|
297, 300, 301, 302, 303, 304, 305, 305,
|
||
|
296, 294, 295, 306, 294, 295, 307, 294,
|
||
|
295, 308, 294, 295, 309, 294, 295, 310,
|
||
|
294, 295, 311, 294, 295, 312, 294, 295,
|
||
|
313, 294, 295, 314, 294, 295, 315, 294,
|
||
|
295, 316, 294, 295, 317, 294, 295, 318,
|
||
|
294, 295, 319, 294, 295, 320, 294, 295,
|
||
|
321, 294, 295, 322, 294, 295, 323, 324,
|
||
|
294, 295, 325, 294, 295, 326, 294, 295,
|
||
|
327, 294, 295, 328, 294, 295, 329, 294,
|
||
|
295, 330, 294, 295, 331, 294, 295, 332,
|
||
|
294, 295, 320, 294, 295, 322, 294, 295,
|
||
|
333, 294, 295, 334, 294, 295, 335, 294,
|
||
|
295, 336, 294, 295, 337, 294, 295, 332,
|
||
|
294, 295, 338, 294, 295, 339, 294, 295,
|
||
|
340, 294, 295, 322, 294, 295, 341, 294,
|
||
|
295, 342, 294, 295, 343, 294, 295, 344,
|
||
|
294, 295, 345, 294, 295, 346, 294, 295,
|
||
|
347, 294, 295, 348, 320, 294, 295, 349,
|
||
|
350, 294, 295, 351, 294, 295, 352, 294,
|
||
|
295, 353, 294, 295, 354, 294, 295, 337,
|
||
|
294, 295, 355, 294, 295, 356, 294, 295,
|
||
|
357, 294, 295, 358, 294, 295, 359, 294,
|
||
|
295, 337, 294, 295, 339, 294, 220, 0,
|
||
|
360, 361, 360, 0, 364, 363, 365, 366,
|
||
|
363, 362, 0, 368, 369, 367, 0, 368,
|
||
|
367, 364, 370, 368, 369, 370, 367, 364,
|
||
|
371, 372, 373, 374, 375, 376, 377, 378,
|
||
|
379, 380, 381, 382, 383, 383, 384, 371,
|
||
|
0, 84, 385, 83, 84, 386, 83, 84,
|
||
|
387, 83, 84, 386, 83, 84, 388, 83,
|
||
|
84, 389, 83, 84, 390, 83, 84, 391,
|
||
|
83, 84, 392, 83, 84, 393, 83, 84,
|
||
|
109, 83, 84, 394, 83, 84, 395, 83,
|
||
|
84, 396, 83, 84, 386, 83, 84, 397,
|
||
|
83, 84, 398, 83, 84, 399, 83, 84,
|
||
|
400, 83, 84, 401, 83, 84, 402, 83,
|
||
|
84, 403, 83, 84, 404, 109, 83, 84,
|
||
|
405, 406, 83, 84, 407, 83, 84, 408,
|
||
|
83, 84, 409, 83, 84, 410, 83, 84,
|
||
|
392, 83, 84, 411, 83, 84, 412, 83,
|
||
|
84, 413, 83, 84, 414, 83, 84, 415,
|
||
|
83, 84, 392, 83, 84, 395, 83, 69,
|
||
|
0, 416, 0, 1, 0, 417, 0
|
||
|
];
|
||
|
|
||
|
const _lexer_trans_targs = [
|
||
|
0, 2, 2, 3, 13, 15, 29, 32,
|
||
|
35, 37, 66, 84, 151, 155, 280, 281,
|
||
|
324, 4, 5, 6, 7, 6, 6, 7,
|
||
|
6, 8, 8, 8, 9, 8, 8, 8,
|
||
|
9, 10, 11, 12, 2, 12, 13, 2,
|
||
|
14, 16, 17, 18, 19, 20, 21, 22,
|
||
|
23, 24, 25, 26, 27, 28, 326, 30,
|
||
|
31, 2, 14, 31, 2, 14, 33, 34,
|
||
|
2, 33, 32, 34, 36, 29, 38, 323,
|
||
|
39, 40, 41, 42, 43, 44, 45, 46,
|
||
|
47, 48, 49, 48, 49, 49, 2, 50,
|
||
|
64, 287, 289, 291, 298, 302, 322, 51,
|
||
|
52, 53, 54, 55, 56, 57, 58, 59,
|
||
|
60, 61, 62, 63, 2, 65, 2, 2,
|
||
|
3, 13, 15, 29, 32, 35, 37, 66,
|
||
|
84, 151, 155, 280, 281, 67, 68, 69,
|
||
|
70, 71, 72, 73, 74, 75, 76, 75,
|
||
|
76, 76, 2, 77, 78, 79, 80, 81,
|
||
|
82, 83, 65, 85, 86, 87, 88, 89,
|
||
|
90, 91, 92, 93, 92, 93, 93, 2,
|
||
|
94, 108, 118, 125, 131, 95, 96, 97,
|
||
|
98, 99, 100, 101, 102, 103, 104, 105,
|
||
|
106, 107, 2, 109, 110, 111, 112, 113,
|
||
|
114, 115, 116, 117, 65, 119, 120, 121,
|
||
|
122, 123, 124, 126, 127, 128, 129, 130,
|
||
|
132, 133, 134, 135, 136, 137, 138, 139,
|
||
|
140, 145, 141, 142, 143, 144, 146, 147,
|
||
|
148, 149, 150, 152, 153, 154, 156, 157,
|
||
|
158, 159, 160, 161, 162, 163, 218, 164,
|
||
|
212, 165, 166, 167, 168, 169, 170, 171,
|
||
|
172, 173, 172, 173, 173, 2, 174, 188,
|
||
|
189, 191, 193, 200, 204, 211, 175, 176,
|
||
|
177, 178, 179, 180, 181, 182, 183, 184,
|
||
|
185, 186, 187, 2, 65, 190, 188, 192,
|
||
|
194, 195, 196, 197, 198, 199, 201, 202,
|
||
|
203, 205, 206, 207, 208, 209, 210, 213,
|
||
|
214, 215, 216, 217, 219, 220, 219, 220,
|
||
|
220, 2, 221, 235, 236, 238, 249, 255,
|
||
|
259, 279, 222, 223, 224, 225, 226, 227,
|
||
|
228, 229, 230, 231, 232, 233, 234, 2,
|
||
|
65, 237, 235, 239, 248, 240, 241, 242,
|
||
|
243, 244, 245, 246, 247, 250, 251, 252,
|
||
|
253, 254, 256, 257, 258, 260, 261, 262,
|
||
|
263, 264, 265, 266, 267, 268, 273, 269,
|
||
|
270, 271, 272, 274, 275, 276, 277, 278,
|
||
|
281, 282, 283, 285, 286, 284, 282, 283,
|
||
|
284, 282, 285, 286, 3, 13, 15, 29,
|
||
|
32, 35, 37, 66, 84, 151, 155, 280,
|
||
|
281, 288, 64, 290, 292, 293, 294, 295,
|
||
|
296, 297, 299, 300, 301, 303, 304, 305,
|
||
|
306, 307, 308, 309, 310, 311, 316, 312,
|
||
|
313, 314, 315, 317, 318, 319, 320, 321,
|
||
|
325, 0
|
||
|
];
|
||
|
|
||
|
const _lexer_trans_actions = [
|
||
|
43, 0, 54, 3, 1, 0, 29, 1,
|
||
|
29, 29, 29, 29, 29, 29, 29, 35,
|
||
|
0, 0, 0, 7, 139, 48, 0, 102,
|
||
|
9, 5, 45, 134, 45, 0, 33, 122,
|
||
|
33, 33, 0, 11, 106, 0, 0, 114,
|
||
|
25, 0, 0, 0, 0, 0, 0, 0,
|
||
|
0, 0, 0, 0, 0, 0, 0, 0,
|
||
|
57, 149, 126, 0, 110, 23, 0, 27,
|
||
|
118, 27, 51, 0, 0, 0, 0, 0,
|
||
|
0, 0, 0, 0, 0, 0, 0, 0,
|
||
|
0, 57, 144, 0, 54, 0, 72, 33,
|
||
|
84, 84, 84, 84, 84, 84, 84, 0,
|
||
|
0, 0, 0, 0, 0, 0, 0, 0,
|
||
|
0, 0, 0, 0, 15, 15, 31, 130,
|
||
|
60, 57, 31, 63, 57, 63, 63, 63,
|
||
|
63, 63, 63, 63, 66, 0, 0, 0,
|
||
|
0, 0, 0, 0, 0, 57, 144, 0,
|
||
|
54, 0, 81, 84, 0, 0, 0, 0,
|
||
|
0, 0, 21, 0, 0, 0, 0, 0,
|
||
|
0, 0, 57, 144, 0, 54, 0, 69,
|
||
|
33, 84, 84, 84, 84, 0, 0, 0,
|
||
|
0, 0, 0, 0, 0, 0, 0, 0,
|
||
|
0, 0, 13, 0, 0, 0, 0, 0,
|
||
|
0, 0, 0, 0, 13, 0, 0, 0,
|
||
|
0, 0, 0, 0, 0, 0, 0, 0,
|
||
|
0, 0, 0, 0, 0, 0, 0, 0,
|
||
|
0, 0, 0, 0, 0, 0, 0, 0,
|
||
|
0, 0, 0, 0, 0, 0, 0, 0,
|
||
|
0, 0, 0, 0, 0, 0, 0, 0,
|
||
|
0, 0, 0, 0, 0, 0, 0, 0,
|
||
|
57, 144, 0, 54, 0, 78, 33, 84,
|
||
|
84, 84, 84, 84, 84, 84, 0, 0,
|
||
|
0, 0, 0, 0, 0, 0, 0, 0,
|
||
|
0, 0, 0, 19, 19, 0, 0, 0,
|
||
|
0, 0, 0, 0, 0, 0, 0, 0,
|
||
|
0, 0, 0, 0, 0, 0, 0, 0,
|
||
|
0, 0, 0, 0, 57, 144, 0, 54,
|
||
|
0, 75, 33, 84, 84, 84, 84, 84,
|
||
|
84, 84, 0, 0, 0, 0, 0, 0,
|
||
|
0, 0, 0, 0, 0, 0, 0, 17,
|
||
|
17, 0, 0, 0, 0, 0, 0, 0,
|
||
|
0, 0, 0, 0, 0, 0, 0, 0,
|
||
|
0, 0, 0, 0, 0, 0, 0, 0,
|
||
|
0, 0, 0, 0, 0, 0, 0, 0,
|
||
|
0, 0, 0, 0, 0, 0, 0, 0,
|
||
|
0, 0, 37, 37, 54, 37, 87, 0,
|
||
|
0, 39, 0, 0, 93, 90, 41, 96,
|
||
|
90, 96, 96, 96, 96, 96, 96, 96,
|
||
|
99, 0, 0, 0, 0, 0, 0, 0,
|
||
|
0, 0, 0, 0, 0, 0, 0, 0,
|
||
|
0, 0, 0, 0, 0, 0, 0, 0,
|
||
|
0, 0, 0, 0, 0, 0, 0, 0,
|
||
|
0, 0
|
||
|
];
|
||
|
|
||
|
const _lexer_eof_actions = [
|
||
|
0, 43, 43, 43, 43, 43, 43, 43,
|
||
|
43, 43, 43, 43, 43, 43, 43, 43,
|
||
|
43, 43, 43, 43, 43, 43, 43, 43,
|
||
|
43, 43, 43, 43, 43, 43, 43, 43,
|
||
|
43, 43, 43, 43, 43, 43, 43, 43,
|
||
|
43, 43, 43, 43, 43, 43, 43, 43,
|
||
|
43, 43, 43, 43, 43, 43, 43, 43,
|
||
|
43, 43, 43, 43, 43, 43, 43, 43,
|
||
|
43, 43, 43, 43, 43, 43, 43, 43,
|
||
|
43, 43, 43, 43, 43, 43, 43, 43,
|
||
|
43, 43, 43, 43, 43, 43, 43, 43,
|
||
|
43, 43, 43, 43, 43, 43, 43, 43,
|
||
|
43, 43, 43, 43, 43, 43, 43, 43,
|
||
|
43, 43, 43, 43, 43, 43, 43, 43,
|
||
|
43, 43, 43, 43, 43, 43, 43, 43,
|
||
|
43, 43, 43, 43, 43, 43, 43, 43,
|
||
|
43, 43, 43, 43, 43, 43, 43, 43,
|
||
|
43, 43, 43, 43, 43, 43, 43, 43,
|
||
|
43, 43, 43, 43, 43, 43, 43, 43,
|
||
|
43, 43, 43, 43, 43, 43, 43, 43,
|
||
|
43, 43, 43, 43, 43, 43, 43, 43,
|
||
|
43, 43, 43, 43, 43, 43, 43, 43,
|
||
|
43, 43, 43, 43, 43, 43, 43, 43,
|
||
|
43, 43, 43, 43, 43, 43, 43, 43,
|
||
|
43, 43, 43, 43, 43, 43, 43, 43,
|
||
|
43, 43, 43, 43, 43, 43, 43, 43,
|
||
|
43, 43, 43, 43, 43, 43, 43, 43,
|
||
|
43, 43, 43, 43, 43, 43, 43, 43,
|
||
|
43, 43, 43, 43, 43, 43, 43, 43,
|
||
|
43, 43, 43, 43, 43, 43, 43, 43,
|
||
|
43, 43, 43, 43, 43, 43, 43, 43,
|
||
|
43, 43, 43, 43, 43, 43, 43, 43,
|
||
|
43, 43, 43, 43, 43, 43, 43, 43,
|
||
|
43, 43, 43, 43, 43, 43, 43, 43,
|
||
|
43, 43, 43, 43, 43, 43, 43, 43,
|
||
|
43, 43, 43, 43, 43, 43, 43, 43,
|
||
|
43, 43, 43, 43, 43, 43, 43, 43,
|
||
|
43, 43, 43, 43, 43, 43, 43, 43,
|
||
|
43, 43, 43, 43, 43, 43, 43, 43,
|
||
|
43, 43, 43, 43, 43, 43, 43, 43,
|
||
|
43, 43, 43, 43, 43, 43, 43
|
||
|
];
|
||
|
|
||
|
const lexer_start = 1;
|
||
|
const lexer_first_final = 326;
|
||
|
const lexer_error = 0;
|
||
|
|
||
|
const lexer_en_main = 1;
|
||
|
|
||
|
|
||
|
/* line 129 "/Users/ahellesoy/scm/gherkin/tasks/../ragel/i18n/en.js.rl" */
|
||
|
|
||
|
/* line 130 "/Users/ahellesoy/scm/gherkin/tasks/../ragel/i18n/en.js.rl" */
|
||
|
|
||
|
/* line 131 "/Users/ahellesoy/scm/gherkin/tasks/../ragel/i18n/en.js.rl" */
|
||
|
|
||
|
var Lexer = function(listener) {
|
||
|
// Check that listener has the required functions
|
||
|
var events = ['comment', 'tag', 'feature', 'background', 'scenario', 'scenario_outline', 'examples', 'step', 'doc_string', 'row', 'eof'];
|
||
|
for(e in events) {
|
||
|
var event = events[e];
|
||
|
if(typeof listener[event] != 'function') {
|
||
|
"Error. No " + event + " function exists on " + JSON.stringify(listener);
|
||
|
}
|
||
|
}
|
||
|
this.listener = listener;
|
||
|
};
|
||
|
|
||
|
Lexer.prototype.scan = function(data) {
|
||
|
var ending = "\n%_FEATURE_END_%";
|
||
|
if(typeof data == 'string') {
|
||
|
data = this.stringToBytes(data + ending);
|
||
|
} else if(typeof Buffer != 'undefined' && Buffer.isBuffer(data)) {
|
||
|
// Node.js
|
||
|
var buf = new Buffer(data.length + ending.length);
|
||
|
data.copy(buf, 0, 0);
|
||
|
new Buffer(ending).copy(buf, data.length, 0);
|
||
|
data = buf;
|
||
|
}
|
||
|
var eof = pe = data.length;
|
||
|
var p = 0;
|
||
|
|
||
|
this.line_number = 1;
|
||
|
this.last_newline = 0;
|
||
|
|
||
|
|
||
|
/* line 638 "js/lib/gherkin/lexer/en.js" */
|
||
|
{
|
||
|
this.cs = lexer_start;
|
||
|
} /* JSCodeGen::writeInit */
|
||
|
|
||
|
/* line 162 "/Users/ahellesoy/scm/gherkin/tasks/../ragel/i18n/en.js.rl" */
|
||
|
|
||
|
/* line 645 "js/lib/gherkin/lexer/en.js" */
|
||
|
{
|
||
|
var _klen, _trans, _keys, _ps, _widec, _acts, _nacts;
|
||
|
var _goto_level, _resume, _eof_trans, _again, _test_eof;
|
||
|
var _out;
|
||
|
_klen = _trans = _keys = _acts = _nacts = null;
|
||
|
_goto_level = 0;
|
||
|
_resume = 10;
|
||
|
_eof_trans = 15;
|
||
|
_again = 20;
|
||
|
_test_eof = 30;
|
||
|
_out = 40;
|
||
|
while (true) {
|
||
|
_trigger_goto = false;
|
||
|
if (_goto_level <= 0) {
|
||
|
if (p == pe) {
|
||
|
_goto_level = _test_eof;
|
||
|
continue;
|
||
|
}
|
||
|
if ( this.cs == 0) {
|
||
|
_goto_level = _out;
|
||
|
continue;
|
||
|
}
|
||
|
}
|
||
|
if (_goto_level <= _resume) {
|
||
|
_keys = _lexer_key_offsets[ this.cs];
|
||
|
_trans = _lexer_index_offsets[ this.cs];
|
||
|
_klen = _lexer_single_lengths[ this.cs];
|
||
|
_break_match = false;
|
||
|
|
||
|
do {
|
||
|
if (_klen > 0) {
|
||
|
_lower = _keys;
|
||
|
_upper = _keys + _klen - 1;
|
||
|
|
||
|
while (true) {
|
||
|
if (_upper < _lower) { break; }
|
||
|
_mid = _lower + ( (_upper - _lower) >> 1 );
|
||
|
|
||
|
if ( data[p] < _lexer_trans_keys[_mid]) {
|
||
|
_upper = _mid - 1;
|
||
|
} else if ( data[p] > _lexer_trans_keys[_mid]) {
|
||
|
_lower = _mid + 1;
|
||
|
} else {
|
||
|
_trans += (_mid - _keys);
|
||
|
_break_match = true;
|
||
|
break;
|
||
|
};
|
||
|
} /* while */
|
||
|
if (_break_match) { break; }
|
||
|
_keys += _klen;
|
||
|
_trans += _klen;
|
||
|
}
|
||
|
_klen = _lexer_range_lengths[ this.cs];
|
||
|
if (_klen > 0) {
|
||
|
_lower = _keys;
|
||
|
_upper = _keys + (_klen << 1) - 2;
|
||
|
while (true) {
|
||
|
if (_upper < _lower) { break; }
|
||
|
_mid = _lower + (((_upper-_lower) >> 1) & ~1);
|
||
|
if ( data[p] < _lexer_trans_keys[_mid]) {
|
||
|
_upper = _mid - 2;
|
||
|
} else if ( data[p] > _lexer_trans_keys[_mid+1]) {
|
||
|
_lower = _mid + 2;
|
||
|
} else {
|
||
|
_trans += ((_mid - _keys) >> 1);
|
||
|
_break_match = true;
|
||
|
break;
|
||
|
}
|
||
|
} /* while */
|
||
|
if (_break_match) { break; }
|
||
|
_trans += _klen
|
||
|
}
|
||
|
} while (false);
|
||
|
_trans = _lexer_indicies[_trans];
|
||
|
this.cs = _lexer_trans_targs[_trans];
|
||
|
if (_lexer_trans_actions[_trans] != 0) {
|
||
|
_acts = _lexer_trans_actions[_trans];
|
||
|
_nacts = _lexer_actions[_acts];
|
||
|
_acts += 1;
|
||
|
while (_nacts > 0) {
|
||
|
_nacts -= 1;
|
||
|
_acts += 1;
|
||
|
switch (_lexer_actions[_acts - 1]) {
|
||
|
case 0:
|
||
|
/* line 6 "/Users/ahellesoy/scm/gherkin/tasks/../ragel/i18n/en.js.rl" */
|
||
|
|
||
|
this.content_start = p;
|
||
|
this.current_line = this.line_number;
|
||
|
this.start_col = p - this.last_newline - (this.keyword+':').length;
|
||
|
break;
|
||
|
case 1:
|
||
|
/* line 12 "/Users/ahellesoy/scm/gherkin/tasks/../ragel/i18n/en.js.rl" */
|
||
|
|
||
|
this.current_line = this.line_number;
|
||
|
this.start_col = p - this.last_newline;
|
||
|
break;
|
||
|
case 2:
|
||
|
/* line 17 "/Users/ahellesoy/scm/gherkin/tasks/../ragel/i18n/en.js.rl" */
|
||
|
|
||
|
this.content_start = p;
|
||
|
break;
|
||
|
case 3:
|
||
|
/* line 21 "/Users/ahellesoy/scm/gherkin/tasks/../ragel/i18n/en.js.rl" */
|
||
|
|
||
|
this.docstring_content_type_start = p;
|
||
|
break;
|
||
|
case 4:
|
||
|
/* line 25 "/Users/ahellesoy/scm/gherkin/tasks/../ragel/i18n/en.js.rl" */
|
||
|
|
||
|
this.docstring_content_type_end = p;
|
||
|
break;
|
||
|
case 5:
|
||
|
/* line 29 "/Users/ahellesoy/scm/gherkin/tasks/../ragel/i18n/en.js.rl" */
|
||
|
|
||
|
var con = this.unindent(
|
||
|
this.start_col,
|
||
|
this.bytesToString(data.slice(this.content_start, this.next_keyword_start-1)).replace(/(\r?\n)?([\t ])*$/, '').replace(/\\\"\\\"\\\"/mg, '"""')
|
||
|
);
|
||
|
var con_type = this.bytesToString(data.slice(this.docstring_content_type_start, this.docstring_content_type_end)).trim();
|
||
|
this.listener.doc_string(con_type, con, this.current_line);
|
||
|
break;
|
||
|
case 6:
|
||
|
/* line 38 "/Users/ahellesoy/scm/gherkin/tasks/../ragel/i18n/en.js.rl" */
|
||
|
|
||
|
p = this.store_keyword_content('feature', data, p, eof);
|
||
|
break;
|
||
|
case 7:
|
||
|
/* line 42 "/Users/ahellesoy/scm/gherkin/tasks/../ragel/i18n/en.js.rl" */
|
||
|
|
||
|
p = this.store_keyword_content('background', data, p, eof);
|
||
|
break;
|
||
|
case 8:
|
||
|
/* line 46 "/Users/ahellesoy/scm/gherkin/tasks/../ragel/i18n/en.js.rl" */
|
||
|
|
||
|
p = this.store_keyword_content('scenario', data, p, eof);
|
||
|
break;
|
||
|
case 9:
|
||
|
/* line 50 "/Users/ahellesoy/scm/gherkin/tasks/../ragel/i18n/en.js.rl" */
|
||
|
|
||
|
p = this.store_keyword_content('scenario_outline', data, p, eof);
|
||
|
break;
|
||
|
case 10:
|
||
|
/* line 54 "/Users/ahellesoy/scm/gherkin/tasks/../ragel/i18n/en.js.rl" */
|
||
|
|
||
|
p = this.store_keyword_content('examples', data, p, eof);
|
||
|
break;
|
||
|
case 11:
|
||
|
/* line 58 "/Users/ahellesoy/scm/gherkin/tasks/../ragel/i18n/en.js.rl" */
|
||
|
|
||
|
var con = this.bytesToString(data.slice(this.content_start, p)).trim();
|
||
|
this.listener.step(this.keyword, con, this.current_line);
|
||
|
break;
|
||
|
case 12:
|
||
|
/* line 63 "/Users/ahellesoy/scm/gherkin/tasks/../ragel/i18n/en.js.rl" */
|
||
|
|
||
|
var con = this.bytesToString(data.slice(this.content_start, p)).trim();
|
||
|
this.listener.comment(con, this.line_number);
|
||
|
this.keyword_start = null;
|
||
|
break;
|
||
|
case 13:
|
||
|
/* line 69 "/Users/ahellesoy/scm/gherkin/tasks/../ragel/i18n/en.js.rl" */
|
||
|
|
||
|
var con = this.bytesToString(data.slice(this.content_start, p)).trim();
|
||
|
this.listener.tag(con, this.line_number);
|
||
|
this.keyword_start = null;
|
||
|
break;
|
||
|
case 14:
|
||
|
/* line 75 "/Users/ahellesoy/scm/gherkin/tasks/../ragel/i18n/en.js.rl" */
|
||
|
|
||
|
this.line_number++;
|
||
|
break;
|
||
|
case 15:
|
||
|
/* line 79 "/Users/ahellesoy/scm/gherkin/tasks/../ragel/i18n/en.js.rl" */
|
||
|
|
||
|
this.last_newline = p + 1;
|
||
|
break;
|
||
|
case 16:
|
||
|
/* line 83 "/Users/ahellesoy/scm/gherkin/tasks/../ragel/i18n/en.js.rl" */
|
||
|
|
||
|
this.keyword_start = this.keyword_start || p;
|
||
|
break;
|
||
|
case 17:
|
||
|
/* line 87 "/Users/ahellesoy/scm/gherkin/tasks/../ragel/i18n/en.js.rl" */
|
||
|
|
||
|
this.keyword = this.bytesToString(data.slice(this.keyword_start, p)).replace(/:$/, '');
|
||
|
this.keyword_start = null;
|
||
|
break;
|
||
|
case 18:
|
||
|
/* line 92 "/Users/ahellesoy/scm/gherkin/tasks/../ragel/i18n/en.js.rl" */
|
||
|
|
||
|
this.next_keyword_start = p;
|
||
|
break;
|
||
|
case 19:
|
||
|
/* line 96 "/Users/ahellesoy/scm/gherkin/tasks/../ragel/i18n/en.js.rl" */
|
||
|
|
||
|
p = p - 1;
|
||
|
current_row = [];
|
||
|
this.current_line = this.line_number;
|
||
|
break;
|
||
|
case 20:
|
||
|
/* line 102 "/Users/ahellesoy/scm/gherkin/tasks/../ragel/i18n/en.js.rl" */
|
||
|
|
||
|
this.content_start = p;
|
||
|
break;
|
||
|
case 21:
|
||
|
/* line 106 "/Users/ahellesoy/scm/gherkin/tasks/../ragel/i18n/en.js.rl" */
|
||
|
|
||
|
var con = this.bytesToString(data.slice(this.content_start, p)).trim();
|
||
|
current_row.push(con.replace(/\\\|/, "|").replace(/\\n/, "\n").replace(/\\\\/, "\\"));
|
||
|
break;
|
||
|
case 22:
|
||
|
/* line 111 "/Users/ahellesoy/scm/gherkin/tasks/../ragel/i18n/en.js.rl" */
|
||
|
|
||
|
this.listener.row(current_row, this.current_line);
|
||
|
break;
|
||
|
case 23:
|
||
|
/* line 115 "/Users/ahellesoy/scm/gherkin/tasks/../ragel/i18n/en.js.rl" */
|
||
|
|
||
|
if(this.cs < lexer_first_final) {
|
||
|
var content = this.current_line_content(data, p);
|
||
|
throw "Lexing error on line " + this.line_number + ": '" + content + "'. See http://wiki.github.com/cucumber/gherkin/lexingerror for more information.";
|
||
|
} else {
|
||
|
this.listener.eof();
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
/* line 872 "js/lib/gherkin/lexer/en.js" */
|
||
|
} /* action switch */
|
||
|
}
|
||
|
}
|
||
|
if (_trigger_goto) {
|
||
|
continue;
|
||
|
}
|
||
|
}
|
||
|
if (_goto_level <= _again) {
|
||
|
if ( this.cs == 0) {
|
||
|
_goto_level = _out;
|
||
|
continue;
|
||
|
}
|
||
|
p += 1;
|
||
|
if (p != pe) {
|
||
|
_goto_level = _resume;
|
||
|
continue;
|
||
|
}
|
||
|
}
|
||
|
if (_goto_level <= _test_eof) {
|
||
|
if (p == eof) {
|
||
|
__acts = _lexer_eof_actions[ this.cs];
|
||
|
__nacts = _lexer_actions[__acts];
|
||
|
__acts += 1;
|
||
|
while (__nacts > 0) {
|
||
|
__nacts -= 1;
|
||
|
__acts += 1;
|
||
|
switch (_lexer_actions[__acts - 1]) {
|
||
|
case 23:
|
||
|
/* line 115 "/Users/ahellesoy/scm/gherkin/tasks/../ragel/i18n/en.js.rl" */
|
||
|
|
||
|
if(this.cs < lexer_first_final) {
|
||
|
var content = this.current_line_content(data, p);
|
||
|
throw "Lexing error on line " + this.line_number + ": '" + content + "'. See http://wiki.github.com/cucumber/gherkin/lexingerror for more information.";
|
||
|
} else {
|
||
|
this.listener.eof();
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
/* line 911 "js/lib/gherkin/lexer/en.js" */
|
||
|
} /* eof action switch */
|
||
|
}
|
||
|
if (_trigger_goto) {
|
||
|
continue;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
if (_goto_level <= _out) {
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/* line 163 "/Users/ahellesoy/scm/gherkin/tasks/../ragel/i18n/en.js.rl" */
|
||
|
};
|
||
|
|
||
|
Lexer.prototype.bytesToString = function(bytes) {
|
||
|
if(typeof bytes.write == 'function') {
|
||
|
// Node.js
|
||
|
return bytes.toString('utf-8');
|
||
|
} else {
|
||
|
var result = "";
|
||
|
for(var b in bytes) {
|
||
|
result += String.fromCharCode(bytes[b]);
|
||
|
}
|
||
|
return result;
|
||
|
}
|
||
|
};
|
||
|
|
||
|
Lexer.prototype.stringToBytes = function(string) {
|
||
|
var bytes = [];
|
||
|
for(var i = 0; i < string.length; i++) {
|
||
|
bytes[i] = string.charCodeAt(i);
|
||
|
}
|
||
|
return bytes;
|
||
|
};
|
||
|
|
||
|
Lexer.prototype.unindent = function(startcol, text) {
|
||
|
startcol = startcol || 0;
|
||
|
return text.replace(new RegExp('^[\t ]{0,' + startcol + '}', 'gm'), '');
|
||
|
};
|
||
|
|
||
|
Lexer.prototype.store_keyword_content = function(event, data, p, eof) {
|
||
|
var end_point = (!this.next_keyword_start || (p == eof)) ? p : this.next_keyword_start;
|
||
|
var content = this.unindent(this.start_col + 2, this.bytesToString(data.slice(this.content_start, end_point))).replace(/\s+$/,"");
|
||
|
var content_lines = content.split("\n")
|
||
|
var name = content_lines.shift() || "";
|
||
|
name = name.trim();
|
||
|
var description = content_lines.join("\n");
|
||
|
this.listener[event](this.keyword, name, description, this.current_line);
|
||
|
var nks = this.next_keyword_start;
|
||
|
this.next_keyword_start = null;
|
||
|
return nks ? nks - 1 : p;
|
||
|
};
|
||
|
|
||
|
Lexer.prototype.current_line_content = function(data, p) {
|
||
|
var rest = data.slice(this.last_newline, -1);
|
||
|
var end = rest.indexOf(10) || -1;
|
||
|
return this.bytesToString(rest.slice(0, end)).trim();
|
||
|
};
|
||
|
|
||
|
// Node.js export
|
||
|
if(typeof exports !== 'undefined') {
|
||
|
exports.Lexer = Lexer;
|
||
|
}
|
||
|
// Require.js export
|
||
|
if (typeof define !== 'undefined') {
|
||
|
if(define.amd) {
|
||
|
define('gherkin/lexer/en', [], function() {
|
||
|
return Lexer
|
||
|
});
|
||
|
} else {
|
||
|
define('gherkin/lexer/en', function(require, exports, module) {
|
||
|
exports.Lexer = Lexer;
|
||
|
});
|
||
|
}
|
||
|
}
|
||
|
|
||
|
})();
|
||
|
|
||
|
});
|
||
|
|
||
|
require.alias("gherkin/lib/gherkin/lexer/en", "./gherkin/lexer/en");
|