X-Git-Url: http://git.euphorik.ch/?p=euphorik.git;a=blobdiff_plain;f=modules%2Ferl%2Feuphorik_test.erl;fp=modules%2Ferl%2Feuphorik_test.erl;h=d5c83c30ad26d0375d591e861e628716303fdae6;hp=0000000000000000000000000000000000000000;hb=c021866458e347a8c704217247ba207ad99c5cb7;hpb=2c27419e5ff0d1d064cf4d7e1417c469c82aef34 diff --git a/modules/erl/euphorik_test.erl b/modules/erl/euphorik_test.erl new file mode 100644 index 0000000..d5c83c3 --- /dev/null +++ b/modules/erl/euphorik_test.erl @@ -0,0 +1,98 @@ +% 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