require 'ceedling/plugin' require 'ceedling/constants' class XmlTestsReport < Plugin def setup @results_list = {} @test_counter = 0 end def post_test_fixture_execute(arg_hash) context = arg_hash[:context] @results_list[context] = [] if @results_list[context].nil? @results_list[context] << arg_hash[:result_file] end def post_build @results_list.each_key do |context| results = @ceedling[:plugin_reportinator].assemble_test_results(@results_list[context]) file_path = File.join(PROJECT_BUILD_ARTIFACTS_ROOT, context.to_s, 'report.xml') @ceedling[:file_wrapper].open(file_path, 'w') do |f| @test_counter = 1 write_results(results, f) end end end private def write_results(results, stream) write_header(stream) write_failures(results[:failures], stream) write_tests(results[:successes], stream, 'SuccessfulTests') write_tests(results[:ignores], stream, 'IgnoredTests') write_statistics(results[:counts], stream) write_footer(stream) end def write_header(stream) stream.puts "" stream.puts '' end def write_failures(results, stream) if results.size.zero? stream.puts "\t" return end stream.puts "\t" results.each do |result| result[:collection].each do |item| filename = File.join(result[:source][:path], result[:source][:file]) stream.puts "\t\t" stream.puts "\t\t\t#{filename}::#{item[:test]}" stream.puts "\t\t\tAssertion" stream.puts "\t\t\t" stream.puts "\t\t\t\t#{filename}" stream.puts "\t\t\t\t#{item[:line]}" stream.puts "\t\t\t" stream.puts "\t\t\t#{item[:message]}" stream.puts "\t\t" @test_counter += 1 end end stream.puts "\t" end def write_tests(results, stream, tag) if results.size.zero? stream.puts "\t<#{tag}/>" return end stream.puts "\t<#{tag}>" results.each do |result| result[:collection].each do |item| stream.puts "\t\t" stream.puts "\t\t\t#{File.join(result[:source][:path], result[:source][:file])}::#{item[:test]}" stream.puts "\t\t" @test_counter += 1 end end stream.puts "\t" end def write_statistics(counts, stream) stream.puts "\t" stream.puts "\t\t#{counts[:total]}" stream.puts "\t\t#{counts[:ignored]}" stream.puts "\t\t#{counts[:failed]}" stream.puts "\t\t0" stream.puts "\t\t#{counts[:failed]}" stream.puts "\t" end def write_footer(stream) stream.puts '' end end