2021-11-24 12:09:07 +00:00
# include <gtest/gtest.h>
# include <base/detect.h>
# include <engine/server/databases/connection.h>
# include <engine/shared/config.h>
# include <game/server/scoreworker.h>
2021-11-26 10:13:31 +00:00
# include <sqlite3.h>
2021-11-24 12:09:07 +00:00
2021-11-28 00:31:22 +00:00
# if defined(CONF_MYSQL)
2021-11-28 00:41:10 +00:00
// For MySQL this setup is required on localhost:
// CREATE DATABASE ddnet;
// CREATE USER 'ddnet'@'localhost' IDENTIFIED BY 'thebestpassword';
// GRANT ALL PRIVILEGES ON ddnet.* TO 'ddnet'@'localhost';
// FLUSH PRIVILEGES;
2021-11-28 00:29:38 +00:00
int DummyMysqlInit = ( MysqlInit ( ) , 1 ) ;
# endif
2021-11-27 01:00:36 +00:00
2021-11-24 12:09:07 +00:00
char * CSaveTeam : : GetString ( )
{
// Dummy implementation for testing
return nullptr ;
}
int CSaveTeam : : FromString ( char const * )
{
// Dummy implementation for testing
return 1 ;
}
bool CSaveTeam : : MatchPlayers ( const char ( * paNames ) [ MAX_NAME_LENGTH ] , const int * pClientID , int NumPlayer , char * pMessage , int MessageLen )
{
// Dummy implementation for testing
return false ;
}
2021-11-28 00:29:38 +00:00
TEST ( SQLite , Version )
{
ASSERT_GE ( sqlite3_libversion_number ( ) , 3025000 ) < < " SQLite >= 3.25.0 required for Window functions " ;
}
struct Score : public testing : : TestWithParam < IDbConnection * >
2021-11-24 12:09:07 +00:00
{
2021-11-27 01:00:36 +00:00
Score ( )
{
Connect ( ) ;
Init ( ) ;
InsertMap ( ) ;
}
2021-11-24 12:09:07 +00:00
~ Score ( )
{
2021-11-28 00:29:38 +00:00
conn - > Disconnect ( ) ;
2021-11-24 12:09:07 +00:00
}
2021-11-27 01:00:36 +00:00
void Connect ( )
{
ASSERT_FALSE ( conn - > Connect ( aError , sizeof ( aError ) ) ) < < aError ;
2021-11-28 00:29:38 +00:00
// Delete all existing entries for persistent databases like MySQL
int NumInserted = 0 ;
ASSERT_FALSE ( conn - > PrepareStatement ( " DELETE FROM record_race; " , aError , sizeof ( aError ) ) ) < < aError ;
ASSERT_FALSE ( conn - > ExecuteUpdate ( & NumInserted , aError , sizeof ( aError ) ) ) < < aError ;
ASSERT_FALSE ( conn - > PrepareStatement ( " DELETE FROM record_teamrace; " , aError , sizeof ( aError ) ) ) < < aError ;
ASSERT_FALSE ( conn - > ExecuteUpdate ( & NumInserted , aError , sizeof ( aError ) ) ) < < aError ;
ASSERT_FALSE ( conn - > PrepareStatement ( " DELETE FROM record_maps; " , aError , sizeof ( aError ) ) ) < < aError ;
ASSERT_FALSE ( conn - > ExecuteUpdate ( & NumInserted , aError , sizeof ( aError ) ) ) < < aError ;
ASSERT_FALSE ( conn - > PrepareStatement ( " DELETE FROM record_points; " , aError , sizeof ( aError ) ) ) < < aError ;
ASSERT_FALSE ( conn - > ExecuteUpdate ( & NumInserted , aError , sizeof ( aError ) ) ) < < aError ;
ASSERT_FALSE ( conn - > PrepareStatement ( " DELETE FROM record_saves; " , aError , sizeof ( aError ) ) ) < < aError ;
ASSERT_FALSE ( conn - > ExecuteUpdate ( & NumInserted , aError , sizeof ( aError ) ) ) < < aError ;
2021-11-27 01:00:36 +00:00
}
void Init ( )
{
CSqlInitData initData ( std : : make_shared < CScoreInitResult > ( ) ) ;
str_copy ( initData . m_aMap , " Kobra 3 " , sizeof ( initData . m_aMap ) ) ;
ASSERT_FALSE ( CScoreWorker : : Init ( conn , & initData , aError , sizeof ( aError ) ) ) < < aError ;
}
void InsertMap ( )
{
char aBuf [ 512 ] ;
str_format ( aBuf , sizeof ( aBuf ) ,
" %s into %s_maps(Map, Server, Mapper, Points, Stars, Timestamp) "
" VALUES ( \" Kobra 3 \" , \" Novice \" , \" Zerodin \" , 5, 5, \" 2015-01-01 00:00:00 \" ); " ,
conn - > InsertIgnore ( ) , conn - > GetPrefix ( ) ) ;
ASSERT_FALSE ( conn - > PrepareStatement ( aBuf , aError , sizeof ( aError ) ) ) < < aError ;
int NumInserted = 0 ;
ASSERT_FALSE ( conn - > ExecuteUpdate ( & NumInserted , aError , sizeof ( aError ) ) ) < < aError ;
ASSERT_EQ ( NumInserted , 1 ) ;
}
void InsertRank ( )
{
str_copy ( g_Config . m_SvSqlServerName , " USA " , sizeof ( g_Config . m_SvSqlServerName ) ) ;
CSqlScoreData scoreData ( std : : make_shared < CScorePlayerResult > ( ) ) ;
str_copy ( scoreData . m_aMap , " Kobra 3 " , sizeof ( scoreData . m_aMap ) ) ;
str_copy ( scoreData . m_aGameUuid , " 8d300ecf-5873-4297-bee5-95668fdff320 " , sizeof ( scoreData . m_aGameUuid ) ) ;
str_copy ( scoreData . m_aName , " nameless tee " , sizeof ( scoreData . m_aName ) ) ;
scoreData . m_ClientID = 0 ;
scoreData . m_Time = 100.0 ;
str_copy ( scoreData . m_aTimestamp , " 2021-11-24 19:24:08 " , sizeof ( scoreData . m_aTimestamp ) ) ;
for ( int i = 0 ; i < NUM_CHECKPOINTS ; i + + )
scoreData . m_aCpCurrent [ i ] = i ;
str_copy ( scoreData . m_aRequestingPlayer , " deen " , sizeof ( scoreData . m_aRequestingPlayer ) ) ;
ASSERT_FALSE ( CScoreWorker : : SaveScore ( conn , & scoreData , false , aError , sizeof ( aError ) ) ) < < aError ;
}
void ExpectLines ( std : : shared_ptr < CScorePlayerResult > pPlayerResult , std : : initializer_list < const char * > Lines , bool All = false )
{
EXPECT_EQ ( pPlayerResult - > m_MessageKind , All ? CScorePlayerResult : : ALL : CScorePlayerResult : : DIRECT ) ;
int i = 0 ;
for ( const char * pLine : Lines )
{
EXPECT_STREQ ( pPlayerResult - > m_Data . m_aaMessages [ i ] , pLine ) ;
i + + ;
}
for ( ; i < CScorePlayerResult : : MAX_MESSAGES ; i + + )
{
EXPECT_STREQ ( pPlayerResult - > m_Data . m_aaMessages [ i ] , " " ) ;
}
}
2021-11-28 00:29:38 +00:00
IDbConnection * conn { GetParam ( ) } ;
2021-11-24 12:09:07 +00:00
char aError [ 256 ] = { } ;
2021-11-27 01:00:36 +00:00
std : : shared_ptr < CScorePlayerResult > pPlayerResult { std : : make_shared < CScorePlayerResult > ( ) } ;
CSqlPlayerRequest playerRequest { pPlayerResult } ;
2021-11-24 12:09:07 +00:00
} ;
2021-11-27 01:00:36 +00:00
struct SingleScore : public Score
2021-11-24 12:09:07 +00:00
{
2021-11-27 01:00:36 +00:00
SingleScore ( )
{
InsertRank ( ) ;
str_copy ( playerRequest . m_aMap , " Kobra 3 " , sizeof ( playerRequest . m_aMap ) ) ;
str_copy ( playerRequest . m_aRequestingPlayer , " brainless tee " , sizeof ( playerRequest . m_aRequestingPlayer ) ) ;
playerRequest . m_Offset = 0 ;
str_copy ( playerRequest . m_aServer , " GER " , sizeof ( playerRequest . m_aServer ) ) ;
str_copy ( playerRequest . m_aName , " nameless tee " , sizeof ( playerRequest . m_aMap ) ) ;
}
} ;
2021-11-24 12:09:07 +00:00
2021-11-28 00:29:38 +00:00
TEST_P ( SingleScore , Top )
2021-11-27 01:00:36 +00:00
{
ASSERT_FALSE ( CScoreWorker : : ShowTop ( conn , & playerRequest , aError , sizeof ( aError ) ) ) < < aError ;
ExpectLines ( pPlayerResult ,
{ " ------------ Global Top ------------ " ,
" 1. nameless tee Time: 01:40.00 " ,
" ------------ GER Top ------------ " } ) ;
}
2021-11-24 12:09:07 +00:00
2021-11-28 00:29:38 +00:00
TEST_P ( SingleScore , Rank )
2021-11-27 01:00:36 +00:00
{
ASSERT_FALSE ( CScoreWorker : : ShowRank ( conn , & playerRequest , aError , sizeof ( aError ) ) ) < < aError ;
ExpectLines ( pPlayerResult , { " nameless tee - 01:40.00 - better than 100% - requested by brainless tee " , " Global rank 1 - GER unranked " } , true ) ;
}
2021-11-24 12:09:07 +00:00
2021-11-28 00:29:38 +00:00
TEST_P ( SingleScore , TopServer )
2021-11-27 01:00:36 +00:00
{
str_copy ( playerRequest . m_aServer , " USA " , sizeof ( playerRequest . m_aServer ) ) ;
ASSERT_FALSE ( CScoreWorker : : ShowTop ( conn , & playerRequest , aError , sizeof ( aError ) ) ) < < aError ;
ExpectLines ( pPlayerResult ,
{ " ------------ Global Top ------------ " ,
" 1. nameless tee Time: 01:40.00 " ,
" --------------------------------------- " } ) ;
}
2021-11-24 12:09:07 +00:00
2021-11-28 00:29:38 +00:00
TEST_P ( SingleScore , RankServer )
2021-11-27 01:00:36 +00:00
{
str_copy ( playerRequest . m_aServer , " USA " , sizeof ( playerRequest . m_aServer ) ) ;
ASSERT_FALSE ( CScoreWorker : : ShowRank ( conn , & playerRequest , aError , sizeof ( aError ) ) ) < < aError ;
ExpectLines ( pPlayerResult , { " nameless tee - 01:40.00 - better than 100% - requested by brainless tee " , " Global rank 1 - USA rank 1 " } , true ) ;
}
2021-11-28 00:29:38 +00:00
TEST_P ( SingleScore , TimesExists )
2021-11-27 01:00:36 +00:00
{
ASSERT_FALSE ( CScoreWorker : : ShowTimes ( conn , & playerRequest , aError , sizeof ( aError ) ) ) < < aError ;
EXPECT_EQ ( pPlayerResult - > m_MessageKind , CScorePlayerResult : : DIRECT ) ;
EXPECT_STREQ ( pPlayerResult - > m_Data . m_aaMessages [ 0 ] , " ------------- Last Times ------------- " ) ;
2021-11-27 11:48:01 +00:00
char aBuf [ 128 ] ;
str_copy ( aBuf , pPlayerResult - > m_Data . m_aaMessages [ 1 ] , 7 ) ;
EXPECT_STREQ ( aBuf , " [USA] " ) ;
str_copy ( aBuf , pPlayerResult - > m_Data . m_aaMessages [ 1 ] + str_length ( pPlayerResult - > m_Data . m_aaMessages [ 1 ] ) - 10 , 11 ) ;
EXPECT_STREQ ( aBuf , " , 01:40.00 " ) ;
2021-11-27 01:00:36 +00:00
EXPECT_STREQ ( pPlayerResult - > m_Data . m_aaMessages [ 2 ] , " ---------------------------------------------------- " ) ;
for ( int i = 3 ; i < CScorePlayerResult : : MAX_MESSAGES ; i + + )
{
EXPECT_STREQ ( pPlayerResult - > m_Data . m_aaMessages [ i ] , " " ) ;
}
}
2021-11-28 00:29:38 +00:00
TEST_P ( SingleScore , TimesDoesntExist )
2021-11-27 01:00:36 +00:00
{
str_copy ( playerRequest . m_aName , " foo " , sizeof ( playerRequest . m_aMap ) ) ;
ASSERT_FALSE ( CScoreWorker : : ShowTimes ( conn , & playerRequest , aError , sizeof ( aError ) ) ) < < aError ;
ExpectLines ( pPlayerResult , { " There are no times in the specified range " } ) ;
}
struct TeamScore : public Score
{
void SetUp ( )
{
CSqlTeamScoreData teamScoreData ;
str_copy ( teamScoreData . m_aMap , " Kobra 3 " , sizeof ( teamScoreData . m_aMap ) ) ;
str_copy ( teamScoreData . m_aGameUuid , " 8d300ecf-5873-4297-bee5-95668fdff320 " , sizeof ( teamScoreData . m_aGameUuid ) ) ;
teamScoreData . m_Size = 2 ;
str_copy ( teamScoreData . m_aaNames [ 0 ] , " nameless tee " , sizeof ( teamScoreData . m_aaNames [ 0 ] ) ) ;
str_copy ( teamScoreData . m_aaNames [ 1 ] , " brainless tee " , sizeof ( teamScoreData . m_aaNames [ 1 ] ) ) ;
teamScoreData . m_Time = 100.0 ;
2021-11-27 12:03:50 +00:00
str_copy ( teamScoreData . m_aTimestamp , " 2021-11-24 19:24:08 " , sizeof ( teamScoreData . m_aTimestamp ) ) ;
2021-11-27 01:00:36 +00:00
ASSERT_FALSE ( CScoreWorker : : SaveTeamScore ( conn , & teamScoreData , false , aError , sizeof ( aError ) ) ) < < aError ;
2021-11-27 12:03:50 +00:00
str_copy ( playerRequest . m_aMap , " Kobra 3 " , sizeof ( playerRequest . m_aMap ) ) ;
str_copy ( playerRequest . m_aRequestingPlayer , " brainless tee " , sizeof ( playerRequest . m_aRequestingPlayer ) ) ;
playerRequest . m_Offset = 0 ;
2021-11-27 01:00:36 +00:00
}
} ;
2021-11-28 00:29:38 +00:00
TEST_P ( TeamScore , All )
2021-11-27 01:00:36 +00:00
{
ASSERT_FALSE ( CScoreWorker : : ShowTeamTop5 ( conn , & playerRequest , aError , sizeof ( aError ) ) ) < < aError ;
ExpectLines ( pPlayerResult ,
{ " ------- Team Top 5 ------- " ,
" 1. brainless tee & nameless tee Team Time: 01:40.00 " ,
" ------------------------------- " } ) ;
}
2021-11-24 12:09:07 +00:00
2021-11-28 00:29:38 +00:00
TEST_P ( TeamScore , PlayerExists )
2021-11-27 01:00:36 +00:00
{
str_copy ( playerRequest . m_aName , " brainless tee " , sizeof ( playerRequest . m_aMap ) ) ;
ASSERT_FALSE ( CScoreWorker : : ShowPlayerTeamTop5 ( conn , & playerRequest , aError , sizeof ( aError ) ) ) < < aError ;
ExpectLines ( pPlayerResult ,
{ " ------- Team Top 5 ------- " ,
" 1. brainless tee & nameless tee Team Time: 01:40.00 " ,
" ------------------------------- " } ) ;
}
2021-11-24 12:09:07 +00:00
2021-11-28 00:29:38 +00:00
TEST_P ( TeamScore , PlayerDoesntExist )
2021-11-27 01:00:36 +00:00
{
str_copy ( playerRequest . m_aName , " foo " , sizeof ( playerRequest . m_aMap ) ) ;
ASSERT_FALSE ( CScoreWorker : : ShowPlayerTeamTop5 ( conn , & playerRequest , aError , sizeof ( aError ) ) ) < < aError ;
ExpectLines ( pPlayerResult , { " foo has no team ranks " } ) ;
}
2021-11-24 12:09:07 +00:00
2021-11-27 01:00:36 +00:00
struct MapInfo : public Score
{
MapInfo ( )
{
str_copy ( playerRequest . m_aRequestingPlayer , " brainless tee " , sizeof ( playerRequest . m_aRequestingPlayer ) ) ;
}
} ;
2021-11-28 00:29:38 +00:00
TEST_P ( MapInfo , ExactNoFinish )
2021-11-27 01:00:36 +00:00
{
str_copy ( playerRequest . m_aName , " Kobra 3 " , sizeof ( playerRequest . m_aName ) ) ;
ASSERT_FALSE ( CScoreWorker : : MapInfo ( conn , & playerRequest , aError , sizeof ( aError ) ) ) < < aError ;
ExpectLines ( pPlayerResult , { " \" Kobra 3 \" by Zerodin on Novice, ★★★★★, 5 points, released 6 years and 11 months ago, 0 finishes by 0 tees " } ) ;
}
2021-11-28 00:29:38 +00:00
TEST_P ( MapInfo , ExactFinish )
2021-11-27 01:00:36 +00:00
{
InsertRank ( ) ;
str_copy ( playerRequest . m_aName , " Kobra 3 " , sizeof ( playerRequest . m_aName ) ) ;
ASSERT_FALSE ( CScoreWorker : : MapInfo ( conn , & playerRequest , aError , sizeof ( aError ) ) ) < < aError ;
ExpectLines ( pPlayerResult , { " \" Kobra 3 \" by Zerodin on Novice, ★★★★★, 5 points, released 6 years and 11 months ago, 1 finish by 1 tee in 01:40 median " } ) ;
}
2021-11-28 00:29:38 +00:00
TEST_P ( MapInfo , Fuzzy )
2021-11-27 01:00:36 +00:00
{
InsertRank ( ) ;
str_copy ( playerRequest . m_aName , " k3 " , sizeof ( playerRequest . m_aName ) ) ;
ASSERT_FALSE ( CScoreWorker : : MapInfo ( conn , & playerRequest , aError , sizeof ( aError ) ) ) < < aError ;
ExpectLines ( pPlayerResult , { " \" Kobra 3 \" by Zerodin on Novice, ★★★★★, 5 points, released 6 years and 11 months ago, 1 finish by 1 tee in 01:40 median " } ) ;
}
2021-11-28 00:29:38 +00:00
TEST_P ( MapInfo , DoesntExit )
2021-11-27 01:00:36 +00:00
{
str_copy ( playerRequest . m_aName , " f " , sizeof ( playerRequest . m_aName ) ) ;
ASSERT_FALSE ( CScoreWorker : : MapInfo ( conn , & playerRequest , aError , sizeof ( aError ) ) ) < < aError ;
ExpectLines ( pPlayerResult , { " No map like \" f \" found. " } ) ;
}
struct MapVote : public Score
{
MapVote ( )
{
str_copy ( playerRequest . m_aRequestingPlayer , " brainless tee " , sizeof ( playerRequest . m_aRequestingPlayer ) ) ;
}
} ;
2021-11-28 00:29:38 +00:00
TEST_P ( MapVote , Exact )
2021-11-27 01:00:36 +00:00
{
str_copy ( playerRequest . m_aName , " Kobra 3 " , sizeof ( playerRequest . m_aName ) ) ;
ASSERT_FALSE ( CScoreWorker : : MapVote ( conn , & playerRequest , aError , sizeof ( aError ) ) ) < < aError ;
EXPECT_EQ ( pPlayerResult - > m_MessageKind , CScorePlayerResult : : MAP_VOTE ) ;
EXPECT_STREQ ( pPlayerResult - > m_Data . m_MapVote . m_aMap , " Kobra 3 " ) ;
EXPECT_STREQ ( pPlayerResult - > m_Data . m_MapVote . m_aReason , " /map " ) ;
EXPECT_STREQ ( pPlayerResult - > m_Data . m_MapVote . m_aServer , " novice " ) ;
}
2021-11-28 00:29:38 +00:00
TEST_P ( MapVote , Fuzzy )
2021-11-27 01:00:36 +00:00
{
str_copy ( playerRequest . m_aName , " k3 " , sizeof ( playerRequest . m_aName ) ) ;
ASSERT_FALSE ( CScoreWorker : : MapVote ( conn , & playerRequest , aError , sizeof ( aError ) ) ) < < aError ;
EXPECT_EQ ( pPlayerResult - > m_MessageKind , CScorePlayerResult : : MAP_VOTE ) ;
EXPECT_STREQ ( pPlayerResult - > m_Data . m_MapVote . m_aMap , " Kobra 3 " ) ;
EXPECT_STREQ ( pPlayerResult - > m_Data . m_MapVote . m_aReason , " /map " ) ;
EXPECT_STREQ ( pPlayerResult - > m_Data . m_MapVote . m_aServer , " novice " ) ;
}
2021-11-28 00:29:38 +00:00
TEST_P ( MapVote , DoesntExist )
2021-11-27 01:00:36 +00:00
{
str_copy ( playerRequest . m_aName , " f " , sizeof ( playerRequest . m_aName ) ) ;
ASSERT_FALSE ( CScoreWorker : : MapVote ( conn , & playerRequest , aError , sizeof ( aError ) ) ) < < aError ;
ExpectLines ( pPlayerResult , { " No map like \" f \" found. Try adding a '%' at the start if you don't know the first character. Example: /map %castle for \" Out of Castle \" " } ) ;
}
struct Points : public Score
{
Points ( )
{
str_copy ( playerRequest . m_aName , " nameless tee " , sizeof ( playerRequest . m_aName ) ) ;
str_copy ( playerRequest . m_aRequestingPlayer , " brainless tee " , sizeof ( playerRequest . m_aRequestingPlayer ) ) ;
playerRequest . m_Offset = 0 ;
}
} ;
2021-11-28 00:29:38 +00:00
TEST_P ( Points , NoPoints )
2021-11-27 01:00:36 +00:00
{
ASSERT_FALSE ( CScoreWorker : : ShowPoints ( conn , & playerRequest , aError , sizeof ( aError ) ) ) < < aError ;
ExpectLines ( pPlayerResult , { " nameless tee has not collected any points so far " } ) ;
}
2021-11-28 00:29:38 +00:00
TEST_P ( Points , NoPointsTop )
2021-11-27 01:00:36 +00:00
{
ASSERT_FALSE ( CScoreWorker : : ShowTopPoints ( conn , & playerRequest , aError , sizeof ( aError ) ) ) < < aError ;
ExpectLines ( pPlayerResult , { " -------- Top Points -------- " ,
" ------------------------------- " } ) ;
}
2021-11-28 00:29:38 +00:00
TEST_P ( Points , OnePoints )
2021-11-27 01:00:36 +00:00
{
conn - > AddPoints ( " nameless tee " , 2 , aError , sizeof ( aError ) ) ;
ASSERT_FALSE ( CScoreWorker : : ShowPoints ( conn , & playerRequest , aError , sizeof ( aError ) ) ) < < aError ;
ExpectLines ( pPlayerResult , { " 1. nameless tee Points: 2, requested by brainless tee " } , true ) ;
}
2021-11-28 00:29:38 +00:00
TEST_P ( Points , OnePointsTop )
2021-11-27 01:00:36 +00:00
{
conn - > AddPoints ( " nameless tee " , 2 , aError , sizeof ( aError ) ) ;
ASSERT_FALSE ( CScoreWorker : : ShowTopPoints ( conn , & playerRequest , aError , sizeof ( aError ) ) ) < < aError ;
ExpectLines ( pPlayerResult ,
{ " -------- Top Points -------- " ,
" 1. nameless tee Points: 2 " ,
" ------------------------------- " } ) ;
}
2021-11-28 00:29:38 +00:00
TEST_P ( Points , TwoPoints )
2021-11-27 01:00:36 +00:00
{
conn - > AddPoints ( " nameless tee " , 2 , aError , sizeof ( aError ) ) ;
conn - > AddPoints ( " brainless tee " , 3 , aError , sizeof ( aError ) ) ;
ASSERT_FALSE ( CScoreWorker : : ShowPoints ( conn , & playerRequest , aError , sizeof ( aError ) ) ) < < aError ;
ExpectLines ( pPlayerResult , { " 2. nameless tee Points: 2, requested by brainless tee " } , true ) ;
}
2021-11-28 00:29:38 +00:00
TEST_P ( Points , TwoPointsTop )
2021-11-27 01:00:36 +00:00
{
conn - > AddPoints ( " nameless tee " , 2 , aError , sizeof ( aError ) ) ;
conn - > AddPoints ( " brainless tee " , 3 , aError , sizeof ( aError ) ) ;
ASSERT_FALSE ( CScoreWorker : : ShowTopPoints ( conn , & playerRequest , aError , sizeof ( aError ) ) ) < < aError ;
ExpectLines ( pPlayerResult ,
{ " -------- Top Points -------- " ,
" 1. brainless tee Points: 3 " ,
" 2. nameless tee Points: 2 " ,
" ------------------------------- " } ) ;
}
2021-11-28 00:29:38 +00:00
TEST_P ( Points , EqualPoints )
2021-11-27 01:00:36 +00:00
{
conn - > AddPoints ( " nameless tee " , 2 , aError , sizeof ( aError ) ) ;
conn - > AddPoints ( " brainless tee " , 3 , aError , sizeof ( aError ) ) ;
conn - > AddPoints ( " nameless tee " , 1 , aError , sizeof ( aError ) ) ;
ASSERT_FALSE ( CScoreWorker : : ShowPoints ( conn , & playerRequest , aError , sizeof ( aError ) ) ) < < aError ;
ExpectLines ( pPlayerResult , { " 1. nameless tee Points: 3, requested by brainless tee " } , true ) ;
}
2021-11-28 00:29:38 +00:00
TEST_P ( Points , EqualPointsTop )
2021-11-27 01:00:36 +00:00
{
conn - > AddPoints ( " nameless tee " , 2 , aError , sizeof ( aError ) ) ;
conn - > AddPoints ( " brainless tee " , 3 , aError , sizeof ( aError ) ) ;
conn - > AddPoints ( " nameless tee " , 1 , aError , sizeof ( aError ) ) ;
ASSERT_FALSE ( CScoreWorker : : ShowTopPoints ( conn , & playerRequest , aError , sizeof ( aError ) ) ) < < aError ;
ExpectLines ( pPlayerResult ,
{ " -------- Top Points -------- " ,
" 1. brainless tee Points: 3 " ,
2021-11-28 00:29:38 +00:00
" 1. nameless tee Points: 3 " ,
2021-11-27 01:00:36 +00:00
" ------------------------------- " } ) ;
}
struct RandomMap : public Score
{
std : : shared_ptr < CScoreRandomMapResult > pRandomMapResult { std : : make_shared < CScoreRandomMapResult > ( 0 ) } ;
CSqlRandomMapRequest randomMapRequest { pRandomMapResult } ;
RandomMap ( )
{
str_copy ( randomMapRequest . m_aServerType , " Novice " , sizeof ( randomMapRequest . m_aServerType ) ) ;
str_copy ( randomMapRequest . m_aCurrentMap , " Kobra 4 " , sizeof ( randomMapRequest . m_aCurrentMap ) ) ;
str_copy ( randomMapRequest . m_aRequestingPlayer , " nameless tee " , sizeof ( randomMapRequest . m_aRequestingPlayer ) ) ;
}
} ;
2021-11-28 00:29:38 +00:00
TEST_P ( RandomMap , NoStars )
2021-11-27 01:00:36 +00:00
{
randomMapRequest . m_Stars = - 1 ;
ASSERT_FALSE ( CScoreWorker : : RandomMap ( conn , & randomMapRequest , aError , sizeof ( aError ) ) ) < < aError ;
EXPECT_EQ ( pRandomMapResult - > m_ClientID , 0 ) ;
EXPECT_STREQ ( pRandomMapResult - > m_aMap , " Kobra 3 " ) ;
EXPECT_STREQ ( pRandomMapResult - > m_aMessage , " " ) ;
}
2021-11-28 00:29:38 +00:00
TEST_P ( RandomMap , StarsExists )
2021-11-27 01:00:36 +00:00
{
randomMapRequest . m_Stars = 5 ;
ASSERT_FALSE ( CScoreWorker : : RandomMap ( conn , & randomMapRequest , aError , sizeof ( aError ) ) ) < < aError ;
EXPECT_EQ ( pRandomMapResult - > m_ClientID , 0 ) ;
EXPECT_STREQ ( pRandomMapResult - > m_aMap , " Kobra 3 " ) ;
EXPECT_STREQ ( pRandomMapResult - > m_aMessage , " " ) ;
}
2021-11-28 00:29:38 +00:00
TEST_P ( RandomMap , StarsDoesntExist )
2021-11-27 01:00:36 +00:00
{
randomMapRequest . m_Stars = 3 ;
ASSERT_FALSE ( CScoreWorker : : RandomMap ( conn , & randomMapRequest , aError , sizeof ( aError ) ) ) < < aError ;
EXPECT_EQ ( pRandomMapResult - > m_ClientID , 0 ) ;
EXPECT_STREQ ( pRandomMapResult - > m_aMap , " " ) ;
EXPECT_STREQ ( pRandomMapResult - > m_aMessage , " No maps found on this server! " ) ;
}
2021-11-28 00:29:38 +00:00
TEST_P ( RandomMap , UnfinishedExists )
2021-11-27 01:00:36 +00:00
{
randomMapRequest . m_Stars = - 1 ;
ASSERT_FALSE ( CScoreWorker : : RandomUnfinishedMap ( conn , & randomMapRequest , aError , sizeof ( aError ) ) ) < < aError ;
EXPECT_EQ ( pRandomMapResult - > m_ClientID , 0 ) ;
EXPECT_STREQ ( pRandomMapResult - > m_aMap , " Kobra 3 " ) ;
EXPECT_STREQ ( pRandomMapResult - > m_aMessage , " " ) ;
}
2021-11-28 00:29:38 +00:00
TEST_P ( RandomMap , UnfinishedDoesntExist )
2021-11-27 01:00:36 +00:00
{
InsertRank ( ) ;
ASSERT_FALSE ( CScoreWorker : : RandomUnfinishedMap ( conn , & randomMapRequest , aError , sizeof ( aError ) ) ) < < aError ;
EXPECT_EQ ( pRandomMapResult - > m_ClientID , 0 ) ;
EXPECT_STREQ ( pRandomMapResult - > m_aMap , " " ) ;
EXPECT_STREQ ( pRandomMapResult - > m_aMessage , " You have no more unfinished maps on this server! " ) ;
2021-11-24 12:09:07 +00:00
}
2021-11-28 00:29:38 +00:00
auto testValues
{
testing : : Values ( CreateSqliteConnection ( " :memory: " , true )
2021-11-28 00:31:22 +00:00
# if defined(CONF_MYSQL)
2021-11-28 00:29:38 +00:00
,
CreateMysqlConnection ( " ddnet " , " record " , " ddnet " , " thebestpassword " , " localhost " , 3306 , true )
# endif
)
} ;
# define INSTANTIATE(SUITE) \
INSTANTIATE_TEST_SUITE_P ( Sql , SUITE , testValues , \
[ ] ( const testing : : TestParamInfo < Score : : ParamType > & info ) { \
switch ( info . index ) \
{ \
case 0 : return " SQLite " ; \
case 1 : return " MySQL " ; \
default : return " Unknown " ; \
} \
} )
INSTANTIATE ( SingleScore ) ;
INSTANTIATE ( TeamScore ) ;
INSTANTIATE ( MapInfo ) ;
INSTANTIATE ( MapVote ) ;
INSTANTIATE ( Points ) ;
INSTANTIATE ( RandomMap ) ;