@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.
@@ -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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