2021-12-25 01:21:14 +00:00
# include <gmock/gmock.h>
2021-11-24 12:09:07 +00:00
# include <gtest/gtest.h>
# include <base/detect.h>
# include <engine/server/databases/connection.h>
2023-02-23 09:48:11 +00:00
# include <engine/server/databases/connection_pool.h>
2021-11-24 12:09:07 +00:00
# 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:49:08 +00:00
# if defined(CONF_TEST_MYSQL)
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 ( ) ;
2022-12-31 11:23:21 +00:00
LoadBestTime ( ) ;
2021-11-27 01:00:36 +00:00
InsertMap ( ) ;
}
2021-11-24 12:09:07 +00:00
~ Score ( )
{
2021-12-20 13:04:41 +00:00
m_pConn - > Disconnect ( ) ;
2021-11-24 12:09:07 +00:00
}
2021-11-27 01:00:36 +00:00
void Connect ( )
{
2021-12-20 13:04:41 +00:00
ASSERT_FALSE ( m_pConn - > Connect ( m_aError , sizeof ( m_aError ) ) ) < < m_aError ;
2021-11-28 00:29:38 +00:00
// Delete all existing entries for persistent databases like MySQL
int NumInserted = 0 ;
2021-12-20 13:04:41 +00:00
ASSERT_FALSE ( m_pConn - > PrepareStatement ( " DELETE FROM record_race " , m_aError , sizeof ( m_aError ) ) ) < < m_aError ;
ASSERT_FALSE ( m_pConn - > ExecuteUpdate ( & NumInserted , m_aError , sizeof ( m_aError ) ) ) < < m_aError ;
ASSERT_FALSE ( m_pConn - > PrepareStatement ( " DELETE FROM record_teamrace " , m_aError , sizeof ( m_aError ) ) ) < < m_aError ;
ASSERT_FALSE ( m_pConn - > ExecuteUpdate ( & NumInserted , m_aError , sizeof ( m_aError ) ) ) < < m_aError ;
ASSERT_FALSE ( m_pConn - > PrepareStatement ( " DELETE FROM record_maps " , m_aError , sizeof ( m_aError ) ) ) < < m_aError ;
ASSERT_FALSE ( m_pConn - > ExecuteUpdate ( & NumInserted , m_aError , sizeof ( m_aError ) ) ) < < m_aError ;
ASSERT_FALSE ( m_pConn - > PrepareStatement ( " DELETE FROM record_points " , m_aError , sizeof ( m_aError ) ) ) < < m_aError ;
ASSERT_FALSE ( m_pConn - > ExecuteUpdate ( & NumInserted , m_aError , sizeof ( m_aError ) ) ) < < m_aError ;
ASSERT_FALSE ( m_pConn - > PrepareStatement ( " DELETE FROM record_saves " , m_aError , sizeof ( m_aError ) ) ) < < m_aError ;
ASSERT_FALSE ( m_pConn - > ExecuteUpdate ( & NumInserted , m_aError , sizeof ( m_aError ) ) ) < < m_aError ;
2021-11-27 01:00:36 +00:00
}
2022-12-31 11:23:21 +00:00
void LoadBestTime ( )
2021-11-27 01:00:36 +00:00
{
2022-12-31 11:23:21 +00:00
CSqlLoadBestTimeData loadBestTimeData ( std : : make_shared < CScoreLoadBestTimeResult > ( ) ) ;
str_copy ( loadBestTimeData . m_aMap , " Kobra 3 " , sizeof ( loadBestTimeData . m_aMap ) ) ;
ASSERT_FALSE ( CScoreWorker : : LoadBestTime ( m_pConn , & loadBestTimeData , m_aError , sizeof ( m_aError ) ) ) < < m_aError ;
2021-11-27 01:00:36 +00:00
}
void InsertMap ( )
{
2021-12-25 00:32:58 +00:00
char aTimestamp [ 32 ] ;
str_timestamp_format ( aTimestamp , sizeof ( aTimestamp ) , FORMAT_SPACE ) ;
2021-11-27 01:00:36 +00:00
char aBuf [ 512 ] ;
str_format ( aBuf , sizeof ( aBuf ) ,
" %s into %s_maps(Map, Server, Mapper, Points, Stars, Timestamp) "
2022-01-24 23:58:14 +00:00
" VALUES ( \" Kobra 3 \" , \" Novice \" , \" Zerodin \" , 5, 5, %s) " ,
m_pConn - > InsertIgnore ( ) , m_pConn - > GetPrefix ( ) , m_pConn - > InsertTimestampAsUtc ( ) ) ;
2021-12-20 13:04:41 +00:00
ASSERT_FALSE ( m_pConn - > PrepareStatement ( aBuf , m_aError , sizeof ( m_aError ) ) ) < < m_aError ;
2022-01-24 23:58:14 +00:00
m_pConn - > BindString ( 1 , aTimestamp ) ;
2021-11-27 01:00:36 +00:00
int NumInserted = 0 ;
2021-12-20 13:04:41 +00:00
ASSERT_FALSE ( m_pConn - > ExecuteUpdate ( & NumInserted , m_aError , sizeof ( m_aError ) ) ) < < m_aError ;
2021-11-27 01:00:36 +00:00
ASSERT_EQ ( NumInserted , 1 ) ;
}
2022-06-08 13:04:24 +00:00
void InsertRank ( float Time = 100.0 , bool WithTimeCheckPoints = false )
2021-11-27 01:00:36 +00:00
{
str_copy ( g_Config . m_SvSqlServerName , " USA " , sizeof ( g_Config . m_SvSqlServerName ) ) ;
2021-12-20 13:04:41 +00:00
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 ;
2022-06-08 13:04:24 +00:00
ScoreData . m_Time = Time ;
2021-12-20 13:04:41 +00:00
str_copy ( ScoreData . m_aTimestamp , " 2021-11-24 19:24:08 " , sizeof ( ScoreData . m_aTimestamp ) ) ;
2021-11-27 01:00:36 +00:00
for ( int i = 0 ; i < NUM_CHECKPOINTS ; i + + )
2022-07-05 14:13:48 +00:00
ScoreData . m_aCurrentTimeCp [ i ] = WithTimeCheckPoints ? i : 0 ;
2021-12-20 13:04:41 +00:00
str_copy ( ScoreData . m_aRequestingPlayer , " deen " , sizeof ( ScoreData . m_aRequestingPlayer ) ) ;
2022-10-13 11:52:19 +00:00
ASSERT_FALSE ( CScoreWorker : : SaveScore ( m_pConn , & ScoreData , Write : : NORMAL , m_aError , sizeof ( m_aError ) ) ) < < m_aError ;
2021-11-27 01:00:36 +00:00
}
2022-07-10 19:12:16 +00:00
void ExpectLines ( const std : : shared_ptr < CScorePlayerResult > & pPlayerResult , std : : initializer_list < const char * > Lines , bool All = false )
2021-11-27 01:00:36 +00:00
{
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-12-20 13:04:41 +00:00
IDbConnection * m_pConn { GetParam ( ) } ;
char m_aError [ 256 ] = { } ;
2022-03-24 00:16:05 +00:00
std : : shared_ptr < CScorePlayerResult > m_pPlayerResult { std : : make_shared < CScorePlayerResult > ( ) } ;
CSqlPlayerRequest m_PlayerRequest { m_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 ( ) ;
2021-12-20 13:04:41 +00:00
str_copy ( m_PlayerRequest . m_aMap , " Kobra 3 " , sizeof ( m_PlayerRequest . m_aMap ) ) ;
str_copy ( m_PlayerRequest . m_aRequestingPlayer , " brainless tee " , sizeof ( m_PlayerRequest . m_aRequestingPlayer ) ) ;
m_PlayerRequest . m_Offset = 0 ;
str_copy ( m_PlayerRequest . m_aServer , " GER " , sizeof ( m_PlayerRequest . m_aServer ) ) ;
str_copy ( m_PlayerRequest . m_aName , " nameless tee " , sizeof ( m_PlayerRequest . m_aMap ) ) ;
2021-11-27 01:00:36 +00:00
}
} ;
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
{
2021-12-20 13:04:41 +00:00
ASSERT_FALSE ( CScoreWorker : : ShowTop ( m_pConn , & m_PlayerRequest , m_aError , sizeof ( m_aError ) ) ) < < m_aError ;
2022-03-24 00:16:05 +00:00
ExpectLines ( m_pPlayerResult ,
2021-11-27 01:00:36 +00:00
{ " ------------ 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
{
2021-12-20 13:04:41 +00:00
ASSERT_FALSE ( CScoreWorker : : ShowRank ( m_pConn , & m_PlayerRequest , m_aError , sizeof ( m_aError ) ) ) < < m_aError ;
2022-03-24 00:16:05 +00:00
ExpectLines ( m_pPlayerResult , { " nameless tee - 01:40.00 - better than 100% - requested by brainless tee " , " Global rank 1 - GER unranked " } , true ) ;
2021-11-27 01:00:36 +00:00
}
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
{
2021-12-20 13:04:41 +00:00
str_copy ( m_PlayerRequest . m_aServer , " USA " , sizeof ( m_PlayerRequest . m_aServer ) ) ;
ASSERT_FALSE ( CScoreWorker : : ShowTop ( m_pConn , & m_PlayerRequest , m_aError , sizeof ( m_aError ) ) ) < < m_aError ;
2022-03-24 00:16:05 +00:00
ExpectLines ( m_pPlayerResult ,
2021-11-27 01:00:36 +00:00
{ " ------------ Global Top ------------ " ,
" 1. nameless tee Time: 01:40.00 " ,
2022-03-28 23:27:14 +00:00
" ------------ USA Top ------------ " ,
" 1. nameless tee Time: 01:40.00 " } ) ;
2021-11-27 01:00:36 +00: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
{
2021-12-20 13:04:41 +00:00
str_copy ( m_PlayerRequest . m_aServer , " USA " , sizeof ( m_PlayerRequest . m_aServer ) ) ;
ASSERT_FALSE ( CScoreWorker : : ShowRank ( m_pConn , & m_PlayerRequest , m_aError , sizeof ( m_aError ) ) ) < < m_aError ;
2022-03-24 00:16:05 +00:00
ExpectLines ( m_pPlayerResult , { " nameless tee - 01:40.00 - better than 100% - requested by brainless tee " , " Global rank 1 - USA rank 1 " } , true ) ;
2021-11-27 01:00:36 +00:00
}
2022-06-08 13:04:24 +00:00
TEST_P ( SingleScore , LoadPlayerData )
{
InsertRank ( 120.0 , true ) ;
2022-06-08 15:08:12 +00:00
str_copy ( m_PlayerRequest . m_aName , " " , sizeof ( m_PlayerRequest . m_aRequestingPlayer ) ) ;
2022-06-08 13:04:24 +00:00
ASSERT_FALSE ( CScoreWorker : : LoadPlayerData ( m_pConn , & m_PlayerRequest , m_aError , sizeof ( m_aError ) ) ) < < m_aError ;
EXPECT_EQ ( m_pPlayerResult - > m_MessageKind , CScorePlayerResult : : PLAYER_INFO ) ;
2023-05-14 09:35:50 +00:00
ASSERT_EQ ( m_pPlayerResult - > m_Data . m_Info . m_Time , - 1.0 ) ;
2022-07-10 19:09:58 +00:00
for ( auto & Time : m_pPlayerResult - > m_Data . m_Info . m_aTimeCp )
2022-06-08 13:04:24 +00:00
{
2022-07-10 19:09:58 +00:00
ASSERT_EQ ( Time , 0 ) ;
2022-06-08 13:04:24 +00:00
}
str_copy ( m_PlayerRequest . m_aRequestingPlayer , " nameless tee " , sizeof ( m_PlayerRequest . m_aRequestingPlayer ) ) ;
2022-06-08 15:08:12 +00:00
str_copy ( m_PlayerRequest . m_aName , " " , sizeof ( m_PlayerRequest . m_aRequestingPlayer ) ) ;
2022-06-08 13:04:24 +00:00
ASSERT_FALSE ( CScoreWorker : : LoadPlayerData ( m_pConn , & m_PlayerRequest , m_aError , sizeof ( m_aError ) ) ) < < m_aError ;
EXPECT_EQ ( m_pPlayerResult - > m_MessageKind , CScorePlayerResult : : PLAYER_INFO ) ;
ASSERT_EQ ( m_pPlayerResult - > m_Data . m_Info . m_Time , 100.0 ) ;
for ( int i = 0 ; i < NUM_CHECKPOINTS ; i + + )
{
2022-07-05 14:13:48 +00:00
ASSERT_EQ ( m_pPlayerResult - > m_Data . m_Info . m_aTimeCp [ i ] , i ) ;
2022-06-08 13:04:24 +00:00
}
2022-06-11 22:43:26 +00:00
str_copy ( m_PlayerRequest . m_aRequestingPlayer , " finishless " , sizeof ( m_PlayerRequest . m_aRequestingPlayer ) ) ;
str_copy ( m_PlayerRequest . m_aName , " nameless tee " , sizeof ( m_PlayerRequest . m_aRequestingPlayer ) ) ;
ASSERT_FALSE ( CScoreWorker : : LoadPlayerData ( m_pConn , & m_PlayerRequest , m_aError , sizeof ( m_aError ) ) ) < < m_aError ;
EXPECT_EQ ( m_pPlayerResult - > m_MessageKind , CScorePlayerResult : : PLAYER_INFO ) ;
2023-05-14 09:35:50 +00:00
ASSERT_EQ ( m_pPlayerResult - > m_Data . m_Info . m_Time , - 1.0 ) ;
2022-06-11 22:43:26 +00:00
for ( int i = 0 ; i < NUM_CHECKPOINTS ; i + + )
{
2022-07-05 14:13:48 +00:00
ASSERT_EQ ( m_pPlayerResult - > m_Data . m_Info . m_aTimeCp [ i ] , i ) ;
2022-06-11 22:43:26 +00:00
}
2022-06-08 13:04:24 +00:00
}
2021-11-28 00:29:38 +00:00
TEST_P ( SingleScore , TimesExists )
2021-11-27 01:00:36 +00:00
{
2021-12-20 13:04:41 +00:00
ASSERT_FALSE ( CScoreWorker : : ShowTimes ( m_pConn , & m_PlayerRequest , m_aError , sizeof ( m_aError ) ) ) < < m_aError ;
2022-03-24 00:16:05 +00:00
EXPECT_EQ ( m_pPlayerResult - > m_MessageKind , CScorePlayerResult : : DIRECT ) ;
EXPECT_STREQ ( m_pPlayerResult - > m_Data . m_aaMessages [ 0 ] , " ------------- Last Times ------------- " ) ;
2021-11-27 11:48:01 +00:00
char aBuf [ 128 ] ;
2022-03-24 00:16:05 +00:00
str_copy ( aBuf , m_pPlayerResult - > m_Data . m_aaMessages [ 1 ] , 7 ) ;
2021-11-27 11:48:01 +00:00
EXPECT_STREQ ( aBuf , " [USA] " ) ;
2022-03-24 00:16:05 +00:00
str_copy ( aBuf , m_pPlayerResult - > m_Data . m_aaMessages [ 1 ] + str_length ( m_pPlayerResult - > m_Data . m_aaMessages [ 1 ] ) - 10 , 11 ) ;
2021-11-27 11:48:01 +00:00
EXPECT_STREQ ( aBuf , " , 01:40.00 " ) ;
2022-03-24 00:16:05 +00:00
EXPECT_STREQ ( m_pPlayerResult - > m_Data . m_aaMessages [ 2 ] , " ---------------------------------------------------- " ) ;
2021-11-27 01:00:36 +00:00
for ( int i = 3 ; i < CScorePlayerResult : : MAX_MESSAGES ; i + + )
{
2022-03-24 00:16:05 +00:00
EXPECT_STREQ ( m_pPlayerResult - > m_Data . m_aaMessages [ i ] , " " ) ;
2021-11-27 01:00:36 +00:00
}
}
2021-11-28 00:29:38 +00:00
TEST_P ( SingleScore , TimesDoesntExist )
2021-11-27 01:00:36 +00:00
{
2021-12-20 13:04:41 +00:00
str_copy ( m_PlayerRequest . m_aName , " foo " , sizeof ( m_PlayerRequest . m_aMap ) ) ;
ASSERT_FALSE ( CScoreWorker : : ShowTimes ( m_pConn , & m_PlayerRequest , m_aError , sizeof ( m_aError ) ) ) < < m_aError ;
2022-03-24 00:16:05 +00:00
ExpectLines ( m_pPlayerResult , { " There are no times in the specified range " } ) ;
2021-11-27 01:00:36 +00:00
}
struct TeamScore : public Score
{
2022-05-17 21:51:51 +00:00
void SetUp ( ) override
2021-11-27 01:00:36 +00:00
{
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 ) ) ;
2022-10-13 11:52:19 +00:00
ASSERT_FALSE ( CScoreWorker : : SaveTeamScore ( m_pConn , & teamScoreData , Write : : NORMAL , m_aError , sizeof ( m_aError ) ) ) < < m_aError ;
2021-11-27 12:03:50 +00:00
2021-12-20 13:04:41 +00:00
str_copy ( m_PlayerRequest . m_aMap , " Kobra 3 " , sizeof ( m_PlayerRequest . m_aMap ) ) ;
str_copy ( m_PlayerRequest . m_aRequestingPlayer , " brainless tee " , sizeof ( m_PlayerRequest . m_aRequestingPlayer ) ) ;
m_PlayerRequest . m_Offset = 0 ;
2021-11-27 01:00:36 +00:00
}
2023-05-15 07:07:29 +00:00
void InsertTeamRank ( float Time = 100.0 )
{
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 = Time ;
str_copy ( teamScoreData . m_aTimestamp , " 2021-11-24 19:24:08 " , sizeof ( teamScoreData . m_aTimestamp ) ) ;
ASSERT_FALSE ( CScoreWorker : : SaveTeamScore ( m_pConn , & teamScoreData , Write : : NORMAL , m_aError , sizeof ( m_aError ) ) ) < < m_aError ;
str_copy ( m_PlayerRequest . m_aMap , " Kobra 3 " , sizeof ( m_PlayerRequest . m_aMap ) ) ;
str_copy ( m_PlayerRequest . m_aRequestingPlayer , " brainless tee " , sizeof ( m_PlayerRequest . m_aRequestingPlayer ) ) ;
m_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
{
2021-12-20 13:04:41 +00:00
ASSERT_FALSE ( CScoreWorker : : ShowTeamTop5 ( m_pConn , & m_PlayerRequest , m_aError , sizeof ( m_aError ) ) ) < < m_aError ;
2022-03-24 00:16:05 +00:00
ExpectLines ( m_pPlayerResult ,
2021-11-27 01:00:36 +00:00
{ " ------- 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
{
2023-05-15 07:07:29 +00:00
str_copy ( m_PlayerRequest . m_aName , " brainless tee " , sizeof ( m_PlayerRequest . m_aName ) ) ;
2021-12-20 13:04:41 +00:00
ASSERT_FALSE ( CScoreWorker : : ShowPlayerTeamTop5 ( m_pConn , & m_PlayerRequest , m_aError , sizeof ( m_aError ) ) ) < < m_aError ;
2022-03-24 00:16:05 +00:00
ExpectLines ( m_pPlayerResult ,
2021-11-27 01:00:36 +00:00
{ " ------- 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
{
2023-05-15 07:07:29 +00:00
str_copy ( m_PlayerRequest . m_aName , " foo " , sizeof ( m_PlayerRequest . m_aName ) ) ;
2021-12-20 13:04:41 +00:00
ASSERT_FALSE ( CScoreWorker : : ShowPlayerTeamTop5 ( m_pConn , & m_PlayerRequest , m_aError , sizeof ( m_aError ) ) ) < < m_aError ;
2022-03-24 00:16:05 +00:00
ExpectLines ( m_pPlayerResult , { " foo has no team ranks " } ) ;
2021-11-27 01:00:36 +00:00
}
2021-11-24 12:09:07 +00:00
2023-05-15 07:07:29 +00:00
TEST_P ( TeamScore , RankUpdates )
{
InsertTeamRank ( 98.0 ) ;
str_copy ( m_PlayerRequest . m_aName , " brainless tee " , sizeof ( m_PlayerRequest . m_aName ) ) ;
ASSERT_FALSE ( CScoreWorker : : ShowPlayerTeamTop5 ( m_pConn , & m_PlayerRequest , m_aError , sizeof ( m_aError ) ) ) < < m_aError ;
ExpectLines ( m_pPlayerResult ,
{ " ------- Team Top 5 ------- " ,
" 1. brainless tee & nameless tee Team Time: 01:38.00 " ,
" ------------------------------- " } ) ;
}
2021-11-27 01:00:36 +00:00
struct MapInfo : public Score
{
MapInfo ( )
{
2021-12-20 13:04:41 +00:00
str_copy ( m_PlayerRequest . m_aRequestingPlayer , " brainless tee " , sizeof ( m_PlayerRequest . m_aRequestingPlayer ) ) ;
2021-11-27 01:00:36 +00:00
}
} ;
2021-11-28 00:29:38 +00:00
TEST_P ( MapInfo , ExactNoFinish )
2021-11-27 01:00:36 +00:00
{
2021-12-20 13:04:41 +00:00
str_copy ( m_PlayerRequest . m_aName , " Kobra 3 " , sizeof ( m_PlayerRequest . m_aName ) ) ;
ASSERT_FALSE ( CScoreWorker : : MapInfo ( m_pConn , & m_PlayerRequest , m_aError , sizeof ( m_aError ) ) ) < < m_aError ;
2021-12-25 01:21:14 +00:00
2022-03-24 00:16:05 +00:00
EXPECT_EQ ( m_pPlayerResult - > m_MessageKind , CScorePlayerResult : : DIRECT ) ;
EXPECT_THAT ( m_pPlayerResult - > m_Data . m_aaMessages [ 0 ] , testing : : MatchesRegex ( " \" Kobra 3 \" by Zerodin on Novice, ★★★★★, 5 points, released .* ago, 0 finishes by 0 tees " ) ) ;
2021-12-25 01:21:14 +00:00
for ( int i = 1 ; i < CScorePlayerResult : : MAX_MESSAGES ; i + + )
{
2022-03-24 00:16:05 +00:00
EXPECT_STREQ ( m_pPlayerResult - > m_Data . m_aaMessages [ i ] , " " ) ;
2021-12-25 01:21:14 +00:00
}
2021-11-27 01:00:36 +00:00
}
2021-11-28 00:29:38 +00:00
TEST_P ( MapInfo , ExactFinish )
2021-11-27 01:00:36 +00:00
{
InsertRank ( ) ;
2021-12-20 13:04:41 +00:00
str_copy ( m_PlayerRequest . m_aName , " Kobra 3 " , sizeof ( m_PlayerRequest . m_aName ) ) ;
ASSERT_FALSE ( CScoreWorker : : MapInfo ( m_pConn , & m_PlayerRequest , m_aError , sizeof ( m_aError ) ) ) < < m_aError ;
2021-12-25 01:21:14 +00:00
2022-03-24 00:16:05 +00:00
EXPECT_EQ ( m_pPlayerResult - > m_MessageKind , CScorePlayerResult : : DIRECT ) ;
EXPECT_THAT ( m_pPlayerResult - > m_Data . m_aaMessages [ 0 ] , testing : : MatchesRegex ( " \" Kobra 3 \" by Zerodin on Novice, ★★★★★, 5 points, released .* ago, 1 finish by 1 tee in 01:40 median " ) ) ;
2021-12-25 01:21:14 +00:00
for ( int i = 1 ; i < CScorePlayerResult : : MAX_MESSAGES ; i + + )
{
2022-03-24 00:16:05 +00:00
EXPECT_STREQ ( m_pPlayerResult - > m_Data . m_aaMessages [ i ] , " " ) ;
2021-12-25 01:21:14 +00:00
}
2021-11-27 01:00:36 +00:00
}
2021-11-28 00:29:38 +00:00
TEST_P ( MapInfo , Fuzzy )
2021-11-27 01:00:36 +00:00
{
InsertRank ( ) ;
2021-12-20 13:04:41 +00:00
str_copy ( m_PlayerRequest . m_aName , " k3 " , sizeof ( m_PlayerRequest . m_aName ) ) ;
ASSERT_FALSE ( CScoreWorker : : MapInfo ( m_pConn , & m_PlayerRequest , m_aError , sizeof ( m_aError ) ) ) < < m_aError ;
2021-12-25 01:21:14 +00:00
2022-03-24 00:16:05 +00:00
EXPECT_EQ ( m_pPlayerResult - > m_MessageKind , CScorePlayerResult : : DIRECT ) ;
EXPECT_THAT ( m_pPlayerResult - > m_Data . m_aaMessages [ 0 ] , testing : : MatchesRegex ( " \" Kobra 3 \" by Zerodin on Novice, ★★★★★, 5 points, released .* ago, 1 finish by 1 tee in 01:40 median " ) ) ;
2021-12-25 01:21:14 +00:00
for ( int i = 1 ; i < CScorePlayerResult : : MAX_MESSAGES ; i + + )
{
2022-03-24 00:16:05 +00:00
EXPECT_STREQ ( m_pPlayerResult - > m_Data . m_aaMessages [ i ] , " " ) ;
2021-12-25 01:21:14 +00:00
}
2021-11-27 01:00:36 +00:00
}
2021-11-28 00:29:38 +00:00
TEST_P ( MapInfo , DoesntExit )
2021-11-27 01:00:36 +00:00
{
2021-12-20 13:04:41 +00:00
str_copy ( m_PlayerRequest . m_aName , " f " , sizeof ( m_PlayerRequest . m_aName ) ) ;
ASSERT_FALSE ( CScoreWorker : : MapInfo ( m_pConn , & m_PlayerRequest , m_aError , sizeof ( m_aError ) ) ) < < m_aError ;
2022-03-24 00:16:05 +00:00
ExpectLines ( m_pPlayerResult , { " No map like \" f \" found. " } ) ;
2021-11-27 01:00:36 +00:00
}
struct MapVote : public Score
{
MapVote ( )
{
2021-12-20 13:04:41 +00:00
str_copy ( m_PlayerRequest . m_aRequestingPlayer , " brainless tee " , sizeof ( m_PlayerRequest . m_aRequestingPlayer ) ) ;
2021-11-27 01:00:36 +00:00
}
} ;
2021-11-28 00:29:38 +00:00
TEST_P ( MapVote , Exact )
2021-11-27 01:00:36 +00:00
{
2021-12-20 13:04:41 +00:00
str_copy ( m_PlayerRequest . m_aName , " Kobra 3 " , sizeof ( m_PlayerRequest . m_aName ) ) ;
ASSERT_FALSE ( CScoreWorker : : MapVote ( m_pConn , & m_PlayerRequest , m_aError , sizeof ( m_aError ) ) ) < < m_aError ;
2022-03-24 00:16:05 +00:00
EXPECT_EQ ( m_pPlayerResult - > m_MessageKind , CScorePlayerResult : : MAP_VOTE ) ;
EXPECT_STREQ ( m_pPlayerResult - > m_Data . m_MapVote . m_aMap , " Kobra 3 " ) ;
EXPECT_STREQ ( m_pPlayerResult - > m_Data . m_MapVote . m_aReason , " /map " ) ;
EXPECT_STREQ ( m_pPlayerResult - > m_Data . m_MapVote . m_aServer , " novice " ) ;
2021-11-27 01:00:36 +00:00
}
2021-11-28 00:29:38 +00:00
TEST_P ( MapVote , Fuzzy )
2021-11-27 01:00:36 +00:00
{
2021-12-20 13:04:41 +00:00
str_copy ( m_PlayerRequest . m_aName , " k3 " , sizeof ( m_PlayerRequest . m_aName ) ) ;
ASSERT_FALSE ( CScoreWorker : : MapVote ( m_pConn , & m_PlayerRequest , m_aError , sizeof ( m_aError ) ) ) < < m_aError ;
2022-03-24 00:16:05 +00:00
EXPECT_EQ ( m_pPlayerResult - > m_MessageKind , CScorePlayerResult : : MAP_VOTE ) ;
EXPECT_STREQ ( m_pPlayerResult - > m_Data . m_MapVote . m_aMap , " Kobra 3 " ) ;
EXPECT_STREQ ( m_pPlayerResult - > m_Data . m_MapVote . m_aReason , " /map " ) ;
EXPECT_STREQ ( m_pPlayerResult - > m_Data . m_MapVote . m_aServer , " novice " ) ;
2021-11-27 01:00:36 +00:00
}
2021-11-28 00:29:38 +00:00
TEST_P ( MapVote , DoesntExist )
2021-11-27 01:00:36 +00:00
{
2021-12-20 13:04:41 +00:00
str_copy ( m_PlayerRequest . m_aName , " f " , sizeof ( m_PlayerRequest . m_aName ) ) ;
ASSERT_FALSE ( CScoreWorker : : MapVote ( m_pConn , & m_PlayerRequest , m_aError , sizeof ( m_aError ) ) ) < < m_aError ;
2022-03-24 00:16:05 +00:00
ExpectLines ( m_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 \" " } ) ;
2021-11-27 01:00:36 +00:00
}
struct Points : public Score
{
Points ( )
{
2021-12-20 13:04:41 +00:00
str_copy ( m_PlayerRequest . m_aName , " nameless tee " , sizeof ( m_PlayerRequest . m_aName ) ) ;
str_copy ( m_PlayerRequest . m_aRequestingPlayer , " brainless tee " , sizeof ( m_PlayerRequest . m_aRequestingPlayer ) ) ;
m_PlayerRequest . m_Offset = 0 ;
2021-11-27 01:00:36 +00:00
}
} ;
2021-11-28 00:29:38 +00:00
TEST_P ( Points , NoPoints )
2021-11-27 01:00:36 +00:00
{
2021-12-20 13:04:41 +00:00
ASSERT_FALSE ( CScoreWorker : : ShowPoints ( m_pConn , & m_PlayerRequest , m_aError , sizeof ( m_aError ) ) ) < < m_aError ;
2022-03-24 00:16:05 +00:00
ExpectLines ( m_pPlayerResult , { " nameless tee has not collected any points so far " } ) ;
2021-11-27 01:00:36 +00:00
}
2021-11-28 00:29:38 +00:00
TEST_P ( Points , NoPointsTop )
2021-11-27 01:00:36 +00:00
{
2021-12-20 13:04:41 +00:00
ASSERT_FALSE ( CScoreWorker : : ShowTopPoints ( m_pConn , & m_PlayerRequest , m_aError , sizeof ( m_aError ) ) ) < < m_aError ;
2022-03-24 00:16:05 +00:00
ExpectLines ( m_pPlayerResult , { " -------- Top Points -------- " ,
2022-03-24 00:24:23 +00:00
" ------------------------------- " } ) ;
2021-11-27 01:00:36 +00:00
}
2021-11-28 00:29:38 +00:00
TEST_P ( Points , OnePoints )
2021-11-27 01:00:36 +00:00
{
2021-12-20 13:04:41 +00:00
m_pConn - > AddPoints ( " nameless tee " , 2 , m_aError , sizeof ( m_aError ) ) ;
ASSERT_FALSE ( CScoreWorker : : ShowPoints ( m_pConn , & m_PlayerRequest , m_aError , sizeof ( m_aError ) ) ) < < m_aError ;
2022-03-24 00:16:05 +00:00
ExpectLines ( m_pPlayerResult , { " 1. nameless tee Points: 2, requested by brainless tee " } , true ) ;
2021-11-27 01:00:36 +00:00
}
2021-11-28 00:29:38 +00:00
TEST_P ( Points , OnePointsTop )
2021-11-27 01:00:36 +00:00
{
2021-12-20 13:04:41 +00:00
m_pConn - > AddPoints ( " nameless tee " , 2 , m_aError , sizeof ( m_aError ) ) ;
ASSERT_FALSE ( CScoreWorker : : ShowTopPoints ( m_pConn , & m_PlayerRequest , m_aError , sizeof ( m_aError ) ) ) < < m_aError ;
2022-03-24 00:16:05 +00:00
ExpectLines ( m_pPlayerResult ,
2021-11-27 01:00:36 +00:00
{ " -------- 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
{
2021-12-20 13:04:41 +00:00
m_pConn - > AddPoints ( " nameless tee " , 2 , m_aError , sizeof ( m_aError ) ) ;
m_pConn - > AddPoints ( " brainless tee " , 3 , m_aError , sizeof ( m_aError ) ) ;
ASSERT_FALSE ( CScoreWorker : : ShowPoints ( m_pConn , & m_PlayerRequest , m_aError , sizeof ( m_aError ) ) ) < < m_aError ;
2022-03-24 00:16:05 +00:00
ExpectLines ( m_pPlayerResult , { " 2. nameless tee Points: 2, requested by brainless tee " } , true ) ;
2021-11-27 01:00:36 +00:00
}
2021-11-28 00:29:38 +00:00
TEST_P ( Points , TwoPointsTop )
2021-11-27 01:00:36 +00:00
{
2021-12-20 13:04:41 +00:00
m_pConn - > AddPoints ( " nameless tee " , 2 , m_aError , sizeof ( m_aError ) ) ;
m_pConn - > AddPoints ( " brainless tee " , 3 , m_aError , sizeof ( m_aError ) ) ;
ASSERT_FALSE ( CScoreWorker : : ShowTopPoints ( m_pConn , & m_PlayerRequest , m_aError , sizeof ( m_aError ) ) ) < < m_aError ;
2022-03-24 00:16:05 +00:00
ExpectLines ( m_pPlayerResult ,
2021-11-27 01:00:36 +00:00
{ " -------- 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
{
2021-12-20 13:04:41 +00:00
m_pConn - > AddPoints ( " nameless tee " , 2 , m_aError , sizeof ( m_aError ) ) ;
m_pConn - > AddPoints ( " brainless tee " , 3 , m_aError , sizeof ( m_aError ) ) ;
m_pConn - > AddPoints ( " nameless tee " , 1 , m_aError , sizeof ( m_aError ) ) ;
ASSERT_FALSE ( CScoreWorker : : ShowPoints ( m_pConn , & m_PlayerRequest , m_aError , sizeof ( m_aError ) ) ) < < m_aError ;
2022-03-24 00:16:05 +00:00
ExpectLines ( m_pPlayerResult , { " 1. nameless tee Points: 3, requested by brainless tee " } , true ) ;
2021-11-27 01:00:36 +00:00
}
2021-11-28 00:29:38 +00:00
TEST_P ( Points , EqualPointsTop )
2021-11-27 01:00:36 +00:00
{
2021-12-20 13:04:41 +00:00
m_pConn - > AddPoints ( " nameless tee " , 2 , m_aError , sizeof ( m_aError ) ) ;
m_pConn - > AddPoints ( " brainless tee " , 3 , m_aError , sizeof ( m_aError ) ) ;
m_pConn - > AddPoints ( " nameless tee " , 1 , m_aError , sizeof ( m_aError ) ) ;
ASSERT_FALSE ( CScoreWorker : : ShowTopPoints ( m_pConn , & m_PlayerRequest , m_aError , sizeof ( m_aError ) ) ) < < m_aError ;
2022-03-24 00:16:05 +00:00
ExpectLines ( m_pPlayerResult ,
2021-11-27 01:00:36 +00:00
{ " -------- 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
{
2021-12-20 13:04:41 +00:00
std : : shared_ptr < CScoreRandomMapResult > m_pRandomMapResult { std : : make_shared < CScoreRandomMapResult > ( 0 ) } ;
CSqlRandomMapRequest m_RandomMapRequest { m_pRandomMapResult } ;
2021-11-27 01:00:36 +00:00
RandomMap ( )
{
2021-12-20 13:04:41 +00:00
str_copy ( m_RandomMapRequest . m_aServerType , " Novice " , sizeof ( m_RandomMapRequest . m_aServerType ) ) ;
str_copy ( m_RandomMapRequest . m_aCurrentMap , " Kobra 4 " , sizeof ( m_RandomMapRequest . m_aCurrentMap ) ) ;
str_copy ( m_RandomMapRequest . m_aRequestingPlayer , " nameless tee " , sizeof ( m_RandomMapRequest . m_aRequestingPlayer ) ) ;
2021-11-27 01:00:36 +00:00
}
} ;
2021-11-28 00:29:38 +00:00
TEST_P ( RandomMap , NoStars )
2021-11-27 01:00:36 +00:00
{
2021-12-20 13:04:41 +00:00
m_RandomMapRequest . m_Stars = - 1 ;
ASSERT_FALSE ( CScoreWorker : : RandomMap ( m_pConn , & m_RandomMapRequest , m_aError , sizeof ( m_aError ) ) ) < < m_aError ;
EXPECT_EQ ( m_pRandomMapResult - > m_ClientID , 0 ) ;
EXPECT_STREQ ( m_pRandomMapResult - > m_aMap , " Kobra 3 " ) ;
EXPECT_STREQ ( m_pRandomMapResult - > m_aMessage , " " ) ;
2021-11-27 01:00:36 +00:00
}
2021-11-28 00:29:38 +00:00
TEST_P ( RandomMap , StarsExists )
2021-11-27 01:00:36 +00:00
{
2021-12-20 13:04:41 +00:00
m_RandomMapRequest . m_Stars = 5 ;
ASSERT_FALSE ( CScoreWorker : : RandomMap ( m_pConn , & m_RandomMapRequest , m_aError , sizeof ( m_aError ) ) ) < < m_aError ;
EXPECT_EQ ( m_pRandomMapResult - > m_ClientID , 0 ) ;
EXPECT_STREQ ( m_pRandomMapResult - > m_aMap , " Kobra 3 " ) ;
EXPECT_STREQ ( m_pRandomMapResult - > m_aMessage , " " ) ;
2021-11-27 01:00:36 +00:00
}
2021-11-28 00:29:38 +00:00
TEST_P ( RandomMap , StarsDoesntExist )
2021-11-27 01:00:36 +00:00
{
2021-12-20 13:04:41 +00:00
m_RandomMapRequest . m_Stars = 3 ;
ASSERT_FALSE ( CScoreWorker : : RandomMap ( m_pConn , & m_RandomMapRequest , m_aError , sizeof ( m_aError ) ) ) < < m_aError ;
EXPECT_EQ ( m_pRandomMapResult - > m_ClientID , 0 ) ;
EXPECT_STREQ ( m_pRandomMapResult - > m_aMap , " " ) ;
EXPECT_STREQ ( m_pRandomMapResult - > m_aMessage , " No maps found on this server! " ) ;
2021-11-27 01:00:36 +00:00
}
2021-11-28 00:29:38 +00:00
TEST_P ( RandomMap , UnfinishedExists )
2021-11-27 01:00:36 +00:00
{
2021-12-20 13:04:41 +00:00
m_RandomMapRequest . m_Stars = - 1 ;
ASSERT_FALSE ( CScoreWorker : : RandomUnfinishedMap ( m_pConn , & m_RandomMapRequest , m_aError , sizeof ( m_aError ) ) ) < < m_aError ;
EXPECT_EQ ( m_pRandomMapResult - > m_ClientID , 0 ) ;
EXPECT_STREQ ( m_pRandomMapResult - > m_aMap , " Kobra 3 " ) ;
EXPECT_STREQ ( m_pRandomMapResult - > m_aMessage , " " ) ;
2021-11-27 01:00:36 +00:00
}
2021-11-28 00:29:38 +00:00
TEST_P ( RandomMap , UnfinishedDoesntExist )
2021-11-27 01:00:36 +00:00
{
InsertRank ( ) ;
2021-12-20 13:04:41 +00:00
ASSERT_FALSE ( CScoreWorker : : RandomUnfinishedMap ( m_pConn , & m_RandomMapRequest , m_aError , sizeof ( m_aError ) ) ) < < m_aError ;
EXPECT_EQ ( m_pRandomMapResult - > m_ClientID , 0 ) ;
EXPECT_STREQ ( m_pRandomMapResult - > m_aMap , " " ) ;
EXPECT_STREQ ( m_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
2021-12-20 13:04:41 +00:00
auto g_pSqliteConn = CreateSqliteConnection ( " :memory: " , true ) ;
2021-11-28 12:33:47 +00:00
# if defined(CONF_TEST_MYSQL)
2022-10-13 11:52:19 +00:00
CMysqlConfig gMysqlConfig {
" ddnet " , // database
" record " , // prefix
" ddnet " , // user
" thebestpassword " , // password
" localhost " , // ip
" " , // bindaddr
3306 , // port
true , // setup
} ;
auto g_pMysqlConn = CreateMysqlConnection ( gMysqlConfig ) ;
2021-11-28 12:33:47 +00:00
# endif
2021-12-20 13:04:41 +00:00
auto g_TestValues
2021-11-28 00:29:38 +00:00
{
2021-12-20 13:04:41 +00:00
testing : : Values (
2021-11-28 00:49:08 +00:00
# if defined(CONF_TEST_MYSQL)
2021-12-20 13:04:41 +00:00
g_pMysqlConn . get ( ) ,
2021-11-28 00:29:38 +00:00
# endif
2021-12-20 13:04:41 +00:00
g_pSqliteConn . get ( ) )
2021-11-28 00:29:38 +00:00
} ;
# define INSTANTIATE(SUITE) \
2021-12-20 13:04:41 +00:00
INSTANTIATE_TEST_SUITE_P ( Sql , SUITE , g_TestValues , \
[ ] ( const testing : : TestParamInfo < Score : : ParamType > & Info ) { \
switch ( Info . index ) \
2021-11-28 00:29:38 +00:00
{ \
case 0 : return " SQLite " ; \
case 1 : return " MySQL " ; \
default : return " Unknown " ; \
} \
} )
INSTANTIATE ( SingleScore ) ;
INSTANTIATE ( TeamScore ) ;
INSTANTIATE ( MapInfo ) ;
INSTANTIATE ( MapVote ) ;
INSTANTIATE ( Points ) ;
INSTANTIATE ( RandomMap ) ;