+% coding: utf-8
+% Module de test de euphorik.
+% Crée un certain nombre d'utilisateur et post des messages aléatoire.
+
+
+-module(euphorik_test).
+-compile(export_all).
+
+-include("../include/euphorik_bd.hrl").
+
+
+% N est le nombre d'utilisateur
+start(N) ->
+ Ids = creer_users(N),
+ lists:map(
+ fun(Id) ->
+ timer:sleep(100),
+ spawn(
+ fun() ->
+ {A1, A2, A3} = now(),
+ random:seed(A1, A2, A3),
+ loop(Id)
+ end
+ )
+ end,
+ Ids
+ ).
+
+stop(Pids) ->
+ lists:foreach(fun(Pid) -> exit(Pid, kill) end, Pids).
+
+
+% Crée N user avec des noms aléatoires et renvoie la liste des id.
+creer_users(N) ->
+ creer_users(N, []).
+creer_users(0, Ids) -> lists:map(fun(#user{id = Id}) -> Id end, Ids);
+creer_users(N, Ids) ->
+ creer_users(N - 1, [euphorik_bd:nouveau_user(mot_rand(random:uniform(4) + 4), "", "") | Ids ]).
+
+
+% crée un message aléatoire et le renvoie
+message_rand() ->
+ lists:flatten(message_rand(random:uniform(10), [])).
+message_rand(0, Mots) -> Mots;
+message_rand(N, Mots) ->
+ message_rand(N - 1, [mot_rand(random:uniform(2) + 5), $ | Mots]).
+
+
+% Renvoie une succession de lettre aléatoire
+mot_rand(L) ->
+ mot_rand(L, []).
+mot_rand(0, Mot) -> Mot;
+mot_rand(L, Mot) ->
+ mot_rand(L - 1, [random:uniform($z - $a + 1) + $a - 1 | Mot]).
+
+
+% Tire au hasard de 0 à 3 messages sur les 10 derniers postés, renvoie une liste de int()
+% répartition :
+% 0 : 0.5
+% 1 : 0.3
+% 2 : 0.15
+% 3 : 0.05
+messages_id_rand() ->
+ Messages = lists:map(fun(#minichat{id = Id}) -> Id end, euphorik_bd:messages(30)),
+ R = random:uniform(),
+ if R =< 0.5 -> [];
+ R > 0.5 andalso R =< 0.8 ->
+ tire_element_rand(1, Messages);
+ R > 0.8 andalso R =< 0.95 ->
+ tire_element_rand(2, Messages);
+ true ->
+ tire_element_rand(3, Messages)
+ end.
+
+
+% tire N element distinct parmis la liste L proposée
+tire_element_rand(N, L) when N =< length(L) ->
+ tire_element_rand(N, L, []).
+tire_element_rand(0, _, Elements) -> Elements;
+tire_element_rand(N, L, Elements) ->
+ E = lists:nth(random:uniform(length(L)), L),
+ E_se_trouve_dans_Elements = lists:any(fun(E2) -> E2 =:= E end, Elements),
+ if E_se_trouve_dans_Elements -> % si E a déjà été tiré on recommence sans rien changer
+ tire_element_rand(N, L, Elements);
+ true ->
+ tire_element_rand(N-1, L, [E | Elements])
+ end.
+
+
+loop(User_id) ->
+ % attend un temp aléatoire compris entre 1 sec et 5 sec
+ timer:sleep(1000 * random:uniform(5)),
+ % poste un message aléatoire par une personne aléatoire répondant à des messages aléatoires
+ {Message, Repond_a} = {message_rand(), messages_id_rand()},
+ io:format("~p poste ~p et repond a ~w~n", [User_id, Message, Repond_a]),
+ euphorik_bd:nouveau_message(Message, User_id, Repond_a),
+ loop(User_id).
+
\ No newline at end of file