yaze 0.2.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
snes_tile_test.cc
Go to the documentation of this file.
1#include "app/gfx/snes_tile.h"
2
3#include <gmock/gmock.h>
4#include <gtest/gtest.h>
5
6#include "test/testing.h"
7#include "yaze.h"
8
9namespace yaze {
10namespace test {
11
12using ::testing::Eq;
13
14TEST(SnesTileTest, UnpackBppTile) {
15 // Test 1bpp tile unpacking
16 std::vector<uint8_t> data1bpp = {0x80, 0x40, 0x20, 0x10,
17 0x08, 0x04, 0x02, 0x01};
18 auto tile1bpp = gfx::UnpackBppTile(data1bpp, 0, 1);
19 EXPECT_EQ(tile1bpp.data[0], 1); // First pixel
20 EXPECT_EQ(tile1bpp.data[7], 0); // Last pixel of first row
21 EXPECT_EQ(tile1bpp.data[56], 0); // First pixel of last row
22 EXPECT_EQ(tile1bpp.data[63], 1); // Last pixel
23
24 // Test 2bpp tile unpacking
25 std::vector<uint8_t> data2bpp = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04,
26 0x02, 0x01, 0x01, 0x02, 0x04, 0x08,
27 0x10, 0x20, 0x40, 0x80};
28 auto tile2bpp = gfx::UnpackBppTile(data2bpp, 0, 2);
29 EXPECT_EQ(tile2bpp.data[0], 3); // First pixel (both bits set)
30 EXPECT_EQ(tile2bpp.data[7],
31 1); // Last pixel of first row (only first bit set)
32 EXPECT_EQ(tile2bpp.data[56],
33 2); // First pixel of last row (only second bit set)
34 EXPECT_EQ(tile2bpp.data[63], 3); // Last pixel (both bits set)
35
36 // Test 4bpp tile unpacking
37 std::vector<uint8_t> data4bpp = {
38 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01, 0x01, 0x02, 0x04,
39 0x08, 0x10, 0x20, 0x40, 0x80, 0x80, 0x40, 0x20, 0x10, 0x08, 0x04,
40 0x02, 0x01, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};
41 auto tile4bpp = gfx::UnpackBppTile(data4bpp, 0, 4);
42 EXPECT_EQ(tile4bpp.data[0], 0xF); // First pixel (all bits set)
43 EXPECT_EQ(tile4bpp.data[7],
44 0x5); // Last pixel of first row (bits 0 and 2 set)
45 EXPECT_EQ(tile4bpp.data[56],
46 0xA); // First pixel of last row (bits 1 and 3 set)
47 EXPECT_EQ(tile4bpp.data[63], 0xF); // Last pixel (all bits set)
48}
49
50TEST(SnesTileTest, PackBppTile) {
51 // Test 1bpp tile packing
52 snes_tile8 tile1bpp;
53 std::fill(tile1bpp.data, tile1bpp.data + 64, 0);
54 tile1bpp.data[0] = 1;
55 tile1bpp.data[63] = 1;
56 auto packed1bpp = gfx::PackBppTile(tile1bpp, 1);
57 EXPECT_EQ(packed1bpp[0], 0x80); // First byte
58 EXPECT_EQ(packed1bpp[7], 0x01); // Last byte
59
60 // Test 2bpp tile packing
61 snes_tile8 tile2bpp;
62 std::fill(tile2bpp.data, tile2bpp.data + 64, 0);
63 tile2bpp.data[0] = 3;
64 tile2bpp.data[7] = 1;
65 tile2bpp.data[56] = 2;
66 tile2bpp.data[63] = 3;
67 auto packed2bpp = gfx::PackBppTile(tile2bpp, 2);
68 EXPECT_EQ(packed2bpp[0], 0x80); // First byte of first plane
69 EXPECT_EQ(packed2bpp[1], 0x80); // First byte of second plane
70 EXPECT_EQ(packed2bpp[14], 0x01); // Last byte of first plane
71 EXPECT_EQ(packed2bpp[15], 0x01); // Last byte of second plane
72}
73
74TEST(SnesTileTest, ConvertBpp) {
75 // Test 2bpp to 4bpp conversion
76 std::vector<uint8_t> data2bpp = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04,
77 0x02, 0x01, 0x01, 0x02, 0x04, 0x08,
78 0x10, 0x20, 0x40, 0x80};
79 auto converted4bpp = gfx::ConvertBpp(data2bpp, 2, 4);
80 EXPECT_EQ(converted4bpp.size(), 32); // 4bpp tile is 32 bytes
81
82 // Test 4bpp to 2bpp conversion
83 std::vector<uint8_t> data4bpp = {
84 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01, 0x01, 0x02, 0x04,
85 0x08, 0x10, 0x20, 0x40, 0x80, 0x80, 0x40, 0x20, 0x10, 0x08, 0x04,
86 0x02, 0x01, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};
87 auto converted2bpp = gfx::ConvertBpp(data4bpp, 4, 2);
88 EXPECT_EQ(converted2bpp.size(), 16); // 2bpp tile is 16 bytes
89}
90
91TEST(SnesTileTest, TileInfo) {
92 // Test TileInfo construction and bit manipulation
93 gfx::TileInfo info(0x123, 3, true, true, true);
94 EXPECT_EQ(info.id_, 0x123);
95 EXPECT_EQ(info.palette_, 3);
96 EXPECT_TRUE(info.vertical_mirror_);
97 EXPECT_TRUE(info.horizontal_mirror_);
98 EXPECT_TRUE(info.over_);
99
100 // Test TileInfo from bytes
101 gfx::TileInfo infoFromBytes(0x23, 0xE1); // v=1, h=1, o=1, p=3, id=0x123
102 EXPECT_EQ(infoFromBytes.id_, 0x123);
103 EXPECT_EQ(infoFromBytes.palette_, 3);
104 EXPECT_TRUE(infoFromBytes.vertical_mirror_);
105 EXPECT_TRUE(infoFromBytes.horizontal_mirror_);
106 EXPECT_TRUE(infoFromBytes.over_);
107
108 // Test TileInfo equality
109 EXPECT_TRUE(info == infoFromBytes);
110}
111
112TEST(SnesTileTest, TileInfoToWord) {
113 gfx::TileInfo info(0x123, 3, true, true, true);
114 uint16_t word = gfx::TileInfoToWord(info);
115
116 // Verify bit positions:
117 // vhopppcc cccccccc
118 EXPECT_EQ(word & 0x3FF, 0x123); // id (10 bits)
119 EXPECT_TRUE(word & 0x8000); // vertical mirror
120 EXPECT_TRUE(word & 0x4000); // horizontal mirror
121 EXPECT_TRUE(word & 0x2000); // over
122 EXPECT_EQ((word >> 10) & 0x07, 3); // palette (3 bits)
123}
124
125TEST(SnesTileTest, WordToTileInfo) {
126 uint16_t word = 0xE123; // v=1, h=1, o=1, p=3, id=0x123
128
129 EXPECT_EQ(info.id_, 0x123);
130 EXPECT_EQ(info.palette_, 3);
131 EXPECT_TRUE(info.vertical_mirror_);
132 EXPECT_TRUE(info.horizontal_mirror_);
133 EXPECT_TRUE(info.over_);
134}
135
136TEST(SnesTileTest, Tile32) {
137 // Test Tile32 construction and operations
138 gfx::Tile32 tile32(0x1234, 0x5678, 0x9ABC, 0xDEF0);
139 EXPECT_EQ(tile32.tile0_, 0x1234);
140 EXPECT_EQ(tile32.tile1_, 0x5678);
141 EXPECT_EQ(tile32.tile2_, 0x9ABC);
142 EXPECT_EQ(tile32.tile3_, 0xDEF0);
143
144 // Test packed value
145 uint64_t packed = tile32.GetPackedValue();
146 EXPECT_EQ(packed, 0xDEF09ABC56781234);
147
148 // Test from packed value
149 gfx::Tile32 tile32FromPacked(packed);
150 EXPECT_EQ(tile32FromPacked.tile0_, 0x1234);
151 EXPECT_EQ(tile32FromPacked.tile1_, 0x5678);
152 EXPECT_EQ(tile32FromPacked.tile2_, 0x9ABC);
153 EXPECT_EQ(tile32FromPacked.tile3_, 0xDEF0);
154
155 // Test equality
156 EXPECT_TRUE(tile32 == tile32FromPacked);
157}
158
159TEST(SnesTileTest, Tile16) {
160 // Test Tile16 construction and operations
161 gfx::TileInfo info0(0x123, 3, true, true, true);
162 gfx::TileInfo info1(0x456, 2, false, true, false);
163 gfx::TileInfo info2(0x789, 1, true, false, true);
164 gfx::TileInfo info3(0xABC, 0, false, false, false);
165
166 gfx::Tile16 tile16(info0, info1, info2, info3);
167 EXPECT_TRUE(tile16.tile0_ == info0);
168 EXPECT_TRUE(tile16.tile1_ == info1);
169 EXPECT_TRUE(tile16.tile2_ == info2);
170 EXPECT_TRUE(tile16.tile3_ == info3);
171
172 // Test array access
173 EXPECT_TRUE(tile16.tiles_info[0] == info0);
174 EXPECT_TRUE(tile16.tiles_info[1] == info1);
175 EXPECT_TRUE(tile16.tiles_info[2] == info2);
176 EXPECT_TRUE(tile16.tiles_info[3] == info3);
177}
178
179} // namespace test
180} // namespace yaze
Tile composition of four 8x8 tiles.
Definition snes_tile.h:137
std::array< TileInfo, 4 > tiles_info
Definition snes_tile.h:143
Tile composition of four 16x16 tiles.
Definition snes_tile.h:88
uint16_t tile2_
Definition snes_tile.h:92
uint16_t tile3_
Definition snes_tile.h:93
uint16_t tile0_
Definition snes_tile.h:90
uint64_t GetPackedValue() const
Definition snes_tile.h:118
uint16_t tile1_
Definition snes_tile.h:91
SNES 16-bit tile metadata container.
Definition snes_tile.h:50
uint16_t TileInfoToWord(TileInfo tile_info)
Definition snes_tile.cc:291
std::vector< uint8_t > PackBppTile(const snes_tile8 &tile, const uint32_t bpp)
Definition snes_tile.cc:72
snes_tile8 UnpackBppTile(std::span< uint8_t > data, const uint32_t offset, const uint32_t bpp)
Definition snes_tile.cc:23
TileInfo WordToTileInfo(uint16_t word)
Definition snes_tile.cc:308
std::vector< uint8_t > ConvertBpp(std::span< uint8_t > tiles, uint32_t from_bpp, uint32_t to_bpp)
Definition snes_tile.cc:115
TEST(LC_LZ2_CompressionTest, TrivialRepeatedBytes)
Main namespace for the application.
Definition controller.cc:18
uint8_t data[64]
Definition yaze.h:74