free_mutant/spec/support/warning.rb
2018-09-12 13:15:43 +00:00

66 lines
1.4 KiB
Ruby

# frozen_string_literal: true
require 'yaml'
require 'equalizer'
require 'memoizable'
require 'ice_nine'
module MutantSpec
class Warning
def self.assert_no_warnings
return if EXTRACTOR.warnings.empty?
fail UnexpectedWarnings, EXTRACTOR.warnings.to_a
end
class UnexpectedWarnings < StandardError
MSG = 'Unexpected warnings: %s'.freeze
def initialize(warnings)
super(MSG % warnings.join("\n"))
end
end
class Extractor < DelegateClass(IO)
PATTERN = /\A(?:.+):(?:\d+): warning: (?:.+)\n\z/.freeze
include Equalizer.new(:whitelist, :seen, :io), Memoizable
def initialize(io, whitelist)
@whitelist = whitelist
@seen = Set.new
@io = io
super(io)
end
def write(message)
return super if PATTERN !~ message
add(message.chomp)
self
end
def warnings
seen.dup
end
memoize :warnings
private
def add(warning)
return if whitelist.any?(&warning.public_method(:end_with?))
seen << warning
end
attr_reader :whitelist, :seen, :io
end
warnings = Pathname.new(__dir__).join('warnings.yml').freeze
whitelist = IceNine.deep_freeze(YAML.load(warnings.read)) # rubocop:disable Security/YAMLLoad
EXTRACTOR = Extractor.new(STDERR, whitelist)
end
end