require 'set' require 'spectus' require_relative 'db' require_relative 'subject' module Fix class Expectation include Spectus::DSL attr_reader :priority def initialize object, positive, definition, *args @positive = positive @definition = definition @args = args @priority = DB.instance.random.rand freeze DB.instance.update(object => SortedSet[]) unless DB.instance.key? object DB.instance.fetch(object).add self end def <=> other self.priority <=> other.priority end private def exception result result unless [ true, false ].include? result end def negated? !@positive end def presenter result, got, subject { pass: pass(result, subject), negated: negated?, definition: @definition, exception: exception(result), got: got } end def meta subject { level: level, params: subject.params, challenge: subject.challenge, last_arg: subject.last_arg } end def target negated? ? :not_to : :to end end end