@appium/images-plugin 1.2.3 → 1.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +2 -2
- package/README.md +1 -1
- package/build/lib/compare.d.ts +28 -0
- package/build/lib/compare.d.ts.map +1 -0
- package/build/lib/compare.js +60 -76
- package/build/lib/finder.d.ts +163 -0
- package/build/lib/finder.d.ts.map +1 -0
- package/build/lib/finder.js +326 -376
- package/build/lib/image-element.d.ts +108 -0
- package/build/lib/image-element.d.ts.map +1 -0
- package/build/lib/image-element.js +194 -238
- package/build/lib/logger.d.ts +3 -0
- package/build/lib/logger.d.ts.map +1 -0
- package/build/lib/logger.js +15 -5
- package/build/lib/plugin.d.ts +25 -0
- package/build/lib/plugin.d.ts.map +1 -0
- package/build/lib/plugin.js +88 -86
- package/build/tsconfig.tsbuildinfo +1 -0
- package/index.js +1 -3
- package/lib/compare.js +34 -14
- package/lib/finder.js +141 -83
- package/lib/image-element.js +69 -65
- package/lib/logger.js +3 -1
- package/lib/plugin.js +14 -15
- package/package.json +36 -23
- package/build/index.js +0 -27
- package/build/test/e2e/plugin-e2e-specs.js +0 -77
- package/build/test/fixtures/appstore.png +0 -0
- package/build/test/fixtures/img1.png +0 -0
- package/build/test/fixtures/img2.png +0 -0
- package/build/test/fixtures/img2_part.png +0 -0
- package/build/test/fixtures/index.js +0 -24
- package/build/test/unit/basic-specs.js +0 -16
- package/build/test/unit/finder-specs.js +0 -409
- package/build/test/unit/image-element-specs.js +0 -320
- package/build/test/unit/plugin-specs.js +0 -199
|
@@ -1,409 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
5
|
-
}) : (function(o, m, k, k2) {
|
|
6
|
-
if (k2 === undefined) k2 = k;
|
|
7
|
-
o[k2] = m[k];
|
|
8
|
-
}));
|
|
9
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
10
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
11
|
-
}) : function(o, v) {
|
|
12
|
-
o["default"] = v;
|
|
13
|
-
});
|
|
14
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
15
|
-
if (mod && mod.__esModule) return mod;
|
|
16
|
-
var result = {};
|
|
17
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
18
|
-
__setModuleDefault(result, mod);
|
|
19
|
-
return result;
|
|
20
|
-
};
|
|
21
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
22
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
23
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
24
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
25
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
26
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
27
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
28
|
-
});
|
|
29
|
-
};
|
|
30
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
31
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
32
|
-
};
|
|
33
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
34
|
-
const lodash_1 = __importDefault(require("lodash"));
|
|
35
|
-
const support_1 = require("@appium/support");
|
|
36
|
-
const base_driver_1 = __importDefault(require("@appium/base-driver"));
|
|
37
|
-
const index_1 = __importStar(require("../../index"));
|
|
38
|
-
const finder_1 = __importDefault(require("../../lib/finder"));
|
|
39
|
-
const image_element_1 = __importDefault(require("../../lib/image-element"));
|
|
40
|
-
const sinon_1 = __importDefault(require("sinon"));
|
|
41
|
-
const fixtures_1 = require("../fixtures");
|
|
42
|
-
const chai_1 = __importDefault(require("chai"));
|
|
43
|
-
const chai_as_promised_1 = __importDefault(require("chai-as-promised"));
|
|
44
|
-
const compareModule = require('../../lib/compare');
|
|
45
|
-
chai_1.default.use(chai_as_promised_1.default);
|
|
46
|
-
const should = chai_1.default.should();
|
|
47
|
-
const plugin = new index_1.default();
|
|
48
|
-
class PluginDriver extends base_driver_1.default {
|
|
49
|
-
getWindowSize() {
|
|
50
|
-
return __awaiter(this, void 0, void 0, function* () { });
|
|
51
|
-
}
|
|
52
|
-
getScreenshot() {
|
|
53
|
-
return __awaiter(this, void 0, void 0, function* () { });
|
|
54
|
-
}
|
|
55
|
-
findElement(strategy, selector) {
|
|
56
|
-
return plugin.findElement(lodash_1.default.noop, this, strategy, selector);
|
|
57
|
-
}
|
|
58
|
-
findElements(strategy, selector) {
|
|
59
|
-
return plugin.findElements(lodash_1.default.noop, this, strategy, selector);
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
describe('finding elements by image', function () {
|
|
63
|
-
describe('findElement', function () {
|
|
64
|
-
it('should use a different special method to find element by image', function () {
|
|
65
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
66
|
-
const d = new PluginDriver();
|
|
67
|
-
sinon_1.default.stub(plugin.finder, 'findByImage').returns(true);
|
|
68
|
-
sinon_1.default.stub(d, 'findElOrElsWithProcessing').returns(false);
|
|
69
|
-
yield d.findElement(index_1.IMAGE_STRATEGY, 'foo').should.eventually.be.true;
|
|
70
|
-
yield d.findElements(index_1.IMAGE_STRATEGY, 'foo').should.eventually.be.true;
|
|
71
|
-
});
|
|
72
|
-
});
|
|
73
|
-
it('should not be able to find image element from any other element', function () {
|
|
74
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
75
|
-
const d = new PluginDriver();
|
|
76
|
-
yield d.findElementFromElement(index_1.IMAGE_STRATEGY, 'foo', 'elId')
|
|
77
|
-
.should.eventually.be.rejectedWith(/Locator Strategy.+is not supported/);
|
|
78
|
-
yield d.findElementsFromElement(index_1.IMAGE_STRATEGY, 'foo', 'elId')
|
|
79
|
-
.should.eventually.be.rejectedWith(/Locator Strategy.+is not supported/);
|
|
80
|
-
});
|
|
81
|
-
});
|
|
82
|
-
});
|
|
83
|
-
describe('findByImage', function () {
|
|
84
|
-
const rect = { x: 10, y: 20, width: 30, height: 40 };
|
|
85
|
-
const score = 0.9;
|
|
86
|
-
const size = { width: 100, height: 200 };
|
|
87
|
-
const screenshot = 'iVBORfoo';
|
|
88
|
-
const template = 'iVBORbar';
|
|
89
|
-
let compareStub;
|
|
90
|
-
let d = new PluginDriver();
|
|
91
|
-
let f = new finder_1.default(d);
|
|
92
|
-
function basicStub(driver, finder) {
|
|
93
|
-
const sizeStub = sinon_1.default.stub(driver, 'getWindowSize').returns(size);
|
|
94
|
-
const screenStub = sinon_1.default.stub(finder, 'getScreenshotForImageFind').returns(screenshot);
|
|
95
|
-
return { sizeStub, screenStub };
|
|
96
|
-
}
|
|
97
|
-
function basicImgElVerify(imgElProto, finder) {
|
|
98
|
-
const imgElId = imgElProto.ELEMENT;
|
|
99
|
-
finder.imgElCache.has(imgElId).should.be.true;
|
|
100
|
-
const imgEl = finder.imgElCache.get(imgElId);
|
|
101
|
-
(imgEl instanceof image_element_1.default).should.be.true;
|
|
102
|
-
imgEl.rect.should.eql(rect);
|
|
103
|
-
imgEl.score.should.eql(score);
|
|
104
|
-
return imgEl;
|
|
105
|
-
}
|
|
106
|
-
beforeEach(function () {
|
|
107
|
-
compareStub = sinon_1.default.stub(compareModule, 'compareImages').returns({ rect, score });
|
|
108
|
-
d = new PluginDriver();
|
|
109
|
-
f = new finder_1.default(d);
|
|
110
|
-
basicStub(d, f);
|
|
111
|
-
});
|
|
112
|
-
afterEach(function () {
|
|
113
|
-
compareStub.restore();
|
|
114
|
-
});
|
|
115
|
-
it('should find an image element happypath', function () {
|
|
116
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
117
|
-
const imgElProto = yield f.findByImage(template, { multiple: false });
|
|
118
|
-
basicImgElVerify(imgElProto, f);
|
|
119
|
-
});
|
|
120
|
-
});
|
|
121
|
-
it('should find image elements happypath', function () {
|
|
122
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
123
|
-
compareStub.restore();
|
|
124
|
-
compareStub = sinon_1.default.stub(compareModule, 'compareImages').returns([{ rect, score }]);
|
|
125
|
-
const els = yield f.findByImage(template, { multiple: true });
|
|
126
|
-
els.should.have.length(1);
|
|
127
|
-
basicImgElVerify(els[0], f);
|
|
128
|
-
});
|
|
129
|
-
});
|
|
130
|
-
it('should fail if driver does not support getWindowSize', function () {
|
|
131
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
132
|
-
d.getWindowSize = null;
|
|
133
|
-
yield f.findByImage(template, { multiple: false })
|
|
134
|
-
.should.eventually.be.rejectedWith(/driver does not support/);
|
|
135
|
-
});
|
|
136
|
-
});
|
|
137
|
-
it('should fix template size if requested', function () {
|
|
138
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
139
|
-
const newTemplate = 'iVBORbaz';
|
|
140
|
-
yield d.settings.update({ fixImageTemplateSize: true });
|
|
141
|
-
sinon_1.default.stub(f, 'ensureTemplateSize').returns(newTemplate);
|
|
142
|
-
const imgElProto = yield f.findByImage(template, { multiple: false });
|
|
143
|
-
const imgEl = basicImgElVerify(imgElProto, f);
|
|
144
|
-
imgEl.template.should.eql(newTemplate);
|
|
145
|
-
lodash_1.default.last(compareStub.args)[2].should.eql(newTemplate);
|
|
146
|
-
});
|
|
147
|
-
});
|
|
148
|
-
it('should fix template size scale if requested', function () {
|
|
149
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
150
|
-
const newTemplate = 'iVBORbaz';
|
|
151
|
-
yield d.settings.update({ fixImageTemplateScale: true });
|
|
152
|
-
sinon_1.default.stub(f, 'fixImageTemplateScale').returns(newTemplate);
|
|
153
|
-
const imgElProto = yield f.findByImage(template, { multiple: false });
|
|
154
|
-
const imgEl = basicImgElVerify(imgElProto, f);
|
|
155
|
-
imgEl.template.should.eql(newTemplate);
|
|
156
|
-
lodash_1.default.last(compareStub.args)[2].should.eql(newTemplate);
|
|
157
|
-
});
|
|
158
|
-
});
|
|
159
|
-
it('should not fix template size scale if it is not requested', function () {
|
|
160
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
161
|
-
const newTemplate = 'iVBORbaz';
|
|
162
|
-
yield d.settings.update({});
|
|
163
|
-
sinon_1.default.stub(f, 'fixImageTemplateScale').returns(newTemplate);
|
|
164
|
-
f.fixImageTemplateScale.callCount.should.eql(0);
|
|
165
|
-
});
|
|
166
|
-
});
|
|
167
|
-
it('should throw an error if template match fails', function () {
|
|
168
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
169
|
-
compareStub.throws(new Error('Cannot find any occurrences'));
|
|
170
|
-
yield f.findByImage(template, { multiple: false })
|
|
171
|
-
.should.eventually.be.rejectedWith(/element could not be located/);
|
|
172
|
-
});
|
|
173
|
-
});
|
|
174
|
-
it('should return empty array for multiple elements if template match fails', function () {
|
|
175
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
176
|
-
compareStub.throws(new Error('Cannot find any occurrences'));
|
|
177
|
-
yield f.findByImage(template, { multiple: true }).should.eventually.eql([]);
|
|
178
|
-
});
|
|
179
|
-
});
|
|
180
|
-
it('should respect implicit wait', function () {
|
|
181
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
182
|
-
d.setImplicitWait(10);
|
|
183
|
-
compareStub.resetHistory();
|
|
184
|
-
compareStub.onCall(0).throws(new Error('Cannot find any occurrences'));
|
|
185
|
-
compareStub.returns({ rect, score });
|
|
186
|
-
const imgElProto = yield f.findByImage(template, { multiple: false });
|
|
187
|
-
basicImgElVerify(imgElProto, f);
|
|
188
|
-
compareStub.callCount.should.eql(2);
|
|
189
|
-
});
|
|
190
|
-
});
|
|
191
|
-
it('should not add element to cache and return it directly when checking staleness', function () {
|
|
192
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
193
|
-
const imgEl = yield f.findByImage(template, { multiple: false, shouldCheckStaleness: true });
|
|
194
|
-
(imgEl instanceof image_element_1.default).should.be.true;
|
|
195
|
-
f.imgElCache.has(imgEl.id).should.be.false;
|
|
196
|
-
imgEl.rect.should.eql(rect);
|
|
197
|
-
});
|
|
198
|
-
});
|
|
199
|
-
});
|
|
200
|
-
describe('fixImageTemplateScale', function () {
|
|
201
|
-
const d = new PluginDriver();
|
|
202
|
-
const f = new finder_1.default(d);
|
|
203
|
-
const basicTemplate = 'iVBORbaz';
|
|
204
|
-
it('should not fix template size scale if no scale value', function () {
|
|
205
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
206
|
-
yield f.fixImageTemplateScale(basicTemplate, { fixImageTemplateScale: true })
|
|
207
|
-
.should.eventually.eql(basicTemplate);
|
|
208
|
-
});
|
|
209
|
-
});
|
|
210
|
-
it('should not fix template size scale if it is null', function () {
|
|
211
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
212
|
-
yield f.fixImageTemplateScale(basicTemplate, null)
|
|
213
|
-
.should.eventually.eql(basicTemplate);
|
|
214
|
-
});
|
|
215
|
-
});
|
|
216
|
-
it('should not fix template size scale if it is not number', function () {
|
|
217
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
218
|
-
yield f.fixImageTemplateScale(basicTemplate, 'wrong-scale')
|
|
219
|
-
.should.eventually.eql(basicTemplate);
|
|
220
|
-
});
|
|
221
|
-
});
|
|
222
|
-
it('should fix template size scale', function () {
|
|
223
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
224
|
-
const actual = 'iVBORw0KGgoAAAANSUhEUgAAAAYAAAAGCAYAAADgzO9IAAAAWElEQVR4AU3BQRWAQAhAwa/PGBsEgrC16AFBKEIPXW7OXO+Rmey9iQjMjHFzrLUwM7qbqmLcHKpKRFBVuDvj4agq3B1VRUQYT2bS3QwRQVUZF/CaGRHB3wc1vSZbHO5+BgAAAABJRU5ErkJggg==';
|
|
225
|
-
yield f.fixImageTemplateScale(fixtures_1.TINY_PNG, {
|
|
226
|
-
fixImageTemplateScale: true, xScale: 1.5, yScale: 1.5
|
|
227
|
-
}).should.eventually.eql(actual);
|
|
228
|
-
});
|
|
229
|
-
});
|
|
230
|
-
it('should not fix template size scale because of fixImageTemplateScale being false', function () {
|
|
231
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
232
|
-
yield f.fixImageTemplateScale(fixtures_1.TINY_PNG, {
|
|
233
|
-
fixImageTemplateScale: false, xScale: 1.5, yScale: 1.5
|
|
234
|
-
}).should.eventually.eql(fixtures_1.TINY_PNG);
|
|
235
|
-
});
|
|
236
|
-
});
|
|
237
|
-
it('should fix template size scale with default scale', function () {
|
|
238
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
239
|
-
const actual = 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABwUlEQVR4AaXBPUsrQQCG0SeX+cBdkTjwTpG1NPgLpjY/fW1stt4UYmm2cJqwMCsaw70uJJ3CBc9Z/P3Cl+12S9u2tG1L27bEGLm/v2ez2bDZbJDEd/7wS4YT7z3X19fc3Nxwd3dHXdd47xnHkefnZ8ZxpKoq6rqmqiqMMcwMJ1VV0TQN0zThnOPj44O6rsk503UdkmiahqZpWK1WGGOYGU7quqZpGqy1SCLnTM6Z19dXcs5IYpomrLVI4uLigpnhpKoqVqsVkjgcDjw9PdF1HTlnuq5DEs45JHE4HDgznByPR97e3pimiVIK4zhyPB7x3hNCIITA5eUl3nsWiwVnhpNSCsMwsNvtGIaB/X5PKQVJpJSQxHq9RhLOOc4MJ9M0sdvt2G639H3PTBIxRiQhCUnEGLHWcmY4KaUwDAN93/P4+MhyuSSlhCRSSkjCOYe1FmstZ6bve2YvLy/s93tmy+USSUhCEpIIIfAd8/DwwOz9/Z1SCpJIKSGJ9XqNJJxz/MS0bcvs6uoKScQYkYQkJBFjxFrLT0zbtsxub29JKSGJlBKScM5hrcVay09MzplZjJHPz0+894QQCCHwP/7wS/8A4e6nAg+R8LwAAAAASUVORK5CYII=';
|
|
240
|
-
yield f.fixImageTemplateScale(fixtures_1.TINY_PNG, {
|
|
241
|
-
defaultImageTemplateScale: 4.0
|
|
242
|
-
}).should.eventually.eql(actual);
|
|
243
|
-
});
|
|
244
|
-
});
|
|
245
|
-
it('should fix template size scale with default scale and image scale', function () {
|
|
246
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
247
|
-
const actual = 'iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAACaUlEQVR4AbXBMWvrWBSF0c9BsFPtW91UR1U6+///FKlKKt8qqnyqnMozggkI8xgMj6x1uv+L/6zryrIsrOvKsiys68qyLFwuF87nM5fLhfP5zOVy4Xw+84wXftkLv2ziQBK26b0TEVQVu4jANrvM5Hq9spOEJCQhCUlI4mjiQBK26b1TVewkYRvb7DKTMQaZiW1s01rDNraRxNHEgSRaa1QVO0m01jjKTDKTXe+d3jtVxU4SjyYOJGGbnSRs03snM8lMMpPb7UZmkplEBFXFThK2eTRxIAnbSMI2VcX39zdjDMYYZCaZyRiDMQZVxU4StqkqHk0cSEISf5KZ7DKTMQbLsrCTRGuN3jtVxaOJg6qiqqgqqoqqoqoYY5CZ7GwTEdzvd97f34kIeu/YRhKPJg6qiswkM7ndbmQmmUlmkpnsbBMR2CYimOeZ3ju2kcSjiYOqIjP5+vpi2za2bWPbNo5aa7TW2PXe6b3Te6e1hiQeTRxUFbfbjW3bGGNwvV4ZY2Ab27TWsI1tbGMb27TWsI0kHk0cVBWZybZtXK9XPj8/+fj4YJ5nIoLWGraJCOZ5RhKSkIQkJPFo4qCqyEy2bWOMwefnJ+u6cjqdsM3ONvM8cz6feca0ris/rtcrmcnONhHB/X7n/f2diKD3jm0k8axpWRZ+ZCaZyc42EYFtIoJ5num9YxtJPGta15U/sY1tdm9vb/Te6b1jG0k8a1qWhR+2sU1rjdYatrGNbWxjm9YaknjWtK4rPyKCiKC1hm0igojg9fUVSUhCEpJ41rQsC0e22dkmIrhcLvyNF/7H6XTib73wy174Zf8AJEsePtlPj10AAAAASUVORK5CYII=';
|
|
248
|
-
yield f.fixImageTemplateScale(fixtures_1.TINY_PNG, {
|
|
249
|
-
defaultImageTemplateScale: 4.0,
|
|
250
|
-
fixImageTemplateScale: true,
|
|
251
|
-
xScale: 1.5, yScale: 1.5
|
|
252
|
-
}).should.eventually.eql(actual);
|
|
253
|
-
});
|
|
254
|
-
});
|
|
255
|
-
it('should not fix template size scale with default scale and image scale', function () {
|
|
256
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
257
|
-
const actual = 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABwUlEQVR4AaXBPUsrQQCG0SeX+cBdkTjwTpG1NPgLpjY/fW1stt4UYmm2cJqwMCsaw70uJJ3CBc9Z/P3Cl+12S9u2tG1L27bEGLm/v2ez2bDZbJDEd/7wS4YT7z3X19fc3Nxwd3dHXdd47xnHkefnZ8ZxpKoq6rqmqiqMMcwMJ1VV0TQN0zThnOPj44O6rsk503UdkmiahqZpWK1WGGOYGU7quqZpGqy1SCLnTM6Z19dXcs5IYpomrLVI4uLigpnhpKoqVqsVkjgcDjw9PdF1HTlnuq5DEs45JHE4HDgznByPR97e3pimiVIK4zhyPB7x3hNCIITA5eUl3nsWiwVnhpNSCsMwsNvtGIaB/X5PKQVJpJSQxHq9RhLOOc4MJ9M0sdvt2G639H3PTBIxRiQhCUnEGLHWcmY4KaUwDAN93/P4+MhyuSSlhCRSSkjCOYe1FmstZ6bve2YvLy/s93tmy+USSUhCEpIIIfAd8/DwwOz9/Z1SCpJIKSGJ9XqNJJxz/MS0bcvs6uoKScQYkYQkJBFjxFrLT0zbtsxub29JKSGJlBKScM5hrcVay09MzplZjJHPz0+894QQCCHwP/7wS/8A4e6nAg+R8LwAAAAASUVORK5CYII=';
|
|
258
|
-
yield f.fixImageTemplateScale(fixtures_1.TINY_PNG, {
|
|
259
|
-
defaultImageTemplateScale: 4.0,
|
|
260
|
-
fixImageTemplateScale: false,
|
|
261
|
-
xScale: 1.5, yScale: 1.5
|
|
262
|
-
}).should.eventually.eql(actual);
|
|
263
|
-
});
|
|
264
|
-
});
|
|
265
|
-
it('should not fix template size scale because of ignoreDefaultImageTemplateScale', function () {
|
|
266
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
267
|
-
yield f.fixImageTemplateScale(fixtures_1.TINY_PNG, {
|
|
268
|
-
defaultImageTemplateScale: 4.0,
|
|
269
|
-
ignoreDefaultImageTemplateScale: true,
|
|
270
|
-
}).should.eventually.eql(fixtures_1.TINY_PNG);
|
|
271
|
-
});
|
|
272
|
-
});
|
|
273
|
-
it('should ignore defaultImageTemplateScale to fix template size scale because of ignoreDefaultImageTemplateScale', function () {
|
|
274
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
275
|
-
const actual = 'iVBORw0KGgoAAAANSUhEUgAAAAYAAAAGCAYAAADgzO9IAAAAWElEQVR4AU3BQRWAQAhAwa/PGBsEgrC16AFBKEIPXW7OXO+Rmey9iQjMjHFzrLUwM7qbqmLcHKpKRFBVuDvj4agq3B1VRUQYT2bS3QwRQVUZF/CaGRHB3wc1vSZbHO5+BgAAAABJRU5ErkJggg==';
|
|
276
|
-
yield f.fixImageTemplateScale(fixtures_1.TINY_PNG, {
|
|
277
|
-
defaultImageTemplateScale: 4.0,
|
|
278
|
-
ignoreDefaultImageTemplateScale: true,
|
|
279
|
-
fixImageTemplateScale: true,
|
|
280
|
-
xScale: 1.5, yScale: 1.5
|
|
281
|
-
}).should.eventually.eql(actual);
|
|
282
|
-
});
|
|
283
|
-
});
|
|
284
|
-
});
|
|
285
|
-
describe('ensureTemplateSize', function () {
|
|
286
|
-
const d = new PluginDriver();
|
|
287
|
-
const f = new finder_1.default(d);
|
|
288
|
-
it('should not resize the template if it is smaller than the screen', function () {
|
|
289
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
290
|
-
const screen = fixtures_1.TINY_PNG_DIMS.map((n) => n * 2);
|
|
291
|
-
yield f.ensureTemplateSize(fixtures_1.TINY_PNG, ...screen)
|
|
292
|
-
.should.eventually.eql(fixtures_1.TINY_PNG);
|
|
293
|
-
});
|
|
294
|
-
});
|
|
295
|
-
it('should not resize the template if it is the same size as the screen', function () {
|
|
296
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
297
|
-
yield f.ensureTemplateSize(fixtures_1.TINY_PNG, ...fixtures_1.TINY_PNG_DIMS)
|
|
298
|
-
.should.eventually.eql(fixtures_1.TINY_PNG);
|
|
299
|
-
});
|
|
300
|
-
});
|
|
301
|
-
it('should resize the template if it is bigger than the screen', function () {
|
|
302
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
303
|
-
const screen = fixtures_1.TINY_PNG_DIMS.map((n) => n / 2);
|
|
304
|
-
const newTemplate = yield f.ensureTemplateSize(fixtures_1.TINY_PNG, ...screen);
|
|
305
|
-
newTemplate.should.not.eql(fixtures_1.TINY_PNG);
|
|
306
|
-
newTemplate.length.should.be.below(fixtures_1.TINY_PNG.length);
|
|
307
|
-
});
|
|
308
|
-
});
|
|
309
|
-
});
|
|
310
|
-
describe('getScreenshotForImageFind', function () {
|
|
311
|
-
let d;
|
|
312
|
-
let f;
|
|
313
|
-
beforeEach(function () {
|
|
314
|
-
d = new PluginDriver();
|
|
315
|
-
f = new finder_1.default(d);
|
|
316
|
-
sinon_1.default.stub(d, 'getScreenshot').returns(fixtures_1.TINY_PNG);
|
|
317
|
-
});
|
|
318
|
-
it('should fail if driver does not support getScreenshot', function () {
|
|
319
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
320
|
-
const d = new base_driver_1.default();
|
|
321
|
-
const f = new finder_1.default(d);
|
|
322
|
-
yield f.getScreenshotForImageFind()
|
|
323
|
-
.should.eventually.be.rejectedWith(/driver does not support/);
|
|
324
|
-
});
|
|
325
|
-
});
|
|
326
|
-
it('should not adjust or verify screenshot if asked not to by settings', function () {
|
|
327
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
328
|
-
yield d.settings.update({ fixImageFindScreenshotDims: false });
|
|
329
|
-
const screen = fixtures_1.TINY_PNG_DIMS.map((n) => n + 1);
|
|
330
|
-
const { b64Screenshot, scale } = yield f.getScreenshotForImageFind(...screen);
|
|
331
|
-
b64Screenshot.should.eql(fixtures_1.TINY_PNG);
|
|
332
|
-
should.equal(scale, undefined);
|
|
333
|
-
});
|
|
334
|
-
});
|
|
335
|
-
it('should return screenshot without adjustment if it matches screen size', function () {
|
|
336
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
337
|
-
const { b64Screenshot, scale } = yield f.getScreenshotForImageFind(...fixtures_1.TINY_PNG_DIMS);
|
|
338
|
-
b64Screenshot.should.eql(fixtures_1.TINY_PNG);
|
|
339
|
-
should.equal(scale, undefined);
|
|
340
|
-
});
|
|
341
|
-
});
|
|
342
|
-
it('should return scaled screenshot with same aspect ratio if matching screen aspect ratio', function () {
|
|
343
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
344
|
-
const screen = fixtures_1.TINY_PNG_DIMS.map((n) => n * 1.5);
|
|
345
|
-
const { b64Screenshot, scale } = yield f.getScreenshotForImageFind(...screen);
|
|
346
|
-
b64Screenshot.should.not.eql(fixtures_1.TINY_PNG);
|
|
347
|
-
const screenshotObj = yield support_1.imageUtil.getJimpImage(b64Screenshot);
|
|
348
|
-
screenshotObj.bitmap.width.should.eql(screen[0]);
|
|
349
|
-
screenshotObj.bitmap.height.should.eql(screen[1]);
|
|
350
|
-
scale.should.eql({ xScale: 1.5, yScale: 1.5 });
|
|
351
|
-
});
|
|
352
|
-
});
|
|
353
|
-
it('should return scaled screenshot with different aspect ratio if not matching screen aspect ratio', function () {
|
|
354
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
355
|
-
// try first with portrait screen, screen = 8 x 12
|
|
356
|
-
let screen = [fixtures_1.TINY_PNG_DIMS[0] * 2, fixtures_1.TINY_PNG_DIMS[1] * 3];
|
|
357
|
-
let expectedScale = { xScale: 2.67, yScale: 4 };
|
|
358
|
-
const { b64Screenshot, scale } = yield f.getScreenshotForImageFind(...screen);
|
|
359
|
-
b64Screenshot.should.not.eql(fixtures_1.TINY_PNG);
|
|
360
|
-
let screenshotObj = yield support_1.imageUtil.getJimpImage(b64Screenshot);
|
|
361
|
-
screenshotObj.bitmap.width.should.eql(screen[0]);
|
|
362
|
-
screenshotObj.bitmap.height.should.eql(screen[1]);
|
|
363
|
-
scale.xScale.toFixed(2).should.eql(expectedScale.xScale.toString());
|
|
364
|
-
scale.yScale.should.eql(expectedScale.yScale);
|
|
365
|
-
// then with landscape screen, screen = 12 x 8
|
|
366
|
-
screen = [fixtures_1.TINY_PNG_DIMS[0] * 3, fixtures_1.TINY_PNG_DIMS[1] * 2];
|
|
367
|
-
expectedScale = { xScale: 4, yScale: 2.67 };
|
|
368
|
-
const { b64Screenshot: newScreen, scale: newScale } = yield f.getScreenshotForImageFind(...screen);
|
|
369
|
-
newScreen.should.not.eql(fixtures_1.TINY_PNG);
|
|
370
|
-
screenshotObj = yield support_1.imageUtil.getJimpImage(newScreen);
|
|
371
|
-
screenshotObj.bitmap.width.should.eql(screen[0]);
|
|
372
|
-
screenshotObj.bitmap.height.should.eql(screen[1]);
|
|
373
|
-
newScale.xScale.should.eql(expectedScale.xScale);
|
|
374
|
-
newScale.yScale.toFixed(2).should.eql(expectedScale.yScale.toString());
|
|
375
|
-
});
|
|
376
|
-
});
|
|
377
|
-
it('should return scaled screenshot with different aspect ratio if not matching screen aspect ratio with fixImageTemplateScale', function () {
|
|
378
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
379
|
-
// try first with portrait screen, screen = 8 x 12
|
|
380
|
-
let screen = [fixtures_1.TINY_PNG_DIMS[0] * 2, fixtures_1.TINY_PNG_DIMS[1] * 3];
|
|
381
|
-
let expectedScale = { xScale: 2.67, yScale: 4 };
|
|
382
|
-
const { b64Screenshot, scale } = yield f.getScreenshotForImageFind(...screen);
|
|
383
|
-
b64Screenshot.should.not.eql(fixtures_1.TINY_PNG);
|
|
384
|
-
let screenshotObj = yield support_1.imageUtil.getJimpImage(b64Screenshot);
|
|
385
|
-
screenshotObj.bitmap.width.should.eql(screen[0]);
|
|
386
|
-
screenshotObj.bitmap.height.should.eql(screen[1]);
|
|
387
|
-
scale.xScale.toFixed(2).should.eql(expectedScale.xScale.toString());
|
|
388
|
-
scale.yScale.should.eql(expectedScale.yScale);
|
|
389
|
-
// 8 x 12 stretched TINY_PNG
|
|
390
|
-
yield f.fixImageTemplateScale(b64Screenshot, { fixImageTemplateScale: true, scale })
|
|
391
|
-
.should.eventually.eql('iVBORw0KGgoAAAANSUhEUgAAAAgAAAAMCAYAAABfnvydAAAAJ0lEQVR4AYXBAQEAIACDMKR/p0fTBrKdbZcPCRIkSJAgQYIECRIkPAzBA1TpeNwZAAAAAElFTkSuQmCC');
|
|
392
|
-
// then with landscape screen, screen = 12 x 8
|
|
393
|
-
screen = [fixtures_1.TINY_PNG_DIMS[0] * 3, fixtures_1.TINY_PNG_DIMS[1] * 2];
|
|
394
|
-
expectedScale = { xScale: 4, yScale: 2.67 };
|
|
395
|
-
const { b64Screenshot: newScreen, scale: newScale } = yield f.getScreenshotForImageFind(...screen);
|
|
396
|
-
newScreen.should.not.eql(fixtures_1.TINY_PNG);
|
|
397
|
-
screenshotObj = yield support_1.imageUtil.getJimpImage(newScreen);
|
|
398
|
-
screenshotObj.bitmap.width.should.eql(screen[0]);
|
|
399
|
-
screenshotObj.bitmap.height.should.eql(screen[1]);
|
|
400
|
-
newScale.xScale.should.eql(expectedScale.xScale);
|
|
401
|
-
newScale.yScale.toFixed(2).should.eql(expectedScale.yScale.toString());
|
|
402
|
-
// 12 x 8 stretched TINY_PNG
|
|
403
|
-
yield f.fixImageTemplateScale(newScreen, { fixImageTemplateScale: true, scale })
|
|
404
|
-
.should.eventually.eql('iVBORw0KGgoAAAANSUhEUgAAAAwAAAAICAYAAADN5B7xAAAAI0lEQVR4AZXBAQEAMAyDMI5/T5W2ayB5245AIokkkkgiiST6+W4DTLyo5PUAAAAASUVORK5CYII=');
|
|
405
|
-
});
|
|
406
|
-
});
|
|
407
|
-
});
|
|
408
|
-
});
|
|
409
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmluZGVyLXNwZWNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdGVzdC91bml0L2ZpbmRlci1zcGVjcy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxvREFBdUI7QUFDdkIsNkNBQTRDO0FBQzVDLHNFQUE2QztBQUM3QyxxREFBaUU7QUFDakUsOERBQWtEO0FBQ2xELDRFQUFtRDtBQUNuRCxrREFBMEI7QUFDMUIsMENBQXNEO0FBQ3RELGdEQUF3QjtBQUN4Qix3RUFBOEM7QUFFOUMsTUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDLG1CQUFtQixDQUFDLENBQUM7QUFDbkQsY0FBSSxDQUFDLEdBQUcsQ0FBQywwQkFBYyxDQUFDLENBQUM7QUFDekIsTUFBTSxNQUFNLEdBQUcsY0FBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO0FBRTdCLE1BQU0sTUFBTSxHQUFHLElBQUksZUFBa0IsRUFBRSxDQUFDO0FBRXhDLE1BQU0sWUFBYSxTQUFRLHFCQUFVO0lBQzdCLGFBQWE7OERBQUssQ0FBQztLQUFBO0lBQ25CLGFBQWE7OERBQUssQ0FBQztLQUFBO0lBQ3pCLFdBQVcsQ0FBRSxRQUFRLEVBQUUsUUFBUTtRQUM3QixPQUFPLE1BQU0sQ0FBQyxXQUFXLENBQUMsZ0JBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBQ0QsWUFBWSxDQUFFLFFBQVEsRUFBRSxRQUFRO1FBQzlCLE9BQU8sTUFBTSxDQUFDLFlBQVksQ0FBQyxnQkFBQyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQy9ELENBQUM7Q0FFRjtBQUVELFFBQVEsQ0FBQywyQkFBMkIsRUFBRTtJQUNwQyxRQUFRLENBQUMsYUFBYSxFQUFFO1FBQ3RCLEVBQUUsQ0FBQyxnRUFBZ0UsRUFBRTs7Z0JBQ25FLE1B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
|