blob: be49963cad59564aac3aca60a35c479d9b78d905 [file] [edit]
function UIElementTest(name) {
TestCase.call(this,name);
}
UIElementTest.prototype = new TestCase();
UIElementTest.prototype.test_UIElement_validate = function() {
var uiElement = new UIElement({
name: 'name'
, description: 'desc'
, xpath: '//a'
});
// happy path 1
uiElement.validate({ name: 'name', description: 'desc', xpath: '//a' });
// happy path 2
uiElement.validate({ name: 'name', description: 'desc',
getLocator: function(args) { return '//a'; } });
// destructive: no name
try {
uiElement.validate({ description: 'desc', xpath: '//a' });
this.fail('Expected UIElementException, but none was thrown');
}
catch (e) {
this.assertEquals('UIElementException', e.name);
}
// destructive: no description
try {
uiElement.validate({ name: 'name', xpath: '//a' });
this.fail('Expected UIElementException, but none was thrown');
}
catch (e) {
this.assertEquals('UIElementException', e.name);
}
// destructive: no xpath
try {
uiElement.validate({ name: 'name', description: 'desc' });
this.fail('Expected UIElementException, but none was thrown');
}
catch (e) {
this.assertEquals('UIElementException', e.name);
}
}
UIElementTest.prototype.test_UIElement_init = function() {
// name, description, args, getLocator, testcases, getDefaultLocators
var uiElement = new UIElement({
name: 'name'
, description: 'desc'
, xpath: '//a'
});
// happy path 1
uiElement.init({ name: 'name', description: 'desc', xpath: '//a' });
this.assertEquals('name', uiElement.name);
this.assertEquals('desc', uiElement.description);
this.assertTrue(are_equal([], uiElement.args));
this.assertEquals('//a', uiElement.getLocator());
this.assertTrue(are_equal([], uiElement.getTestcases()));
this.assertTrue(are_equal({ '//a': {} }, uiElement.getDefaultLocators()));
// happy path 2
uiElement.init({ name: 'name', description: 'desc',
getLocator: function() { return '//a'; } });
this.assertEquals('name', uiElement.name);
this.assertEquals('desc', uiElement.description);
this.assertTrue(are_equal([], uiElement.args));
this.assertEquals('//a', uiElement.getLocator());
this.assertTrue(are_equal([], uiElement.getTestcases()));
this.assertTrue(are_equal({ '//a': {} }, uiElement.getDefaultLocators()));
// happy path 3
uiElement.init({ name: 'name', description: 'desc', args: [],
xpath: '//a', testcase1: { args: {},
xhtml: '<a expected-result="1" />' } });
this.assertEquals('name', uiElement.name);
this.assertEquals('desc', uiElement.description);
this.assertTrue(are_equal([], uiElement.args));
this.assertEquals('//a', uiElement.getLocator());
this.assertTrue(are_equal([ { name: 'testcase1', args: {},
xhtml: '<a expected-result="1" />' } ], uiElement.getTestcases()));
this.assertTrue(are_equal({ '//a': {} }, uiElement.getDefaultLocators()));
}
UIElementTest.prototype.test_UIElement_permuteArgs = function() {
var testUIElement = new UIElement({
name: 'name'
, description: 'desc'
, args: [
{
name: 'arg1',
description: 'desc1',
getDefaultValues: function(inDocument) {
if (inDocument != 'foo') {
throw new Exception('document was not propagated!');
}
return [4, 'g', '*'];
}
},
{
name: 'arg2',
description: 'desc2',
getDefaultValues: function(inDocument) {
if (inDocument != 'foo') {
throw new Exception('document was not propagated!');
}
return [];
}
},
{
name: 'arg3',
description: 'desc3',
defaultValues: ['%', 0, 'q']
}
]
, getLocator: function(args) { return '//a'; }
});
this.assertTrue(are_equal(
[
{arg1: '4', arg3: '%'},
{arg1: '4', arg3: '0'},
{arg1: '4', arg3: 'q'},
{arg1: 'g', arg3: '%'},
{arg1: 'g', arg3: '0'},
{arg1: 'g', arg3: 'q'},
{arg1: '*', arg3: '%'},
{arg1: '*', arg3: '0'},
{arg1: '*', arg3: 'q'}
],
testUIElement.permuteArgs(testUIElement.args, 'foo'))
);
}
UIElementTest.prototype.test_UIElement_permuteArgsRespectsRequiredArguments = function() {
var testUIElement = new UIElement({
name: 'name'
, description: 'desc'
, args: [
{
name: 'arg1',
description: 'desc1',
required: true,
getDefaultValues: function() {
return [];
}
}
, {
name: 'arg3',
description: 'desc3',
required: false,
defaultValues: ['%', 0, 'q']
}
]
, getLocator: function(args) { return '//a'; }
});
this.assertTrue(are_equal([], testUIElement.permuteArgs(testUIElement.args, 'foo')));
}
UIElementTest.prototype.test_UIElement_getTestcases = function() {
var testUIElement = new UIElement({
name: 'name'
, description: 'desc'
, args: []
, getLocator: function(args) {
return "//div[@id='content']";
}
, testcase1: {
xhtml: '<div id="content" expected-result></div>'
}
, testcase2: {
xhtml: '<div id="main"><div id="content" expected-result>'
+ '</div></div>'
}
});
var output = testUIElement.getTestcases();
this.assertArrayEqualsIgnoreOrder(['testcase1','testcase2'], [output[0].name, output[1].name]);
this.assertArrayEqualsIgnoreOrder(['<div id="content" expected-result></div>','<div id="main"><div id="content" expected-result></div></div>'], [output[0].xhtml, output[1].xhtml]);
}
// DGF this test doesn't work in jsunit/rhino without a DOMPar
UIElementTest.prototype.DISABLEDtest_UIElement_test = function() {
var testUIElement = new UIElement({
name: 'name'
, description: 'desc'
, args: []
, getLocator: function(args) {
return "//div[@id='content']";
}
, testcase1: {
xhtml: '<div id="content" expected-result="1"></div>'
}
, testcase2: {
xhtml: '<div id="main"><div id="content" expected-result="1">'
+ '</div></div>'
}
});
this.assertTrue(testUIElement.test());
// more complicated
testUIElement = new UIElement({
name: 'name'
, description: 'desc'
, args: [
{
name: 'index'
, description: 'the index'
, defaultValues: []
}
]
, getLocator: function(args) {
return "//div[@id='section" + args['index'] + "']";
}
, testcase1: {
args: { index: 1 }
, xhtml: '<div id="section1" expected-result="1"></div>'
}
, testcase2: {
args: { index: 42 }
, xhtml: '<div id="section1"><div id="section42" expected-result="1">'
+ '</div></div>'
}
});
this.assertTrue(testUIElement.test());
// destructive
testUIElement = new UIElement({
name: 'name'
, description: 'desc'
, args: [
{
name: 'index'
, description: 'the index'
, defaultValues: []
}
]
, getLocator: function(args) {
return "//div[@id='section" + args['index'] + "']";
}
, testcase1: {
args: { index: 1 }
, xhtml: '<div id="section4" expected-result="1"></div>'
}
});
this.assertFalse(testUIElement.test());
}
UIElementTest.prototype.test_UIElement_initDefaultXPaths = function() {
var testUIElement = new UIElement({
name: 'name'
, description: 'desc'
, args: [
{
name: 'arg1',
description: 'desc1',
defaultValues: [4, 'g', '*']
},
{
name: 'arg2',
description: 'desc2',
defaultValues: []
},
{
name: 'arg3',
description: 'desc3',
defaultValues: ['%', 0, 'q']
}
]
, getLocator: function(args) {
return "//div[@id='" + args['arg1'] + "']/" +
(args['arg2'] ? args['arg2'] : 'span') +
"[@class='" + args['arg3'] + "']/a";
}
});
this.assertTrue(are_equal(
{
"//div[@id='4']/span[@class='%']/a": {arg1: '4', arg3: '%'},
"//div[@id='4']/span[@class='0']/a": {arg1: '4', arg3: '0'},
"//div[@id='4']/span[@class='q']/a": {arg1: '4', arg3: 'q'},
"//div[@id='g']/span[@class='%']/a": {arg1: 'g', arg3: '%'},
"//div[@id='g']/span[@class='0']/a": {arg1: 'g', arg3: '0'},
"//div[@id='g']/span[@class='q']/a": {arg1: 'g', arg3: 'q'},
"//div[@id='*']/span[@class='%']/a": {arg1: '*', arg3: '%'},
"//div[@id='*']/span[@class='0']/a": {arg1: '*', arg3: '0'},
"//div[@id='*']/span[@class='q']/a": {arg1: '*', arg3: 'q'}
},
testUIElement.getDefaultLocators())
);
testUIElement = new UIElement({
name: 'name'
, description: 'desc'
, args: []
, getLocator: function(args) { return "//div[@id='content']"; }
});
this.assertTrue(are_equal(
{
"//div[@id='content']": {}
},
testUIElement.getDefaultLocators())
);
}
UIElementTest.prototype.test_UIArgument_validate = function() {
var uiArgument = new UIArgument({ name: 'name'
, description: 'desc'
, defaultValues: [1, 2]
});
// happy path 1
uiArgument.validate({ name: 'name'
, description: 'desc'
, defaultValues: [1, 2]
});
// happy path 2
uiArgument.validate({ name: 'name'
, description: 'desc'
, getDefaultValues: function() { return [1, 2]; }
});
// destructive: no name
try {
uiArgument.validate({ description: 'desc', defaultValues: [1, 2] });
this.fail('Expected UIArgumentException, but none was thrown');
}
catch (e) {
this.assertEquals('UIArgumentException', e.name);
}
// destructive: no description
try {
uiArgument.validate({ name: 'name', defaultValues: [1, 2] });
this.fail('Expected UIArgumentException, but none was thrown');
}
catch (e) {
this.assertEquals('UIArgumentException', e.name);
}
// destructive: no default values
try {
uiArgument.validate({ name: 'name', description: 'desc' });
this.fail('Expected UIArgumentException, but none was thrown');
}
catch (e) {
this.assertEquals('UIArgumentException', e.name);
}
}
UIElementTest.prototype.test_UIArgument_init = function() {
var uiArgument = new UIArgument({ name: 'name'
, description: 'desc'
, defaultValues: []
});
var localVars = { _foo: 'bar' };
// happy path 1: specifying defaultValues
uiArgument.init({ name: 'name', description: 'desc', defaultValues: [1, 2]},
localVars);
this.assertEquals('name', uiArgument.name);
this.assertEquals('desc', uiArgument.description);
this.assertEquals(false, uiArgument.required);
this.assertTrue(are_equal([1, 2], uiArgument.getDefaultValues()));
this.assertEquals('bar', uiArgument._foo);
// happy path 2: specifying getDefaultValues()
uiArgument.init({ name: 'name', description: 'desc',
getDefaultValues: function() { return [1, 2]; } }, localVars);
this.assertEquals('name', uiArgument.name);
this.assertEquals('desc', uiArgument.description);
this.assertTrue(are_equal([1, 2], uiArgument.getDefaultValues()));
this.assertEquals('bar', uiArgument._foo);
}
// test the UISpecifier constructor. In particular, make sure that the
// components of the UI specifier are created correctly: path, elementName,
// and args. The string can be tested in the tests for UISpecifier methods.
UIElementTest.prototype.test_UISpecifier = function() {
// construct from a UI specifier string
var testUISpecifier =
new UISpecifier('pagesetName::elementName(k1=v1, k2=v2)');
this.assertEquals('pagesetName', testUISpecifier.pagesetName);
this.assertEquals('elementName', testUISpecifier.elementName);
this.assertTrue(are_equal({k1: 'v1', k2: 'v2'}, testUISpecifier.args));
// construct from components
testUISpecifier = new UISpecifier('pagesetName', 'elementName',
{k1: 'v1', k2: 'v2'});
this.assertEquals('pagesetName', testUISpecifier.pagesetName);
this.assertEquals('elementName', testUISpecifier.elementName);
this.assertTrue(are_equal({k1: 'v1', k2: 'v2'}, testUISpecifier.args));
}
UIElementTest.prototype.test_UISpecifier__initFromUISpecifierString = function() {
var testUISpecifier = new UISpecifier('pagesetName::elementName()');
this.assertEquals('pagesetName', testUISpecifier.pagesetName);
this.assertEquals('elementName', testUISpecifier.elementName);
this.assertTrue(are_equal({}, testUISpecifier.args));
testUISpecifier._initFromUISpecifierString('pagesetName::elementName(k1=v1, k2=v2)');
this.assertEquals('pagesetName', testUISpecifier.pagesetName);
this.assertEquals('elementName', testUISpecifier.elementName);
this.assertTrue(are_equal({k1: 'v1', k2: 'v2'}, testUISpecifier.args));
testUISpecifier._initFromUISpecifierString('complex:. pagesetName ::# elementName:*@ ( k1 = v1 , k 2=v2 )');
this.assertEquals('complex:. pagesetName ', testUISpecifier.pagesetName);
this.assertEquals('# elementName:*@ ', testUISpecifier.elementName);
this.assertTrue(are_equal({k1: 'v1', 'k 2': 'v2'}, testUISpecifier.args));
testUISpecifier._initFromUISpecifierString('a::b(k1=v1())');
this.assertTrue(are_equal({k1: 'v1()'}, testUISpecifier.args));
// destructive
try {
testUISpecifier._initFromUISpecifierString('pagesetName::()');
this.fail('Expected UISpecifierException, but none was thrown: missing element name');
}
catch (e) {
this.assertEquals('UISpecifierException', e.name);
}
try {
testUISpecifier._initFromUISpecifierString('elementName()');
this.fail('Expected UISpecifierException, but none was thrown: missing pageset name');
}
catch (e) {
this.assertEquals('UISpecifierException', e.name);
}
try {
testUISpecifier._initFromUISpecifierString('pagesetName::elementName');
this.fail('Expected UISpecifierException, but none was thrown: missing arguments');
}
catch (e) {
this.assertEquals('UISpecifierException', e.name);
}
try {
testUISpecifier._initFromUISpecifierString('pagesetName::elementName(k1=v1, k2=v2');
this.fail('Expected UISpecifierException, but none was thrown: missing close parenthesis for arguments');
}
catch (e) {
this.assertEquals('UISpecifierException', e.name);
}
}
UIElementTest.prototype.test_UISpecifier_toString = function() {
var testUISpecifier = new UISpecifier('pagesetName::elementName()');
// round-tripping the unique test_UISpecifier__initFromUISpecifierString() cases
var inputs = [
{pagesetName: 'pagesetName', elementName: 'elementName', args: {}},
{pagesetName: 'pagesetName', elementName: 'elementName', args: {k1: 'v1', k2: 'v2'}},
{pagesetName: 'complex:. pagesetName ', elementName: '# elementName:*@ ', args: {k1: 'v1', 'k 2': 'v2'}}
];
for (var i = 0; i < inputs.length; ++i) {
testUISpecifier.pagesetName = inputs[i].pagesetName;
testUISpecifier.elementName = inputs[i].elementName;
testUISpecifier.args = inputs[i].args;
var testUISpecifier2 = new UISpecifier(testUISpecifier.toString());
this.assertEquals(inputs[i].pagesetName, testUISpecifier2.pagesetName);
this.assertEquals(inputs[i].elementName, testUISpecifier2.elementName);
this.assertTrue(are_equal(inputs[i].args, testUISpecifier2.args));
}
// destructive
try {
testUISpecifier.pagesetName = undefined;
testUISpecifier.elementName = 'elementName';
testUISpecifier.args = {};
testUISpecifier.toString();
this.fail('Expected exception but none was thrown: undefined pageset name');
}
catch (e) {
this.assertEquals('UISpecifierException', e.name);
}
try {
testUISpecifier.pagesetName = 'pagesetName';
testUISpecifier.elementName = '';
testUISpecifier.args = {};
testUISpecifier.toString();
this.fail('Expected exception but none was thrown: empty element name');
}
catch (e) {
this.assertEquals('UISpecifierException', e.name);
}
try {
testUISpecifier.pagesetName = 'pagesetName';
testUISpecifier.elementName = 'elementName';
testUISpecifier.args = null;
testUISpecifier.toString();
this.fail('Expected exception but none was thrown: empty arguments array');
}
catch (e) {
this.assertEquals('UISpecifierException', e.name);
}
}
UIElementTest.prototype.test_Pageset_init = function() {
var pageset = new Pageset({
name: 'name'
, description: 'desc'
, paths: [ 'foo' ]
});
// happy path 1
pageset.init({
name: 'name'
, description: 'desc'
, pathPrefix: 'foo/'
, paths: [ 'bar', 'baz', 'shizzle.py' ]
});
this.assertEquals('name', pageset.name);
this.assertEquals('desc', pageset.description);
this.assertEquals('^foo\\/(?:bar|baz|shizzle\\.py)$', pageset.pathRegexp.source);
this.assertTrue(are_equal({}, pageset.paramRegexps));
// happy path 2
pageset.init({
name: 'name'
, description: 'desc'
, pathPrefix: 'no.way.'
, pathRegexp: 'to.e'
, paramRegexps: { id: 'wallabee', type: '(?:medium|large)' }
});
this.assertEquals('name', pageset.name);
this.assertEquals('desc', pageset.description);
this.assertEquals('^no\\.way\\.(?:to.e)$', pageset.pathRegexp.source);
this.assertEquals('wallabee', pageset.paramRegexps.id.source);
this.assertEquals('(?:medium|large)', pageset.paramRegexps.type.source);
// happy path: paths only
pageset.init({
name: 'name'
, description: 'desc'
, paths: [ 'just.html', 'do.html', 'it.html' ]
});
this.assertEquals('name', pageset.name);
this.assertEquals('desc', pageset.description);
this.assertEquals('^(?:just\\.html|do\\.html|it\\.html)$',
pageset.pathRegexp.source);
// happy path: pathRegexp only
pageset.init({
name: 'name'
, description: 'desc'
, pathRegexp: '.+\\.rb'
});
this.assertEquals('name', pageset.name);
this.assertEquals('desc', pageset.description);
this.assertEquals('^(?:.+\\.rb)$', pageset.pathRegexp.source);
// omitting both paths and pathRegexp isn't allowed now, but we might allow
// it in the future
try {
pageset.init({
name: 'name'
, description: 'desc'
, pathPrefix: 'helloWorld'
});
this.fail('PagesetException expected but not thrown');
}
catch (e) {
this.assertEquals('PagesetException', e.name);
}
}
UIElementTest.prototype.test_Pageset_contains = function() {
var pageset = new Pageset({
name: 'name'
, description: 'desc'
, pathRegexp: '.*(?:foo|bar).*'
});
var mockDoc = { location: {} };
mockDoc.location.href = 'http://w3.org/food';
this.assertTrue(pageset.contains(mockDoc));
mockDoc.location.href = 'http://w3.org/beach/sandbar.php';
this.assertTrue(pageset.contains(mockDoc));
mockDoc.location.href = 'http://foo.org/baz.html';
this.assertFalse(pageset.contains(mockDoc));
pageset = new Pageset({
name: 'name'
, description: 'desc'
, pathRegexp: '.*(?:foo|bar).*'
, paramRegexps: { 'baz': 'yea' }
});
mockDoc.location.href = 'http://w3.org/food?baz=hellyeah';
this.assertTrue(pageset.contains(mockDoc));
mockDoc.location.href = 'http://w3.org/beach/sandbar.php?lang=zh_CN&baz=yeahbuddy';
this.assertTrue(pageset.contains(mockDoc));
mockDoc.location.href = 'http://w3.org/fool';
this.assertFalse(pageset.contains(mockDoc));
mockDoc.location.href = 'http://w3.org/bar.mitzvah?baz=hag'
this.assertFalse(pageset.contains(mockDoc));
pageset = new Pageset({
name: 'name'
, description: 'desc'
, pathPrefix: 'prefix/'
, paths: [ 'onepath', 'twopath' ]
});
mockDoc.location.href = 'http://w3.org/prefix/onepath';
this.assertTrue(pageset.contains(mockDoc));
mockDoc.location.href = 'http://w3.org/prefix/onepath';
this.assertTrue(pageset.contains(mockDoc));
mockDoc.location.href = 'http://w3.org/prefix/';
this.assertFalse(pageset.contains(mockDoc));
mockDoc.location.href = 'http://w3.org/prefix/foo';
this.assertFalse(pageset.contains(mockDoc));
}
UIElementTest.prototype.test_Pageset_validate = function() {
// no name
try {
new Pageset({ description: 'desc', paths: [ 'foo' ] });
this.fail('Expected PagesetException, but none was thrown');
}
catch (e) {
this.assertEquals('PagesetException', e.name);
}
// no description
try {
new Pageset({ name: 'name', paths: [ 'foo' ] });
this.fail('Expected PagesetException, but none was thrown');
}
catch (e) {
this.assertEquals('PagesetException', e.name);
}
// no paths, pathRegexp, or pageContent
try {
new Pageset({ name: 'name', description: 'desc' });
this.fail('Expected PagesetException, but none was thrown');
}
catch (e) {
this.assertEquals('PagesetException', e.name);
}
// happy paths
new Pageset({ name: 'name', description: 'desc', paths: [ 'foo' ] });
new Pageset({ name: 'name', description: 'desc', pathRegexp: 'bar' });
new Pageset({ name: 'name', description: 'desc', pageContent: function() { return true; } });
}
UIElementTest.prototype.test_UIMap_getUIElementsByUrl = function() {
var myMap = new UIMap(true);
this.assertTrue(myMap.addPageset({
name: 'ishPages'
, description: 'pages whose URLs end with "ish"'
, pathRegexp: '.*ish'
}));
this.assertTrue(myMap.addElement('ishPages', {
name: 'someElement'
, description: 'some real element'
, args: []
, getLocator: function(args) { return "//input"; }
}));
// it's ugly, but it give us coverage! Test "this" in the getDefaultValues()
// and getLocator() methods.
this.assertTrue(myMap.addPageset({
name: 'discPages'
, description: 'pages whose URLs start with "disc"'
, pathRegexp: 'disc.*'
}));
this.assertTrue(myMap.addElement('discPages', {
name: 'anElement'
, description: 'a real element'
, args: [
{
name: 'name'
, description: 'desc'
, getDefaultValues: function() { return keys(this._map); }
}
]
, getLocator: function(args) {
var name = this._map[args['name']];
return "//div[@id='" + name + "']";
}
, _map: {
foo: 'bar'
, baz: 'hep'
}
}));
var uiElement = myMap.getUIElement('discPages', 'anElement');
this.assertArrayEqualsIgnoreOrder(['foo', 'baz'], uiElement.args[0].getDefaultValues());
this.assertEquals("//div[@id='hep']", uiElement.getLocator({name: 'baz'}));
// test forthcoming ...
}
UIElementTest.prototype.test_CommandMatcher_validate = function() {
// no target
try {
new CommandMatcher({ command: 'command' });
this.fail('Expected CommandMatcherException, but none was thrown');
}
catch (e) {
this.assertEquals('CommandMatcherException', e.name);
}
// no command
try {
new CommandMatcher({ target: 'target' });
this.fail('Expected CommandMatcherException, but none was thrown');
}
catch (e) {
this.assertEquals('CommandMatcherException', e.name);
}
// minMatches > maxMatches
try {
new CommandMatcher({
command: 'command'
, target: 'target'
, minMatches: 5
, maxMatches: 1
});
this.fail('Expected CommandMatcherException, but none was thrown');
}
catch (e) {
this.assertEquals('CommandMatcherException', e.name);
}
// happy path
new CommandMatcher({ command: 'command', target: 'target' });
}
UIElementTest.prototype.test_CommandMatcher_init = function() {
var f = function() { };
// happy path, all elements
var cm = new CommandMatcher({
command: 'command'
, target: 'target'
, value: 'value'
, minMatches: 1
, maxMatches: 5
, updateArgs: f
});
this.assertEquals('command', cm.command);
this.assertEquals('target', cm.target);
this.assertEquals('value', cm.value);
this.assertEquals(1, cm.minMatches);
this.assertEquals(5, cm.maxMatches);
this.assertEquals(f, cm.updateArgs);
// leave out all non-required fields
cm = new CommandMatcher({ command: 'command', target: 'target' });
this.assertEquals('command', cm.command);
this.assertEquals('target', cm.target);
this.assertNull(cm.value);
this.assertEquals(1, cm.minMatches);
this.assertEquals(1, cm.maxMatches);
this.assertNotUndefined(cm.updateArgs);
}
UIElementTest.prototype.test_CommandMatcher_match = function() {
// test matching on command, target, and value using regular expressions.
// Assert on the arguments object being updated correctly.
var cm = new CommandMatcher({
command: 'click.*'
, target: 'ui=allPages::.+'
, value: '\\d{4}'
});
// happy path
var command = {
command: 'clickAndWait'
, target: 'ui=allPages::help()'
, value: '2085'
};
this.assertTrue(cm.isMatch(command));
// sad path 1: failed command
command.command = 'type';
this.assertFalse(cm.isMatch(command));
// sad path 2: failed target
command.command = 'click';
command.target = 'password';
this.assertFalse(cm.isMatch(command));
// sad path 3: failed value
command.target = 'ui=allPages::faq()';
command.value = 'asdf';
this.assertFalse(cm.isMatch(command));
}
UIElementTest.prototype.test_RollupRule_getRollup = function() {
var rule = new RollupRule({
name: 'name'
, description: 'desc'
, commandMatchers: [
{
command: 'cmd1'
, target: 'tar\\d'
}
, {
command: 'cmd2'
, target: '[Tt]ar2'
, value: '\\$.*'
}
]
, expandedCommands: []
});
// exact match
var commands = [
new Command('cmd1', 'tar1', '')
, new Command('cmd2', 'Tar2', '$5')
];
var result = rule.getRollup(commands);
this.assertEquals('rollup', result.command);
this.assertEquals('name', result.target);
this.assertEquals('', result.value);
this.assertTrue(are_equal([ 0, 1 ], result.replacementIndexes));
// now we set maxMatches, and have multiple matches for the first
// CommandMatcher
rule.commandMatchers[0].maxMatches = 5;
rule.commandMatchers[0].updateArgs = function(command, args) {
if (args.count) {
++args.count;
}
else {
args.count = 1;
}
return args;
};
commands.unshift(new Command('cmd1', 'tar0'));
commands.unshift(new Command('cmd1', 'tar9'));
result = rule.getRollup(commands);
this.assertTrue(are_equal({ count: '3' }, parse_kwargs(result.value)));
this.assertTrue(are_equal([ 0, 1, 2, 3 ], result.replacementIndexes));
// now we add non-matching commands after
commands.push(new Command('cmd1', 'target'));
commands.push(new Command('cmd2', 'tar2', 'dro$$'));
result = rule.getRollup(commands);
this.assertTrue(are_equal({ count: '3' }, parse_kwargs(result.value)));
this.assertTrue(are_equal([ 0, 1, 2, 3 ], result.replacementIndexes));
// now we set minMatches. The first test should fail to match.
rule.commandMatchers[1].minMatches = 2;
rule.commandMatchers[1].maxMatches = 5;
rule.commandMatchers[1].updateArgs = function(command, args) {
if (args.count2) {
++args.count2;
}
else {
args.count2 = 1;
}
return args;
};
result = rule.getRollup(commands);
this.assertFalse(result);
// this test uses commands that satisfy the minMatches.
commands.splice(4, 0, new Command('cmd2', 'tar2', '$_'));
result = rule.getRollup(commands);
this.assertTrue(are_equal({ count: '3', count2: '2' },
parse_kwargs(result.value)));
this.assertTrue(are_equal([ 0, 1, 2, 3, 4 ], result.replacementIndexes));
// test the alternate command replacement
rule = new RollupRule({
name: 'btnG'
, description: 'desc'
, alternateCommand: 'clickAndWait'
, commandMatchers: [
{
command: 'click'
, target: 'btnG'
}
]
, expandedCommands: []
});
commands = [ new Command('click', 'btnG') ];
result = rule.getRollup(commands);
this.assertEquals('clickAndWait', result.command);
this.assertEquals('btnG', result.target);
}
UIElementTest.prototype.assertArrayEqualsIgnoreOrder = function(arr1, arr2) {
this.assertEquals(arr1.length, arr2.length);
for (var i = 0; i < arr1.length; i++) {
this.assertArrayContains(arr2, arr1[i]);
}
}
UIElementTest.prototype.assertArrayContains = function(arr, val) {
for (var i = 0; i < arr.length; i++) {
if (arr[i] == val) return;
}
this.fail(val);
}