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

APN-Pucky / tyrant_optimize / 15944160492

28 Jun 2025 12:31PM UTC coverage: 70.385% (+0.08%) from 70.309%
15944160492

push

github

APN-Pucky
Update test cards_section

4777 of 6787 relevant lines covered (70.38%)

9076716.67 hits per line

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

91.0
/sim_test.cpp
1
// exec: ./tuo-test , verbose: ./tuo-test --log_level=all
2
// set-iterations ./tuo-test 100  , default = 10 // more than 100 cause errors
3
#ifdef TEST
4
#ifdef NQUEST // only without quests
5
#define BOOST_TEST_DYN_LINK
6
#define BOOST_TEST_MODULE sim
7

8
#include <chrono>
9
#include <boost/test/included/unit_test.hpp>
10
#include <boost/test/data/test_case.hpp>
11
#include <boost/test/data/monomorphic.hpp>
12
#include <iostream>
13
#include <fstream>
14
#include <iostream>
15
#include <exception>
16
#include <sstream>
17
#include "tyrant.h"
18
#include "tyrant_optimize.h"
19
#include "sim.h"
20
#include "read.h"
21

22
using namespace std;
23
namespace bdata = boost::unit_test::data;
24
typedef std::tuple<FinalResults<long double>, std::string, double, std::string> Result; // score, output, time, result_deck
25
int iter = 1000;
26
unsigned seed = 0;
27
// limit for float diffing
28
// disable
29
double eps = 1.;
30
// enable
31
// double eps = 0.0000001;
32

33
// pipe output: https://stackoverflow.com/questions/5405016/can-i-check-my-programs-output-with-boost-test
34
struct ios_redirect
35
{
36
    ios_redirect(std::streambuf *new_buffer, std::ostream &ios)
162✔
37
        : old(ios.rdbuf(new_buffer)), iios(ios)
162✔
38
    {
39
    }
40

41
    ~ios_redirect()
162✔
42
    {
43
        iios.rdbuf(old);
81✔
44
    }
45

46
private:
47
    std::streambuf *old;
48
    std::ostream &iios;
49
};
50

51
struct TestInfo
76✔
52
{
53
    std::string your_deck, enemy_deck, bge;
54
};
55
std::ostream &operator<<(std::ostream &os, const TestInfo &ti)
60✔
56
{
57
    return os << "Your Deck: " << ti.your_deck << "; Enemy Deck: " << ti.enemy_deck << "; BGE: " << ti.bge;
60✔
58
}
59

60
inline Result run_sim(int argc, const char **argv, bool pipe_output = true)
81✔
61
{
62
    init();
81✔
63
    Result res;
81✔
64
    std::string rdeck = "";
81✔
65
    FinalResults<long double> fr;
81✔
66
    //
67

68
    auto start_time = std::chrono::system_clock::now();
81✔
69
    // pipe output
70
    std::stringstream output;
81✔
71
    std::stringstream eoutput;
81✔
72
    {
81✔
73
        ios_redirect guard2(eoutput.rdbuf(), std::cerr); // block warnings
81✔
74
        if (pipe_output)
81✔
75
        {
76
            ios_redirect guard1(output.rdbuf(), std::cout);
81✔
77

78
            //////////////////////
79
            // only single thread for string stream build
80
            //////////////////////
81
            const char **param = new const char *[argc + 2];
81✔
82
            for (int i = 0; i < argc; i++)
956✔
83
                param[i] = const_cast<char *>(argv[i]);
875✔
84
            param[argc] = const_cast<char *>("-t");
81✔
85
            param[argc + 1] = const_cast<char *>("1");
81✔
86
            auto rett = run(argc + 2, param);
81✔
87
            delete[] param;
81✔
88
            fr = rett.second;
81✔
89
            // result to string
90
            auto drc = rett;
81✔
91
            std::stringstream oss;
81✔
92
            if (drc.first->commander)
81✔
93
                oss << drc.first->commander->m_name << ", ";
81✔
94
            if (drc.first->alpha_dominion)
81✔
95
                oss << drc.first->alpha_dominion->m_name << ", ";
70✔
96
            print_cards_inline(drc.first->cards, oss, drc.first);
81✔
97
            rdeck = oss.str();
81✔
98
        }
81✔
99
        else
100
        {
101
            // no guard here
102
            //////////////////////
103
            // only single thread, else crashes
104
            //////////////////////
105
            const char **param = new const char *[argc + 2];
×
106
            for (int i = 0; i < argc; i++)
×
107
                param[i] = const_cast<char *>(argv[i]);
×
108
            param[argc] = const_cast<char *>("-t");
×
109
            param[argc + 1] = const_cast<char *>("1");
×
110
            auto rett = run(argc + 2, param);
×
111
            delete[] param;
×
112
            fr = rett.second;
×
113
            // result to string
114
            auto drc = rett;
×
115
            std::stringstream oss;
×
116
            if (drc.first->commander)
×
117
                oss << drc.first->commander->m_name << ", ";
×
118
            if (drc.first->alpha_dominion)
×
119
                oss << drc.first->alpha_dominion->m_name << ", ";
×
120
            print_cards_inline(drc.first->cards, oss, drc.first);
×
121
            rdeck = oss.str();
×
122
        }
×
123
    }
×
124

125
    auto end_time = std::chrono::system_clock::now();
81✔
126
    std::chrono::duration<double> delta_t = (end_time - start_time);
81✔
127
    res = std::make_tuple(fr, "\n" + debug_str + output.str(), delta_t.count(), rdeck);
243✔
128
    return res;
162✔
129
}
81✔
130

