Skip to content
This repository has been archived by the owner on Mar 20, 2024. It is now read-only.

Commit

Permalink
feat(eyes-common, eyes-sdk-core, visual-grid-client): supporting acce…
Browse files Browse the repository at this point in the history
…ssibility regions to match request
  • Loading branch information
danielschwartz85 committed Sep 15, 2019
1 parent be9c713 commit cc9ec8c
Show file tree
Hide file tree
Showing 25 changed files with 549 additions and 37 deletions.
3 changes: 3 additions & 0 deletions packages/eyes-common/browser.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,9 @@
// config
exports.Configuration = require('./lib/config/Configuration').Configuration;
exports.MatchLevel = require('./lib/config/MatchLevel').MatchLevel;
exports.AccessibilityLevel = require('./lib/config/AccessibilityLevel').AccessibilityLevel;
exports.AccessibilityRegionType = require('./lib/config/AccessibilityRegionType').AccessibilityRegionType;
exports.AccessibilityMatchSettings = require('./lib/config/AccessibilityMatchSettings').AccessibilityMatchSettings;
exports.BatchInfo = require('./lib/config/BatchInfo').BatchInfo;
exports.PropertyData = require('./lib/config/PropertyData').PropertyData;
exports.ProxySettings = require('./lib/config/ProxySettings').ProxySettings;
Expand Down
3 changes: 3 additions & 0 deletions packages/eyes-common/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@
// config
exports.Configuration = require('./lib/config/Configuration').Configuration;
exports.MatchLevel = require('./lib/config/MatchLevel').MatchLevel;
exports.AccessibilityLevel = require('./lib/config/AccessibilityLevel').AccessibilityLevel;
exports.AccessibilityRegionType = require('./lib/config/AccessibilityRegionType').AccessibilityRegionType;
exports.AccessibilityMatchSettings = require('./lib/config/AccessibilityMatchSettings').AccessibilityMatchSettings;
exports.BatchInfo = require('./lib/config/BatchInfo').BatchInfo;
exports.PropertyData = require('./lib/config/PropertyData').PropertyData;
exports.ProxySettings = require('./lib/config/ProxySettings').ProxySettings;
Expand Down
132 changes: 132 additions & 0 deletions packages/eyes-common/lib/config/AccessibilityMatchSettings.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,132 @@
'use strict';

const { GeneralUtils } = require('../utils/GeneralUtils');
const { Region } = require('../geometry/Region');
const { ArgumentGuard } = require('../utils/ArgumentGuard');
const { AccessibilityRegionType } = require('./AccessibilityRegionType');

/**
* Encapsulates Accessibility match settings.
*/
class AccessibilityMatchSettings {
/**
* @param {number} left
* @param {number} top
* @param {number} width
* @param {number} height
* @param {AccessibilityRegionType} type
*/
constructor({ left, top, width, height, type } = {}) {
if (arguments.length > 1) {
throw new TypeError('Please, use object as a parameter to the constructor!');
}
ArgumentGuard.isValidEnumValue(type, AccessibilityRegionType);

this._left = left;
this._top = top;
this._width = width;
this._height = height;
this._type = type;
}

// noinspection JSUnusedGlobalSymbols
/**
* @return {number}
*/
getLeft() {
return this._left;
}

// noinspection JSUnusedGlobalSymbols
/**
* @param {number} value
*/
setLeft(value) {
this._left = value;
}

// noinspection JSUnusedGlobalSymbols
/**
* @return {number}
*/
getTop() {
return this._top;
}

// noinspection JSUnusedGlobalSymbols
/**
* @param {number} value
*/
setTop(value) {
this._top = value;
}

/**
* @return {number}
*/
getWidth() {
return this._width;
}

// noinspection JSUnusedGlobalSymbols
/**
* @param {number} value
*/
setWidth(value) {
this._width = value;
}

/**
* @return {number}
*/
getHeight() {
return this._height;
}

// noinspection JSUnusedGlobalSymbols
/**
* @param {number} value
*/
setHeight(value) {
this._height = value;
}

/**
* @return {AccessibilityRegionType}
*/
getType() {
return this._type;
}

// noinspection JSUnusedGlobalSymbols
/**
* @param {AccessibilityRegionType} value
*/
setType(value) {
ArgumentGuard.isValidEnumValue(value, AccessibilityRegionType);
this._type = value;
}

/**
* @return {Region}
*/
getRegion() {
return new Region(this._left, this._top, this._width, this._height);
}

/**
* @override
*/
toJSON() {
return GeneralUtils.toPlain(this);
}

/**
* @override
*/
toString() {
return `AccessibilityMatchSettings { ${JSON.stringify(this)} }`;
}
}

