# File lib/unit_diff.rb, line 121
  def parse_diff(result)
    header = []
    expect = []
    butwas = []
    footer = []
    state = :header

    until result.empty? do
      case state
      when :header then
        header << result.shift
        state = :expect if result.first =~ /^<|^Expected/
      when :expect then
        case result.first
        when /^Expected (.*?) to equal (.*?):$/ then
          expect << $1
          butwas << $2
          state = :footer
          result.shift
        when /^Expected (.*?), not (.*)$/m then
          expect << $1
          butwas << $2
          state = :footer
          result.shift
        when /^Expected (.*?)$/ then
          expect << "#{$1}\n"
          result.shift
        when /^to equal / then
          state = :spec_butwas
          bw = result.shift.sub(/^to equal (.*):?$/, '\1')
          butwas << bw
        else
          state = :butwas if result.first.sub!(/ expected( but was|, not)/, '')
          expect << result.shift
        end
      when :butwas then
        butwas = result[0..-1]
        result.clear
      when :spec_butwas then
        if result.first =~ /^\s+\S+ at |^:\s*$/
          state = :footer
        else
          butwas << result.shift
        end
      when :footer then
        butwas.last.sub!(/:$/, '')
        footer = result.map {|l| l.chomp }
        result.clear
      else
        raise "unknown state #{state}"
      end
    end

    return header, expect, nil, footer if butwas.empty?

    expect.last.chomp!
    expect.first.sub!(/^<\"/, '')
    expect.last.sub!(/\">$/, '')

    butwas.last.chomp!
    butwas.last.chop! if butwas.last =~ /\.$/
    butwas.first.sub!( /^<\"/, '')
    butwas.last.sub!(/\">$/, '')

    return header, expect, butwas, footer
  end