131
inline void check_win(Result result)
62✔
132
{
133
    BOOST_CHECK_MESSAGE(
62✔
134
        1 - eps <= std::get<0>(result).wins &&
135
            eps >= std::get<0>(result).losses &&
136
            eps >= std::get<0>(result).draws,
137
        std::get<1>(result));
138
    // BOOST_CHECK(100==result.points);
139
}
62✔
140
// inline void check_win_sim(const char* your_deck, const char* enemy_deck, const char* bge="") {
141
inline void check_win_sim(TestInfo ti)
60✔
142
{
143
    /////////////
144
    // Max. Iter == 100, else check_win fails with integer vs double equal in check_win
145
    ////////////
146
    string s = std::to_string(iter);
60✔
147
    char *ii = new char[s.length()+1];
60✔
148
    strcpy(ii, s.c_str());
60✔
149
    s = std::to_string(seed);
60✔
150
    char *iii = new char[s.length()+1];
60✔
151
    strcpy(iii, s.c_str());
60✔
152
    const char *argv[] = {"tuo", ti.your_deck.c_str(), ti.enemy_deck.c_str(), "-e", ti.bge.c_str(), "sim", ii, "seed", iii, "prefix", "tests/sim/"}; // much output on error?! // better 100 iterations for test, 10 for checking errors
60✔
153
    // const char* argv[] = {"tuo",ti.your_deck.c_str(),ti.enemy_deck.c_str(),"-e",ti.bge.c_str(),"sim", ii,"seed", iii}; //much output on error?! // better 100 iterations for test, 10 for checking errors
154
    Result result(run_sim(sizeof(argv) / sizeof(*argv), argv));
60✔
155
    delete[] ii;
60✔
156
    delete[] iii;
60✔
157
    // result.second += "\nTest: " + ti.your_deck + "; " + ti.enemy_deck + "; " + ti.bge;
158
    check_win(result);
120✔
159
}
60✔
160
inline double time_db_sim(std::string gnt1, std::string gnt2)
1✔
161
{
162
    /////////////
163
    // Max. Iter == 100, else check_win fails with integer vs double equal in check_win
164
    ////////////
165
    string s = std::to_string(iter);
1✔
166
    char *ii = new char[s.length()+1];
1✔
167
    strcpy(ii, s.c_str());
1✔
168
    s = std::to_string(seed);
1✔
169
    char *iii = new char[s.length()+1];
1✔
170
    strcpy(iii, s.c_str());
1✔
171
    const char *argv[] = {"tuo", gnt1.c_str(), gnt2.c_str(), "sim", ii, "seed", iii, "prefix", "tests/db/", "db", "no-db-load"}; // much output on error?! // better 100 iterations for test, 10 for checking errors
1✔
172
    // const char* argv[] = {"tuo",ti.your_deck.c_str(),ti.enemy_deck.c_str(),"-e",ti.bge.c_str(),"sim", ii,"seed", iii}; //much output on error?! // better 100 iterations for test, 10 for checking errors
173
    Result result(run_sim(sizeof(argv) / sizeof(*argv), argv));
1✔
174
    delete[] ii;
1✔
175
    delete[] iii;
1✔
176
    // result.second += "\nTest: " + ti.your_deck + "; " + ti.enemy_deck + "; " + ti.bge;
177
    // check_win(result);
178
    return std::get<2>(result);
1✔
179
}
1✔
180
inline double time_db(std::string gnt1, std::string gnt2)
1✔
181
{
182
    /////////////
183
    // Max. Iter == 100, else check_win fails with integer vs double equal in check_win
184
    ////////////
185
    string s = std::to_string(iter);
1✔
186
    char *ii = new char[s.length()+1];
1✔
187
    strcpy(ii, s.c_str());
1✔
188
    s = std::to_string(seed);
1✔
189
    char *iii = new char[s.length()+1];
1✔
190
    strcpy(iii, s.c_str());
1✔
191
    const char *argv[] = {"tuo", gnt1.c_str(), gnt2.c_str(), "sim", ii, "seed", iii, "prefix", "tests/db/", "db"}; // much output on error?! // better 100 iterations for test, 10 for checking errors
1✔
192
    // const char* argv[] = {"tuo",ti.your_deck.c_str(),ti.enemy_deck.c_str(),"-e",ti.bge.c_str(),"sim", ii,"seed", iii}; //much output on error?! // better 100 iterations for test, 10 for checking errors
193
    Result result(run_sim(sizeof(argv) / sizeof(*argv), argv));
1✔
194
    delete[] ii;
1✔
195
    delete[] iii;
1✔
196
    // result.second += "\nTest: " + ti.your_deck + "; " + ti.enemy_deck + "; " + ti.bge;
197
    // check_win(result);
198
    return std::get<2>(result);
1✔
199
}
1✔
200
inline double time_ml_sim(std::string gnt1, std::string gnt2)
1✔
201
{
202
    /////////////
203
    // Max. Iter == 100, else check_win fails with integer vs double equal in check_win
204
    ////////////
205
    string s = std::to_string(iter);
1✔
206
    char *ii = new char[s.length()+1];
1✔
207
    strcpy(ii, s.c_str());
1✔
208
    s = std::to_string(seed);
1✔
209
    char *iii = new char[s.length()+1];
1✔
210
    strcpy(iii, s.c_str());
1✔
211
    const char *argv[] = {"tuo", gnt1.c_str(), gnt2.c_str(), "sim", ii, "seed", iii, "prefix", "tests/ml/", "no-db-load"}; // much output on error?! // better 100 iterations for test, 10 for checking errors
1✔
212
    // const char* argv[] = {"tuo",ti.your_deck.c_str(),ti.enemy_deck.c_str(),"-e",ti.bge.c_str(),"sim", ii,"seed", iii}; //much output on error?! // better 100 iterations for test, 10 for checking errors
213
    Result result(run_sim(sizeof(argv) / sizeof(*argv), argv));
1✔
214
    delete[] ii;
1✔
215
    delete[] iii;
1✔
216
    // result.second += "\nTest: " + ti.your_deck + "; " + ti.enemy_deck + "; " + ti.bge;
217
    // check_win(result);
218
    return std::get<2>(result);
1✔
219
}
1✔
220
inline double time_ml(std::string gnt1, std::string gnt2)
1✔
221
{
222
    /////////////
223
    // Max. Iter == 100, else check_win fails with integer vs double equal in check_win
224
    ////////////
225
    string s = std::to_string(iter);
1✔
226
    char *ii = new char[s.length()+1];
1✔
227
    strcpy(ii, s.c_str());
1✔
228
    s = std::to_string(seed);
1✔
229
    char *iii = new char[s.length()+1];
1✔
230
    strcpy(iii, s.c_str());
1✔
231
    const char *argv[] = {"tuo", gnt1.c_str(), gnt2.c_str(), "sim", ii, "seed", iii, "prefix", "tests/ml/", "no-db", "ml"}; // much output on error?! // better 100 iterations for test, 10 for checking errors
1✔
232
    // const char* argv[] = {"tuo",ti.your_deck.c_str(),ti.enemy_deck.c_str(),"-e",ti.bge.c_str(),"sim", ii,"seed", iii}; //much output on error?! // better 100 iterations for test, 10 for checking errors
233
    Result result(run_sim(sizeof(argv) / sizeof(*argv), argv));
1✔
234
    delete[] ii;
1✔
235
    delete[] iii;
1✔
236
    // result.second += "\nTest: " + ti.your_deck + "; " + ti.enemy_deck + "; " + ti.bge;
237
    // check_win(result);
238
    return std::get<2>(result);
1✔
239
}
1✔
240

