1 #ifdef WITH_UNITTESTS
2 #include "gtest/gtest.h"
3
4 #include "game/Tactical/Items.h"
5
6 #include "AmmoTypeModel.h"
7 #include "CalibreModel.h"
8 #include "DefaultContentManager.h"
9 #include "DefaultContentManagerUT.h"
10 #include "GameInstance.h"
11 #include "GamePolicy.h"
12 #include "MagazineModel.h"
13 #include "WeaponModels.h"
14
TEST(Items,weaponsLoading)15 TEST(Items, weaponsLoading)
16 {
17 DefaultContentManager * cm = DefaultContentManagerUT::createDefaultCMForTesting();
18 ASSERT_TRUE(cm != NULL);
19 ASSERT_TRUE(cm->loadGameData());
20 EXPECT_TRUE(cm->getWeaponByName("MP5K") != NULL);
21 EXPECT_TRUE(cm->getWeapon(9 /* MP5K */) != NULL);
22 EXPECT_EQ(cm->getWeaponByName("MP5K"), cm->getWeapon(9 /* MP5K */));
23 delete cm;
24 }
25
TEST(Items,bug120_cawsAmmo)26 TEST(Items, bug120_cawsAmmo)
27 {
28 DefaultContentManager * cm = DefaultContentManagerUT::createDefaultCMForTesting();
29 ASSERT_TRUE(cm->loadGameData());
30
31 // test SAP clip parameters
32 const MagazineModel* sapClip = cm->getMagazineByName("CLIPCAWS_10_SAP");
33 EXPECT_EQ(sapClip->calibre->internalName, ST::string("AMMOCAWS"));
34 EXPECT_EQ(sapClip->ammoType->internalName, ST::string("AMMO_SUPER_AP"));
35
36 // test FLECH clip parameters
37 const MagazineModel* flechClip = cm->getMagazineByName("CLIPCAWS_10_FLECH");
38 EXPECT_EQ(flechClip->calibre->internalName, ST::string("AMMOCAWS"));
39 EXPECT_EQ(flechClip->ammoType->internalName, ST::string("AMMO_BUCKSHOT"));
40
41 delete cm;
42 }
43
TEST(Items,bug120_12gAmmo)44 TEST(Items, bug120_12gAmmo)
45 {
46 DefaultContentManager * cm = DefaultContentManagerUT::createDefaultCMForTesting();
47 ASSERT_TRUE(cm->loadGameData());
48
49 // test SAP clip parameters
50 const MagazineModel* clip = cm->getMagazineByName("CLIP12G_7");
51 EXPECT_EQ(clip->calibre->internalName, ST::string("AMMO12G"));
52 EXPECT_EQ(clip->ammoType->internalName, ST::string("AMMO_REGULAR"));
53
54 // test FLECH clip parameters
55 const MagazineModel* clipBuckshot = cm->getMagazineByName("CLIP12G_7_BUCKSHOT");
56 EXPECT_EQ(clipBuckshot->calibre->internalName, ST::string("AMMO12G"));
57 EXPECT_EQ(clipBuckshot->ammoType->internalName, ST::string("AMMO_BUCKSHOT"));
58
59 delete cm;
60 }
61
TEST(Items,bug120_cawsDefaultMag)62 TEST(Items, bug120_cawsDefaultMag)
63 {
64 DefaultContentManager * cm = DefaultContentManagerUT::createDefaultCMForTesting();
65 ASSERT_TRUE(cm->loadGameData());
66
67 GCM = cm;
68
69 const WeaponModel *caws = cm->getWeaponByName("CAWS");
70 ASSERT_TRUE(caws != NULL);
71
72 const MagazineModel* flechClip = cm->getMagazineByName("CLIPCAWS_10_FLECH");
73 const MagazineModel* sapClip = cm->getMagazineByName("CLIPCAWS_10_SAP");
74 ASSERT_TRUE(flechClip != NULL);
75 ASSERT_TRUE(sapClip != NULL);
76
77 EXPECT_EQ(DefaultMagazine(caws->getItemIndex()), flechClip->getItemIndex());
78
79 EXPECT_EQ(FindReplacementMagazine(sapClip->calibre, 10, AMMO_BUCKSHOT), flechClip->getItemIndex());
80 EXPECT_EQ(FindReplacementMagazine(sapClip->calibre, 10, AMMO_SUPER_AP), sapClip->getItemIndex());
81
82 delete cm;
83 }
84
TEST(Items,bug120_spas15DefaultMag)85 TEST(Items, bug120_spas15DefaultMag)
86 {
87 DefaultContentManager * cm = DefaultContentManagerUT::createDefaultCMForTesting();
88 ASSERT_TRUE(cm->loadGameData());
89
90 GCM = cm;
91
92 const WeaponModel *spas15 = cm->getWeaponByName("SPAS15");
93 ASSERT_TRUE(spas15 != NULL);
94
95 const MagazineModel* clipBuckshot = cm->getMagazineByName("CLIP12G_7_BUCKSHOT");
96 const MagazineModel* clip = cm->getMagazineByName("CLIP12G_7");
97 ASSERT_TRUE(clipBuckshot != NULL);
98 ASSERT_TRUE(clip != NULL);
99
100 EXPECT_EQ(DefaultMagazine(spas15->getItemIndex()), clipBuckshot->getItemIndex());
101
102 EXPECT_EQ(FindReplacementMagazine(clip->calibre, 7, AMMO_BUCKSHOT), clipBuckshot->getItemIndex());
103 EXPECT_EQ(FindReplacementMagazine(clip->calibre, 7, AMMO_REGULAR), clip->getItemIndex());
104
105 delete cm;
106 }
107
TEST(Items,ValidLaunchable)108 TEST(Items, ValidLaunchable)
109 {
110 EXPECT_TRUE(ValidLaunchable(MORTAR_SHELL, MORTAR));
111 EXPECT_FALSE(ValidLaunchable(MORTAR_SHELL, MORTAR_SHELL));
112 EXPECT_FALSE(ValidLaunchable(MORTAR_SHELL, TANK_CANNON));
113 EXPECT_FALSE(ValidLaunchable(MORTAR, MORTAR_SHELL));
114 EXPECT_TRUE(ValidLaunchable(GL_HE_GRENADE, GLAUNCHER));
115 EXPECT_TRUE(ValidLaunchable(GL_HE_GRENADE, UNDER_GLAUNCHER));
116
117 // Check if the function handles some random garbage input
118 EXPECT_FALSE(ValidLaunchable(BATTERIES, WINE));
119 EXPECT_FALSE(ValidLaunchable(0xf123, 0x97b2));
120 }
121
TEST(Items,GetLauncherFromLaunchable)122 TEST(Items, GetLauncherFromLaunchable)
123 {
124 EXPECT_EQ(GetLauncherFromLaunchable(GL_TEARGAS_GRENADE), GLAUNCHER);
125 EXPECT_EQ(GetLauncherFromLaunchable(MORTAR_SHELL), MORTAR);
126 EXPECT_EQ(GetLauncherFromLaunchable(TANK_SHELL), TANK_CANNON);
127 EXPECT_EQ(GetLauncherFromLaunchable(TANK_CANNON), NOTHING);
128
129 // Check if the function handles some random garbage input
130 EXPECT_EQ(GetLauncherFromLaunchable(G11), NOTHING);
131 EXPECT_EQ(GetLauncherFromLaunchable(0xe941), NOTHING);
132 }
133
TEST(Items,ValidAttachment)134 TEST(Items, ValidAttachment)
135 {
136 auto const oldGCM{GCM};
137 std::unique_ptr<DefaultContentManager> const cm(DefaultContentManagerUT::createDefaultCMForTesting());
138 ASSERT_TRUE(cm->loadGameData());
139 GCM = cm.get();
140
141 bool& extra_attachments = const_cast<GamePolicy *>(cm->getGamePolicy())->extra_attachments;
142
143 extra_attachments = false;
144 EXPECT_TRUE(ValidAttachment(ITEMDEFINE::DETONATOR, ITEMDEFINE::HMX));
145 EXPECT_TRUE(ValidAttachment(ITEMDEFINE::DETONATOR, ITEMDEFINE::TNT));
146 EXPECT_TRUE(ValidAttachment(ITEMDEFINE::CHEWING_GUM, ITEMDEFINE::FUMBLE_PAK));
147 EXPECT_FALSE(ValidAttachment(ITEMDEFINE::UVGOGGLES, ITEMDEFINE::SPECTRA_HELMET));;
148 EXPECT_FALSE(ValidAttachment(ITEMDEFINE::SUNGOGGLES, ITEMDEFINE::SPECTRA_HELMET));;
149 EXPECT_FALSE(ValidAttachment(ITEMDEFINE::ADRENALINE_BOOSTER, ITEMDEFINE::KEVLAR_LEGGINGS_Y));
150 EXPECT_FALSE(ValidAttachment(ITEMDEFINE::AUTO_ROCKET_RIFLE, ITEMDEFINE::BRASS_KNUCKLES));
151 EXPECT_FALSE(ValidAttachment(0xf083, 0x8c12)); // Random junk crashes the old version of ValidAttachment
152
153 // Next test relies on a certain order of the vests
154 static_assert(ITEMDEFINE::SPECTRA_VEST_Y - ITEMDEFINE::FLAK_JACKET == 8);
155 int count = 0;
156 for (int i = ITEMDEFINE::FLAK_JACKET; i <= ITEMDEFINE::SPECTRA_VEST_Y; ++i)
157 {
158 if (ValidAttachment(ITEMDEFINE::CERAMIC_PLATES, i)) ++count;
159 }
160 EXPECT_EQ(count, 9);
161
162 extra_attachments = true;
163 EXPECT_TRUE(ValidAttachment(ITEMDEFINE::DETONATOR, ITEMDEFINE::HMX));
164 EXPECT_TRUE(ValidAttachment(ITEMDEFINE::DETONATOR, ITEMDEFINE::TNT));
165 EXPECT_TRUE(ValidAttachment(ITEMDEFINE::CHEWING_GUM, ITEMDEFINE::FUMBLE_PAK));
166 EXPECT_TRUE(ValidAttachment(ITEMDEFINE::UVGOGGLES, ITEMDEFINE::SPECTRA_HELMET));;
167 EXPECT_TRUE(ValidAttachment(ITEMDEFINE::UVGOGGLES, ITEMDEFINE::KEVLAR_HELMET_18));;
168 EXPECT_TRUE(ValidAttachment(ITEMDEFINE::SUNGOGGLES, ITEMDEFINE::SPECTRA_HELMET));;
169 EXPECT_TRUE(ValidAttachment(ITEMDEFINE::ADRENALINE_BOOSTER, ITEMDEFINE::KEVLAR_LEGGINGS_Y));
170 EXPECT_FALSE(ValidAttachment(ITEMDEFINE::SUNGOGGLES, ITEMDEFINE::SPECTRA_VEST));;
171 EXPECT_FALSE(ValidAttachment(ITEMDEFINE::AUTO_ROCKET_RIFLE, ITEMDEFINE::BRASS_KNUCKLES));
172 EXPECT_FALSE(ValidAttachment(0xf083, 0x8c12));
173
174 GCM = oldGCM;
175 }
176
TEST(Items,CompatibleFaceItem)177 TEST(Items, CompatibleFaceItem)
178 {
179 EXPECT_TRUE(CompatibleFaceItem(ITEMDEFINE::NIGHTGOGGLES, ITEMDEFINE::EXTENDEDEAR));
180 EXPECT_TRUE(CompatibleFaceItem(ITEMDEFINE::EXTENDEDEAR, ITEMDEFINE::NIGHTGOGGLES));
181 EXPECT_FALSE(CompatibleFaceItem(ITEMDEFINE::EXTENDEDEAR, ITEMDEFINE::EXTENDEDEAR));
182 EXPECT_TRUE(CompatibleFaceItem(ITEMDEFINE::WALKMAN, ITEMDEFINE::GASMASK));
183 EXPECT_FALSE(CompatibleFaceItem(ITEMDEFINE::UVGOGGLES, ITEMDEFINE::RDX));
184 EXPECT_TRUE(CompatibleFaceItem(0xda83, NOTHING)); // item2 == NOTHING is a special case
185 EXPECT_FALSE(CompatibleFaceItem(0x75e4, 0xcafe));
186 for (int i = 0; i <= 0xffff; ++i)
187 {
188 EXPECT_FALSE(CompatibleFaceItem(i, ITEMDEFINE::STEEL_HELMET));
189 }
190 }
191
192 #endif
193