-
Notifications
You must be signed in to change notification settings - Fork 1
/
alloy.als
121 lines (97 loc) · 3.47 KB
/
alloy.als
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
module xbox
-------------------------------------------------------
-------------------- A S S I N A T U R A S |
-------------------------------------------------------
sig Xbox {
usuario: one Usuario
}
sig Usuario {
social: set Social,
biblioteca: set Biblioteca,
loja: set Loja,
podeComprarJogo: set Jogo,
podeComprarApp: set Aplicativo
}
sig Biblioteca {
jogos: set Jogo,
aplicativos: set Aplicativo
}
one sig Loja {
jogos: set Jogo,
aplicativos: set Aplicativo
}
sig Jogo {}
sig Aplicativo {}
one sig Social {
publicacoes: set Publicacao
}
abstract sig Publicacao {
autoria: one Usuario
}
-- Tipos de publicação
sig Screenshot extends Publicacao {}
sig Video extends Publicacao {}
sig Stream extends Publicacao{}
-- Estados da publicação
sig Curtida, Compartilhamento {
autoria: one Usuario,
publicacao: one Publicacao
}
sig Comentario {
autoria: one Usuario,
transmissao: one Stream
}
----------------------------------------------------
-------------------- P R E D I C A D O S |
----------------------------------------------------
pred temBiblioteca[u:Usuario]{ one u.biblioteca }
pred temLoja[u:Usuario] { one u.loja }
pred temSocial[u:Usuario] { one u.social }
pred temXbox[u:Usuario] { one u.~usuario }
pred temUsuario[b:Biblioteca] { one b.~biblioteca }
pred foiPublicado[p:Publicacao] { one p.~publicacoes }
pred temUsuario[c:Curtida] { one c.autoria}
pred temPublicacao[c:Curtida] { one c.publicacao }
pred temUsuario[c:Compartilhamento] { one c.autoria }
pred temPublicacao[c:Compartilhamento] { one c.publicacao}
pred temUsuario[c:Comentario] { one c.autoria }
pred temStream[c:Comentario] { one c.transmissao }
-------------------------------------
-------------------- F A T O S |
-------------------------------------
fact {
all u:Usuario | u.podeComprarJogo = jogosNaoAdquiridos[u]
all u:Usuario | u.podeComprarApp = appsNaoAdquiridos[u]
all u:Usuario | temXbox[u]
all u:Usuario | temLoja[u] and temSocial[u] and temBiblioteca[u]
all p:Publicacao | foiPublicado[p]
all c:Curtida | temUsuario[c] and temPublicacao[c]
all c:Compartilhamento | temUsuario[c] and temPublicacao[c]
all c:Comentario | temUsuario[c] and temStream[c]
all b:Biblioteca | #armazenamentoJogos[b] < 6
all b:Biblioteca | #armazenamentoApps[b] < 9
all b:Biblioteca | temUsuario[b]
all l:Loja | #(promoJogos[l] + promoApps[l]) > 9 and #(promoJogos[l] + promoApps[l]) < 21
}
--------------------------------------------
-------------------- F U N Ç Õ E S
--------------------------------------------
fun armazenamentoJogos[b:Biblioteca]: set Jogo { b.jogos }
fun armazenamentoApps[b:Biblioteca]: set Aplicativo { b.aplicativos }
fun promoJogos[l:Loja]: set Jogo {l.jogos }
fun promoApps[l:Loja]: set Aplicativo {l.aplicativos }
fun jogosNaoAdquiridos[u:Usuario]: set Jogo {u.loja.jogos - u.biblioteca.jogos }
fun appsNaoAdquiridos[u:Usuario]: set Aplicativo {u.loja.aplicativos - u.biblioteca.aplicativos }
----------------------------------------
-------------------- T E S T E S |
----------------------------------------
assert testMinimoDaLoja { all l:Loja | #(promoJogos[l] + promoApps[l]) > 9 }
assert testMaximoDaLoja { all l:Loja | #(promoJogos[l] + promoApps[l]) < 21 }
assert testArmazenamentoJogos { all b:Biblioteca | #armazenamentoJogos[b] < 6 }
assert testArmazenamentoApps { all b:Biblioteca | #armazenamentoApps[b] < 9 }
check testMinimoDaLoja for 10
check testMaximoDaLoja for 20
check testArmazenamentoJogos for 20
check testArmazenamentoApps for 20
pred show[]{}
run show for 10