241
inline void genetic(std::string gnt1, std::string gnt2)
242
{
243
    string s = std::to_string(iter);
244
    char *ii = new char[s.length()+1];
245
    strcpy(ii, s.c_str());
246
    const char *argv[] = {"tuo", gnt1.c_str(), gnt2.c_str(), "brawl", "genetic", ii};
247
    Result result(run_sim(sizeof(argv) / sizeof(*argv), argv, false));
248
    std::ofstream mf;
249
    mf.open("out.csv", std::ios_base::app);
250
    mf << gnt1 << ";" << gnt2 << ";" << std::get<0>(result).points << ";" << std::get<2>(result) << std::endl;
251
    mf.close();
252
}
253

254
inline void check_algo(std::string gnt1, std::string gnt2, std::string algo)
3✔
255
{
256
    string s = std::to_string(iter);
3✔
257
    char *ii = new char[s.length()+1];
3✔
258
    strcpy(ii, s.c_str());
3✔
259
    s = std::to_string(seed);
3✔
260
    char *iii = new char[s.length()+1];
3✔
261
    strcpy(iii, s.c_str());
3✔
262
    const char *argv1[] = {"tuo", gnt1.c_str(), gnt2.c_str(), "sim", ii, "seed", iii, "prefix", "tests/algo/", "no-db"};
3✔
263
    Result result_sim(run_sim(sizeof(argv1) / sizeof(*argv1), argv1));
3✔
264
    // Do the algo
265
    const char *argv2[] = {"tuo", gnt1.c_str(), gnt2.c_str(), algo.c_str(), ii, "seed", iii, "prefix", "tests/algo/", "no-db"};
3✔
266
    Result result(run_sim(sizeof(argv2) / sizeof(*argv2), argv2));
3✔
267
    // Rerun sim with optimized deck to check if algo produced wrong sim result
268
    const char *argv3[] = {"tuo", std::get<3>(result).c_str(), gnt2.c_str(), "sim", ii, "seed", iii, "prefix", "tests/algo/", "no-db"};
3✔
269
    Result result_opt(run_sim(sizeof(argv3) / sizeof(*argv3), argv3));
3✔
270
    delete[] ii;
3✔
271
    delete[] iii;
3✔
272
    BOOST_CHECK_MESSAGE(std::get<0>(result_sim).wins <= std::get<0>(result_opt).wins,
18✔
273
                        std::get<1>(result_sim) + "\n" + std::get<1>(result_opt) + "\nWrongly from " + algo + ": " +
274
                            std::to_string(std::get<0>(result_sim).wins) + ">" + std::to_string(std::get<0>(result_opt).wins));
275
}
9✔
276
inline void check_anneal(std::string gnt1, std::string gnt2)
1✔
277
{
278
    std::string algo = "anneal";
1✔
279
    double anneal_temp = 100;
1✔
280
    double anneal_temp_down = 0.01;
1✔
281
    string s = std::to_string(iter);
1✔
282
    char *ii = new char[s.length()+1];
1✔
283
    strcpy(ii, s.c_str());
1✔
284
    s = std::to_string(seed);
1✔
285
    char *iii = new char[s.length()+1];
1✔
286
    strcpy(iii, s.c_str());
1✔
287
    s = std::to_string(anneal_temp);
1✔
288
    char *iv = new char[s.length()+1];
1✔
289
    strcpy(iv, s.c_str());
1✔
290
    s = std::to_string(anneal_temp_down);
1✔
291
    char *v = new char[s.length()+1];
1✔
292
    strcpy(v, s.c_str());
1✔
293
    const char *argv1[] = {"tuo", gnt1.c_str(), gnt2.c_str(), "sim", ii, "seed", iii, "prefix", "tests/algo/", "no-db"};
1✔
294
    Result result_sim(run_sim(sizeof(argv1) / sizeof(*argv1), argv1));
1✔
295
    const char *argv2[] = {"tuo", gnt1.c_str(), gnt2.c_str(), algo.c_str(), ii, iv, v, "seed", iii, "prefix", "tests/algo/", "no-db"};
1✔
296
    Result result(run_sim(sizeof(argv2) / sizeof(*argv2), argv2));
1✔
297
    // Rerun sim with optimized deck to check if algo produced wrong sim result
298
    const char *argv3[] = {"tuo", std::get<3>(result).c_str(), gnt2.c_str(), "sim", ii, "seed", iii, "prefix", "tests/algo/", "no-db"};
1✔
299
    Result result_opt(run_sim(sizeof(argv3) / sizeof(*argv3), argv3));
1✔
300
    delete[] ii;
1✔
301
    delete[] iii;
1✔
302
    delete[] iv;
1✔
303
    delete[] v;
1✔
304
    BOOST_CHECK_MESSAGE(std::get<0>(result_sim).wins <= std::get<0>(result_opt).wins,
6✔
305
                        std::get<1>(result_sim) + "\n" + std::get<1>(result_opt) + "\nWrongly from " + algo + ": " +
306
                            std::to_string(std::get<0>(result_sim).wins) + ">" + std::to_string(std::get<0>(result_opt).wins));
307
}
3✔
308
inline void check_climbex(std::string gnt1, std::string gnt2)
1✔
309
{
310
    std::string algo = "climbex";
1✔
311
    int init = 10;
1✔
312
    string s = std::to_string(iter);
1✔
313
    char *ii = new char[s.length()+1];
1✔
314
    strcpy(ii, s.c_str());
1✔
315
    s = std::to_string(seed);
1✔
316
    char *iii = new char[s.length()+1];
1✔
317
    strcpy(iii, s.c_str());
1✔
318
    s = std::to_string(init);
1✔
319
    char *iv = new char[s.length()+1];
1✔
320
    strcpy(iv, s.c_str());
1✔
321
    const char *argv1[] = {"tuo", gnt1.c_str(), gnt2.c_str(), "sim", ii, "seed", iii, "prefix", "tests/algo/", "no-db"};
1✔
322
    Result result_sim(run_sim(sizeof(argv1) / sizeof(*argv1), argv1));
1✔
323
    const char *argv2[] = {"tuo", gnt1.c_str(), gnt2.c_str(), algo.c_str(), iv, ii, "seed", iii, "prefix", "tests/algo/", "no-db"};
1✔
324
    Result result(run_sim(sizeof(argv2) / sizeof(*argv2), argv2));
1✔
325
    // Rerun sim with optimized deck to check if algo produced wrong sim result
326
    const char *argv3[] = {"tuo", std::get<3>(result).c_str(), gnt2.c_str(), "sim", ii, "seed", iii, "prefix", "tests/algo/", "no-db"};
1✔
327
    Result result_opt(run_sim(sizeof(argv3) / sizeof(*argv3), argv3));
1✔
328
    delete[] ii;
1✔
329
    delete[] iii;
1✔
330
    delete[] iv;
1✔
331
    BOOST_CHECK_MESSAGE(std::get<0>(result_sim).wins <= std::get<0>(result_opt).wins,
6✔
332
                        std::get<1>(result_sim) + "\n" + std::get<1>(result_opt) + "\nWrongly from " + algo + ": " +
333
                            std::to_string(std::get<0>(result_sim).wins) + ">" + std::to_string(std::get<0>(result_opt).wins));
334
}
3✔
335

