class ImageAssertion

Constants

DIFF_IMAGE_FOLDER_NAME
MAX_ALLOWED_DIFF_VALUE

Public Class Methods

assert_image(test_output, ref_images_path, image_name, threshold) click to toggle source
# File lib/ui-auto-monkey/tuneup/image_assertion.rb, line 9
def self.assert_image(test_output, ref_images_path, image_name, threshold)
  return false unless (test_output && ref_images_path && image_name)

  diff_images_path  = File.join(test_output, DIFF_IMAGE_FOLDER_NAME)
  Dir.mkdir(diff_images_path) unless File.directory?(diff_images_path)

  image_file_name   = image_name + '.png'
  expected_path     = File.join(ref_images_path, image_file_name)
  diff_path         = File.join(diff_images_path, image_file_name)

  run_folder_name   = find_last_folder(test_output)
  received_path     = File.join(run_folder_name, image_file_name)

  print_status(create_status('started', "Asserting #{image_file_name}."))

  if !File.exists?(received_path)
    error = "No captured image file found at #{received_path}"
    print_status(create_status('failed', error))
    return false
  elsif !File.exists?(expected_path)
    error = "No reference image file found at #{expected_path}"
    print_status(create_status('failed', error))
    return false
  else
    result, exit_status = im_compare(expected_path, received_path, diff_path)
    if exit_status == 0
      return process_imagemagick_result(image_file_name, result, threshold)
    elsif exit_status == 1
      print_status(create_status('failed', "Images differ, check #{diff_images_path} for details. ImageMagick error: #{result}"))
    else
      print_status(create_status('failed', "ImageMagick comparison failed: #{result}"))
    end
  end
end

Private Class Methods

create_status(status, message) click to toggle source
# File lib/ui-auto-monkey/tuneup/image_assertion.rb, line 85
def self.create_status(status, message)
  "#{Time.new} #{status}: #{message}"
end
find_last_folder(test_output) click to toggle source

Iterte through folders with name Run* and return with latests run number

# File lib/ui-auto-monkey/tuneup/image_assertion.rb, line 47
def self.find_last_folder(test_output)
  folder_mask = "#{test_output}/Run";
  run_folders = Dir.glob("#{folder_mask}*")

  return nil unless run_folders.length > 0

  run_folders.sort do |x, y|
    y.gsub(folder_mask, '').to_i <=> x.gsub(folder_mask, '').to_i
  end[0]
end
im_compare(expected_path, received_path, diff_path) click to toggle source
# File lib/ui-auto-monkey/tuneup/image_assertion.rb, line 93
def self.im_compare(expected_path, received_path, diff_path)
  command = '/usr/local/bin/compare -metric MAE '
  command << Shellwords.escape(expected_path) + ' '
  command << Shellwords.escape(received_path) + ' '
  command << ( diff_path ? Shellwords.escape(diff_path) : 'null:' )

  _, _, stderr, wait_thr = Open3.popen3(command)
  [stderr.read, wait_thr.value.exitstatus]
end
print_status(message) click to toggle source
process_imagemagick_result(image_file_name, result, threshold) click to toggle source
# File lib/ui-auto-monkey/tuneup/image_assertion.rb, line 58
def self.process_imagemagick_result(image_file_name, result, threshold)
  result_status   = 'failed'
  result_message  = "#{image_file_name} is not equal to the reference."
  assertionResult = false

  #imagemagick outputs floating point metrics value when succeeds
  compare_succeed = ( result.match(/[0-9]*\.?[0-9]+/).length > 0 )
  threshold ||= MAX_ALLOWED_DIFF_VALUE

  if compare_succeed
    if result.to_f < threshold

      result_status   = 'passed'
      result_message  = "#{image_file_name} asserted successfully."
      assertionResult = true
    else
      print_status(create_status(result_status, "expected diff is smaller than #{threshold} but #{result.to_f}."))
    end
  else

    result_message    = result
  end

  print_status(create_status(result_status, result_message))
  assertionResult
end