exports.AccessibilityMatchSettings = AccessibilityMatchSettings;
23 changes: 23 additions & 0 deletions packages/eyes-common/lib/config/AccessibilityRegionType.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
'use strict';

/**
* The type of accessibility for a resion.
*
* @readonly
* @enum {string}
*/
const AccessibilityRegionType = {
None: 'None',
RegularText: 'RegularText',
LargeText: 'LargeText',
BoldText: 'BoldText',
EssentialImage: 'EssentialImage',
DisabledOrInactive: 'DisabledOrInactive',
NonEssentialImage: 'NonEssentialImage',
Logo: 'Logo',
Background: 'Background',
Ignore: 'Ignore',
};

Object.freeze(AccessibilityRegionType);
exports.AccessibilityRegionType = AccessibilityRegionType;
25 changes: 24 additions & 1 deletion packages/eyes-common/lib/config/ImageMatchSettings.js
Original file line number Diff line number Diff line change
Expand Up @@ -31,10 +31,11 @@ class ImageMatchSettings {
* @param {Region[]} [layout]
* @param {Region[]} [strict]
* @param {Region[]} [content]
* @param {AccessibilityMatchSettings[]} [accessibility]
* @param {FloatingMatchSettings[]} [floating]
* @param {AccessibilityLevel} [accessibilityLevel]
*/
constructor({ matchLevel, exact, ignoreCaret, useDom, enablePatterns, ignoreDisplacements, ignore, layout, strict, content, floating, accessibilityLevel } = {}) {
constructor({ matchLevel, exact, ignoreCaret, useDom, enablePatterns, ignoreDisplacements, ignore, layout, strict, content, accessibility, floating, accessibilityLevel } = {}) {
if (arguments.length > 1) {
throw new TypeError('Please, use object as a parameter to the constructor!');
}
Expand All @@ -49,6 +50,7 @@ class ImageMatchSettings {
ArgumentGuard.isArray(layout, 'layout', false);
ArgumentGuard.isArray(strict, 'strict', false);
ArgumentGuard.isArray(content, 'content', false);
ArgumentGuard.isArray(accessibility, 'accessibility', false);
ArgumentGuard.isArray(floating, 'floating', false);
ArgumentGuard.isValidType(exact, ExactMatchSettings, false);

Expand All @@ -68,6 +70,8 @@ class ImageMatchSettings {
this._strictRegions = strict || [];
/** @type {Region[]} */
this._contentRegions = content || [];
/** @type {AccessibilityMatchSettings[]} */
this._accessibilityMatchSettings = accessibility || [];
/** @type {FloatingMatchSettings[]} */
this._floatingMatchSettings = floating || [];
}
Expand Down Expand Up @@ -267,6 +271,24 @@ class ImageMatchSettings {
return this._floatingMatchSettings;
}

// noinspection JSUnusedGlobalSymbols
/**
* Sets an array of accessibility regions.
* @param {AccessibilityMatchSettings[]} accessibilityMatchSettings - The array of accessibility regions.
*/
setAccessibilityRegions(accessibilityMatchSettings) {
this._accessibilityMatchSettings = accessibilityMatchSettings;
}

// noinspection JSUnusedGlobalSymbols
/**
* Returns an array of accessibility regions.
* @return {AccessibilityMatchSettings[]} - an array of accessibility regions.
*/
getAccessibilityRegions() {
return this._accessibilityMatchSettings;
}

// noinspection JSUnusedGlobalSymbols
/**
* Sets an array of floating regions.
Expand All @@ -285,6 +307,7 @@ class ImageMatchSettings {
layoutRegions: 'layout',
strictRegions: 'strict',
contentRegions: 'content',
accessibilityMatchSettings: 'accessibility',
floatingMatchSettings: 'floating',
});
}
Expand Down
11 changes: 9 additions & 2 deletions packages/eyes-common/test/unit/config/Configuration.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

const assert = require('assert');

const { Configuration, MatchLevel } = require('../../../index');
const { Configuration, MatchLevel, AccessibilityLevel } = require('../../../index');

describe('Configuration', () => {
describe('constructor', () => {
Expand Down Expand Up @@ -71,6 +71,7 @@ describe('Configuration', () => {
const configuration = new Configuration();

assert.strictEqual(configuration.getMatchLevel(), MatchLevel.Strict);
assert.strictEqual(configuration.getAccessibilityLevel(), AccessibilityLevel.None);
assert.strictEqual(configuration.getIgnoreCaret(), true);
assert.strictEqual(configuration.getUseDom(), false);
assert.strictEqual(configuration.getEnablePatterns(), false);
Expand All @@ -80,12 +81,14 @@ describe('Configuration', () => {
it('set values', () => {
const configuration = new Configuration();
configuration.setMatchLevel(MatchLevel.Content);
configuration.setAccessibilityLevel(AccessibilityLevel.AA);
configuration.setIgnoreCaret(false);
configuration.setUseDom(true);
configuration.setEnablePatterns(true);
configuration.setIgnoreDisplacements(true);

assert.strictEqual(configuration.getMatchLevel(), MatchLevel.Content);
assert.strictEqual(configuration.getAccessibilityLevel(), AccessibilityLevel.AA);
assert.strictEqual(configuration.getIgnoreCaret(), false);
assert.strictEqual(configuration.getUseDom(), true);
assert.strictEqual(configuration.getEnablePatterns(), true);
Expand All @@ -95,20 +98,22 @@ describe('Configuration', () => {
it('to object', () => {
const configuration = new Configuration();
configuration.setMatchLevel(MatchLevel.Content);
configuration.setAccessibilityLevel(AccessibilityLevel.AA);
configuration.setIgnoreCaret(false);
configuration.setUseDom(true);
configuration.setEnablePatterns(true);
configuration.setIgnoreDisplacements(true);

assert.deepStrictEqual(configuration.toJSON().defaultMatchSettings, {
matchLevel: 'Content',
accessibilityLevel: 'None',
accessibilityLevel: 'AA',
enablePatterns: true,
ignoreDisplacements: true,
ignoreCaret: false,
useDom: true,
ignore: [],
content: [],
accessibility: [],
layout: [],
strict: [],
floating: [],
Expand All @@ -120,6 +125,7 @@ describe('Configuration', () => {
const configuration = new Configuration();
configuration.setDefaultMatchSettings({
matchLevel: 'Content',
accessibilityLevel: 'AA',
enablePatterns: true,
ignoreDisplacements: true,
ignoreCaret: false,
Expand All @@ -133,6 +139,7 @@ describe('Configuration', () => {
});

assert.strictEqual(configuration.getMatchLevel(), MatchLevel.Content);
assert.strictEqual(configuration.getAccessibilityLevel(), AccessibilityLevel.AA);
assert.strictEqual(configuration.getIgnoreCaret(), false);
assert.strictEqual(configuration.getUseDom(), true);
assert.strictEqual(configuration.getEnablePatterns(), true);
Expand Down
24 changes: 17 additions & 7 deletions packages/eyes-common/test/unit/config/ImageMatchSettings.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,22 +2,22 @@

const assert = require('assert');

const { MatchLevel, Region, ImageMatchSettings, ExactMatchSettings } = require('../../../index');
const { MatchLevel, AccessibilityLevel, Region, ImageMatchSettings, ExactMatchSettings } = require('../../../index');

describe('ImageMatchSettings', () => {
describe('toJSON()', () => {
it('empty instance', () => {
const ims = new ImageMatchSettings();
const expectedSerialization = '{"matchLevel":"Strict","accessibilityLevel":"None","ignoreCaret":true,"useDom":false,"enablePatterns":false,' +
'"ignoreDisplacements":false,"ignore":[],"layout":[],"strict":[],"content":[],"floating":[]}';
'"ignoreDisplacements":false,"ignore":[],"layout":[],"strict":[],"content":[],"accessibility":[],"floating":[]}';
assert.strictEqual(JSON.stringify(ims), expectedSerialization, 'ImageMatchSettings serialization does not match!');
});

it('with modified exact and ignore caret', () => {
const ims = new ImageMatchSettings({ matchLevel: MatchLevel.Content, exact: new ExactMatchSettings(), ignoreCaret: true });
const expectedSerialization = '{"matchLevel":"Content","accessibilityLevel":"None","ignoreCaret":true,"useDom":false,"enablePatterns":false,' +
const ims = new ImageMatchSettings({ matchLevel: MatchLevel.Content, accessibilityLevel: AccessibilityLevel.AA, exact: new ExactMatchSettings(), ignoreCaret: true });
const expectedSerialization = '{"matchLevel":"Content","accessibilityLevel":"AA","ignoreCaret":true,"useDom":false,"enablePatterns":false,' +
'"ignoreDisplacements":false,"exact":{"minDiffIntensity":0,"minDiffWidth":0,"minDiffHeight":0,"matchThreshold":0},' +
'"ignore":[],"layout":[],"strict":[],"content":[],"floating":[]}';
'"ignore":[],"layout":[],"strict":[],"content":[],"accessibility":[],"floating":[]}';
assert.strictEqual(JSON.stringify(ims), expectedSerialization, 'ImageMatchSettings serialization does not match!');
});

Expand All @@ -26,14 +26,24 @@ describe('ImageMatchSettings', () => {
ims.setIgnoreRegions([new Region(10, 20, 30, 40)]);
const expectedSerialization = '{"matchLevel":"Strict","accessibilityLevel":"None","ignoreCaret":true,"useDom":false,"enablePatterns":false,' +
'"ignoreDisplacements":false,"ignore":[{"left":10,"top":20,"width":30,"height":40,"coordinatesType":' +
'"SCREENSHOT_AS_IS"}],"layout":[],"strict":[],"content":[],"floating":[]}';
'"SCREENSHOT_AS_IS"}],"layout":[],"strict":[],"content":[],"accessibility":[],"floating":[]}';
assert.strictEqual(JSON.stringify(ims), expectedSerialization, 'ImageMatchSettings serialization does not match!');
});

it('with accessibility regions', () => {
const ims = new ImageMatchSettings();
ims.setAccessibilityRegions([new Region(10, 20, 30, 40)]);
const expectedSerialization = '{"matchLevel":"Strict","accessibilityLevel":"None","ignoreCaret":true,"useDom":false,"enablePatterns":false,' +
'"ignoreDisplacements":false,"ignore":[],"layout":[],"strict":[],"content":[],' +
'"accessibility":[{"left":10,"top":20,"width":30,"height":40,"coordinatesType":' +
'"SCREENSHOT_AS_IS"}],"floating":[]}';
assert.strictEqual(JSON.stringify(ims), expectedSerialization, 'ImageMatchSettings serialization does not match!');
});

it('with modified useDom and enablePatterns', () => {
const ims = new ImageMatchSettings({ useDom: true, enablePatterns: false });
const expectedSerialization = '{"matchLevel":"Strict","accessibilityLevel":"None","ignoreCaret":true,"useDom":true,"enablePatterns":false,' +
'"ignoreDisplacements":false,"ignore":[],"layout":[],"strict":[],"content":[],"floating":[]}';
'"ignoreDisplacements":false,"ignore":[],"layout":[],"strict":[],"content":[],"accessibility":[],"floating":[]}';
assert.strictEqual(JSON.stringify(ims), expectedSerialization, 'ImageMatchSettings serialization does not match!');
});
});
Expand Down
2 changes: 2 additions & 0 deletions packages/eyes-sdk-core/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,9 @@ exports.CheckTarget = require('./lib/fluent/CheckTarget').CheckTarget;
exports.GetRegion = require('./lib/fluent/GetRegion').GetRegion;
exports.IgnoreRegionByRectangle = require('./lib/fluent/IgnoreRegionByRectangle').IgnoreRegionByRectangle;
exports.GetFloatingRegion = require('./lib/fluent/GetFloatingRegion').GetFloatingRegion;
exports.GetAccessibilityRegion = require('./lib/fluent/GetAccessibilityRegion').GetAccessibilityRegion;
exports.FloatingRegionByRectangle = require('./lib/fluent/FloatingRegionByRectangle').FloatingRegionByRectangle;
exports.AccessibilityRegionByRectangle = require('./lib/fluent/AccessibilityRegionByRectangle').AccessibilityRegionByRectangle;
exports.GetSelector = require('./lib/fluent/GetSelector').GetSelector;

exports.AppOutput = require('./lib/match/AppOutput').AppOutput;
Expand Down
Loading

0 comments on commit cc9ec8c

Please sign in to comment.