336
inline void check_climb_forts(std::string gnt1, std::string gnt2, std::string yf, std::string ef)
337
{
338
    std::string algo = "climb_forts";
339
    int init = 10;
340
    string s = std::to_string(iter);
341
    char *ii = new char[s.length()+1];
342
    strcpy(ii, s.c_str());
343
    s = std::to_string(seed);
344
    char *iii = new char[s.length()+1];
345
    strcpy(iii, s.c_str());
346
    s = std::to_string(init);
347
    char *iv = new char[s.length()+1];
348
    strcpy(iv, s.c_str());
349
    const char *argv1[] = {"tuo", gnt1.c_str(), gnt2.c_str(), "sim", ii, "seed", iii, "yf", yf.c_str(), "yfpool", "2", "ef", ef.c_str(), "efpool", "2", "prefix", "tests/algo/", "no-db"};
350
    Result result_sim(run_sim(sizeof(argv1) / sizeof(*argv1), argv1));
351
    const char *argv2[] = {"tuo", gnt1.c_str(), gnt2.c_str(), algo.c_str(), iv, ii, "seed", iii, "yf", yf.c_str(), "yfpool", "2", "ef", ef.c_str(), "efpool", "2", "prefix", "tests/algo/", "no-db"};
352
    Result result_opt(run_sim(sizeof(argv2) / sizeof(*argv2), argv2));
353
    // Rerun sim with optimized deck to check if algo produced wrong sim result
354
    // const char* argv3[] = {"tuo",gnt1.c_str(),gnt2.c_str(),"sim",ii, "seed", iii,  "yf",std::get<3>(result).c_str(), "yfpool","2", "ef", ef.c_str(), "efpool", "2","prefix" , "tests/algo/", "no-db"};
355
    // Result result_opt(run_sim(sizeof(argv3)/sizeof(*argv3),argv3));
356
    delete[] ii;
357
    delete[] iii;
358
    delete[] iv;
359
    BOOST_CHECK_MESSAGE(std::get<0>(result_sim).wins <= std::get<0>(result_opt).wins,
360
                        std::get<1>(result_sim) + "\n" + std::get<1>(result_opt) + "\nWrongly from " + algo + ": " +
361
                            std::to_string(std::get<0>(result_sim).wins) + ">" + std::to_string(std::get<0>(result_opt).wins));
362
}
363

