Add JSON reporter (#2706)

Co-authored-by: Martin Hořeňovský <martin.horenovsky@gmail.com>
This commit is contained in:
Beartama 2023-11-14 23:52:15 +02:00 committed by GitHub
parent 2c68a0d05f
commit 7bf136b501
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
29 changed files with 2484 additions and 21 deletions

View File

@ -93,6 +93,7 @@ set(IMPL_HEADERS
${SOURCES_DIR}/internal/catch_getenv.hpp ${SOURCES_DIR}/internal/catch_getenv.hpp
${SOURCES_DIR}/internal/catch_istream.hpp ${SOURCES_DIR}/internal/catch_istream.hpp
${SOURCES_DIR}/internal/catch_is_permutation.hpp ${SOURCES_DIR}/internal/catch_is_permutation.hpp
${SOURCES_DIR}/internal/catch_jsonwriter.hpp
${SOURCES_DIR}/internal/catch_lazy_expr.hpp ${SOURCES_DIR}/internal/catch_lazy_expr.hpp
${SOURCES_DIR}/internal/catch_leak_detector.hpp ${SOURCES_DIR}/internal/catch_leak_detector.hpp
${SOURCES_DIR}/internal/catch_list.hpp ${SOURCES_DIR}/internal/catch_list.hpp
@ -177,6 +178,7 @@ set(IMPL_SOURCES
${SOURCES_DIR}/internal/catch_floating_point_helpers.cpp ${SOURCES_DIR}/internal/catch_floating_point_helpers.cpp
${SOURCES_DIR}/internal/catch_getenv.cpp ${SOURCES_DIR}/internal/catch_getenv.cpp
${SOURCES_DIR}/internal/catch_istream.cpp ${SOURCES_DIR}/internal/catch_istream.cpp
${SOURCES_DIR}/internal/catch_jsonwriter.cpp
${SOURCES_DIR}/internal/catch_lazy_expr.cpp ${SOURCES_DIR}/internal/catch_lazy_expr.cpp
${SOURCES_DIR}/internal/catch_leak_detector.cpp ${SOURCES_DIR}/internal/catch_leak_detector.cpp
${SOURCES_DIR}/internal/catch_list.cpp ${SOURCES_DIR}/internal/catch_list.cpp
@ -289,6 +291,7 @@ set(REPORTER_HEADERS
${SOURCES_DIR}/reporters/catch_reporter_cumulative_base.hpp ${SOURCES_DIR}/reporters/catch_reporter_cumulative_base.hpp
${SOURCES_DIR}/reporters/catch_reporter_event_listener.hpp ${SOURCES_DIR}/reporters/catch_reporter_event_listener.hpp
${SOURCES_DIR}/reporters/catch_reporter_helpers.hpp ${SOURCES_DIR}/reporters/catch_reporter_helpers.hpp
${SOURCES_DIR}/reporters/catch_reporter_json.hpp
${SOURCES_DIR}/reporters/catch_reporter_junit.hpp ${SOURCES_DIR}/reporters/catch_reporter_junit.hpp
${SOURCES_DIR}/reporters/catch_reporter_multi.hpp ${SOURCES_DIR}/reporters/catch_reporter_multi.hpp
${SOURCES_DIR}/reporters/catch_reporter_registrars.hpp ${SOURCES_DIR}/reporters/catch_reporter_registrars.hpp
@ -307,6 +310,7 @@ set(REPORTER_SOURCES
${SOURCES_DIR}/reporters/catch_reporter_cumulative_base.cpp ${SOURCES_DIR}/reporters/catch_reporter_cumulative_base.cpp
${SOURCES_DIR}/reporters/catch_reporter_event_listener.cpp ${SOURCES_DIR}/reporters/catch_reporter_event_listener.cpp
${SOURCES_DIR}/reporters/catch_reporter_helpers.cpp ${SOURCES_DIR}/reporters/catch_reporter_helpers.cpp
${SOURCES_DIR}/reporters/catch_reporter_json.cpp
${SOURCES_DIR}/reporters/catch_reporter_junit.cpp ${SOURCES_DIR}/reporters/catch_reporter_junit.cpp
${SOURCES_DIR}/reporters/catch_reporter_multi.cpp ${SOURCES_DIR}/reporters/catch_reporter_multi.cpp
${SOURCES_DIR}/reporters/catch_reporter_registrars.cpp ${SOURCES_DIR}/reporters/catch_reporter_registrars.cpp

View File

@ -74,6 +74,7 @@
#include <catch2/internal/catch_getenv.hpp> #include <catch2/internal/catch_getenv.hpp>
#include <catch2/internal/catch_is_permutation.hpp> #include <catch2/internal/catch_is_permutation.hpp>
#include <catch2/internal/catch_istream.hpp> #include <catch2/internal/catch_istream.hpp>
#include <catch2/internal/catch_jsonwriter.hpp>
#include <catch2/internal/catch_lazy_expr.hpp> #include <catch2/internal/catch_lazy_expr.hpp>
#include <catch2/internal/catch_leak_detector.hpp> #include <catch2/internal/catch_leak_detector.hpp>
#include <catch2/internal/catch_list.hpp> #include <catch2/internal/catch_list.hpp>

View File

@ -0,0 +1,115 @@
// Copyright Catch2 Authors
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE.txt or copy at
// https://www.boost.org/LICENSE_1_0.txt)
// SPDX-License-Identifier: BSL-1.0
#include <catch2/internal/catch_enforce.hpp>
#include <catch2/internal/catch_jsonwriter.hpp>
namespace Catch {
void JsonUtils::indent( std::ostream& os, std::uint64_t level ) {
for ( std::uint64_t i = 0; i < level; ++i ) {
os << " ";
}
}
void JsonUtils::appendCommaNewline( std::ostream& os,
bool& should_comma,
std::uint64_t level ) {
if ( should_comma ) { os << ','; }
should_comma = true;
os << '\n';
indent( os, level );
}
JsonObjectWriter::JsonObjectWriter( std::ostream& os ):
JsonObjectWriter{ os, 0 } {}
JsonObjectWriter::JsonObjectWriter( std::ostream& os,
std::uint64_t indent_level ):
m_os{ os }, m_indent_level{ indent_level } {
m_os << "{";
}
JsonObjectWriter::JsonObjectWriter( JsonObjectWriter&& source ):
m_os{ source.m_os },
m_indent_level{ source.m_indent_level },
m_should_comma{ source.m_should_comma },
m_active{ source.m_active } {
source.m_active = false;
}
JsonObjectWriter::~JsonObjectWriter() {
if ( !m_active ) { return; }
m_os << '\n';
JsonUtils::indent( m_os, m_indent_level );
m_os << '}';
}
JsonValueWriter JsonObjectWriter::write( std::string const& key ) {
JsonUtils::appendCommaNewline(
m_os, m_should_comma, m_indent_level + 1 );
m_os << '"' << key << '"' << ": ";
return JsonValueWriter{ m_os, m_indent_level + 1 };
}
JsonArrayWriter::JsonArrayWriter( std::ostream& os ):
JsonArrayWriter{ os, 0 } {}
JsonArrayWriter::JsonArrayWriter( std::ostream& os,
std::uint64_t indent_level ):
m_os{ os }, m_indent_level{ indent_level } {
m_os << "[";
}
JsonArrayWriter::JsonArrayWriter( JsonArrayWriter&& source ):
m_os{ source.m_os },
m_indent_level{ source.m_indent_level },
m_should_comma{ source.m_should_comma },
m_active{ source.m_active } {
source.m_active = false;
}
JsonArrayWriter::~JsonArrayWriter() {
if ( !m_active ) { return; }
m_os << '\n';
JsonUtils::indent( m_os, m_indent_level );
m_os << ']';
}
JsonObjectWriter JsonArrayWriter::writeObject() {
JsonUtils::appendCommaNewline(
m_os, m_should_comma, m_indent_level + 1 );
return JsonObjectWriter{ m_os, m_indent_level + 1 };
}
JsonArrayWriter JsonArrayWriter::writeArray() {
JsonUtils::appendCommaNewline(
m_os, m_should_comma, m_indent_level + 1 );
return JsonArrayWriter{ m_os, m_indent_level + 1 };
}
JsonArrayWriter& JsonArrayWriter::write( bool value ) {
return writeImpl( value );
}
JsonValueWriter::JsonValueWriter( std::ostream& os ):
JsonValueWriter{ os, 0 } {}
JsonValueWriter::JsonValueWriter( std::ostream& os,
std::uint64_t indent_level ):
m_os{ os }, m_indent_level{ indent_level } {}
JsonObjectWriter JsonValueWriter::writeObject() && {
return JsonObjectWriter{ m_os, m_indent_level };
}
JsonArrayWriter JsonValueWriter::writeArray() && {
return JsonArrayWriter{ m_os, m_indent_level };
}
void JsonValueWriter::write( bool value ) && {
writeImpl( value ? "true" : "false", false );
}
} // namespace Catch

View File

@ -0,0 +1,123 @@
// Copyright Catch2 Authors
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE.txt or copy at
// https://www.boost.org/LICENSE_1_0.txt)
// SPDX-License-Identifier: BSL-1.0
#ifndef CATCH_JSONWRITER_HPP_INCLUDED
#define CATCH_JSONWRITER_HPP_INCLUDED
#include <catch2/internal/catch_reusable_string_stream.hpp>
#include <catch2/internal/catch_stringref.hpp>
#include <cstdint>
#include <sstream>
namespace Catch {
class JsonObjectWriter;
class JsonArrayWriter;
struct JsonUtils {
static void indent( std::ostream& os, std::uint64_t level );
static void appendCommaNewline( std::ostream& os,
bool& should_comma,
std::uint64_t level );
};
class JsonValueWriter {
public:
JsonValueWriter( std::ostream& os );
JsonValueWriter( std::ostream& os, std::uint64_t indent_level );
JsonObjectWriter writeObject() &&;
JsonArrayWriter writeArray() &&;
template <typename T>
void write( T const& value ) && {
writeImpl( value, !std::is_arithmetic<T>::value );
}
void write( bool value ) &&;
private:
template <typename T>
void writeImpl( T const& value, bool quote_value ) {
if ( quote_value ) { m_os << '"'; }
m_sstream << value;
while ( true ) {
char c = m_sstream.get();
if ( m_sstream.eof() ) { break; }
if ( c == '"' ) {
m_os << '\\' << '"';
} else {
m_os << c;
}
}
if ( quote_value ) { m_os << '"'; }
}
std::ostream& m_os;
std::stringstream m_sstream{};
std::uint64_t m_indent_level;
};
class JsonObjectWriter {
public:
JsonObjectWriter( std::ostream& os );
JsonObjectWriter( std::ostream& os, std::uint64_t indent_level );
JsonObjectWriter( JsonObjectWriter&& source );
JsonObjectWriter& operator=( JsonObjectWriter&& source ) = delete;
~JsonObjectWriter();
JsonValueWriter write( std::string const& key );
private:
std::ostream& m_os;
std::uint64_t m_indent_level;
bool m_should_comma = false;
bool m_active = true;
};
class JsonArrayWriter {
public:
JsonArrayWriter( std::ostream& os );
JsonArrayWriter( std::ostream& os, std::uint64_t indent_level );
JsonArrayWriter( JsonArrayWriter&& source );
JsonArrayWriter& operator=( JsonArrayWriter&& source ) = delete;
~JsonArrayWriter();
JsonObjectWriter writeObject();
JsonArrayWriter writeArray();
template <typename T>
JsonArrayWriter& write( T const& value ) {
return writeImpl( value );
}
JsonArrayWriter& write( bool value );
private:
template <typename T>
JsonArrayWriter& writeImpl( T const& value ) {
JsonUtils::appendCommaNewline(
m_os, m_should_comma, m_indent_level + 1 );
JsonValueWriter{ m_os }.write( value );
return *this;
}
std::ostream& m_os;
std::uint64_t m_indent_level;
bool m_should_comma = false;
bool m_active = true;
};
} // namespace Catch
#endif // CATCH_JSONWRITER_HPP_INCLUDED

View File

@ -6,13 +6,14 @@
// SPDX-License-Identifier: BSL-1.0 // SPDX-License-Identifier: BSL-1.0
#include <catch2/internal/catch_reporter_registry.hpp>
#include <catch2/interfaces/catch_interfaces_reporter_factory.hpp> #include <catch2/interfaces/catch_interfaces_reporter_factory.hpp>
#include <catch2/internal/catch_enforce.hpp> #include <catch2/internal/catch_enforce.hpp>
#include <catch2/internal/catch_move_and_forward.hpp> #include <catch2/internal/catch_move_and_forward.hpp>
#include <catch2/internal/catch_reporter_registry.hpp>
#include <catch2/reporters/catch_reporter_automake.hpp> #include <catch2/reporters/catch_reporter_automake.hpp>
#include <catch2/reporters/catch_reporter_compact.hpp> #include <catch2/reporters/catch_reporter_compact.hpp>
#include <catch2/reporters/catch_reporter_console.hpp> #include <catch2/reporters/catch_reporter_console.hpp>
#include <catch2/reporters/catch_reporter_json.hpp>
#include <catch2/reporters/catch_reporter_junit.hpp> #include <catch2/reporters/catch_reporter_junit.hpp>
#include <catch2/reporters/catch_reporter_registrars.hpp> #include <catch2/reporters/catch_reporter_registrars.hpp>
#include <catch2/reporters/catch_reporter_sonarqube.hpp> #include <catch2/reporters/catch_reporter_sonarqube.hpp>
@ -47,6 +48,8 @@ namespace Catch {
Detail::make_unique<ReporterFactory<TeamCityReporter>>(); Detail::make_unique<ReporterFactory<TeamCityReporter>>();
m_impl->factories["XML"] = m_impl->factories["XML"] =
Detail::make_unique<ReporterFactory<XmlReporter>>(); Detail::make_unique<ReporterFactory<XmlReporter>>();
m_impl->factories["JSON"] =
Detail::make_unique<ReporterFactory<JsonReporter>>();
} }
ReporterRegistry::~ReporterRegistry() = default; ReporterRegistry::~ReporterRegistry() = default;

View File

@ -98,6 +98,7 @@ internal_headers = [
'internal/catch_getenv.hpp', 'internal/catch_getenv.hpp',
'internal/catch_istream.hpp', 'internal/catch_istream.hpp',
'internal/catch_is_permutation.hpp', 'internal/catch_is_permutation.hpp',
'internal/catch_jsonwriter.hpp',
'internal/catch_lazy_expr.hpp', 'internal/catch_lazy_expr.hpp',
'internal/catch_leak_detector.hpp', 'internal/catch_leak_detector.hpp',
'internal/catch_list.hpp', 'internal/catch_list.hpp',
@ -214,6 +215,7 @@ internal_sources = files(
'internal/catch_floating_point_helpers.cpp', 'internal/catch_floating_point_helpers.cpp',
'internal/catch_getenv.cpp', 'internal/catch_getenv.cpp',
'internal/catch_istream.cpp', 'internal/catch_istream.cpp',
'internal/catch_jsonwriter.cpp',
'internal/catch_lazy_expr.cpp', 'internal/catch_lazy_expr.cpp',
'internal/catch_leak_detector.cpp', 'internal/catch_leak_detector.cpp',
'internal/catch_list.cpp', 'internal/catch_list.cpp',
@ -280,6 +282,7 @@ reporter_headers = [
'reporters/catch_reporter_cumulative_base.hpp', 'reporters/catch_reporter_cumulative_base.hpp',
'reporters/catch_reporter_event_listener.hpp', 'reporters/catch_reporter_event_listener.hpp',
'reporters/catch_reporter_helpers.hpp', 'reporters/catch_reporter_helpers.hpp',
'reporters/catch_reporter_json.hpp',
'reporters/catch_reporter_junit.hpp', 'reporters/catch_reporter_junit.hpp',
'reporters/catch_reporter_multi.hpp', 'reporters/catch_reporter_multi.hpp',
'reporters/catch_reporter_registrars.hpp', 'reporters/catch_reporter_registrars.hpp',
@ -299,6 +302,7 @@ reporter_sources = files(
'reporters/catch_reporter_cumulative_base.cpp', 'reporters/catch_reporter_cumulative_base.cpp',
'reporters/catch_reporter_event_listener.cpp', 'reporters/catch_reporter_event_listener.cpp',
'reporters/catch_reporter_helpers.cpp', 'reporters/catch_reporter_helpers.cpp',
'reporters/catch_reporter_json.cpp',
'reporters/catch_reporter_junit.cpp', 'reporters/catch_reporter_junit.cpp',
'reporters/catch_reporter_multi.cpp', 'reporters/catch_reporter_multi.cpp',
'reporters/catch_reporter_registrars.cpp', 'reporters/catch_reporter_registrars.cpp',

View File

@ -0,0 +1,395 @@
// Copyright Catch2 Authors
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE.txt or copy at
// https://www.boost.org/LICENSE_1_0.txt)
// SPDX-License-Identifier: BSL-1.0
//
#include <catch2/catch_test_case_info.hpp>
#include <catch2/catch_test_spec.hpp>
#include <catch2/catch_version.hpp>
#include <catch2/interfaces/catch_interfaces_config.hpp>
#include <catch2/internal/catch_list.hpp>
#include <catch2/internal/catch_string_manip.hpp>
#include <catch2/reporters/catch_reporter_json.hpp>
namespace Catch {
namespace {
void writeSourceInfo( JsonObjectWriter& writer,
SourceLineInfo const& sourceInfo ) {
auto source_location_writer =
writer.write( "source-location" ).writeObject();
source_location_writer.write( "filename" ).write( sourceInfo.file );
source_location_writer.write( "line" ).write( sourceInfo.line );
}
void writeTags( JsonArrayWriter writer, std::vector<Tag> const& tags ) {
for ( auto const& tag : tags ) {
writer.write( tag.original );
}
}
void writeProperties( JsonArrayWriter writer,
TestCaseInfo const& info ) {
if ( info.isHidden() ) { writer.write( "is-hidden" ); }
if ( info.okToFail() ) { writer.write( "ok-to-fail" ); }
if ( info.expectedToFail() ) { writer.write( "expected-to-fail" ); }
if ( info.throws() ) { writer.write( "throws" ); }
}
//void writeCounts( JsonObjectWriter writer, Counts const& counts ) {
// writer.write( "passed" ).write( counts.passed );
// writer.write( "failed" ).write( counts.failed );
// writer.write( "fail-but-ok" ).write( counts.failedButOk );
// writer.write( "skipped" ).write( counts.skipped );
//}
//void writeTestInfo( JsonObjectWriter writer,
// TestCaseInfo const& info ) {
// writer.write( "name" ).write( info.name );
// writeTags( writer.write( "tags" ).writeArray(), info.tags );
// writeSourceInfo( writer, info.lineInfo );
// writeProperties( writer.write( "properties" ).writeArray(), info );
//}
//void writeSection( JsonObjectWriter& writer,
// CumulativeReporterBase::SectionNode const& section,
// bool selfWrite ) {
// if ( selfWrite ) {
// writer.write( "name" ).write( section.stats.sectionInfo.name );
// writeSourceInfo( writer, section.stats.sectionInfo.lineInfo );
// writeCounts( writer.write( "assertions-stats" ).writeObject(),
// section.stats.assertions );
// }
// if ( section.childSections.empty() ) { return; }
// auto sectionsWriter = writer.write( "sections" ).writeArray();
// for ( auto const& childPtr : section.childSections ) {
// auto childSectionWriter = sectionsWriter.writeObject();
// writeSection( childSectionWriter, *childPtr, true );
// }
//}
} // namespace
JsonReporter::JsonReporter( ReporterConfig&& config ):
StreamingReporterBase{ CATCH_MOVE( config ) } {
m_preferences.shouldRedirectStdOut = true;
// TBD: Do we want to report all assertions? XML reporter does
// not, but for machine-parseable reporters I think the answer
// should be yes.
m_preferences.shouldReportAllAssertions = true;
m_objectWriters.emplace( m_stream );
m_writers.emplace( Writer::Object );
auto& writer = m_objectWriters.top();
writer.write( "version" ).write( 1 );
{
auto metadata_writer = writer.write( "metadata" ).writeObject();
metadata_writer.write( "name" ).write( m_config->name() );
metadata_writer.write( "rng-seed" ).write( m_config->rngSeed() );
metadata_writer.write( "catch2-version" ).write( libraryVersion() );
if ( m_config->testSpec().hasFilters() ) {
metadata_writer.write( "filters" )
.write( m_config->testSpec() );
}
}
}
JsonReporter::~JsonReporter() {
endListing();
// TODO: Ensure this closes the top level object, add asserts
assert( m_writers.size() == 1 && "Only the top level object should be open" );
assert( m_writers.top() == Writer::Object );
endObject();
m_stream << '\n' << std::flush;
assert( m_writers.empty() );
}
JsonArrayWriter& JsonReporter::startArray() {
m_arrayWriters.emplace( m_arrayWriters.top().writeArray() );
m_writers.emplace( Writer::Array );
return m_arrayWriters.top();
}
JsonArrayWriter& JsonReporter::startArray( std::string const& key ) {
m_arrayWriters.emplace(
m_objectWriters.top().write( key ).writeArray() );
m_writers.emplace( Writer::Array );
return m_arrayWriters.top();
}
JsonObjectWriter& JsonReporter::startObject() {
m_objectWriters.emplace( m_arrayWriters.top().writeObject() );
m_writers.emplace( Writer::Object );
return m_objectWriters.top();
}
JsonObjectWriter& JsonReporter::startObject( std::string const& key ) {
m_objectWriters.emplace(
m_objectWriters.top().write( key ).writeObject() );
m_writers.emplace( Writer::Object );
return m_objectWriters.top();
}
void JsonReporter::endObject() {
assert( isInside( Writer::Object ) );
m_objectWriters.pop();
m_writers.pop();
}
void JsonReporter::endArray() {
assert( isInside( Writer::Array ) );
m_arrayWriters.pop();
m_writers.pop();
}
bool JsonReporter::isInside( Writer writer ) {
return !m_writers.empty() && m_writers.top() == writer;
}
void JsonReporter::startListing() {
if ( !m_startedListing ) { startObject( "listings" ); }
m_startedListing = true;
}
void JsonReporter::endListing() {
if ( m_startedListing ) { endObject(); }
m_startedListing = false;
}
std::string JsonReporter::getDescription() {
return "WIP! Reports test results as a JSON document. WIP!";
}
void JsonReporter::testRunStarting( TestRunInfo const& testInfo ) {
StreamingReporterBase::testRunStarting( testInfo );
endListing();
assert( isInside( Writer::Object ) );
startObject( "test-run" );
startArray( "test-cases" );
}
static void writeCounts( JsonObjectWriter&& writer, Counts const& counts ) {
writer.write( "passed" ).write( counts.passed );
writer.write( "failed" ).write( counts.failed );
writer.write( "fail-but-ok" ).write( counts.failedButOk );
writer.write( "skipped" ).write( counts.skipped );
}
void JsonReporter::testRunEnded(TestRunStats const& runStats) {
assert( isInside( Writer::Array ) );
// End "test-cases"
endArray();
{
auto totals = m_objectWriters.top().write( "totals" ).writeObject();
writeCounts( totals.write( "assertions" ).writeObject(),
runStats.totals.assertions );
writeCounts( totals.write( "test-cases" ).writeObject(),
runStats.totals.testCases );
}
// End the "test-run" object
endObject();
}
void JsonReporter::testCaseStarting( TestCaseInfo const& tcInfo ) {
StreamingReporterBase::testCaseStarting( tcInfo );
assert( isInside( Writer::Array ) &&
"We should be in the 'test-cases' array" );
startObject();
// "test-info" prelude
{
auto testInfo =
m_objectWriters.top().write( "test-info" ).writeObject();
// TODO: handle testName vs className!!
testInfo.write( "name" ).write( tcInfo.name );
writeSourceInfo(testInfo, tcInfo.lineInfo);
writeTags( testInfo.write( "tags" ).writeArray(), tcInfo.tags );
writeProperties( testInfo.write( "properties" ).writeArray(),
tcInfo );
}
// Start the array for individual test runs (testCasePartial pairs)
startArray( "runs" );
}
void JsonReporter::testCaseEnded( TestCaseStats const& tcStats ) {
StreamingReporterBase::testCaseEnded( tcStats );
// We need to close the 'runs' array before finishing the test case
assert( isInside( Writer::Array ) );
endArray();
{
auto totals = m_objectWriters.top().write( "totals" ).writeObject();
writeCounts( totals.write( "assertions" ).writeObject(),
tcStats.totals.assertions );
// We do not write the test case totals, because there will always be just one test case here.
// TODO: overall "result" -> success, skip, fail here? Or in partial result?
}
// We do not write out stderr/stdout, because we instead wrote those out in partial runs
// TODO: aborting?
// And we also close this test case's object
assert( isInside( Writer::Object ) );
endObject();
}
void JsonReporter::testCasePartialStarting( TestCaseInfo const& /*tcInfo*/,
uint64_t index ) {
startObject();
m_objectWriters.top().write( "run-idx" ).write( index );
startArray( "path" );
//startObject( "path" );
// TODO: we want to delay most of the printing to the 'root' section
// TODO: childSection key name?
}
void JsonReporter::testCasePartialEnded( TestCaseStats const& tcStats,
uint64_t /*index*/ ) {
// Fixme: the top level section handles this.
//// path object
endArray();
if ( !tcStats.stdOut.empty() ) {
m_objectWriters.top()
.write( "captured-stdout" )
.write( tcStats.stdOut );
}
if ( !tcStats.stdErr.empty() ) {
m_objectWriters.top()
.write( "captured-stderr" )
.write( tcStats.stdErr );
}
{
auto totals = m_objectWriters.top().write( "totals" ).writeObject();
writeCounts( totals.write( "assertions" ).writeObject(),
tcStats.totals.assertions );
// We do not write the test case totals, because there will
// always be just one test case here.
// TODO: overall "result" -> success, skip, fail here? Or in
// partial result?
}
// TODO: aborting?
// run object
endObject();
}
void JsonReporter::sectionStarting( SectionInfo const& sectionInfo ) {
assert( isInside( Writer::Array ) &&
"Section should always start inside an object" );
// We want to nest top level sections, even though it shares name
// and source loc with the TEST_CASE
auto& sectionObject = startObject();
sectionObject.write( "kind" ).write( "section" );
sectionObject.write( "name" ).write( sectionInfo.name );
writeSourceInfo( m_objectWriters.top(), sectionInfo.lineInfo );
// TBD: Do we want to create this event lazily? It would become
// rather complex, but we could do it, and it would look
// better for empty sections. OTOH, empty sections should
// be rare.
startArray( "path" );
}
void JsonReporter::sectionEnded( SectionStats const& /*sectionStats */) {
// End the subpath array
endArray();
// TODO: metadata
// TODO: what info do we have here?
// End the section object
endObject();
}
void JsonReporter::assertionStarting( AssertionInfo const& /*assertionInfo*/ ) {}
void JsonReporter::assertionEnded( AssertionStats const& assertionStats ) {
// TODO: There is lot of different things to handle here, but
// we can fill it in later, after we show that the basic
// outline and streaming reporter impl works well enough.
//if ( !m_config->includeSuccessfulResults()
// && assertionStats.assertionResult.isOk() ) {
// return;
//}
assert( isInside( Writer::Array ) );
auto assertionObject = m_arrayWriters.top().writeObject();
assertionObject.write( "kind" ).write( "assertion" );
writeSourceInfo( assertionObject,
assertionStats.assertionResult.getSourceInfo() );
assertionObject.write( "status" )
.write( assertionStats.assertionResult.isOk() );
// TODO: handling of result.
// TODO: messages
// TODO: totals?
}
void JsonReporter::benchmarkPreparing( StringRef name ) { (void)name; }
void JsonReporter::benchmarkStarting( BenchmarkInfo const& ) {}
void JsonReporter::benchmarkEnded( BenchmarkStats<> const& ) {}
void JsonReporter::benchmarkFailed( StringRef error ) { (void)error; }
void JsonReporter::listReporters(
std::vector<ReporterDescription> const& descriptions ) {
startListing();
auto writer = m_objectWriters.top().write( "reporters" ).writeArray();
for ( auto const& desc : descriptions ) {
auto desc_writer = writer.writeObject();
desc_writer.write( "name" ).write( desc.name );
desc_writer.write( "description" ).write( desc.description );
}
}
void JsonReporter::listListeners(
std::vector<ListenerDescription> const& descriptions ) {
startListing();
auto writer = m_objectWriters.top().write( "listeners" ).writeArray();
for ( auto const& desc : descriptions ) {
auto desc_writer = writer.writeObject();
desc_writer.write( "name" ).write( desc.name );
desc_writer.write( "description" ).write( desc.description );
}
}
void JsonReporter::listTests( std::vector<TestCaseHandle> const& tests ) {
startListing();
auto writer = m_objectWriters.top().write( "tests" ).writeArray();
for ( auto const& test : tests ) {
auto desc_writer = writer.writeObject();
auto const& info = test.getTestCaseInfo();
desc_writer.write( "name" ).write( info.name );
desc_writer.write( "class-name" ).write( info.className );
{
auto tag_writer = desc_writer.write( "tags" ).writeArray();
for ( auto const& tag : info.tags ) {
tag_writer.write( tag.original );
}
}
writeSourceInfo( desc_writer, info.lineInfo );
}
}
void JsonReporter::listTags( std::vector<TagInfo> const& tags ) {
startListing();
auto writer = m_objectWriters.top().write( "tags" ).writeArray();
for ( auto const& tag : tags ) {
auto tag_writer = writer.writeObject();
{
auto aliases_writer =
tag_writer.write( "aliases" ).writeArray();
for ( auto alias : tag.spellings ) {
aliases_writer.write( alias );
}
}
tag_writer.write( "count" ).write( tag.count );
}
}
} // namespace Catch

View File

@ -0,0 +1,95 @@
// Copyright Catch2 Authors
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE.txt or copy at
// https://www.boost.org/LICENSE_1_0.txt)
// SPDX-License-Identifier: BSL-1.0
#ifndef CATCH_REPORTER_JSON_HPP_INCLUDED
#define CATCH_REPORTER_JSON_HPP_INCLUDED
#include <catch2/catch_timer.hpp>
#include <catch2/internal/catch_jsonwriter.hpp>
#include <catch2/reporters/catch_reporter_streaming_base.hpp>
#include <stack>
namespace Catch {
class JsonReporter : public StreamingReporterBase {
public:
JsonReporter( ReporterConfig&& config );
~JsonReporter() override;
static std::string getDescription();
public: // StreamingReporterBase
void testRunStarting( TestRunInfo const& runInfo ) override;
void testRunEnded( TestRunStats const& runStats ) override;
void testCaseStarting( TestCaseInfo const& tcInfo ) override;
void testCaseEnded( TestCaseStats const& tcStats ) override;
void testCasePartialStarting( TestCaseInfo const& tcInfo,
uint64_t index ) override;
void testCasePartialEnded( TestCaseStats const& tcStats,
uint64_t index ) override;
void sectionStarting( SectionInfo const& sectionInfo ) override;
void sectionEnded( SectionStats const& sectionStats ) override;
void assertionStarting( AssertionInfo const& assertionInfo ) override;
void assertionEnded( AssertionStats const& assertionStats ) override;
//void testRunEndedCumulative() override;
void benchmarkPreparing( StringRef name ) override;
void benchmarkStarting( BenchmarkInfo const& ) override;
void benchmarkEnded( BenchmarkStats<> const& ) override;
void benchmarkFailed( StringRef error ) override;
void listReporters(
std::vector<ReporterDescription> const& descriptions ) override;
void listListeners(
std::vector<ListenerDescription> const& descriptions ) override;
void listTests( std::vector<TestCaseHandle> const& tests ) override;
void listTags( std::vector<TagInfo> const& tags ) override;
private:
Timer m_testCaseTimer;
enum class Writer {
Object,
Array
};
JsonArrayWriter& startArray();
JsonArrayWriter& startArray( std::string const& key );
JsonObjectWriter& startObject();
JsonObjectWriter& startObject( std::string const& key );
void endObject();
void endArray();
bool isInside( Writer writer );
void startListing();
void endListing();
// Invariant:
// When m_writers is not empty and its top element is
// - Writer::Object, then m_objectWriters is not be empty
// - Writer::Array, then m_arrayWriters shall not be empty
std::stack<JsonObjectWriter> m_objectWriters{};
std::stack<JsonArrayWriter> m_arrayWriters{};
std::stack<Writer> m_writers{};
bool m_startedListing = false;
// std::size_t m_sectionDepth = 0;
// std::size_t m_sectionStarted = 0;
};
} // namespace Catch
#endif // CATCH_REPORTER_JSON_HPP_INCLUDED

View File

@ -28,6 +28,7 @@
#include <catch2/reporters/catch_reporter_cumulative_base.hpp> #include <catch2/reporters/catch_reporter_cumulative_base.hpp>
#include <catch2/reporters/catch_reporter_event_listener.hpp> #include <catch2/reporters/catch_reporter_event_listener.hpp>
#include <catch2/reporters/catch_reporter_helpers.hpp> #include <catch2/reporters/catch_reporter_helpers.hpp>
#include <catch2/reporters/catch_reporter_json.hpp>
#include <catch2/reporters/catch_reporter_junit.hpp> #include <catch2/reporters/catch_reporter_junit.hpp>
#include <catch2/reporters/catch_reporter_multi.hpp> #include <catch2/reporters/catch_reporter_multi.hpp>
#include <catch2/reporters/catch_reporter_registrars.hpp> #include <catch2/reporters/catch_reporter_registrars.hpp>

View File

@ -87,6 +87,7 @@ set(TEST_SOURCES
${SELF_TEST_DIR}/IntrospectiveTests/FloatingPoint.tests.cpp ${SELF_TEST_DIR}/IntrospectiveTests/FloatingPoint.tests.cpp
${SELF_TEST_DIR}/IntrospectiveTests/GeneratorsImpl.tests.cpp ${SELF_TEST_DIR}/IntrospectiveTests/GeneratorsImpl.tests.cpp
${SELF_TEST_DIR}/IntrospectiveTests/InternalBenchmark.tests.cpp ${SELF_TEST_DIR}/IntrospectiveTests/InternalBenchmark.tests.cpp
${SELF_TEST_DIR}/IntrospectiveTests/Json.tests.cpp
${SELF_TEST_DIR}/IntrospectiveTests/Parse.tests.cpp ${SELF_TEST_DIR}/IntrospectiveTests/Parse.tests.cpp
${SELF_TEST_DIR}/IntrospectiveTests/PartTracker.tests.cpp ${SELF_TEST_DIR}/IntrospectiveTests/PartTracker.tests.cpp
${SELF_TEST_DIR}/IntrospectiveTests/RandomNumberGeneration.tests.cpp ${SELF_TEST_DIR}/IntrospectiveTests/RandomNumberGeneration.tests.cpp
@ -642,7 +643,8 @@ foreach (reporterName # "Automake" - the simple .trs format does not support any
"SonarQube" "SonarQube"
"TAP" "TAP"
# "TeamCity" - does not seem to support test suite-level metadata/comments # "TeamCity" - does not seem to support test suite-level metadata/comments
"XML") "XML"
"JSON")
add_test(NAME "Reporters:Filters:${reporterName}" add_test(NAME "Reporters:Filters:${reporterName}"
COMMAND COMMAND
@ -652,6 +654,8 @@ foreach (reporterName # "Automake" - the simple .trs format does not support any
# Different regex for these two reporters, because the commas end up xml-escaped # Different regex for these two reporters, because the commas end up xml-escaped
if (reporterName MATCHES "JUnit|XML") if (reporterName MATCHES "JUnit|XML")
set(testCaseNameFormat "&quot;CaseInsensitiveLess is case insensitive&quot;") set(testCaseNameFormat "&quot;CaseInsensitiveLess is case insensitive&quot;")
elseif(reporterName MATCHES "JSON")
set(testCaseNameFormat "\\\\\"CaseInsensitiveLess is case insensitive\\\\\"")
else() else()
set(testCaseNameFormat "\"CaseInsensitiveLess is case insensitive\"") set(testCaseNameFormat "\"CaseInsensitiveLess is case insensitive\"")
endif() endif()

View File

@ -170,6 +170,7 @@ Nor would this
:test-result: XFAIL Incomplete AssertionHandler :test-result: XFAIL Incomplete AssertionHandler
:test-result: XFAIL Inequality checks that should fail :test-result: XFAIL Inequality checks that should fail
:test-result: PASS Inequality checks that should succeed :test-result: PASS Inequality checks that should succeed
:test-result: PASS JsonWriter
:test-result: PASS Lambdas in assertions :test-result: PASS Lambdas in assertions
:test-result: PASS Less-than inequalities with different epsilons :test-result: PASS Less-than inequalities with different epsilons
:test-result: PASS ManuallyRegistered :test-result: PASS ManuallyRegistered

View File

@ -168,6 +168,7 @@
:test-result: XFAIL Incomplete AssertionHandler :test-result: XFAIL Incomplete AssertionHandler
:test-result: XFAIL Inequality checks that should fail :test-result: XFAIL Inequality checks that should fail
:test-result: PASS Inequality checks that should succeed :test-result: PASS Inequality checks that should succeed
:test-result: PASS JsonWriter
:test-result: PASS Lambdas in assertions :test-result: PASS Lambdas in assertions
:test-result: PASS Less-than inequalities with different epsilons :test-result: PASS Less-than inequalities with different epsilons
:test-result: PASS ManuallyRegistered :test-result: PASS ManuallyRegistered

View File

@ -979,6 +979,83 @@ Condition.tests.cpp:<line number>: passed: data.str_hello != "goodbye" for: "hel
Condition.tests.cpp:<line number>: passed: data.str_hello != "hell" for: "hello" != "hell" Condition.tests.cpp:<line number>: passed: data.str_hello != "hell" for: "hello" != "hell"
Condition.tests.cpp:<line number>: passed: data.str_hello != "hello1" for: "hello" != "hello1" Condition.tests.cpp:<line number>: passed: data.str_hello != "hello1" for: "hello" != "hello1"
Condition.tests.cpp:<line number>: passed: data.str_hello.size() != 6 for: 5 != 6 Condition.tests.cpp:<line number>: passed: data.str_hello.size() != 6 for: 5 != 6
Json.tests.cpp:<line number>: passed: stream.str() == "" for: "" == ""
Json.tests.cpp:<line number>: passed: stream.str() == "{\n}" for: "{
}"
==
"{
}"
Json.tests.cpp:<line number>: passed: stream.str(), ContainsSubstring( "\"int\": 1," ) && ContainsSubstring( "\"double\": 1.5," ) && ContainsSubstring( "\"true\": true," ) && ContainsSubstring( "\"false\": false," ) && ContainsSubstring( "\"string\": \"this is a string\"," ) && ContainsSubstring( "\"array\": [\n 1,\n 2\n ]\n}" ) for: "{
"int": 1,
"double": 1.5,
"true": true,
"false": false,
"string": "this is a string",
"array": [
1,
2
]
}" ( contains: ""int": 1," and contains: ""double": 1.5," and contains: ""true": true," and contains: ""false": false," and contains: ""string": "this is a string"," and contains: ""array": [
1,
2
]
}" )
Json.tests.cpp:<line number>: passed: stream.str(), ContainsSubstring( "\"empty_object\": {\n }," ) && ContainsSubstring( "\"fully_object\": {\n \"key\": 1\n }" ) for: "{
"empty_object": {
},
"fully_object": {
"key": 1
}
}" ( contains: ""empty_object": {
}," and contains: ""fully_object": {
"key": 1
}" )
Json.tests.cpp:<line number>: passed: stream.str() == "[\n]" for: "[
]"
==
"[
]"
Json.tests.cpp:<line number>: passed: stream.str() == "[\n 1,\n 1.5,\n true,\n false,\n \"this is a string\",\n {\n \"object\": 42\n },\n [\n \"array\",\n 42.5\n ]\n]" for: "[
1,
1.5,
true,
false,
"this is a string",
{
"object": 42
},
[
"array",
42.5
]
]"
==
"[
1,
1.5,
true,
false,
"this is a string",
{
"object": 42
},
[
"array",
42.5
]
]"
Json.tests.cpp:<line number>: passed: stream.str() == "{\n}" for: "{
}"
==
"{
}"
Json.tests.cpp:<line number>: passed: stream.str() == "[\n]" for: "[
]"
==
"[
]"
Json.tests.cpp:<line number>: passed: stream.str() == "\"custom\"" for: ""custom"" == ""custom""
Json.tests.cpp:<line number>: passed: stream.str() == "\"\\\"\"" for: ""\""" == ""\"""
Compilation.tests.cpp:<line number>: passed: []() { return true; }() for: true Compilation.tests.cpp:<line number>: passed: []() { return true; }() for: true
Approx.tests.cpp:<line number>: passed: d <= Approx( 1.24 ) for: 1.23 <= Approx( 1.24 ) Approx.tests.cpp:<line number>: passed: d <= Approx( 1.24 ) for: 1.23 <= Approx( 1.24 )
Approx.tests.cpp:<line number>: passed: d <= Approx( 1.23 ) for: 1.23 <= Approx( 1.23 ) Approx.tests.cpp:<line number>: passed: d <= Approx( 1.23 ) for: 1.23 <= Approx( 1.23 )
@ -1343,6 +1420,60 @@ Reporters.tests.cpp:<line number>: passed: listingString, ContainsSubstring( "fa
" ( contains: "fake test name" and contains: "fakeTestTag" ) with 1 message: 'Tested reporter: console' " ( contains: "fake test name" and contains: "fakeTestTag" ) with 1 message: 'Tested reporter: console'
Reporters.tests.cpp:<line number>: passed: !(factories.empty()) for: !false Reporters.tests.cpp:<line number>: passed: !(factories.empty()) for: !false
Reporters.tests.cpp:<line number>: passed: listingString, ContainsSubstring("fakeTag"s) for: "{
"version": 1,
"metadata": {
"name": "",
"rng-seed": 1234,
"catch2-version": "<version>"
},
"listings": {
"tags": [
{
"aliases": [
"fakeTag"
],
"count": 1
}
]" contains: "fakeTag" with 1 message: 'Tested reporter: JSON'
Reporters.tests.cpp:<line number>: passed: !(factories.empty()) for: !false
Reporters.tests.cpp:<line number>: passed: listingString, ContainsSubstring("fake reporter"s) for: "{
"version": 1,
"metadata": {
"name": "",
"rng-seed": 1234,
"catch2-version": "<version>"
},
"listings": {
"reporters": [
{
"name": "fake reporter",
"description": "fake description"
}
]" contains: "fake reporter" with 1 message: 'Tested reporter: JSON'
Reporters.tests.cpp:<line number>: passed: !(factories.empty()) for: !false
Reporters.tests.cpp:<line number>: passed: listingString, ContainsSubstring( "fake test name"s ) && ContainsSubstring( "fakeTestTag"s ) for: "{
"version": 1,
"metadata": {
"name": "",
"rng-seed": 1234,
"catch2-version": "<version>"
},
"listings": {
"tests": [
{
"name": "fake test name",
"class-name": "",
"tags": [
"fakeTestTag"
],
"source-location": {
"filename": "fake-file.cpp",
"line": 123456789
}
}
]" ( contains: "fake test name" and contains: "fakeTestTag" ) with 1 message: 'Tested reporter: JSON'
Reporters.tests.cpp:<line number>: passed: !(factories.empty()) for: !false
Reporters.tests.cpp:<line number>: passed: listingString, ContainsSubstring("fakeTag"s) for: "<?xml version="1.0" encoding="UTF-8"?> Reporters.tests.cpp:<line number>: passed: listingString, ContainsSubstring("fakeTag"s) for: "<?xml version="1.0" encoding="UTF-8"?>
All available tags: All available tags:
1 [fakeTag] 1 [fakeTag]
@ -2544,7 +2675,7 @@ InternalBenchmark.tests.cpp:<line number>: passed: med == 18. for: 18.0 == 18.0
InternalBenchmark.tests.cpp:<line number>: passed: q3 == 23. for: 23.0 == 23.0 InternalBenchmark.tests.cpp:<line number>: passed: q3 == 23. for: 23.0 == 23.0
Misc.tests.cpp:<line number>: passed: Misc.tests.cpp:<line number>: passed:
Misc.tests.cpp:<line number>: passed: Misc.tests.cpp:<line number>: passed:
test cases: 413 | 308 passed | 85 failed | 6 skipped | 14 failed as expected test cases: 414 | 309 passed | 85 failed | 6 skipped | 14 failed as expected
assertions: 2230 | 2049 passed | 146 failed | 35 failed as expected assertions: 2246 | 2065 passed | 146 failed | 35 failed as expected

View File

@ -977,6 +977,83 @@ Condition.tests.cpp:<line number>: passed: data.str_hello != "goodbye" for: "hel
Condition.tests.cpp:<line number>: passed: data.str_hello != "hell" for: "hello" != "hell" Condition.tests.cpp:<line number>: passed: data.str_hello != "hell" for: "hello" != "hell"
Condition.tests.cpp:<line number>: passed: data.str_hello != "hello1" for: "hello" != "hello1" Condition.tests.cpp:<line number>: passed: data.str_hello != "hello1" for: "hello" != "hello1"
Condition.tests.cpp:<line number>: passed: data.str_hello.size() != 6 for: 5 != 6 Condition.tests.cpp:<line number>: passed: data.str_hello.size() != 6 for: 5 != 6
Json.tests.cpp:<line number>: passed: stream.str() == "" for: "" == ""
Json.tests.cpp:<line number>: passed: stream.str() == "{\n}" for: "{
}"
==
"{
}"
Json.tests.cpp:<line number>: passed: stream.str(), ContainsSubstring( "\"int\": 1," ) && ContainsSubstring( "\"double\": 1.5," ) && ContainsSubstring( "\"true\": true," ) && ContainsSubstring( "\"false\": false," ) && ContainsSubstring( "\"string\": \"this is a string\"," ) && ContainsSubstring( "\"array\": [\n 1,\n 2\n ]\n}" ) for: "{
"int": 1,
"double": 1.5,
"true": true,
"false": false,
"string": "this is a string",
"array": [
1,
2
]
}" ( contains: ""int": 1," and contains: ""double": 1.5," and contains: ""true": true," and contains: ""false": false," and contains: ""string": "this is a string"," and contains: ""array": [
1,
2
]
}" )
Json.tests.cpp:<line number>: passed: stream.str(), ContainsSubstring( "\"empty_object\": {\n }," ) && ContainsSubstring( "\"fully_object\": {\n \"key\": 1\n }" ) for: "{
"empty_object": {
},
"fully_object": {
"key": 1
}
}" ( contains: ""empty_object": {
}," and contains: ""fully_object": {
"key": 1
}" )
Json.tests.cpp:<line number>: passed: stream.str() == "[\n]" for: "[
]"
==
"[
]"
Json.tests.cpp:<line number>: passed: stream.str() == "[\n 1,\n 1.5,\n true,\n false,\n \"this is a string\",\n {\n \"object\": 42\n },\n [\n \"array\",\n 42.5\n ]\n]" for: "[
1,
1.5,
true,
false,
"this is a string",
{
"object": 42
},
[
"array",
42.5
]
]"
==
"[
1,
1.5,
true,
false,
"this is a string",
{
"object": 42
},
[
"array",
42.5
]
]"
Json.tests.cpp:<line number>: passed: stream.str() == "{\n}" for: "{
}"
==
"{
}"
Json.tests.cpp:<line number>: passed: stream.str() == "[\n]" for: "[
]"
==
"[
]"
Json.tests.cpp:<line number>: passed: stream.str() == "\"custom\"" for: ""custom"" == ""custom""
Json.tests.cpp:<line number>: passed: stream.str() == "\"\\\"\"" for: ""\""" == ""\"""
Compilation.tests.cpp:<line number>: passed: []() { return true; }() for: true Compilation.tests.cpp:<line number>: passed: []() { return true; }() for: true
Approx.tests.cpp:<line number>: passed: d <= Approx( 1.24 ) for: 1.23 <= Approx( 1.24 ) Approx.tests.cpp:<line number>: passed: d <= Approx( 1.24 ) for: 1.23 <= Approx( 1.24 )
Approx.tests.cpp:<line number>: passed: d <= Approx( 1.23 ) for: 1.23 <= Approx( 1.23 ) Approx.tests.cpp:<line number>: passed: d <= Approx( 1.23 ) for: 1.23 <= Approx( 1.23 )
@ -1341,6 +1418,60 @@ Reporters.tests.cpp:<line number>: passed: listingString, ContainsSubstring( "fa
" ( contains: "fake test name" and contains: "fakeTestTag" ) with 1 message: 'Tested reporter: console' " ( contains: "fake test name" and contains: "fakeTestTag" ) with 1 message: 'Tested reporter: console'
Reporters.tests.cpp:<line number>: passed: !(factories.empty()) for: !false Reporters.tests.cpp:<line number>: passed: !(factories.empty()) for: !false
Reporters.tests.cpp:<line number>: passed: listingString, ContainsSubstring("fakeTag"s) for: "{
"version": 1,
"metadata": {
"name": "",
"rng-seed": 1234,
"catch2-version": "<version>"
},
"listings": {
"tags": [
{
"aliases": [
"fakeTag"
],
"count": 1
}
]" contains: "fakeTag" with 1 message: 'Tested reporter: JSON'
Reporters.tests.cpp:<line number>: passed: !(factories.empty()) for: !false
Reporters.tests.cpp:<line number>: passed: listingString, ContainsSubstring("fake reporter"s) for: "{
"version": 1,
"metadata": {
"name": "",
"rng-seed": 1234,
"catch2-version": "<version>"
},
"listings": {
"reporters": [
{
"name": "fake reporter",
"description": "fake description"
}
]" contains: "fake reporter" with 1 message: 'Tested reporter: JSON'
Reporters.tests.cpp:<line number>: passed: !(factories.empty()) for: !false
Reporters.tests.cpp:<line number>: passed: listingString, ContainsSubstring( "fake test name"s ) && ContainsSubstring( "fakeTestTag"s ) for: "{
"version": 1,
"metadata": {
"name": "",
"rng-seed": 1234,
"catch2-version": "<version>"
},
"listings": {
"tests": [
{
"name": "fake test name",
"class-name": "",
"tags": [
"fakeTestTag"
],
"source-location": {
"filename": "fake-file.cpp",
"line": 123456789
}
}
]" ( contains: "fake test name" and contains: "fakeTestTag" ) with 1 message: 'Tested reporter: JSON'
Reporters.tests.cpp:<line number>: passed: !(factories.empty()) for: !false
Reporters.tests.cpp:<line number>: passed: listingString, ContainsSubstring("fakeTag"s) for: "<?xml version="1.0" encoding="UTF-8"?> Reporters.tests.cpp:<line number>: passed: listingString, ContainsSubstring("fakeTag"s) for: "<?xml version="1.0" encoding="UTF-8"?>
All available tags: All available tags:
1 [fakeTag] 1 [fakeTag]
@ -2533,7 +2664,7 @@ InternalBenchmark.tests.cpp:<line number>: passed: med == 18. for: 18.0 == 18.0
InternalBenchmark.tests.cpp:<line number>: passed: q3 == 23. for: 23.0 == 23.0 InternalBenchmark.tests.cpp:<line number>: passed: q3 == 23. for: 23.0 == 23.0
Misc.tests.cpp:<line number>: passed: Misc.tests.cpp:<line number>: passed:
Misc.tests.cpp:<line number>: passed: Misc.tests.cpp:<line number>: passed:
test cases: 413 | 308 passed | 85 failed | 6 skipped | 14 failed as expected test cases: 414 | 309 passed | 85 failed | 6 skipped | 14 failed as expected
assertions: 2230 | 2049 passed | 146 failed | 35 failed as expected assertions: 2246 | 2065 passed | 146 failed | 35 failed as expected

View File

@ -1588,6 +1588,6 @@ due to unexpected exception with message:
Why would you throw a std::string? Why would you throw a std::string?
=============================================================================== ===============================================================================
test cases: 413 | 322 passed | 70 failed | 7 skipped | 14 failed as expected test cases: 414 | 323 passed | 70 failed | 7 skipped | 14 failed as expected
assertions: 2213 | 2049 passed | 129 failed | 35 failed as expected assertions: 2229 | 2065 passed | 129 failed | 35 failed as expected

View File

@ -7258,6 +7258,195 @@ Condition.tests.cpp:<line number>: PASSED:
with expansion: with expansion:
5 != 6 5 != 6
-------------------------------------------------------------------------------
JsonWriter
Newly constructed JsonWriter does nothing
-------------------------------------------------------------------------------
Json.tests.cpp:<line number>
...............................................................................
Json.tests.cpp:<line number>: PASSED:
REQUIRE( stream.str() == "" )
with expansion:
"" == ""
-------------------------------------------------------------------------------
JsonWriter
Calling writeObject will create an empty pair of braces
-------------------------------------------------------------------------------
Json.tests.cpp:<line number>
...............................................................................
Json.tests.cpp:<line number>: PASSED:
REQUIRE( stream.str() == "{\n}" )
with expansion:
"{
}"
==
"{
}"
-------------------------------------------------------------------------------
JsonWriter
Calling writeObject with key will create an object to write the value
-------------------------------------------------------------------------------
Json.tests.cpp:<line number>
...............................................................................
Json.tests.cpp:<line number>: PASSED:
REQUIRE_THAT( stream.str(), ContainsSubstring( "\"int\": 1," ) && ContainsSubstring( "\"double\": 1.5," ) && ContainsSubstring( "\"true\": true," ) && ContainsSubstring( "\"false\": false," ) && ContainsSubstring( "\"string\": \"this is a string\"," ) && ContainsSubstring( "\"array\": [\n 1,\n 2\n ]\n}" ) )
with expansion:
"{
"int": 1,
"double": 1.5,
"true": true,
"false": false,
"string": "this is a string",
"array": [
1,
2
]
}" ( contains: ""int": 1," and contains: ""double": 1.5," and contains:
""true": true," and contains: ""false": false," and contains: ""string":
"this is a string"," and contains: ""array": [
1,
2
]
}" )
-------------------------------------------------------------------------------
JsonWriter
nesting objects
-------------------------------------------------------------------------------
Json.tests.cpp:<line number>
...............................................................................
Json.tests.cpp:<line number>: PASSED:
REQUIRE_THAT( stream.str(), ContainsSubstring( "\"empty_object\": {\n }," ) && ContainsSubstring( "\"fully_object\": {\n \"key\": 1\n }" ) )
with expansion:
"{
"empty_object": {
},
"fully_object": {
"key": 1
}
}" ( contains: ""empty_object": {
}," and contains: ""fully_object": {
"key": 1
}" )
-------------------------------------------------------------------------------
JsonWriter
Calling writeArray will create an empty pair of braces
-------------------------------------------------------------------------------
Json.tests.cpp:<line number>
...............................................................................
Json.tests.cpp:<line number>: PASSED:
REQUIRE( stream.str() == "[\n]" )
with expansion:
"[
]"
==
"[
]"
-------------------------------------------------------------------------------
JsonWriter
Calling writeArray creates array to write the values to
-------------------------------------------------------------------------------
Json.tests.cpp:<line number>
...............................................................................
Json.tests.cpp:<line number>: PASSED:
REQUIRE( stream.str() == "[\n 1,\n 1.5,\n true,\n false,\n \"this is a string\",\n {\n \"object\": 42\n },\n [\n \"array\",\n 42.5\n ]\n]" )
with expansion:
"[
1,
1.5,
true,
false,
"this is a string",
{
"object": 42
},
[
"array",
42.5
]
]"
==
"[
1,
1.5,
true,
false,
"this is a string",
{
"object": 42
},
[
"array",
42.5
]
]"
-------------------------------------------------------------------------------
JsonWriter
Moved from JsonObjectWriter shall not insert superfluous brace
-------------------------------------------------------------------------------
Json.tests.cpp:<line number>
...............................................................................
Json.tests.cpp:<line number>: PASSED:
REQUIRE( stream.str() == "{\n}" )
with expansion:
"{
}"
==
"{
}"
-------------------------------------------------------------------------------
JsonWriter
Moved from JsonArrayWriter shall not insert superfluous bracket
-------------------------------------------------------------------------------
Json.tests.cpp:<line number>
...............................................................................
Json.tests.cpp:<line number>: PASSED:
REQUIRE( stream.str() == "[\n]" )
with expansion:
"[
]"
==
"[
]"
-------------------------------------------------------------------------------
JsonWriter
Custom class shall be quoted
-------------------------------------------------------------------------------
Json.tests.cpp:<line number>
...............................................................................
Json.tests.cpp:<line number>: PASSED:
REQUIRE( stream.str() == "\"custom\"" )
with expansion:
""custom"" == ""custom""
-------------------------------------------------------------------------------
JsonWriter
String with a quote shall be espaced
-------------------------------------------------------------------------------
Json.tests.cpp:<line number>
...............................................................................
Json.tests.cpp:<line number>: PASSED:
REQUIRE( stream.str() == "\"\\\"\"" )
with expansion:
""\""" == ""\"""
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
Lambdas in assertions Lambdas in assertions
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
@ -9756,6 +9945,129 @@ Reporter's write listings to provided stream
Reporters.tests.cpp:<line number> Reporters.tests.cpp:<line number>
............................................................................... ...............................................................................
Reporters.tests.cpp:<line number>: PASSED:
REQUIRE_FALSE( factories.empty() )
with expansion:
!false
-------------------------------------------------------------------------------
Reporter's write listings to provided stream
JSON reporter lists tags
-------------------------------------------------------------------------------
Reporters.tests.cpp:<line number>
...............................................................................
Reporters.tests.cpp:<line number>: PASSED:
REQUIRE_THAT( listingString, ContainsSubstring("fakeTag"s) )
with expansion:
"{
"version": 1,
"metadata": {
"name": "",
"rng-seed": 1234,
"catch2-version": "<version>"
},
"listings": {
"tags": [
{
"aliases": [
"fakeTag"
],
"count": 1
}
]" contains: "fakeTag"
with message:
Tested reporter: JSON
-------------------------------------------------------------------------------
Reporter's write listings to provided stream
-------------------------------------------------------------------------------
Reporters.tests.cpp:<line number>
...............................................................................
Reporters.tests.cpp:<line number>: PASSED:
REQUIRE_FALSE( factories.empty() )
with expansion:
!false
-------------------------------------------------------------------------------
Reporter's write listings to provided stream
JSON reporter lists reporters
-------------------------------------------------------------------------------
Reporters.tests.cpp:<line number>
...............................................................................
Reporters.tests.cpp:<line number>: PASSED:
REQUIRE_THAT( listingString, ContainsSubstring("fake reporter"s) )
with expansion:
"{
"version": 1,
"metadata": {
"name": "",
"rng-seed": 1234,
"catch2-version": "<version>"
},
"listings": {
"reporters": [
{
"name": "fake reporter",
"description": "fake description"
}
]" contains: "fake reporter"
with message:
Tested reporter: JSON
-------------------------------------------------------------------------------
Reporter's write listings to provided stream
-------------------------------------------------------------------------------
Reporters.tests.cpp:<line number>
...............................................................................
Reporters.tests.cpp:<line number>: PASSED:
REQUIRE_FALSE( factories.empty() )
with expansion:
!false
-------------------------------------------------------------------------------
Reporter's write listings to provided stream
JSON reporter lists tests
-------------------------------------------------------------------------------
Reporters.tests.cpp:<line number>
...............................................................................
Reporters.tests.cpp:<line number>: PASSED:
REQUIRE_THAT( listingString, ContainsSubstring( "fake test name"s ) && ContainsSubstring( "fakeTestTag"s ) )
with expansion:
"{
"version": 1,
"metadata": {
"name": "",
"rng-seed": 1234,
"catch2-version": "<version>"
},
"listings": {
"tests": [
{
"name": "fake test name",
"class-name": "",
"tags": [
"fakeTestTag"
],
"source-location": {
"filename": "fake-file.cpp",
"line": 123456789
}
}
]" ( contains: "fake test name" and contains: "fakeTestTag" )
with message:
Tested reporter: JSON
-------------------------------------------------------------------------------
Reporter's write listings to provided stream
-------------------------------------------------------------------------------
Reporters.tests.cpp:<line number>
...............................................................................
Reporters.tests.cpp:<line number>: PASSED: Reporters.tests.cpp:<line number>: PASSED:
REQUIRE_FALSE( factories.empty() ) REQUIRE_FALSE( factories.empty() )
with expansion: with expansion:
@ -18283,6 +18595,6 @@ Misc.tests.cpp:<line number>
Misc.tests.cpp:<line number>: PASSED: Misc.tests.cpp:<line number>: PASSED:
=============================================================================== ===============================================================================
test cases: 413 | 308 passed | 85 failed | 6 skipped | 14 failed as expected test cases: 414 | 309 passed | 85 failed | 6 skipped | 14 failed as expected
assertions: 2230 | 2049 passed | 146 failed | 35 failed as expected assertions: 2246 | 2065 passed | 146 failed | 35 failed as expected

View File

@ -7256,6 +7256,195 @@ Condition.tests.cpp:<line number>: PASSED:
with expansion: with expansion:
5 != 6 5 != 6
-------------------------------------------------------------------------------
JsonWriter
Newly constructed JsonWriter does nothing
-------------------------------------------------------------------------------
Json.tests.cpp:<line number>
...............................................................................
Json.tests.cpp:<line number>: PASSED:
REQUIRE( stream.str() == "" )
with expansion:
"" == ""
-------------------------------------------------------------------------------
JsonWriter
Calling writeObject will create an empty pair of braces
-------------------------------------------------------------------------------
Json.tests.cpp:<line number>
...............................................................................
Json.tests.cpp:<line number>: PASSED:
REQUIRE( stream.str() == "{\n}" )
with expansion:
"{
}"
==
"{
}"
-------------------------------------------------------------------------------
JsonWriter
Calling writeObject with key will create an object to write the value
-------------------------------------------------------------------------------
Json.tests.cpp:<line number>
...............................................................................
Json.tests.cpp:<line number>: PASSED:
REQUIRE_THAT( stream.str(), ContainsSubstring( "\"int\": 1," ) && ContainsSubstring( "\"double\": 1.5," ) && ContainsSubstring( "\"true\": true," ) && ContainsSubstring( "\"false\": false," ) && ContainsSubstring( "\"string\": \"this is a string\"," ) && ContainsSubstring( "\"array\": [\n 1,\n 2\n ]\n}" ) )
with expansion:
"{
"int": 1,
"double": 1.5,
"true": true,
"false": false,
"string": "this is a string",
"array": [
1,
2
]
}" ( contains: ""int": 1," and contains: ""double": 1.5," and contains:
""true": true," and contains: ""false": false," and contains: ""string":
"this is a string"," and contains: ""array": [
1,
2
]
}" )
-------------------------------------------------------------------------------
JsonWriter
nesting objects
-------------------------------------------------------------------------------
Json.tests.cpp:<line number>
...............................................................................
Json.tests.cpp:<line number>: PASSED:
REQUIRE_THAT( stream.str(), ContainsSubstring( "\"empty_object\": {\n }," ) && ContainsSubstring( "\"fully_object\": {\n \"key\": 1\n }" ) )
with expansion:
"{
"empty_object": {
},
"fully_object": {
"key": 1
}
}" ( contains: ""empty_object": {
}," and contains: ""fully_object": {
"key": 1
}" )
-------------------------------------------------------------------------------
JsonWriter
Calling writeArray will create an empty pair of braces
-------------------------------------------------------------------------------
Json.tests.cpp:<line number>
...............................................................................
Json.tests.cpp:<line number>: PASSED:
REQUIRE( stream.str() == "[\n]" )
with expansion:
"[
]"
==
"[
]"
-------------------------------------------------------------------------------
JsonWriter
Calling writeArray creates array to write the values to
-------------------------------------------------------------------------------
Json.tests.cpp:<line number>
...............................................................................
Json.tests.cpp:<line number>: PASSED:
REQUIRE( stream.str() == "[\n 1,\n 1.5,\n true,\n false,\n \"this is a string\",\n {\n \"object\": 42\n },\n [\n \"array\",\n 42.5\n ]\n]" )
with expansion:
"[
1,
1.5,
true,
false,
"this is a string",
{
"object": 42
},
[
"array",
42.5
]
]"
==
"[
1,
1.5,
true,
false,
"this is a string",
{
"object": 42
},
[
"array",
42.5
]
]"
-------------------------------------------------------------------------------
JsonWriter
Moved from JsonObjectWriter shall not insert superfluous brace
-------------------------------------------------------------------------------
Json.tests.cpp:<line number>
...............................................................................
Json.tests.cpp:<line number>: PASSED:
REQUIRE( stream.str() == "{\n}" )
with expansion:
"{
}"
==
"{
}"
-------------------------------------------------------------------------------
JsonWriter
Moved from JsonArrayWriter shall not insert superfluous bracket
-------------------------------------------------------------------------------
Json.tests.cpp:<line number>
...............................................................................
Json.tests.cpp:<line number>: PASSED:
REQUIRE( stream.str() == "[\n]" )
with expansion:
"[
]"
==
"[
]"
-------------------------------------------------------------------------------
JsonWriter
Custom class shall be quoted
-------------------------------------------------------------------------------
Json.tests.cpp:<line number>
...............................................................................
Json.tests.cpp:<line number>: PASSED:
REQUIRE( stream.str() == "\"custom\"" )
with expansion:
""custom"" == ""custom""
-------------------------------------------------------------------------------
JsonWriter
String with a quote shall be espaced
-------------------------------------------------------------------------------
Json.tests.cpp:<line number>
...............................................................................
Json.tests.cpp:<line number>: PASSED:
REQUIRE( stream.str() == "\"\\\"\"" )
with expansion:
""\""" == ""\"""
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
Lambdas in assertions Lambdas in assertions
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
@ -9754,6 +9943,129 @@ Reporter's write listings to provided stream
Reporters.tests.cpp:<line number> Reporters.tests.cpp:<line number>
............................................................................... ...............................................................................
Reporters.tests.cpp:<line number>: PASSED:
REQUIRE_FALSE( factories.empty() )
with expansion:
!false
-------------------------------------------------------------------------------
Reporter's write listings to provided stream
JSON reporter lists tags
-------------------------------------------------------------------------------
Reporters.tests.cpp:<line number>
...............................................................................
Reporters.tests.cpp:<line number>: PASSED:
REQUIRE_THAT( listingString, ContainsSubstring("fakeTag"s) )
with expansion:
"{
"version": 1,
"metadata": {
"name": "",
"rng-seed": 1234,
"catch2-version": "<version>"
},
"listings": {
"tags": [
{
"aliases": [
"fakeTag"
],
"count": 1
}
]" contains: "fakeTag"
with message:
Tested reporter: JSON
-------------------------------------------------------------------------------
Reporter's write listings to provided stream
-------------------------------------------------------------------------------
Reporters.tests.cpp:<line number>
...............................................................................
Reporters.tests.cpp:<line number>: PASSED:
REQUIRE_FALSE( factories.empty() )
with expansion:
!false
-------------------------------------------------------------------------------
Reporter's write listings to provided stream
JSON reporter lists reporters
-------------------------------------------------------------------------------
Reporters.tests.cpp:<line number>
...............................................................................
Reporters.tests.cpp:<line number>: PASSED:
REQUIRE_THAT( listingString, ContainsSubstring("fake reporter"s) )
with expansion:
"{
"version": 1,
"metadata": {
"name": "",
"rng-seed": 1234,
"catch2-version": "<version>"
},
"listings": {
"reporters": [
{
"name": "fake reporter",
"description": "fake description"
}
]" contains: "fake reporter"
with message:
Tested reporter: JSON
-------------------------------------------------------------------------------
Reporter's write listings to provided stream
-------------------------------------------------------------------------------
Reporters.tests.cpp:<line number>
...............................................................................
Reporters.tests.cpp:<line number>: PASSED:
REQUIRE_FALSE( factories.empty() )
with expansion:
!false
-------------------------------------------------------------------------------
Reporter's write listings to provided stream
JSON reporter lists tests
-------------------------------------------------------------------------------
Reporters.tests.cpp:<line number>
...............................................................................
Reporters.tests.cpp:<line number>: PASSED:
REQUIRE_THAT( listingString, ContainsSubstring( "fake test name"s ) && ContainsSubstring( "fakeTestTag"s ) )
with expansion:
"{
"version": 1,
"metadata": {
"name": "",
"rng-seed": 1234,
"catch2-version": "<version>"
},
"listings": {
"tests": [
{
"name": "fake test name",
"class-name": "",
"tags": [
"fakeTestTag"
],
"source-location": {
"filename": "fake-file.cpp",
"line": 123456789
}
}
]" ( contains: "fake test name" and contains: "fakeTestTag" )
with message:
Tested reporter: JSON
-------------------------------------------------------------------------------
Reporter's write listings to provided stream
-------------------------------------------------------------------------------
Reporters.tests.cpp:<line number>
...............................................................................
Reporters.tests.cpp:<line number>: PASSED: Reporters.tests.cpp:<line number>: PASSED:
REQUIRE_FALSE( factories.empty() ) REQUIRE_FALSE( factories.empty() )
with expansion: with expansion:
@ -18272,6 +18584,6 @@ Misc.tests.cpp:<line number>
Misc.tests.cpp:<line number>: PASSED: Misc.tests.cpp:<line number>: PASSED:
=============================================================================== ===============================================================================
test cases: 413 | 308 passed | 85 failed | 6 skipped | 14 failed as expected test cases: 414 | 309 passed | 85 failed | 6 skipped | 14 failed as expected
assertions: 2230 | 2049 passed | 146 failed | 35 failed as expected assertions: 2246 | 2065 passed | 146 failed | 35 failed as expected

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<testsuitesloose text artifact <testsuitesloose text artifact
> >
<testsuite name="<exe-name>" errors="17" failures="129" skipped="12" tests="2242" hostname="tbd" time="{duration}" timestamp="{iso8601-timestamp}"> <testsuite name="<exe-name>" errors="17" failures="129" skipped="12" tests="2258" hostname="tbd" time="{duration}" timestamp="{iso8601-timestamp}">
<properties> <properties>
<property name="random-seed" value="1"/> <property name="random-seed" value="1"/>
<property name="filters" value="&quot;*&quot; ~[!nonportable] ~[!benchmark] ~[approvals]"/> <property name="filters" value="&quot;*&quot; ~[!nonportable] ~[!benchmark] ~[approvals]"/>
@ -853,6 +853,16 @@ at Condition.tests.cpp:<line number>
</failure> </failure>
</testcase> </testcase>
<testcase classname="<exe-name>.global" name="Inequality checks that should succeed" time="{duration}" status="run"/> <testcase classname="<exe-name>.global" name="Inequality checks that should succeed" time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="JsonWriter/Newly constructed JsonWriter does nothing" time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="JsonWriter/Calling writeObject will create an empty pair of braces" time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="JsonWriter/Calling writeObject with key will create an object to write the value" time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="JsonWriter/nesting objects" time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="JsonWriter/Calling writeArray will create an empty pair of braces" time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="JsonWriter/Calling writeArray creates array to write the values to" time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="JsonWriter/Moved from JsonObjectWriter shall not insert superfluous brace" time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="JsonWriter/Moved from JsonArrayWriter shall not insert superfluous bracket" time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="JsonWriter/Custom class shall be quoted" time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="JsonWriter/String with a quote shall be espaced" time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="Lambdas in assertions" time="{duration}" status="run"/> <testcase classname="<exe-name>.global" name="Lambdas in assertions" time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="Less-than inequalities with different epsilons" time="{duration}" status="run"/> <testcase classname="<exe-name>.global" name="Less-than inequalities with different epsilons" time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="ManuallyRegistered" time="{duration}" status="run"/> <testcase classname="<exe-name>.global" name="ManuallyRegistered" time="{duration}" status="run"/>
@ -1190,6 +1200,9 @@ at Matchers.tests.cpp:<line number>
<testcase classname="<exe-name>.global" name="Reporter's write listings to provided stream/console reporter lists tags" time="{duration}" status="run"/> <testcase classname="<exe-name>.global" name="Reporter's write listings to provided stream/console reporter lists tags" time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="Reporter's write listings to provided stream/console reporter lists reporters" time="{duration}" status="run"/> <testcase classname="<exe-name>.global" name="Reporter's write listings to provided stream/console reporter lists reporters" time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="Reporter's write listings to provided stream/console reporter lists tests" time="{duration}" status="run"/> <testcase classname="<exe-name>.global" name="Reporter's write listings to provided stream/console reporter lists tests" time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="Reporter's write listings to provided stream/JSON reporter lists tags" time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="Reporter's write listings to provided stream/JSON reporter lists reporters" time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="Reporter's write listings to provided stream/JSON reporter lists tests" time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="Reporter's write listings to provided stream/JUnit reporter lists tags" time="{duration}" status="run"/> <testcase classname="<exe-name>.global" name="Reporter's write listings to provided stream/JUnit reporter lists tags" time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="Reporter's write listings to provided stream/JUnit reporter lists reporters" time="{duration}" status="run"/> <testcase classname="<exe-name>.global" name="Reporter's write listings to provided stream/JUnit reporter lists reporters" time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="Reporter's write listings to provided stream/JUnit reporter lists tests" time="{duration}" status="run"/> <testcase classname="<exe-name>.global" name="Reporter's write listings to provided stream/JUnit reporter lists tests" time="{duration}" status="run"/>

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<testsuites> <testsuites>
<testsuite name="<exe-name>" errors="17" failures="129" skipped="12" tests="2242" hostname="tbd" time="{duration}" timestamp="{iso8601-timestamp}"> <testsuite name="<exe-name>" errors="17" failures="129" skipped="12" tests="2258" hostname="tbd" time="{duration}" timestamp="{iso8601-timestamp}">
<properties> <properties>
<property name="random-seed" value="1"/> <property name="random-seed" value="1"/>
<property name="filters" value="&quot;*&quot; ~[!nonportable] ~[!benchmark] ~[approvals]"/> <property name="filters" value="&quot;*&quot; ~[!nonportable] ~[!benchmark] ~[approvals]"/>
@ -852,6 +852,16 @@ at Condition.tests.cpp:<line number>
</failure> </failure>
</testcase> </testcase>
<testcase classname="<exe-name>.global" name="Inequality checks that should succeed" time="{duration}" status="run"/> <testcase classname="<exe-name>.global" name="Inequality checks that should succeed" time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="JsonWriter/Newly constructed JsonWriter does nothing" time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="JsonWriter/Calling writeObject will create an empty pair of braces" time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="JsonWriter/Calling writeObject with key will create an object to write the value" time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="JsonWriter/nesting objects" time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="JsonWriter/Calling writeArray will create an empty pair of braces" time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="JsonWriter/Calling writeArray creates array to write the values to" time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="JsonWriter/Moved from JsonObjectWriter shall not insert superfluous brace" time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="JsonWriter/Moved from JsonArrayWriter shall not insert superfluous bracket" time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="JsonWriter/Custom class shall be quoted" time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="JsonWriter/String with a quote shall be espaced" time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="Lambdas in assertions" time="{duration}" status="run"/> <testcase classname="<exe-name>.global" name="Lambdas in assertions" time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="Less-than inequalities with different epsilons" time="{duration}" status="run"/> <testcase classname="<exe-name>.global" name="Less-than inequalities with different epsilons" time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="ManuallyRegistered" time="{duration}" status="run"/> <testcase classname="<exe-name>.global" name="ManuallyRegistered" time="{duration}" status="run"/>
@ -1189,6 +1199,9 @@ at Matchers.tests.cpp:<line number>
<testcase classname="<exe-name>.global" name="Reporter's write listings to provided stream/console reporter lists tags" time="{duration}" status="run"/> <testcase classname="<exe-name>.global" name="Reporter's write listings to provided stream/console reporter lists tags" time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="Reporter's write listings to provided stream/console reporter lists reporters" time="{duration}" status="run"/> <testcase classname="<exe-name>.global" name="Reporter's write listings to provided stream/console reporter lists reporters" time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="Reporter's write listings to provided stream/console reporter lists tests" time="{duration}" status="run"/> <testcase classname="<exe-name>.global" name="Reporter's write listings to provided stream/console reporter lists tests" time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="Reporter's write listings to provided stream/JSON reporter lists tags" time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="Reporter's write listings to provided stream/JSON reporter lists reporters" time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="Reporter's write listings to provided stream/JSON reporter lists tests" time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="Reporter's write listings to provided stream/JUnit reporter lists tags" time="{duration}" status="run"/> <testcase classname="<exe-name>.global" name="Reporter's write listings to provided stream/JUnit reporter lists tags" time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="Reporter's write listings to provided stream/JUnit reporter lists reporters" time="{duration}" status="run"/> <testcase classname="<exe-name>.global" name="Reporter's write listings to provided stream/JUnit reporter lists reporters" time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="Reporter's write listings to provided stream/JUnit reporter lists tests" time="{duration}" status="run"/> <testcase classname="<exe-name>.global" name="Reporter's write listings to provided stream/JUnit reporter lists tests" time="{duration}" status="run"/>

View File

@ -130,6 +130,18 @@ at AssertionHandler.tests.cpp:<line number>
<testCase name="warmup" duration="{duration}"/> <testCase name="warmup" duration="{duration}"/>
<testCase name="weighted_average_quantile" duration="{duration}"/> <testCase name="weighted_average_quantile" duration="{duration}"/>
</file> </file>
<file path="tests/<exe-name>/IntrospectiveTests/Json.tests.cpp">
<testCase name="JsonWriter/Newly constructed JsonWriter does nothing" duration="{duration}"/>
<testCase name="JsonWriter/Calling writeObject will create an empty pair of braces" duration="{duration}"/>
<testCase name="JsonWriter/Calling writeObject with key will create an object to write the value" duration="{duration}"/>
<testCase name="JsonWriter/nesting objects" duration="{duration}"/>
<testCase name="JsonWriter/Calling writeArray will create an empty pair of braces" duration="{duration}"/>
<testCase name="JsonWriter/Calling writeArray creates array to write the values to" duration="{duration}"/>
<testCase name="JsonWriter/Moved from JsonObjectWriter shall not insert superfluous brace" duration="{duration}"/>
<testCase name="JsonWriter/Moved from JsonArrayWriter shall not insert superfluous bracket" duration="{duration}"/>
<testCase name="JsonWriter/Custom class shall be quoted" duration="{duration}"/>
<testCase name="JsonWriter/String with a quote shall be espaced" duration="{duration}"/>
</file>
<file path="tests/<exe-name>/IntrospectiveTests/Parse.tests.cpp"> <file path="tests/<exe-name>/IntrospectiveTests/Parse.tests.cpp">
<testCase name="Parse uints/proper inputs" duration="{duration}"/> <testCase name="Parse uints/proper inputs" duration="{duration}"/>
<testCase name="Parse uints/Bad inputs" duration="{duration}"/> <testCase name="Parse uints/Bad inputs" duration="{duration}"/>
@ -178,6 +190,9 @@ at AssertionHandler.tests.cpp:<line number>
<testCase name="Reporter's write listings to provided stream/console reporter lists tags" duration="{duration}"/> <testCase name="Reporter's write listings to provided stream/console reporter lists tags" duration="{duration}"/>
<testCase name="Reporter's write listings to provided stream/console reporter lists reporters" duration="{duration}"/> <testCase name="Reporter's write listings to provided stream/console reporter lists reporters" duration="{duration}"/>
<testCase name="Reporter's write listings to provided stream/console reporter lists tests" duration="{duration}"/> <testCase name="Reporter's write listings to provided stream/console reporter lists tests" duration="{duration}"/>
<testCase name="Reporter's write listings to provided stream/JSON reporter lists tags" duration="{duration}"/>
<testCase name="Reporter's write listings to provided stream/JSON reporter lists reporters" duration="{duration}"/>
<testCase name="Reporter's write listings to provided stream/JSON reporter lists tests" duration="{duration}"/>
<testCase name="Reporter's write listings to provided stream/JUnit reporter lists tags" duration="{duration}"/> <testCase name="Reporter's write listings to provided stream/JUnit reporter lists tags" duration="{duration}"/>
<testCase name="Reporter's write listings to provided stream/JUnit reporter lists reporters" duration="{duration}"/> <testCase name="Reporter's write listings to provided stream/JUnit reporter lists reporters" duration="{duration}"/>
<testCase name="Reporter's write listings to provided stream/JUnit reporter lists tests" duration="{duration}"/> <testCase name="Reporter's write listings to provided stream/JUnit reporter lists tests" duration="{duration}"/>

View File

@ -129,6 +129,18 @@ at AssertionHandler.tests.cpp:<line number>
<testCase name="warmup" duration="{duration}"/> <testCase name="warmup" duration="{duration}"/>
<testCase name="weighted_average_quantile" duration="{duration}"/> <testCase name="weighted_average_quantile" duration="{duration}"/>
</file> </file>
<file path="tests/<exe-name>/IntrospectiveTests/Json.tests.cpp">
<testCase name="JsonWriter/Newly constructed JsonWriter does nothing" duration="{duration}"/>
<testCase name="JsonWriter/Calling writeObject will create an empty pair of braces" duration="{duration}"/>
<testCase name="JsonWriter/Calling writeObject with key will create an object to write the value" duration="{duration}"/>
<testCase name="JsonWriter/nesting objects" duration="{duration}"/>
<testCase name="JsonWriter/Calling writeArray will create an empty pair of braces" duration="{duration}"/>
<testCase name="JsonWriter/Calling writeArray creates array to write the values to" duration="{duration}"/>
<testCase name="JsonWriter/Moved from JsonObjectWriter shall not insert superfluous brace" duration="{duration}"/>
<testCase name="JsonWriter/Moved from JsonArrayWriter shall not insert superfluous bracket" duration="{duration}"/>
<testCase name="JsonWriter/Custom class shall be quoted" duration="{duration}"/>
<testCase name="JsonWriter/String with a quote shall be espaced" duration="{duration}"/>
</file>
<file path="tests/<exe-name>/IntrospectiveTests/Parse.tests.cpp"> <file path="tests/<exe-name>/IntrospectiveTests/Parse.tests.cpp">
<testCase name="Parse uints/proper inputs" duration="{duration}"/> <testCase name="Parse uints/proper inputs" duration="{duration}"/>
<testCase name="Parse uints/Bad inputs" duration="{duration}"/> <testCase name="Parse uints/Bad inputs" duration="{duration}"/>
@ -177,6 +189,9 @@ at AssertionHandler.tests.cpp:<line number>
<testCase name="Reporter's write listings to provided stream/console reporter lists tags" duration="{duration}"/> <testCase name="Reporter's write listings to provided stream/console reporter lists tags" duration="{duration}"/>
<testCase name="Reporter's write listings to provided stream/console reporter lists reporters" duration="{duration}"/> <testCase name="Reporter's write listings to provided stream/console reporter lists reporters" duration="{duration}"/>
<testCase name="Reporter's write listings to provided stream/console reporter lists tests" duration="{duration}"/> <testCase name="Reporter's write listings to provided stream/console reporter lists tests" duration="{duration}"/>
<testCase name="Reporter's write listings to provided stream/JSON reporter lists tags" duration="{duration}"/>
<testCase name="Reporter's write listings to provided stream/JSON reporter lists reporters" duration="{duration}"/>
<testCase name="Reporter's write listings to provided stream/JSON reporter lists tests" duration="{duration}"/>
<testCase name="Reporter's write listings to provided stream/JUnit reporter lists tags" duration="{duration}"/> <testCase name="Reporter's write listings to provided stream/JUnit reporter lists tags" duration="{duration}"/>
<testCase name="Reporter's write listings to provided stream/JUnit reporter lists reporters" duration="{duration}"/> <testCase name="Reporter's write listings to provided stream/JUnit reporter lists reporters" duration="{duration}"/>
<testCase name="Reporter's write listings to provided stream/JUnit reporter lists tests" duration="{duration}"/> <testCase name="Reporter's write listings to provided stream/JUnit reporter lists tests" duration="{duration}"/>

View File

@ -1866,6 +1866,26 @@ ok {test-number} - data.str_hello != "hell" for: "hello" != "hell"
ok {test-number} - data.str_hello != "hello1" for: "hello" != "hello1" ok {test-number} - data.str_hello != "hello1" for: "hello" != "hello1"
# Inequality checks that should succeed # Inequality checks that should succeed
ok {test-number} - data.str_hello.size() != 6 for: 5 != 6 ok {test-number} - data.str_hello.size() != 6 for: 5 != 6
# JsonWriter
ok {test-number} - stream.str() == "" for: "" == ""
# JsonWriter
ok {test-number} - stream.str() == "{\n}" for: "{ }" == "{ }"
# JsonWriter
ok {test-number} - stream.str(), ContainsSubstring( "\"int\": 1," ) && ContainsSubstring( "\"double\": 1.5," ) && ContainsSubstring( "\"true\": true," ) && ContainsSubstring( "\"false\": false," ) && ContainsSubstring( "\"string\": \"this is a string\"," ) && ContainsSubstring( "\"array\": [\n 1,\n 2\n ]\n}" ) for: "{ "int": 1, "double": 1.5, "true": true, "false": false, "string": "this is a string", "array": [ 1, 2 ] }" ( contains: ""int": 1," and contains: ""double": 1.5," and contains: ""true": true," and contains: ""false": false," and contains: ""string": "this is a string"," and contains: ""array": [ 1, 2 ] }" )
# JsonWriter
ok {test-number} - stream.str(), ContainsSubstring( "\"empty_object\": {\n }," ) && ContainsSubstring( "\"fully_object\": {\n \"key\": 1\n }" ) for: "{ "empty_object": { }, "fully_object": { "key": 1 } }" ( contains: ""empty_object": { }," and contains: ""fully_object": { "key": 1 }" )
# JsonWriter
ok {test-number} - stream.str() == "[\n]" for: "[ ]" == "[ ]"
# JsonWriter
ok {test-number} - stream.str() == "[\n 1,\n 1.5,\n true,\n false,\n \"this is a string\",\n {\n \"object\": 42\n },\n [\n \"array\",\n 42.5\n ]\n]" for: "[ 1, 1.5, true, false, "this is a string", { "object": 42 }, [ "array", 42.5 ] ]" == "[ 1, 1.5, true, false, "this is a string", { "object": 42 }, [ "array", 42.5 ] ]"
# JsonWriter
ok {test-number} - stream.str() == "{\n}" for: "{ }" == "{ }"
# JsonWriter
ok {test-number} - stream.str() == "[\n]" for: "[ ]" == "[ ]"
# JsonWriter
ok {test-number} - stream.str() == "\"custom\"" for: ""custom"" == ""custom""
# JsonWriter
ok {test-number} - stream.str() == "\"\\\"\"" for: ""\""" == ""\"""
# Lambdas in assertions # Lambdas in assertions
ok {test-number} - []() { return true; }() for: true ok {test-number} - []() { return true; }() for: true
# Less-than inequalities with different epsilons # Less-than inequalities with different epsilons
@ -2459,6 +2479,18 @@ ok {test-number} - listingString, ContainsSubstring( "fake test name"s ) && Cont
# Reporter's write listings to provided stream # Reporter's write listings to provided stream
ok {test-number} - !(factories.empty()) for: !false ok {test-number} - !(factories.empty()) for: !false
# Reporter's write listings to provided stream # Reporter's write listings to provided stream
ok {test-number} - listingString, ContainsSubstring("fakeTag"s) for: "{ "version": 1, "metadata": { "name": "", "rng-seed": 1234, "catch2-version": "<version>" }, "listings": { "tags": [ { "aliases": [ "fakeTag" ], "count": 1 } ]" contains: "fakeTag" with 1 message: 'Tested reporter: JSON'
# Reporter's write listings to provided stream
ok {test-number} - !(factories.empty()) for: !false
# Reporter's write listings to provided stream
ok {test-number} - listingString, ContainsSubstring("fake reporter"s) for: "{ "version": 1, "metadata": { "name": "", "rng-seed": 1234, "catch2-version": "<version>" }, "listings": { "reporters": [ { "name": "fake reporter", "description": "fake description" } ]" contains: "fake reporter" with 1 message: 'Tested reporter: JSON'
# Reporter's write listings to provided stream
ok {test-number} - !(factories.empty()) for: !false
# Reporter's write listings to provided stream
ok {test-number} - listingString, ContainsSubstring( "fake test name"s ) && ContainsSubstring( "fakeTestTag"s ) for: "{ "version": 1, "metadata": { "name": "", "rng-seed": 1234, "catch2-version": "<version>" }, "listings": { "tests": [ { "name": "fake test name", "class-name": "", "tags": [ "fakeTestTag" ], "source-location": { "filename": "fake-file.cpp", "line": 123456789 } } ]" ( contains: "fake test name" and contains: "fakeTestTag" ) with 1 message: 'Tested reporter: JSON'
# Reporter's write listings to provided stream
ok {test-number} - !(factories.empty()) for: !false
# Reporter's write listings to provided stream
ok {test-number} - listingString, ContainsSubstring("fakeTag"s) for: "<?xml version="1.0" encoding="UTF-8"?> All available tags: 1 [fakeTag] 1 tag " contains: "fakeTag" with 1 message: 'Tested reporter: JUnit' ok {test-number} - listingString, ContainsSubstring("fakeTag"s) for: "<?xml version="1.0" encoding="UTF-8"?> All available tags: 1 [fakeTag] 1 tag " contains: "fakeTag" with 1 message: 'Tested reporter: JUnit'
# Reporter's write listings to provided stream # Reporter's write listings to provided stream
ok {test-number} - !(factories.empty()) for: !false ok {test-number} - !(factories.empty()) for: !false
@ -4489,5 +4521,5 @@ ok {test-number} - q3 == 23. for: 23.0 == 23.0
ok {test-number} - ok {test-number} -
# xmlentitycheck # xmlentitycheck
ok {test-number} - ok {test-number} -
1..2242 1..2258

View File

@ -1864,6 +1864,26 @@ ok {test-number} - data.str_hello != "hell" for: "hello" != "hell"
ok {test-number} - data.str_hello != "hello1" for: "hello" != "hello1" ok {test-number} - data.str_hello != "hello1" for: "hello" != "hello1"
# Inequality checks that should succeed # Inequality checks that should succeed
ok {test-number} - data.str_hello.size() != 6 for: 5 != 6 ok {test-number} - data.str_hello.size() != 6 for: 5 != 6
# JsonWriter
ok {test-number} - stream.str() == "" for: "" == ""
# JsonWriter
ok {test-number} - stream.str() == "{\n}" for: "{ }" == "{ }"
# JsonWriter
ok {test-number} - stream.str(), ContainsSubstring( "\"int\": 1," ) && ContainsSubstring( "\"double\": 1.5," ) && ContainsSubstring( "\"true\": true," ) && ContainsSubstring( "\"false\": false," ) && ContainsSubstring( "\"string\": \"this is a string\"," ) && ContainsSubstring( "\"array\": [\n 1,\n 2\n ]\n}" ) for: "{ "int": 1, "double": 1.5, "true": true, "false": false, "string": "this is a string", "array": [ 1, 2 ] }" ( contains: ""int": 1," and contains: ""double": 1.5," and contains: ""true": true," and contains: ""false": false," and contains: ""string": "this is a string"," and contains: ""array": [ 1, 2 ] }" )
# JsonWriter
ok {test-number} - stream.str(), ContainsSubstring( "\"empty_object\": {\n }," ) && ContainsSubstring( "\"fully_object\": {\n \"key\": 1\n }" ) for: "{ "empty_object": { }, "fully_object": { "key": 1 } }" ( contains: ""empty_object": { }," and contains: ""fully_object": { "key": 1 }" )
# JsonWriter
ok {test-number} - stream.str() == "[\n]" for: "[ ]" == "[ ]"
# JsonWriter
ok {test-number} - stream.str() == "[\n 1,\n 1.5,\n true,\n false,\n \"this is a string\",\n {\n \"object\": 42\n },\n [\n \"array\",\n 42.5\n ]\n]" for: "[ 1, 1.5, true, false, "this is a string", { "object": 42 }, [ "array", 42.5 ] ]" == "[ 1, 1.5, true, false, "this is a string", { "object": 42 }, [ "array", 42.5 ] ]"
# JsonWriter
ok {test-number} - stream.str() == "{\n}" for: "{ }" == "{ }"
# JsonWriter
ok {test-number} - stream.str() == "[\n]" for: "[ ]" == "[ ]"
# JsonWriter
ok {test-number} - stream.str() == "\"custom\"" for: ""custom"" == ""custom""
# JsonWriter
ok {test-number} - stream.str() == "\"\\\"\"" for: ""\""" == ""\"""
# Lambdas in assertions # Lambdas in assertions
ok {test-number} - []() { return true; }() for: true ok {test-number} - []() { return true; }() for: true
# Less-than inequalities with different epsilons # Less-than inequalities with different epsilons
@ -2457,6 +2477,18 @@ ok {test-number} - listingString, ContainsSubstring( "fake test name"s ) && Cont
# Reporter's write listings to provided stream # Reporter's write listings to provided stream
ok {test-number} - !(factories.empty()) for: !false ok {test-number} - !(factories.empty()) for: !false
# Reporter's write listings to provided stream # Reporter's write listings to provided stream
ok {test-number} - listingString, ContainsSubstring("fakeTag"s) for: "{ "version": 1, "metadata": { "name": "", "rng-seed": 1234, "catch2-version": "<version>" }, "listings": { "tags": [ { "aliases": [ "fakeTag" ], "count": 1 } ]" contains: "fakeTag" with 1 message: 'Tested reporter: JSON'
# Reporter's write listings to provided stream
ok {test-number} - !(factories.empty()) for: !false
# Reporter's write listings to provided stream
ok {test-number} - listingString, ContainsSubstring("fake reporter"s) for: "{ "version": 1, "metadata": { "name": "", "rng-seed": 1234, "catch2-version": "<version>" }, "listings": { "reporters": [ { "name": "fake reporter", "description": "fake description" } ]" contains: "fake reporter" with 1 message: 'Tested reporter: JSON'
# Reporter's write listings to provided stream
ok {test-number} - !(factories.empty()) for: !false
# Reporter's write listings to provided stream
ok {test-number} - listingString, ContainsSubstring( "fake test name"s ) && ContainsSubstring( "fakeTestTag"s ) for: "{ "version": 1, "metadata": { "name": "", "rng-seed": 1234, "catch2-version": "<version>" }, "listings": { "tests": [ { "name": "fake test name", "class-name": "", "tags": [ "fakeTestTag" ], "source-location": { "filename": "fake-file.cpp", "line": 123456789 } } ]" ( contains: "fake test name" and contains: "fakeTestTag" ) with 1 message: 'Tested reporter: JSON'
# Reporter's write listings to provided stream
ok {test-number} - !(factories.empty()) for: !false
# Reporter's write listings to provided stream
ok {test-number} - listingString, ContainsSubstring("fakeTag"s) for: "<?xml version="1.0" encoding="UTF-8"?> All available tags: 1 [fakeTag] 1 tag " contains: "fakeTag" with 1 message: 'Tested reporter: JUnit' ok {test-number} - listingString, ContainsSubstring("fakeTag"s) for: "<?xml version="1.0" encoding="UTF-8"?> All available tags: 1 [fakeTag] 1 tag " contains: "fakeTag" with 1 message: 'Tested reporter: JUnit'
# Reporter's write listings to provided stream # Reporter's write listings to provided stream
ok {test-number} - !(factories.empty()) for: !false ok {test-number} - !(factories.empty()) for: !false
@ -4478,5 +4510,5 @@ ok {test-number} - q3 == 23. for: 23.0 == 23.0
ok {test-number} - ok {test-number} -
# xmlentitycheck # xmlentitycheck
ok {test-number} - ok {test-number} -
1..2242 1..2258

View File

@ -420,6 +420,8 @@
##teamcity[testFinished name='Inequality checks that should fail' duration="{duration}"] ##teamcity[testFinished name='Inequality checks that should fail' duration="{duration}"]
##teamcity[testStarted name='Inequality checks that should succeed'] ##teamcity[testStarted name='Inequality checks that should succeed']
##teamcity[testFinished name='Inequality checks that should succeed' duration="{duration}"] ##teamcity[testFinished name='Inequality checks that should succeed' duration="{duration}"]
##teamcity[testStarted name='JsonWriter']
##teamcity[testFinished name='JsonWriter' duration="{duration}"]
##teamcity[testStarted name='Lambdas in assertions'] ##teamcity[testStarted name='Lambdas in assertions']
##teamcity[testFinished name='Lambdas in assertions' duration="{duration}"] ##teamcity[testFinished name='Lambdas in assertions' duration="{duration}"]
##teamcity[testStarted name='Less-than inequalities with different epsilons'] ##teamcity[testStarted name='Less-than inequalities with different epsilons']

View File

@ -420,6 +420,8 @@
##teamcity[testFinished name='Inequality checks that should fail' duration="{duration}"] ##teamcity[testFinished name='Inequality checks that should fail' duration="{duration}"]
##teamcity[testStarted name='Inequality checks that should succeed'] ##teamcity[testStarted name='Inequality checks that should succeed']
##teamcity[testFinished name='Inequality checks that should succeed' duration="{duration}"] ##teamcity[testFinished name='Inequality checks that should succeed' duration="{duration}"]
##teamcity[testStarted name='JsonWriter']
##teamcity[testFinished name='JsonWriter' duration="{duration}"]
##teamcity[testStarted name='Lambdas in assertions'] ##teamcity[testStarted name='Lambdas in assertions']
##teamcity[testFinished name='Lambdas in assertions' duration="{duration}"] ##teamcity[testFinished name='Lambdas in assertions' duration="{duration}"]
##teamcity[testStarted name='Less-than inequalities with different epsilons'] ##teamcity[testStarted name='Less-than inequalities with different epsilons']

View File

@ -8779,6 +8779,186 @@ C
</Expression> </Expression>
<OverallResult success="true" skips="0"/> <OverallResult success="true" skips="0"/>
</TestCase> </TestCase>
<TestCase name="JsonWriter" tags="[JSON][JsonWriter]" filename="tests/<exe-name>/IntrospectiveTests/Json.tests.cpp" >
<Section name="Newly constructed JsonWriter does nothing" filename="tests/<exe-name>/IntrospectiveTests/Json.tests.cpp" >
<Expression success="true" type="REQUIRE" filename="tests/<exe-name>/IntrospectiveTests/Json.tests.cpp" >
<Original>
stream.str() == ""
</Original>
<Expanded>
"" == ""
</Expanded>
</Expression>
<OverallResults successes="1" failures="0" expectedFailures="0" skipped="false"/>
</Section>
<Section name="Calling writeObject will create an empty pair of braces" filename="tests/<exe-name>/IntrospectiveTests/Json.tests.cpp" >
<Expression success="true" type="REQUIRE" filename="tests/<exe-name>/IntrospectiveTests/Json.tests.cpp" >
<Original>
stream.str() == "{\n}"
</Original>
<Expanded>
"{
}"
==
"{
}"
</Expanded>
</Expression>
<OverallResults successes="1" failures="0" expectedFailures="0" skipped="false"/>
</Section>
<Section name="Calling writeObject with key will create an object to write the value" filename="tests/<exe-name>/IntrospectiveTests/Json.tests.cpp" >
<Expression success="true" type="REQUIRE_THAT" filename="tests/<exe-name>/IntrospectiveTests/Json.tests.cpp" >
<Original>
stream.str(), ContainsSubstring( "\"int\": 1," ) &amp;&amp; ContainsSubstring( "\"double\": 1.5," ) &amp;&amp; ContainsSubstring( "\"true\": true," ) &amp;&amp; ContainsSubstring( "\"false\": false," ) &amp;&amp; ContainsSubstring( "\"string\": \"this is a string\"," ) &amp;&amp; ContainsSubstring( "\"array\": [\n 1,\n 2\n ]\n}" )
</Original>
<Expanded>
"{
"int": 1,
"double": 1.5,
"true": true,
"false": false,
"string": "this is a string",
"array": [
1,
2
]
}" ( contains: ""int": 1," and contains: ""double": 1.5," and contains: ""true": true," and contains: ""false": false," and contains: ""string": "this is a string"," and contains: ""array": [
1,
2
]
}" )
</Expanded>
</Expression>
<OverallResults successes="1" failures="0" expectedFailures="0" skipped="false"/>
</Section>
<Section name="nesting objects" filename="tests/<exe-name>/IntrospectiveTests/Json.tests.cpp" >
<Expression success="true" type="REQUIRE_THAT" filename="tests/<exe-name>/IntrospectiveTests/Json.tests.cpp" >
<Original>
stream.str(), ContainsSubstring( "\"empty_object\": {\n }," ) &amp;&amp; ContainsSubstring( "\"fully_object\": {\n \"key\": 1\n }" )
</Original>
<Expanded>
"{
"empty_object": {
},
"fully_object": {
"key": 1
}
}" ( contains: ""empty_object": {
}," and contains: ""fully_object": {
"key": 1
}" )
</Expanded>
</Expression>
<OverallResults successes="1" failures="0" expectedFailures="0" skipped="false"/>
</Section>
<Section name="Calling writeArray will create an empty pair of braces" filename="tests/<exe-name>/IntrospectiveTests/Json.tests.cpp" >
<Expression success="true" type="REQUIRE" filename="tests/<exe-name>/IntrospectiveTests/Json.tests.cpp" >
<Original>
stream.str() == "[\n]"
</Original>
<Expanded>
"[
]"
==
"[
]"
</Expanded>
</Expression>
<OverallResults successes="1" failures="0" expectedFailures="0" skipped="false"/>
</Section>
<Section name="Calling writeArray creates array to write the values to" filename="tests/<exe-name>/IntrospectiveTests/Json.tests.cpp" >
<Expression success="true" type="REQUIRE" filename="tests/<exe-name>/IntrospectiveTests/Json.tests.cpp" >
<Original>
stream.str() == "[\n 1,\n 1.5,\n true,\n false,\n \"this is a string\",\n {\n \"object\": 42\n },\n [\n \"array\",\n 42.5\n ]\n]"
</Original>
<Expanded>
"[
1,
1.5,
true,
false,
"this is a string",
{
"object": 42
},
[
"array",
42.5
]
]"
==
"[
1,
1.5,
true,
false,
"this is a string",
{
"object": 42
},
[
"array",
42.5
]
]"
</Expanded>
</Expression>
<OverallResults successes="1" failures="0" expectedFailures="0" skipped="false"/>
</Section>
<Section name="Moved from JsonObjectWriter shall not insert superfluous brace" filename="tests/<exe-name>/IntrospectiveTests/Json.tests.cpp" >
<Expression success="true" type="REQUIRE" filename="tests/<exe-name>/IntrospectiveTests/Json.tests.cpp" >
<Original>
stream.str() == "{\n}"
</Original>
<Expanded>
"{
}"
==
"{
}"
</Expanded>
</Expression>
<OverallResults successes="1" failures="0" expectedFailures="0" skipped="false"/>
</Section>
<Section name="Moved from JsonArrayWriter shall not insert superfluous bracket" filename="tests/<exe-name>/IntrospectiveTests/Json.tests.cpp" >
<Expression success="true" type="REQUIRE" filename="tests/<exe-name>/IntrospectiveTests/Json.tests.cpp" >
<Original>
stream.str() == "[\n]"
</Original>
<Expanded>
"[
]"
==
"[
]"
</Expanded>
</Expression>
<OverallResults successes="1" failures="0" expectedFailures="0" skipped="false"/>
</Section>
<Section name="Custom class shall be quoted" filename="tests/<exe-name>/IntrospectiveTests/Json.tests.cpp" >
<Expression success="true" type="REQUIRE" filename="tests/<exe-name>/IntrospectiveTests/Json.tests.cpp" >
<Original>
stream.str() == "\"custom\""
</Original>
<Expanded>
""custom"" == ""custom""
</Expanded>
</Expression>
<OverallResults successes="1" failures="0" expectedFailures="0" skipped="false"/>
</Section>
<Section name="String with a quote shall be espaced" filename="tests/<exe-name>/IntrospectiveTests/Json.tests.cpp" >
<Expression success="true" type="REQUIRE" filename="tests/<exe-name>/IntrospectiveTests/Json.tests.cpp" >
<Original>
stream.str() == "\"\\\"\""
</Original>
<Expanded>
""\""" == ""\"""
</Expanded>
</Expression>
<OverallResults successes="1" failures="0" expectedFailures="0" skipped="false"/>
</Section>
<OverallResult success="true" skips="0"/>
</TestCase>
<TestCase name="Lambdas in assertions" filename="tests/<exe-name>/UsageTests/Compilation.tests.cpp" > <TestCase name="Lambdas in assertions" filename="tests/<exe-name>/UsageTests/Compilation.tests.cpp" >
<Expression success="true" type="REQUIRE" filename="tests/<exe-name>/UsageTests/Compilation.tests.cpp" > <Expression success="true" type="REQUIRE" filename="tests/<exe-name>/UsageTests/Compilation.tests.cpp" >
<Original> <Original>
@ -11695,6 +11875,120 @@ C
!false !false
</Expanded> </Expanded>
</Expression> </Expression>
<Section name="JSON reporter lists tags" filename="tests/<exe-name>/IntrospectiveTests/Reporters.tests.cpp" >
<Info filename="tests/<exe-name>/IntrospectiveTests/Reporters.tests.cpp" >
Tested reporter: JSON
</Info>
<Expression success="true" type="REQUIRE_THAT" filename="tests/<exe-name>/IntrospectiveTests/Reporters.tests.cpp" >
<Original>
listingString, ContainsSubstring("fakeTag"s)
</Original>
<Expanded>
"{
"version": 1,
"metadata": {
"name": "",
"rng-seed": 1234,
"catch2-version": "<version>"
},
"listings": {
"tags": [
{
"aliases": [
"fakeTag"
],
"count": 1
}
]" contains: "fakeTag"
</Expanded>
</Expression>
<OverallResults successes="1" failures="0" expectedFailures="0" skipped="false"/>
</Section>
<Expression success="true" type="REQUIRE_FALSE" filename="tests/<exe-name>/IntrospectiveTests/Reporters.tests.cpp" >
<Original>
!(factories.empty())
</Original>
<Expanded>
!false
</Expanded>
</Expression>
<Section name="JSON reporter lists reporters" filename="tests/<exe-name>/IntrospectiveTests/Reporters.tests.cpp" >
<Info filename="tests/<exe-name>/IntrospectiveTests/Reporters.tests.cpp" >
Tested reporter: JSON
</Info>
<Expression success="true" type="REQUIRE_THAT" filename="tests/<exe-name>/IntrospectiveTests/Reporters.tests.cpp" >
<Original>
listingString, ContainsSubstring("fake reporter"s)
</Original>
<Expanded>
"{
"version": 1,
"metadata": {
"name": "",
"rng-seed": 1234,
"catch2-version": "<version>"
},
"listings": {
"reporters": [
{
"name": "fake reporter",
"description": "fake description"
}
]" contains: "fake reporter"
</Expanded>
</Expression>
<OverallResults successes="1" failures="0" expectedFailures="0" skipped="false"/>
</Section>
<Expression success="true" type="REQUIRE_FALSE" filename="tests/<exe-name>/IntrospectiveTests/Reporters.tests.cpp" >
<Original>
!(factories.empty())
</Original>
<Expanded>
!false
</Expanded>
</Expression>
<Section name="JSON reporter lists tests" filename="tests/<exe-name>/IntrospectiveTests/Reporters.tests.cpp" >
<Info filename="tests/<exe-name>/IntrospectiveTests/Reporters.tests.cpp" >
Tested reporter: JSON
</Info>
<Expression success="true" type="REQUIRE_THAT" filename="tests/<exe-name>/IntrospectiveTests/Reporters.tests.cpp" >
<Original>
listingString, ContainsSubstring( "fake test name"s ) &amp;&amp; ContainsSubstring( "fakeTestTag"s )
</Original>
<Expanded>
"{
"version": 1,
"metadata": {
"name": "",
"rng-seed": 1234,
"catch2-version": "<version>"
},
"listings": {
"tests": [
{
"name": "fake test name",
"class-name": "",
"tags": [
"fakeTestTag"
],
"source-location": {
"filename": "fake-file.cpp",
"line": 123456789
}
}
]" ( contains: "fake test name" and contains: "fakeTestTag" )
</Expanded>
</Expression>
<OverallResults successes="1" failures="0" expectedFailures="0" skipped="false"/>
</Section>
<Expression success="true" type="REQUIRE_FALSE" filename="tests/<exe-name>/IntrospectiveTests/Reporters.tests.cpp" >
<Original>
!(factories.empty())
</Original>
<Expanded>
!false
</Expanded>
</Expression>
<Section name="JUnit reporter lists tags" filename="tests/<exe-name>/IntrospectiveTests/Reporters.tests.cpp" > <Section name="JUnit reporter lists tags" filename="tests/<exe-name>/IntrospectiveTests/Reporters.tests.cpp" >
<Info filename="tests/<exe-name>/IntrospectiveTests/Reporters.tests.cpp" > <Info filename="tests/<exe-name>/IntrospectiveTests/Reporters.tests.cpp" >
Tested reporter: JUnit Tested reporter: JUnit
@ -21268,6 +21562,6 @@ b1!
</Section> </Section>
<OverallResult success="true" skips="0"/> <OverallResult success="true" skips="0"/>
</TestCase> </TestCase>
<OverallResults successes="2049" failures="146" expectedFailures="35" skips="12"/> <OverallResults successes="2065" failures="146" expectedFailures="35" skips="12"/>
<OverallResultsCases successes="308" failures="85" expectedFailures="14" skips="6"/> <OverallResultsCases successes="309" failures="85" expectedFailures="14" skips="6"/>
</Catch2TestRun> </Catch2TestRun>

View File

@ -8779,6 +8779,186 @@ C
</Expression> </Expression>
<OverallResult success="true" skips="0"/> <OverallResult success="true" skips="0"/>
</TestCase> </TestCase>
<TestCase name="JsonWriter" tags="[JSON][JsonWriter]" filename="tests/<exe-name>/IntrospectiveTests/Json.tests.cpp" >
<Section name="Newly constructed JsonWriter does nothing" filename="tests/<exe-name>/IntrospectiveTests/Json.tests.cpp" >
<Expression success="true" type="REQUIRE" filename="tests/<exe-name>/IntrospectiveTests/Json.tests.cpp" >
<Original>
stream.str() == ""
</Original>
<Expanded>
"" == ""
</Expanded>
</Expression>
<OverallResults successes="1" failures="0" expectedFailures="0" skipped="false"/>
</Section>
<Section name="Calling writeObject will create an empty pair of braces" filename="tests/<exe-name>/IntrospectiveTests/Json.tests.cpp" >
<Expression success="true" type="REQUIRE" filename="tests/<exe-name>/IntrospectiveTests/Json.tests.cpp" >
<Original>
stream.str() == "{\n}"
</Original>
<Expanded>
"{
}"
==
"{
}"
</Expanded>
</Expression>
<OverallResults successes="1" failures="0" expectedFailures="0" skipped="false"/>
</Section>
<Section name="Calling writeObject with key will create an object to write the value" filename="tests/<exe-name>/IntrospectiveTests/Json.tests.cpp" >
<Expression success="true" type="REQUIRE_THAT" filename="tests/<exe-name>/IntrospectiveTests/Json.tests.cpp" >
<Original>
stream.str(), ContainsSubstring( "\"int\": 1," ) &amp;&amp; ContainsSubstring( "\"double\": 1.5," ) &amp;&amp; ContainsSubstring( "\"true\": true," ) &amp;&amp; ContainsSubstring( "\"false\": false," ) &amp;&amp; ContainsSubstring( "\"string\": \"this is a string\"," ) &amp;&amp; ContainsSubstring( "\"array\": [\n 1,\n 2\n ]\n}" )
</Original>
<Expanded>
"{
"int": 1,
"double": 1.5,
"true": true,
"false": false,
"string": "this is a string",
"array": [
1,
2
]
}" ( contains: ""int": 1," and contains: ""double": 1.5," and contains: ""true": true," and contains: ""false": false," and contains: ""string": "this is a string"," and contains: ""array": [
1,
2
]
}" )
</Expanded>
</Expression>
<OverallResults successes="1" failures="0" expectedFailures="0" skipped="false"/>
</Section>
<Section name="nesting objects" filename="tests/<exe-name>/IntrospectiveTests/Json.tests.cpp" >
<Expression success="true" type="REQUIRE_THAT" filename="tests/<exe-name>/IntrospectiveTests/Json.tests.cpp" >
<Original>
stream.str(), ContainsSubstring( "\"empty_object\": {\n }," ) &amp;&amp; ContainsSubstring( "\"fully_object\": {\n \"key\": 1\n }" )
</Original>
<Expanded>
"{
"empty_object": {
},
"fully_object": {
"key": 1
}
}" ( contains: ""empty_object": {
}," and contains: ""fully_object": {
"key": 1
}" )
</Expanded>
</Expression>
<OverallResults successes="1" failures="0" expectedFailures="0" skipped="false"/>
</Section>
<Section name="Calling writeArray will create an empty pair of braces" filename="tests/<exe-name>/IntrospectiveTests/Json.tests.cpp" >
<Expression success="true" type="REQUIRE" filename="tests/<exe-name>/IntrospectiveTests/Json.tests.cpp" >
<Original>
stream.str() == "[\n]"
</Original>
<Expanded>
"[
]"
==
"[
]"
</Expanded>
</Expression>
<OverallResults successes="1" failures="0" expectedFailures="0" skipped="false"/>
</Section>
<Section name="Calling writeArray creates array to write the values to" filename="tests/<exe-name>/IntrospectiveTests/Json.tests.cpp" >
<Expression success="true" type="REQUIRE" filename="tests/<exe-name>/IntrospectiveTests/Json.tests.cpp" >
<Original>
stream.str() == "[\n 1,\n 1.5,\n true,\n false,\n \"this is a string\",\n {\n \"object\": 42\n },\n [\n \"array\",\n 42.5\n ]\n]"
</Original>
<Expanded>
"[
1,
1.5,
true,
false,
"this is a string",
{
"object": 42
},
[
"array",
42.5
]
]"
==
"[
1,
1.5,
true,
false,
"this is a string",
{
"object": 42
},
[
"array",
42.5
]
]"
</Expanded>
</Expression>
<OverallResults successes="1" failures="0" expectedFailures="0" skipped="false"/>
</Section>
<Section name="Moved from JsonObjectWriter shall not insert superfluous brace" filename="tests/<exe-name>/IntrospectiveTests/Json.tests.cpp" >
<Expression success="true" type="REQUIRE" filename="tests/<exe-name>/IntrospectiveTests/Json.tests.cpp" >
<Original>
stream.str() == "{\n}"
</Original>
<Expanded>
"{
}"
==
"{
}"
</Expanded>
</Expression>
<OverallResults successes="1" failures="0" expectedFailures="0" skipped="false"/>
</Section>
<Section name="Moved from JsonArrayWriter shall not insert superfluous bracket" filename="tests/<exe-name>/IntrospectiveTests/Json.tests.cpp" >
<Expression success="true" type="REQUIRE" filename="tests/<exe-name>/IntrospectiveTests/Json.tests.cpp" >
<Original>
stream.str() == "[\n]"
</Original>
<Expanded>
"[
]"
==
"[
]"
</Expanded>
</Expression>
<OverallResults successes="1" failures="0" expectedFailures="0" skipped="false"/>
</Section>
<Section name="Custom class shall be quoted" filename="tests/<exe-name>/IntrospectiveTests/Json.tests.cpp" >
<Expression success="true" type="REQUIRE" filename="tests/<exe-name>/IntrospectiveTests/Json.tests.cpp" >
<Original>
stream.str() == "\"custom\""
</Original>
<Expanded>
""custom"" == ""custom""
</Expanded>
</Expression>
<OverallResults successes="1" failures="0" expectedFailures="0" skipped="false"/>
</Section>
<Section name="String with a quote shall be espaced" filename="tests/<exe-name>/IntrospectiveTests/Json.tests.cpp" >
<Expression success="true" type="REQUIRE" filename="tests/<exe-name>/IntrospectiveTests/Json.tests.cpp" >
<Original>
stream.str() == "\"\\\"\""
</Original>
<Expanded>
""\""" == ""\"""
</Expanded>
</Expression>
<OverallResults successes="1" failures="0" expectedFailures="0" skipped="false"/>
</Section>
<OverallResult success="true" skips="0"/>
</TestCase>
<TestCase name="Lambdas in assertions" filename="tests/<exe-name>/UsageTests/Compilation.tests.cpp" > <TestCase name="Lambdas in assertions" filename="tests/<exe-name>/UsageTests/Compilation.tests.cpp" >
<Expression success="true" type="REQUIRE" filename="tests/<exe-name>/UsageTests/Compilation.tests.cpp" > <Expression success="true" type="REQUIRE" filename="tests/<exe-name>/UsageTests/Compilation.tests.cpp" >
<Original> <Original>
@ -11695,6 +11875,120 @@ C
!false !false
</Expanded> </Expanded>
</Expression> </Expression>
<Section name="JSON reporter lists tags" filename="tests/<exe-name>/IntrospectiveTests/Reporters.tests.cpp" >
<Info filename="tests/<exe-name>/IntrospectiveTests/Reporters.tests.cpp" >
Tested reporter: JSON
</Info>
<Expression success="true" type="REQUIRE_THAT" filename="tests/<exe-name>/IntrospectiveTests/Reporters.tests.cpp" >
<Original>
listingString, ContainsSubstring("fakeTag"s)
</Original>
<Expanded>
"{
"version": 1,
"metadata": {
"name": "",
"rng-seed": 1234,
"catch2-version": "<version>"
},
"listings": {
"tags": [
{
"aliases": [
"fakeTag"
],
"count": 1
}
]" contains: "fakeTag"
</Expanded>
</Expression>
<OverallResults successes="1" failures="0" expectedFailures="0" skipped="false"/>
</Section>
<Expression success="true" type="REQUIRE_FALSE" filename="tests/<exe-name>/IntrospectiveTests/Reporters.tests.cpp" >
<Original>
!(factories.empty())
</Original>
<Expanded>
!false
</Expanded>
</Expression>
<Section name="JSON reporter lists reporters" filename="tests/<exe-name>/IntrospectiveTests/Reporters.tests.cpp" >
<Info filename="tests/<exe-name>/IntrospectiveTests/Reporters.tests.cpp" >
Tested reporter: JSON
</Info>
<Expression success="true" type="REQUIRE_THAT" filename="tests/<exe-name>/IntrospectiveTests/Reporters.tests.cpp" >
<Original>
listingString, ContainsSubstring("fake reporter"s)
</Original>
<Expanded>
"{
"version": 1,
"metadata": {
"name": "",
"rng-seed": 1234,
"catch2-version": "<version>"
},
"listings": {
"reporters": [
{
"name": "fake reporter",
"description": "fake description"
}
]" contains: "fake reporter"
</Expanded>
</Expression>
<OverallResults successes="1" failures="0" expectedFailures="0" skipped="false"/>
</Section>
<Expression success="true" type="REQUIRE_FALSE" filename="tests/<exe-name>/IntrospectiveTests/Reporters.tests.cpp" >
<Original>
!(factories.empty())
</Original>
<Expanded>
!false
</Expanded>
</Expression>
<Section name="JSON reporter lists tests" filename="tests/<exe-name>/IntrospectiveTests/Reporters.tests.cpp" >
<Info filename="tests/<exe-name>/IntrospectiveTests/Reporters.tests.cpp" >
Tested reporter: JSON
</Info>
<Expression success="true" type="REQUIRE_THAT" filename="tests/<exe-name>/IntrospectiveTests/Reporters.tests.cpp" >
<Original>
listingString, ContainsSubstring( "fake test name"s ) &amp;&amp; ContainsSubstring( "fakeTestTag"s )
</Original>
<Expanded>
"{
"version": 1,
"metadata": {
"name": "",
"rng-seed": 1234,
"catch2-version": "<version>"
},
"listings": {
"tests": [
{
"name": "fake test name",
"class-name": "",
"tags": [
"fakeTestTag"
],
"source-location": {
"filename": "fake-file.cpp",
"line": 123456789
}
}
]" ( contains: "fake test name" and contains: "fakeTestTag" )
</Expanded>
</Expression>
<OverallResults successes="1" failures="0" expectedFailures="0" skipped="false"/>
</Section>
<Expression success="true" type="REQUIRE_FALSE" filename="tests/<exe-name>/IntrospectiveTests/Reporters.tests.cpp" >
<Original>
!(factories.empty())
</Original>
<Expanded>
!false
</Expanded>
</Expression>
<Section name="JUnit reporter lists tags" filename="tests/<exe-name>/IntrospectiveTests/Reporters.tests.cpp" > <Section name="JUnit reporter lists tags" filename="tests/<exe-name>/IntrospectiveTests/Reporters.tests.cpp" >
<Info filename="tests/<exe-name>/IntrospectiveTests/Reporters.tests.cpp" > <Info filename="tests/<exe-name>/IntrospectiveTests/Reporters.tests.cpp" >
Tested reporter: JUnit Tested reporter: JUnit
@ -21267,6 +21561,6 @@ b1!
</Section> </Section>
<OverallResult success="true" skips="0"/> <OverallResult success="true" skips="0"/>
</TestCase> </TestCase>
<OverallResults successes="2049" failures="146" expectedFailures="35" skips="12"/> <OverallResults successes="2065" failures="146" expectedFailures="35" skips="12"/>
<OverallResultsCases successes="308" failures="85" expectedFailures="14" skips="6"/> <OverallResultsCases successes="309" failures="85" expectedFailures="14" skips="6"/>
</Catch2TestRun> </Catch2TestRun>

View File

@ -0,0 +1,116 @@
// Copyright Catch2 Authors
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE.txt or copy at
// https://www.boost.org/LICENSE_1_0.txt)
// SPDX-License-Identifier: BSL-1.0
#include <catch2/catch_test_macros.hpp>
#include <catch2/internal/catch_jsonwriter.hpp>
#include <catch2/matchers/catch_matchers_string.hpp>
#include <sstream>
namespace {
struct Custom {};
std::ostream& operator<<( std::ostream& os, Custom const& ) {
return os << "custom";
}
} // namespace
TEST_CASE( "JsonWriter", "[JSON][JsonWriter]" ) {
std::stringstream stream{};
SECTION( "Newly constructed JsonWriter does nothing" ) {
Catch::JsonValueWriter writer{ stream };
REQUIRE( stream.str() == "" );
}
SECTION( "Calling writeObject will create an empty pair of braces" ) {
{ auto writer = Catch::JsonValueWriter{ stream }.writeObject(); }
REQUIRE( stream.str() == "{\n}" );
}
SECTION( "Calling writeObject with key will create an object to write the "
"value" ) {
using Catch::Matchers::ContainsSubstring;
{
auto writer = Catch::JsonValueWriter{ stream }.writeObject();
writer.write( "int" ).write( 1 );
writer.write( "double" ).write( 1.5 );
writer.write( "true" ).write( true );
writer.write( "false" ).write( false );
writer.write( "string" ).write( "this is a string" );
writer.write( "array" ).writeArray().write( 1 ).write( 2 );
}
REQUIRE_THAT(
stream.str(),
ContainsSubstring( "\"int\": 1," ) &&
ContainsSubstring( "\"double\": 1.5," ) &&
ContainsSubstring( "\"true\": true," ) &&
ContainsSubstring( "\"false\": false," ) &&
ContainsSubstring( "\"string\": \"this is a string\"," ) &&
ContainsSubstring( "\"array\": [\n 1,\n 2\n ]\n}" ) );
}
SECTION( "nesting objects" ) {
using Catch::Matchers::ContainsSubstring;
{
auto writer = Catch::JsonValueWriter{ stream }.writeObject();
writer.write( "empty_object" ).writeObject();
writer.write( "fully_object" )
.writeObject()
.write( "key" )
.write( 1 );
}
REQUIRE_THAT( stream.str(),
ContainsSubstring( "\"empty_object\": {\n }," ) &&
ContainsSubstring(
"\"fully_object\": {\n \"key\": 1\n }" ) );
}
SECTION( "Calling writeArray will create an empty pair of braces" ) {
{ auto writer = Catch::JsonValueWriter{ stream }.writeArray(); }
REQUIRE( stream.str() == "[\n]" );
}
SECTION( "Calling writeArray creates array to write the values to" ) {
{
auto writer = Catch::JsonValueWriter{ stream }.writeArray();
writer.write( 1 );
writer.write( 1.5 );
writer.write( true );
writer.write( false );
writer.write( "this is a string" );
writer.writeObject().write( "object" ).write( 42 );
writer.writeArray().write( "array" ).write( 42.5 );
}
REQUIRE( stream.str() == "[\n 1,\n 1.5,\n true,\n false,\n \"this is a string\",\n {\n \"object\": 42\n },\n [\n \"array\",\n 42.5\n ]\n]" );
}
SECTION(
"Moved from JsonObjectWriter shall not insert superfluous brace" ) {
{
auto writer = Catch::JsonObjectWriter{ stream };
auto another_writer = std::move( writer );
}
REQUIRE( stream.str() == "{\n}" );
}
SECTION(
"Moved from JsonArrayWriter shall not insert superfluous bracket" ) {
{
auto writer = Catch::JsonArrayWriter{ stream };
auto another_writer = std::move( writer );
}
REQUIRE( stream.str() == "[\n]" );
}
SECTION( "Custom class shall be quoted" ) {
Catch::JsonValueWriter{ stream }.write( Custom{} );
REQUIRE( stream.str() == "\"custom\"" );
}
SECTION( "String with a quote shall be espaced" ) {
Catch::JsonValueWriter{ stream }.write( "\"" );
REQUIRE( stream.str() == "\"\\\"\"" );
}
}

View File

@ -109,7 +109,9 @@ TEST_CASE( "Reporter's write listings to provided stream", "[reporters]" ) {
auto sstream = Catch::Detail::make_unique<StringIStream>(); auto sstream = Catch::Detail::make_unique<StringIStream>();
auto& sstreamRef = *sstream.get(); auto& sstreamRef = *sstream.get();
Catch::Config config( Catch::ConfigData{} ); Catch::ConfigData cfg_data;
cfg_data.rngSeed = 1234;
Catch::Config config( cfg_data );
auto reporter = factory.second->create( Catch::ReporterConfig{ auto reporter = factory.second->create( Catch::ReporterConfig{
&config, CATCH_MOVE( sstream ), Catch::ColourMode::None, {} } ); &config, CATCH_MOVE( sstream ), Catch::ColourMode::None, {} } );