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