def run(situation)
      @expectings << situation.evaluate(&@expectation_block) if @expectation_block
      actual = situation.evaluate(&definition)
      assert((@macro.expects_exception? ? nil : actual), *@expectings)
    rescue Exception => e
      @macro.expects_exception? ? assert(e, *@expectings) : @macro.error(e)
    end
def run(situation)
      @expectings << situation.evaluate(&@expectation_block) if @expectation_block
      actual = situation.evaluate(&definition)
      assert((@macro.expects_exception? ? nil : actual), *@expectings)
    rescue Exception => e
      @macro.expects_exception? ? assert(e, *@expectings) : @macro.error(e)
    end
Setups a new Assertion. By default, the assertion will be a "positive" one, which means +evaluate+ will
 be call on the associated assertion macro. If +negative+ is true, +devaluate+ will be called instead.
 Not providing a definition block is just kind of silly since it's used to generate the +actual+ value
 for evaluation by a macro.

 @param [String] definition A small description of what this assertion is testing
 @param [Boolean] negative Determines whether this is a positive or negative assertion
 @param [lambda] definition The block that will return the +actual+ value when eval'ed
 Given a {Riot::Situation}, execute the assertion definition provided to this Assertion, hand off to an
 assertion macro for evaluation, and then return a status tuple. If the macro to be used expects any
 exception, catch the exception and send to the macro; else just return it back.

 Currently supporting 3 evaluation states: :pass, :fail, and :error

 @param [Riot::Situation] situation An instance of a {Riot::Situation}
 @return [Array<Symbol, String>] array containing evaluation state and a descriptive explanation