#include "TestClient.h" #include "TestServer.h" #include "testing.h" TEST_CASE("Leveling up restores health and energy") { auto s = TestServer{}; auto c = TestClient{}; // Given a damaged user s.waitForUsers(1); auto &user = s.getFirstUser(); user.reduceHealth(1); user.reduceEnergy(1); CHECK(user.health() < user.stats().maxHealth); CHECK(user.energy() < user.stats().maxEnergy); // When the user levels up user.addXP(User::XP_PER_LEVEL[1]); // Then the user's health and energy are full WAIT_UNTIL(user.health() == user.stats().maxHealth); WAIT_UNTIL(user.energy() == user.stats().maxEnergy); } TEST_CASE("Client has correct XP on level up") { GIVEN("A player") { auto s = TestServer{}; auto c = TestClient{}; s.waitForUsers(1); auto &user = s.getFirstUser();
/* Programme principal serveur */ void startServer(void) { /* Socket du serveur */ SOCKET sock = startConnection(); /* Fonction de lancement du serveur, ici le serveur passe en écoute */ int max = sock; /* Liste des différents comptes */ Account *accounts = NULL; User *users = NULL; User *u_cursor = NULL, *tmp = NULL; /* Descripteur */ fd_set rdfs; bool quit = false; /* A ajouter : commande permettant de quitter §§§ */ while(!quit) { /* On vide le descripteur */ FD_ZERO(&rdfs); /* On ajoute le socket du serveur */ FD_SET((u_int)sock, &rdfs); u_cursor = getFirstUser(users); /* On ajoute le socket de chaque User */ while(u_cursor) { FD_SET((u_int)(u_cursor->sock), &rdfs); u_cursor = u_cursor->next; } /* On effectue le select pour lier le descripteur à la lecture sur le socket */ if(select(max+1, &rdfs, NULL, NULL, NULL) == SOCKET_ERROR) { sock_error("select()"); } else { /* Ici on attends un changement d'un des descripteurs */ /* Si c'est un nouveau client qui effectue une connexion */ if(FD_ISSET(sock, &rdfs)) { HERROR_WRITE(HERROR_DEBUG, "[Serveur] Nouveau client detecte"); /* Variables du nouveau client */ SOCKADDR_IN csin; size_t sinsize = sizeof csin; /* Socket du nouveau client */ int csock = accept(sock, (SOCKADDR *)&csin, (socklen_t *)&sinsize); /* Si erreur */ if(csock == SOCKET_ERROR) sock_error("accept()"); /* On ajoute le client en attente de connexion */ users = addUser(users, (SOCKET)csock, copy(inet_ntoa(csin.sin_addr))); /* Nouveau max : */ max = csock > max ? csock : max; HERROR_WRITE(HERROR_INFO, "[Serveur] Nouveau client ajoute ( ip '%s')", users->ip); } /* Sinon c'est un client qui effectue une action */ else { u_cursor = getFirstUser(users); /* Pour chaque Uset */ while(u_cursor) { /* S'il a envoyé des données */ if(FD_ISSET(u_cursor->sock, &rdfs)){ if(u_cursor->state == WAITING_MSG || u_cursor->state == WAITING_END_MSG) { if(u_cursor->acc) { HERROR_WRITE(HERROR_INFO, "[Serveur] Message client (ip '%s' | login '%s')", u_cursor->ip, u_cursor->acc->login); } else { HERROR_WRITE(HERROR_INFO, "[Serveur] Message client (ip '%s' | login '--')", u_cursor->ip); } } /* Ici, fonction qui lit la réception du message */ if(rcvMsgFromUser(u_cursor, &accounts) == 0) { /* si == 0, client déconnecté */ if(u_cursor->acc) { HERROR_WRITE(HERROR_INFO, "[Serveur] Deconnexion client (ip '%s' | login '%s')", u_cursor->ip, u_cursor->acc->login); } else { HERROR_WRITE(HERROR_INFO, "[Serveur] Deconnexion client (ip '%s' | login '--')", u_cursor->ip); } /* On ferme la connexion */ closesocket(u_cursor->sock); /* On l'enleve des Users */ tmp = u_cursor->next; removeUserAndAccount(&u_cursor, &accounts); users = u_cursor; u_cursor = tmp; } else u_cursor = u_cursor->next; } else u_cursor = u_cursor->next; } } } } endConnection(); deleteUser(users); deleteAccount(accounts); }