364
std::vector<TestInfo> read_test_file(const std::string filename)
5✔
365
{
366
    std::vector<TestInfo> ret;
5✔
367
    std::ifstream test_file(filename);
5✔
368
    if (test_file.good())
5✔
369
    {
370
        try
371
        {
372
            while (test_file && !test_file.eof())
81✔
373
            {
374
                TestInfo ti;
76✔
375
                std::string line, yd, ed, bg;
76✔
376
                std::getline(test_file, line);
76✔
377
                if (is_line_empty_or_commented(line))
76✔
378
                {
379
                    continue;
16✔
380
                }
381
                std::istringstream iss(line);
60✔
382
                std::getline(iss, ti.your_deck, ';');
60✔
383
                std::getline(iss, ti.enemy_deck, ';');
60✔
384
                std::getline(iss, ti.bge, ';');
60✔
385
                ret.push_back(ti);
60✔
386
            }
76✔
387
        }
388
        catch (std::exception &e)
×
389
        {
390
        }
×
391
    }
392
    return ret;
5✔
393
}
5✔
394

395
BOOST_AUTO_TEST_SUITE(test)
396
BOOST_AUTO_TEST_CASE(test_init)
7✔
397
{
398
    init();
1✔
399

400
    seed = std::chrono::system_clock::now().time_since_epoch().count() * 2654435761;
1✔
401
    if (boost::unit_test::framework::master_test_suite().argc >= 2)
1✔
402
    {
403
        iter = atoi(boost::unit_test::framework::master_test_suite().argv[1]);
×
404
    }
405
    if (boost::unit_test::framework::master_test_suite().argc >= 3)
1✔
406
    {
407
        seed = atoi(boost::unit_test::framework::master_test_suite().argv[2]);
×
408
    }
409
    //BOOST_TEST_MESSAGE("ITER: " << iter);
410
    BOOST_TEST_MESSAGE("SEED: " << seed);
2✔
411
    BOOST_CHECK(1 == 1); //..
1✔
412
}
1✔
413

