Replace Catch with Doctest

This commit is contained in:
Vittorio Romeo 2021-12-24 14:31:27 +01:00 committed by Lukas Dürrenberger
parent ade9843dd8
commit 29983aa8d4
15 changed files with 6901 additions and 165 deletions

6750
extlibs/headers/doctest.h vendored Normal file

File diff suppressed because it is too large Load Diff

View File

@ -2,22 +2,10 @@ cmake_minimum_required(VERSION 3.14)
set(SRCROOT "${PROJECT_SOURCE_DIR}/test") set(SRCROOT "${PROJECT_SOURCE_DIR}/test")
include(FetchContent) add_library(sfml-test-main STATIC "${SRCROOT}/DoctestMain.cpp")
FetchContent_Declare(Catch2 target_include_directories(sfml-test-main PUBLIC "${PROJECT_SOURCE_DIR}/extlibs/headers" "${SRCROOT}/TestUtilities")
GIT_REPOSITORY "https://github.com/catchorg/Catch2.git"
GIT_TAG v2.13.7)
FetchContent_MakeAvailable(Catch2)
add_library(sfml-test-main STATIC "${SRCROOT}/CatchMain.cpp")
target_include_directories(sfml-test-main PUBLIC "${SRCROOT}/TestUtilities")
target_link_libraries(sfml-test-main PUBLIC Catch2::Catch2)
target_compile_features(sfml-test-main PRIVATE cxx_std_17) target_compile_features(sfml-test-main PRIVATE cxx_std_17)
# Work around MinGW struggling to process a file as large as catch.hpp
if(MINGW)
target_compile_options(sfml-test-main PUBLIC -Wa,-mbig-obj)
endif()
# System is always built # System is always built
SET(SYSTEM_SRC SET(SYSTEM_SRC
"${SRCROOT}/System/Time.cpp" "${SRCROOT}/System/Time.cpp"

View File

@ -1,2 +0,0 @@
#define CATCH_CONFIG_MAIN
#include <catch2/catch.hpp>

2
test/DoctestMain.cpp Normal file
View File

@ -0,0 +1,2 @@
#define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN
#include <doctest.h>

View File

@ -2,11 +2,11 @@
#include <SFML/System/Vector2.hpp> #include <SFML/System/Vector2.hpp>
#include "GraphicsUtil.hpp" #include "GraphicsUtil.hpp"
TEST_CASE("sf::Rect class template", "[graphics]") TEST_CASE("sf::Rect class template - [graphics]")
{ {
SECTION("Construction") SUBCASE("Construction")
{ {
SECTION("Default constructor") SUBCASE("Default constructor")
{ {
sf::IntRect rectangle; sf::IntRect rectangle;
CHECK(rectangle.left == 0); CHECK(rectangle.left == 0);
@ -15,7 +15,7 @@ TEST_CASE("sf::Rect class template", "[graphics]")
CHECK(rectangle.height == 0); CHECK(rectangle.height == 0);
} }
SECTION("(left, top, width, height) constructor") SUBCASE("(left, top, width, height) constructor")
{ {
sf::IntRect rectangle(1, 2, 3, 4); sf::IntRect rectangle(1, 2, 3, 4);
CHECK(rectangle.left == 1); CHECK(rectangle.left == 1);
@ -24,7 +24,7 @@ TEST_CASE("sf::Rect class template", "[graphics]")
CHECK(rectangle.height == 4); CHECK(rectangle.height == 4);
} }
SECTION("(Vector2, Vector2) constructor") SUBCASE("(Vector2, Vector2) constructor")
{ {
sf::Vector2i position(1, 2); sf::Vector2i position(1, 2);
sf::Vector2i dimension(3, 4); sf::Vector2i dimension(3, 4);
@ -36,7 +36,7 @@ TEST_CASE("sf::Rect class template", "[graphics]")
CHECK(rectangle.height == 4); CHECK(rectangle.height == 4);
} }
SECTION("Conversion constructor") SUBCASE("Conversion constructor")
{ {
sf::FloatRect sourceRectangle(1.0f, 2.0f, 3.0f, 4.0f); sf::FloatRect sourceRectangle(1.0f, 2.0f, 3.0f, 4.0f);
sf::IntRect rectangle(sourceRectangle); sf::IntRect rectangle(sourceRectangle);
@ -48,9 +48,9 @@ TEST_CASE("sf::Rect class template", "[graphics]")
} }
} }
SECTION("Containment") SUBCASE("Containment")
{ {
SECTION("contains(x, y)") SUBCASE("contains(x, y)")
{ {
sf::IntRect rectangle(0, 0, 10, 10); sf::IntRect rectangle(0, 0, 10, 10);
@ -64,7 +64,7 @@ TEST_CASE("sf::Rect class template", "[graphics]")
CHECK(rectangle.contains(15, 15) == false); CHECK(rectangle.contains(15, 15) == false);
} }
SECTION("contains(Vector2)") SUBCASE("contains(Vector2)")
{ {
sf::IntRect rectangle(0, 0, 10, 10); sf::IntRect rectangle(0, 0, 10, 10);
@ -79,9 +79,9 @@ TEST_CASE("sf::Rect class template", "[graphics]")
} }
} }
SECTION("Intersection") SUBCASE("Intersection")
{ {
SECTION("intersects(Rect)") SUBCASE("intersects(Rect)")
{ {
sf::IntRect rectangle(0, 0, 10, 10); sf::IntRect rectangle(0, 0, 10, 10);
sf::IntRect intersectingRectangle(5, 5, 10, 10); sf::IntRect intersectingRectangle(5, 5, 10, 10);
@ -91,7 +91,7 @@ TEST_CASE("sf::Rect class template", "[graphics]")
CHECK(rectangle.intersects(nonIntersectingRectangle) == false); CHECK(rectangle.intersects(nonIntersectingRectangle) == false);
} }
SECTION("intersects(Rect, Rect)") SUBCASE("intersects(Rect, Rect)")
{ {
sf::IntRect rectangle(0, 0, 10, 10); sf::IntRect rectangle(0, 0, 10, 10);
sf::IntRect intersectingRectangle(5, 5, 10, 10); sf::IntRect intersectingRectangle(5, 5, 10, 10);
@ -108,7 +108,7 @@ TEST_CASE("sf::Rect class template", "[graphics]")
} }
} }
SECTION("Comparison operations") SUBCASE("Comparison operations")
{ {
sf::IntRect firstRectangle(1, 3, 2, 5); sf::IntRect firstRectangle(1, 3, 2, 5);
sf::IntRect secondRectangle(1, 3, 2, 5); sf::IntRect secondRectangle(1, 3, 2, 5);

View File

@ -1,6 +1,6 @@
#include <SFML/Network.hpp> #include <SFML/Network.hpp>
#include <catch2/catch.hpp> #include <doctest.h>
#include <limits> #include <limits>
template <typename IntegerType> template <typename IntegerType>
@ -13,11 +13,11 @@ static void testPacketStreamOperators(IntegerType expected)
CHECK(expected == received); CHECK(expected == received);
} }
TEST_CASE("sf::Packet class", "[network]") TEST_CASE("sf::Packet class - [network]")
{ {
SECTION("Stream operators") SUBCASE("Stream operators")
{ {
SECTION("Int8") SUBCASE("Int8")
{ {
testPacketStreamOperators(sf::Int8(0)); testPacketStreamOperators(sf::Int8(0));
testPacketStreamOperators(sf::Int8(1)); testPacketStreamOperators(sf::Int8(1));
@ -25,7 +25,7 @@ TEST_CASE("sf::Packet class", "[network]")
testPacketStreamOperators(std::numeric_limits<sf::Int8>::max()); testPacketStreamOperators(std::numeric_limits<sf::Int8>::max());
} }
SECTION("Int16") SUBCASE("Int16")
{ {
testPacketStreamOperators(sf::Int16(0)); testPacketStreamOperators(sf::Int16(0));
testPacketStreamOperators(sf::Int16(1)); testPacketStreamOperators(sf::Int16(1));
@ -33,7 +33,7 @@ TEST_CASE("sf::Packet class", "[network]")
testPacketStreamOperators(std::numeric_limits<sf::Int16>::max()); testPacketStreamOperators(std::numeric_limits<sf::Int16>::max());
} }
SECTION("Int32") SUBCASE("Int32")
{ {
testPacketStreamOperators(sf::Int32(0)); testPacketStreamOperators(sf::Int32(0));
testPacketStreamOperators(sf::Int32(1)); testPacketStreamOperators(sf::Int32(1));
@ -41,7 +41,7 @@ TEST_CASE("sf::Packet class", "[network]")
testPacketStreamOperators(std::numeric_limits<sf::Int32>::max()); testPacketStreamOperators(std::numeric_limits<sf::Int32>::max());
} }
SECTION("Int64") SUBCASE("Int64")
{ {
testPacketStreamOperators(sf::Int64(0)); testPacketStreamOperators(sf::Int64(0));
testPacketStreamOperators(sf::Int64(1)); testPacketStreamOperators(sf::Int64(1));

View File

@ -1,6 +1,9 @@
#include <SFML/System/Time.hpp> #include <SFML/System/Time.hpp>
#include <catch2/catch.hpp> #include <ostream>
#include <doctest.h>
using doctest::Approx;
namespace sf namespace sf
{ {
@ -11,11 +14,11 @@ std::ostream& operator <<(std::ostream& os, const sf::Time& time)
} }
} }
TEST_CASE("sf::Time class", "[system]") TEST_CASE("sf::Time class - [system]")
{ {
SECTION("Construction") SUBCASE("Construction")
{ {
SECTION("Default constructor") SUBCASE("Default constructor")
{ {
const sf::Time time; const sf::Time time;
CHECK(time.asSeconds() == 0.0f); CHECK(time.asSeconds() == 0.0f);
@ -23,7 +26,7 @@ TEST_CASE("sf::Time class", "[system]")
CHECK(time.asMicroseconds() == 0); CHECK(time.asMicroseconds() == 0);
} }
SECTION("Construct from seconds") SUBCASE("Construct from seconds")
{ {
const sf::Time time = sf::seconds(123); const sf::Time time = sf::seconds(123);
CHECK(time.asSeconds() == 123.0f); CHECK(time.asSeconds() == 123.0f);
@ -31,8 +34,8 @@ TEST_CASE("sf::Time class", "[system]")
CHECK(time.asMicroseconds() == 123'000'000); CHECK(time.asMicroseconds() == 123'000'000);
CHECK(sf::seconds(1'000.0f).asMicroseconds() == 1'000'000'000); CHECK(sf::seconds(1'000.0f).asMicroseconds() == 1'000'000'000);
CHECK(sf::seconds(0.000002f).asMicroseconds() == Approx(2).margin(1)); CHECK(sf::seconds(0.000002f).asMicroseconds() == Approx(2).epsilon(1.f));
CHECK(sf::seconds(0.000001f).asMicroseconds() == Approx(1).margin(1)); CHECK(sf::seconds(0.000001f).asMicroseconds() == Approx(1).epsilon(1.f));
CHECK(sf::seconds(0.0000009f).asMicroseconds() == 0); CHECK(sf::seconds(0.0000009f).asMicroseconds() == 0);
CHECK(sf::seconds(0.0000001f).asMicroseconds() == 0); CHECK(sf::seconds(0.0000001f).asMicroseconds() == 0);
CHECK(sf::seconds(0.00000001f).asMicroseconds() == 0); CHECK(sf::seconds(0.00000001f).asMicroseconds() == 0);
@ -41,12 +44,12 @@ TEST_CASE("sf::Time class", "[system]")
CHECK(sf::seconds(-0.00000001f).asMicroseconds() == 0); CHECK(sf::seconds(-0.00000001f).asMicroseconds() == 0);
CHECK(sf::seconds(-0.0000001f).asMicroseconds() == 0); CHECK(sf::seconds(-0.0000001f).asMicroseconds() == 0);
CHECK(sf::seconds(-0.0000009f).asMicroseconds() == 0); CHECK(sf::seconds(-0.0000009f).asMicroseconds() == 0);
CHECK(sf::seconds(-0.000001f).asMicroseconds() == Approx(-1).margin(1)); CHECK(sf::seconds(-0.000001f).asMicroseconds() == Approx(-1).epsilon(1.f));
CHECK(sf::seconds(-0.000002f).asMicroseconds() == Approx(-2).margin(1)); CHECK(sf::seconds(-0.000002f).asMicroseconds() == Approx(-2).epsilon(1.f));
CHECK(sf::seconds(-1'000.0f).asMicroseconds() == -1'000'000'000); CHECK(sf::seconds(-1'000.0f).asMicroseconds() == -1'000'000'000);
} }
SECTION("Construct from milliseconds") SUBCASE("Construct from milliseconds")
{ {
const sf::Time time = sf::milliseconds(42); const sf::Time time = sf::milliseconds(42);
CHECK(time.asSeconds() == 0.042f); CHECK(time.asSeconds() == 0.042f);
@ -54,7 +57,7 @@ TEST_CASE("sf::Time class", "[system]")
CHECK(time.asMicroseconds() == 42'000); CHECK(time.asMicroseconds() == 42'000);
} }
SECTION("Construct from microseconds") SUBCASE("Construct from microseconds")
{ {
const sf::Time time = sf::microseconds(987654); const sf::Time time = sf::microseconds(987654);
CHECK(time.asSeconds() == 0.987654f); CHECK(time.asSeconds() == 0.987654f);
@ -63,16 +66,16 @@ TEST_CASE("sf::Time class", "[system]")
} }
} }
SECTION("Zero time") SUBCASE("Zero time")
{ {
CHECK(sf::Time::Zero.asSeconds() == 0.0f); CHECK(sf::Time::Zero.asSeconds() == 0.0f);
CHECK(sf::Time::Zero.asMilliseconds() == 0); CHECK(sf::Time::Zero.asMilliseconds() == 0);
CHECK(sf::Time::Zero.asMicroseconds() == 0); CHECK(sf::Time::Zero.asMicroseconds() == 0);
} }
SECTION("Operators") SUBCASE("Operators")
{ {
SECTION("operator==") SUBCASE("operator==")
{ {
CHECK(sf::Time() == sf::Time()); CHECK(sf::Time() == sf::Time());
CHECK(sf::seconds(1) == sf::seconds(1)); CHECK(sf::seconds(1) == sf::seconds(1));
@ -81,71 +84,71 @@ TEST_CASE("sf::Time class", "[system]")
CHECK(sf::seconds(0.5f) == sf::microseconds(500'000)); CHECK(sf::seconds(0.5f) == sf::microseconds(500'000));
} }
SECTION("operator!=") SUBCASE("operator!=")
{ {
CHECK(sf::seconds(10.12f) != sf::milliseconds(10'121)); CHECK(sf::seconds(10.12f) != sf::milliseconds(10'121));
CHECK(sf::microseconds(123'456) != sf::milliseconds(123)); CHECK(sf::microseconds(123'456) != sf::milliseconds(123));
} }
SECTION("operator<") SUBCASE("operator<")
{ {
CHECK(sf::seconds(54.999f) < sf::seconds(55)); CHECK(sf::seconds(54.999f) < sf::seconds(55));
CHECK(sf::microseconds(10) < sf::milliseconds(10)); CHECK(sf::microseconds(10) < sf::milliseconds(10));
CHECK(sf::milliseconds(1'000) < sf::microseconds(1'000'001)); CHECK(sf::milliseconds(1'000) < sf::microseconds(1'000'001));
} }
SECTION("operator>") SUBCASE("operator>")
{ {
CHECK(sf::seconds(55.001f) > sf::seconds(55)); CHECK(sf::seconds(55.001f) > sf::seconds(55));
CHECK(sf::microseconds(1) > sf::seconds(0.0000001f)); CHECK(sf::microseconds(1) > sf::seconds(0.0000001f));
CHECK(sf::microseconds(1'000'001) > sf::milliseconds(1'000)); CHECK(sf::microseconds(1'000'001) > sf::milliseconds(1'000));
} }
SECTION("operator<=") SUBCASE("operator<=")
{ {
CHECK(sf::milliseconds(100) <= sf::milliseconds(100)); CHECK(sf::milliseconds(100) <= sf::milliseconds(100));
CHECK(sf::seconds(0.0012f) <= sf::microseconds(1'201)); CHECK(sf::seconds(0.0012f) <= sf::microseconds(1'201));
} }
SECTION("operator>=") SUBCASE("operator>=")
{ {
CHECK(sf::milliseconds(100) >= sf::milliseconds(-100)); CHECK(sf::milliseconds(100) >= sf::milliseconds(-100));
CHECK(sf::microseconds(1'201) >= sf::seconds(0.0012f)); CHECK(sf::microseconds(1'201) >= sf::seconds(0.0012f));
} }
SECTION("operator-") SUBCASE("operator-")
{ {
CHECK(sf::seconds(-1) == -sf::seconds(1)); CHECK(sf::seconds(-1) == -sf::seconds(1));
CHECK(sf::microseconds(1'234) == -sf::microseconds(-1'234)); CHECK(sf::microseconds(1'234) == -sf::microseconds(-1'234));
} }
SECTION("operator+") SUBCASE("operator+")
{ {
CHECK(sf::seconds(1) + sf::seconds(1) == sf::seconds(2)); CHECK(sf::seconds(1) + sf::seconds(1) == sf::seconds(2));
CHECK(sf::milliseconds(400) + sf::microseconds(400) == sf::microseconds(400400)); CHECK(sf::milliseconds(400) + sf::microseconds(400) == sf::microseconds(400400));
} }
SECTION("operator+=") SUBCASE("operator+=")
{ {
sf::Time time = sf::seconds(1.5f); sf::Time time = sf::seconds(1.5f);
time += sf::seconds(1); time += sf::seconds(1);
CHECK(time == sf::seconds(2.5f)); CHECK(time == sf::seconds(2.5f));
} }
SECTION("operator-") SUBCASE("operator-")
{ {
CHECK(sf::seconds(1) - sf::seconds(1) == sf::seconds(0)); CHECK(sf::seconds(1) - sf::seconds(1) == sf::seconds(0));
CHECK(sf::milliseconds(400) - sf::microseconds(400) == sf::microseconds(399600)); CHECK(sf::milliseconds(400) - sf::microseconds(400) == sf::microseconds(399600));
} }
SECTION("operator-=") SUBCASE("operator-=")
{ {
sf::Time time = sf::seconds(1.5f); sf::Time time = sf::seconds(1.5f);
time -= sf::seconds(10); time -= sf::seconds(10);
CHECK(time == sf::seconds(-8.5f)); CHECK(time == sf::seconds(-8.5f));
} }
SECTION("operator*") SUBCASE("operator*")
{ {
CHECK(sf::seconds(1) * 2.0f == sf::seconds(2)); CHECK(sf::seconds(1) * 2.0f == sf::seconds(2));
CHECK(sf::seconds(12) * 0.5f == sf::seconds(6)); CHECK(sf::seconds(12) * 0.5f == sf::seconds(6));
@ -157,16 +160,16 @@ TEST_CASE("sf::Time class", "[system]")
CHECK(static_cast<sf::Int64>(2) * sf::seconds(42) == sf::seconds(84)); CHECK(static_cast<sf::Int64>(2) * sf::seconds(42) == sf::seconds(84));
} }
SECTION("operator*=") SUBCASE("operator*=")
{ {
sf::Time time = sf::milliseconds(420); sf::Time time = sf::milliseconds(420);
time *= static_cast<sf::Int64>(10); time *= static_cast<sf::Int64>(10);
CHECK(time == sf::milliseconds(4'200)); CHECK(time == sf::milliseconds(4'200));
time *= 0.1f; time *= 0.1f;
CHECK(time.asMicroseconds() == Approx(420'000).margin(1)); CHECK(time.asMicroseconds() == Approx(420'000).epsilon(0.1f));
} }
SECTION("operator/") SUBCASE("operator/")
{ {
CHECK(sf::seconds(1) / 2.0f == sf::seconds(0.5f)); CHECK(sf::seconds(1) / 2.0f == sf::seconds(0.5f));
CHECK(sf::seconds(12) / 0.5f == sf::seconds(24)); CHECK(sf::seconds(12) / 0.5f == sf::seconds(24));
@ -176,22 +179,22 @@ TEST_CASE("sf::Time class", "[system]")
CHECK(sf::milliseconds(10) / sf::microseconds(1) == Approx(10'000.0f).epsilon(1e-6f)); CHECK(sf::milliseconds(10) / sf::microseconds(1) == Approx(10'000.0f).epsilon(1e-6f));
} }
SECTION("operator/=") SUBCASE("operator/=")
{ {
sf::Time time = sf::milliseconds(420); sf::Time time = sf::milliseconds(420);
time /= static_cast<sf::Int64>(42); time /= static_cast<sf::Int64>(42);
CHECK(time == sf::milliseconds(10)); CHECK(time == sf::milliseconds(10));
time /= 10.0f; time /= 10.0f;
CHECK(time.asMicroseconds() == Approx(1'000).margin(1)); CHECK(time.asMicroseconds() == Approx(1'000).epsilon(0.1f));
} }
SECTION("operator%") SUBCASE("operator%")
{ {
CHECK(sf::seconds(10) % sf::seconds(3) == sf::seconds(1)); CHECK(sf::seconds(10) % sf::seconds(3) == sf::seconds(1));
CHECK(sf::milliseconds(100) % sf::microseconds(10) == sf::seconds(0)); CHECK(sf::milliseconds(100) % sf::microseconds(10) == sf::seconds(0));
} }
SECTION("operator%=") SUBCASE("operator%=")
{ {
sf::Time time = sf::milliseconds(100); sf::Time time = sf::milliseconds(100);
time %= sf::milliseconds(99); time %= sf::milliseconds(99);

View File

@ -4,25 +4,25 @@
// Use sf::Vector2i for tests. Test coverage is given, as there are no template specializations. // Use sf::Vector2i for tests. Test coverage is given, as there are no template specializations.
TEST_CASE("sf::Vector2 class template", "[system]") TEST_CASE("sf::Vector2 class template - [system]")
{ {
SECTION("Construction") SUBCASE("Construction")
{ {
SECTION("Default constructor") SUBCASE("Default constructor")
{ {
sf::Vector2i vector; sf::Vector2i vector;
CHECK(vector.x == 0); CHECK(vector.x == 0);
CHECK(vector.y == 0); CHECK(vector.y == 0);
} }
SECTION("(x, y) coordinate constructor") SUBCASE("(x, y) coordinate constructor")
{ {
sf::Vector2i vector(1, 2); sf::Vector2i vector(1, 2);
CHECK(vector.x == 1); CHECK(vector.x == 1);
CHECK(vector.y == 2); CHECK(vector.y == 2);
} }
SECTION("Conversion constructor") SUBCASE("Conversion constructor")
{ {
sf::Vector2f sourceVector(1.0f, 2.0f); sf::Vector2f sourceVector(1.0f, 2.0f);
sf::Vector2i vector(sourceVector); sf::Vector2i vector(sourceVector);
@ -32,9 +32,9 @@ TEST_CASE("sf::Vector2 class template", "[system]")
} }
} }
SECTION("Unary operations") SUBCASE("Unary operations")
{ {
SECTION("-vector") SUBCASE("-vector")
{ {
sf::Vector2i vector(1, 2); sf::Vector2i vector(1, 2);
sf::Vector2i negatedVector = -vector; sf::Vector2i negatedVector = -vector;
@ -44,12 +44,12 @@ TEST_CASE("sf::Vector2 class template", "[system]")
} }
} }
SECTION("Arithmetic operations between two vectors") SUBCASE("Arithmetic operations between two vectors")
{ {
sf::Vector2i firstVector(2, 5); sf::Vector2i firstVector(2, 5);
sf::Vector2i secondVector(8, 3); sf::Vector2i secondVector(8, 3);
SECTION("vector += vector") SUBCASE("vector += vector")
{ {
firstVector += secondVector; firstVector += secondVector;
@ -57,7 +57,7 @@ TEST_CASE("sf::Vector2 class template", "[system]")
CHECK(firstVector.y == 8); CHECK(firstVector.y == 8);
} }
SECTION("vector -= vector") SUBCASE("vector -= vector")
{ {
firstVector -= secondVector; firstVector -= secondVector;
@ -65,7 +65,7 @@ TEST_CASE("sf::Vector2 class template", "[system]")
CHECK(firstVector.y == 2); CHECK(firstVector.y == 2);
} }
SECTION("vector + vector") SUBCASE("vector + vector")
{ {
sf::Vector2i result = firstVector + secondVector; sf::Vector2i result = firstVector + secondVector;
@ -73,7 +73,7 @@ TEST_CASE("sf::Vector2 class template", "[system]")
CHECK(result.y == 8); CHECK(result.y == 8);
} }
SECTION("vector - vector") SUBCASE("vector - vector")
{ {
sf::Vector2i result = firstVector - secondVector; sf::Vector2i result = firstVector - secondVector;
@ -82,12 +82,12 @@ TEST_CASE("sf::Vector2 class template", "[system]")
} }
} }
SECTION("Arithmetic operations between vector and scalar value") SUBCASE("Arithmetic operations between vector and scalar value")
{ {
sf::Vector2i vector(26, 12); sf::Vector2i vector(26, 12);
int scalar = 2; int scalar = 2;
SECTION("vector * scalar") SUBCASE("vector * scalar")
{ {
sf::Vector2i result = vector * scalar; sf::Vector2i result = vector * scalar;
@ -95,7 +95,7 @@ TEST_CASE("sf::Vector2 class template", "[system]")
CHECK(result.y == 24); CHECK(result.y == 24);
} }
SECTION("scalar * vector") SUBCASE("scalar * vector")
{ {
sf::Vector2i result = scalar * vector; sf::Vector2i result = scalar * vector;
@ -103,7 +103,7 @@ TEST_CASE("sf::Vector2 class template", "[system]")
CHECK(result.y == 24); CHECK(result.y == 24);
} }
SECTION("vector *= scalar") SUBCASE("vector *= scalar")
{ {
vector *= scalar; vector *= scalar;
@ -111,7 +111,7 @@ TEST_CASE("sf::Vector2 class template", "[system]")
CHECK(vector.y == 24); CHECK(vector.y == 24);
} }
SECTION("vector / scalar") SUBCASE("vector / scalar")
{ {
sf::Vector2i result = vector / scalar; sf::Vector2i result = vector / scalar;
@ -119,7 +119,7 @@ TEST_CASE("sf::Vector2 class template", "[system]")
CHECK(result.y == 6); CHECK(result.y == 6);
} }
SECTION("vector /= scalar") SUBCASE("vector /= scalar")
{ {
vector /= scalar; vector /= scalar;
@ -128,30 +128,30 @@ TEST_CASE("sf::Vector2 class template", "[system]")
} }
} }
SECTION("Comparison operations (two equal and one different vector)") SUBCASE("Comparison operations (two equal and one different vector)")
{ {
sf::Vector2i firstEqualVector(1, 5); sf::Vector2i firstEqualVector(1, 5);
sf::Vector2i secondEqualVector(1, 5); sf::Vector2i secondEqualVector(1, 5);
sf::Vector2i differentVector(6, 9); sf::Vector2i differentVector(6, 9);
SECTION("vector == vector") SUBCASE("vector == vector")
{ {
CHECK(firstEqualVector == secondEqualVector); CHECK(firstEqualVector == secondEqualVector);
CHECK_FALSE(firstEqualVector == differentVector); CHECK_FALSE(firstEqualVector == differentVector);
} }
SECTION("vector != vector") SUBCASE("vector != vector")
{ {
CHECK(firstEqualVector != differentVector); CHECK(firstEqualVector != differentVector);
CHECK_FALSE(firstEqualVector != secondEqualVector); CHECK_FALSE(firstEqualVector != secondEqualVector);
} }
} }
SECTION("Structured bindings") SUBCASE("Structured bindings")
{ {
sf::Vector2i vector(1, 2); sf::Vector2i vector(1, 2);
SECTION("destructure by value") SUBCASE("destructure by value")
{ {
auto [x, y] = vector; auto [x, y] = vector;
@ -166,7 +166,7 @@ TEST_CASE("sf::Vector2 class template", "[system]")
CHECK(vector.x == 1); CHECK(vector.x == 1);
} }
SECTION("destructure by ref") SUBCASE("destructure by ref")
{ {
auto& [x, y] = vector; auto& [x, y] = vector;
@ -182,7 +182,7 @@ TEST_CASE("sf::Vector2 class template", "[system]")
} }
} }
SECTION("Constexpr support") SUBCASE("Constexpr support")
{ {
constexpr sf::Vector2i vector(1, 2); constexpr sf::Vector2i vector(1, 2);
static_assert(vector.x == 1); static_assert(vector.x == 1);

View File

@ -4,11 +4,11 @@
// Use sf::Vector3i for tests. Test coverage is given, as there are no template specializations. // Use sf::Vector3i for tests. Test coverage is given, as there are no template specializations.
TEST_CASE("sf::Vector3 class template", "[system]") TEST_CASE("sf::Vector3 class template - [system]")
{ {
SECTION("Construction") SUBCASE("Construction")
{ {
SECTION("Default constructor") SUBCASE("Default constructor")
{ {
sf::Vector3i vector; sf::Vector3i vector;
CHECK(vector.x == 0); CHECK(vector.x == 0);
@ -16,7 +16,7 @@ TEST_CASE("sf::Vector3 class template", "[system]")
CHECK(vector.z == 0); CHECK(vector.z == 0);
} }
SECTION("(x, y, z) coordinate constructor") SUBCASE("(x, y, z) coordinate constructor")
{ {
sf::Vector3i vector(1, 2, 3); sf::Vector3i vector(1, 2, 3);
CHECK(vector.x == 1); CHECK(vector.x == 1);
@ -24,7 +24,7 @@ TEST_CASE("sf::Vector3 class template", "[system]")
CHECK(vector.z == 3); CHECK(vector.z == 3);
} }
SECTION("Conversion constructor") SUBCASE("Conversion constructor")
{ {
sf::Vector3f sourceVector(1.0f, 2.0f, 3.0f); sf::Vector3f sourceVector(1.0f, 2.0f, 3.0f);
sf::Vector3i vector(sourceVector); sf::Vector3i vector(sourceVector);
@ -35,9 +35,9 @@ TEST_CASE("sf::Vector3 class template", "[system]")
} }
} }
SECTION("Unary operations") SUBCASE("Unary operations")
{ {
SECTION("-vector") SUBCASE("-vector")
{ {
sf::Vector3i vector(1, 2, 3); sf::Vector3i vector(1, 2, 3);
sf::Vector3i negatedVector = -vector; sf::Vector3i negatedVector = -vector;
@ -48,12 +48,12 @@ TEST_CASE("sf::Vector3 class template", "[system]")
} }
} }
SECTION("Arithmetic operations between two vectors") SUBCASE("Arithmetic operations between two vectors")
{ {
sf::Vector3i firstVector(2, 5, 6); sf::Vector3i firstVector(2, 5, 6);
sf::Vector3i secondVector(8, 3, 7); sf::Vector3i secondVector(8, 3, 7);
SECTION("vector += vector") SUBCASE("vector += vector")
{ {
firstVector += secondVector; firstVector += secondVector;
@ -62,7 +62,7 @@ TEST_CASE("sf::Vector3 class template", "[system]")
CHECK(firstVector.z == 13); CHECK(firstVector.z == 13);
} }
SECTION("vector -= vector") SUBCASE("vector -= vector")
{ {
firstVector -= secondVector; firstVector -= secondVector;
@ -71,7 +71,7 @@ TEST_CASE("sf::Vector3 class template", "[system]")
CHECK(firstVector.z == -1); CHECK(firstVector.z == -1);
} }
SECTION("vector + vector") SUBCASE("vector + vector")
{ {
sf::Vector3i result = firstVector + secondVector; sf::Vector3i result = firstVector + secondVector;
@ -80,7 +80,7 @@ TEST_CASE("sf::Vector3 class template", "[system]")
CHECK(result.z == 13); CHECK(result.z == 13);
} }
SECTION("vector - vector") SUBCASE("vector - vector")
{ {
sf::Vector3i result = firstVector - secondVector; sf::Vector3i result = firstVector - secondVector;
@ -90,12 +90,12 @@ TEST_CASE("sf::Vector3 class template", "[system]")
} }
} }
SECTION("Arithmetic operations between vector and scalar value") SUBCASE("Arithmetic operations between vector and scalar value")
{ {
sf::Vector3i vector(26, 12, 6); sf::Vector3i vector(26, 12, 6);
int scalar = 2; int scalar = 2;
SECTION("vector * scalar") SUBCASE("vector * scalar")
{ {
sf::Vector3i result = vector * scalar; sf::Vector3i result = vector * scalar;
@ -104,7 +104,7 @@ TEST_CASE("sf::Vector3 class template", "[system]")
CHECK(result.z == 12); CHECK(result.z == 12);
} }
SECTION("scalar * vector") SUBCASE("scalar * vector")
{ {
sf::Vector3i result = scalar * vector; sf::Vector3i result = scalar * vector;
@ -113,7 +113,7 @@ TEST_CASE("sf::Vector3 class template", "[system]")
CHECK(result.z == 12); CHECK(result.z == 12);
} }
SECTION("vector *= scalar") SUBCASE("vector *= scalar")
{ {
vector *= scalar; vector *= scalar;
@ -122,7 +122,7 @@ TEST_CASE("sf::Vector3 class template", "[system]")
CHECK(vector.z == 12); CHECK(vector.z == 12);
} }
SECTION("vector / scalar") SUBCASE("vector / scalar")
{ {
sf::Vector3i result = vector / scalar; sf::Vector3i result = vector / scalar;
@ -131,7 +131,7 @@ TEST_CASE("sf::Vector3 class template", "[system]")
CHECK(result.z == 3); CHECK(result.z == 3);
} }
SECTION("vector /= scalar") SUBCASE("vector /= scalar")
{ {
vector /= scalar; vector /= scalar;
@ -141,30 +141,30 @@ TEST_CASE("sf::Vector3 class template", "[system]")
} }
} }
SECTION("Comparison operations (two equal and one different vector)") SUBCASE("Comparison operations (two equal and one different vector)")
{ {
sf::Vector3i firstEqualVector(1, 5, 6); sf::Vector3i firstEqualVector(1, 5, 6);
sf::Vector3i secondEqualVector(1, 5, 6); sf::Vector3i secondEqualVector(1, 5, 6);
sf::Vector3i differentVector(6, 9, 7); sf::Vector3i differentVector(6, 9, 7);
SECTION("vector == vector") SUBCASE("vector == vector")
{ {
CHECK(firstEqualVector == secondEqualVector); CHECK(firstEqualVector == secondEqualVector);
CHECK_FALSE(firstEqualVector == differentVector); CHECK_FALSE(firstEqualVector == differentVector);
} }
SECTION("vector != vector") SUBCASE("vector != vector")
{ {
CHECK(firstEqualVector != differentVector); CHECK(firstEqualVector != differentVector);
CHECK_FALSE(firstEqualVector != secondEqualVector); CHECK_FALSE(firstEqualVector != secondEqualVector);
} }
} }
SECTION("Structured bindings") SUBCASE("Structured bindings")
{ {
sf::Vector3i vector(1, 2, 3); sf::Vector3i vector(1, 2, 3);
SECTION("destructure by value") SUBCASE("destructure by value")
{ {
auto [x, y, z] = vector; auto [x, y, z] = vector;
@ -180,7 +180,7 @@ TEST_CASE("sf::Vector3 class template", "[system]")
CHECK(vector.x == 1); CHECK(vector.x == 1);
} }
SECTION("destructure by ref") SUBCASE("destructure by ref")
{ {
auto& [x, y, z] = vector; auto& [x, y, z] = vector;
@ -197,7 +197,7 @@ TEST_CASE("sf::Vector3 class template", "[system]")
} }
} }
SECTION("Constexpr support") SUBCASE("Constexpr support")
{ {
constexpr sf::Vector3i vector(1, 2, 3); constexpr sf::Vector3i vector(1, 2, 3);
static_assert(vector.x == 1); static_assert(vector.x == 1);

View File

@ -1,11 +1,11 @@
// Note: No need to increase compile time by including TestUtilities/Graphics.hpp // Note: No need to increase compile time by including TestUtilities/Graphics.hpp
#include <SFML/Graphics/Color.hpp> #include <SFML/Graphics/Color.hpp>
#include <sstream> #include <sstream>
#include <doctest.h>
// String conversions for Catch framework namespace sf
namespace Catch
{ {
std::string toString(const sf::Color& color) doctest::String toString(const sf::Color& color)
{ {
std::ostringstream stream; std::ostringstream stream;
stream << "0x" << std::hex << color.toInteger() << std::dec stream << "0x" << std::hex << color.toInteger() << std::dec
@ -14,6 +14,6 @@ namespace Catch
<< ", b=" << static_cast<int>(color.b) << ", b=" << static_cast<int>(color.b)
<< ", a=" << static_cast<int>(color.a) << ")"; << ", a=" << static_cast<int>(color.a) << ")";
return stream.str(); return stream.str().c_str();
} }
} }

View File

@ -1,23 +1,22 @@
// Header for SFML unit tests. // Header for SFML unit tests.
// //
// For a new graphics module test case, include this header and not <catch.hpp> directly. // For a new graphics module test case, include this header and not <doctest.h> directly.
// This ensures that string conversions are visible and can be used by Catch for debug output. // This ensures that string conversions are visible and can be used by doctest for debug output.
#ifndef SFML_TESTUTILITIES_GRAPHICS_HPP #ifndef SFML_TESTUTILITIES_GRAPHICS_HPP
#define SFML_TESTUTILITIES_GRAPHICS_HPP #define SFML_TESTUTILITIES_GRAPHICS_HPP
#include "WindowUtil.hpp" #include "WindowUtil.hpp"
// Forward declarations for non-template types namespace doctest
{
class String;
}
namespace sf namespace sf
{ {
class Color; class Color;
} doctest::String toString(const Color& color);
// String conversions for Catch framework
namespace Catch
{
std::string toString(const sf::Color& color);
} }
#endif // SFML_TESTUTILITIES_GRAPHICS_HPP #endif // SFML_TESTUTILITIES_GRAPHICS_HPP

View File

@ -3,18 +3,19 @@
#include <SFML/System/Time.hpp> #include <SFML/System/Time.hpp>
#include <sstream> #include <sstream>
// String conversions for Catch framework #include <doctest.h>
namespace Catch
namespace sf
{ {
std::string toString(const sf::String& string) doctest::String toString(const sf::String& string)
{ {
return string.toAnsiString(); return string.toAnsiString().c_str();
} }
std::string toString(sf::Time time) doctest::String toString(sf::Time time)
{ {
std::ostringstream stream; std::ostringstream stream;
stream << time.asMicroseconds() << "us"; stream << time.asMicroseconds() << "us";
return stream.str(); return stream.str().c_str();
} }
} }

View File

@ -1,44 +1,40 @@
// Header for SFML unit tests. // Header for SFML unit tests.
// //
// For a new system module test case, include this header and not <catch.hpp> directly. // For a new system module test case, include this header and not <doctest.h> directly.
// This ensures that string conversions are visible and can be used by Catch for debug output. // This ensures that string conversions are visible and can be used by doctest for debug output.
#ifndef SFML_TESTUTILITIES_SYSTEM_HPP #ifndef SFML_TESTUTILITIES_SYSTEM_HPP
#define SFML_TESTUTILITIES_SYSTEM_HPP #define SFML_TESTUTILITIES_SYSTEM_HPP
#include <catch2/catch.hpp> #include <doctest.h>
#include <SFML/System/Vector2.hpp> #include <SFML/System/Vector2.hpp>
#include <SFML/System/Vector3.hpp> #include <SFML/System/Vector3.hpp>
#include <sstream> #include <sstream>
// Forward declarations for non-template types // String conversions for doctest framework
namespace sf namespace sf
{ {
class String; class String;
class Time; class Time;
}
// String conversions for Catch framework doctest::String toString(const sf::String& string);
namespace Catch doctest::String toString(sf::Time time);
{
std::string toString(const sf::String& string);
std::string toString(sf::Time time);
template <typename T> template <typename T>
std::string toString(const sf::Vector2<T>& vector) doctest::String toString(const sf::Vector2<T>& vector)
{ {
std::ostringstream stream; std::ostringstream stream;
stream << "(" << vector.x << ", " << vector.y << ")"; stream << "(" << vector.x << ", " << vector.y << ")";
return stream.str(); return stream.str().c_str();
} }
template <typename T> template <typename T>
std::string toString(const sf::Vector3<T>& vector) doctest::String toString(const sf::Vector3<T>& vector)
{ {
std::ostringstream stream; std::ostringstream stream;
stream << "(" << vector.x << ", " << vector.y << ", " << vector.z << ")"; stream << "(" << vector.x << ", " << vector.y << ", " << vector.z << ")";
return stream.str(); return stream.str().c_str();
} }
} }

View File

@ -2,13 +2,14 @@
#include <SFML/Window/VideoMode.hpp> #include <SFML/Window/VideoMode.hpp>
#include <sstream> #include <sstream>
// String conversions for Catch framework #include <doctest.h>
namespace Catch
namespace sf
{ {
std::string toString(const sf::VideoMode& videoMode) doctest::String toString(const sf::VideoMode& videoMode)
{ {
std::ostringstream stream; std::ostringstream stream;
stream << videoMode.width << "x" << videoMode.height << "x" << videoMode.bitsPerPixel; stream << videoMode.width << "x" << videoMode.height << "x" << videoMode.bitsPerPixel;
return stream.str(); return stream.str().c_str();
} }
} }

View File

@ -1,7 +1,7 @@
// Header for SFML unit tests. // Header for SFML unit tests.
// //
// For a new window module test case, include this header and not <catch.hpp> directly. // For a new window module test case, include this header and not <doctest.h> directly.
// This ensures that string conversions are visible and can be used by Catch for debug output. // This ensures that string conversions are visible and can be used by doctest for debug output.
#ifndef SFML_TESTUTILITIES_WINDOW_HPP #ifndef SFML_TESTUTILITIES_WINDOW_HPP
#define SFML_TESTUTILITIES_WINDOW_HPP #define SFML_TESTUTILITIES_WINDOW_HPP
@ -10,23 +10,21 @@
#include <SFML/Graphics/Rect.hpp> #include <SFML/Graphics/Rect.hpp>
// Forward declarations for non-template types #include <doctest.h>
// String conversions for doctest framework
namespace sf namespace sf
{ {
class VideoMode; class VideoMode;
}
// String conversions for Catch framework doctest::String toString(const sf::VideoMode& videoMode);
namespace Catch
{
std::string toString(const sf::VideoMode& videoMode);
template <typename T> template <typename T>
std::string toString(const sf::Rect<T>& rect) doctest::String toString(const sf::Rect<T>& rect)
{ {
std::ostringstream stream; std::ostringstream stream;
stream << "(left=" << rect.left << ", top=" << rect.top << ", width=" << rect.width << ", height=" << rect.height << ")"; stream << "(left=" << rect.left << ", top=" << rect.top << ", width=" << rect.width << ", height=" << rect.height << ")";
return stream.str(); return stream.str().c_str();
} }
} }