kracker 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.ruby-version +1 -1
- data/Gemfile +1 -1
- data/kracker.gemspec +1 -0
- data/lib/kracker/analysis.rb +8 -3
- data/lib/kracker/kracker.rb +9 -0
- data/lib/kracker/version.rb +1 -1
- data/lib/kracker/zooka/analyzer.rb +157 -0
- data/lib/kracker/zooka/error_pixel_transform.rb +32 -0
- data/lib/kracker/zooka/image.rb +70 -0
- data/lib/kracker/zooka/pixel.rb +50 -0
- data/lib/kracker/zooka/tolerance.rb +36 -0
- data/lib/kracker.rb +6 -0
- data/test/selenium/mapping_test.rb +23 -3
- data/test/selenium/zooka_test.rb +64 -0
- data/test/selenium_test_helper.rb +48 -1
- data/test/test_helper.rb +3 -1
- data/test/test_objects/test_objects.rb +1138 -0
- data/test/unit/analysis_test.rb +13 -0
- data/test/unit/analyzer_test.rb +153 -0
- metadata +26 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 61346c706348ae78ccf2739f62c62d132ff27d3f
|
4
|
+
data.tar.gz: 129c1fdf63cb2c97f609d91be74e05100d751f7f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2c77b6a589b65375de31df8862ea41223bf0236622f8cc5cb4c7f515a55e5b6b3f9ffcf37977c63768e8705bec30fa1f9876d8c91608903dd21849ae6223e733
|
7
|
+
data.tar.gz: b489c575a18a781d12916b84341f16931f5bcdd3508225cc13838eef94e3053c5b494e6dc1fdca90384a0100756793ee4b2b78751225af2bfdf908b76794c46b
|
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.0.0
|
1
|
+
2.0.0-p353
|
data/Gemfile
CHANGED
data/kracker.gemspec
CHANGED
data/lib/kracker/analysis.rb
CHANGED
@@ -48,7 +48,7 @@ module Kracker
|
|
48
48
|
output_hash
|
49
49
|
end
|
50
50
|
|
51
|
-
def make_svg(set_master_not_current, set_current_not_master)
|
51
|
+
def make_svg(set_master_not_current, set_current_not_master, set_changed_master)
|
52
52
|
js_id = 0
|
53
53
|
set_master_not_current.each do |item|
|
54
54
|
item[:js_id] = js_id
|
@@ -58,9 +58,14 @@ module Kracker
|
|
58
58
|
item[:js_id] = js_id
|
59
59
|
js_id += 1
|
60
60
|
end
|
61
|
+
set_changed_master.each do |item|
|
62
|
+
item[:js_id] = js_id
|
63
|
+
js_id += 1
|
64
|
+
end
|
61
65
|
|
62
66
|
rectangles = set_current_not_master.map { |item| item.merge(format__not_in_master) }
|
63
67
|
rectangles << set_master_not_current.map { |item| item.merge(format__not_in_current) }
|
68
|
+
rectangles << set_changed_master.map { |item| item.merge(format__same_but_different) }
|
64
69
|
rectangles.flatten!
|
65
70
|
|
66
71
|
generate_svg(rectangles)
|
@@ -68,7 +73,7 @@ module Kracker
|
|
68
73
|
|
69
74
|
def create_diff_file(set_current_not_master, set_master_not_current, set_changed_master, test_root)
|
70
75
|
filename = Kracker.diff_filename(test_root)
|
71
|
-
svg = make_svg(set_current_not_master, set_master_not_current)
|
76
|
+
svg = make_svg(set_current_not_master, set_master_not_current, set_changed_master)
|
72
77
|
File.open(filename, 'w') { |file| file.write(svg) }
|
73
78
|
save_set_info(test_root, 'current_not_master', set_current_not_master)
|
74
79
|
save_set_info(test_root, 'master_not_current', set_master_not_current)
|
@@ -133,4 +138,4 @@ module Kracker
|
|
133
138
|
"cp #{Kracker.current_filename(test_root)} #{Kracker.master_filename(test_root)}"
|
134
139
|
end
|
135
140
|
|
136
|
-
end
|
141
|
+
end
|
data/lib/kracker/kracker.rb
CHANGED
@@ -2,6 +2,7 @@ module Kracker
|
|
2
2
|
require 'yaml'
|
3
3
|
|
4
4
|
def page_map_same?(test_root)
|
5
|
+
purge_old_files_before_test(test_root)
|
5
6
|
|
6
7
|
result, msg = map_current_file(test_root)
|
7
8
|
return [result, msg] unless result
|
@@ -20,6 +21,8 @@ module Kracker
|
|
20
21
|
msg = make_analysis_failure_report(analysis_data)
|
21
22
|
result = analysis_data[:same]
|
22
23
|
|
24
|
+
File.delete Kracker.current_filename(test_root) if result
|
25
|
+
|
23
26
|
[result, msg]
|
24
27
|
end
|
25
28
|
|
@@ -109,4 +112,10 @@ module Kracker
|
|
109
112
|
msg.join("\n")
|
110
113
|
end
|
111
114
|
|
115
|
+
def purge_old_files_before_test(test_root)
|
116
|
+
File.delete Kracker.current_filename(test_root) if File.exist?(Kracker.current_filename(test_root))
|
117
|
+
|
118
|
+
filename_pattern = File.join(Kracker.diff_file_location, "#{test_root}__*__diff.yaml")
|
119
|
+
Dir[filename_pattern].each { |file| file.delete(file) if File.exist?(file) }
|
120
|
+
end
|
112
121
|
end
|
data/lib/kracker/version.rb
CHANGED
@@ -0,0 +1,157 @@
|
|
1
|
+
module Kracker
|
2
|
+
module Zooka
|
3
|
+
class Analyzer
|
4
|
+
attr_accessor :tolerance, :ignore_antialiasing, :ignore_colors
|
5
|
+
attr_accessor :image_1, :image_2
|
6
|
+
attr_reader :result
|
7
|
+
attr_reader :noncompliant_pixels
|
8
|
+
|
9
|
+
def initialize(options = {})
|
10
|
+
@tolerance = Tolerance.new
|
11
|
+
@ignore_antialiasing = false
|
12
|
+
@ignore_colors = false
|
13
|
+
@noncompliant_pixels = []
|
14
|
+
|
15
|
+
if options.has_key?(:image_1)
|
16
|
+
@image_1 = options[:image_1]
|
17
|
+
elsif options.has_key?(:filename_1)
|
18
|
+
@image_1 = ChunkyPNG::Image.from_file(options[:filename_1])
|
19
|
+
else
|
20
|
+
@image_1 = nil
|
21
|
+
end
|
22
|
+
|
23
|
+
if options.has_key?(:image_2)
|
24
|
+
@image_2 = options[:image_2]
|
25
|
+
elsif options.has_key?(:filename_2)
|
26
|
+
@image_2 = ChunkyPNG::Image.from_file(options[:filename_2])
|
27
|
+
else
|
28
|
+
@image_2 = nil
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def analyze
|
33
|
+
@noncompliant_pixels = []
|
34
|
+
@result = ChunkyPNG::Image.new(@image_1.width, @image_1.height, ChunkyPNG::Color::TRANSPARENT)
|
35
|
+
|
36
|
+
@image_1.width.times do |x|
|
37
|
+
@image_1.height.times do |y|
|
38
|
+
pix_1 = Pixel.new(@image_1[x, y])
|
39
|
+
pix_2 = Pixel.new(@image_2[x, y])
|
40
|
+
|
41
|
+
if @ignore_colors
|
42
|
+
if brightness_similar?(pix_1, pix_2)
|
43
|
+
@result[x, y] = ChunkyPNG::Color::rgba(pix_1.red, pix_1.green, pix_1.blue, pix_1.alpha / 10)
|
44
|
+
else
|
45
|
+
@result[x, y] = ChunkyPNG::Color::rgba(255, 0, 0, 100)
|
46
|
+
@noncompliant_pixels << { x: x, y: y }
|
47
|
+
end
|
48
|
+
else
|
49
|
+
if rgb_similar?(pix_1, pix_2)
|
50
|
+
@result[x, y] = ChunkyPNG::Color::rgba(pix_1.red, pix_1.green, pix_1.blue, pix_1.alpha / 10)
|
51
|
+
elsif @ignore_antialiasing && (antialiased?(@image_1, x, y) || antialiased?(@image_2, x, y))
|
52
|
+
if brightness_similar?(pix_1, pix_2)
|
53
|
+
@result[x, y] = ChunkyPNG::Color::rgba(pix_1.red, pix_1.green, pix_1.blue, pix_1.alpha / 10)
|
54
|
+
else
|
55
|
+
@result[x, y] = ChunkyPNG::Color::rgba(255, 0, 0, 100)
|
56
|
+
@noncompliant_pixels << { x: x, y: y }
|
57
|
+
end
|
58
|
+
else
|
59
|
+
@result[x, y] = ChunkyPNG::Color::rgba(255, 0, 0, 100)
|
60
|
+
@noncompliant_pixels << { x: x, y: y }
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def same?
|
68
|
+
@noncompliant_pixels.count == 0
|
69
|
+
end
|
70
|
+
|
71
|
+
private
|
72
|
+
|
73
|
+
def antialiased?(data, src_x, src_y)
|
74
|
+
high_contrast_siblings = 0
|
75
|
+
different_hue_siblings = 0
|
76
|
+
equivalent_siblings = 0
|
77
|
+
|
78
|
+
pixel = Pixel.new(data[src_x, src_y])
|
79
|
+
|
80
|
+
result = false
|
81
|
+
|
82
|
+
other_pixels = []
|
83
|
+
|
84
|
+
(-1..1).each do |x|
|
85
|
+
(-1..1).each do |y|
|
86
|
+
unless x == 0 && y == 0
|
87
|
+
other_x = src_x + x
|
88
|
+
other_y = src_y + y
|
89
|
+
|
90
|
+
next if other_x >= data.width
|
91
|
+
next if other_x < 0
|
92
|
+
next if other_y >= data.height
|
93
|
+
next if other_y < 0
|
94
|
+
|
95
|
+
other_pixels << Pixel.new(data[other_x, other_y])
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
if other_pixels.length == 8
|
101
|
+
other_pixels.each do |other_pixel|
|
102
|
+
high_contrast_siblings = high_contrast_siblings + 1 if contrasting?(pixel, other_pixel)
|
103
|
+
equivalent_siblings = equivalent_siblings + 1 if rgb_same?(pixel, other_pixel)
|
104
|
+
different_hue_siblings = different_hue_siblings + 1 unless hue_same?(pixel, other_pixel)
|
105
|
+
|
106
|
+
if different_hue_siblings > 1 || high_contrast_siblings > 1
|
107
|
+
return true
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
result = equivalent_siblings < 2
|
112
|
+
else
|
113
|
+
result = false
|
114
|
+
end
|
115
|
+
|
116
|
+
result
|
117
|
+
end
|
118
|
+
|
119
|
+
def contrasting?(pix1, pix2)
|
120
|
+
(pix1.brightness - pix2.brightness).abs > @tolerance.max_brightness
|
121
|
+
end
|
122
|
+
|
123
|
+
def rgb_same?(pix1, pix2)
|
124
|
+
red_same = pix1.red == pix2.red
|
125
|
+
green_same = pix1.green == pix2.green
|
126
|
+
blue_same = pix1.blue == pix2.blue
|
127
|
+
|
128
|
+
red_same && green_same && blue_same
|
129
|
+
end
|
130
|
+
|
131
|
+
def hue_same?(pix1, pix2)
|
132
|
+
(pix1.hue - pix2.hue).abs <= @tolerance.hue
|
133
|
+
end
|
134
|
+
|
135
|
+
def rgb_similar?(pix1, pix2)
|
136
|
+
red_similar = color_similar?(pix1.red, pix2.red, 'red')
|
137
|
+
green_similar = color_similar?(pix1.green, pix2.green, 'green')
|
138
|
+
blue_similar = color_similar?(pix1.blue, pix2.blue, 'blue')
|
139
|
+
alpha_similar = color_similar?(pix1.alpha, pix2.alpha, 'alpha')
|
140
|
+
|
141
|
+
red_similar && green_similar && blue_similar && alpha_similar
|
142
|
+
end
|
143
|
+
|
144
|
+
def color_similar?(a, b, color)
|
145
|
+
return true if a == b
|
146
|
+
(a - b).abs < @tolerance.color(color)
|
147
|
+
end
|
148
|
+
|
149
|
+
def brightness_similar?(pix1, pix2)
|
150
|
+
alpha = color_similar?(pix1.alpha, pix2.alpha, 'alpha')
|
151
|
+
brightness = color_similar?(pix1.brightness, pix2.brightness, 'min_brightness')
|
152
|
+
brightness && alpha
|
153
|
+
end
|
154
|
+
|
155
|
+
end
|
156
|
+
end
|
157
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module Kracker
|
2
|
+
module Zooka
|
3
|
+
class ErrorPixelTransform
|
4
|
+
attr_accessor :red, :green, :blue, :alpha
|
5
|
+
|
6
|
+
def initialize
|
7
|
+
@red = 255
|
8
|
+
@green = 0
|
9
|
+
@blue = 255
|
10
|
+
@alpha = 255
|
11
|
+
end
|
12
|
+
|
13
|
+
def flat(d1, d2)
|
14
|
+
{
|
15
|
+
r: @red,
|
16
|
+
g: @green,
|
17
|
+
b: @blue,
|
18
|
+
a: @alpha
|
19
|
+
}
|
20
|
+
end
|
21
|
+
|
22
|
+
def movement(d1, d2)
|
23
|
+
{
|
24
|
+
r: ((d2.red * (@red/255)) + @red) / 2,
|
25
|
+
g: ((d2.green * (@green/255)) + @green) / 2,
|
26
|
+
b: ((d2.blue * (@blue/255)) + @blue) / 2,
|
27
|
+
a: d2.alpha
|
28
|
+
}
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
module Kracker
|
2
|
+
module Zooka
|
3
|
+
class Image
|
4
|
+
attr_accessor :data, :pixels
|
5
|
+
attr_accessor :red, :green, :blue, :alpha, :brightness
|
6
|
+
attr_accessor :red_total, :green_total, :blue_total, :brightness_total
|
7
|
+
|
8
|
+
def initialize(data)
|
9
|
+
@data = data
|
10
|
+
compute_image_summary
|
11
|
+
end
|
12
|
+
|
13
|
+
def display_image_info
|
14
|
+
puts '-'*22
|
15
|
+
puts " Width: #{@data.width}"
|
16
|
+
puts " Height: #{@data.height}"
|
17
|
+
puts " Avg. Red: #{@red}"
|
18
|
+
puts " Avg. Green: #{@green}"
|
19
|
+
puts " Avg. Blue: #{@blue}"
|
20
|
+
puts " Total Red: #{@red_total}"
|
21
|
+
puts " Total Green: #{@green_total}"
|
22
|
+
puts " Total Blue: #{@blue_total}"
|
23
|
+
puts '-'*22
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def on_all_pixels(image, &block)
|
29
|
+
image.width.times do |x|
|
30
|
+
image.height.times do |y|
|
31
|
+
block.call(image[x, y])
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def compute_image_summary
|
37
|
+
@red = 0
|
38
|
+
@green = 0
|
39
|
+
@blue = 0
|
40
|
+
@pixels = 0
|
41
|
+
|
42
|
+
@red_total = 0
|
43
|
+
@green_total = 0
|
44
|
+
@blue_total = 0
|
45
|
+
@brightness_total = 0
|
46
|
+
|
47
|
+
on_all_pixels(@data) do |pixel_value|
|
48
|
+
p = Pixel.new(pixel_value)
|
49
|
+
@pixels = @pixels + 1
|
50
|
+
@red = @red + p.red
|
51
|
+
@green = @green + p.green
|
52
|
+
@blue = @blue + p.blue
|
53
|
+
|
54
|
+
@red_total = @red_total + p.red / 255 * 100
|
55
|
+
@green_total = @green_total + p.green / 255 * 100
|
56
|
+
@blue_total = @blue_total = p.blue / 255 * 100
|
57
|
+
# @brightness_total = @brightness_total
|
58
|
+
end
|
59
|
+
|
60
|
+
@red = @red / @pixels
|
61
|
+
@green = @green / @pixels
|
62
|
+
@blue = @blue / @pixels
|
63
|
+
|
64
|
+
@red_total = @red_total / @pixels
|
65
|
+
@green_total = @green_total / @pixels
|
66
|
+
@blue_total = @blue_total / @pixels
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module Kracker
|
2
|
+
module Zooka
|
3
|
+
class Pixel
|
4
|
+
attr_accessor :red, :green, :blue, :alpha
|
5
|
+
|
6
|
+
def initialize(color_value)
|
7
|
+
@alpha = ChunkyPNG::Color.a(color_value)
|
8
|
+
@red = ChunkyPNG::Color.r(color_value)
|
9
|
+
@green = ChunkyPNG::Color.g(color_value)
|
10
|
+
@blue = ChunkyPNG::Color.b(color_value)
|
11
|
+
end
|
12
|
+
|
13
|
+
def brightness
|
14
|
+
0.3 * @red + 0.59 * @green + 0.11 * @blue
|
15
|
+
end
|
16
|
+
|
17
|
+
def hue
|
18
|
+
red = @red / 255.0
|
19
|
+
green = @green / 255.0
|
20
|
+
blue = @blue / 255.0
|
21
|
+
|
22
|
+
min = [red, green , blue].sort.first
|
23
|
+
max = [red, green , blue].sort.last
|
24
|
+
|
25
|
+
h = 0
|
26
|
+
d = 0
|
27
|
+
|
28
|
+
if max == min
|
29
|
+
h = 0
|
30
|
+
else
|
31
|
+
d = max - min
|
32
|
+
h = case max
|
33
|
+
when red
|
34
|
+
(green - blue) / d + (green < blue ? 6 : 0)
|
35
|
+
when green
|
36
|
+
(blue - red) / d + 2
|
37
|
+
when blue
|
38
|
+
(red - green ) / d + 4
|
39
|
+
else
|
40
|
+
0
|
41
|
+
end
|
42
|
+
|
43
|
+
h = h / 6.0
|
44
|
+
end
|
45
|
+
h
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module Kracker
|
2
|
+
module Zooka
|
3
|
+
class Tolerance
|
4
|
+
attr_accessor :red, :green, :blue, :alpha, :min_brightness, :max_brightness, :hue
|
5
|
+
|
6
|
+
def initialize
|
7
|
+
@red = 16
|
8
|
+
@green = 16
|
9
|
+
@blue = 16
|
10
|
+
@alpha = 16
|
11
|
+
@min_brightness = 16
|
12
|
+
@max_brightness = 240
|
13
|
+
@hue = 0.3
|
14
|
+
end
|
15
|
+
|
16
|
+
def color(c)
|
17
|
+
case c.downcase.to_sym
|
18
|
+
when :alpha
|
19
|
+
@alpha
|
20
|
+
when :red
|
21
|
+
@red
|
22
|
+
when :blue
|
23
|
+
@blue
|
24
|
+
when :green
|
25
|
+
@green
|
26
|
+
when :min_brightness
|
27
|
+
@min_brightness
|
28
|
+
when :hue
|
29
|
+
@hue
|
30
|
+
else
|
31
|
+
0
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
data/lib/kracker.rb
CHANGED
@@ -5,3 +5,9 @@ require 'kracker/element'
|
|
5
5
|
require 'kracker/analysis'
|
6
6
|
require 'kracker/locations'
|
7
7
|
require 'kracker/svg'
|
8
|
+
|
9
|
+
require 'kracker/zooka/analyzer'
|
10
|
+
require 'kracker/zooka/error_pixel_transform'
|
11
|
+
require 'kracker/zooka/image'
|
12
|
+
require 'kracker/zooka/pixel'
|
13
|
+
require 'kracker/zooka/tolerance'
|
@@ -10,6 +10,7 @@ class MappingTest < Kracker::SeleniumTestCase
|
|
10
10
|
same, msg = page_map_same?('kracker_index')
|
11
11
|
|
12
12
|
assert same, msg
|
13
|
+
assert_artifacts_on_same('kracker_index')
|
13
14
|
end
|
14
15
|
|
15
16
|
def test_mapping__no_master
|
@@ -19,7 +20,7 @@ class MappingTest < Kracker::SeleniumTestCase
|
|
19
20
|
assert_match 'Master file does not exist', msg, 'the missing master error message'
|
20
21
|
end
|
21
22
|
|
22
|
-
def
|
23
|
+
def test_full_mapping__one_added__clear
|
23
24
|
visit_index
|
24
25
|
|
25
26
|
map_current_page_and_save_as_master('kracker_index')
|
@@ -75,10 +76,9 @@ class MappingTest < Kracker::SeleniumTestCase
|
|
75
76
|
|
76
77
|
index_page = show_page.bless!
|
77
78
|
assert_equal 0, index_page.files.count, 'number of difference files'
|
78
|
-
|
79
79
|
end
|
80
80
|
|
81
|
-
def
|
81
|
+
def test_non_kracker_page__pass
|
82
82
|
local_page = PageObjects::Kracker::LocalIndexPage.visit
|
83
83
|
|
84
84
|
map_current_page_and_save_as_master('test_page')
|
@@ -86,6 +86,26 @@ class MappingTest < Kracker::SeleniumTestCase
|
|
86
86
|
same, msg = page_map_same?('test_page')
|
87
87
|
|
88
88
|
assert same, msg
|
89
|
+
|
90
|
+
assert_artifacts_on_same 'test_page'
|
91
|
+
end
|
92
|
+
|
93
|
+
def test_non_kracker_page__fail__size_change
|
94
|
+
local_page = PageObjects::Kracker::LocalIndexPage.visit
|
95
|
+
|
96
|
+
map_current_page_and_save_as_master('test_page')
|
97
|
+
|
98
|
+
starting_dimensions = get_current_browser_dimensions
|
99
|
+
w = starting_dimensions.width + 100
|
100
|
+
h = starting_dimensions.height
|
101
|
+
|
102
|
+
resize_browser(w, h)
|
103
|
+
|
104
|
+
same, msg = page_map_same?('test_page')
|
105
|
+
|
106
|
+
refute same, msg
|
107
|
+
|
108
|
+
assert_artifacts_on_difference 'test_page'
|
89
109
|
end
|
90
110
|
|
91
111
|
private
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'selenium_test_helper'
|
2
|
+
|
3
|
+
class ZookaTest < Kracker::SeleniumTestCase
|
4
|
+
|
5
|
+
def setup
|
6
|
+
@filename_1 = Kracker::current_filename('zooka_1').gsub('yaml', 'png')
|
7
|
+
@filename_2 = Kracker::current_filename('zooka_2').gsub('yaml', 'png')
|
8
|
+
|
9
|
+
FileUtils.rm_rf @filename_1
|
10
|
+
FileUtils.rm_rf @filename_2
|
11
|
+
super
|
12
|
+
end
|
13
|
+
|
14
|
+
def teardown
|
15
|
+
FileUtils.rm_rf @filename_1
|
16
|
+
FileUtils.rm_rf @filename_2
|
17
|
+
super
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_zooka__pass
|
21
|
+
index_page = visit_index
|
22
|
+
|
23
|
+
index_page.navigation.config!
|
24
|
+
|
25
|
+
page.driver.save_screenshot(@filename_1)
|
26
|
+
page.driver.save_screenshot(@filename_2)
|
27
|
+
|
28
|
+
image_1 = ChunkyPNG::Image.from_file(@filename_1)
|
29
|
+
image_2 = ChunkyPNG::Image.from_file(@filename_2)
|
30
|
+
|
31
|
+
analyzer = Kracker::Zooka::Analyzer.new({:image_1 => image_1, :image_2 => image_2})
|
32
|
+
analyzer.analyze
|
33
|
+
not_compliant = analyzer.noncompliant_pixels
|
34
|
+
|
35
|
+
expected = 0
|
36
|
+
|
37
|
+
assert analyzer.same?, 'images should be found to be the same'
|
38
|
+
assert_equal expected, not_compliant.count
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_zooka__fail
|
42
|
+
index_page = visit_index
|
43
|
+
|
44
|
+
index_page.navigation.config!
|
45
|
+
|
46
|
+
page.driver.save_screenshot(@filename_1)
|
47
|
+
|
48
|
+
add_centered_element('the zooka will rock you!')
|
49
|
+
page.driver.save_screenshot(@filename_2)
|
50
|
+
|
51
|
+
image_1 = ChunkyPNG::Image.from_file(@filename_1)
|
52
|
+
image_2 = ChunkyPNG::Image.from_file(@filename_2)
|
53
|
+
|
54
|
+
analyzer = Kracker::Zooka::Analyzer.new({:image_1 => image_1, :image_2 => image_2})
|
55
|
+
analyzer.analyze
|
56
|
+
not_compliant = analyzer.noncompliant_pixels
|
57
|
+
|
58
|
+
expected = ENV['TRAVIS'] ? 27200 : 26400
|
59
|
+
|
60
|
+
refute analyzer.same?, 'images should be found to be different'
|
61
|
+
assert_equal expected, not_compliant.count
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
@@ -30,6 +30,8 @@ require 'selenium-webdriver'
|
|
30
30
|
|
31
31
|
require 'page_objects'
|
32
32
|
|
33
|
+
require 'chunky_png'
|
34
|
+
|
33
35
|
test_objects_location = File.expand_path('../test_objects/*', __FILE__)
|
34
36
|
Dir[test_objects_location].each { |f| require f }
|
35
37
|
|
@@ -48,12 +50,23 @@ module Kracker
|
|
48
50
|
|
49
51
|
def setup
|
50
52
|
delete_contents_from_kracker_locations
|
53
|
+
initialize_browser_size_for_test
|
51
54
|
end
|
52
55
|
|
53
56
|
def teardown
|
54
57
|
delete_contents_from_kracker_locations
|
55
58
|
end
|
56
59
|
|
60
|
+
def initialize_browser_size_for_test
|
61
|
+
@browser_dimensions = ENV['BROWSER_SIZE'] || '960x1000'
|
62
|
+
if @browser_dimensions
|
63
|
+
@starting_dimensions = get_current_browser_dimensions
|
64
|
+
w = @browser_dimensions.split('x')[0]
|
65
|
+
h = @browser_dimensions.split('x')[1]
|
66
|
+
resize_browser(w, h)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
57
70
|
def visit_index
|
58
71
|
PageObjects::Kracker::IndexPage.visit
|
59
72
|
end
|
@@ -84,6 +97,14 @@ module Kracker
|
|
84
97
|
page.driver.browser.execute_script(js)
|
85
98
|
end
|
86
99
|
|
100
|
+
def resize_browser(width, height)
|
101
|
+
page.driver.browser.manage.window.resize_to(width.to_i, height.to_i)
|
102
|
+
end
|
103
|
+
|
104
|
+
def get_current_browser_dimensions
|
105
|
+
page.driver.browser.manage.window.size
|
106
|
+
end
|
107
|
+
|
87
108
|
def assert_artifacts_on_difference(test_root)
|
88
109
|
filename = Kracker.diff_filename(test_root)
|
89
110
|
assert File.exists?(filename), "Diff file should exist: #{filename}"
|
@@ -96,7 +117,33 @@ module Kracker
|
|
96
117
|
|
97
118
|
filename = File.join(Kracker.diff_file_location, "#{test_root}__master_not_current__diff.yaml")
|
98
119
|
assert File.exists?(filename), "Master, not current, file should exist: #{filename}"
|
120
|
+
|
121
|
+
filename = Kracker.master_filename(test_root)
|
122
|
+
assert File.exists?(filename), "Master file should exist: #{filename}"
|
123
|
+
|
124
|
+
filename = Kracker.current_filename(test_root)
|
125
|
+
assert File.exists?(filename), "Current file should exist: #{filename}"
|
126
|
+
end
|
127
|
+
|
128
|
+
def assert_artifacts_on_same(test_root)
|
129
|
+
filename = Kracker.diff_filename(test_root)
|
130
|
+
refute File.exists?(filename), "No diff file should exist: #{filename}"
|
131
|
+
|
132
|
+
filename = File.join(Kracker.diff_file_location, "#{test_root}__changed_master__diff.yaml")
|
133
|
+
refute File.exists?(filename), "No changed master file should exist: #{filename}"
|
134
|
+
|
135
|
+
filename = File.join(Kracker.diff_file_location, "#{test_root}__current_not_master__diff.yaml")
|
136
|
+
refute File.exists?(filename), "No current, not master, file should exist: #{filename}"
|
137
|
+
|
138
|
+
filename = File.join(Kracker.diff_file_location, "#{test_root}__master_not_current__diff.yaml")
|
139
|
+
refute File.exists?(filename), "No master, not current, file should exist: #{filename}"
|
140
|
+
|
141
|
+
filename = Kracker.master_filename(test_root)
|
142
|
+
assert File.exists?(filename), "Master file should exist: #{filename}"
|
143
|
+
|
144
|
+
filename = Kracker.current_filename(test_root)
|
145
|
+
refute File.exists?(filename), "No current file should exist: #{filename}"
|
99
146
|
end
|
100
147
|
|
101
148
|
end
|
102
|
-
end
|
149
|
+
end
|
data/test/test_helper.rb
CHANGED
@@ -31,11 +31,13 @@ Dir[test_objects_location].each { |f| require f }
|
|
31
31
|
test_helper_location = File.expand_path('../test_helpers/**/*.rb', __FILE__)
|
32
32
|
Dir[test_helper_location].each { |f| require f }
|
33
33
|
|
34
|
+
|
34
35
|
module Kracker
|
35
36
|
class KrackerTestCase < Minitest::Test
|
37
|
+
|
36
38
|
include Kracker
|
37
39
|
include Kracker::TestObjects
|
38
40
|
include Kracker::TestHelpers::Location
|
39
41
|
|
40
42
|
end
|
41
|
-
end
|
43
|
+
end
|