Files
jak-project/test/decompiler/test_VuDisasm.cpp
T
Tyler Wilding 6c719ae000 d/jx: Disassemble and compare VU programs, add reference tests, create a diff report (#4406)
All VU programs are unchanged except:

- `ocean-near-vu1` DIFFERENT
- `sparks-vu1` NEW
- `sprite-glow-vu1` DIFFERENT
- `tnear-vu1` DIFFERENT

And `hfrag`, `ocean` and `ocean-texture` have been removed.

A full breakdown:
```
================================================================================
Checking: background-vu0.txt
================================================================================
OK: Files are the same.

================================================================================
Checking: bones-vu0.txt
================================================================================
OK: Files are the same.

================================================================================
Checking: collide-vu0.txt
================================================================================
OK: Files are the same.

================================================================================
Checking: emerc-vu1.txt
================================================================================
OK: Files are the same.

================================================================================
Checking: etie-vu1.txt
================================================================================
OK: Files are the same.

================================================================================
Checking: etn-vu1.txt
================================================================================
OK: Files are the same.

================================================================================
Checking: foreground-vu0.txt
================================================================================
OK: Files are the same.

================================================================================
Checking: generic-vu0.txt
================================================================================
OK: Files are the same.

================================================================================
Checking: generic-vu1.txt
================================================================================
OK: Files are the same.

================================================================================
Checking: merc-vu1.txt
================================================================================
OK: Files are the same.

================================================================================
Checking: mercneric-vu0.txt
================================================================================
OK: Files are the same.

================================================================================
Checking: ocean-mid-vu1.txt
================================================================================
OK: Files are the same.

================================================================================
Checking: ocean-near-vu1.txt
================================================================================
!!! DIFFERENT !!!

--- ocean-near-vu1.txt
+++ ../jak3/ocean-near-vu1.txt
@@ -78,10 +78,20 @@
 .word 0x2ff
 .word 0x800206bc
 .word 0x2ff
+.word 0x903100a
+.word 0x2ff
+.word 0x884100a
+.word 0x2ff
 .word 0x80050032
 .word 0x2ff
 .word 0x800701f2
 .word 0x2ff
+.word 0x1fc1820
+.word 0x2ff
+.word 0x1fd1821
+.word 0x2ff
+.word 0x1fe2020
+.word 0x2ff
 .word 0x1f82922
 .word 0x2ff
 .word 0x1f92925
@@ -91,23 +101,23 @@
 .word 0x1fb292b
 .word 0x2ff
 .word 0x1ec292e
-.word 0x800601
+.word 0x9c0600
 .word 0x1ed2931
-.word 0x800641
+.word 0x9c0641
 .word 0x1ee2934
-.word 0x800681
+.word 0x9c0682
 .word 0x1ef2937
-.word 0x8006c1
+.word 0x9c06c3
 .word 0x1e8293a
-.word 0x800301
+.word 0x9d0300
 .word 0x3e5c122
-.word 0x800341
+.word 0x9d0341
 .word 0x3e5c925
-.word 0x800381
+.word 0x9d0382
 .word 0x3e5d128
-.word 0x8003c1
+.word 0x9d03c3
 .word 0x3e5d92b
-.word 0x800201
+.word 0x9e0200
 .word 0x3e5612e
 .word 0x2ff
 .word 0x3e56931
@@ -118,12 +128,26 @@
 .word 0x2ff
 .word 0x3e5413a
 .word 0x2ff
+.word 0x80031a32
+.word 0x2ff
+.word 0x80042232
+.word 0x2ff
 .word 0x1005281b
 .word 0x2ff
-.word 0x5a003fec
+.word 0x5a003fe7
 .word 0x2ff
 .word 0x80073ff2
 .word 0x2ff
+.word 0x843100a
+.word 0x2ff
+.word 0x824100a
+.word 0x2ff
+.word 0x1fc1820
+.word 0x2ff
+.word 0x1fd1821
+.word 0x2ff
+.word 0x1fe2020
+.word 0x2ff
 .word 0x1f82922
 .word 0x2ff
 .word 0x1f92925
@@ -133,23 +157,23 @@
 .word 0x1fb292b
 .word 0x2ff
 .word 0x1ec292e
-.word 0x800601
+.word 0x9c0600
 .word 0x1ed2931
-.word 0x800641
+.word 0x9c0641
 .word 0x1ee2934
-.word 0x800681
+.word 0x9c0682
 .word 0x1ef2937
-.word 0x8006c1
+.word 0x9c06c3
 .word 0x1e8293a
-.word 0x800301
+.word 0x9d0300
 .word 0x3e5c122
-.word 0x800341
+.word 0x9d0341
 .word 0x3e5c925
-.word 0x800381
+.word 0x9d0382
 .word 0x3e5d128
-.word 0x8003c1
+.word 0x9d03c3
 .word 0x3e5d92b
-.word 0x800201
+.word 0x9e0200
 .word 0x3e5612e
 .word 0x2ff
 .word 0x3e56931

================================================================================
Checking: shadow-vu0.txt
================================================================================
OK: Files are the same.

================================================================================
Checking: shadow-vu1.txt
================================================================================
OK: Files are the same.

================================================================================
Checking: shrub-vu1.txt
================================================================================
OK: Files are the same.

================================================================================
Checking: sparks-vu1.txt
================================================================================
!!! MISSING: ../jak3/sparks-vu1.txt
!!! MISSING: sparks-vu1.txt does not exist in ../jak3

================================================================================
Checking: sprite-distort-vu1.txt
================================================================================
OK: Files are the same.

================================================================================
Checking: sprite-glow-vu1.txt
================================================================================
!!! DIFFERENT !!!

--- sprite-glow-vu1.txt
+++ ../jak3/sprite-glow-vu1.txt
@@ -1,4 +1,4 @@
-.word 0x1005031e
+.word 0x10050320
 .word 0x2ff
 .word 0x1f903dc
 .word 0x2ff
@@ -66,17 +66,17 @@
 .word 0x2ff
 .word 0x1ed2004
 .word 0x1042101
-.word 0x3e54845
+.word 0x3e54844
 .word 0x5b1159
 .word 0x8025033c
 .word 0x410083
-.word 0x3e55046
+.word 0x3e55045
 .word 0x20025c
-.word 0x3e55847
-.word 0x2ff
-.word 0x3e56048
+.word 0x3e55846
+.word 0x2ff
+.word 0x3e56047
 .word 0x1002117
-.word 0x3e56849
+.word 0x3e56848
 .word 0x2ff
 .word 0x80000030
 .word 0x290247
@@ -178,7 +178,7 @@
 .word 0x18aa52f
 .word 0x80000030
 .word 0x1e5f1bf
-.word 0x3e5184c
+.word 0x3e5184b
 .word 0x1e5fc0a
 .word 0x3c5580b
 .word 0x191a46c
@@ -230,33 +230,33 @@
 .word 0x1ed697d
 .word 0x80000030
 .word 0x1ee717d
-.word 0x385583e
+.word 0x385583d
 .word 0x1f1897d
-.word 0x385603f
+.word 0x385603e
 .word 0x1f2917d
-.word 0x3856840
+.word 0x385683f
 .word 0x1f3997d
-.word 0x3857041
+.word 0x3857040
 .word 0x1f4a17d
-.word 0x3858819
-.word 0x2ff
-.word 0x385901b
+.word 0x3858818
+.word 0x2ff
+.word 0x385901a
 .word 0x2ff
 .word 0x3859808
 .word 0x2ff
 .word 0x385a009
 .word 0x2ff
-.word 0x385584e
-.word 0x2ff
-.word 0x3856050
-.word 0x2ff
-.word 0x3856852
-.word 0x2ff
-.word 0x3857054
+.word 0x385584d
+.word 0x2ff
+.word 0x385604f
+.word 0x2ff
+.word 0x3856851
+.word 0x2ff
+.word 0x3857053
 .word 0x2ff
 .word 0x80002efc
 .word 0x2ff
-.word 0x10010691
+.word 0x10010694
 .word 0x2ff
 .word 0x52001f8c
 .word 0x2ff

================================================================================
Checking: sprite-vu1.txt
================================================================================
OK: Files are the same.

================================================================================
Checking: tfrag-vu1.txt
================================================================================
OK: Files are the same.

================================================================================
Checking: tie-near-vu1.txt
================================================================================
OK: Files are the same.

================================================================================
Checking: tie-vu1.txt
================================================================================
OK: Files are the same.

================================================================================
Checking: tnear-vu1.txt
================================================================================
!!! DIFFERENT !!!

--- tnear-vu1.txt
+++ ../jak3/tnear-vu1.txt
@@ -1421,9 +1421,9 @@
 .word 0x1916800
 .word 0x400403
 .word 0x40000008
+.word 0x2ff
+.word 0x1927000
 .word 0x400443
-.word 0x1927000
-.word 0x2ff
 .word 0x3eb802d
 .word 0x2ff
 .word 0x3eb882e
@@ -1435,39 +1435,39 @@
 .word 0x1916948
 .word 0x400403
 .word 0x40000001
+.word 0x2ff
+.word 0x1927148
 .word 0x400443
-.word 0x1927148
-.word 0x2ff
 .word 0x3eba02a
 .word 0x400483
 .word 0x3eba82b
+.word 0x2ff
+.word 0x3ebb02c
+.word 0x2ff
+.word 0x1f4581d
 .word 0x1998407
-.word 0x3ebb02c
+.word 0x1f55820
 .word 0x1998c47
-.word 0x1f4581d
-.word 0x1f6e93c
-.word 0x1f55820
+.word 0x3eb6027
 .word 0x1999487
-.word 0x3eb6027
-.word 0x191876f
 .word 0x3eb6828
-.word 0x19187ab
+.word 0x2ff
 .word 0x3eb801e
 .word 0x1f4a13c
 .word 0x3eb8821
 .word 0x1f5a93c
 .word 0x3eb9024
-.word 0x192ef6f
+.word 0x1f6e93c
 .word 0x3eb7029
-.word 0x192f7ab
+.word 0x2ff
+.word 0x3eba01d
+.word 0x2ff
+.word 0x3eba820
+.word 0x2ff
 .word 0x3ebb023
 .word 0x2ff
 .word 0x800e5872
 .word 0x2ff
-.word 0x3eba01d
-.word 0x2ff
-.word 0x3eba820
-.word 0x19de97c
 .word 0x1ff0297
 .word 0x2ff
 .word 0xb0f03fe
@@ -1475,7 +1475,7 @@
 .word 0x80040032
 .word 0x2ff
 .word 0x420f0007
-.word 0x19de93c
+.word 0x2ff
 .word 0x1006581c
 .word 0x2ff
 .word 0x420f0005
@@ -1541,20 +1541,20 @@
 .word 0x2c010002
 .word 0x2ff
 .word 0x2c0d0002
-.word 0x2ff
+.word 0x3eef87
 .word 0x5200080c
 .word 0x2ff
 .word 0x1f13002
 .word 0x2ff
 .word 0x52006803
 .word 0x2ff
-.word 0x80000030
+.word 0x81feebbc
 .word 0x2ff
 .word 0x400007e3
 .word 0x2ff
 .word 0x800841f2
 .word 0x2ff
-.word 0x420a0082
+.word 0x420a0077
 .word 0x2ff
 .word 0x80064072
 .word 0x2ff
@@ -1570,7 +1570,7 @@
 .word 0x2ff
 .word 0x5200681c
 .word 0x2ff
-.word 0x80000030
+.word 0x81feebbc
 .word 0x2ff
 .word 0x420a006e
 .word 0x2ff
@@ -1594,16 +1594,16 @@
 .word 0x2ff
 .word 0x80064772
 .word 0x2ff
+.word 0x1ec3000
+.word 0x2ff
+.word 0x1f43001
+.word 0x2ff
 .word 0x1f03002
 .word 0x2ff
-.word 0x1ec3000
-.word 0x2ff
-.word 0x1f43001
-.word 0x2ff
 .word 0x80042072
 .word 0x2ff
 .word 0x80000030
-.word 0x19d842c
+.word 0x2ff
 .word 0x81ec03bc
 .word 0x1ff632a
 .word 0x80000030
@@ -1671,14 +1671,14 @@
 .word 0x2c010002
 .word 0x2ff
 .word 0x2c0d0002
-.word 0x2ff
+.word 0x3eef87
 .word 0x500d0818
 .word 0x2ff
 .word 0x1f13802
 .word 0x2ff
 .word 0x5000080c
 .word 0x2ff
-.word 0x80000030
+.word 0x81feebbc
 .word 0x2ff
 .word 0x420a0038
 .word 0x2ff
@@ -1702,7 +1702,7 @@
 .word 0x2ff
 .word 0x80006235
 .word 0x2ff
-.word 0x420a0038
+.word 0x420a002d
 .word 0x2ff
 .word 0x80000030
 .word 0x2ff
@@ -1795,10 +1795,6 @@
 .word 0x80000030
 .word 0x2d6f86
 .word 0x80000030
-.word 0x3eef87
-.word 0x81feebbc
-.word 0x2ff
-.word 0x80000030
 .word 0x1ec6bac
 .word 0x80000030
 .word 0x1f4adac
@@ -1816,25 +1812,3 @@
 .word 0x1f6a5a8
 .word 0x80000030
 .word 0x1f284a8
-.word 0x80000030
-.word 0x3eef47
-.word 0x81fdf3bc
-.word 0x2ff
-.word 0x80000030
-.word 0x1ed63ac
-.word 0x80000030
-.word 0x1f5a5ac
-.word 0x80000030
-.word 0x1f184ac
-.word 0x800003bf
-.word 0x1e0739c
-.word 0x80000030
-.word 0x1e0b59c
-.word 0x80000030
-.word 0x1e0949c
-.word 0x80000030
-.word 0x1ee6bac
-.word 0x48005000
-.word 0x1f6adac
-.word 0x80000030
-.word 0x1f28cac
```
2026-09-04 23:01:17 -04:00

760 lines
31 KiB
C++

#include "common/util/FileUtil.h"
#include "common/util/string_util.h"
#include "decompiler/VuDisasm/VuDisassembler.h"
#include "decompiler/util/DataParser.h"
#include "gtest/gtest.h"
#include "fmt/format.h"
using namespace decompiler;
namespace {
std::vector<u32> get_test_data(const std::string& name) {
auto text = file_util::read_text_file(
file_util::get_file_path({fmt::format("test/decompiler/vu_reference/{}.txt", name)}));
auto parsed = parse_data(text);
std::vector<u32> data;
for (auto& w : parsed.words) {
EXPECT_EQ(w.kind(), LinkedWord::Kind::PLAIN_DATA);
data.push_back(w.data);
}
return data;
}
std::string get_expected(const std::string& name) {
return str_util::trim(file_util::read_text_file(
file_util::get_file_path({fmt::format("test/decompiler/vu_reference/{}-result.txt", name)})));
}
} // namespace
// TEST(VuDisasm, DumpResults_JakX_Draft) {
// struct VuData {
// std::string name;
// std::vector<u32> data;
// VuDisassembler::VuKind kind;
// std::string disasm;
// VuData(const std::string& name, VuDisassembler::VuKind kind)
// : name(name), data(get_test_data("jakx/" + name)), kind(kind) {
// VuDisassembler vu_disasm(kind);
// disasm = vu_disasm.to_string(vu_disasm.disassemble(data.data(), data.size() * 4, false));
// }
// };
// auto path = file_util::get_file_path({"test/decompiler/vu_reference/jakx"});
// for (const auto& entry : fs::directory_iterator(path)) {
// if (entry.is_regular_file() &&
// entry.path().filename().string().find("result") == std::string::npos) {
// auto name = entry.path().filename().stem().string();
// auto kind = name.find("vu0") != std::string::npos ? VuDisassembler::VuKind::VU0
// : VuDisassembler::VuKind::VU1;
// VuData prog(name, kind);
// file_util::write_text_file(path + "/" + prog.name + "-result.txt", prog.disasm);
// }
// }
// }
TEST(VuDisasm, ShadowVu0_JakX) {
auto data = get_test_data("jakx/shadow-vu0");
VuDisassembler disasm(VuDisassembler::VuKind::VU0);
auto prog = disasm.disassemble(data.data(), data.size() * 4, false);
EXPECT_EQ(str_util::trim(disasm.to_string(prog)), get_expected("jakx/shadow-vu0"));
}
TEST(VuDisasm, ShadowVu1_JakX) {
auto data = get_test_data("jakx/shadow-vu1");
VuDisassembler disasm(VuDisassembler::VuKind::VU1);
auto prog = disasm.disassemble(data.data(), data.size() * 4, false);
EXPECT_EQ(str_util::trim(disasm.to_string(prog)), get_expected("jakx/shadow-vu1"));
}
TEST(VuDisasm, OceanMid_JakX) {
auto data = get_test_data("jakx/ocean-mid-vu1");
VuDisassembler disasm(VuDisassembler::VuKind::VU1);
auto prog = disasm.disassemble(data.data(), data.size() * 4, false);
EXPECT_EQ(str_util::trim(disasm.to_string(prog)), get_expected("jakx/ocean-mid-vu1"));
}
TEST(VuDisasm, OceanNear_JakX) {
auto data = get_test_data("jakx/ocean-near-vu1");
VuDisassembler disasm(VuDisassembler::VuKind::VU1);
auto prog = disasm.disassemble(data.data(), data.size() * 4, false);
EXPECT_EQ(str_util::trim(disasm.to_string(prog)), get_expected("jakx/ocean-near-vu1"));
}
TEST(VuDisasm, MercnericVu0_JakX) {
auto data = get_test_data("jakx/mercneric-vu0");
VuDisassembler disasm(VuDisassembler::VuKind::VU0);
auto prog = disasm.disassemble(data.data(), data.size() * 4, false);
EXPECT_EQ(str_util::trim(disasm.to_string(prog)), get_expected("jakx/mercneric-vu0"));
}
TEST(VuDisasm, GenericVu0_JakX) {
auto data = get_test_data("jakx/generic-vu0");
VuDisassembler disasm(VuDisassembler::VuKind::VU0);
auto prog = disasm.disassemble(data.data(), data.size() * 4, false);
EXPECT_EQ(str_util::trim(disasm.to_string(prog)), get_expected("jakx/generic-vu0"));
}
TEST(VuDisasm, GenericVu1_JakX) {
auto data = get_test_data("jakx/generic-vu1");
VuDisassembler disasm(VuDisassembler::VuKind::VU1);
auto prog = disasm.disassemble(data.data(), data.size() * 4, false);
EXPECT_EQ(str_util::trim(disasm.to_string(prog)), get_expected("jakx/generic-vu1"));
}
TEST(VuDisasm, Merc_JakX) {
auto data = get_test_data("jakx/merc-vu1");
VuDisassembler disasm(VuDisassembler::VuKind::VU1);
auto prog = disasm.disassemble(data.data(), data.size() * 4, false);
EXPECT_EQ(str_util::trim(disasm.to_string(prog)), get_expected("jakx/merc-vu1"));
}
TEST(VuDisasm, Emerc_JakX) {
auto data = get_test_data("jakx/emerc-vu1");
VuDisassembler disasm(VuDisassembler::VuKind::VU1);
auto prog = disasm.disassemble(data.data(), data.size() * 4, false);
EXPECT_EQ(str_util::trim(disasm.to_string(prog)), get_expected("jakx/emerc-vu1"));
}
TEST(VuDisasm, ShrubVu1_JakX) {
auto data = get_test_data("jakx/shrub-vu1");
VuDisassembler disasm(VuDisassembler::VuKind::VU1);
auto prog = disasm.disassemble(data.data(), data.size() * 4, false);
EXPECT_EQ(str_util::trim(disasm.to_string(prog)), get_expected("jakx/shrub-vu1"));
}
TEST(VuDisasm, Sprite_JakX) {
auto data = get_test_data("jakx/sprite-vu1");
VuDisassembler disasm(VuDisassembler::VuKind::VU1);
auto prog = disasm.disassemble(data.data(), data.size() * 4, false);
EXPECT_EQ(str_util::trim(disasm.to_string(prog)), get_expected("jakx/sprite-vu1"));
}
TEST(VuDisasm, SpriteDistort_JakX) {
auto data = get_test_data("jakx/sprite-distort-vu1");
VuDisassembler disasm(VuDisassembler::VuKind::VU1);
auto prog = disasm.disassemble(data.data(), data.size() * 4, false);
EXPECT_EQ(str_util::trim(disasm.to_string(prog)), get_expected("jakx/sprite-distort-vu1"));
}
TEST(VuDisasm, SpriteGlow_JakX) {
auto data = get_test_data("jakx/sprite-glow-vu1");
VuDisassembler disasm(VuDisassembler::VuKind::VU1);
auto prog = disasm.disassemble(data.data(), data.size() * 4, false);
EXPECT_EQ(str_util::trim(disasm.to_string(prog)), get_expected("jakx/sprite-glow-vu1"));
}
TEST(VuDisasm, Sparks_JakX) {
auto data = get_test_data("jakx/sparks-vu1");
VuDisassembler disasm(VuDisassembler::VuKind::VU1);
auto prog = disasm.disassemble(data.data(), data.size() * 4, false);
EXPECT_EQ(str_util::trim(disasm.to_string(prog)), get_expected("jakx/sparks-vu1"));
}
TEST(VuDisasm, Tfrag_JakX) {
auto data = get_test_data("jakx/tfrag-vu1");
VuDisassembler disasm(VuDisassembler::VuKind::VU1);
auto prog = disasm.disassemble(data.data(), data.size() * 4, false);
EXPECT_EQ(str_util::trim(disasm.to_string(prog)), get_expected("jakx/tfrag-vu1"));
}
TEST(VuDisasm, TfragNear_JakX) {
auto data = get_test_data("jakx/tnear-vu1");
VuDisassembler disasm(VuDisassembler::VuKind::VU1);
auto prog = disasm.disassemble(data.data(), data.size() * 4, false);
EXPECT_EQ(str_util::trim(disasm.to_string(prog)), get_expected("jakx/tnear-vu1"));
}
TEST(VuDisasm, Tie_JakX) {
auto data = get_test_data("jakx/tie-vu1");
VuDisassembler disasm(VuDisassembler::VuKind::VU1);
auto prog = disasm.disassemble(data.data(), data.size() * 4, false);
EXPECT_EQ(str_util::trim(disasm.to_string(prog)), get_expected("jakx/tie-vu1"));
}
TEST(VuDisasm, TieNear_JakX) {
auto data = get_test_data("jakx/tie-near-vu1");
VuDisassembler disasm(VuDisassembler::VuKind::VU1);
auto prog = disasm.disassemble(data.data(), data.size() * 4, false);
EXPECT_EQ(str_util::trim(disasm.to_string(prog)), get_expected("jakx/tie-near-vu1"));
}
TEST(VuDisasm, Etie_JakX) {
auto data = get_test_data("jakx/etie-vu1");
VuDisassembler disasm(VuDisassembler::VuKind::VU1);
auto prog = disasm.disassemble(data.data(), data.size() * 4, false);
EXPECT_EQ(str_util::trim(disasm.to_string(prog)), get_expected("jakx/etie-vu1"));
}
TEST(VuDisasm, EtieNear_JakX) {
auto data = get_test_data("jakx/etn-vu1");
VuDisassembler disasm(VuDisassembler::VuKind::VU1);
auto prog = disasm.disassemble(data.data(), data.size() * 4, false);
EXPECT_EQ(str_util::trim(disasm.to_string(prog)), get_expected("jakx/etn-vu1"));
}
TEST(VuDisasm, BackgroundVu0_JakX) {
auto data = get_test_data("jakx/background-vu0");
VuDisassembler disasm(VuDisassembler::VuKind::VU0);
auto prog = disasm.disassemble(data.data(), data.size() * 4, false);
EXPECT_EQ(str_util::trim(disasm.to_string(prog)), get_expected("jakx/background-vu0"));
}
TEST(VuDisasm, CollideVu0_JakX) {
auto data = get_test_data("jakx/collide-vu0");
VuDisassembler disasm(VuDisassembler::VuKind::VU0);
auto prog = disasm.disassemble(data.data(), data.size() * 4, false);
EXPECT_EQ(str_util::trim(disasm.to_string(prog)), get_expected("jakx/collide-vu0"));
}
TEST(VuDisasm, BonesVu0_JakX) {
auto data = get_test_data("jakx/bones-vu0");
VuDisassembler disasm(VuDisassembler::VuKind::VU0);
auto prog = disasm.disassemble(data.data(), data.size() * 4, false);
EXPECT_EQ(str_util::trim(disasm.to_string(prog)), get_expected("jakx/bones-vu0"));
}
TEST(VuDisasm, ForegroundVu0_JakX) {
auto data = get_test_data("jakx/foreground-vu0");
VuDisassembler disasm(VuDisassembler::VuKind::VU0);
auto prog = disasm.disassemble(data.data(), data.size() * 4, false);
EXPECT_EQ(str_util::trim(disasm.to_string(prog)), get_expected("jakx/foreground-vu0"));
}
// TEST(VuDisasm, DumpResults_Jak3_Draft) {
// struct VuData {
// std::string name;
// std::vector<u32> data;
// VuDisassembler::VuKind kind;
// std::string disasm;
// VuData(const std::string& name, VuDisassembler::VuKind kind)
// : name(name), data(get_test_data("jak3/" + name)), kind(kind) {
// VuDisassembler vu_disasm(kind);
// disasm = vu_disasm.to_string(vu_disasm.disassemble(data.data(), data.size() * 4, false));
// }
// };
// auto path = file_util::get_file_path({"test/decompiler/vu_reference/jak3"});
// for (const auto& entry : fs::directory_iterator(path)) {
// if (entry.is_regular_file() &&
// entry.path().filename().string().find("result") == std::string::npos) {
// auto name = entry.path().filename().stem().string();
// auto kind = name.find("vu0") != std::string::npos ? VuDisassembler::VuKind::VU0
// : VuDisassembler::VuKind::VU1;
// VuData prog(name, kind);
// file_util::write_text_file(path + "/" + prog.name + "-result.txt", prog.disasm);
// }
// }
// }
TEST(VuDisasm, ShadowVu0_Jak3) {
auto data = get_test_data("jak3/shadow-vu0");
VuDisassembler disasm(VuDisassembler::VuKind::VU0);
auto prog = disasm.disassemble(data.data(), data.size() * 4, false);
EXPECT_EQ(str_util::trim(disasm.to_string(prog)), get_expected("jak3/shadow-vu0"));
}
TEST(VuDisasm, ShadowVu1_Jak3) {
auto data = get_test_data("jak3/shadow-vu1");
VuDisassembler disasm(VuDisassembler::VuKind::VU1);
auto prog = disasm.disassemble(data.data(), data.size() * 4, false);
EXPECT_EQ(str_util::trim(disasm.to_string(prog)), get_expected("jak3/shadow-vu1"));
}
TEST(VuDisasm, OceanTexture_Jak3) {
auto data = get_test_data("jak3/ocean-texture-vu1");
VuDisassembler disasm(VuDisassembler::VuKind::VU1);
auto prog = disasm.disassemble(data.data(), data.size() * 4, false);
EXPECT_EQ(str_util::trim(disasm.to_string(prog)), get_expected("jak3/ocean-texture-vu1"));
}
TEST(VuDisasm, OceanMid_Jak3) {
auto data = get_test_data("jak3/ocean-mid-vu1");
VuDisassembler disasm(VuDisassembler::VuKind::VU1);
auto prog = disasm.disassemble(data.data(), data.size() * 4, false);
EXPECT_EQ(str_util::trim(disasm.to_string(prog)), get_expected("jak3/ocean-mid-vu1"));
}
TEST(VuDisasm, OceanNear_Jak3) {
auto data = get_test_data("jak3/ocean-near-vu1");
VuDisassembler disasm(VuDisassembler::VuKind::VU1);
auto prog = disasm.disassemble(data.data(), data.size() * 4, false);
EXPECT_EQ(str_util::trim(disasm.to_string(prog)), get_expected("jak3/ocean-near-vu1"));
}
TEST(VuDisasm, OceanVu0_Jak3) {
auto data = get_test_data("jak3/ocean-vu0");
VuDisassembler disasm(VuDisassembler::VuKind::VU0);
auto prog = disasm.disassemble(data.data(), data.size() * 4, false);
EXPECT_EQ(str_util::trim(disasm.to_string(prog)), get_expected("jak3/ocean-vu0"));
}
TEST(VuDisasm, MercnericVu0_Jak3) {
auto data = get_test_data("jak3/mercneric-vu0");
VuDisassembler disasm(VuDisassembler::VuKind::VU0);
auto prog = disasm.disassemble(data.data(), data.size() * 4, false);
EXPECT_EQ(str_util::trim(disasm.to_string(prog)), get_expected("jak3/mercneric-vu0"));
}
TEST(VuDisasm, GenericVu0_Jak3) {
auto data = get_test_data("jak3/generic-vu0");
VuDisassembler disasm(VuDisassembler::VuKind::VU0);
auto prog = disasm.disassemble(data.data(), data.size() * 4, false);
EXPECT_EQ(str_util::trim(disasm.to_string(prog)), get_expected("jak3/generic-vu0"));
}
TEST(VuDisasm, GenericVu1_Jak3) {
auto data = get_test_data("jak3/generic-vu1");
VuDisassembler disasm(VuDisassembler::VuKind::VU1);
auto prog = disasm.disassemble(data.data(), data.size() * 4, false);
EXPECT_EQ(str_util::trim(disasm.to_string(prog)), get_expected("jak3/generic-vu1"));
}
TEST(VuDisasm, Merc_Jak3) {
auto data = get_test_data("jak3/merc-vu1");
VuDisassembler disasm(VuDisassembler::VuKind::VU1);
auto prog = disasm.disassemble(data.data(), data.size() * 4, false);
EXPECT_EQ(str_util::trim(disasm.to_string(prog)), get_expected("jak3/merc-vu1"));
}
TEST(VuDisasm, Emerc_Jak3) {
auto data = get_test_data("jak3/emerc-vu1");
VuDisassembler disasm(VuDisassembler::VuKind::VU1);
auto prog = disasm.disassemble(data.data(), data.size() * 4, false);
EXPECT_EQ(str_util::trim(disasm.to_string(prog)), get_expected("jak3/emerc-vu1"));
}
TEST(VuDisasm, ShrubVu1_Jak3) {
auto data = get_test_data("jak3/shrub-vu1");
VuDisassembler disasm(VuDisassembler::VuKind::VU1);
auto prog = disasm.disassemble(data.data(), data.size() * 4, false);
EXPECT_EQ(str_util::trim(disasm.to_string(prog)), get_expected("jak3/shrub-vu1"));
}
TEST(VuDisasm, Sprite_Jak3) {
auto data = get_test_data("jak3/sprite-vu1");
VuDisassembler disasm(VuDisassembler::VuKind::VU1);
auto prog = disasm.disassemble(data.data(), data.size() * 4, false);
EXPECT_EQ(str_util::trim(disasm.to_string(prog)), get_expected("jak3/sprite-vu1"));
}
TEST(VuDisasm, SpriteDistort_Jak3) {
auto data = get_test_data("jak3/sprite-distort-vu1");
VuDisassembler disasm(VuDisassembler::VuKind::VU1);
auto prog = disasm.disassemble(data.data(), data.size() * 4, false);
EXPECT_EQ(str_util::trim(disasm.to_string(prog)), get_expected("jak3/sprite-distort-vu1"));
}
TEST(VuDisasm, SpriteGlow_Jak3) {
auto data = get_test_data("jak3/sprite-glow-vu1");
VuDisassembler disasm(VuDisassembler::VuKind::VU1);
auto prog = disasm.disassemble(data.data(), data.size() * 4, false);
EXPECT_EQ(str_util::trim(disasm.to_string(prog)), get_expected("jak3/sprite-glow-vu1"));
}
TEST(VuDisasm, Hfrag_Jak3) {
auto data = get_test_data("jak3/hfrag-vu1");
VuDisassembler disasm(VuDisassembler::VuKind::VU1);
auto prog = disasm.disassemble(data.data(), data.size() * 4, false);
EXPECT_EQ(str_util::trim(disasm.to_string(prog)), get_expected("jak3/hfrag-vu1"));
}
TEST(VuDisasm, Tfrag_Jak3) {
auto data = get_test_data("jak3/tfrag-vu1");
VuDisassembler disasm(VuDisassembler::VuKind::VU1);
auto prog = disasm.disassemble(data.data(), data.size() * 4, false);
EXPECT_EQ(str_util::trim(disasm.to_string(prog)), get_expected("jak3/tfrag-vu1"));
}
TEST(VuDisasm, TfragNear_Jak3) {
auto data = get_test_data("jak3/tnear-vu1");
VuDisassembler disasm(VuDisassembler::VuKind::VU1);
auto prog = disasm.disassemble(data.data(), data.size() * 4, false);
EXPECT_EQ(str_util::trim(disasm.to_string(prog)), get_expected("jak3/tnear-vu1"));
}
TEST(VuDisasm, Tie_Jak3) {
auto data = get_test_data("jak3/tie-vu1");
VuDisassembler disasm(VuDisassembler::VuKind::VU1);
auto prog = disasm.disassemble(data.data(), data.size() * 4, false);
EXPECT_EQ(str_util::trim(disasm.to_string(prog)), get_expected("jak3/tie-vu1"));
}
TEST(VuDisasm, TieNear_Jak3) {
auto data = get_test_data("jak3/tie-near-vu1");
VuDisassembler disasm(VuDisassembler::VuKind::VU1);
auto prog = disasm.disassemble(data.data(), data.size() * 4, false);
EXPECT_EQ(str_util::trim(disasm.to_string(prog)), get_expected("jak3/tie-near-vu1"));
}
TEST(VuDisasm, Etie_Jak3) {
auto data = get_test_data("jak3/etie-vu1");
VuDisassembler disasm(VuDisassembler::VuKind::VU1);
auto prog = disasm.disassemble(data.data(), data.size() * 4, false);
EXPECT_EQ(str_util::trim(disasm.to_string(prog)), get_expected("jak3/etie-vu1"));
}
TEST(VuDisasm, EtieNear_Jak3) {
auto data = get_test_data("jak3/etn-vu1");
VuDisassembler disasm(VuDisassembler::VuKind::VU1);
auto prog = disasm.disassemble(data.data(), data.size() * 4, false);
EXPECT_EQ(str_util::trim(disasm.to_string(prog)), get_expected("jak3/etn-vu1"));
}
TEST(VuDisasm, BackgroundVu0_Jak3) {
auto data = get_test_data("jak3/background-vu0");
VuDisassembler disasm(VuDisassembler::VuKind::VU0);
auto prog = disasm.disassemble(data.data(), data.size() * 4, false);
EXPECT_EQ(str_util::trim(disasm.to_string(prog)), get_expected("jak3/background-vu0"));
}
TEST(VuDisasm, CollideVu0_Jak3) {
auto data = get_test_data("jak3/collide-vu0");
VuDisassembler disasm(VuDisassembler::VuKind::VU0);
auto prog = disasm.disassemble(data.data(), data.size() * 4, false);
EXPECT_EQ(str_util::trim(disasm.to_string(prog)), get_expected("jak3/collide-vu0"));
}
TEST(VuDisasm, BonesVu0_Jak3) {
auto data = get_test_data("jak3/bones-vu0");
VuDisassembler disasm(VuDisassembler::VuKind::VU0);
auto prog = disasm.disassemble(data.data(), data.size() * 4, false);
EXPECT_EQ(str_util::trim(disasm.to_string(prog)), get_expected("jak3/bones-vu0"));
}
TEST(VuDisasm, ForegroundVu0_Jak3) {
auto data = get_test_data("jak3/foreground-vu0");
VuDisassembler disasm(VuDisassembler::VuKind::VU0);
auto prog = disasm.disassemble(data.data(), data.size() * 4, false);
EXPECT_EQ(str_util::trim(disasm.to_string(prog)), get_expected("jak3/foreground-vu0"));
}
// TEST(VuDisasm, DumpResults_Jak2) {
// struct VuData {
// std::string name;
// std::vector<u32> data;
// VuDisassembler::VuKind kind;
// std::string disasm;
//
// VuData(const std::string& name, VuDisassembler::VuKind kind)
// : name(name), data(get_test_data("jak2/" + name)), kind(kind) {
// VuDisassembler vu_disasm(kind);
// disasm = vu_disasm.to_string(vu_disasm.disassemble(data.data(), data.size() * 4, false));
// }
// };
// auto path = file_util::get_file_path({"test/decompiler/vu_reference/jak2"});
// for (const auto& entry : fs::directory_iterator(path)) {
// if (entry.is_regular_file() &&
// entry.path().filename().string().find("result") == std::string::npos) {
// auto name = entry.path().filename().stem().string();
// auto kind = name.find("vu0") != std::string::npos ? VuDisassembler::VuKind::VU0
// : VuDisassembler::VuKind::VU1;
// VuData prog(name, kind);
// file_util::write_text_file(path + "/" + prog.name + "-result.txt", prog.disasm);
// }
// }
// }
TEST(VuDisasm, ShadowVu0_Jak2) {
auto data = get_test_data("jak2/shadow-vu0");
VuDisassembler disasm(VuDisassembler::VuKind::VU0);
auto prog = disasm.disassemble(data.data(), data.size() * 4, false);
EXPECT_EQ(str_util::trim(disasm.to_string(prog)), get_expected("jak2/shadow-vu0"));
}
TEST(VuDisasm, ShadowVu1_Jak2) {
auto data = get_test_data("jak2/shadow-vu1");
VuDisassembler disasm(VuDisassembler::VuKind::VU1);
auto prog = disasm.disassemble(data.data(), data.size() * 4, false);
EXPECT_EQ(str_util::trim(disasm.to_string(prog)), get_expected("jak2/shadow-vu1"));
}
TEST(VuDisasm, OceanTexture_Jak2) {
auto data = get_test_data("jak2/ocean-texture-vu1");
VuDisassembler disasm(VuDisassembler::VuKind::VU1);
auto prog = disasm.disassemble(data.data(), data.size() * 4, false);
EXPECT_EQ(str_util::trim(disasm.to_string(prog)), get_expected("jak2/ocean-texture-vu1"));
}
TEST(VuDisasm, OceanMid_Jak2) {
auto data = get_test_data("jak2/ocean-mid-vu1");
VuDisassembler disasm(VuDisassembler::VuKind::VU1);
auto prog = disasm.disassemble(data.data(), data.size() * 4, false);
EXPECT_EQ(str_util::trim(disasm.to_string(prog)), get_expected("jak2/ocean-mid-vu1"));
}
TEST(VuDisasm, OceanNear_Jak2) {
auto data = get_test_data("jak2/ocean-near-vu1");
VuDisassembler disasm(VuDisassembler::VuKind::VU1);
auto prog = disasm.disassemble(data.data(), data.size() * 4, false);
EXPECT_EQ(str_util::trim(disasm.to_string(prog)), get_expected("jak2/ocean-near-vu1"));
}
TEST(VuDisasm, OceanVu0_Jak2) {
auto data = get_test_data("jak2/ocean-vu0");
VuDisassembler disasm(VuDisassembler::VuKind::VU0);
auto prog = disasm.disassemble(data.data(), data.size() * 4, false);
EXPECT_EQ(str_util::trim(disasm.to_string(prog)), get_expected("jak2/ocean-vu0"));
}
TEST(VuDisasm, Merc_Jak2) {
auto data = get_test_data("jak2/merc-vu1");
VuDisassembler disasm(VuDisassembler::VuKind::VU1);
auto prog = disasm.disassemble(data.data(), data.size() * 4, false);
EXPECT_EQ(str_util::trim(disasm.to_string(prog)), get_expected("jak2/merc-vu1"));
}
TEST(VuDisasm, Emerc) {
auto data = get_test_data("jak2/emerc-vu1");
VuDisassembler disasm(VuDisassembler::VuKind::VU1);
auto prog = disasm.disassemble(data.data(), data.size() * 4, false);
EXPECT_EQ(str_util::trim(disasm.to_string(prog)), get_expected("jak2/emerc-vu1"));
}
TEST(VuDisasm, Shrub_Jak2) {
auto data = get_test_data("jak2/shrub-vu1");
VuDisassembler disasm(VuDisassembler::VuKind::VU1);
auto prog = disasm.disassemble(data.data(), data.size() * 4, false);
EXPECT_EQ(str_util::trim(disasm.to_string(prog)), get_expected("jak2/shrub-vu1"));
}
TEST(VuDisasm, Sprite_Jak2) {
auto data = get_test_data("jak2/sprite-vu1");
VuDisassembler disasm(VuDisassembler::VuKind::VU1);
auto prog = disasm.disassemble(data.data(), data.size() * 4, false);
EXPECT_EQ(str_util::trim(disasm.to_string(prog)), get_expected("jak2/sprite-vu1"));
}
TEST(VuDisasm, SpriteDistort_Jak2) {
auto data = get_test_data("jak2/sprite-distort-vu1");
VuDisassembler disasm(VuDisassembler::VuKind::VU1);
auto prog = disasm.disassemble(data.data(), data.size() * 4, false);
EXPECT_EQ(str_util::trim(disasm.to_string(prog)), get_expected("jak2/sprite-distort-vu1"));
}
TEST(VuDisasm, SpriteGlow_Jak2) {
auto data = get_test_data("jak2/sprite-glow-vu1");
VuDisassembler disasm(VuDisassembler::VuKind::VU1);
auto prog = disasm.disassemble(data.data(), data.size() * 4, false);
EXPECT_EQ(str_util::trim(disasm.to_string(prog)), get_expected("jak2/sprite-glow-vu1"));
}
TEST(VuDisasm, Tie_Jak2) {
auto data = get_test_data("jak2/tie-vu1");
VuDisassembler disasm(VuDisassembler::VuKind::VU1);
auto prog = disasm.disassemble(data.data(), data.size() * 4, false);
EXPECT_EQ(str_util::trim(disasm.to_string(prog)), get_expected("jak2/tie-vu1"));
}
TEST(VuDisasm, etie_Jak2) {
auto data = get_test_data("jak2/etie-vu1");
VuDisassembler disasm(VuDisassembler::VuKind::VU1);
auto prog = disasm.disassemble(data.data(), data.size() * 4, false);
EXPECT_EQ(str_util::trim(disasm.to_string(prog)), get_expected("jak2/etie-vu1"));
}
TEST(VuDisasm, SpriteDistort) {
auto data = get_test_data("jak1/sprite-distort");
VuDisassembler disasm(VuDisassembler::VuKind::VU1);
auto prog = disasm.disassemble(data.data(), data.size() * 4, false);
EXPECT_EQ(str_util::trim(disasm.to_string(prog)), get_expected("jak1/sprite-distort"));
}
TEST(VuDisasm, BackgroundVu0) {
auto data = get_test_data("jak1/background-vu0");
VuDisassembler disasm(VuDisassembler::VuKind::VU0);
auto prog = disasm.disassemble(data.data(), data.size() * 4, false);
EXPECT_EQ(str_util::trim(disasm.to_string(prog)), get_expected("jak1/background-vu0"));
}
TEST(VuDisasm, CollideVu0) {
auto data = get_test_data("jak1/collide-vu0");
VuDisassembler disasm(VuDisassembler::VuKind::VU0);
auto prog = disasm.disassemble(data.data(), data.size() * 4, false);
EXPECT_EQ(str_util::trim(disasm.to_string(prog)), get_expected("jak1/collide-vu0"));
}
TEST(VuDisasm, BonesVu0) {
auto data = get_test_data("jak1/bones-vu0");
VuDisassembler disasm(VuDisassembler::VuKind::VU0);
auto prog = disasm.disassemble(data.data(), data.size() * 4, false);
EXPECT_EQ(str_util::trim(disasm.to_string(prog)), get_expected("jak1/bones-vu0"));
}
TEST(VuDisasm, BonesVu0_Jak2) {
auto data = get_test_data("jak2/bones-vu0");
VuDisassembler disasm(VuDisassembler::VuKind::VU0);
auto prog = disasm.disassemble(data.data(), data.size() * 4, false);
EXPECT_EQ(str_util::trim(disasm.to_string(prog)), get_expected("jak2/bones-vu0"));
}
TEST(VuDisasm, ForegroundVu0_Jak2) {
auto data = get_test_data("jak2/foreground-vu0");
VuDisassembler disasm(VuDisassembler::VuKind::VU0);
auto prog = disasm.disassemble(data.data(), data.size() * 4, false);
EXPECT_EQ(str_util::trim(disasm.to_string(prog)), get_expected("jak2/foreground-vu0"));
}
TEST(VuDisasm, ShadowVu0) {
auto data = get_test_data("jak1/shadow-vu0");
VuDisassembler disasm(VuDisassembler::VuKind::VU0);
auto prog = disasm.disassemble(data.data(), data.size() * 4, false);
EXPECT_EQ(str_util::trim(disasm.to_string(prog)), get_expected("jak1/shadow-vu0"));
}
TEST(VuDisasm, OceanVu0) {
auto data = get_test_data("jak1/ocean-vu0");
VuDisassembler disasm(VuDisassembler::VuKind::VU0);
auto prog = disasm.disassemble(data.data(), data.size() * 4, false);
EXPECT_EQ(str_util::trim(disasm.to_string(prog)), get_expected("jak1/ocean-vu0"));
}
TEST(VuDisasm, GenericVu0) {
auto data = get_test_data("jak1/generic-vu0");
VuDisassembler disasm(VuDisassembler::VuKind::VU0);
// disasm.add_label_with_name(48, "JUMP_48");
auto prog = disasm.disassemble(data.data(), data.size() * 4, false);
EXPECT_EQ(str_util::trim(disasm.to_string(prog)), get_expected("jak1/generic-vu0"));
// fmt::print("{}\n", disasm.to_string_with_cpp(prog, true));
}
TEST(VuDisasm, MercnericVu0) {
auto data = get_test_data("jak1/mercneric-vu0");
VuDisassembler disasm(VuDisassembler::VuKind::VU0);
// disasm.add_label_with_name(314 - 280, "JUMP_314");
// disasm.add_label_with_name(326 - 280, "JUMP_326");
// disasm.add_label_with_name(353 - 280, "JUMP_353");
// disasm.add_label_with_name(386 - 280, "JUMP_386");
// disasm.add_label_with_name(427 - 280, "JUMP_427");
// disasm.add_label_with_name(438 - 280, "JUMP_438");
// disasm.add_label_with_name(454 - 280, "JUMP_454");
auto prog = disasm.disassemble(data.data(), data.size() * 4, false);
EXPECT_EQ(str_util::trim(disasm.to_string(prog)), get_expected("jak1/mercneric-vu0"));
// disasm.add_label_with_name(0, "vcallms_280");
// disasm.add_label_with_name(303 - 280, "vcallms_303");
// fmt::print("{}\n", disasm.to_string_with_cpp(prog, true));
}
TEST(VuDisasm, OceanTexture) {
auto data = get_test_data("jak1/ocean-texture");
VuDisassembler disasm(VuDisassembler::VuKind::VU1);
auto prog = disasm.disassemble(data.data(), data.size() * 4, false);
EXPECT_EQ(str_util::trim(disasm.to_string(prog)), get_expected("jak1/ocean-texture"));
}
TEST(VuDisasm, OceanMid) {
auto data = get_test_data("jak1/ocean-mid");
VuDisassembler disasm(VuDisassembler::VuKind::VU1);
/*
disasm.add_label_with_name(41, "JUMP_41");
disasm.add_label_with_name(43, "JUMP_43");
disasm.add_label_with_name(46, "JUMP_46");
disasm.add_label_with_name(73, "JUMP_73");
disasm.add_label_with_name(107, "JUMP_107");
disasm.add_label_with_name(275, "JUMP_275");
*/
auto prog = disasm.disassemble(data.data(), data.size() * 4, false);
EXPECT_EQ(str_util::trim(disasm.to_string(prog)), get_expected("jak1/ocean-mid"));
}
TEST(VuDisasm, OceanNear) {
auto data = get_test_data("jak1/ocean-near");
VuDisassembler disasm(VuDisassembler::VuKind::VU1);
// disasm.add_label_with_name(39, "JUMP_39");
auto prog = disasm.disassemble(data.data(), data.size() * 4, false);
// fmt::print("{}\n", disasm.to_string_with_cpp(prog, false));
EXPECT_EQ(str_util::trim(disasm.to_string(prog)), get_expected("jak1/ocean-near"));
}
TEST(VuDisasm, Sky) {
auto data = get_test_data("jak1/sky");
VuDisassembler disasm(VuDisassembler::VuKind::VU1);
auto prog = disasm.disassemble(data.data(), data.size() * 4, false);
EXPECT_EQ(str_util::trim(disasm.to_string(prog)), get_expected("jak1/sky"));
}
TEST(VuDisasm, Shrub) {
auto data = get_test_data("jak1/shrub");
VuDisassembler disasm(VuDisassembler::VuKind::VU1);
auto prog = disasm.disassemble(data.data(), data.size() * 4, false);
EXPECT_EQ(str_util::trim(disasm.to_string(prog)), get_expected("jak1/shrub"));
}
TEST(VuDisasm, Shadow) {
auto data = get_test_data("jak1/shadow");
VuDisassembler disasm(VuDisassembler::VuKind::VU1);
auto prog = disasm.disassemble(data.data(), data.size() * 4, false);
EXPECT_EQ(str_util::trim(disasm.to_string(prog)), get_expected("jak1/shadow"));
}
TEST(VuDisasm, TNear) {
auto data = get_test_data("jak1/tnear");
VuDisassembler disasm(VuDisassembler::VuKind::VU1);
auto prog = disasm.disassemble(data.data(), data.size() * 4, false);
EXPECT_EQ(str_util::trim(disasm.to_string(prog)), get_expected("jak1/tnear"));
}
TEST(VuDisasm, Sprite) {
auto data = get_test_data("jak1/sprite");
VuDisassembler disasm(VuDisassembler::VuKind::VU1);
auto prog = disasm.disassemble(data.data(), data.size() * 4, false);
EXPECT_EQ(str_util::trim(disasm.to_string(prog)), get_expected("jak1/sprite"));
}
TEST(VuDisasm, Tie) {
auto data = get_test_data("jak1/tie");
VuDisassembler disasm(VuDisassembler::VuKind::VU1);
auto prog = disasm.disassemble(data.data(), data.size() * 4, false);
EXPECT_EQ(str_util::trim(disasm.to_string(prog)), get_expected("jak1/tie"));
}
TEST(VuDisasm, Generic) {
auto data = get_test_data("jak1/generic");
VuDisassembler disasm(VuDisassembler::VuKind::VU1);
auto prog = disasm.disassemble(data.data(), data.size() * 4, false);
EXPECT_EQ(str_util::trim(disasm.to_string(prog)), get_expected("jak1/generic"));
// fmt::print("{}\n", disasm.to_string_with_cpp(prog, false));
}
TEST(VuDisasm, TieNear) {
auto data = get_test_data("jak1/tie-near");
VuDisassembler disasm(VuDisassembler::VuKind::VU1);
auto prog = disasm.disassemble(data.data(), data.size() * 4, false);
EXPECT_EQ(str_util::trim(disasm.to_string(prog)), get_expected("jak1/tie-near"));
}
TEST(VuDisasm, Tfrag) {
auto data = get_test_data("jak1/tfrag");
VuDisassembler disasm(VuDisassembler::VuKind::VU1);
auto prog = disasm.disassemble(data.data(), data.size() * 4, false);
EXPECT_EQ(str_util::trim(disasm.to_string(prog)), get_expected("jak1/tfrag"));
}
TEST(VuDisasm, Merc) {
auto data = get_test_data("jak1/merc");
VuDisassembler disasm(VuDisassembler::VuKind::VU1);
auto prog = disasm.disassemble(data.data(), data.size() * 4, false);
EXPECT_EQ(str_util::trim(disasm.to_string(prog)), get_expected("jak1/merc"));
}
TEST(VuDisasm, MercToC) {
auto data = get_test_data("jak1/merc");
VuDisassembler disasm(VuDisassembler::VuKind::VU1);
disasm.add_label_with_name(0x1a1, "JUMP_1A1");
disasm.add_label_with_name(0x48e, "JUMP_48E");
disasm.add_label_with_name(0x539, "JUMP_539");
disasm.add_label_with_name(0x243, "JUMP_243");
disasm.add_label_with_name(20, "ENTER_20");
disasm.add_label_with_name(35, "ENTER_35");
auto prog = disasm.disassemble(data.data(), data.size() * 4, false);
// fmt::print("{}\n", disasm.to_string_with_cpp(prog));
// EXPECT_EQ(disasm.to_string_with_cpp(prog), get_expected("merc"));
}