image_comparator 0.0.1
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 +7 -0
- data/.gitignore +5 -0
- data/README.md +32 -0
- data/Rakefile +9 -0
- data/doc/ImageComparator.html +802 -0
- data/doc/_index.html +110 -0
- data/doc/class_list.html +58 -0
- data/doc/css/common.css +1 -0
- data/doc/css/full_list.css +57 -0
- data/doc/css/style.css +339 -0
- data/doc/file.README.html +75 -0
- data/doc/file_list.html +60 -0
- data/doc/frames.html +26 -0
- data/doc/index.html +75 -0
- data/doc/js/app.js +219 -0
- data/doc/js/full_list.js +181 -0
- data/doc/js/jquery.js +4 -0
- data/doc/method_list.html +87 -0
- data/doc/top-level-namespace.html +112 -0
- data/image_comparator.gemspec +19 -0
- data/images/almost-the-same-1.png +0 -0
- data/images/almost-the-same-2.png +0 -0
- data/images/base-nok-areas.png +0 -0
- data/images/base-nok.png +0 -0
- data/images/base-ok.png +0 -0
- data/images/base.png +0 -0
- data/lib/image_comparator.rb +316 -0
- data/test/image_comparator_test.rb +267 -0
- metadata +143 -0
@@ -0,0 +1,267 @@
|
|
1
|
+
require 'minitest/autorun'
|
2
|
+
require 'image_comparator'
|
3
|
+
require 'fileutils'
|
4
|
+
|
5
|
+
class ImageComparatorTest < Minitest::Test
|
6
|
+
|
7
|
+
def setup
|
8
|
+
create_tmp_folder_if_required
|
9
|
+
@image_comparator = ImageComparator.new
|
10
|
+
end
|
11
|
+
|
12
|
+
def teardown
|
13
|
+
clean_images
|
14
|
+
end
|
15
|
+
|
16
|
+
def clean_images
|
17
|
+
FileUtils.rm_rf Dir.glob('./tmp/*.png')
|
18
|
+
end
|
19
|
+
|
20
|
+
def create_tmp_folder_if_required
|
21
|
+
folder = 'tmp'
|
22
|
+
FileUtils::mkdir_p folder unless File.directory?(folder)
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_compare_pixel_perfect_almost
|
26
|
+
@image_comparator.define_images_to_compare('./images/almost-the-same-1.png', './images/almost-the-same-2.png')
|
27
|
+
compare = @image_comparator.compare
|
28
|
+
refute(compare, 'Images are not equal')
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_compare_pixel_perfect
|
32
|
+
@image_comparator.define_images_to_compare('./images/base.png', './images/base-ok.png')
|
33
|
+
compare = @image_comparator.compare
|
34
|
+
assert(compare, 'Images are not equal')
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_not_compare_pixel_perfect
|
38
|
+
@image_comparator.define_images_to_compare('./images/base.png', './images/base-nok.png')
|
39
|
+
compare = @image_comparator.compare
|
40
|
+
refute(compare, 'Images are equal')
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_calculate_diff_image_ok
|
44
|
+
path_res = './tmp/ok_diff.png'
|
45
|
+
expected_fingerprint = 0
|
46
|
+
|
47
|
+
@image_comparator.define_images_to_compare('./images/base.png', './images/base-ok.png')
|
48
|
+
current_fingerprint = @image_comparator.calculate_diff_image(path_res)
|
49
|
+
fingerprint_diff_file = Phashion::Image.new(path_res).fingerprint
|
50
|
+
|
51
|
+
assert_equal(expected_fingerprint, current_fingerprint, 'Method fingerprint is not the expceted one')
|
52
|
+
assert_equal(expected_fingerprint, fingerprint_diff_file, 'Diff file fingerprint is not the expceted one')
|
53
|
+
end
|
54
|
+
|
55
|
+
def test_calculate_diff_image_fail
|
56
|
+
path_res = './tmp/fail_diff.png'
|
57
|
+
expected_fingerprint = 5450986487329114955
|
58
|
+
|
59
|
+
@image_comparator.define_images_to_compare('./images/base.png', './images/base-nok.png')
|
60
|
+
current_fingerprint = @image_comparator.calculate_diff_image(path_res)
|
61
|
+
fingerprint_diff_file = Phashion::Image.new(path_res).fingerprint
|
62
|
+
|
63
|
+
assert_equal(expected_fingerprint, current_fingerprint, 'Method fingerprint is not the expceted one')
|
64
|
+
assert_equal(expected_fingerprint, fingerprint_diff_file, 'Diff file fingerprint is not the expceted one')
|
65
|
+
end
|
66
|
+
|
67
|
+
def test_compare_and_generate_diff_ok
|
68
|
+
@image_comparator.define_images_to_compare('./images/base.png', './images/base-ok.png')
|
69
|
+
compare = @image_comparator.compare_and_generate_diff
|
70
|
+
assert(compare, 'Images are not equal')
|
71
|
+
end
|
72
|
+
|
73
|
+
def test_compare_and_generate_diff_nok
|
74
|
+
expected_fingerprint = 5450986487329114955
|
75
|
+
path_res = './tmp/fail_diff.png'
|
76
|
+
|
77
|
+
@image_comparator.define_images_to_compare('./images/base.png', './images/base-nok.png')
|
78
|
+
compare = @image_comparator.compare_and_generate_diff(path_res)
|
79
|
+
fingerprint_diff_file = Phashion::Image.new(path_res).fingerprint
|
80
|
+
|
81
|
+
refute(compare, 'Images are equal')
|
82
|
+
assert_equal(expected_fingerprint, fingerprint_diff_file, 'Diff file fingerprint is not the expceted one')
|
83
|
+
end
|
84
|
+
|
85
|
+
def test_compare_area_include
|
86
|
+
origin_coord = {'x':828, 'y':293}
|
87
|
+
end_coord = {'x':1173, 'y':688}
|
88
|
+
area = [{'origin': origin_coord, 'end': end_coord, 'exclude': false}]
|
89
|
+
|
90
|
+
@image_comparator.define_images_to_compare('./images/base.png', './images/base-nok-areas.png')
|
91
|
+
@image_comparator.set_areas(area)
|
92
|
+
compare = @image_comparator.compare
|
93
|
+
|
94
|
+
assert(compare, 'Images are not equals')
|
95
|
+
end
|
96
|
+
|
97
|
+
def test_compare_area_exclude
|
98
|
+
origin_coord = {'x':828, 'y':293}
|
99
|
+
end_coord = {'x':1173, 'y':688}
|
100
|
+
area = [{'origin': origin_coord, 'end': end_coord, 'exclude': true}]
|
101
|
+
|
102
|
+
@image_comparator.define_images_to_compare('./images/base.png', './images/base-nok.png')
|
103
|
+
@image_comparator.set_areas(area)
|
104
|
+
compare = @image_comparator.compare
|
105
|
+
|
106
|
+
assert(compare, 'Images are not equals')
|
107
|
+
end
|
108
|
+
|
109
|
+
def test_compare_several_areas_include
|
110
|
+
origin_coord = {'x':828, 'y':293}
|
111
|
+
end_coord = {'x':1173, 'y':688}
|
112
|
+
area1 = {'origin': origin_coord, 'end': end_coord, 'exclude': false}
|
113
|
+
origin_coord2 = {'x':0, 'y':0}
|
114
|
+
end_coord2 = {'x':828, 'y':293}
|
115
|
+
area2 = {'origin': origin_coord2, 'end': end_coord2, 'exclude': false}
|
116
|
+
areas = [area1, area2]
|
117
|
+
|
118
|
+
@image_comparator.define_images_to_compare('./images/base.png', './images/base-nok-areas.png')
|
119
|
+
@image_comparator.set_areas(areas)
|
120
|
+
compare = @image_comparator.compare
|
121
|
+
|
122
|
+
refute(compare, 'Images are compares')
|
123
|
+
end
|
124
|
+
|
125
|
+
def test_compare_several_areas_exclude
|
126
|
+
origin_coord = {'x':828, 'y':293}
|
127
|
+
end_coord = {'x':1173, 'y':688}
|
128
|
+
area1 = {'origin': origin_coord, 'end': end_coord, 'exclude': true}
|
129
|
+
origin_coord2 = {'x':0, 'y':0}
|
130
|
+
end_coord2 = {'x':828, 'y':293}
|
131
|
+
area2 = {'origin': origin_coord2, 'end': end_coord2, 'exclude': true}
|
132
|
+
areas = [area1, area2]
|
133
|
+
|
134
|
+
@image_comparator.define_images_to_compare('./images/base.png', './images/base-nok-areas.png')
|
135
|
+
@image_comparator.set_areas(areas)
|
136
|
+
compare = @image_comparator.compare
|
137
|
+
|
138
|
+
assert(compare, 'Images are not equals')
|
139
|
+
end
|
140
|
+
|
141
|
+
def test_compare_several_areas_mix_not_overlapping
|
142
|
+
origin_coord = {'x':828, 'y':293}
|
143
|
+
end_coord = {'x':1173, 'y':688}
|
144
|
+
area1 = {'origin': origin_coord, 'end': end_coord, 'exclude': false}
|
145
|
+
origin_coord2 = {'x':0, 'y':0}
|
146
|
+
end_coord2 = {'x':828, 'y':293}
|
147
|
+
area2 = {'origin': origin_coord2, 'end': end_coord2, 'exclude': true}
|
148
|
+
areas = [area1, area2]
|
149
|
+
|
150
|
+
@image_comparator.define_images_to_compare('./images/base.png', './images/base-nok-areas.png')
|
151
|
+
@image_comparator.set_areas(areas)
|
152
|
+
compare = @image_comparator.compare
|
153
|
+
|
154
|
+
assert(compare, 'Images are differents')
|
155
|
+
end
|
156
|
+
|
157
|
+
def test_compare_several_areas_mix_overlapping
|
158
|
+
origin_coord = {'x':828, 'y':293}
|
159
|
+
end_coord = {'x':1173, 'y':688}
|
160
|
+
area1 = {'origin': origin_coord, 'end': end_coord, 'exclude': false}
|
161
|
+
origin_coord2 = {'x':0, 'y':0}
|
162
|
+
end_coord2 = {'x':1000, 'y':490}
|
163
|
+
area2 = {'origin': origin_coord2, 'end': end_coord2, 'exclude': true}
|
164
|
+
areas = [area1, area2]
|
165
|
+
|
166
|
+
@image_comparator.define_images_to_compare('./images/base.png', './images/base-nok-areas.png')
|
167
|
+
@image_comparator.set_areas(areas)
|
168
|
+
compare = @image_comparator.compare
|
169
|
+
|
170
|
+
assert(compare, 'Images are differents')
|
171
|
+
end
|
172
|
+
|
173
|
+
def test_compare_and_generate_diff_area_include
|
174
|
+
origin_coord = {'x':828, 'y':293}
|
175
|
+
end_coord = {'x':1173, 'y':688}
|
176
|
+
area = [{'origin': origin_coord, 'end': end_coord, 'exclude': false}]
|
177
|
+
path_res = './tmp/ok_diff.png'
|
178
|
+
|
179
|
+
@image_comparator.define_images_to_compare('./images/base.png', './images/base-ok.png')
|
180
|
+
@image_comparator.set_areas(area)
|
181
|
+
compare = @image_comparator.compare_and_generate_diff(path_res)
|
182
|
+
|
183
|
+
assert(compare, 'Images are differents')
|
184
|
+
end
|
185
|
+
|
186
|
+
def test_compare_and_generate_diff_area_exclude
|
187
|
+
origin_coord = {'x':828, 'y':293}
|
188
|
+
end_coord = {'x':1173, 'y':688}
|
189
|
+
area = [{'origin': origin_coord, 'end': end_coord, 'exclude': true}]
|
190
|
+
path_res = './tmp/ok_diff.png'
|
191
|
+
|
192
|
+
@image_comparator.define_images_to_compare('./images/base.png', './images/base-nok.png')
|
193
|
+
@image_comparator.set_areas(area)
|
194
|
+
compare = @image_comparator.compare_and_generate_diff(path_res)
|
195
|
+
|
196
|
+
assert(compare, 'Images are differents')
|
197
|
+
end
|
198
|
+
|
199
|
+
def test_compare_and_generate_diff_several_areas_mix_overlapping
|
200
|
+
origin_coord = {'x':828, 'y':293}
|
201
|
+
end_coord = {'x':1173, 'y':688}
|
202
|
+
area1 = {'origin': origin_coord, 'end': end_coord, 'exclude': false}
|
203
|
+
origin_coord2 = {'x':0, 'y':0}
|
204
|
+
end_coord2 = {'x':1000, 'y':490}
|
205
|
+
area2 = {'origin': origin_coord2, 'end': end_coord2, 'exclude': true}
|
206
|
+
areas = [area1, area2]
|
207
|
+
path_res = './tmp/ok_diff.png'
|
208
|
+
|
209
|
+
@image_comparator.define_images_to_compare('./images/base.png', './images/base-nok-areas.png')
|
210
|
+
@image_comparator.set_areas(areas)
|
211
|
+
compare = @image_comparator.compare_and_generate_diff(path_res)
|
212
|
+
|
213
|
+
assert(compare, 'Images are differents')
|
214
|
+
end
|
215
|
+
|
216
|
+
def test_compare_and_generate_diff_area_include_fail
|
217
|
+
origin_coord = {'x':828, 'y':293}
|
218
|
+
end_coord = {'x':1173, 'y':688}
|
219
|
+
area = [{'origin': origin_coord, 'end': end_coord, 'exclude': false}]
|
220
|
+
path_res = './tmp/nok_diff.png'
|
221
|
+
expected_fingerprint = 5450986487329114955
|
222
|
+
|
223
|
+
@image_comparator.define_images_to_compare('./images/base.png', './images/base-nok.png')
|
224
|
+
@image_comparator.set_areas(area)
|
225
|
+
compare = @image_comparator.compare_and_generate_diff(path_res)
|
226
|
+
refute(compare, 'Images are equal')
|
227
|
+
|
228
|
+
fingerprint_diff_file = Phashion::Image.new(path_res).fingerprint
|
229
|
+
assert_equal(expected_fingerprint, fingerprint_diff_file, 'Diff file fingerprint is not the expected one')
|
230
|
+
end
|
231
|
+
|
232
|
+
def test_compare_and_generate_diff_area_exclude_fail
|
233
|
+
origin_coord = {'x':0, 'y':0}
|
234
|
+
end_coord = {'x':1000, 'y':490}
|
235
|
+
area = [{'origin': origin_coord, 'end': end_coord, 'exclude': true}]
|
236
|
+
path_res = './tmp/nok_diff.png'
|
237
|
+
expected_fingerprint = 5452075012271155531
|
238
|
+
|
239
|
+
@image_comparator.define_images_to_compare('./images/base.png', './images/base-nok.png')
|
240
|
+
@image_comparator.set_areas(area)
|
241
|
+
compare = @image_comparator.compare_and_generate_diff(path_res)
|
242
|
+
refute(compare, 'Images are equal')
|
243
|
+
|
244
|
+
fingerprint_diff_file = Phashion::Image.new(path_res).fingerprint
|
245
|
+
assert_equal(expected_fingerprint, fingerprint_diff_file, 'Diff file fingerprint is not the expected one')
|
246
|
+
end
|
247
|
+
|
248
|
+
def test_compare_and_generate_diff_several_areas_mix_overlapping_fail
|
249
|
+
origin_coord = {'x':828, 'y':293}
|
250
|
+
end_coord = {'x':1173, 'y':688}
|
251
|
+
area1 = {'origin': origin_coord, 'end': end_coord, 'exclude': true}
|
252
|
+
origin_coord2 = {'x':0, 'y':0}
|
253
|
+
end_coord2 = {'x':1000, 'y':490}
|
254
|
+
area2 = {'origin': origin_coord2, 'end': end_coord2, 'exclude': false}
|
255
|
+
areas = [area1, area2]
|
256
|
+
path_res = './tmp/nok_diff.png'
|
257
|
+
expected_fingerprint = 54086765383280
|
258
|
+
|
259
|
+
@image_comparator.define_images_to_compare('./images/base.png', './images/base-nok-areas.png')
|
260
|
+
@image_comparator.set_areas(areas)
|
261
|
+
compare = @image_comparator.compare_and_generate_diff(path_res)
|
262
|
+
refute(compare, 'Images are equal')
|
263
|
+
|
264
|
+
fingerprint_diff_file = Phashion::Image.new(path_res).fingerprint
|
265
|
+
assert_equal(expected_fingerprint, fingerprint_diff_file, 'Diff file fingerprint is not the expected one')
|
266
|
+
end
|
267
|
+
end
|
metadata
ADDED
@@ -0,0 +1,143 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: image_comparator
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Alberto Costoya
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-11-10 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: phashion
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.1'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.1'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: chunky_png
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.3'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1.3'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rmagick
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '2.15'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '2.15'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: yard
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0.8'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0.8'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: minitest
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '5.9'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '5.9'
|
83
|
+
description: This gem provides a simple api to compare 2 pngs and in case they are
|
84
|
+
different, get the differences on a png file
|
85
|
+
email: alberto.costoya@xing.com
|
86
|
+
executables: []
|
87
|
+
extensions: []
|
88
|
+
extra_rdoc_files: []
|
89
|
+
files:
|
90
|
+
- ".gitignore"
|
91
|
+
- README.md
|
92
|
+
- Rakefile
|
93
|
+
- doc/ImageComparator.html
|
94
|
+
- doc/_index.html
|
95
|
+
- doc/class_list.html
|
96
|
+
- doc/css/common.css
|
97
|
+
- doc/css/full_list.css
|
98
|
+
- doc/css/style.css
|
99
|
+
- doc/file.README.html
|
100
|
+
- doc/file_list.html
|
101
|
+
- doc/frames.html
|
102
|
+
- doc/index.html
|
103
|
+
- doc/js/app.js
|
104
|
+
- doc/js/full_list.js
|
105
|
+
- doc/js/jquery.js
|
106
|
+
- doc/method_list.html
|
107
|
+
- doc/top-level-namespace.html
|
108
|
+
- image_comparator.gemspec
|
109
|
+
- images/almost-the-same-1.png
|
110
|
+
- images/almost-the-same-2.png
|
111
|
+
- images/base-nok-areas.png
|
112
|
+
- images/base-nok.png
|
113
|
+
- images/base-ok.png
|
114
|
+
- images/base.png
|
115
|
+
- lib/image_comparator.rb
|
116
|
+
- test/image_comparator_test.rb
|
117
|
+
homepage: https://source.xing.com/jobs-team/image_comparison
|
118
|
+
licenses:
|
119
|
+
- GPL-3.0
|
120
|
+
metadata: {}
|
121
|
+
post_install_message:
|
122
|
+
rdoc_options: []
|
123
|
+
require_paths:
|
124
|
+
- lib
|
125
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
126
|
+
requirements:
|
127
|
+
- - ">="
|
128
|
+
- !ruby/object:Gem::Version
|
129
|
+
version: '0'
|
130
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
131
|
+
requirements:
|
132
|
+
- - ">="
|
133
|
+
- !ruby/object:Gem::Version
|
134
|
+
version: '0'
|
135
|
+
requirements: []
|
136
|
+
rubyforge_project:
|
137
|
+
rubygems_version: 2.6.7
|
138
|
+
signing_key:
|
139
|
+
specification_version: 4
|
140
|
+
summary: Gem to compare to png images and get differences.
|
141
|
+
test_files:
|
142
|
+
- test/image_comparator_test.rb
|
143
|
+
has_rdoc:
|