mirror of
https://github.com/SFML/SFML.git
synced 2024-12-01 07:41:05 +08:00
7bb97a85b1
While you can't easily run these unit tests, it's easy enough to still compile them so we don't need to go out of way to prohibit this. CMake has some support for running tests on the target OS so perhaps in the future we find a compelling way to run the test suite on a mobile OS.
95 lines
2.8 KiB
C++
95 lines
2.8 KiB
C++
#include <SFML/System/Angle.hpp>
|
|
#include <SFML/System/String.hpp>
|
|
#include <SFML/System/Time.hpp>
|
|
#include <SFML/System/Vector2.hpp>
|
|
#include <SFML/System/Vector3.hpp>
|
|
|
|
#include <catch2/catch_approx.hpp>
|
|
|
|
#include <SystemUtil.hpp>
|
|
#include <fstream>
|
|
#include <iomanip>
|
|
#include <limits>
|
|
|
|
#include <cassert>
|
|
|
|
|
|
namespace sf
|
|
{
|
|
void setStreamPrecision(std::ostream& os, int maxDigits10)
|
|
{
|
|
os << std::fixed << std::setprecision(maxDigits10);
|
|
}
|
|
|
|
std::ostream& operator<<(std::ostream& os, const Angle& angle)
|
|
{
|
|
setStreamPrecision(os, std::numeric_limits<float>::max_digits10);
|
|
return os << angle.asDegrees() << " deg";
|
|
}
|
|
|
|
std::ostream& operator<<(std::ostream& os, const String& string)
|
|
{
|
|
return os << string.toAnsiString();
|
|
}
|
|
|
|
std::ostream& operator<<(std::ostream& os, Time time)
|
|
{
|
|
return os << time.asMicroseconds() << "us";
|
|
}
|
|
|
|
template <typename T>
|
|
std::ostream& operator<<(std::ostream& os, const Vector2<T>& vector)
|
|
{
|
|
setStreamPrecision(os, std::numeric_limits<T>::max_digits10);
|
|
return os << "(" << vector.x << ", " << vector.y << ")";
|
|
}
|
|
|
|
template <typename T>
|
|
std::ostream& operator<<(std::ostream& os, const Vector3<T>& vector)
|
|
{
|
|
setStreamPrecision(os, std::numeric_limits<T>::max_digits10);
|
|
return os << "(" << vector.x << ", " << vector.y << ", " << vector.z << ")";
|
|
}
|
|
|
|
template std::ostream& operator<<(std::ostream&, const Vector2<int>&);
|
|
template std::ostream& operator<<(std::ostream&, const Vector2<unsigned int>&);
|
|
template std::ostream& operator<<(std::ostream&, const Vector2<float>&);
|
|
|
|
template std::ostream& operator<<(std::ostream&, const Vector3<int>&);
|
|
template std::ostream& operator<<(std::ostream&, const Vector3<unsigned int>&);
|
|
template std::ostream& operator<<(std::ostream&, const Vector3<float>&);
|
|
} // namespace sf
|
|
|
|
bool operator==(const float& lhs, const Approx<float>& rhs)
|
|
{
|
|
return static_cast<double>(lhs) == Catch::Approx(static_cast<double>(rhs.value)).margin(1e-5);
|
|
}
|
|
|
|
bool operator==(const sf::Vector2f& lhs, const Approx<sf::Vector2f>& rhs)
|
|
{
|
|
return (lhs - rhs.value).length() == Approx(0.f);
|
|
}
|
|
|
|
bool operator==(const sf::Vector3f& lhs, const Approx<sf::Vector3f>& rhs)
|
|
{
|
|
return (lhs - rhs.value).length() == Approx(0.f);
|
|
}
|
|
|
|
bool operator==(const sf::Angle& lhs, const Approx<sf::Angle>& rhs)
|
|
{
|
|
return lhs.asDegrees() == Approx(rhs.value.asDegrees());
|
|
}
|
|
|
|
std::vector<std::byte> loadIntoMemory(const std::filesystem::path& path)
|
|
{
|
|
std::ifstream file(path, std::ios::binary | std::ios::ate);
|
|
assert(file);
|
|
const auto size = file.tellg();
|
|
file.seekg(0, std::ios::beg);
|
|
std::vector<std::byte> buffer(static_cast<std::size_t>(size));
|
|
[[maybe_unused]] const auto& result = file.read(reinterpret_cast<char*>(buffer.data()),
|
|
static_cast<std::streamsize>(size));
|
|
assert(result);
|
|
return buffer;
|
|
}
|