class UnitDiff
def parse_input(input, output)
def parse_input(input, output) current = [] data = [] data << current print_lines = true term = "\nFinished".split(//).map { |c| c[0] } term_length = term.size old_sync = output.sync output.sync = true while line = input.gets case line when /^(Loaded suite|Started)/ then print_lines = true output.puts line chars = [] while c = input.getc do output.putc c chars << c tail = chars[-term_length..-1] break if chars.size >= term_length and tail == term end output.puts input.gets # the rest of "Finished in..." output.puts next when /^\s*$/, /^\(?\s*\d+\) (Failure|Error):/, /^\d+\)/ then print_lines = false current = [] data << current when /^Finished in \d/ then print_lines = false end output.puts line if print_lines current << line end output.sync = old_sync data = data.reject { |o| o == ["\n"] or o.empty? } footer = data.pop data.map do |result| break if result.find do |result_line| result_line =~ / expected( but was|, not)/ end header = result.find do |result_line| result_line =~ /^\(?\s*\d+\) (Failure|Error):/ end break unless header message_index = result.index(header) + 2 result[message_index..-1] = result[message_index..-1].join end return data, footer end