• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

ParadoxGameConverters / Vic3ToHoI4 / 16148072694

08 Jul 2025 03:49PM UTC coverage: 94.191% (-0.02%) from 94.211%
16148072694

Pull #736

github

web-flow
Merge 4b596389a into 872e54c95
Pull Request #736: Add a clang-tidy configuration

88 of 107 new or added lines in 34 files covered. (82.24%)

22 existing lines in 6 files now uncovered.

22002 of 23359 relevant lines covered (94.19%)

56720.31 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

98.95
/src/hoi4_world/countries/hoi4_country_converter_tests.cpp
1
#include <external/commonItems/external/googletest/googlemock/include/gmock/gmock-matchers.h>
2
#include <external/commonItems/external/googletest/googletest/include/gtest/gtest.h>
3

4
#include <sstream>
5

6
#include "src/hoi4_world/countries/hoi4_country_converter.h"
7
#include "src/mappers/country/country_mapper.h"
8
#include "src/vic3_world/countries/vic3_country.h"
9
#include "src/vic3_world/world/vic3_world.h"
10

11

12

13
namespace hoi4
14
{
15

16
TEST(Hoi4worldCountriesCountryConverter, SourceCountryNumberIsFromSourceCountry)
4✔
17
{
18
   const vic3::World source_world = vic3::World(vic3::WorldOptions());
1✔
19
   const mappers::CountryMapper country_mapper({{1, "T00"}, {2, "T01"}});
3✔
20
   const vic3::Country source_country_one({.number = 1, .color = commonItems::Color{std::array{1, 2, 3}}});
1✔
21
   const vic3::Country source_country_two({.number = 2, .color = commonItems::Color{std::array{2, 4, 6}}});
1✔
22
   std::map<int, Character> dummy_characters;
1✔
23
   std::map<std::string, mappers::CultureQueue> dummy_culture_queues;
1✔
24
   mappers::TemplateMap templates;
1✔
25

26
   const auto country_one = ConvertCountry(source_world,
27
       source_country_one,
28
       commonItems::LocalizationDatabase{{}, {}},
2✔
29
       country_mapper,
30
       {},
31
       mappers::IdeologyMapper({}, {}),
2✔
32
       mappers::UnitMapper(templates),
2✔
33
       {},
34
       {},
35
       {},
36
       {},
37
       {},
38
       {},
39
       mappers::CultureGraphicsMapper{{}},
2✔
40
       mappers::LeaderTypeMapper({}),
2✔
41
       mappers::CharacterTraitMapper({}, {}, {}, {}),
2✔
42
       {0, {}},
43
       {},
44
       dummy_characters,
45
       dummy_culture_queues);
6✔
46
   const auto country_two = ConvertCountry(source_world,
47
       source_country_two,
48
       commonItems::LocalizationDatabase{{}, {}},
2✔
49
       country_mapper,
50
       {},
51
       mappers::IdeologyMapper({}, {}),
2✔
52
       mappers::UnitMapper(templates),
2✔
53
       {},
54
       {},
55
       {},
56
       {},
57
       {},
58
       {},
59
       mappers::CultureGraphicsMapper{{}},
2✔
60
       mappers::LeaderTypeMapper({}),
2✔
61
       mappers::CharacterTraitMapper({}, {}, {}, {}),
2✔
62
       {0, {}},
63
       {},
64
       dummy_characters,
65
       dummy_culture_queues);
6✔
66

67
   ASSERT_TRUE(country_one.has_value());
1✔
68
   EXPECT_EQ(country_one->GetSourceCountryNumber(), 1);
1✔
69
   ASSERT_TRUE(country_two.has_value());
1✔
70
   EXPECT_EQ(country_two->GetSourceCountryNumber(), 2);
1✔
71
}
6✔
72

73

74
TEST(Hoi4worldCountriesCountryConverter, TagIsFromSourceCountry)
4✔
75
{
76
   const vic3::World source_world = vic3::World(vic3::WorldOptions());
1✔
77
   const mappers::CountryMapper country_mapper({{1, "T00"}, {2, "T01"}});
3✔
78
   const vic3::Country source_country_one({.number = 1, .color = commonItems::Color{std::array{1, 2, 3}}});
1✔
79
   const vic3::Country source_country_two({.number = 2, .color = commonItems::Color{std::array{2, 4, 6}}});
1✔
80
   std::map<int, Character> dummy_characters;
1✔
81
   std::map<std::string, mappers::CultureQueue> dummy_culture_queues;
1✔
82
   mappers::TemplateMap templates;
1✔
83

84
   const auto country_one = ConvertCountry(source_world,
85
       source_country_one,
86
       commonItems::LocalizationDatabase{{}, {}},
2✔
87
       country_mapper,
88
       {},
89
       mappers::IdeologyMapper({}, {}),
2✔
90
       mappers::UnitMapper(templates),
2✔
91
       {},
92
       {},
93
       {},
94
       {},
95
       {},
96
       {},
97
       mappers::CultureGraphicsMapper{{}},
2✔
98
       mappers::LeaderTypeMapper({}),
2✔
99
       mappers::CharacterTraitMapper({}, {}, {}, {}),
2✔
100
       {0, {}},
101
       {},
102
       dummy_characters,
103
       dummy_culture_queues);
6✔
104
   const auto country_two = ConvertCountry(source_world,
105
       source_country_two,
106
       commonItems::LocalizationDatabase{{}, {}},
2✔
107
       country_mapper,
108
       {},
109
       mappers::IdeologyMapper({}, {}),
2✔
110
       mappers::UnitMapper(templates),
2✔
111
       {},
112
       {},
113
       {},
114
       {},
115
       {},
116
       {},
117
       mappers::CultureGraphicsMapper{{}},
2✔
118
       mappers::LeaderTypeMapper({}),
2✔
119
       mappers::CharacterTraitMapper({}, {}, {}, {}),
2✔
120
       {0, {}},
121
       {},
122
       dummy_characters,
123
       dummy_culture_queues);
6✔
124

125
   ASSERT_TRUE(country_one.has_value());
1✔
126
   EXPECT_EQ(country_one->GetTag(), "T00");
1✔
127
   EXPECT_EQ(country_one->GetColor(), commonItems::Color(std::array{1, 2, 3}));
1✔
128
   ASSERT_TRUE(country_two.has_value());
1✔
129
   EXPECT_EQ(country_two->GetTag(), "T01");
1✔
130
   EXPECT_EQ(country_two->GetColor(), commonItems::Color(std::array{2, 4, 6}));
1✔
131
}
6✔
132

133

134
TEST(Hoi4worldCountriesCountryConverter, NoCountryIfNoSourceTag)
4✔
135
{
136
   const mappers::CountryMapper country_mapper(std::map<int, std::string>{
4✔
137
       {1, "T00"},
×
138
   });
3✔
139
   const vic3::World source_world = vic3::World(vic3::WorldOptions());
1✔
140
   const vic3::Country source_country_one({});
1✔
141
   std::map<int, Character> dummy_characters;
1✔
142
   std::map<std::string, mappers::CultureQueue> dummy_culture_queues;
1✔
143
   mappers::TemplateMap templates;
1✔
144

145
   const auto country_one = ConvertCountry(source_world,
146
       source_country_one,
147
       commonItems::LocalizationDatabase{{}, {}},
2✔
148
       country_mapper,
149
       {},
150
       mappers::IdeologyMapper({}, {}),
2✔
151
       mappers::UnitMapper(templates),
2✔
152
       {},
153
       {},
154
       {},
155
       {},
156
       {},
157
       {},
158
       mappers::CultureGraphicsMapper{{}},
2✔
159
       mappers::LeaderTypeMapper({}),
2✔
160
       mappers::CharacterTraitMapper({}, {}, {}, {}),
2✔
161
       {0, {}},
162
       {},
163
       dummy_characters,
164
       dummy_culture_queues);
6✔
165

166
   EXPECT_EQ(country_one, std::nullopt);
1✔
167
}
4✔
168

169

170

171
TEST(Hoi4worldCountriesCountryConverter, NoCountryIfNoTagMapping)
4✔
172
{
173
   const vic3::World source_world = vic3::World(vic3::WorldOptions());
1✔
174
   const mappers::CountryMapper country_mapper;
1✔
175
   const vic3::Country source_country_one({.number = 1});
1✔
176
   std::map<int, Character> dummy_characters;
1✔
177
   std::map<std::string, mappers::CultureQueue> dummy_culture_queues;
1✔
178
   mappers::TemplateMap templates;
1✔
179

180
   const auto country_one = ConvertCountry(source_world,
181
       source_country_one,
182
       commonItems::LocalizationDatabase{{}, {}},
2✔
183
       country_mapper,
184
       {},
185
       mappers::IdeologyMapper({}, {}),
2✔
186
       mappers::UnitMapper(templates),
2✔
187
       {},
188
       {},
189
       {},
190
       {},
191
       {},
192
       {},
193
       mappers::CultureGraphicsMapper{{}},
2✔
194
       mappers::LeaderTypeMapper({}),
2✔
195
       mappers::CharacterTraitMapper({}, {}, {}, {}),
2✔
196
       {0, {}},
197
       {},
198
       dummy_characters,
199
       dummy_culture_queues);
6✔
200

201
   EXPECT_EQ(country_one, std::nullopt);
1✔
202
}
3✔
203

204

205
TEST(Hoi4worldCountriesCountryConverter, CapitalStatesAreConverted)
4✔
206
{
207
   const vic3::World source_world = vic3::World(vic3::WorldOptions());
1✔
208
   const mappers::CountryMapper country_mapper({{1, "TAG"}, {2, "TWO"}});
3✔
209
   const vic3::Country source_country_one({.number = 1, .capital_state = 2});
1✔
210
   const vic3::Country source_country_two({.number = 2, .capital_state = 3});
1✔
211
   std::map<int, Character> dummy_characters;
1✔
212
   std::map<std::string, mappers::CultureQueue> dummy_culture_queues;
1✔
213
   mappers::TemplateMap templates;
1✔
214

215
   const States states({.vic3_state_ids_to_hoi4_state_ids{{2, 4}, {3, 9}}});
1✔
216

217
   const auto country_one = ConvertCountry(source_world,
218
       source_country_one,
219
       commonItems::LocalizationDatabase{{}, {}},
2✔
220
       country_mapper,
221
       states,
222
       mappers::IdeologyMapper({}, {}),
2✔
223
       mappers::UnitMapper(templates),
2✔
224
       {},
225
       {},
226
       {},
227
       {},
228
       {},
229
       {},
230
       mappers::CultureGraphicsMapper{{}},
2✔
231
       mappers::LeaderTypeMapper({}),
2✔
232
       mappers::CharacterTraitMapper({}, {}, {}, {}),
2✔
233
       {0, {}},
234
       {},
235
       dummy_characters,
236
       dummy_culture_queues);
5✔
237
   const auto country_two = ConvertCountry(source_world,
238
       source_country_two,
239
       commonItems::LocalizationDatabase{{}, {}},
2✔
240
       country_mapper,
241
       states,
242
       mappers::IdeologyMapper({}, {}),
2✔
243
       mappers::UnitMapper(templates),
2✔
244
       {},
245
       {},
246
       {},
247
       {},
248
       {},
249
       {},
250
       mappers::CultureGraphicsMapper{{}},
2✔
251
       mappers::LeaderTypeMapper({}),
2✔
252
       mappers::CharacterTraitMapper({}, {}, {}, {}),
2✔
253
       {0, {}},
254
       {},
255
       dummy_characters,
256
       dummy_culture_queues);
5✔
257

258
   ASSERT_TRUE(country_one.has_value());
1✔
259
   EXPECT_EQ(country_one->GetCapitalState(), std::optional(4));
1✔
260
   ASSERT_TRUE(country_two.has_value());
1✔
261
   EXPECT_EQ(country_two->GetCapitalState(), std::optional(9));
1✔
262
}
4✔
263

264

265
TEST(Hoi4worldCountriesCountryConverter, NoCapitalStateIfNoSourceCapitalState)
4✔
266
{
267
   const vic3::World source_world = vic3::World(vic3::WorldOptions());
1✔
268
   const mappers::CountryMapper country_mapper({{1, "TAG"}, {2, "TWO"}});
3✔
269
   const vic3::Country source_country_one({
270
       .number = 1,
271
   });
1✔
272
   std::map<int, Character> dummy_characters;
1✔
273
   std::map<std::string, mappers::CultureQueue> dummy_culture_queues;
1✔
274
   mappers::TemplateMap templates;
1✔
275

276
   const States states({.vic3_state_ids_to_hoi4_state_ids{{2, 4}}});
1✔
277

278
   const auto country_one = ConvertCountry(source_world,
279
       source_country_one,
280
       commonItems::LocalizationDatabase{{}, {}},
2✔
281
       country_mapper,
282
       states,
283
       mappers::IdeologyMapper({}, {}),
2✔
284
       mappers::UnitMapper(templates),
2✔
285
       {},
286
       {},
287
       {},
288
       {},
289
       {},
290
       {},
291
       mappers::CultureGraphicsMapper{{}},
2✔
292
       mappers::LeaderTypeMapper({}),
2✔
293
       mappers::CharacterTraitMapper({}, {}, {}, {}),
2✔
294
       {0, {}},
295
       {},
296
       dummy_characters,
297
       dummy_culture_queues);
5✔
298

299
   ASSERT_TRUE(country_one.has_value());
1✔
300
   EXPECT_EQ(country_one->GetCapitalState(), std::nullopt);
1✔
301
}
3✔
302

303

304
TEST(Hoi4worldCountriesCountryConverter, NoCapitalStateIfNoStateMappingAndNoStates)
4✔
305
{
306
   const vic3::World source_world = vic3::World(vic3::WorldOptions());
1✔
307
   const mappers::CountryMapper country_mapper({{1, "TAG"}, {2, "TWO"}});
3✔
308
   const vic3::Country source_country_one({.number = 1, .capital_state = 2});
1✔
309
   std::map<int, Character> dummy_characters;
1✔
310
   std::map<std::string, mappers::CultureQueue> dummy_culture_queues;
1✔
311
   mappers::TemplateMap templates;
1✔
312

313
   const auto country_one = ConvertCountry(source_world,
314
       source_country_one,
315
       commonItems::LocalizationDatabase{{}, {}},
2✔
316
       country_mapper,
317
       {},
318
       mappers::IdeologyMapper({}, {}),
2✔
319
       mappers::UnitMapper(templates),
2✔
320
       {},
321
       {},
322
       {},
323
       {},
324
       {},
325
       {},
326
       mappers::CultureGraphicsMapper{{}},
2✔
327
       mappers::LeaderTypeMapper({}),
2✔
328
       mappers::CharacterTraitMapper({}, {}, {}, {}),
2✔
329
       {0, {}},
330
       {},
331
       dummy_characters,
332
       dummy_culture_queues);
6✔
333

334
   ASSERT_TRUE(country_one.has_value());
1✔
335
   EXPECT_EQ(country_one->GetCapitalState(), std::nullopt);
1✔
336
}
4✔
337

338

339
TEST(Hoi4worldCountriesCountryConverter, HighestVpStateBecomesCapitalIfCapitalNotConverted)
4✔
340
{
341
   const vic3::World source_world = vic3::World(vic3::WorldOptions());
1✔
342
   const mappers::CountryMapper country_mapper({{1, "TAG"}, {2, "TWO"}});
3✔
343
   const vic3::Country source_country_one({.number = 1});
1✔
344
   std::map<int, Character> dummy_characters;
1✔
345
   std::map<std::string, mappers::CultureQueue> dummy_culture_queues;
1✔
346
   mappers::TemplateMap templates;
1✔
347
   const States states({.states{
348
       State(1, {.owner = "TAG", .victory_points = {{1, 1}, {2, 2}, {3, 3}}}),
349
       State(2, {.owner = "TAG", .victory_points = {{2, 2}, {4, 4}, {6, 6}}}),
350
       State(3, {.owner = "TAG", .victory_points = {{1, 1}, {2, 1}, {3, 1}}}),
351
   }});
4✔
352

353
   const auto country_one = ConvertCountry(source_world,
354
       source_country_one,
355
       commonItems::LocalizationDatabase{{}, {}},
2✔
356
       country_mapper,
357
       states,
358
       mappers::IdeologyMapper({}, {}),
2✔
359
       mappers::UnitMapper(templates),
2✔
360
       {},
361
       {},
362
       {},
363
       {},
364
       {},
365
       {},
366
       mappers::CultureGraphicsMapper{{}},
2✔
367
       mappers::LeaderTypeMapper({}),
2✔
368
       mappers::CharacterTraitMapper({}, {}, {}, {}),
2✔
369
       {0, {}},
370
       {},
371
       dummy_characters,
372
       dummy_culture_queues);
5✔
373

374
   ASSERT_TRUE(country_one.has_value());
1✔
375
   EXPECT_EQ(country_one->GetCapitalState(), std::optional(2));
1✔
376
}
5✔
377

378

379
TEST(Hoi4worldCountriesCountryConverter, HighestIndustryStateBecomesCapitalIfVpsAreSame)
4✔
380
{
381
   const vic3::World source_world = vic3::World(vic3::WorldOptions());
1✔
382
   const mappers::CountryMapper country_mapper({{1, "TAG"}, {2, "TWO"}});
3✔
383
   const vic3::Country source_country_one({.number = 1});
1✔
384
   std::map<int, Character> dummy_characters;
1✔
385
   std::map<std::string, mappers::CultureQueue> dummy_culture_queues;
1✔
386
   mappers::TemplateMap templates;
1✔
387
   const States states({.states{
388
       State(1, {.owner = "TAG", .civilian_factories = 1, .military_factories = 2, .dockyards = 3}),
389
       State(2, {.owner = "TAG", .civilian_factories = 2, .military_factories = 4, .dockyards = 6}),
390
       State(3, {.owner = "TAG", .civilian_factories = 1, .military_factories = 1, .dockyards = 1}),
391
   }});
4✔
392

393
   const auto country_one = ConvertCountry(source_world,
394
       source_country_one,
395
       commonItems::LocalizationDatabase{{}, {}},
2✔
396
       country_mapper,
397
       states,
398
       mappers::IdeologyMapper({}, {}),
2✔
399
       mappers::UnitMapper(templates),
2✔
400
       {},
401
       {},
402
       {},
403
       {},
404
       {},
405
       {},
406
       mappers::CultureGraphicsMapper{{}},
2✔
407
       mappers::LeaderTypeMapper({}),
2✔
408
       mappers::CharacterTraitMapper({}, {}, {}, {}),
2✔
409
       {0, {}},
410
       {},
411
       dummy_characters,
412
       dummy_culture_queues);
5✔
413

414
   ASSERT_TRUE(country_one.has_value());
1✔
415
   EXPECT_EQ(country_one->GetCapitalState(), std::optional(2));
1✔
416
}
5✔
417

418

419
TEST(Hoi4worldCountriesCountryConverter, HighestManpowerStateBecomesCapitalIfIndustriesAreSame)
4✔
420
{
421
   const vic3::World source_world = vic3::World(vic3::WorldOptions());
1✔
422
   const mappers::CountryMapper country_mapper({{1, "TAG"}, {2, "TWO"}});
3✔
423
   const vic3::Country source_country_one({.number = 1});
1✔
424
   std::map<int, Character> dummy_characters;
1✔
425
   std::map<std::string, mappers::CultureQueue> dummy_culture_queues;
1✔
426
   mappers::TemplateMap templates;
1✔
427
   const States states({.states{
428
       State(1, {.owner = "TAG", .manpower = 1234}),
429
       State(2, {.owner = "TAG", .manpower = 2468}),
430
       State(3, {.owner = "TAG", .manpower = 1111}),
431
   }});
4✔
432

433
   const auto country_one = ConvertCountry(source_world,
434
       source_country_one,
435
       commonItems::LocalizationDatabase{{}, {}},
2✔
436
       country_mapper,
437
       states,
438
       mappers::IdeologyMapper({}, {}),
2✔
439
       mappers::UnitMapper(templates),
2✔
440
       {},
441
       {},
442
       {},
443
       {},
444
       {},
445
       {},
446
       mappers::CultureGraphicsMapper{{}},
2✔
447
       mappers::LeaderTypeMapper({}),
2✔
448
       mappers::CharacterTraitMapper({}, {}, {}, {}),
2✔
449
       {0, {}},
450
       {},
451
       dummy_characters,
452
       dummy_culture_queues);
5✔
453

454
   ASSERT_TRUE(country_one.has_value());
1✔
455
   EXPECT_EQ(country_one->GetCapitalState(), std::optional(2));
1✔
456
}
5✔
457

458

459
TEST(Hoi4worldCountriesCountryConverter, LowestIdStateBecomesCapitalIfManpowersAreSame)
4✔
460
{
461
   const vic3::World source_world = vic3::World(vic3::WorldOptions());
1✔
462
   const mappers::CountryMapper country_mapper({{1, "TAG"}, {2, "TWO"}});
3✔
463
   const vic3::Country source_country_one({.number = 1});
1✔
464
   std::map<int, Character> dummy_characters;
1✔
465
   std::map<std::string, mappers::CultureQueue> dummy_culture_queues;
1✔
466
   mappers::TemplateMap templates;
1✔
467
   const States states({.states{
468
       State(3, {.owner = "TAG"}),
469
       State(1, {.owner = "TAG"}),
470
       State(2, {.owner = "TAG"}),
471
   }});
4✔
472

473
   const auto country_one = ConvertCountry(source_world,
474
       source_country_one,
475
       commonItems::LocalizationDatabase{{}, {}},
2✔
476
       country_mapper,
477
       states,
478
       mappers::IdeologyMapper({}, {}),
2✔
479
       mappers::UnitMapper(templates),
2✔
480
       {},
481
       {},
482
       {},
483
       {},
484
       {},
485
       {},
486
       mappers::CultureGraphicsMapper{{}},
2✔
487
       mappers::LeaderTypeMapper({}),
2✔
488
       mappers::CharacterTraitMapper({}, {}, {}, {}),
2✔
489
       {0, {}},
490
       {},
491
       dummy_characters,
492
       dummy_culture_queues);
5✔
493

494
   ASSERT_TRUE(country_one.has_value());
1✔
495
   EXPECT_EQ(country_one->GetCapitalState(), std::optional(1));
1✔
496
}
5✔
497

498

499
TEST(Hoi4worldCountriesCountryConverter, StatesNotOwnedByCountryCannotBecomeCapital)
4✔
500
{
501
   const vic3::World source_world = vic3::World(vic3::WorldOptions());
1✔
502
   const mappers::CountryMapper country_mapper({{1, "TAG"}, {2, "TWO"}});
3✔
503
   const vic3::Country source_country_one({.number = 1});
1✔
504
   std::map<int, Character> dummy_characters;
1✔
505
   std::map<std::string, mappers::CultureQueue> dummy_culture_queues;
1✔
506
   mappers::TemplateMap templates;
1✔
507
   const States states({.states{
508
       State(1, {}),
509
       State(2, {.owner = "TWO"}),
510
   }});
3✔
511

512
   const auto country_one = ConvertCountry(source_world,
513
       source_country_one,
514
       commonItems::LocalizationDatabase{{}, {}},
2✔
515
       country_mapper,
516
       states,
517
       mappers::IdeologyMapper({}, {}),
2✔
518
       mappers::UnitMapper(templates),
2✔
519
       {},
520
       {},
521
       {},
522
       {},
523
       {},
524
       {},
525
       mappers::CultureGraphicsMapper{{}},
2✔
526
       mappers::LeaderTypeMapper({}),
2✔
527
       mappers::CharacterTraitMapper({}, {}, {}, {}),
2✔
528
       {0, {}},
529
       {},
530
       dummy_characters,
531
       dummy_culture_queues);
5✔
532

533
   ASSERT_TRUE(country_one.has_value());
1✔
534
   EXPECT_EQ(country_one->GetCapitalState(), std::nullopt);
1✔
535
}
5✔
536

537

538
TEST(Hoi4worldCountriesCountryConverter, PrimaryCulturesAreCopied)
4✔
539
{
540
   const vic3::World source_world = vic3::World(vic3::WorldOptions());
1✔
541
   const mappers::CountryMapper country_mapper({{1, "TAG"}});
2✔
542
   const vic3::Country source_country_one({.number = 1, .primary_cultures = {"culture_one", "culture_two"}});
3✔
543
   std::map<int, Character> dummy_characters;
1✔
544
   std::map<std::string, mappers::CultureQueue> dummy_culture_queues;
1✔
545
   mappers::TemplateMap templates;
1✔
546

547
   const auto country_one = ConvertCountry(source_world,
548
       source_country_one,
549
       commonItems::LocalizationDatabase{{}, {}},
2✔
550
       country_mapper,
551
       {},
552
       mappers::IdeologyMapper({}, {}),
2✔
553
       mappers::UnitMapper(templates),
2✔
554
       {},
555
       {},
556
       {},
557
       {},
558
       {},
559
       {},
560
       mappers::CultureGraphicsMapper{{}},
2✔
561
       mappers::LeaderTypeMapper({}),
2✔
562
       mappers::CharacterTraitMapper({}, {}, {}, {}),
2✔
563
       {0, {}},
564
       {},
565
       dummy_characters,
566
       dummy_culture_queues);
6✔
567

568
   ASSERT_TRUE(country_one.has_value());
1✔
569
   EXPECT_THAT(country_one->GetPrimaryCultures(), testing::UnorderedElementsAre("culture_one", "culture_two"));
1✔
570
}
7✔
571

572

573
TEST(Hoi4worldCountriesCountryConverter, NonDemocraciesPickSentinelElectionYear)
4✔
574
{
575
   const mappers::CountryMapper country_mapper({{1, "TAG"}, {2, "TWO"}});
3✔
576
   const vic3::World source_world = vic3::World(vic3::WorldOptions());
1✔
577
   const vic3::Country source_country_one({.number = 1});
1✔
578
   std::map<int, Character> dummy_characters;
1✔
579
   std::map<std::string, mappers::CultureQueue> dummy_culture_queues;
1✔
580
   mappers::TemplateMap templates;
1✔
581

582
   const auto country_one = ConvertCountry(source_world,
583
       source_country_one,
584
       commonItems::LocalizationDatabase{{}, {}},
2✔
585
       country_mapper,
586
       {},
587
       mappers::IdeologyMapper({}, {}),
2✔
588
       mappers::UnitMapper(templates),
2✔
589
       {},
590
       {},
591
       {},
592
       {},
593
       {},
594
       {},
595
       mappers::CultureGraphicsMapper{{}},
2✔
596
       mappers::LeaderTypeMapper({}),
2✔
597
       mappers::CharacterTraitMapper({}, {}, {}, {}),
2✔
598
       {0, {}},
599
       {},
600
       dummy_characters,
601
       dummy_culture_queues);
6✔
602

603
   ASSERT_TRUE(country_one.has_value());
1✔
604
   EXPECT_EQ(country_one.value().GetLastElection(), date("1933.1.1"));
1✔
605
}
4✔
606

607

608
TEST(Hoi4worldCountriesCountryConverter, OutdatedElectionsExtrapolateToPresent)
4✔
609
{
610
   const mappers::CountryMapper country_mapper({{1, "TAG"}, {2, "TWO"}});
3✔
611
   const vic3::World source_world = vic3::World(vic3::WorldOptions());
1✔
612
   const vic3::Country source_country_one({.number = 1, .last_election = date("1894.4.23")});
2✔
613
   std::map<int, Character> dummy_characters;
1✔
614
   std::map<std::string, mappers::CultureQueue> dummy_culture_queues;
1✔
615
   mappers::TemplateMap templates;
1✔
616

617
   const auto country_one = ConvertCountry(source_world,
618
       source_country_one,
619
       commonItems::LocalizationDatabase{{}, {}},
2✔
620
       country_mapper,
621
       {},
622
       mappers::IdeologyMapper({}, {}),
2✔
623
       mappers::UnitMapper(templates),
2✔
624
       {},
625
       {},
626
       {},
627
       {},
628
       {},
629
       {},
630
       mappers::CultureGraphicsMapper{{}},
2✔
631
       mappers::LeaderTypeMapper({}),
2✔
632
       mappers::CharacterTraitMapper({}, {}, {}, {}),
2✔
633
       {0, {}},
634
       {},
635
       dummy_characters,
636
       dummy_culture_queues);
6✔
637

638
   ASSERT_TRUE(country_one.has_value());
1✔
639
   EXPECT_EQ(country_one.value().GetLastElection(), date("1934.4.23"));
1✔
640
}
5✔
641

642

643
TEST(Hoi4worldCountriesCountryConverter, FutureElectionsFallbackToPresent)
4✔
644
{
645
   const mappers::CountryMapper country_mapper({{1, "TAG"}, {2, "TWO"}});
3✔
646
   const vic3::World source_world = vic3::World(vic3::WorldOptions());
1✔
647
   const vic3::Country source_country_one({.number = 1, .last_election = date("1937.2.15")});
2✔
648
   std::map<int, Character> dummy_characters;
1✔
649
   std::map<std::string, mappers::CultureQueue> dummy_culture_queues;
1✔
650
   mappers::TemplateMap templates;
1✔
651

652
   const auto country_one = ConvertCountry(source_world,
653
       source_country_one,
654
       commonItems::LocalizationDatabase{{}, {}},
2✔
655
       country_mapper,
656
       {},
657
       mappers::IdeologyMapper({}, {}),
2✔
658
       mappers::UnitMapper(templates),
2✔
659
       {},
660
       {},
661
       {},
662
       {},
663
       {},
664
       {},
665
       mappers::CultureGraphicsMapper{{}},
2✔
666
       mappers::LeaderTypeMapper({}),
2✔
667
       mappers::CharacterTraitMapper({}, {}, {}, {}),
2✔
668
       {0, {}},
669
       {},
670
       dummy_characters,
671
       dummy_culture_queues);
6✔
672

673
   ASSERT_TRUE(country_one.has_value());
1✔
674
   EXPECT_EQ(country_one.value().GetLastElection(), date("1933.2.15"));
1✔
675
}
5✔
676

677

678
TEST(Hoi4worldCountriesCountryConverter, ContemporaryElectionsRemainUnchanged)
4✔
679
{
680
   const mappers::CountryMapper country_mapper({{1, "TAG"}, {2, "TWO"}});
3✔
681
   const vic3::World source_world = vic3::World(vic3::WorldOptions());
1✔
682
   const vic3::Country source_country_one({.number = 1, .last_election = date("1935.11.4")});
2✔
683
   std::map<int, Character> dummy_characters;
1✔
684
   std::map<std::string, mappers::CultureQueue> dummy_culture_queues;
1✔
685
   mappers::TemplateMap templates;
1✔
686

687
   const auto country_one = ConvertCountry(source_world,
688
       source_country_one,
689
       commonItems::LocalizationDatabase{{}, {}},
2✔
690
       country_mapper,
691
       {},
692
       mappers::IdeologyMapper({}, {}),
2✔
693
       mappers::UnitMapper(templates),
2✔
694
       {},
695
       {},
696
       {},
697
       {},
698
       {},
699
       {},
700
       mappers::CultureGraphicsMapper{{}},
2✔
701
       mappers::LeaderTypeMapper({}),
2✔
702
       mappers::CharacterTraitMapper({}, {}, {}, {}),
2✔
703
       {0, {}},
704
       {},
705
       dummy_characters,
706
       dummy_culture_queues);
6✔
707

708
   ASSERT_TRUE(country_one.has_value());
1✔
709
   EXPECT_EQ(country_one.value().GetLastElection(), date("1935.11.4"));
1✔
710
}
5✔
711

712

713
TEST(Hoi4worldCountriesCountryConverter, InYearFutureElectionsAreCurrentCycle)
4✔
714
{
715
   const mappers::CountryMapper country_mapper({{1, "TAG"}, {2, "TWO"}});
3✔
716
   const vic3::World source_world = vic3::World(vic3::WorldOptions());
1✔
717
   const vic3::Country source_country_one({.number = 1, .last_election = date("1928.10.14")});
2✔
718
   std::map<int, Character> dummy_characters;
1✔
719
   std::map<std::string, mappers::CultureQueue> dummy_culture_queues;
1✔
720
   mappers::TemplateMap templates;
1✔
721

722
   const auto country_one = ConvertCountry(source_world,
723
       source_country_one,
724
       commonItems::LocalizationDatabase{{}, {}},
2✔
725
       country_mapper,
726
       {},
727
       mappers::IdeologyMapper({}, {}),
2✔
728
       mappers::UnitMapper(templates),
2✔
729
       {},
730
       {},
731
       {},
732
       {},
733
       {},
734
       {},
735
       mappers::CultureGraphicsMapper{{}},
2✔
736
       mappers::LeaderTypeMapper({}),
2✔
737
       mappers::CharacterTraitMapper({}, {}, {}, {}),
2✔
738
       {0, {}},
739
       {},
740
       dummy_characters,
741
       dummy_culture_queues);
6✔
742

743
   ASSERT_TRUE(country_one.has_value());
1✔
744
   EXPECT_EQ(country_one.value().GetLastElection(), date("1932.10.14"));
1✔
745
}
5✔
746

747

748
TEST(Hoi4worldCountriesCountryConverter, InYearPastElectionsAreNextCycle)
4✔
749
{
750
   // When election is in the same year as the start date, kick it to next cycle when occurring on or before start date
751
   const mappers::CountryMapper country_mapper({{1, "TAG"}, {2, "TWO"}});
3✔
752
   const vic3::World source_world = vic3::World(vic3::WorldOptions());
1✔
753
   const vic3::Country source_country_one({.number = 1, .last_election = date("1928.1.1")});
2✔
754
   std::map<int, Character> dummy_characters;
1✔
755
   std::map<std::string, mappers::CultureQueue> dummy_culture_queues;
1✔
756
   mappers::TemplateMap templates;
1✔
757

758
   const auto country_one = ConvertCountry(source_world,
759
       source_country_one,
760
       commonItems::LocalizationDatabase{{}, {}},
2✔
761
       country_mapper,
762
       {},
763
       mappers::IdeologyMapper({}, {}),
2✔
764
       mappers::UnitMapper(templates),
2✔
765
       {},
766
       {},
767
       {},
768
       {},
769
       {},
770
       {},
771
       mappers::CultureGraphicsMapper{{}},
2✔
772
       mappers::LeaderTypeMapper({}),
2✔
773
       mappers::CharacterTraitMapper({}, {}, {}, {}),
2✔
774
       {0, {}},
775
       {},
776
       dummy_characters,
777
       dummy_culture_queues);
6✔
778

779
   ASSERT_TRUE(country_one.has_value());
1✔
780
   EXPECT_EQ(country_one.value().GetLastElection(), date("1936.1.1"));
1✔
781
}
5✔
782

783

784
TEST(Hoi4worldCountriesCountryConverter, RulingIdeologyCanBeConverted)
4✔
785
{
786
   const mappers::CountryMapper country_mapper({{1, "TAG"}, {2, "TWO"}});
3✔
787
   const vic3::World source_world = vic3::World(vic3::WorldOptions());
1✔
788
   const vic3::Country source_country_one({.number = 1, .active_laws = {}});
1✔
789
   const vic3::Country source_country_two({.number = 1, .active_laws = {"law_landed_voting"}});
2✔
790
   std::map<int, Character> dummy_characters;
1✔
791
   std::map<std::string, mappers::CultureQueue> dummy_culture_queues;
1✔
792
   mappers::TemplateMap templates;
1✔
793

794
   const mappers::IdeologyMapper ideology_mapper(
795
       {
796
           {"law_landed_voting", {{"democratic", 100}}},
×
797
       },
798
       {});
4✔
799

800
   const std::optional<Country> country_one = ConvertCountry(source_world,
801
       source_country_one,
802
       commonItems::LocalizationDatabase{{}, {}},
2✔
803
       country_mapper,
804
       {},
805
       ideology_mapper,
806
       mappers::UnitMapper(templates),
1✔
807
       {},
808
       {},
809
       {},
810
       {},
811
       {},
812
       {},
813
       mappers::CultureGraphicsMapper{{}},
2✔
814
       mappers::LeaderTypeMapper({}),
2✔
815
       mappers::CharacterTraitMapper({}, {}, {}, {}),
2✔
816
       {0, {}},
817
       {},
818
       dummy_characters,
819
       dummy_culture_queues);
5✔
820

821
   const std::optional<Country> country_two = ConvertCountry(source_world,
822
       source_country_two,
823
       commonItems::LocalizationDatabase{{}, {}},
2✔
824
       country_mapper,
825
       {},
826
       ideology_mapper,
827
       mappers::UnitMapper(templates),
1✔
828
       {},
829
       {},
830
       {},
831
       {},
832
       {},
833
       {},
834
       mappers::CultureGraphicsMapper{{}},
2✔
835
       mappers::LeaderTypeMapper({}),
2✔
836
       mappers::CharacterTraitMapper({}, {}, {}, {}),
2✔
837
       {0, {}},
838
       {},
839
       dummy_characters,
840
       dummy_culture_queues);
5✔
841

842
   ASSERT_TRUE(country_one.has_value());
1✔
843
   EXPECT_EQ(country_one->GetIdeology(), "neutrality");
1✔
844
   ASSERT_TRUE(country_two.has_value());
1✔
845
   EXPECT_EQ(country_two->GetIdeology(), "democratic");
1✔
846
}
11✔
847

848

849
TEST(Hoi4worldCountriesCountryConverter, SubIdeologyCanBeConverted)
4✔
850
{
851
   const mappers::CountryMapper country_mapper({{1, "TAG"}, {2, "TWO"}});
3✔
852
   const vic3::World source_world = vic3::World(vic3::WorldOptions());
1✔
853
   const vic3::Country source_country_one({.number = 1, .active_laws = {}});
1✔
854
   const vic3::Country source_country_two({.number = 1, .active_laws = {"law_landed_voting"}});
2✔
855
   std::map<int, Character> dummy_characters;
1✔
856
   std::map<std::string, mappers::CultureQueue> dummy_culture_queues;
1✔
857
   mappers::TemplateMap templates;
1✔
858

859
   const mappers::IdeologyMapper ideology_mapper(
860
       {
861
           {"law_landed_voting", {{"democratic", 100}}},
×
862
       },
863
       {
864
           {
865
               "democratic",
866
               {
867
                   {"law_landed_voting",
868
                       {
869
                           {"liberalism", 100},
×
870
                       }},
871
               },
872
           },
873
       });
8✔
874

875
   const std::optional<Country> country_one = ConvertCountry(source_world,
876
       source_country_one,
877
       commonItems::LocalizationDatabase{{}, {}},
2✔
878
       country_mapper,
879
       {},
880
       ideology_mapper,
881
       mappers::UnitMapper(templates),
1✔
882
       {},
883
       {},
884
       {},
885
       {},
886
       {},
887
       {},
888
       mappers::CultureGraphicsMapper{{}},
2✔
889
       mappers::LeaderTypeMapper({}),
2✔
890
       mappers::CharacterTraitMapper({}, {}, {}, {}),
2✔
891
       {0, {}},
892
       {},
893
       dummy_characters,
894
       dummy_culture_queues);
5✔
895

896
   const std::optional<Country> country_two = ConvertCountry(source_world,
897
       source_country_two,
898
       commonItems::LocalizationDatabase{{}, {}},
2✔
899
       country_mapper,
900
       {},
901
       ideology_mapper,
902
       mappers::UnitMapper(templates),
1✔
903
       {},
904
       {},
905
       {},
906
       {},
907
       {},
908
       {},
909
       mappers::CultureGraphicsMapper{{}},
2✔
910
       mappers::LeaderTypeMapper({}),
2✔
911
       mappers::CharacterTraitMapper({}, {}, {}, {}),
2✔
912
       {0, {}},
913
       {},
914
       dummy_characters,
915
       dummy_culture_queues);
5✔
916

917
   ASSERT_TRUE(country_one.has_value());
1✔
918
   EXPECT_EQ(country_one->GetSubIdeology(), "despotism");
1✔
919
   ASSERT_TRUE(country_two.has_value());
1✔
920
   EXPECT_EQ(country_two->GetSubIdeology(), "liberalism");
1✔
921
}
15✔
922

923

924
TEST(Hoi4worldCountriesCountryConverter, TechnologiesAreConverted)
4✔
925
{
926
   const mappers::CountryMapper country_mapper({{1, "TAG"}, {2, "TWO"}});
3✔
927
   const vic3::World source_world =
928
       vic3::World(vic3::WorldOptions{.acquired_technologies = {{{1}, {"source_tech"}}, {{2}, {"source_tech"}}}});
5✔
929
   const vic3::Country source_country_one({.number = 1, .capital_state = 2});
1✔
930
   std::map<int, Character> dummy_characters;
1✔
931
   std::map<std::string, mappers::CultureQueue> dummy_culture_queues;
1✔
932
   mappers::TemplateMap templates;
1✔
933

934
   const auto country_one = ConvertCountry(source_world,
4✔
935
       source_country_one,
936
       commonItems::LocalizationDatabase{{}, {}},
2✔
937
       country_mapper,
938
       {},
939
       mappers::IdeologyMapper({}, {}),
2✔
940
       mappers::UnitMapper(templates),
2✔
941
       {{{"source_tech"}, std::nullopt, {"dest_tech_one", "dest_tech_two"}}},
942
       {},
943
       {},
944
       {},
945
       {},
946
       {},
947
       mappers::CultureGraphicsMapper{{}},
2✔
948
       mappers::LeaderTypeMapper({}),
2✔
949
       mappers::CharacterTraitMapper({}, {}, {}, {}),
2✔
950
       {0, {}},
951
       {},
952
       dummy_characters,
953
       dummy_culture_queues);
9✔
954

955
   ASSERT_TRUE(country_one.has_value());
1✔
956
   EXPECT_THAT(country_one->GetTechnologies().GetTechnologies(),
4✔
957
       testing::UnorderedElementsAre(
958
           testing::Pair(std::nullopt, std::set<std::string>{"dest_tech_one", "dest_tech_two"})));
1✔
959
}
16✔
960

961

962
TEST(Hoi4worldCountriesCountryConverter, VariantsRequireAllRequiredTechs)
4✔
963
{
964
   const mappers::CountryMapper country_mapper({{1, "TAG"}, {2, "TWO"}});
3✔
965
   const vic3::World source_world = vic3::World(vic3::WorldOptions({.acquired_technologies = {{1, {"source_tech"}}}}));
3✔
966
   const vic3::Country source_country_one({.number = 1, .capital_state = 2});
1✔
967
   std::map<int, Character> dummy_characters;
1✔
968
   std::map<std::string, mappers::CultureQueue> dummy_culture_queues;
1✔
969
   mappers::TemplateMap templates;
1✔
970

971
   const auto country_one = ConvertCountry(source_world,
24✔
972
       source_country_one,
973
       commonItems::LocalizationDatabase{{}, {}},
2✔
974
       country_mapper,
975
       {},
976
       mappers::IdeologyMapper({}, {}),
2✔
977
       mappers::UnitMapper(templates),
2✔
978
       {{{"source_tech"}, std::nullopt, {"required_tech_one", "required_tech_two"}}},
979
       {
980
           EquipmentVariant("legacy_ship: no_required_techs_automatically_succeeds", "", {}, {}, {}),
981
           EquipmentVariant("legacy_ship: missing_required_tech_fails", "", {"required_tech_missing"}, {}, {}),
1✔
982
           EquipmentVariant("legacy_ship: present_required_tech_succeeds", "", {"required_tech_one"}, {}, {}),
1✔
983
           EquipmentVariant("legacy_ship: missing_and_present_required_techs_fails",
984
               "",
985
               {"required_tech_one", "required_tech_missing"},
986
               {},
987
               {}),
2✔
988
           EquipmentVariant("legacy_ship: all_present_required_techs_succeeds",
989
               "",
990
               {"required_tech_one", "required_tech_two"},
991
               {},
992
               {}),
2✔
993
       },
994
       {
995
           EquipmentVariant("ship: no_required_techs_automatically_succeeds", "", {}, {}, {}),
996
           EquipmentVariant("ship: missing_required_tech_fails", "", {"required_tech_missing"}, {}, {}),
1✔
997
           EquipmentVariant("ship: present_required_tech_succeeds", "", {"required_tech_one"}, {}, {}),
1✔
998
           EquipmentVariant("ship: missing_and_present_required_techs_fails",
999
               "",
1000
               {"required_tech_one", "required_tech_missing"},
1001
               {},
1002
               {}),
2✔
1003
           EquipmentVariant("ship: all_present_required_techs_succeeds",
1004
               "",
1005
               {"required_tech_one", "required_tech_two"},
1006
               {},
1007
               {}),
2✔
1008
       },
1009
       {
1010
           EquipmentVariant("plane: no_required_techs_automatically_succeeds", "", {}, {}, {}),
1011
           EquipmentVariant("plane: missing_required_tech_fails", "", {"required_tech_missing"}, {}, {}),
1✔
1012
           EquipmentVariant("plane: present_required_tech_succeeds", "", {"required_tech_one"}, {}, {}),
1✔
1013
           EquipmentVariant("plane: missing_and_present_required_techs_fails",
1014
               "",
1015
               {"required_tech_one", "required_tech_missing"},
1016
               {},
1017
               {}),
2✔
1018
           EquipmentVariant("plane: all_present_required_techs_succeeds",
1019
               "",
1020
               {"required_tech_one", "required_tech_two"},
1021
               {},
1022
               {}),
2✔
1023
       },
1024
       {
1025
           EquipmentVariant("tank: no_required_techs_automatically_succeeds", "", {}, {}, {}),
1026
           EquipmentVariant("tank: missing_required_tech_fails", "", {"required_tech_missing"}, {}, {}),
1✔
1027
           EquipmentVariant("tank: present_required_tech_succeeds", "", {"required_tech_one"}, {}, {}),
1✔
1028
           EquipmentVariant("tank: missing_and_present_required_techs_fails",
1029
               "",
1030
               {"required_tech_one", "required_tech_missing"},
1031
               {},
1032
               {}),
2✔
1033
           EquipmentVariant("tank: all_present_required_techs_succeeds",
1034
               "",
1035
               {"required_tech_one", "required_tech_two"},
1036
               {},
1037
               {}),
2✔
1038
       },
1039
       {},
1040
       mappers::CultureGraphicsMapper{{}},
2✔
1041
       mappers::LeaderTypeMapper({}),
2✔
1042
       mappers::CharacterTraitMapper({}, {}, {}, {}),
2✔
1043
       {0, {}},
1044
       {},
1045
       dummy_characters,
1046
       dummy_culture_queues);
37✔
1047

1048
   ASSERT_TRUE(country_one.has_value());
1✔
1049
   EXPECT_THAT(country_one->GetLegacyShipVariants(),
8✔
1050
       testing::ElementsAre(EquipmentVariant("legacy_ship: no_required_techs_automatically_succeeds", "", {}, {}, {}),
1051
           EquipmentVariant("legacy_ship: present_required_tech_succeeds", "", {"required_tech_one"}, {}, {}),
1052
           EquipmentVariant("legacy_ship: all_present_required_techs_succeeds",
1053
               "",
1054
               {"required_tech_one", "required_tech_two"},
1055
               {},
1056
               {})));
1✔
1057
   EXPECT_THAT(country_one->GetShipVariants(),
8✔
1058
       testing::ElementsAre(EquipmentVariant("ship: no_required_techs_automatically_succeeds", "", {}, {}, {}),
1059
           EquipmentVariant("ship: present_required_tech_succeeds", "", {"required_tech_one"}, {}, {}),
1060
           EquipmentVariant("ship: all_present_required_techs_succeeds",
1061
               "",
1062
               {"required_tech_one", "required_tech_two"},
1063
               {},
1064
               {})));
1✔
1065
   EXPECT_THAT(country_one->GetPlaneVariants(),
8✔
1066
       testing::ElementsAre(EquipmentVariant("plane: no_required_techs_automatically_succeeds", "", {}, {}, {}),
1067
           EquipmentVariant("plane: present_required_tech_succeeds", "", {"required_tech_one"}, {}, {}),
1068
           EquipmentVariant("plane: all_present_required_techs_succeeds",
1069
               "",
1070
               {"required_tech_one", "required_tech_two"},
1071
               {},
1072
               {})));
1✔
1073
   EXPECT_THAT(country_one->GetTankVariants(),
8✔
1074
       testing::ElementsAre(EquipmentVariant("tank: no_required_techs_automatically_succeeds", "", {}, {}, {}),
1075
           EquipmentVariant("tank: present_required_tech_succeeds", "", {"required_tech_one"}, {}, {}),
1076
           EquipmentVariant("tank: all_present_required_techs_succeeds",
1077
               "",
1078
               {"required_tech_one", "required_tech_two"},
1079
               {},
1080
               {})));
1✔
1081
}
60✔
1082

1083

1084
TEST(Hoi4worldCountriesCountryConverter, VariantsBlockedByAnyBlockingTechs)
4✔
1085
{
1086
   const mappers::CountryMapper country_mapper({{1, "TAG"}, {2, "TWO"}});
3✔
1087
   const vic3::World source_world =
1088
       vic3::World(vic3::WorldOptions{.acquired_technologies = {{{1}, {"source_tech"}}, {{2}, {"source_tech"}}}});
5✔
1089
   const vic3::Country source_country_one({.number = 1, .capital_state = 2});
1✔
1090
   std::map<int, Character> dummy_characters;
1✔
1091
   std::map<std::string, mappers::CultureQueue> dummy_culture_queues;
1✔
1092
   mappers::TemplateMap templates;
1✔
1093

1094
   const auto country_one = ConvertCountry(source_world,
20✔
1095
       source_country_one,
1096
       commonItems::LocalizationDatabase{{}, {}},
2✔
1097
       country_mapper,
1098
       {},
1099
       mappers::IdeologyMapper({}, {}),
2✔
1100
       mappers::UnitMapper(templates),
2✔
1101
       {{{"source_tech"}, std::nullopt, {"blocking_tech_one", "blocking_tech_two"}}},
1102
       {
1103
           EquipmentVariant("legacy_ship: no_blocking_techs_automatically_succeeds", "", {}, {}, {}),
1104
           EquipmentVariant("legacy_ship: having_blocking_tech_fails", "", {}, {"blocking_tech_one"}, {}),
1✔
1105
           EquipmentVariant("legacy_ship: missing_blocking_tech_succeeds", "", {}, {"blocking_tech_missing"}, {}),
1✔
1106
           EquipmentVariant("legacy_ship: missing_and_present_blocking_techs_fails",
1107
               "",
1108
               {},
1109
               {"blocking_tech_one", "blocking_tech_missing"},
1110
               {}),
2✔
1111
       },
1112
       {
1113
           EquipmentVariant("ship: no_blocking_techs_automatically_succeeds", "", {}, {}, {}),
1114
           EquipmentVariant("ship: having_blocking_tech_fails", "", {}, {"blocking_tech_one"}, {}),
1✔
1115
           EquipmentVariant("ship: missing_blocking_tech_succeeds", "", {}, {"blocking_tech_missing"}, {}),
1✔
1116
           EquipmentVariant("ship: missing_and_present_blocking_techs_fails",
1117
               "",
1118
               {},
1119
               {"blocking_tech_one", "blocking_tech_missing"},
1120
               {}),
2✔
1121
       },
1122
       {
1123
           EquipmentVariant("plane: no_blocking_techs_automatically_succeeds", "", {}, {}, {}),
1124
           EquipmentVariant("plane: having_blocking_tech_fails", "", {}, {"blocking_tech_one"}, {}),
1✔
1125
           EquipmentVariant("plane: missing_blocking_tech_succeeds", "", {}, {"blocking_tech_missing"}, {}),
1✔
1126
           EquipmentVariant("plane: missing_and_present_blocking_techs_fails",
1127
               "",
1128
               {},
1129
               {"blocking_tech_one", "blocking_tech_missing"},
1130
               {}),
2✔
1131
       },
1132
       {
1133
           EquipmentVariant("tank: no_blocking_techs_automatically_succeeds", "", {}, {}, {}),
1134
           EquipmentVariant("tank: having_blocking_tech_fails", "", {}, {"blocking_tech_one"}, {}),
1✔
1135
           EquipmentVariant("tank: missing_blocking_tech_succeeds", "", {}, {"blocking_tech_missing"}, {}),
1✔
1136
           EquipmentVariant("tank: missing_and_present_blocking_techs_fails",
1137
               "",
1138
               {},
1139
               {"blocking_tech_one", "blocking_tech_missing"},
1140
               {}),
2✔
1141
       },
1142
       {},
1143
       mappers::CultureGraphicsMapper{{}},
2✔
1144
       mappers::LeaderTypeMapper({}),
2✔
1145
       mappers::CharacterTraitMapper({}, {}, {}, {}),
2✔
1146
       {0, {}},
1147
       {},
1148
       dummy_characters,
1149
       dummy_culture_queues);
33✔
1150

1151
   ASSERT_TRUE(country_one.has_value());
1✔
1152
   EXPECT_THAT(country_one->GetLegacyShipVariants(),
4✔
1153
       testing::ElementsAre(EquipmentVariant("legacy_ship: no_blocking_techs_automatically_succeeds", "", {}, {}, {}),
1154
           EquipmentVariant("legacy_ship: missing_blocking_tech_succeeds", "", {}, {"blocking_tech_missing"}, {})));
1✔
1155
   EXPECT_THAT(country_one->GetShipVariants(),
4✔
1156
       testing::ElementsAre(EquipmentVariant("ship: no_blocking_techs_automatically_succeeds", "", {}, {}, {}),
1157
           EquipmentVariant("ship: missing_blocking_tech_succeeds", "", {}, {"blocking_tech_missing"}, {})));
1✔
1158
   EXPECT_THAT(country_one->GetPlaneVariants(),
4✔
1159
       testing::ElementsAre(EquipmentVariant("plane: no_blocking_techs_automatically_succeeds", "", {}, {}, {}),
1160
           EquipmentVariant("plane: missing_blocking_tech_succeeds", "", {}, {"blocking_tech_missing"}, {})));
1✔
1161
   EXPECT_THAT(country_one->GetTankVariants(),
4✔
1162
       testing::ElementsAre(EquipmentVariant("tank: no_blocking_techs_automatically_succeeds", "", {}, {}, {}),
1163
           EquipmentVariant("tank: missing_blocking_tech_succeeds", "", {}, {"blocking_tech_missing"}, {})));
1✔
1164
}
46✔
1165

1166

1167
TEST(Hoi4worldCountriesCountryConverter, LawsDefaultsToDefaultLaws)
4✔
1168
{
1169
   const mappers::CountryMapper country_mapper({{1, "TAG"}, {2, "TWO"}});
3✔
1170
   const vic3::World source_world = vic3::World(vic3::WorldOptions());
1✔
1171
   const vic3::Country source_country_one({.number = 1, .capital_state = 2});
1✔
1172
   std::map<int, Character> dummy_characters;
1✔
1173
   std::map<std::string, mappers::CultureQueue> dummy_culture_queues;
1✔
1174
   mappers::TemplateMap templates;
1✔
1175

1176
   const auto country_one = ConvertCountry(source_world,
1177
       source_country_one,
1178
       commonItems::LocalizationDatabase{{}, {}},
2✔
1179
       country_mapper,
1180
       {},
1181
       mappers::IdeologyMapper({}, {}),
2✔
1182
       mappers::UnitMapper(templates),
2✔
1183
       {},
1184
       {},
1185
       {},
1186
       {},
1187
       {},
1188
       {},
1189
       mappers::CultureGraphicsMapper{{}},
2✔
1190
       mappers::LeaderTypeMapper({}),
2✔
1191
       mappers::CharacterTraitMapper({}, {}, {}, {}),
2✔
1192
       {0, {}},
1193
       {},
1194
       dummy_characters,
1195
       dummy_culture_queues);
6✔
1196

1197
   ASSERT_TRUE(country_one.has_value());
1✔
1198
   EXPECT_THAT(country_one->GetLaws(),
1✔
1199
       testing::UnorderedElementsAre("civilian_economy", "export_focus", "volunteer_only"));
1✔
1200
}
4✔
1201

1202

1203
TEST(Hoi4worldCountriesCountryConverter, FascistCountriesGetDifferentEconomicIdeas)
4✔
1204
{
1205
   const vic3::World source_world = vic3::World(vic3::WorldOptions());
1✔
1206
   const mappers::CountryMapper country_mapper({{1, "TAG"}, {2, "TWO"}});
3✔
1207
   const vic3::Country source_country_one({.number = 1, .capital_state = 2, .active_laws = {"test_fascism_law"}});
2✔
1208
   std::map<int, Character> dummy_characters;
1✔
1209
   std::map<std::string, mappers::CultureQueue> dummy_culture_queues;
1✔
1210
   mappers::TemplateMap templates;
1✔
1211

1212
   const auto country_one = ConvertCountry(source_world,
1213
       source_country_one,
1214
       commonItems::LocalizationDatabase{{}, {}},
2✔
1215
       country_mapper,
1216
       {},
1217
       mappers::IdeologyMapper({{"test_fascism_law", {{"fascism", 100}}}}, {}),
5✔
1218
       mappers::UnitMapper(templates),
2✔
1219
       {},
1220
       {},
1221
       {},
1222
       {},
1223
       {},
1224
       {},
1225
       mappers::CultureGraphicsMapper{{}},
2✔
1226
       mappers::LeaderTypeMapper({}),
2✔
1227
       mappers::CharacterTraitMapper({}, {}, {}, {}),
2✔
1228
       {0, {}},
1229
       {},
1230
       dummy_characters,
1231
       dummy_culture_queues);
6✔
1232

1233
   ASSERT_TRUE(country_one.has_value());
1✔
1234
   EXPECT_THAT(country_one->GetLaws(),
1✔
1235
       testing::UnorderedElementsAre("partial_economic_mobilisation", "limited_exports", "volunteer_only"));
1✔
1236
}
9✔
1237

1238

1239
TEST(Hoi4worldCountriesCountryConverter, MassConscriptionLeadsToLimitedConscription)
4✔
1240
{
1241
   const vic3::World source_world = vic3::World(vic3::WorldOptions());
1✔
1242
   const mappers::CountryMapper country_mapper({{1, "TAG"}, {2, "TWO"}});
3✔
1243
   const vic3::Country source_country_one({.number = 1, .capital_state = 2, .active_laws = {"law_mass_conscription"}});
2✔
1244
   std::map<int, Character> dummy_characters;
1✔
1245
   std::map<std::string, mappers::CultureQueue> dummy_culture_queues;
1✔
1246
   mappers::TemplateMap templates;
1✔
1247

1248
   mappers::IdeologyPointsMap foo{{"fascism", 100}};
2✔
1249

1250
   const auto country_one = ConvertCountry(source_world,
1251
       source_country_one,
1252
       commonItems::LocalizationDatabase{{}, {}},
2✔
1253
       country_mapper,
1254
       {},
1255
       mappers::IdeologyMapper({}, {}),
2✔
1256
       mappers::UnitMapper(templates),
2✔
1257
       {},
1258
       {},
1259
       {},
1260
       {},
1261
       {},
1262
       {},
1263
       mappers::CultureGraphicsMapper{{}},
2✔
1264
       mappers::LeaderTypeMapper({}),
2✔
1265
       mappers::CharacterTraitMapper({}, {}, {}, {}),
2✔
1266
       {0, {}},
1267
       {},
1268
       dummy_characters,
1269
       dummy_culture_queues);
6✔
1270

1271
   ASSERT_TRUE(country_one.has_value());
1✔
1272
   EXPECT_THAT(country_one->GetLaws(),
1✔
1273
       testing::UnorderedElementsAre("civilian_economy", "export_focus", "limited_conscription"));
1✔
1274
}
7✔
1275

1276

1277
TEST(Hoi4worldCountriesCountryConverter, IdeasDefaultToEmpty)
4✔
1278
{
1279
   const mappers::CountryMapper country_mapper({{1, "TAG"}, {2, "TWO"}});
3✔
1280
   const vic3::World source_world = vic3::World(vic3::WorldOptions());
1✔
1281
   const vic3::Country source_country_one({.number = 1, .capital_state = 2});
1✔
1282
   std::map<int, Character> dummy_characters;
1✔
1283
   std::map<std::string, mappers::CultureQueue> dummy_culture_queues;
1✔
1284
   mappers::TemplateMap templates;
1✔
1285

1286
   const auto country_one = ConvertCountry(source_world,
1287
       source_country_one,
1288
       commonItems::LocalizationDatabase{{}, {}},
2✔
1289
       country_mapper,
1290
       {},
1291
       mappers::IdeologyMapper({}, {}),
2✔
1292
       mappers::UnitMapper(templates),
2✔
1293
       {},
1294
       {},
1295
       {},
1296
       {},
1297
       {},
1298
       {},
1299
       mappers::CultureGraphicsMapper{{}},
2✔
1300
       mappers::LeaderTypeMapper({}),
2✔
1301
       mappers::CharacterTraitMapper({}, {}, {}, {}),
2✔
1302
       {0, {}},
1303
       {},
1304
       dummy_characters,
1305
       dummy_culture_queues);
6✔
1306
   ASSERT_TRUE(country_one.has_value());
1✔
1307
   EXPECT_TRUE(country_one->GetIdeas().empty());
1✔
1308
}
4✔
1309

1310

1311
TEST(Hoi4worldCountriesCountryConverter, DecentralizedCountriesGetDecentralizedIdeas)
4✔
1312
{
1313
   const mappers::CountryMapper country_mapper({{1, "TAG"}, {2, "TWO"}});
3✔
1314
   const vic3::World source_world = vic3::World(vic3::WorldOptions());
1✔
1315
   const vic3::Country source_country_one({.number = 1, .capital_state = 2, .country_type = "decentralized"});
1✔
1316
   std::map<int, Character> dummy_characters;
1✔
1317
   std::map<std::string, mappers::CultureQueue> dummy_culture_queues;
1✔
1318
   mappers::TemplateMap templates;
1✔
1319

1320
   const auto country_one = ConvertCountry(source_world,
1321
       source_country_one,
1322
       commonItems::LocalizationDatabase{{}, {}},
2✔
1323
       country_mapper,
1324
       {},
1325
       mappers::IdeologyMapper({}, {}),
2✔
1326
       mappers::UnitMapper(templates),
2✔
1327
       {},
1328
       {},
1329
       {},
1330
       {},
1331
       {},
1332
       {},
1333
       mappers::CultureGraphicsMapper{{}},
2✔
1334
       mappers::LeaderTypeMapper({}),
2✔
1335
       mappers::CharacterTraitMapper({}, {}, {}, {}),
2✔
1336
       {0, {}},
1337
       {},
1338
       dummy_characters,
1339
       dummy_culture_queues);
6✔
1340
   ASSERT_TRUE(country_one.has_value());
1✔
1341
   EXPECT_THAT(country_one->GetIdeas(), testing::UnorderedElementsAre("decentralized"));
1✔
1342
}
5✔
1343

1344

1345
TEST(Hoi4worldCountriesCountryConverter, OnlyConservativeMonarchiesHaveNobleLeaders)
4✔
1346
{
1347
   const mappers::CountryMapper country_mapper({{1, "TAG"}, {2, "TWO"}});
3✔
1348

1349

1350

1351
   const vic3::Country source_country_one(
1352
       {.number = 1, .active_laws = {"law_monarchy"}, .primary_cultures = {"culture"}});
3✔
1353
   const vic3::Country source_country_two(
1354
       {.number = 1, .active_laws = {"law_monarchy", "law_voting"}, .primary_cultures = {"culture"}});
4✔
1355
   std::map<int, Character> dummy_characters;
1✔
1356
   std::map<std::string, mappers::CultureQueue> dummy_culture_queues;
1✔
1357
   mappers::TemplateMap templates;
1✔
1358

1359
   const vic3::CultureDefinition culture_def{"culture",
1360
       {
1361
           .male_common_first = {"president"},
1362
           .female_common_first = {"presidentin"},
1363
           .common_last = {"doe"},
1364
           .noble_last = {"von Doe"},
1365
           .male_regal_first = {"king0", "king1", "king2", "king3", "king4"},
1366
           .female_regal_first = {"queen0", "queen1", "queen2", "queen3", "queen4"},
1367
       },
1368
       {},
1369
       {}};
17✔
1370
   const std::map<std::string, vic3::CultureDefinition> culture_definitions{{"culture", culture_def}};
2✔
1371
   const vic3::World source_world = vic3::World(vic3::WorldOptions{.culture_definitions = culture_definitions});
1✔
1372

1373
   commonItems::LocalizationDatabase locs("english", {});
1✔
1374
   std::vector keys{"president",
1375
       "presidentin",
1376
       "doe",
1377
       "von Doe",
1378
       "king0",
1379
       "king1",
1380
       "king2",
1381
       "king3",
1382
       "king4",
1383
       "queen0",
1384
       "queen1",
1385
       "queen2",
1386
       "queen3",
1387
       "queen4"};
1✔
1388
   for (const auto& key: keys)
15✔
1389
   {
1390
      commonItems::LocalizationBlock block(key, "english");
14✔
1391
      block.ModifyLocalization("english", key);
14✔
1392
      locs.AddOrModifyLocalizationBlock(key, block);
14✔
1393
   }
14✔
1394

1395
   const mappers::LeaderTypeMapper leader_type_mapper({{"law_monarchy", {{"law_voting", "prime_minister"}}}});
3✔
1396

1397
   const std::optional<Country> country_one = ConvertCountry(source_world,
1398
       source_country_one,
1399
       locs,
1400
       country_mapper,
1401
       {},
1402
       mappers::IdeologyMapper({}, {}),
2✔
1403
       mappers::UnitMapper(templates),
2✔
1404
       {},
1405
       {},
1406
       {},
1407
       {},
1408
       {},
1409
       {},
1410
       mappers::CultureGraphicsMapper{{}},
2✔
1411
       leader_type_mapper,
1412
       mappers::CharacterTraitMapper({}, {}, {}, {}),
2✔
1413
       {0, {}},
1414
       {},
1415
       dummy_characters,
1416
       dummy_culture_queues);
5✔
1417

1418
   const std::optional<Country> country_two = ConvertCountry(source_world,
1419
       source_country_two,
1420
       locs,
1421
       country_mapper,
1422
       {},
1423
       mappers::IdeologyMapper({}, {}),
2✔
1424
       mappers::UnitMapper(templates),
2✔
1425
       {},
1426
       {},
1427
       {},
1428
       {},
1429
       {},
1430
       {},
1431
       mappers::CultureGraphicsMapper{{}},
2✔
1432
       leader_type_mapper,
1433
       mappers::CharacterTraitMapper({}, {}, {}, {}),
2✔
1434
       {0, {}},
1435
       {},
1436
       dummy_characters,
1437
       dummy_culture_queues);
5✔
1438

1439
   ASSERT_TRUE(country_one.has_value());
1✔
1440
   EXPECT_EQ(country_one->GetSubIdeology(), "despotism");
1✔
1441
   EXPECT_THAT(country_one->GetNameList().male_names,
1✔
1442
       testing::ElementsAre("king0", "king1", "king2", "king3", "king4"));
1✔
1443
   EXPECT_THAT(country_one->GetNameList().female_names,
1✔
1444
       testing::ElementsAre("queen0", "queen1", "queen2", "queen3", "queen4"));
1✔
1445
   EXPECT_THAT(country_one->GetNameList().surnames, testing::ElementsAre("von Doe"));
1✔
1446
   ASSERT_TRUE(country_two.has_value());
1✔
1447
   EXPECT_THAT(country_two->GetNameList().male_names, testing::ElementsAre("president"));
1✔
1448
   EXPECT_THAT(country_two->GetNameList().female_names, testing::ElementsAre("presidentin"));
1✔
1449
   EXPECT_THAT(country_two->GetNameList().surnames, testing::ElementsAre("doe"));
1✔
1450
}
34✔
1451

1452

1453
TEST(Hoi4worldCountriesCountryConverter, UndefinedNobleFirstsDefaultToCommon)
4✔
1454
{
1455
   const mappers::CountryMapper country_mapper({{1, "TAG"}});
2✔
1456
   const vic3::Country source_country_one(
1457
       {.number = 1, .active_laws = {"law_monarchy"}, .primary_cultures = {"culture"}});
3✔
1458
   std::map<int, Character> dummy_characters;
1✔
1459
   std::map<std::string, mappers::CultureQueue> dummy_culture_queues;
1✔
1460
   mappers::TemplateMap templates;
1✔
1461

1462
   const vic3::CultureDefinition culture_def{"culture",
1463
       {
1464
           .male_common_first = {"president"},
1465
           .female_common_first = {"presidentin"},
1466
           .noble_last = {"von Doe"},
1467
       },
1468
       {},
1469
       {}};
6✔
1470
   const std::map<std::string, vic3::CultureDefinition> culture_definitions{{"culture", culture_def}};
2✔
1471
   const vic3::World source_world = vic3::World(vic3::WorldOptions{.culture_definitions = culture_definitions});
1✔
1472
   commonItems::LocalizationDatabase locs("english", {});
1✔
1473
   std::vector keys{"president", "presidentin", "doe", "von Doe", "king", "queen"};
1✔
1474
   for (const auto& key: keys)
7✔
1475
   {
1476
      commonItems::LocalizationBlock block(key, "english");
6✔
1477
      block.ModifyLocalization("english", key);
6✔
1478
      locs.AddOrModifyLocalizationBlock(key, block);
6✔
1479
   }
6✔
1480

1481
   const std::optional<Country> country_one = ConvertCountry(source_world,
1482
       source_country_one,
1483
       locs,
1484
       country_mapper,
1485
       {},
1486
       mappers::IdeologyMapper({}, {}),
2✔
1487
       mappers::UnitMapper(templates),
2✔
1488
       {},
1489
       {},
1490
       {},
1491
       {},
1492
       {},
1493
       {},
1494
       mappers::CultureGraphicsMapper{{}},
2✔
1495
       mappers::LeaderTypeMapper({}),
2✔
1496
       mappers::CharacterTraitMapper({}, {}, {}, {}),
2✔
1497
       {0, {}},
1498
       {},
1499
       dummy_characters,
1500
       dummy_culture_queues);
5✔
1501

1502
   ASSERT_TRUE(country_one.has_value());
1✔
1503
   EXPECT_THAT(country_one->GetNameList().male_names, testing::ElementsAre("president"));
1✔
1504
   EXPECT_THAT(country_one->GetNameList().female_names, testing::ElementsAre("presidentin"));
1✔
1505
   EXPECT_THAT(country_one->GetNameList().surnames, testing::ElementsAre("von Doe"));
1✔
1506
}
15✔
1507

1508

1509
TEST(Hoi4worldCountriesCountryConverter, TooFewNobleFirstsAddsCommonFirsts)
4✔
1510
{
1511
   const mappers::CountryMapper country_mapper({{1, "TAG"}});
2✔
1512
   const vic3::Country source_country_one(
1513
       {.number = 1, .active_laws = {"law_monarchy"}, .primary_cultures = {"culture"}});
3✔
1514
   std::map<int, Character> dummy_characters;
1✔
1515
   std::map<std::string, mappers::CultureQueue> dummy_culture_queues;
1✔
1516
   mappers::TemplateMap templates;
1✔
1517

1518
   const vic3::CultureDefinition culture_def{"culture",
1519
       {
1520
           .male_common_first = {"president"},
1521
           .female_common_first = {"presidentin"},
1522
           .noble_last = {"von Doe"},
1523
           .male_regal_first = {"king"},
1524
           .female_regal_first = {"queen"},
1525
       },
1526
       {},
1527
       {}};
8✔
1528
   const std::map<std::string, vic3::CultureDefinition> culture_definitions{{"culture", culture_def}};
2✔
1529
   const vic3::World source_world = vic3::World(vic3::WorldOptions{.culture_definitions = culture_definitions});
1✔
1530
   commonItems::LocalizationDatabase locs("english", {});
1✔
1531
   std::vector keys{"president", "presidentin", "doe", "von Doe", "king", "queen"};
1✔
1532
   for (const auto& key: keys)
7✔
1533
   {
1534
      commonItems::LocalizationBlock block(key, "english");
6✔
1535
      block.ModifyLocalization("english", key);
6✔
1536
      locs.AddOrModifyLocalizationBlock(key, block);
6✔
1537
   }
6✔
1538

1539
   const std::optional<Country> country_one = ConvertCountry(source_world,
1540
       source_country_one,
1541
       locs,
1542
       country_mapper,
1543
       {},
1544
       mappers::IdeologyMapper({}, {}),
2✔
1545
       mappers::UnitMapper(templates),
2✔
1546
       {},
1547
       {},
1548
       {},
1549
       {},
1550
       {},
1551
       {},
1552
       mappers::CultureGraphicsMapper{{}},
2✔
1553
       mappers::LeaderTypeMapper({}),
2✔
1554
       mappers::CharacterTraitMapper({}, {}, {}, {}),
2✔
1555
       {0, {}},
1556
       {},
1557
       dummy_characters,
1558
       dummy_culture_queues);
5✔
1559

1560
   ASSERT_TRUE(country_one.has_value());
1✔
1561
   EXPECT_THAT(country_one->GetNameList().male_names, testing::UnorderedElementsAre("president", "king"));
1✔
1562
   EXPECT_THAT(country_one->GetNameList().female_names, testing::UnorderedElementsAre("presidentin", "queen"));
1✔
1563
   EXPECT_THAT(country_one->GetNameList().surnames, testing::ElementsAre("von Doe"));
1✔
1564
}
17✔
1565

1566

1567
TEST(Hoi4worldCountriesCountryConverter, MissingNameLocsUseSentinielValue)
4✔
1568
{
1569
   const mappers::CountryMapper country_mapper({{1, "TAG"}});
2✔
1570
   const vic3::Country source_country_one({.number = 1, .active_laws = {}, .primary_cultures = {"culture"}});
2✔
1571
   std::map<int, Character> dummy_characters;
1✔
1572
   std::map<std::string, mappers::CultureQueue> dummy_culture_queues;
1✔
1573
   mappers::TemplateMap templates;
1✔
1574

1575
   const vic3::CultureDefinition culture_def{"culture", {.male_common_first = {"president"}}, {}, {}};
4✔
1576
   const std::map<std::string, vic3::CultureDefinition> culture_definitions{{"culture", culture_def}};
2✔
1577
   const vic3::World source_world = vic3::World(vic3::WorldOptions{.culture_definitions = culture_definitions});
1✔
1578
   commonItems::LocalizationDatabase locs("english", {});
1✔
1579

1580
   const std::optional<Country> country_one = ConvertCountry(source_world,
1581
       source_country_one,
1582
       locs,
1583
       country_mapper,
1584
       {},
1585
       mappers::IdeologyMapper({}, {}),
2✔
1586
       mappers::UnitMapper(templates),
2✔
1587
       {},
1588
       {},
1589
       {},
1590
       {},
1591
       {},
1592
       {},
1593
       mappers::CultureGraphicsMapper{{}},
2✔
1594
       mappers::LeaderTypeMapper({}),
2✔
1595
       mappers::CharacterTraitMapper({}, {}, {}, {}),
2✔
1596
       {0, {}},
1597
       {},
1598
       dummy_characters,
1599
       dummy_culture_queues);
5✔
1600

1601
   ASSERT_TRUE(country_one.has_value());
1✔
1602
   EXPECT_THAT(country_one->GetNameList().male_names, testing::ElementsAre("John"));
1✔
1603
}
12✔
1604

1605

1606

1607
TEST(Hoi4worldCountriesCountryConverter, MissingNameLocsLogWarning)
4✔
1608
{
1609
   std::stringstream log;
1✔
1610
   std::streambuf* cout_buffer = std::cout.rdbuf();
1✔
1611
   std::cout.rdbuf(log.rdbuf());
1✔
1612

1613
   const mappers::CountryMapper country_mapper({{1, "TAG"}});
2✔
1614
   const vic3::Country source_country_one({.number = 1, .active_laws = {}, .primary_cultures = {"culture"}});
2✔
1615
   std::map<int, Character> dummy_characters;
1✔
1616
   std::map<std::string, mappers::CultureQueue> dummy_culture_queues;
1✔
1617
   mappers::TemplateMap templates;
1✔
1618

1619
   const vic3::CultureDefinition culture_def{"culture", {.male_common_first = {"president"}}, {}, {}};
4✔
1620
   const std::map<std::string, vic3::CultureDefinition> culture_definitions{{"culture", culture_def}};
2✔
1621
   const vic3::World source_world = vic3::World(vic3::WorldOptions{.culture_definitions = culture_definitions});
1✔
1622
   commonItems::LocalizationDatabase locs("english", {});
1✔
1623

1624
   const std::optional<Country> country_one = ConvertCountry(source_world,
1625
       source_country_one,
1626
       locs,
1627
       country_mapper,
1628
       {},
1629
       mappers::IdeologyMapper({}, {}),
2✔
1630
       mappers::UnitMapper(templates),
2✔
1631
       {},
1632
       {},
1633
       {},
1634
       {},
1635
       {},
1636
       {},
1637
       mappers::CultureGraphicsMapper{{}},
2✔
1638
       mappers::LeaderTypeMapper({}),
2✔
1639
       mappers::CharacterTraitMapper({}, {}, {}, {}),
2✔
1640
       {0, {}},
1641
       {},
1642
       dummy_characters,
1643
       dummy_culture_queues);
5✔
1644

1645
   std::cout.rdbuf(cout_buffer);
1✔
1646

1647
   EXPECT_THAT(log.str(), testing::HasSubstr(R"([WARNING] Missing loc for vic_name: president.)"));
1✔
1648
}
12✔
1649

1650

1651
TEST(Hoi4worldCountriesCountryConverter, GraphicsBlocksAreSet)
4✔
1652
{
1653
   const mappers::CountryMapper country_mapper({{1, "TAG"}});
2✔
1654
   const vic3::Country source_country_one({.number = 1, .active_laws = {}, .primary_cultures = {"culture"}});
2✔
1655
   std::map<int, Character> dummy_characters;
1✔
1656
   std::map<std::string, mappers::CultureQueue> dummy_culture_queues;
1✔
1657
   mappers::TemplateMap templates;
1✔
1658

1659
   const vic3::CultureDefinition culture_def{"culture", {}, {}, {}};
2✔
1660
   const std::map<std::string, vic3::CultureDefinition> culture_definitions{{"culture", culture_def}};
2✔
1661
   const vic3::World source_world = vic3::World(vic3::WorldOptions{.culture_definitions = culture_definitions});
1✔
1662
   const mappers::CultureGraphicsMapper culture_graphics_mapper{
1663
       {{{"culture"}, {}, {}, {{{"army", {"GFX_general"}}}, {}, {}}}}};
7✔
1664

1665
   const std::optional<Country> country_one = ConvertCountry(source_world,
1666
       source_country_one,
1667
       commonItems::LocalizationDatabase{{}, {}},
2✔
1668
       country_mapper,
1669
       {},
1670
       mappers::IdeologyMapper({}, {}),
2✔
1671
       mappers::UnitMapper(templates),
2✔
1672
       {},
1673
       {},
1674
       {},
1675
       {},
1676
       {},
1677
       {},
1678
       culture_graphics_mapper,
1679
       mappers::LeaderTypeMapper({}),
2✔
1680
       mappers::CharacterTraitMapper({}, {}, {}, {}),
2✔
1681
       {0, {}},
1682
       {},
1683
       dummy_characters,
1684
       dummy_culture_queues);
6✔
1685

1686
   ASSERT_TRUE(country_one.has_value());
1✔
1687
   EXPECT_THAT(country_one->GetGraphicsBlock().portrait_paths.at("army"), testing::ElementsAre("GFX_general"));
1✔
1688
}
16✔
1689

1690

1691
TEST(Hoi4worldCountriesCountryConverter, PuppetsAreConverted)
4✔
1692
{
1693
   std::stringstream log;
1✔
1694
   std::streambuf* cout_buffer = std::cout.rdbuf();
1✔
1695
   std::cout.rdbuf(log.rdbuf());
1✔
1696

1697
   const mappers::CountryMapper country_mapper({{1, "T00"}, {2, "T01"}});
3✔
1698
   const vic3::World source_world = vic3::World(vic3::WorldOptions());
1✔
1699
   const vic3::Country source_country_one({
1700
       .number = 1,
1701
       .color = commonItems::Color{std::array{1, 2, 3}},
1702
       .puppets = {2, 50},
1703
   });
1✔
1704
   const vic3::Country source_country_two({.number = 2, .color = commonItems::Color{std::array{2, 4, 6}}});
1✔
1705
   std::map<int, Character> dummy_characters;
1✔
1706
   std::map<std::string, mappers::CultureQueue> dummy_culture_queues;
1✔
1707
   mappers::TemplateMap templates;
1✔
1708

1709
   const auto country_one = ConvertCountry(source_world,
1710
       source_country_one,
1711
       commonItems::LocalizationDatabase{{}, {}},
2✔
1712
       country_mapper,
1713
       {},
1714
       mappers::IdeologyMapper({}, {}),
2✔
1715
       mappers::UnitMapper(templates),
2✔
1716
       {},
1717
       {},
1718
       {},
1719
       {},
1720
       {},
1721
       {},
1722
       mappers::CultureGraphicsMapper{{}},
2✔
1723
       mappers::LeaderTypeMapper({}),
2✔
1724
       mappers::CharacterTraitMapper({}, {}, {}, {}),
2✔
1725
       {0, {}},
1726
       {},
1727
       dummy_characters,
1728
       dummy_culture_queues);
6✔
1729
   const auto country_two = ConvertCountry(source_world,
1730
       source_country_two,
1731
       commonItems::LocalizationDatabase{{}, {}},
2✔
1732
       country_mapper,
1733
       {},
1734
       mappers::IdeologyMapper({}, {}),
2✔
1735
       mappers::UnitMapper(templates),
2✔
1736
       {},
1737
       {},
1738
       {},
1739
       {},
1740
       {},
1741
       {},
1742
       mappers::CultureGraphicsMapper{{}},
2✔
1743
       mappers::LeaderTypeMapper({}),
2✔
1744
       mappers::CharacterTraitMapper({}, {}, {}, {}),
2✔
1745
       {0, {}},
1746
       {},
1747
       dummy_characters,
1748
       dummy_culture_queues);
6✔
1749

1750
   ASSERT_TRUE(country_one.has_value());
1✔
1751
   EXPECT_EQ(country_one->GetPuppets(), std::set<std::string>({"T01"}));
4✔
1752
   ASSERT_TRUE(country_two.has_value());
1✔
1753
   EXPECT_EQ(country_two->GetPuppets(), std::set<std::string>());
1✔
1754
   std::cout.rdbuf(cout_buffer);
1✔
1755
   EXPECT_THAT(log.str(),
1✔
1756
       testing::HasSubstr(R"([ERROR] Invalid subject relationship between 1 and nonexistent country 50)"));
1✔
1757
}
8✔
1758

1759

1760
TEST(Hoi4worldCountriesCountryConverter, OverlordIsConverted)
4✔
1761
{
1762
   const mappers::CountryMapper country_mapper({{1, "T00"}, {2, "T01"}});
3✔
1763
   const vic3::World source_world = vic3::World(vic3::WorldOptions());
1✔
1764
   const vic3::Country source_country_one({
1765
       .number = 1,
1766
       .color = commonItems::Color{std::array{1, 2, 3}},
1767
       .overlord = 2,
1768
   });
1✔
1769
   const vic3::Country source_country_two({.number = 2, .color = commonItems::Color{std::array{2, 4, 6}}});
1✔
1770
   std::map<int, Character> dummy_characters;
1✔
1771
   std::map<std::string, mappers::CultureQueue> dummy_culture_queues;
1✔
1772
   mappers::TemplateMap templates;
1✔
1773

1774
   const auto country_one = ConvertCountry(source_world,
1775
       source_country_one,
1776
       commonItems::LocalizationDatabase{{}, {}},
2✔
1777
       country_mapper,
1778
       {},
1779
       mappers::IdeologyMapper({}, {}),
2✔
1780
       mappers::UnitMapper(templates),
2✔
1781
       {},
1782
       {},
1783
       {},
1784
       {},
1785
       {},
1786
       {},
1787
       mappers::CultureGraphicsMapper{{}},
2✔
1788
       mappers::LeaderTypeMapper({}),
2✔
1789
       mappers::CharacterTraitMapper({}, {}, {}, {}),
2✔
1790
       {0, {}},
1791
       {},
1792
       dummy_characters,
1793
       dummy_culture_queues);
6✔
1794
   const auto country_two = ConvertCountry(source_world,
1795
       source_country_two,
1796
       commonItems::LocalizationDatabase{{}, {}},
2✔
1797
       country_mapper,
1798
       {},
1799
       mappers::IdeologyMapper({}, {}),
2✔
1800
       mappers::UnitMapper(templates),
2✔
1801
       {},
1802
       {},
1803
       {},
1804
       {},
1805
       {},
1806
       {},
1807
       mappers::CultureGraphicsMapper{{}},
2✔
1808
       mappers::LeaderTypeMapper({}),
2✔
1809
       mappers::CharacterTraitMapper({}, {}, {}, {}),
2✔
1810
       {0, {}},
1811
       {},
1812
       dummy_characters,
1813
       dummy_culture_queues);
6✔
1814

1815
   ASSERT_TRUE(country_one.has_value());
1✔
1816
   EXPECT_EQ(country_one->GetOverlord(), std::make_optional("T01"));
1✔
1817
   ASSERT_TRUE(country_two.has_value());
1✔
1818
   EXPECT_EQ(country_two->GetOverlord(), std::nullopt);
1✔
1819
}
6✔
1820

1821

1822
TEST(Hoi4worldCountriesCountryConverter, SpiesAndLeadersAreSeparated)
4✔
1823
{
1824
   const mappers::CountryMapper country_mapper({{1, "TAG"}});
2✔
1825

1826
   const vic3::Country source_country_one({.number = 1, .head_of_state_id = 1, .character_ids = {1, 2, 3}});
1✔
1827
   std::map<int, Character> dummy_characters;
1✔
1828
   std::map<std::string, mappers::CultureQueue> dummy_culture_queues;
1✔
1829
   mappers::TemplateMap templates;
1✔
1830

1831
   const std::map<int, vic3::Character> characters = {
1832
       {1, vic3::Character({.id = 1})},
1✔
1833
       {2, vic3::Character({.id = 2, .roles = {"agitator"}})},
2✔
1834
       {3, vic3::Character({.id = 3, .roles = {"agitator", "general"}})},
3✔
1835
   };
4✔
1836

1837
   const vic3::World source_world(vic3::WorldOptions({.characters = characters}));
1✔
1838

1839
   const std::optional<Country> country_one = ConvertCountry(source_world,
1840
       source_country_one,
1841
       commonItems::LocalizationDatabase{{}, {}},
2✔
1842
       country_mapper,
1843
       {},
1844
       mappers::IdeologyMapper({}, {}),
2✔
1845
       mappers::UnitMapper(templates),
2✔
1846
       {},
1847
       {},
1848
       {},
1849
       {},
1850
       {},
1851
       {},
1852
       mappers::CultureGraphicsMapper({}),
2✔
1853
       mappers::LeaderTypeMapper({}),
2✔
1854
       mappers::CharacterTraitMapper({}, {}, {}, {}),
2✔
1855
       {0, {}},
1856
       {},
1857
       dummy_characters,
1858
       dummy_culture_queues);
6✔
1859

1860
   ASSERT_TRUE(country_one.has_value());
1✔
1861
   EXPECT_THAT(country_one->GetLeaderIds(), testing::ElementsAre(1, 3));
1✔
1862
   EXPECT_THAT(country_one->GetSpyIds(), testing::ElementsAre(2));
1✔
1863
}
13✔
1864

1865

1866
TEST(Hoi4worldCountriesCountryConverter, CharactersConvert)
4✔
1867
{
1868
   const mappers::CountryMapper country_mapper({{1, "TAG"}, {2, "TWO"}});
3✔
1869

1870
   const vic3::Country source_country_one({.number = 1, .head_of_state_id = 1, .character_ids = {1, 2, 3}});
1✔
1871
   std::map<int, Character> characters;
1✔
1872
   std::map<std::string, mappers::CultureQueue> dummy_culture_queues;
1✔
1873
   mappers::TemplateMap templates;
1✔
1874

1875
   const std::map<int, vic3::Character> vic3_characters = {
1876
       {1, vic3::Character({.id = 1, .first_name = "Test", .last_name = "Mann"})},
1✔
1877
       {2, vic3::Character({.id = 2, .is_female = true, .roles = {"agitator"}, .origin_country_id = 2})},
2✔
1878
       {3, vic3::Character({.id = 3, .roles = {"agitator", "general"}})},
3✔
1879
   };
4✔
1880

1881
   const vic3::World source_world(vic3::WorldOptions({.characters = vic3_characters}));
1✔
1882

1883
   const std::optional<Country> country_one = ConvertCountry(source_world,
1884
       source_country_one,
1885
       commonItems::LocalizationDatabase{{}, {}},
2✔
1886
       country_mapper,
1887
       {},
1888
       mappers::IdeologyMapper({}, {}),
2✔
1889
       mappers::UnitMapper(templates),
2✔
1890
       {},
1891
       {},
1892
       {},
1893
       {},
1894
       {},
1895
       {},
1896
       mappers::CultureGraphicsMapper({}),
2✔
1897
       mappers::LeaderTypeMapper({}),
2✔
1898
       mappers::CharacterTraitMapper({}, {}, {}, {}),
2✔
1899
       {0, {}},
1900
       {},
1901
       characters,
1902
       dummy_culture_queues);
6✔
1903

1904

1905
   const auto expected_data_one = std::optional<Leader>({.sub_ideology = "despotism"});
2✔
1906
   const auto expected_data_two = std::optional<Spy>({.nationalities = {"TAG", "TWO"}});
3✔
1907
   const auto expected_data_three = std::optional<General>({.traits = {}});
1✔
1908
   EXPECT_THAT(characters,
4✔
1909
       testing::UnorderedElementsAre(testing::Pair(1,
1910
                                         Character({
1911
                                             .id = 1,
1912
                                             .first_name = "Test",
1913
                                             .last_name = "Mann",
1914
                                             .leader_data = expected_data_one,
1915
                                         })),
1916
           testing::Pair(2,
1917
               Character({
1918
                   .id = 2,
1919
                   .is_female = true,
1920
                   .spy_data = expected_data_two,
1921
               })),
1922
           testing::Pair(3,
1923
               Character({
1924
                   .id = 3,
1925
                   .general_data = expected_data_three,
1926
               }))));
1✔
1927
}
22✔
1928

1929

1930
TEST(Hoi4worldCountriesCountryConverter, IdeologySupportIsConverted)
4✔
1931
{
1932
   const mappers::CountryMapper country_mapper({{1, "TAG"}});
2✔
1933
   const vic3::Country source_country_one({.number = 1, .capital_state = 2, .ig_ids = {1, 2}});
1✔
1934
   std::map<int, hoi4::Character> dummy_characters;
1✔
1935
   std::map<std::string, mappers::CultureQueue> dummy_culture_queues;
1✔
1936
   mappers::TemplateMap templates;
1✔
1937

1938
   const States states({.vic3_state_ids_to_hoi4_state_ids{{2, 4}}});
1✔
1939

1940
   std::map<int, vic3::InterestGroup> igs;
1✔
1941
   igs.insert(
1✔
1942
       {1, vic3::InterestGroup("test_group_one", 1, 0, 50.F, false, {"test_ideology_one", "test_ideology_two"})});
4✔
1943
   igs.insert(
1✔
1944
       {2, vic3::InterestGroup("test_group_two", 1, 0, 150.F, false, {"test_ideology_one", "test_ideology_three"})});
4✔
1945

1946
   vic3::Ideologies ideologies = vic3::Ideologies({
1947
       {"test_ideology_one", vic3::Ideology({{"test_law_one", 1}})},
3✔
1948
       {"test_ideology_two", vic3::Ideology({{"test_law_two", 2}})},
3✔
1949
       {"test_ideology_three", vic3::Ideology({{"test_law_three", -2}})},
3✔
1950
   });
4✔
1951
   vic3::WorldOptions worldOptions = vic3::WorldOptions{
1✔
1952
       .igs = igs,
1953
       .ideologies = ideologies,
1954
   };
1✔
1955

1956
   vic3::World source_world = vic3::World(worldOptions);
1✔
1957

1958
   mappers::ItemToPointsMap pointsMap;
1✔
1959
   pointsMap.insert({"test_law_one", {{"democratic", 2}, {"fascist", 3}, {"neutrality", 0}}});
5✔
1960
   pointsMap.insert({"test_law_two",
5✔
1961
       {
1962
           {"communist", 5},
×
1963
           {"fascist", 3},
1✔
1964
       }});
1965
   pointsMap.insert({"test_law_three",
5✔
1966
       {
1967
           {"democratic", 5},
×
1968
           {"communist", 7},
1✔
1969
       }});
1970
   const mappers::IdeologyMapper ideologyMapper = mappers::IdeologyMapper(pointsMap, {});
1✔
1971

1972
   // TG1 has testlaw1: support, testlaw2: strong support
1973
   // TG2 has testlaw1: support, testlaw3: strongly oppose
1974
   // this maps to:
1975
   // TG1: democratic2, fasc3 + com10,fasc6 = (2,10,9,0) (total 21) * 50clout
1976
   // TG1 has a 0, so normalization has no offset
1977
   // TG2: democratic2,fasc3+ democratic-10, com-14 = (-8,-14,3,0) (total 25) *150clout
1978
   // total is then (-1100,-1600,900,0)
1979
   // get all positive: (500,0,2500,1600).
1980
   // divide by total of 4600: (.10,0,.54,.36)
1981

1982
   const auto country_one = ConvertCountry(source_world,
1983
       source_country_one,
1984
       commonItems::LocalizationDatabase{{}, {}},
2✔
1985
       country_mapper,
1986
       states,
1987
       ideologyMapper,
1988
       mappers::UnitMapper(templates),
2✔
1989
       {},
1990
       {},
1991
       {},
1992
       {},
1993
       {},
1994
       {},
1995
       mappers::CultureGraphicsMapper{{}},
2✔
1996
       mappers::LeaderTypeMapper({}),
2✔
1997
       mappers::CharacterTraitMapper({}, {}, {}, {}),
2✔
1998
       {0, {}},
1999
       {},
2000
       dummy_characters,
2001
       dummy_culture_queues);
5✔
2002

2003
   ASSERT_TRUE(country_one.has_value());
1✔
2004
   EXPECT_THAT(country_one->GetIdeologySupport(),
1✔
2005
       testing::UnorderedElementsAre(testing::Pair("democratic", 10),
2006
           testing::Pair("communist", 0),
2007
           testing::Pair("fascist", 54),
2008
           testing::Pair("neutrality", 36)));
1✔
2009
}
13✔
2010

2011

2012
TEST(Hoi4worldCountriesCountryConverter, IdeologySupportDefaultsToAllNeutrality)
4✔
2013
{
2014
   const mappers::CountryMapper country_mapper({{1, "TAG"}});
2✔
2015
   const vic3::Country source_country_one({.number = 1, .capital_state = 2});
1✔
2016
   std::map<int, hoi4::Character> dummy_characters;
1✔
2017
   std::map<std::string, mappers::CultureQueue> dummy_culture_queues;
1✔
2018
   mappers::TemplateMap templates;
1✔
2019
   vic3::World source_world = vic3::World({});
1✔
2020
   const States states({.vic3_state_ids_to_hoi4_state_ids{{2, 4}}});
1✔
2021

2022
   const auto country_one = ConvertCountry(source_world,
2023
       source_country_one,
2024
       commonItems::LocalizationDatabase{{}, {}},
2✔
2025
       country_mapper,
2026
       states,
2027
       mappers::IdeologyMapper({}, {}),
2✔
2028
       mappers::UnitMapper(templates),
2✔
2029
       {},
2030
       {},
2031
       {},
2032
       {},
2033
       {},
2034
       {},
2035
       mappers::CultureGraphicsMapper{{}},
2✔
2036
       mappers::LeaderTypeMapper({}),
2✔
2037
       mappers::CharacterTraitMapper({}, {}, {}, {}),
2✔
2038
       {0, {}},
2039
       {},
2040
       dummy_characters,
2041
       dummy_culture_queues);
5✔
2042

2043
   ASSERT_TRUE(country_one.has_value());
1✔
2044
   EXPECT_THAT(country_one->GetIdeologySupport(), testing::UnorderedElementsAre(testing::Pair("neutrality", 100)));
1✔
2045
}
5✔
2046

2047

2048
TEST(Hoi4worldCountriesCountryConverter, StabilityDefaultsToZero)
4✔
2049
{
2050
   const mappers::CountryMapper country_mapper({{1, "TAG"}});
2✔
2051
   const vic3::Country source_country_one({.number = 1, .capital_state = 2});
1✔
2052
   std::map<int, hoi4::Character> dummy_characters;
1✔
2053
   std::map<std::string, mappers::CultureQueue> dummy_culture_queues;
1✔
2054
   vic3::World source_world = vic3::World({});
1✔
2055
   const std::map<int, int> vic3_state_ids_to_hoi4_state_ids{{2, 4}};
1✔
2056
   mappers::TemplateMap templates;
1✔
2057

2058
   const auto country_one = ConvertCountry(source_world,
2059
       source_country_one,
2060
       commonItems::LocalizationDatabase{{}, {}},
2✔
2061
       country_mapper,
2062
       States{.vic3_state_ids_to_hoi4_state_ids = vic3_state_ids_to_hoi4_state_ids},
1✔
2063
       mappers::IdeologyMapper({}, {}),
2✔
2064
       mappers::UnitMapper(templates),
2✔
2065
       {},
2066
       {},
2067
       {},
2068
       {},
2069
       {},
2070
       {},
2071
       mappers::CultureGraphicsMapper{{}},
2✔
2072
       mappers::LeaderTypeMapper({}),
2✔
2073
       mappers::CharacterTraitMapper({}, {}, {}, {}),
2✔
2074
       {0, {}},
2075
       {},
2076
       dummy_characters,
2077
       dummy_culture_queues);
5✔
2078

2079
   ASSERT_TRUE(country_one.has_value());
1✔
2080
   EXPECT_THAT(country_one->GetStability(), 0.0F);
1✔
2081
}
6✔
2082

2083

2084
TEST(Hoi4worldCountriesCountryConverter, StabilityConvertsFromLegitimacy)
4✔
2085
{
2086
   const mappers::CountryMapper country_mapper({{1, "TAG"}});
2✔
2087
   const vic3::Country source_country_one({.number = 1, .capital_state = 2, .legitimacy = 100});
1✔
2088
   const vic3::Country source_country_two({.number = 1, .capital_state = 2, .legitimacy = 0});
1✔
2089
   std::map<int, hoi4::Character> dummy_characters;
1✔
2090
   std::map<std::string, mappers::CultureQueue> dummy_culture_queues;
1✔
2091
   vic3::World source_world = vic3::World({});
1✔
2092
   const std::map<int, int> vic3_state_ids_to_hoi4_state_ids{{2, 4}};
1✔
2093
   mappers::TemplateMap templates;
1✔
2094

2095
   const auto country_one = ConvertCountry(source_world,
2096
       source_country_one,
2097
       commonItems::LocalizationDatabase{{}, {}},
2✔
2098
       country_mapper,
2099
       States{.vic3_state_ids_to_hoi4_state_ids = vic3_state_ids_to_hoi4_state_ids},
1✔
2100
       mappers::IdeologyMapper({}, {}),
2✔
2101
       mappers::UnitMapper(templates),
2✔
2102
       {},
2103
       {},
2104
       {},
2105
       {},
2106
       {},
2107
       {},
2108
       mappers::CultureGraphicsMapper{{}},
2✔
2109
       mappers::LeaderTypeMapper({}),
2✔
2110
       mappers::CharacterTraitMapper({}, {}, {}, {}),
2✔
2111
       {0, {}},
2112
       {},
2113
       dummy_characters,
2114
       dummy_culture_queues);
5✔
2115

2116
   const auto country_two = ConvertCountry(source_world,
2117
       source_country_two,
2118
       commonItems::LocalizationDatabase{{}, {}},
2✔
2119
       country_mapper,
2120
       States{.vic3_state_ids_to_hoi4_state_ids = vic3_state_ids_to_hoi4_state_ids},
1✔
2121
       mappers::IdeologyMapper({}, {}),
2✔
2122
       mappers::UnitMapper(templates),
2✔
2123
       {},
2124
       {},
2125
       {},
2126
       {},
2127
       {},
2128
       {},
2129
       mappers::CultureGraphicsMapper{{}},
2✔
2130
       mappers::LeaderTypeMapper({}),
2✔
2131
       mappers::CharacterTraitMapper({}, {}, {}, {}),
2✔
2132
       {0, {}},
2133
       {},
2134
       dummy_characters,
2135
       dummy_culture_queues);
5✔
2136

2137
   ASSERT_TRUE(country_one.has_value());
1✔
2138
   EXPECT_EQ(country_one->GetStability(), 0.60F);
1✔
2139
   EXPECT_FLOAT_EQ(country_two->GetStability(), 0.00F);
1✔
2140
}
8✔
2141

2142

2143
TEST(Hoi4worldCountriesCountryConverter, UnitsAreConverted)
4✔
2144
{
2145
   const mappers::CountryMapper country_mapper({{1, "TAG"}});
2✔
2146
   vic3::Buildings buildings(std::map<int, std::vector<vic3::Building>>{
5✔
2147
       {
NEW
2148
           1,
×
2149
           {
2150
               vic3::Building(vic3::BuildingTypeBarracks,
NEW
2151
                   1,
×
2152
                   0,
2153
                   1,
2154
                   std::vector<std::string>{"trench_infantry", "field_hospitals"}),
4✔
2155
           },
2156
       },
2157
       {
NEW
2158
           2,
×
2159
           {
2160
               vic3::Building(vic3::BuildingTypeBarracks,
NEW
2161
                   2,
×
2162
                   0,
2163
                   1,
2164
                   std::vector<std::string>{"trench_infantry", "wound_dressing", "militia"}),
5✔
2165
           },
2166
       },
2167
   });
6✔
2168
   const vic3::World source_world = vic3::World(vic3::WorldOptions{.buildings = buildings});
1✔
2169
   const vic3::Country source_country_one({.number = 1});
1✔
2170
   std::map<int, Character> dummy_characters;
1✔
2171
   std::map<std::string, mappers::CultureQueue> dummy_culture_queues;
1✔
2172
   const States states({.states{
2173
                            State(1,
2174
                                {
2175
                                    .owner = "TAG",
2176
                                    .provinces = {1},
2177
                                }),
2178
                            State(2,
2179
                                {
2180
                                    .owner = "TAG",
2181
                                    .provinces = {2},
2182
                                }),
2183
                            State(3,
2184
                                {
2185
                                    .owner = "TAG",
2186
                                    .provinces = {3},
2187
                                }),
2188
                        },
2189
       .vic3_state_ids_to_hoi4_state_ids{{1, 1}, {2, 2}, {3, 3}},
2190
       .hoi4_state_ids_to_owner{{1, "TAG"}, {2, "TAG"}, {3, "TAG"}}});
8✔
2191
   mappers::TemplateMap templates{
2192
       {"trench_infantry", mappers::BattalionTemplate(30, {{"infantry", 2.0F}})},
1✔
2193
       {"militia", mappers::BattalionTemplate(40, {{"militia", 1.0F}})},
1✔
2194
       {"field_hospitals", mappers::BattalionTemplate(10, {})},
1✔
2195
       {"wound_dressing", mappers::BattalionTemplate(0, {})},
1✔
2196
   };
5✔
2197
   std::vector<std::string> template_names{"Heavy Infantry", "Cavalry", "Light Infantry", "Ghosts"};
5✔
2198
   hoi4::UnitCount heavy_infantry{{"infantry", 2}};
2✔
2199
   hoi4::UnitCount light_infantry{{"infantry", 1}};
2✔
2200
   hoi4::UnitCount cavalry{{"cavalry", 1}};
2✔
2201
   hoi4::UnitCount artillery{{"artillery", 1}};
2✔
2202
   hoi4::UnitCount empty;
1✔
2203
   std::vector<hoi4::DivisionTemplate> division_templates{
2204
       hoi4::DivisionTemplate(template_names[0], heavy_infantry, artillery),
1✔
2205
       hoi4::DivisionTemplate(template_names[1], cavalry, empty),
1✔
2206
       hoi4::DivisionTemplate(template_names[2], light_infantry, empty),
1✔
2207
       hoi4::DivisionTemplate(template_names[3], empty, empty),
1✔
2208
   };
5✔
2209

2210
   const auto country_one = ConvertCountry(source_world,
2211
       source_country_one,
2212
       commonItems::LocalizationDatabase{{}, {}},
2✔
2213
       country_mapper,
2214
       states,
2215
       mappers::IdeologyMapper({}, {}),
2✔
2216
       mappers::UnitMapper(templates),
2✔
2217
       {},
2218
       {},
2219
       {},
2220
       {},
2221
       {},
2222
       division_templates,
2223
       mappers::CultureGraphicsMapper{{}},
2✔
2224
       mappers::LeaderTypeMapper({}),
2✔
2225
       mappers::CharacterTraitMapper({}, {}, {}, {}),
2✔
2226
       {0, {}},
2227
       {},
2228
       dummy_characters,
2229
       dummy_culture_queues);
5✔
2230

2231
   ASSERT_TRUE(country_one.has_value());
1✔
2232
   EXPECT_THAT(country_one->GetUnits(),
3✔
2233
       testing::UnorderedElementsAre(hoi4::Unit{"Light Infantry", 40, 1},
2234
           hoi4::Unit{"Light Infantry", 40, 1},
2235
           hoi4::Unit{"Light Infantry", 70, 2},
2236
           hoi4::Unit{"Light Infantry", 70, 2}));
1✔
2237
}
24✔
2238

2239

2240
TEST(Hoi4worldCountriesCountryConverter, WarsDefaultToEmpty)
4✔
2241
{
2242
   const vic3::World source_world = vic3::World(vic3::WorldOptions());
1✔
2243
   const mappers::CountryMapper country_mapper({{1, "T00"}});
2✔
2244
   const vic3::Country source_country_one({.number = 1, .color = commonItems::Color{std::array{1, 2, 3}}});
1✔
2245
   std::map<int, Character> dummy_characters;
1✔
2246
   std::map<std::string, mappers::CultureQueue> dummy_culture_queues;
1✔
2247
   mappers::TemplateMap templates;
1✔
2248

2249
   const auto country_one = ConvertCountry(source_world,
2250
       source_country_one,
2251
       commonItems::LocalizationDatabase{{}, {}},
2✔
2252
       country_mapper,
2253
       {},
2254
       mappers::IdeologyMapper({}, {}),
2✔
2255
       mappers::UnitMapper(templates),
2✔
2256
       {},
2257
       {},
2258
       {},
2259
       {},
2260
       {},
2261
       {},
2262
       mappers::CultureGraphicsMapper{{}},
2✔
2263
       mappers::LeaderTypeMapper({}),
2✔
2264
       mappers::CharacterTraitMapper({}, {}, {}, {}),
2✔
2265
       {0, {}},
2266
       {},
2267
       dummy_characters,
2268
       dummy_culture_queues);
6✔
2269

2270
   ASSERT_TRUE(country_one.has_value());
1✔
2271
   EXPECT_TRUE(country_one->GetWars().empty());
1✔
2272
}
4✔
2273

2274

2275
TEST(Hoi4worldCountriesCountryConverter, WarsCanBeAdded)
4✔
2276
{
2277
   const vic3::World source_world = vic3::World(vic3::WorldOptions());
1✔
2278
   const mappers::CountryMapper country_mapper({{1, "T00"}});
2✔
2279
   const vic3::Country source_country_one({.number = 1, .color = commonItems::Color{std::array{1, 2, 3}}});
1✔
2280
   std::map<int, Character> dummy_characters;
1✔
2281
   std::map<std::string, mappers::CultureQueue> dummy_culture_queues;
1✔
2282
   mappers::TemplateMap templates;
1✔
2283

2284
   auto country_one = ConvertCountry(source_world,
2285
       source_country_one,
2286
       commonItems::LocalizationDatabase{{}, {}},
2✔
2287
       country_mapper,
2288
       {},
2289
       mappers::IdeologyMapper({}, {}),
2✔
2290
       mappers::UnitMapper(templates),
2✔
2291
       {},
2292
       {},
2293
       {},
2294
       {},
2295
       {},
2296
       {},
2297
       mappers::CultureGraphicsMapper{{}},
2✔
2298
       mappers::LeaderTypeMapper({}),
2✔
2299
       mappers::CharacterTraitMapper({}, {}, {}, {}),
2✔
2300
       {0, {}},
2301
       {},
2302
       dummy_characters,
2303
       dummy_culture_queues);
6✔
2304

2305
   const War war_one({.original_attacker = "ONE"});
1✔
2306
   country_one->AddWar(war_one);
1✔
2307
   const War war_two({.original_attacker = "TWO"});
1✔
2308
   country_one->AddWar(war_two);
1✔
2309

2310

2311
   ASSERT_TRUE(country_one.has_value());
1✔
2312
   EXPECT_THAT(country_one->GetWars(), testing::ElementsAre(war_one, war_two));
1✔
2313
}
4✔
2314

2315

2316
TEST(Hoi4worldCountriesCountryConverter, MonarchIdeaCanBeAdded)
4✔
2317
{
2318
   const mappers::CountryMapper country_mapper({{1, "TAG"}});
2✔
2319
   const vic3::World source_world = vic3::World(vic3::WorldOptions{});
1✔
2320
   const vic3::Country source_country_one(
2321
       {.number = 1, .active_laws = {"law_monarchy"}, .last_election = date("1932.1.1"), .head_of_state_id = 42});
3✔
2322
   std::map<int, Character> characters = {{42, Character({.first_name = "FirstName", .last_name = "LastName"})}};
2✔
2323
   std::map<std::string, mappers::CultureQueue> dummy_culture_queues;
1✔
2324
   const States states({.states{
2325
                            State(1,
2326
                                {
2327
                                    .owner = "TAG",
2328
                                    .provinces = {1},
2329
                                }),
2330
                        },
2331
       .vic3_state_ids_to_hoi4_state_ids{{1, 1}},
2332
       .hoi4_state_ids_to_owner{{1, "TAG"}}});
4✔
2333
   mappers::TemplateMap templates;
1✔
2334

2335
   const auto country_one = ConvertCountry(source_world,
2336
       source_country_one,
2337
       commonItems::LocalizationDatabase{{}, {}},
2✔
2338
       country_mapper,
2339
       states,
2340
       mappers::IdeologyMapper({}, {}),
2✔
2341
       mappers::UnitMapper(templates),
2✔
2342
       {},
2343
       {},
2344
       {},
2345
       {},
2346
       {},
2347
       {},
2348
       mappers::CultureGraphicsMapper{{}},
2✔
2349
       mappers::LeaderTypeMapper({}),
2✔
2350
       mappers::CharacterTraitMapper({}, {}, {}, {}),
2✔
2351
       {0, {}},
2352
       {},
2353
       characters,
2354
       dummy_culture_queues);
5✔
2355

2356
   ASSERT_TRUE(country_one.has_value());
1✔
2357
   EXPECT_THAT(country_one->GetIdeas(), testing::ElementsAre("TAG_FirstName_LastName"));
1✔
2358
   EXPECT_THAT(country_one->GetMonarchIdeaIds(), 42);
1✔
2359
}
10✔
2360

2361
TEST(Hoi4worldCountriesCountryConverter, ConvoysConvert)
4✔
2362
{
2363
   const mappers::CountryMapper country_mapper({{1, "TAG"}, {2, "ABC"}});
3✔
2364
   const vic3::Country source_country_one({.number = 1});
1✔
2365
   const vic3::Country source_country_two({.number = 2});
1✔
2366
   std::map<int, Character> dummy_characters;
1✔
2367
   std::map<std::string, mappers::CultureQueue> dummy_culture_queues;
1✔
2368
   const std::map<int, vic3::State> vic3_states{
2369
       {1, vic3::State({.id = 1})},
1✔
2370
       {2, vic3::State({.id = 2})},
1✔
2371
       {3, vic3::State({.id = 3})},
1✔
2372
   };
4✔
2373
   vic3::Buildings buildings(std::map<int, std::vector<vic3::Building>>{
6✔
2374
       {1, {vic3::Building(vic3::BuildingTypePort, 1, 0, 1, std::vector<std::string>{"dummy", "pm_port_1"})}},
4✔
2375
       {2, {vic3::Building(vic3::BuildingTypePort, 2, 0, 1, std::vector<std::string>{"pm_port_2"})}},
3✔
2376
       {3, {vic3::Building(vic3::BuildingTypePort, 3, 0, 1, std::vector<std::string>{"pm_port_3"})}},
3✔
2377
   });
8✔
2378
   const vic3::World source_world = vic3::World(vic3::WorldOptions{.states = vic3_states, .buildings = buildings});
1✔
2379
   const States states({.states{
2380
                            State(1,
2381
                                {
2382
                                    .owner = "TAG",
2383
                                    .provinces = {1},
2384
                                }),
2385
                            State(2,
2386
                                {
2387
                                    .owner = "TAG",
2388
                                    .provinces = {2},
2389
                                }),
2390
                            State(3,
2391
                                {
2392
                                    .owner = "ABC",
2393
                                    .provinces = {3},
2394
                                }),
2395
                        },
2396
       .vic3_state_ids_to_hoi4_state_ids{{1, 1}, {2, 2}, {3, 3}},
2397
       .hoi4_state_ids_to_owner{{1, "TAG"}, {2, "TAG"}, {3, "ABC"}}});
8✔
2398
   mappers::TemplateMap templates;
1✔
2399
   ConvoyDistributor convoy_distributor(111, {{"pm_port_1", 1.0F}, {"pm_port_2", 10.0F}, {"pm_port_3", 100.0F}});
4✔
2400
   convoy_distributor.CalculateStateWeights(source_world);
1✔
2401

2402
   const auto country_one = ConvertCountry(source_world,
2403
       source_country_one,
2404
       commonItems::LocalizationDatabase{{}, {}},
2✔
2405
       country_mapper,
2406
       states,
2407
       mappers::IdeologyMapper({}, {}),
2✔
2408
       mappers::UnitMapper(templates),
2✔
2409
       {},
2410
       {},
2411
       {},
2412
       {},
2413
       {},
2414
       {},
2415
       mappers::CultureGraphicsMapper{{}},
2✔
2416
       mappers::LeaderTypeMapper({}),
2✔
2417
       mappers::CharacterTraitMapper({}, {}, {}, {}),
2✔
2418
       convoy_distributor,
2419
       {},
2420
       dummy_characters,
2421
       dummy_culture_queues);
5✔
2422
   const auto country_two = ConvertCountry(source_world,
2423
       source_country_two,
2424
       commonItems::LocalizationDatabase{{}, {}},
2✔
2425
       country_mapper,
2426
       states,
2427
       mappers::IdeologyMapper({}, {}),
2✔
2428
       mappers::UnitMapper(templates),
2✔
2429
       {},
2430
       {},
2431
       {},
2432
       {},
2433
       {},
2434
       {},
2435
       mappers::CultureGraphicsMapper{{}},
2✔
2436
       mappers::LeaderTypeMapper({}),
2✔
2437
       mappers::CharacterTraitMapper({}, {}, {}, {}),
2✔
2438
       convoy_distributor,
2439
       {},
2440
       dummy_characters,
2441
       dummy_culture_queues);
5✔
2442

2443
   ASSERT_TRUE(country_one.has_value());
1✔
2444
   EXPECT_THAT(country_one->GetConvoys(), 11);
1✔
2445
   ASSERT_TRUE(country_two.has_value());
1✔
2446
   EXPECT_THAT(country_two->GetConvoys(), 100);
1✔
2447
}
19✔
2448

2449
TEST(Hoi4worldCountriesCountryConverter, NaviesConvert)
4✔
2450
{
2451
   const mappers::CountryMapper country_mapper({{1, "TAG"}, {2, "ABC"}});
3✔
2452
   const vic3::Country source_country_one({.number = 1});
1✔
2453
   const vic3::Country source_country_two({.number = 2});
1✔
2454
   std::map<int, Character> dummy_characters;
1✔
2455
   std::map<std::string, mappers::CultureQueue> dummy_culture_queues;
1✔
2456
   const std::map<int, vic3::State> vic3_states{
2457
       {1, vic3::State({.id = 1})},
1✔
2458
       {2, vic3::State({.id = 2})},
1✔
2459
       {3, vic3::State({.id = 3})},
1✔
2460
   };
4✔
2461
   vic3::Buildings buildings(std::map<int, std::vector<vic3::Building>>{
6✔
2462
       {1, {vic3::Building(vic3::BuildingTypeNavalBase, 1, 0, 10, std::vector<std::string>{"pm_victorian"})}},
3✔
2463
       {2, {vic3::Building(vic3::BuildingTypeNavalBase, 2, 0, 10, std::vector<std::string>{"pm_ancient"})}},
3✔
2464
       {3, {vic3::Building(vic3::BuildingTypeNavalBase, 3, 0, 10, std::vector<std::string>{"pm_modern"})}},
3✔
2465
   });
8✔
2466
   const vic3::World source_world = vic3::World(vic3::WorldOptions{.states = vic3_states, .buildings = buildings});
1✔
2467
   const States states({.states{
2468
                            State(1,
2469
                                {
2470
                                    .owner = "TAG",
2471
                                    .provinces = {1},
2472
                                    .naval_base_location = 1,
2473
                                }),
2474
                            State(2,
2475
                                {
2476
                                    .owner = "TAG",
2477
                                    .provinces = {2},
2478
                                    .naval_base_location = 2,
2479
                                }),
2480
                            State(3,
2481
                                {
2482
                                    .owner = "ABC",
2483
                                    .provinces = {3},
2484
                                    .naval_base_location = 3,
2485
                                }),
2486
                        },
2487
       .vic3_state_ids_to_hoi4_state_ids{{1, 1}, {2, 2}, {3, 3}},
2488
       .hoi4_state_ids_to_owner{{1, "TAG"}, {2, "TAG"}, {3, "ABC"}}});
8✔
2489
   mappers::TemplateMap templates;
1✔
2490

2491
   std::vector<EquipmentVariant> legacy_ships{
2492
       EquipmentVariant("Basic Ship", "legacy_basic_ship", {}, {}, {}),
2493
       EquipmentVariant("1936 Ship", "legacy_1936_ship", {}, {}, {}),
2494
   };
3✔
2495
   std::vector<EquipmentVariant> mtg_ships{
2496
       EquipmentVariant("Basic Ship", "mtg_basic_ship", {}, {}, {}),
2497
       EquipmentVariant("1936 Ship", "mtg_1936_ship", {}, {}, {}),
2498
   };
3✔
2499
   std::vector<TaskForceTemplate> task_force_templates{
2500
       {{{"pm_victorian", 5.0F}}, {Ship("Cruiser", "basic_ship", "mtg_basic_ship", "legacy_basic_ship", "Basic Ship")}},
×
2501
       {{{"pm_modern", 10.0F}}, {Ship("Battleship", "1936_ship", "mtg_1936_ship", "legacy_1936_ship", "1936 Ship")}},
×
2502
   };
7✔
2503

2504
   const auto country_one = ConvertCountry(source_world,
2505
       source_country_one,
2506
       commonItems::LocalizationDatabase{{}, {}},
2✔
2507
       country_mapper,
2508
       states,
2509
       mappers::IdeologyMapper({}, {}),
2✔
2510
       mappers::UnitMapper(templates),
2✔
2511
       {},
2512
       legacy_ships,
2513
       mtg_ships,
2514
       {},
2515
       {},
2516
       {},
2517
       mappers::CultureGraphicsMapper{{}},
2✔
2518
       mappers::LeaderTypeMapper({}),
2✔
2519
       mappers::CharacterTraitMapper({}, {}, {}, {}),
2✔
2520
       {0, {}},
2521
       task_force_templates,
2522
       dummy_characters,
2523
       dummy_culture_queues);
5✔
2524
   const auto country_two = ConvertCountry(source_world,
2525
       source_country_two,
2526
       commonItems::LocalizationDatabase{{}, {}},
2✔
2527
       country_mapper,
2528
       states,
2529
       mappers::IdeologyMapper({}, {}),
2✔
2530
       mappers::UnitMapper(templates),
2✔
2531
       {},
2532
       legacy_ships,
2533
       mtg_ships,
2534
       {},
2535
       {},
2536
       {},
2537
       mappers::CultureGraphicsMapper{{}},
2✔
2538
       mappers::LeaderTypeMapper({}),
2✔
2539
       mappers::CharacterTraitMapper({}, {}, {}, {}),
2✔
2540
       {0, {}},
2541
       task_force_templates,
2542
       dummy_characters,
2543
       dummy_culture_queues);
5✔
2544

2545
   EXPECT_THAT(country_one.value_or(Country({})).GetTaskForces(),
7✔
2546
       testing::UnorderedElementsAre(TaskForce{
2547
           .name = "1. Fleet",
2548
           .ships =
2549
               {
2550
                   Ship("Cruiser 1", "basic_ship", "mtg_basic_ship", "legacy_basic_ship", "Basic Ship"),
2551
                   Ship("Cruiser 2", "basic_ship", "mtg_basic_ship", "legacy_basic_ship", "Basic Ship"),
2552
               },
2553
           .location = 1,
2554
       }));
1✔
2555
   EXPECT_THAT(country_two.value_or(Country({})).GetTaskForces(),
6✔
2556
       testing::UnorderedElementsAre(TaskForce{
2557
           .name = "1. Fleet",
2558
           .ships =
2559
               {
2560
                   Ship("Battleship 1", "1936_ship", "mtg_1936_ship", "legacy_1936_ship", "1936 Ship"),
2561
               },
2562
           .location = 3,
2563
       }));
1✔
2564
}
37✔
2565

2566

2567
}  // namespace hoi4
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc