# =========================================================================
# Ceedling - Test-Centered Build System for C
# ThrowTheSwitch.org
# Copyright (c) 2010-25 Mike Karlesky, Mark VanderVoord, & Greg Williams
# SPDX-License-Identifier: MIT
# =========================================================================
require 'tests_reporter'
class HtmlTestsReporter < TestsReporter
def setup()
super( default_filename: 'tests_report.html' )
end
# HTML header
def header(results:, stream:)
stream.puts ""
stream.puts ''
stream.puts '
'
stream.puts ''
stream.puts ''
stream.puts ''
stream.puts 'Test Overview'
stream.puts ''
stream.puts ''
stream.puts ''
end
# CppUnit XML test list contents
def body(results:, stream:)
write_statistics( results[:counts], stream)
write_failures( results[:failures], stream)
write_tests( results[:ignores], stream, "Ignored Tests", "ignored" )
write_tests( results[:successes], stream, "Success Tests", "success" )
end
# HTML footer
def footer(results:, stream:)
stream.puts ''
stream.puts ''
end
### Private
private
def write_statistics(counts, stream)
stream.puts 'Summary
'
stream.puts ''
stream.puts 'Total | Passed | Ignored | Failed |
'
stream.puts ''
stream.puts ""
stream.puts "#{counts[:total]} | "
stream.puts "#{counts[:total] - counts[:ignored] - counts[:failed]} | "
stream.puts "#{counts[:ignored]} | "
stream.puts "#{counts[:failed]} | "
stream.puts "
"
stream.puts ""
stream.puts "
"
end
def write_failures(results, stream)
return if results.size.zero?
stream.puts 'Failed Tests
'
stream.puts ''
stream.puts 'File | Location | Message |
'
stream.puts ''
results.each do |result|
filename = result[:source][:file]
@first_row = true
result[:collection].each do |item|
stream.puts ""
if @first_row
stream.puts "#{filename} | "
@first_row = false
end
stream.puts "#{item[:test]}::#{item[:line]} | "
if item[:message].empty?
stream.puts "— | "
else
if item[:message].size > 150
stream.puts "Message hidden due to long length.#{item[:message]} | "
else
stream.puts "#{item[:message]} | "
end
end
stream.puts "
"
end
end
stream.puts ""
stream.puts "
"
end
def write_tests(results, stream, title, style)
return if results.size.zero?
stream.puts "#{title}
"
stream.puts ""
stream.puts 'File | Name | Message |
'
stream.puts ''
results.each do |result|
filename = result[:source][:file]
@first_row = true
result[:collection].each do |item|
stream.puts ""
if @first_row
stream.puts "#{filename} | "
@first_row = false
end
stream.puts "#{item[:test]} | "
if item[:message].empty?
stream.puts "— | "
else
if item[:message].size > 150
stream.puts "Message hidden due to long length.#{item[:message]} | "
else
stream.puts "#{item[:message]} | "
end
end
stream.puts "
"
end
end
stream.puts ""
stream.puts "
"
end
end