mirror of
https://github.com/libretro/easyrpg-libretro.git
synced 2026-11-09 17:23:09 -10:00
354 lines
7.1 KiB
C++
354 lines
7.1 KiB
C++
#include <cassert>
|
|
#include <cstdlib>
|
|
#include "utils.h"
|
|
#include "drawable_list.h"
|
|
#include "drawable_mgr.h"
|
|
#include "bitmap.h"
|
|
#include "doctest.h"
|
|
|
|
TEST_SUITE_BEGIN("DrawableList");
|
|
|
|
namespace {
|
|
|
|
class TestSprite : public Drawable {
|
|
public:
|
|
TestSprite(int z = 0) : Drawable(z, Drawable::Flags::Global) {}
|
|
void Draw(Bitmap&) override {}
|
|
};
|
|
|
|
class TestFrame : public Drawable {
|
|
public:
|
|
TestFrame(int z = 0) : Drawable(z, Drawable::Flags::Global | Drawable::Flags::Shared) {}
|
|
void Draw(Bitmap&) override {}
|
|
};
|
|
|
|
}
|
|
|
|
TEST_CASE("Default") {
|
|
DrawableList list;
|
|
|
|
REQUIRE_EQ(list.IsDirty(), false);
|
|
REQUIRE_EQ(list.begin(), list.end());
|
|
REQUIRE_EQ(list.size(), 0L);
|
|
REQUIRE(list.empty());
|
|
}
|
|
|
|
TEST_CASE("DirtyDraw") {
|
|
Bitmap::SetFormat(format_R8G8B8A8_a().format());
|
|
Bitmap bitmap(16, 16, false);
|
|
|
|
DrawableList list;
|
|
|
|
REQUIRE_EQ(list.IsDirty(), false);
|
|
REQUIRE_EQ(list.IsSorted(), true);
|
|
|
|
list.SetDirty();
|
|
REQUIRE_EQ(list.IsDirty(), true);
|
|
REQUIRE_EQ(list.IsSorted(), true);
|
|
|
|
list.Draw(bitmap);
|
|
REQUIRE_EQ(list.IsDirty(), false);
|
|
REQUIRE_EQ(list.IsSorted(), true);
|
|
|
|
list.Draw(bitmap);
|
|
REQUIRE_EQ(list.IsDirty(), false);
|
|
REQUIRE_EQ(list.IsSorted(), true);
|
|
}
|
|
|
|
template <typename F>
|
|
void testAppend(F&& f) {
|
|
DrawableList default_list;
|
|
DrawableMgr::SetLocalList(&default_list);
|
|
|
|
DrawableList list;
|
|
|
|
TestSprite s1(5);
|
|
TestSprite s2(3);
|
|
|
|
REQUIRE_EQ(list.size(), 0L);
|
|
REQUIRE(list.empty());
|
|
REQUIRE_EQ(list.begin(), list.end());
|
|
REQUIRE_EQ(list.IsSorted(), true);
|
|
REQUIRE_FALSE(list.IsDirty());
|
|
|
|
list.Append(&s1);
|
|
REQUIRE_EQ(list.size(), 1L);
|
|
REQUIRE_FALSE(list.empty());
|
|
REQUIRE_NE(list.begin(), list.end());
|
|
REQUIRE_EQ(*list.begin(), &s1);
|
|
REQUIRE_EQ(list.IsSorted(), true);
|
|
REQUIRE_FALSE(list.IsDirty());
|
|
|
|
list.Append(&s2);
|
|
REQUIRE_EQ(list.size(), 2L);
|
|
REQUIRE_FALSE(list.empty());
|
|
REQUIRE_NE(list.begin(), list.end());
|
|
REQUIRE_EQ(*list.begin(), &s1);
|
|
REQUIRE_EQ(*(list.begin() + 1), &s2);
|
|
REQUIRE_EQ(list.IsSorted(), false);
|
|
REQUIRE(list.IsDirty());
|
|
|
|
f(list);
|
|
|
|
REQUIRE_EQ(list.size(), 2L);
|
|
REQUIRE_FALSE(list.empty());
|
|
REQUIRE_NE(list.begin(), list.end());
|
|
REQUIRE_EQ(*list.begin(), &s2);
|
|
REQUIRE_EQ(*(list.begin() + 1), &s1);
|
|
REQUIRE_EQ(list.IsSorted(), true);
|
|
REQUIRE_FALSE(list.IsDirty());
|
|
}
|
|
|
|
TEST_CASE("AppendSort") {
|
|
testAppend([](auto& list) { list.Sort(); });
|
|
}
|
|
|
|
TEST_CASE("AppendDraw") {
|
|
Bitmap::SetFormat(format_R8G8B8A8_a().format());
|
|
Bitmap bitmap(16, 16, false);
|
|
|
|
testAppend([&](auto& list) { list.Draw(bitmap); });
|
|
}
|
|
|
|
TEST_CASE("AppendUnSorted") {
|
|
DrawableList default_list;
|
|
DrawableMgr::SetLocalList(&default_list);
|
|
|
|
DrawableList list;
|
|
|
|
TestSprite s1(2);
|
|
TestSprite s2(1);
|
|
|
|
REQUIRE_EQ(list.IsSorted(), true);
|
|
REQUIRE_FALSE(list.IsDirty());
|
|
|
|
list.Append(&s1);
|
|
REQUIRE_EQ(list.IsSorted(), true);
|
|
REQUIRE_FALSE(list.IsDirty());
|
|
|
|
list.Append(&s2);
|
|
REQUIRE_EQ(list.IsSorted(), false);
|
|
REQUIRE(list.IsDirty());
|
|
|
|
list.Clear();
|
|
REQUIRE(list.empty());
|
|
REQUIRE_EQ(list.IsSorted(), true);
|
|
REQUIRE_FALSE(list.IsDirty());
|
|
}
|
|
|
|
TEST_CASE("AppendSorted") {
|
|
DrawableList default_list;
|
|
DrawableMgr::SetLocalList(&default_list);
|
|
|
|
DrawableList list;
|
|
|
|
TestSprite s1(1);
|
|
TestSprite s2(2);
|
|
|
|
REQUIRE_EQ(list.IsSorted(), true);
|
|
REQUIRE_FALSE(list.IsDirty());
|
|
|
|
list.Append(&s1);
|
|
REQUIRE_EQ(list.IsSorted(), true);
|
|
REQUIRE_FALSE(list.IsDirty());
|
|
|
|
list.Append(&s2);
|
|
REQUIRE_EQ(list.IsSorted(), true);
|
|
REQUIRE_FALSE(list.IsDirty());
|
|
|
|
list.Clear();
|
|
REQUIRE(list.empty());
|
|
REQUIRE_EQ(list.IsSorted(), true);
|
|
REQUIRE_FALSE(list.IsDirty());
|
|
}
|
|
|
|
TEST_CASE("AppendSame") {
|
|
DrawableList default_list;
|
|
DrawableMgr::SetLocalList(&default_list);
|
|
|
|
DrawableList list;
|
|
|
|
TestSprite s1;
|
|
TestSprite s2;
|
|
|
|
REQUIRE_EQ(list.IsSorted(), true);
|
|
REQUIRE_FALSE(list.IsDirty());
|
|
|
|
list.Append(&s1);
|
|
REQUIRE_EQ(list.IsSorted(), true);
|
|
REQUIRE_FALSE(list.IsDirty());
|
|
|
|
list.Append(&s2);
|
|
REQUIRE_EQ(list.IsSorted(), true);
|
|
REQUIRE_FALSE(list.IsDirty());
|
|
|
|
list.Clear();
|
|
REQUIRE(list.empty());
|
|
REQUIRE_EQ(list.IsSorted(), true);
|
|
REQUIRE_FALSE(list.IsDirty());
|
|
}
|
|
|
|
TEST_CASE("TakeSorted") {
|
|
DrawableList default_list;
|
|
DrawableMgr::SetLocalList(&default_list);
|
|
|
|
DrawableList list;
|
|
|
|
TestSprite s1(1);
|
|
TestSprite s2(2);
|
|
TestSprite s3(3);
|
|
|
|
list.Append(&s1);
|
|
list.Append(&s2);
|
|
|
|
REQUIRE_EQ(list.size(), 2L);
|
|
REQUIRE_FALSE(list.IsDirty());
|
|
REQUIRE(list.IsSorted());
|
|
|
|
REQUIRE_EQ(list.Take(&s3), nullptr);
|
|
|
|
REQUIRE_EQ(list.size(), 2L);
|
|
REQUIRE_FALSE(list.IsDirty());
|
|
REQUIRE(list.IsSorted());
|
|
|
|
REQUIRE_EQ(list.Take(&s1), &s1);
|
|
|
|
REQUIRE_EQ(list.size(), 1L);
|
|
REQUIRE_FALSE(list.IsDirty());
|
|
REQUIRE(list.IsSorted());
|
|
|
|
REQUIRE_EQ(list.Take(&s2), &s2);
|
|
|
|
REQUIRE_EQ(list.size(), 0L);
|
|
REQUIRE_FALSE(list.IsDirty());
|
|
REQUIRE(list.IsSorted());
|
|
}
|
|
|
|
TEST_CASE("TakeNotSorted") {
|
|
DrawableList default_list;
|
|
DrawableMgr::SetLocalList(&default_list);
|
|
|
|
DrawableList list;
|
|
|
|
TestSprite s1(3);
|
|
TestSprite s2(2);
|
|
TestSprite s3(1);
|
|
|
|
list.Append(&s1);
|
|
list.Append(&s2);
|
|
|
|
REQUIRE_EQ(list.size(), 2L);
|
|
REQUIRE(list.IsDirty());
|
|
REQUIRE_FALSE(list.IsSorted());
|
|
|
|
REQUIRE_EQ(list.Take(&s3), nullptr);
|
|
|
|
REQUIRE_EQ(list.size(), 2L);
|
|
REQUIRE(list.IsDirty());
|
|
REQUIRE_FALSE(list.IsSorted());
|
|
|
|
REQUIRE_EQ(list.Take(&s1), &s1);
|
|
|
|
REQUIRE_EQ(list.size(), 1L);
|
|
REQUIRE(list.IsDirty());
|
|
REQUIRE(list.IsSorted());
|
|
|
|
REQUIRE_EQ(list.Take(&s2), &s2);
|
|
|
|
REQUIRE_EQ(list.size(), 0L);
|
|
REQUIRE(list.IsDirty());
|
|
REQUIRE(list.IsSorted());
|
|
}
|
|
|
|
TEST_CASE("TakeFromAll") {
|
|
DrawableList default_list;
|
|
DrawableMgr::SetLocalList(&default_list);
|
|
|
|
TestSprite s1;
|
|
TestSprite s2;
|
|
TestFrame f1;
|
|
TestFrame f2;
|
|
|
|
DrawableList list1;
|
|
DrawableList list2;
|
|
|
|
list1.Append(&s1);
|
|
list1.Append(&f1);
|
|
|
|
list2.Append(&s2);
|
|
list2.Append(&f2);
|
|
|
|
REQUIRE_EQ(list1.size(), 2L);
|
|
REQUIRE_EQ(list2.size(), 2L);
|
|
REQUIRE_FALSE(list1.IsDirty());
|
|
REQUIRE_FALSE(list2.IsDirty());
|
|
|
|
list1.TakeFrom(list2);
|
|
|
|
REQUIRE_EQ(list1.size(), 4L);
|
|
REQUIRE_EQ(list2.size(), 0L);
|
|
REQUIRE(list1.IsDirty());
|
|
REQUIRE_FALSE(list2.IsDirty());
|
|
|
|
list2.TakeFrom(list1);
|
|
|
|
REQUIRE_EQ(list1.size(), 0L);
|
|
REQUIRE_EQ(list2.size(), 4L);
|
|
REQUIRE_FALSE(list1.IsDirty());
|
|
REQUIRE(list2.IsDirty());
|
|
}
|
|
|
|
TEST_CASE("TakeFromPred") {
|
|
DrawableList default_list;
|
|
DrawableMgr::SetLocalList(&default_list);
|
|
|
|
TestSprite s1;
|
|
TestSprite s2;
|
|
TestFrame f1;
|
|
TestFrame f2;
|
|
|
|
DrawableList list1;
|
|
DrawableList list2;
|
|
|
|
list1.Append(&s1);
|
|
list1.Append(&f1);
|
|
|
|
list2.Append(&s2);
|
|
list2.Append(&f2);
|
|
|
|
REQUIRE_EQ(list1.size(), 2L);
|
|
REQUIRE_EQ(list2.size(), 2L);
|
|
REQUIRE_FALSE(list1.IsDirty());
|
|
REQUIRE_FALSE(list2.IsDirty());
|
|
|
|
list1.TakeFrom(list2, [](auto* d) { return !d->IsShared(); });
|
|
|
|
REQUIRE_EQ(list1.size(), 3L);
|
|
REQUIRE_EQ(list2.size(), 1L);
|
|
REQUIRE(list1.IsDirty());
|
|
REQUIRE_FALSE(list2.IsDirty());
|
|
|
|
list2.TakeFrom(list1, [](auto* d) { return !d->IsShared(); });
|
|
|
|
REQUIRE_EQ(list1.size(), 1L);
|
|
REQUIRE_EQ(list2.size(), 3L);
|
|
REQUIRE(list1.IsDirty());
|
|
REQUIRE(list2.IsDirty());
|
|
|
|
list2.TakeFrom(list1, [](auto* d) { return !d->IsShared(); });
|
|
|
|
REQUIRE_EQ(list1.size(), 1L);
|
|
REQUIRE_EQ(list2.size(), 3L);
|
|
REQUIRE(list1.IsDirty());
|
|
REQUIRE(list2.IsDirty());
|
|
|
|
list2.TakeFrom(list1, [](auto* d) { return d->IsShared(); });
|
|
|
|
REQUIRE_EQ(list1.size(), 0L);
|
|
REQUIRE_EQ(list2.size(), 4L);
|
|
REQUIRE_FALSE(list1.IsDirty());
|
|
REQUIRE(list2.IsDirty());
|
|
}
|
|
|
|
TEST_SUITE_END();
|