d5c83c30ad26d0375d591e861e628716303fdae6
[euphorik.git] / modules / erl / euphorik_test.erl
1 % coding: utf-8
2 % Module de test de euphorik.
3 % Crée un certain nombre d'utilisateur et post des messages aléatoire.
4
5
6 -module(euphorik_test).
7 -compile(export_all).
8
9 -include("../include/euphorik_bd.hrl").
10
11
12 % N est le nombre d'utilisateur
13 start(N) ->
14 Ids = creer_users(N),
15 lists:map(
16 fun(Id) ->
17 timer:sleep(100),
18 spawn(
19 fun() ->
20 {A1, A2, A3} = now(),
21 random:seed(A1, A2, A3),
22 loop(Id)
23 end
24 )
25 end,
26 Ids
27 ).
28
29 stop(Pids) ->
30 lists:foreach(fun(Pid) -> exit(Pid, kill) end, Pids).
31
32
33 % Crée N user avec des noms aléatoires et renvoie la liste des id.
34 creer_users(N) ->
35 creer_users(N, []).
36 creer_users(0, Ids) -> lists:map(fun(#user{id = Id}) -> Id end, Ids);
37 creer_users(N, Ids) ->
38 creer_users(N - 1, [euphorik_bd:nouveau_user(mot_rand(random:uniform(4) + 4), "", "") | Ids ]).
39
40
41 % crée un message aléatoire et le renvoie
42 message_rand() ->
43 lists:flatten(message_rand(random:uniform(10), [])).
44 message_rand(0, Mots) -> Mots;
45 message_rand(N, Mots) ->
46 message_rand(N - 1, [mot_rand(random:uniform(2) + 5), $ | Mots]).
47
48
49 % Renvoie une succession de lettre aléatoire
50 mot_rand(L) ->
51 mot_rand(L, []).
52 mot_rand(0, Mot) -> Mot;
53 mot_rand(L, Mot) ->
54 mot_rand(L - 1, [random:uniform($z - $a + 1) + $a - 1 | Mot]).
55
56
57 % Tire au hasard de 0 à 3 messages sur les 10 derniers postés, renvoie une liste de int()
58 % répartition :
59 % 0 : 0.5
60 % 1 : 0.3
61 % 2 : 0.15
62 % 3 : 0.05
63 messages_id_rand() ->
64 Messages = lists:map(fun(#minichat{id = Id}) -> Id end, euphorik_bd:messages(30)),
65 R = random:uniform(),
66 if R =< 0.5 -> [];
67 R > 0.5 andalso R =< 0.8 ->
68 tire_element_rand(1, Messages);
69 R > 0.8 andalso R =< 0.95 ->
70 tire_element_rand(2, Messages);
71 true ->
72 tire_element_rand(3, Messages)
73 end.
74
75
76 % tire N element distinct parmis la liste L proposée
77 tire_element_rand(N, L) when N =< length(L) ->
78 tire_element_rand(N, L, []).
79 tire_element_rand(0, _, Elements) -> Elements;
80 tire_element_rand(N, L, Elements) ->
81 E = lists:nth(random:uniform(length(L)), L),
82 E_se_trouve_dans_Elements = lists:any(fun(E2) -> E2 =:= E end, Elements),
83 if E_se_trouve_dans_Elements -> % si E a déjà été tiré on recommence sans rien changer
84 tire_element_rand(N, L, Elements);
85 true ->
86 tire_element_rand(N-1, L, [E | Elements])
87 end.
88
89
90 loop(User_id) ->
91 % attend un temp aléatoire compris entre 1 sec et 5 sec
92 timer:sleep(1000 * random:uniform(5)),
93 % poste un message aléatoire par une personne aléatoire répondant à des messages aléatoires
94 {Message, Repond_a} = {message_rand(), messages_id_rand()},
95 io:format("~p poste ~p et repond a ~w~n", [User_id, Message, Repond_a]),
96 euphorik_bd:nouveau_message(Message, User_id, Repond_a),
97 loop(User_id).
98