414
BOOST_AUTO_TEST_SUITE(test_algo)
415
BOOST_AUTO_TEST_CASE(test_algo_init)
6✔
416
{
417
    iter = 1000;
1✔
418
}
×
419
BOOST_AUTO_TEST_SUITE(test_algo_climb)
420
BOOST_AUTO_TEST_CASE(test_algo_climb)
7✔
421
{
422
    check_algo("Mission#134", "Mission#135", "climb");
2✔
423
}
1✔
424
BOOST_AUTO_TEST_SUITE_END()
425

426
BOOST_AUTO_TEST_SUITE(test_algo_anneal)
427
BOOST_AUTO_TEST_CASE(test_algo_anneal)
7✔
428
{
429
    check_anneal("Mission#134", "Mission#135");
2✔
430
}
1✔
431
BOOST_AUTO_TEST_SUITE_END()
432

433
BOOST_AUTO_TEST_SUITE(test_algo_climbex)
434
BOOST_AUTO_TEST_CASE(test_algo_climbex)
7✔
435
{
436
    check_climbex("Mission#134", "Mission#135");
2✔
437
}
1✔
438
BOOST_AUTO_TEST_SUITE_END()
439

440
BOOST_AUTO_TEST_SUITE(test_algo_genetic)
441
BOOST_AUTO_TEST_CASE(test_algo_genetic)
7✔
442
{
443
    check_algo("Mission#134", "Mission#135", "genetic");
2✔
444
}
1✔
445
BOOST_AUTO_TEST_SUITE_END()
446

447
BOOST_AUTO_TEST_SUITE(test_algo_beam)
448
BOOST_AUTO_TEST_CASE(test_algo_beam)
7✔
449
{
450
    check_algo("Mission#134", "Mission#135", "beam");
2✔
451
}
1✔
452
BOOST_AUTO_TEST_SUITE_END()
453

454
// TODO Fix this test
455
// BOOST_AUTO_TEST_SUITE(test_algo_climb_forts)
456
// BOOST_AUTO_TEST_CASE(test_algo_climb_forts)
457
//{
458
//        check_climb_forts("Mission#135","Mission#135","LC#2, TC#2, IB#2, DF#2","LC#2, TC#2, IB#2, DF#2");
459
//}
460
// BOOST_AUTO_TEST_SUITE_END()
461

462
BOOST_AUTO_TEST_SUITE_END()
463

