Class: ImageDiff

Inherits:
Object
  • Object
show all
Defined in:
lib/image_comparable/image_diff.rb

Instance Method Summary collapse

Constructor Details

#initialize(baseline, screenshot, acceptant_criteria) ⇒ ImageDiff

Returns a new instance of ImageDiff.



3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# File 'lib/image_comparable/image_diff.rb', line 3

def initialize(baseline, screenshot, acceptant_criteria)
  @baseline   = baseline.image
  @screenshot = screenshot.image

  @diff = []
  @baseline.height.times do |y|
    @baseline.row(y).each_with_index do |pixel, x|
      @diff << [x, y] unless pixel == @screenshot[x, y]
    end
  end

  @x                  = @diff.map { |xy| xy[0] }
  @y                  = @diff.map { |xy| xy[1] }
  @acceptant_criteria = acceptant_criteria

end

Instance Method Details

#calculate_score(diff, screenshot, acceptant_criteria) ⇒ Object



27
28
29
30
31
32
33
34
35
36
# File 'lib/image_comparable/image_diff.rb', line 27

def calculate_score(diff, screenshot, acceptant_criteria)
  raise 'Acceptant criteria cannot be null' if acceptant_criteria.nil?

  acceptant_criteria = acceptant_criteria.to_f
  result             = (diff.length.to_f / screenshot.pixels.length) * 100

  return unless result > acceptant_criteria
  raise "The score result: #{result}%, is minor then " \
          "acceptant_criteria: #{acceptant_criteria}%"
end

#drawObject



38
39
40
# File 'lib/image_comparable/image_diff.rb', line 38

def draw
  @screenshot.rect(@x.min, @y.min, @x.max, @y.max, ChunkyPNG::Color::BLACK)
end

#file_nameObject



46
47
48
# File 'lib/image_comparable/image_diff.rb', line 46

def file_name
  "#{Time.now.strftime('%Y%m%d')}_diff.png"
end

#pathObject



42
43
44
# File 'lib/image_comparable/image_diff.rb', line 42

def path
  @path ||= File.join(FileUtils.pwd, 'diff_images')
end

#saveObject



20
21
22
23
24
25
# File 'lib/image_comparable/image_diff.rb', line 20

def save
  Dir.mkdir(path) unless Dir.exist?(path)

  draw.save(File.join(path, file_name))
  calculate_score(@diff, @screenshot, @acceptant_criteria)
end