eyes_core 3.5.4 → 3.6.4
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.
- checksums.yaml +4 -4
- data/lib/applitools/connectivity/server_connector.rb +15 -1
- data/lib/applitools/core/app_environment.rb +4 -4
- data/lib/applitools/core/batch_info.rb +3 -3
- data/lib/applitools/core/eyes_base.rb +79 -14
- data/lib/applitools/core/match_single_check_data.rb +87 -0
- data/lib/applitools/core/match_single_task.rb +16 -0
- data/lib/applitools/core/match_window_data.rb +152 -15
- data/lib/applitools/core/match_window_task.rb +33 -85
- data/lib/applitools/core/test_results.rb +6 -6
- data/lib/applitools/images/eyes.rb +44 -9
- data/lib/applitools/version.rb +1 -1
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 68baf2041ed67e8172284b1f19af46f53c13fce9
|
4
|
+
data.tar.gz: 1322f93d66d26b704a028619fe7cdaed92642f1f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: eb6c546e62d31ab27177debff341f5c127b462bb04bc2b58024d119004789715a5f0848d349c95414a2acb72e57b55745e45ff2668fd4a9f946614764b57e1c4
|
7
|
+
data.tar.gz: 86b3512f290b6b6cd5220285e7a19a31b0091600a67b08306aebd332a71035acd86c8cb9583490f2d4f21de4281a9fbabdb2c1557a0dadd0dfaadbc7e4ed7fe4
|
@@ -10,10 +10,12 @@ module Applitools::Connectivity
|
|
10
10
|
|
11
11
|
DEFAULT_SERVER_URL = 'https://eyessdk.applitools.com'.freeze
|
12
12
|
|
13
|
+
|
13
14
|
SSL_CERT = File.join(File.dirname(File.expand_path(__FILE__)), '../../../certs/cacert.pem').to_s.freeze
|
14
15
|
DEFAULT_TIMEOUT = 300
|
15
16
|
|
16
17
|
API_SESSIONS_RUNNING = '/api/sessions/running/'.freeze
|
18
|
+
API_SINGLE_TEST = '/api/sessions/'.freeze
|
17
19
|
|
18
20
|
HTTP_STATUS_CODES = {
|
19
21
|
created: 201,
|
@@ -31,6 +33,7 @@ module Applitools::Connectivity
|
|
31
33
|
" (#{@server_url.class} is passed)"
|
32
34
|
end
|
33
35
|
@endpoint_url = URI.join(@server_url, API_SESSIONS_RUNNING).to_s
|
36
|
+
@single_check_endpoint_url = URI.join(@server_url, API_SINGLE_TEST).to_s
|
34
37
|
end
|
35
38
|
|
36
39
|
def set_proxy(uri, user = nil, password = nil)
|
@@ -49,13 +52,24 @@ module Applitools::Connectivity
|
|
49
52
|
# Notice that this does not include the screenshot.
|
50
53
|
json_data = Oj.dump(Applitools::Utils.camelcase_hash_keys(data.to_hash)).force_encoding('BINARY')
|
51
54
|
body = [json_data.length].pack('L>') + json_data + data.screenshot
|
52
|
-
# Applitools::EyesLogger.debug json_data
|
53
55
|
Applitools::EyesLogger.debug 'Sending match data...'
|
56
|
+
#Applitools::EyesLogger.debug json_data
|
54
57
|
res = post(URI.join(endpoint_url, session.id.to_s), content_type: 'application/octet-stream', body: body)
|
55
58
|
raise Applitools::EyesError.new("Request failed: #{res.status} #{res.headers}") unless res.success?
|
56
59
|
Applitools::MatchResult.new Oj.load(res.body)
|
57
60
|
end
|
58
61
|
|
62
|
+
def match_single_window(data)
|
63
|
+
# Notice that this does not include the screenshot.
|
64
|
+
json_data = Oj.dump(data.to_hash).force_encoding('BINARY')
|
65
|
+
body = [json_data.length].pack('L>') + json_data + data.screenshot
|
66
|
+
# Applitools::EyesLogger.debug json_data
|
67
|
+
Applitools::EyesLogger.debug 'Sending match data...'
|
68
|
+
res = long_post(@single_check_endpoint_url, content_type: 'application/octet-stream', body: body)
|
69
|
+
raise Applitools::EyesError.new("Request failed: #{res.status} #{res.headers} #{res.body}") unless res.success?
|
70
|
+
Applitools::TestResults.new Oj.load(res.body)
|
71
|
+
end
|
72
|
+
|
59
73
|
def start_session(session_start_info)
|
60
74
|
res = post(endpoint_url, body: Oj.dump(startInfo:
|
61
75
|
Applitools::Utils.camelcase_hash_keys(session_start_info.to_hash)))
|
@@ -11,10 +11,10 @@ module Applitools
|
|
11
11
|
|
12
12
|
def to_hash
|
13
13
|
{
|
14
|
-
os
|
15
|
-
|
16
|
-
|
17
|
-
inferred
|
14
|
+
'os' => @os,
|
15
|
+
'hostingApp' => @hosting_app,
|
16
|
+
'displaySize' => @display_size.to_hash,
|
17
|
+
'inferred' => @inferred
|
18
18
|
}
|
19
19
|
end
|
20
20
|
|
@@ -54,6 +54,7 @@ module Applitools
|
|
54
54
|
@user_inputs = UserInputArray.new
|
55
55
|
self.app_output_provider = Object.new
|
56
56
|
self.verbose_results = false
|
57
|
+
self.failed = false
|
57
58
|
@inferred_environment = nil
|
58
59
|
|
59
60
|
get_app_output_method = ->(r, s) { get_app_output_with_screenshot r, s }
|
@@ -172,7 +173,7 @@ module Applitools
|
|
172
173
|
raise e
|
173
174
|
end
|
174
175
|
|
175
|
-
def check_window_base(region_provider,
|
176
|
+
def check_window_base(region_provider, retry_timeout, match_window_data)
|
176
177
|
if disabled?
|
177
178
|
logger.info "#{__method__} Ignored"
|
178
179
|
result = Applitools::MatchResults.new
|
@@ -183,7 +184,7 @@ module Applitools
|
|
183
184
|
raise Applitools::EyesError.new 'Eyes not open' unless open?
|
184
185
|
Applitools::ArgumentGuard.not_nil region_provider, 'region_provider'
|
185
186
|
|
186
|
-
logger.info "check_window_base(#{region_provider}, #{tag}, #{ignore_mismatch}, #{retry_timeout})"
|
187
|
+
logger.info "check_window_base(#{region_provider}, #{match_window_data.tag}, #{match_window_data.ignore_mismatch}, #{retry_timeout})"
|
187
188
|
|
188
189
|
tag = '' if tag.nil?
|
189
190
|
|
@@ -200,18 +201,11 @@ module Applitools
|
|
200
201
|
end
|
201
202
|
|
202
203
|
logger.info 'Calling match_window...'
|
203
|
-
result = @match_window_task.match_window(
|
204
|
-
user_inputs: user_inputs,
|
204
|
+
result = @match_window_task.match_window(match_window_data,
|
205
205
|
last_screenshot: last_screenshot,
|
206
206
|
region_provider: region_provider,
|
207
|
-
tag: tag,
|
208
207
|
should_match_window_run_once_on_timeout: should_match_window_run_once_on_timeout,
|
209
|
-
ignore_mismatch: ignore_mismatch,
|
210
208
|
retry_timeout: retry_timeout,
|
211
|
-
ignore: options[:ignore],
|
212
|
-
trim: options[:trim],
|
213
|
-
match_level: options[:match_level],
|
214
|
-
exact: options[:exact]
|
215
209
|
)
|
216
210
|
logger.info 'match_window done!'
|
217
211
|
|
@@ -219,13 +213,13 @@ module Applitools
|
|
219
213
|
clear_user_inputs
|
220
214
|
self.last_screenshot = result.screenshot
|
221
215
|
else
|
222
|
-
unless ignore_mismatch
|
216
|
+
unless match_window_data.ignore_mismatch
|
223
217
|
clear_user_inputs
|
224
218
|
self.last_screenshot = result.screenshot
|
225
219
|
end
|
226
220
|
|
227
221
|
self.should_match_window_run_once_on_timeout = true
|
228
|
-
|
222
|
+
self.failed = true
|
229
223
|
logger.info "Mistmatch! #{tag}" unless running_session.new_session?
|
230
224
|
|
231
225
|
if failure_reports == :immediate
|
@@ -238,6 +232,77 @@ module Applitools
|
|
238
232
|
result
|
239
233
|
end
|
240
234
|
|
235
|
+
|
236
|
+
def check_single_base(region_provider, retry_timeout, match_window_data)
|
237
|
+
if disabled?
|
238
|
+
logger.info "#{__method__} Ignored"
|
239
|
+
result = Applitools::MatchResults.new
|
240
|
+
result.as_expected = true
|
241
|
+
return result
|
242
|
+
end
|
243
|
+
|
244
|
+
raise Applitools::EyesError.new 'Eyes not open' unless open?
|
245
|
+
Applitools::ArgumentGuard.not_nil region_provider, 'region_provider'
|
246
|
+
|
247
|
+
logger.info "check_single_base(#{region_provider}, #{match_window_data.tag}, #{match_window_data.ignore_mismatch}, #{retry_timeout})"
|
248
|
+
|
249
|
+
tag = '' if tag.nil?
|
250
|
+
|
251
|
+
session_start_info = SessionStartInfo.new agent_id: base_agent_id, app_id_or_name: app_name,
|
252
|
+
scenario_id_or_name: test_name, batch_info: batch,
|
253
|
+
env_name: baseline_name, environment: app_environment,
|
254
|
+
default_match_settings: default_match_settings,
|
255
|
+
branch_name: branch_name, parent_branch_name: parent_branch_name
|
256
|
+
|
257
|
+
match_window_data.start_info = session_start_info
|
258
|
+
match_window_data.update_baseline_if_new = save_new_tests
|
259
|
+
match_window_data.update_baseline_if_different = save_failed_tests
|
260
|
+
match_window_task = Applitools::MatchSingleTask.new(
|
261
|
+
logger,
|
262
|
+
match_timeout,
|
263
|
+
app_output_provider
|
264
|
+
)
|
265
|
+
|
266
|
+
logger.info 'Calling match_window...'
|
267
|
+
result = match_window_task.match_window(match_window_data,
|
268
|
+
last_screenshot: last_screenshot,
|
269
|
+
region_provider: region_provider,
|
270
|
+
should_match_window_run_once_on_timeout: should_match_window_run_once_on_timeout,
|
271
|
+
retry_timeout: retry_timeout,
|
272
|
+
) do |match_results|
|
273
|
+
results = match_results.original_results
|
274
|
+
not_aborted = !results['isAborted']
|
275
|
+
new_and_saved = results['isNew'] && save_new_tests
|
276
|
+
different_and_saved = results['isDifferent'] && save_failed_tests
|
277
|
+
not_a_mismatch = !results['isDifferent'] && !results['isNew']
|
278
|
+
|
279
|
+
not_aborted && (new_and_saved || different_and_saved || not_a_mismatch)
|
280
|
+
end
|
281
|
+
logger.info 'match_window done!'
|
282
|
+
|
283
|
+
if result.as_expected?
|
284
|
+
clear_user_inputs
|
285
|
+
self.last_screenshot = result.screenshot
|
286
|
+
else
|
287
|
+
unless match_window_data.ignore_mismatch
|
288
|
+
clear_user_inputs
|
289
|
+
self.last_screenshot = result.screenshot
|
290
|
+
end
|
291
|
+
|
292
|
+
self.should_match_window_run_once_on_timeout = true
|
293
|
+
|
294
|
+
logger.info "Mistmatch! #{tag}"
|
295
|
+
|
296
|
+
if failure_reports == :immediate
|
297
|
+
raise Applitools::TestFailedException.new "Mistmatch found in #{session_start_info.scenario_id_or_name}" \
|
298
|
+
" of #{session_start_info.app_id_or_name}"
|
299
|
+
end
|
300
|
+
end
|
301
|
+
|
302
|
+
logger.info 'Done!'
|
303
|
+
result.original_results
|
304
|
+
end
|
305
|
+
|
241
306
|
# Closes eyes
|
242
307
|
# @param [Boolean] throw_exception If set to +true+ eyes will trow [Applitools::TestFailedError] exception,
|
243
308
|
# otherwise the test will pass. Default is true
|
@@ -267,7 +332,7 @@ module Applitools
|
|
267
332
|
|
268
333
|
logger.info 'Ending server session...'
|
269
334
|
|
270
|
-
save = is_new_session && save_new_tests || !is_new_session && save_failed_tests
|
335
|
+
save = is_new_session && save_new_tests || !is_new_session && failed && save_failed_tests
|
271
336
|
|
272
337
|
logger.info "Automatically save test? #{save}"
|
273
338
|
|
@@ -305,7 +370,7 @@ module Applitools
|
|
305
370
|
private
|
306
371
|
|
307
372
|
attr_accessor :running_session, :last_screenshot, :current_app_name, :test_name, :session_type,
|
308
|
-
:scale_provider, :session_start_info, :should_match_window_run_once_on_timeout, :app_output_provider
|
373
|
+
:scale_provider, :session_start_info, :should_match_window_run_once_on_timeout, :app_output_provider, :failed
|
309
374
|
|
310
375
|
attr_reader :user_inputs
|
311
376
|
|
@@ -0,0 +1,87 @@
|
|
1
|
+
require_relative 'match_window_data'
|
2
|
+
module Applitools
|
3
|
+
class MatchSingleCheckData < MatchWindowData
|
4
|
+
class << self
|
5
|
+
def default_data
|
6
|
+
{
|
7
|
+
'startInfo' => {
|
8
|
+
'agentId' => nil,
|
9
|
+
'appIdOrName' => nil,
|
10
|
+
'verId' => nil,
|
11
|
+
'scenarioIdOrName' => nil,
|
12
|
+
'batchInfo' => {},
|
13
|
+
'envName' => nil,
|
14
|
+
'environment' => {},
|
15
|
+
'defaultMatchSettings' => nil,
|
16
|
+
'branchName' => nil,
|
17
|
+
'parentBranchName' => nil
|
18
|
+
},
|
19
|
+
'IgnoreMismatch' => false,
|
20
|
+
'MismatchWait' => 0,
|
21
|
+
'Options' => {
|
22
|
+
'Name' => nil,
|
23
|
+
'UserInputs' => [],
|
24
|
+
'ImageMatchSettings' => {
|
25
|
+
'MatchLevel' => 'None',
|
26
|
+
'SplitTopHeight' => 0,
|
27
|
+
'SplitBottomHeight' => 0,
|
28
|
+
'IgnoreCaret' => false,
|
29
|
+
'Ignore' => [],
|
30
|
+
'Exact' => {
|
31
|
+
'MinDiffIntensity' => 0,
|
32
|
+
'MinDiffWidth' => 0,
|
33
|
+
'MinDiffHeight' => 0,
|
34
|
+
'MatchThreshold' => 0
|
35
|
+
}
|
36
|
+
},
|
37
|
+
'IgnoreExpectedOutputSettings' => false,
|
38
|
+
'ForceMatch' => false,
|
39
|
+
'ForceMismatch' => false,
|
40
|
+
'IgnoreMatch' => false,
|
41
|
+
'IgnoreMismatch' => false,
|
42
|
+
'Trim' => {
|
43
|
+
'Enabled' => false,
|
44
|
+
'ForegroundIntensity' => 0,
|
45
|
+
'MinEdgeLength' => 0
|
46
|
+
}
|
47
|
+
},
|
48
|
+
'Id' => nil,
|
49
|
+
'UserInputs' => [],
|
50
|
+
'AppOutput' => {
|
51
|
+
'Screenshot64' => nil,
|
52
|
+
'ScreenshotUrl' => nil,
|
53
|
+
'Title' => nil,
|
54
|
+
'IsPrimary' => false,
|
55
|
+
'Elapsed' => 0
|
56
|
+
},
|
57
|
+
'Tag' => nil,
|
58
|
+
'updateBaselineIfDifferent' => false,
|
59
|
+
'updateBaselineIfNew' => false
|
60
|
+
}
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def start_info=(value)
|
65
|
+
Applitools::ArgumentGuard.is_a? value, 'value', Applitools::SessionStartInfo
|
66
|
+
hash_value = value.to_hash
|
67
|
+
current_data['startInfo']['batchInfo'] = hash_value[:batch_info]
|
68
|
+
current_data['startInfo']['environment'] = hash_value[:environment]
|
69
|
+
current_data['startInfo']['agentId'] = hash_value[:agent_id]
|
70
|
+
current_data['startInfo']['appIdOrName'] = hash_value[:app_id_or_name]
|
71
|
+
current_data['startInfo']['verId'] = hash_value[:ver_id]
|
72
|
+
current_data['startInfo']['scenarioIdOrName'] = hash_value[:scenario_id_or_name]
|
73
|
+
current_data['startInfo']['envName'] = hash_value[:env_name]
|
74
|
+
current_data['startInfo']['defaultMatchSettings'] = hash_value[:default_match_settings]
|
75
|
+
current_data['startInfo']['branchName'] = hash_value[:branch_name]
|
76
|
+
current_data['startInfo']['parentBranchName'] = hash_value[:parent_branch_name]
|
77
|
+
end
|
78
|
+
|
79
|
+
def update_baseline_if_different=(value)
|
80
|
+
current_data['updateBaselineIfDifferent'] = value ? true : false
|
81
|
+
end
|
82
|
+
|
83
|
+
def update_baseline_if_new=(value)
|
84
|
+
current_data['updateBaselineIfNew'] = value ? true : false
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'base64'
|
2
|
+
require_relative 'match_window_task'
|
3
|
+
module Applitools
|
4
|
+
class MatchSingleTask < MatchWindowTask
|
5
|
+
def initialize(logger, retry_timeout, app_output_provider)
|
6
|
+
super(logger, 'nil', retry_timeout, app_output_provider)
|
7
|
+
end
|
8
|
+
|
9
|
+
private
|
10
|
+
|
11
|
+
def perform_match(match_window_data)
|
12
|
+
Applitools::ArgumentGuard.is_a? match_window_data, 'match_window_data', Applitools::MatchSingleCheckData
|
13
|
+
Applitools::Connectivity::ServerConnector.match_single_window match_window_data
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -1,34 +1,171 @@
|
|
1
1
|
module Applitools
|
2
2
|
class MatchWindowData
|
3
|
+
class << self
|
4
|
+
def convert_coordinates(region, screenshot)
|
5
|
+
screenshot.convert_region_location(
|
6
|
+
Applitools::Region.from_location_size(region.location, region.size),
|
7
|
+
Applitools::EyesScreenshot::COORDINATE_TYPES[:context_relative],
|
8
|
+
Applitools::EyesScreenshot::COORDINATE_TYPES[:screenshot_as_is]
|
9
|
+
).to_hash
|
10
|
+
end
|
11
|
+
|
12
|
+
def default_data
|
13
|
+
{
|
14
|
+
'IgnoreMismatch' => false,
|
15
|
+
'MismatchWait' => 0,
|
16
|
+
'Options' => {
|
17
|
+
'Name' => nil,
|
18
|
+
'UserInputs' => [],
|
19
|
+
'ImageMatchSettings' => {
|
20
|
+
'MatchLevel' => 'None',
|
21
|
+
'SplitTopHeight' => 0,
|
22
|
+
'SplitBottomHeight' => 0,
|
23
|
+
'IgnoreCaret' => false,
|
24
|
+
'Ignore' => [],
|
25
|
+
'Exact' => {
|
26
|
+
'MinDiffIntensity' => 0,
|
27
|
+
'MinDiffWidth' => 0,
|
28
|
+
'MinDiffHeight' => 0,
|
29
|
+
'MatchThreshold' => 0
|
30
|
+
}
|
31
|
+
},
|
32
|
+
'IgnoreExpectedOutputSettings' => false,
|
33
|
+
'ForceMatch' => false,
|
34
|
+
'ForceMismatch' => false,
|
35
|
+
'IgnoreMatch' => false,
|
36
|
+
'IgnoreMismatch' => false,
|
37
|
+
'Trim' => {
|
38
|
+
'Enabled' => false,
|
39
|
+
}
|
40
|
+
},
|
41
|
+
'Id' => nil,
|
42
|
+
'UserInputs' => [],
|
43
|
+
'AppOutput' => {
|
44
|
+
'Screenshot64' => nil,
|
45
|
+
'ScreenshotUrl' => nil,
|
46
|
+
'Title' => nil,
|
47
|
+
'IsPrimary' => false,
|
48
|
+
'Elapsed' => 0
|
49
|
+
},
|
50
|
+
'Tag' => nil
|
51
|
+
}
|
52
|
+
end
|
53
|
+
|
54
|
+
def valid_region(r)
|
55
|
+
true
|
56
|
+
end
|
57
|
+
|
58
|
+
def valid_input(i)
|
59
|
+
true
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
3
63
|
attr_accessor :app_output, :user_inputs, :tag, :options, :ignore_mismatch
|
4
64
|
|
5
|
-
def initialize
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
self.ignore_mismatch = ignore_mismatch
|
10
|
-
self.options = options
|
65
|
+
def initialize
|
66
|
+
@app_output = nil
|
67
|
+
@ignored_regions = []
|
68
|
+
@need_convert_ignored_regions_coordinates = false
|
11
69
|
end
|
12
70
|
|
13
71
|
def screenshot
|
14
72
|
app_output.screenshot.image.to_blob
|
15
73
|
end
|
16
74
|
|
17
|
-
|
18
|
-
|
19
|
-
|
75
|
+
def ignore_mismatch=(value)
|
76
|
+
current_data['IgnoreMismatch'] = value ? true : false
|
77
|
+
current_data['Options']['IgnoreMismatch'] = current_data['IgnoreMismatch']
|
78
|
+
end
|
79
|
+
|
80
|
+
def tag=(value)
|
81
|
+
current_data['Tag'] = value
|
82
|
+
current_data['Options']['Name'] = value
|
83
|
+
end
|
84
|
+
|
85
|
+
def user_inputs=(value)
|
86
|
+
Applitools::ArgumentGuard.is_a? value, 'value', Array
|
87
|
+
value.each do |i|
|
88
|
+
current_data['UserInputs'] << i if self.class.valid_input(i)
|
89
|
+
end
|
90
|
+
current_data['Options']['UserInputs'] = current_data['UserInputs']
|
91
|
+
end
|
92
|
+
|
93
|
+
def ignored_regions=(value)
|
94
|
+
Applitools::ArgumentGuard.is_a? value, 'value', Array
|
95
|
+
value.each do |r|
|
96
|
+
current_data['Options']['ImageMatchSettings']['Ignore'] << r.to_hash if self.class.valid_region(r)
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
def app_output=(value)
|
101
|
+
Applitools::ArgumentGuard.is_a? value, 'value', Applitools::AppOutputWithScreenshot
|
102
|
+
@app_output = value
|
103
|
+
hash_value = value.to_hash
|
104
|
+
%w(Screenshot64 ScreenshotUrl Title IsPrimary Elapsed).each do |key|
|
105
|
+
current_data['AppOutput'][key] = hash_value[key] unless hash_value[key].nil?
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
def match_level=(value)
|
110
|
+
current_data['Options']['ImageMatchSettings']['MatchLevel'] = value
|
111
|
+
end
|
112
|
+
|
113
|
+
def read_target(target, driver)
|
114
|
+
#options
|
115
|
+
%w(trim).each do |field|
|
116
|
+
send("#{field}=", target.options[field.to_sym])
|
117
|
+
end
|
118
|
+
#ignored regions
|
119
|
+
target.ignored_regions.each do |r|
|
120
|
+
case r
|
121
|
+
when Proc
|
122
|
+
region = r.call(driver)
|
123
|
+
@ignored_regions << Applitools::Region.from_location_size(region.location, region.size)
|
124
|
+
@need_convert_ignored_regions_coordinates = true
|
125
|
+
when Applitools::Region
|
126
|
+
@ignored_regions << r
|
127
|
+
@need_convert_ignored_regions_coordinates = true
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
def ignore_mismatch
|
133
|
+
current_data['IgnoreMismatch']
|
134
|
+
end
|
135
|
+
|
136
|
+
def tag
|
137
|
+
current_data['Tag']
|
138
|
+
end
|
139
|
+
|
140
|
+
def screenshot
|
141
|
+
app_output.screenshot.image.to_blob
|
142
|
+
end
|
143
|
+
|
144
|
+
def trim=(value)
|
145
|
+
current_data['Options']['Trim']['Enabled'] = value ? true : false
|
146
|
+
end
|
147
|
+
|
148
|
+
def convert_ignored_regions_coordinates
|
149
|
+
return unless @need_convert_ignored_regions_coordinates
|
150
|
+
self.ignored_regions = @ignored_regions.map do |r|
|
151
|
+
self.class.convert_coordinates(r, app_output.screenshot)
|
152
|
+
end
|
153
|
+
@need_convert_ignored_regions_coordinates = false
|
154
|
+
end
|
20
155
|
|
21
156
|
def to_hash
|
22
|
-
|
23
|
-
|
24
|
-
result = result.to_hash if result.respond_to? :to_hash
|
25
|
-
[field, result] if [String, Symbol, Hash, Array, FalseClass, TrueClass].include? result.class
|
26
|
-
end.compact
|
27
|
-
Hash[ary]
|
157
|
+
raise Applitools::EyesError.new 'You should convert coordinates for ignored_regions!' if @need_convert_ignored_regions_coordinates
|
158
|
+
current_data.dup
|
28
159
|
end
|
29
160
|
|
30
161
|
def to_s
|
31
162
|
to_hash
|
32
163
|
end
|
164
|
+
|
165
|
+
private
|
166
|
+
|
167
|
+
def current_data
|
168
|
+
@current_data ||= self.class.default_data
|
169
|
+
end
|
33
170
|
end
|
34
171
|
end
|
@@ -6,18 +6,6 @@ module Applitools
|
|
6
6
|
|
7
7
|
attr_reader :logger, :running_session, :default_retry_timeout, :app_output_provider
|
8
8
|
|
9
|
-
class << self
|
10
|
-
def convert_coordinates(regions, screenshot)
|
11
|
-
regions.map do |r|
|
12
|
-
screenshot.convert_region_location(
|
13
|
-
Applitools::Region.from_location_size(r.location, r.size),
|
14
|
-
Applitools::EyesScreenshot::COORDINATE_TYPES[:context_relative],
|
15
|
-
Applitools::EyesScreenshot::COORDINATE_TYPES[:screenshot_as_is]
|
16
|
-
).to_hash
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
9
|
def initialize(logger, running_session, retry_timeout, app_output_provider)
|
22
10
|
@logger = logger
|
23
11
|
@running_session = running_session
|
@@ -35,18 +23,11 @@ module Applitools
|
|
35
23
|
' respond to :app_output'
|
36
24
|
end
|
37
25
|
|
38
|
-
def match_window(options = {})
|
39
|
-
user_inputs = options[:user_inputs]
|
26
|
+
def match_window(match_window_data, options = {})
|
40
27
|
last_screenshot = options[:last_screenshot]
|
41
28
|
region_provider = options[:region_provider]
|
42
|
-
tag = options[:tag]
|
43
|
-
should_match_window_run_once_on_timeout = options[:should_match_window_run_once_on_timeout]
|
44
|
-
ignore_mismatch = options[:ignore_mismatch]
|
45
29
|
retry_timeout = options[:retry_timeout]
|
46
|
-
|
47
|
-
trim = options[:trim] || false
|
48
|
-
match_level = options[:match_level]
|
49
|
-
exact = options[:exact]
|
30
|
+
should_match_window_run_once_on_timeout = options[:should_match_window_run_once_on_timeout]
|
50
31
|
|
51
32
|
retry_timeout = default_retry_timeout if retry_timeout < 0
|
52
33
|
|
@@ -55,60 +36,42 @@ module Applitools
|
|
55
36
|
|
56
37
|
if retry_timeout.zero? || should_match_window_run_once_on_timeout
|
57
38
|
sleep retry_timeout if should_match_window_run_once_on_timeout
|
58
|
-
app_output = app_output_provider.app_output
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
tag: tag,
|
63
|
-
ignore_mismatch: ignore_mismatch,
|
64
|
-
ignore: self.class.convert_coordinates(ignore, app_output.screenshot),
|
65
|
-
trim: trim,
|
66
|
-
match_level: match_level,
|
67
|
-
exact: exact
|
68
|
-
)
|
39
|
+
app_output = app_output_provider.app_output(region_provider, last_screenshot)
|
40
|
+
match_window_data.app_output = app_output
|
41
|
+
match_window_data.convert_ignored_regions_coordinates
|
42
|
+
match_result = perform_match(match_window_data)
|
69
43
|
else
|
70
|
-
|
44
|
+
passed_ignore_mismatch = match_window_data.ignore_mismatch
|
45
|
+
app_output = app_output_provider.app_output(region_provider, last_screenshot)
|
46
|
+
match_window_data.app_output = app_output
|
47
|
+
match_window_data.convert_ignored_regions_coordinates
|
48
|
+
match_window_data.ignore_mismatch = true
|
71
49
|
start = Time.now
|
72
|
-
match_result = perform_match(
|
73
|
-
user_inputs: user_inputs,
|
74
|
-
app_output: app_output,
|
75
|
-
tag: tag,
|
76
|
-
ignore_mismatch: true,
|
77
|
-
ignore: self.class.convert_coordinates(ignore, app_output.screenshot),
|
78
|
-
trim: trim,
|
79
|
-
match_level: match_level,
|
80
|
-
exact: exact
|
81
|
-
)
|
50
|
+
match_result = perform_match(match_window_data)
|
82
51
|
retry_time = Time.now - start
|
83
52
|
|
84
|
-
|
53
|
+
if block_given?
|
54
|
+
block_retry = yield(match_result)
|
55
|
+
else
|
56
|
+
block_retry = false
|
57
|
+
end
|
58
|
+
|
59
|
+
while retry_time < retry_timeout && !(block_retry || match_result.as_expected?)
|
85
60
|
sleep MATCH_INTERVAL
|
86
|
-
app_output = app_output_provider.app_output
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
ignore_mismatch: true,
|
92
|
-
ignore: self.class.convert_coordinates(ignore, app_output.screenshot),
|
93
|
-
trim: trim,
|
94
|
-
match_level: match_level,
|
95
|
-
exact: exact
|
96
|
-
)
|
61
|
+
app_output = app_output_provider.app_output(region_provider, last_screenshot)
|
62
|
+
match_window_data.app_output = app_output
|
63
|
+
match_window_data.convert_ignored_regions_coordinates
|
64
|
+
match_window_data.ignore_mismatch = true
|
65
|
+
match_result = perform_match(match_window_data)
|
97
66
|
retry_time = Time.now - start
|
98
67
|
end
|
99
68
|
|
100
|
-
unless match_result.as_expected?
|
101
|
-
app_output = app_output_provider.app_output
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
ignore_mismatch: ignore_mismatch,
|
107
|
-
ignore: self.class.convert_coordinates(ignore, app_output.screenshot),
|
108
|
-
trim: trim,
|
109
|
-
match_level: match_level,
|
110
|
-
exact: exact
|
111
|
-
)
|
69
|
+
unless block_retry || match_result.as_expected?
|
70
|
+
app_output = app_output_provider.app_output(region_provider, last_screenshot)
|
71
|
+
match_window_data.app_output = app_output
|
72
|
+
match_window_data.convert_ignored_regions_coordinates
|
73
|
+
match_window_data.ignore_mismatch = passed_ignore_mismatch
|
74
|
+
match_result = perform_match(match_window_data)
|
112
75
|
end
|
113
76
|
end
|
114
77
|
|
@@ -120,24 +83,9 @@ module Applitools
|
|
120
83
|
|
121
84
|
private
|
122
85
|
|
123
|
-
def perform_match(
|
124
|
-
|
125
|
-
|
126
|
-
tag = options[:tag]
|
127
|
-
ignore_mismatch = options[:ignore_mismatch]
|
128
|
-
data = Applitools::MatchWindowData.new user_inputs, app_output, tag, ignore_mismatch,
|
129
|
-
name: tag, user_inputs: user_inputs.to_hash, ignore_mismatch: ignore_mismatch, ignore_match: false,
|
130
|
-
force_mistmatch: false, force_match: false,
|
131
|
-
image_match_settings: {
|
132
|
-
matchLevel: options[:match_level],
|
133
|
-
ignore: options[:ignore],
|
134
|
-
ignoreCaret: options[:ignore_caret].nil? ? true : options[:ignore_caret],
|
135
|
-
exact: options[:exact]
|
136
|
-
},
|
137
|
-
trim: {
|
138
|
-
enabled: options[:trim]
|
139
|
-
}
|
140
|
-
Applitools::Connectivity::ServerConnector.match_window running_session, data
|
86
|
+
def perform_match(match_window_data)
|
87
|
+
Applitools::ArgumentGuard.is_a? match_window_data, 'match_window_data', Applitools::MatchWindowData
|
88
|
+
Applitools::Connectivity::ServerConnector.match_window running_session, match_window_data
|
141
89
|
end
|
142
90
|
end
|
143
91
|
end
|
@@ -2,7 +2,7 @@ require 'yaml'
|
|
2
2
|
|
3
3
|
module Applitools
|
4
4
|
class TestResults
|
5
|
-
attr_accessor :is_new, :url
|
5
|
+
attr_accessor :is_new, :url, :screenshot
|
6
6
|
attr_reader :steps, :matches, :mismatches, :missing, :original_results
|
7
7
|
|
8
8
|
def initialize(results = {})
|
@@ -16,17 +16,15 @@ module Applitools
|
|
16
16
|
end
|
17
17
|
|
18
18
|
def passed?
|
19
|
-
|
20
|
-
false
|
19
|
+
!(original_results['isAborted'] || original_results['isDifferent'] || original_results['isNew'])
|
21
20
|
end
|
22
21
|
|
23
22
|
def failed?
|
24
|
-
|
25
|
-
false
|
23
|
+
original_results['isDifferent'] && !(original_results['isAborted'] || original_results['isNew'])
|
26
24
|
end
|
27
25
|
|
28
26
|
def new?
|
29
|
-
|
27
|
+
original_results['isNew']
|
30
28
|
end
|
31
29
|
|
32
30
|
def ==(other)
|
@@ -42,6 +40,8 @@ module Applitools
|
|
42
40
|
|
43
41
|
alias is_passed passed?
|
44
42
|
|
43
|
+
alias as_expected? passed?
|
44
|
+
|
45
45
|
def to_s(advanced = false)
|
46
46
|
is_new_str = ''
|
47
47
|
is_new_str = is_new ? 'New test' : 'Existing test' unless is_new.nil?
|
@@ -62,21 +62,48 @@ module Applitools::Images
|
|
62
62
|
Applitools::ArgumentGuard.not_nil(name, 'name')
|
63
63
|
region_provider = get_region_provider(target)
|
64
64
|
|
65
|
+
match_window_data = Applitools::MatchWindowData.new
|
66
|
+
match_window_data.tag = name
|
67
|
+
match_window_data.match_level = default_match_settings[:match_level]
|
68
|
+
match_window_data.read_target(target, nil)
|
69
|
+
|
65
70
|
image = target.image
|
66
71
|
self.viewport_size = Applitools::RectangleSize.new image.width, image.height if viewport_size.nil?
|
67
72
|
self.screenshot = EyesImagesScreenshot.new image
|
68
73
|
|
69
74
|
mr = check_window_base(
|
70
|
-
region_provider,
|
75
|
+
region_provider,
|
71
76
|
target.options[:timeout] || Applitools::EyesBase::USE_DEFAULT_TIMEOUT,
|
72
|
-
|
73
|
-
trim: target.options[:trim],
|
74
|
-
match_level: default_match_settings[:match_level],
|
75
|
-
exact: default_match_settings[:exact]
|
77
|
+
match_window_data
|
76
78
|
)
|
77
79
|
mr.as_expected?
|
78
80
|
end
|
79
81
|
|
82
|
+
def check_single(name, target, options = {})
|
83
|
+
open_base(options) unless options.empty?
|
84
|
+
Applitools::ArgumentGuard.not_nil(name, 'name')
|
85
|
+
region_provider = get_region_provider(target)
|
86
|
+
|
87
|
+
match_window_data = Applitools::MatchSingleCheckData.new
|
88
|
+
match_window_data.tag = name
|
89
|
+
|
90
|
+
match_window_data.ignore_mismatch = options[:ignore_mismatch] ? true : false
|
91
|
+
match_window_data.match_level = default_match_settings[:match_level]
|
92
|
+
|
93
|
+
match_window_data.read_target(target, nil)
|
94
|
+
|
95
|
+
image = target.image
|
96
|
+
self.viewport_size = Applitools::RectangleSize.new image.width, image.height if viewport_size.nil?
|
97
|
+
self.screenshot = EyesImagesScreenshot.new image
|
98
|
+
|
99
|
+
mr = check_single_base(
|
100
|
+
region_provider,
|
101
|
+
target.options[:timeout] || Applitools::EyesBase::USE_DEFAULT_TIMEOUT,
|
102
|
+
match_window_data
|
103
|
+
)
|
104
|
+
mr
|
105
|
+
end
|
106
|
+
|
80
107
|
def get_region_provider(target)
|
81
108
|
if (region_to_check = target.region_to_check).nil?
|
82
109
|
Object.new.tap do |prov|
|
@@ -124,6 +151,10 @@ module Applitools::Images
|
|
124
151
|
# eyes.check_image(image: my_image, tag: 'My Test', ignore_mismatch: true)
|
125
152
|
def check_image(options)
|
126
153
|
options = { tag: nil, ignore_mismatch: false }.merge options
|
154
|
+
match_data = Applitools::MatchWindowData.new
|
155
|
+
match_data.tag = options[:tag]
|
156
|
+
match_data.ignore_mismatch = options[:ignore_mismatch]
|
157
|
+
match_data.match_level = default_match_settings[:match_level]
|
127
158
|
|
128
159
|
if disabled?
|
129
160
|
logger.info "check_image(image, #{options[:tag]}, #{options[:ignore_mismatch]}): Ignored"
|
@@ -148,8 +179,7 @@ module Applitools::Images
|
|
148
179
|
nil
|
149
180
|
end
|
150
181
|
end
|
151
|
-
mr = check_window_base region_provider,
|
152
|
-
Applitools::EyesBase::USE_DEFAULT_TIMEOUT, options.merge(match_level: default_match_settings[:match_level])
|
182
|
+
mr = check_window_base region_provider, Applitools::EyesBase::USE_DEFAULT_TIMEOUT, match_data
|
153
183
|
mr.as_expected?
|
154
184
|
end
|
155
185
|
|
@@ -170,6 +200,10 @@ module Applitools::Images
|
|
170
200
|
# eyes.check_region(image_bytes: string_represents_image, tag: 'My Test', region: my_region)
|
171
201
|
def check_region(options)
|
172
202
|
options = { tag: nil, ignore_mismatch: false }.merge options
|
203
|
+
match_data = Applitools::MatchWindowData.new
|
204
|
+
match_data.tag = options[:tag]
|
205
|
+
match_data.ignore_mismatch = options[:ignore_mismatch]
|
206
|
+
match_data.match_level = default_match_settings[:match_level]
|
173
207
|
|
174
208
|
if disabled?
|
175
209
|
logger.info "check_region(image, #{options[:tag]}, #{options[:ignore_mismatch]}): Ignored"
|
@@ -196,8 +230,9 @@ module Applitools::Images
|
|
196
230
|
Applitools::EyesScreenshot::COORDINATE_TYPES[:screenshot_as_is]
|
197
231
|
end
|
198
232
|
end
|
199
|
-
mr = check_window_base region_provider, options[:tag], options[:ignore_mismatch],
|
200
|
-
|
233
|
+
# mr = check_window_base region_provider, options[:tag], options[:ignore_mismatch],
|
234
|
+
# Applitools::EyesBase::USE_DEFAULT_TIMEOUT, options.merge(match_level: default_match_settings[:match_level])
|
235
|
+
mr = check_window_base region_provider, Applitools::EyesBase::USE_DEFAULT_TIMEOUT, match_data
|
201
236
|
mr.as_expected?
|
202
237
|
end
|
203
238
|
|
data/lib/applitools/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: eyes_core
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.6.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Applitools Team
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-05-
|
11
|
+
date: 2017-05-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: oily_png
|
@@ -222,6 +222,8 @@ files:
|
|
222
222
|
- lib/applitools/core/location.rb
|
223
223
|
- lib/applitools/core/match_result.rb
|
224
224
|
- lib/applitools/core/match_results.rb
|
225
|
+
- lib/applitools/core/match_single_check_data.rb
|
226
|
+
- lib/applitools/core/match_single_task.rb
|
225
227
|
- lib/applitools/core/match_window_data.rb
|
226
228
|
- lib/applitools/core/match_window_task.rb
|
227
229
|
- lib/applitools/core/mouse_trigger.rb
|