464
BOOST_AUTO_TEST_SUITE(test_sim)
465
BOOST_AUTO_TEST_CASE(test_sim_init)
6✔
466
{
467
    iter = 100;
1✔
468
    debug_print++;
1✔
469
    debug_cached++;
1✔
470
    debug_line = true;
1✔
471
}
×
472
/////////////////////////////////////
473
// Test Cases !should! be very close fights for maximum sensitivity of errors
474
/////////////////////////////////////
475
BOOST_AUTO_TEST_SUITE(test_single_units)
476
BOOST_DATA_TEST_CASE(test_single_units, bdata::make(read_test_file("tests/test_sinlge_units.csv")), ti)
42✔
477
{
478
    check_win_sim(ti);
6✔
479
}
6✔
480
BOOST_AUTO_TEST_SUITE_END()
481

482
BOOST_AUTO_TEST_SUITE(test_multi_units)
483
BOOST_DATA_TEST_CASE(test_multi_units, bdata::make(read_test_file("tests/test_multi_units.csv")), ti)
91✔
484
{
485
    check_win_sim(ti);
13✔
486
}
13✔
487
BOOST_AUTO_TEST_SUITE_END()
488

489
BOOST_AUTO_TEST_SUITE(test_bges)
490
BOOST_DATA_TEST_CASE(test_bges, bdata::make(read_test_file("tests/test_bges.csv")), ti)
21✔
491
{
492
    check_win_sim(ti);
3✔
493
}
3✔
494
BOOST_AUTO_TEST_SUITE_END()
495

496
BOOST_AUTO_TEST_SUITE(test_whole_decks)
497
BOOST_DATA_TEST_CASE(test_whole_decks, bdata::make(read_test_file("tests/test_whole_decks.csv")), ti)
7✔
498
{
499
    check_win_sim(ti);
1✔
500
}
1✔
501
BOOST_AUTO_TEST_SUITE_END()
502

503
BOOST_AUTO_TEST_SUITE(test_crashes)
504
BOOST_DATA_TEST_CASE(test_crashes, bdata::make(read_test_file("tests/test_crash.csv")), ti)
259✔
505
{
506
    eps = 1.; // only check for crashes now
37✔
507
    check_win_sim(ti);
37✔
508
}
37✔
509
BOOST_AUTO_TEST_SUITE_END()
510
BOOST_AUTO_TEST_SUITE_END()
511

512
BOOST_AUTO_TEST_SUITE(test_db)
513
BOOST_AUTO_TEST_CASE(test_db_init)
6✔
514
{
515
    iter = 100000;
1✔
516
    debug_print = 0;
1✔
517
    debug_cached = 0;
1✔
518
    debug_line = false;
1✔
519
}
×
520
BOOST_AUTO_TEST_SUITE(test_db_scaling)
521
BOOST_AUTO_TEST_CASE(test_db_scaling)
7✔
522
{
523
    BOOST_TEST_MESSAGE("DB time improvement test");
2✔
524
    auto t1 = time_db_sim("Sir Alaric the Swift-1, Broodmother's Nexus-1, Mystic Gatekeeper-6, Ruthless Pursuer-6, Maculakornos-6, Primal Yeren-6, Megalift Foundry-6, Kinaxa Soulspark-6, Mangler of Existence-6, Mangler of Existence-6, Eranore's Obstructor-6, Eranore's Obstructor-6, ", "Sir Alaric the Swift-1, Broodmother's Nexus-6, Mystic Gatekeeper-6, Ruthless Pursuer-6, Maculakornos-6, Primal Yeren-6, Megalift Foundry-6, Kinaxa Soulspark-6, Mangler of Existence-6, Mangler of Existence-6, Eranore's Obstructor-6, Eranore's Obstructor-6,");
1✔
525
    auto t2 =     time_db("Sir Alaric the Swift-1, Broodmother's Nexus-1, Mystic Gatekeeper-6, Ruthless Pursuer-6, Maculakornos-6, Primal Yeren-6, Megalift Foundry-6, Kinaxa Soulspark-6, Mangler of Existence-6, Mangler of Existence-6, Eranore's Obstructor-6, Eranore's Obstructor-6, ", "Sir Alaric the Swift-1, Broodmother's Nexus-6, Mystic Gatekeeper-6, Ruthless Pursuer-6, Maculakornos-6, Primal Yeren-6, Megalift Foundry-6, Kinaxa Soulspark-6, Mangler of Existence-6, Mangler of Existence-6, Eranore's Obstructor-6, Eranore's Obstructor-6,");
1✔
526
    BOOST_CHECK_MESSAGE(t1 > t2, "DB time improvement failed: " + std::to_string(t1) + " > " + std::to_string(t2));
3✔
527
}
1✔
528
BOOST_AUTO_TEST_SUITE_END()
529
BOOST_AUTO_TEST_SUITE_END()
530

531
BOOST_AUTO_TEST_SUITE(test_ml)
532
BOOST_AUTO_TEST_CASE(test_ml_init)
6✔
533
{
534
    iter = 100000;
1✔
535
    debug_print = 0;
1✔
536
    debug_cached = 0;
1✔
537
    debug_line = false;
1✔
538
}
×
539
BOOST_AUTO_TEST_SUITE(test_ml_scaling)
540
BOOST_AUTO_TEST_CASE(test_ml_scaling)
7✔
541
{
542
    auto t1 = time_ml_sim("Sir Alaric the Swift-1, Broodmother's Nexus-6, Mystic Gatekeeper-6, Ruthless Pursuer-6, Maculakornos-6, Primal Yeren-6, Megalift Foundry-6, Kinaxa Soulspark-6, Mangler of Existence-6, Mangler of Existence-6, Eranore's Obstructor-6, Eranore's Obstructor-6, ", "Sir Alaric the Swift-1, Broodmother's Nexus-6, Mystic Gatekeeper-6, Ruthless Pursuer-6, Maculakornos-6, Primal Yeren-6, Megalift Foundry-6, Kinaxa Soulspark-6, Mangler of Existence-6, Mangler of Existence-6, Eranore's Obstructor-6, Eranore's Obstructor-6,");
1✔
543
    auto t2 = time_ml("Sir Alaric the Swift-1, Broodmother's Nexus-6, Mystic Gatekeeper-6, Ruthless Pursuer-6, Maculakornos-6, Primal Yeren-6, Megalift Foundry-6, Kinaxa Soulspark-6, Mangler of Existence-6, Mangler of Existence-6, Eranore's Obstructor-6, Eranore's Obstructor-6, ", "Sir Alaric the Swift-1, Broodmother's Nexus-6, Mystic Gatekeeper-6, Ruthless Pursuer-6, Maculakornos-6, Primal Yeren-6, Megalift Foundry-6, Kinaxa Soulspark-6, Mangler of Existence-6, Mangler of Existence-6, Eranore's Obstructor-6, Eranore's Obstructor-6,");
1✔
544
    BOOST_CHECK_MESSAGE(t1 > t2, "ML time improvement failed: " + std::to_string(t1) + " > " + std::to_string(t2));
3✔
545
}
1✔
546
BOOST_AUTO_TEST_SUITE_END()
547
BOOST_AUTO_TEST_SUITE_END()
548

549
// Define raw C-style arrays
550
static const char* test_case_1[] = {
551
    "tuo", "Bug86", "Bug86", "sim", "100", "seed", "100", "prefix", "tests/sim/",
552
    "update-reduce-delay-summoned-by-tower", nullptr
553
};
554

555
static const char* test_case_2[] = {
556
    "tuo", "Bug86", "Bug86", "sim", "100", "seed", "100", "prefix", "tests/sim/",
557
    "no-update-reduce-delay-summoned-by-tower", nullptr
558
};
559

560
static const std::array<const char**, 2> argv_dataset = {
561
    test_case_1,
562
    test_case_2
563
};
564
BOOST_AUTO_TEST_SUITE(test_fixes)
565
BOOST_AUTO_TEST_CASE(test_fixes_init)
6✔
566
{
567
    iter = 10000;
1✔
568
    debug_print = 0;
1✔
569
    debug_cached = 0;
1✔
570
    debug_line = false;
1✔
571
    eps = 1.; // only check for crashes now
1✔
572
}
×
573
BOOST_AUTO_TEST_SUITE(test_fixes_run)
574
BOOST_DATA_TEST_CASE(test_fixes_run, bdata::make(test::argv_dataset),argv)
14✔
575
{
576
    // Convert vector to argv-style array
577
    int argc = 0;
2✔
578
    while (argv[argc] != nullptr) ++argc;
22✔
579
    check_win(run_sim(argc, argv));
2✔
580
    //check_win(run_sim(sizeof(argv) / sizeof(*argv), argv));
581
}
2✔
582
BOOST_AUTO_TEST_SUITE_END()
583
BOOST_AUTO_TEST_SUITE_END()
584

585
BOOST_AUTO_TEST_SUITE_END()
586
#endif
587
#endif
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

© 2026 Coveralls, Inc