Add: Added Coverage Screenshots And htlmReport.

This commit is contained in:
GabrieleRadice
2026-06-19 21:50:38 +02:00
parent 6aca188aa3
commit d78b8bbd93
316 changed files with 86329 additions and 0 deletions
Binary file not shown.

After

Width:  |  Height:  |  Size: 242 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 241 KiB

@@ -0,0 +1,154 @@
/*
* Copyright 2000-2021 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
* {
margin: 0;
padding: 0;
}
body {
background-color: #fff;
font-family: helvetica neue, tahoma, arial, sans-serif;
font-size: 82%;
color: #151515;
}
h1 {
margin: 0.5em 0;
color: #010101;
font-weight: normal;
font-size: 18px;
}
h2 {
margin: 0.5em 0;
color: #010101;
font-weight: normal;
font-size: 16px;
}
a {
color: #1564C2;
text-decoration: none;
}
a:hover {
text-decoration: underline;
}
span.separator {
color: #9BA9BA;
padding-left: 5px;
padding-right: 5px;
}
div.content {
width: 99%;
}
table.coverageStats {
width: 100%;
border-collapse: collapse;
}
table.overallStats {
width: 20%;
}
table.coverageStats td, table.coverageStats th {
padding: 4px 2px;
border-bottom: 1px solid #ccc;
}
table.coverageStats th {
background-color: #959BA4;
border: none;
font-weight: bold;
text-align: left;
color: #FFF;
}
table.coverageStats th.coverageStat {
width: 15%;
}
table.coverageStats th a {
color: #FFF;
}
table.coverageStats th a:hover {
text-decoration: none;
}
table.coverageStats th.sortedDesc a {
background: url(../img/arrowDown.gif) no-repeat 100% 2px;
padding-right: 20px;
}
table.coverageStats th.sortedAsc a {
background: url(../img/arrowUp.gif) no-repeat 100% 2px;
padding-right: 20px;
}
div.footer {
margin: 2em .5em;
font-size: 85%;
text-align: left;
line-height: 140%;
}
code.sourceCode {
width: 100%;
border: 1px solid #ccc;
font: normal 12px 'Menlo', 'Bitstream Vera Sans Mono', 'Courier New', 'Courier', monospace;
white-space: pre;
}
code.sourceCode b {
font-weight: normal;
}
code.sourceCode span.number {
color: #151515;
}
code.sourceCode .fc {
background-color: #cfc;
}
code.sourceCode .pc {
background-color: #ffc;
}
code.sourceCode .nc {
background-color: #fcc;
}
.percent, .absValue {
font-size: 90%;
}
.percent .green, .absValue .green {
color: #32cc32;
}
.percent .red, .absValue .red {
color: #f00;
}
.percent .totalDiff {
color: #3f3f3f;
}
+118
View File
@@ -0,0 +1,118 @@
/*
* Copyright 2000-2021 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/*
Intellij Idea-like styling (c) Vasily Polovnyov <vast@whiteants.net>
*/
.hljs {
color: #000;
background: #fff;
}
.hljs-subst,
.hljs-title {
font-weight: normal;
color: #000;
}
.hljs-comment,
.hljs-quote {
color: #808080;
font-style: italic;
}
.hljs-meta {
color: #808000;
}
.hljs-tag {
background: #efefef;
}
.hljs-section,
.hljs-name,
.hljs-literal,
.hljs-keyword,
.hljs-selector-tag,
.hljs-type,
.hljs-selector-id,
.hljs-selector-class {
font-weight: bold;
color: #000080;
}
.hljs-attribute,
.hljs-number,
.hljs-regexp,
.hljs-link {
font-weight: bold;
color: #0000ff;
}
.hljs-number,
.hljs-regexp,
.hljs-link {
font-weight: normal;
}
.hljs-string {
color: #008000;
font-weight: bold;
}
.hljs-symbol,
.hljs-bullet,
.hljs-formula {
color: #000;
background: #d0eded;
font-style: italic;
}
.hljs-doctag {
text-decoration: underline;
}
.hljs-variable,
.hljs-template-variable {
color: #660e7a;
}
.hljs-addition {
background: #baeeba;
}
.hljs-deletion {
background: #ffc8bd;
}
.hljs-emphasis {
font-style: italic;
}
.hljs-strong {
font-weight: bold;
}
.hljs-ln-numbers {
display: block;
float: left;
width: 3em;
border-right: 1px solid #ccc;
font-style: normal;
text-align: right;
background-color: #eee;
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 89 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 B

+782
View File
@@ -0,0 +1,782 @@
<!DOCTYPE html>
<html id="htmlId">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Coverage Report > Summary</title>
<style type="text/css">
@import "./css/coverage.css";
@import "./css/idea.min.css";
</style>
<script type="text/javascript" src="./js/highlight.min.js"></script>
<script type="text/javascript" src="./js/highlightjs-line-numbers.min.js"></script>
</head>
<body>
<div class="content">
<div class="breadCrumbs">
Current scope: all classes
</div>
<h1>Overall Coverage Summary </h1>
<table class="coverageStats">
<tr>
<th class="name">Package</th>
<th class="coverageStat
">
Class, %
</th>
<th class="coverageStat
">
Method, %
</th>
<th class="coverageStat
">
Branch, %
</th>
<th class="coverageStat
">
Line, %
</th>
</tr>
<tr>
<td class="name">all classes</td>
<td class="coverageStat">
<span class="percent">
50.6%
</span>
<span class="absValue">
(45/89)
</span>
</td>
<td class="coverageStat">
<span class="percent">
45.4%
</span>
<span class="absValue">
(333/734)
</span>
</td>
<td class="coverageStat">
<span class="percent">
43.2%
</span>
<span class="absValue">
(664/1536)
</span>
</td>
<td class="coverageStat">
<span class="percent">
36%
</span>
<span class="absValue">
(1326/3684)
</span>
</td>
</tr>
</table>
<br/>
<h2>Coverage Breakdown</h2>
<table class="coverageStats">
<tr>
<th class="name sortedAsc
">
<a href="index_SORT_BY_NAME_DESC.html">Package</a> </th>
<th class="coverageStat
">
<a href="index_SORT_BY_CLASS.html">Class, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_METHOD.html">Method, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_BLOCK.html">Branch, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_LINE.html">Line, %</a>
</th>
</tr>
<tr>
<td class="name"><a href="ns-1/index.html">it.polimi.ingsw.gc14</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/9)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/67)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/149)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/394)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-2/index.html">it.polimi.ingsw.gc14.Controller</a></td>
<td class="coverageStat">
<span class="percent">
50%
</span>
<span class="absValue">
(1/2)
</span>
</td>
<td class="coverageStat">
<span class="percent">
45.2%
</span>
<span class="absValue">
(14/31)
</span>
</td>
<td class="coverageStat">
<span class="percent">
69.2%
</span>
<span class="absValue">
(18/26)
</span>
</td>
<td class="coverageStat">
<span class="percent">
65.6%
</span>
<span class="absValue">
(42/64)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-3/index.html">it.polimi.ingsw.gc14.Model</a></td>
<td class="coverageStat">
<span class="percent">
90.9%
</span>
<span class="absValue">
(10/11)
</span>
</td>
<td class="coverageStat">
<span class="percent">
77.6%
</span>
<span class="absValue">
(97/125)
</span>
</td>
<td class="coverageStat">
<span class="percent">
73.5%
</span>
<span class="absValue">
(349/475)
</span>
</td>
<td class="coverageStat">
<span class="percent">
82%
</span>
<span class="absValue">
(547/667)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-4/index.html">it.polimi.ingsw.gc14.Model.Cards</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(2/2)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(20/20)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(25/25)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(58/58)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-5/index.html">it.polimi.ingsw.gc14.Model.Cards.Building</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(1/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(2/2)
</span>
</td>
<td class="coverageStat"/>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(7/7)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-6/index.html">it.polimi.ingsw.gc14.Model.Cards.Building.Effects</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(7/7)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(38/38)
</span>
</td>
<td class="coverageStat">
<span class="percent">
92%
</span>
<span class="absValue">
(46/50)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(129/129)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-7/index.html">it.polimi.ingsw.gc14.Model.Cards.TribeCards</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(4/4)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(15/15)
</span>
</td>
<td class="coverageStat"/>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(29/29)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-8/index.html">it.polimi.ingsw.gc14.Model.Cards.TribeCards.Characters</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(6/6)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(49/49)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(40/40)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(108/108)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-9/index.html">it.polimi.ingsw.gc14.Model.Cards.TribeCards.Events</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(4/4)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(24/24)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(48/48)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(91/91)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-a/index.html">it.polimi.ingsw.gc14.Model.GamePackage</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(3/3)
</span>
</td>
<td class="coverageStat">
<span class="percent">
94.3%
</span>
<span class="absValue">
(33/35)
</span>
</td>
<td class="coverageStat">
<span class="percent">
96.9%
</span>
<span class="absValue">
(31/32)
</span>
</td>
<td class="coverageStat">
<span class="percent">
88.2%
</span>
<span class="absValue">
(120/136)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-b/index.html">it.polimi.ingsw.gc14.Model.Orders</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(5/5)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(17/17)
</span>
</td>
<td class="coverageStat">
<span class="percent">
88.2%
</span>
<span class="absValue">
(67/76)
</span>
</td>
<td class="coverageStat">
<span class="percent">
96.5%
</span>
<span class="absValue">
(111/115)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-c/index.html">it.polimi.ingsw.gc14.Network</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/4)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/20)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/28)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/64)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-d/index.html">it.polimi.ingsw.gc14.Network.NetworkEvents</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/12)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/41)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/20)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/175)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-e/index.html">it.polimi.ingsw.gc14.Network.RMI.Client</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/2)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/18)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/14)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/68)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-f/index.html">it.polimi.ingsw.gc14.Network.RMI.Server</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/2)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/23)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/36)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/113)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-10/index.html">it.polimi.ingsw.gc14.Network.TCP.Client</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/15)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/26)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/83)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-11/index.html">it.polimi.ingsw.gc14.Network.TCP.Server</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/3)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/19)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/50)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/166)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-12/index.html">it.polimi.ingsw.gc14.View.GUI</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/8)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/130)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/291)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1000)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-13/index.html">it.polimi.ingsw.gc14.View.TUI</a></td>
<td class="coverageStat">
<span class="percent">
66.7%
</span>
<span class="absValue">
(2/3)
</span>
</td>
<td class="coverageStat">
<span class="percent">
53.3%
</span>
<span class="absValue">
(24/45)
</span>
</td>
<td class="coverageStat">
<span class="percent">
26.7%
</span>
<span class="absValue">
(40/150)
</span>
</td>
<td class="coverageStat">
<span class="percent">
38.7%
</span>
<span class="absValue">
(84/217)
</span>
</td>
</tr>
</table>
</div>
<script type="text/javascript">
(function() {
var msie = false, msie9 = false;
/*@cc_on
msie = true;
@if (@_jscript_version >= 9)
msie9 = true;
@end
@*/
if (!msie || msie && msie9) {
hljs.highlightAll()
hljs.initLineNumbersOnLoad();
}
})();
</script>
<div class="footer">
<div style="float:right;">generated on 2026-06-14 21:53</div>
</div>
</body>
</html>
@@ -0,0 +1,782 @@
<!DOCTYPE html>
<html id="htmlId">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Coverage Report > Summary</title>
<style type="text/css">
@import "./css/coverage.css";
@import "./css/idea.min.css";
</style>
<script type="text/javascript" src="./js/highlight.min.js"></script>
<script type="text/javascript" src="./js/highlightjs-line-numbers.min.js"></script>
</head>
<body>
<div class="content">
<div class="breadCrumbs">
Current scope: all classes
</div>
<h1>Overall Coverage Summary </h1>
<table class="coverageStats">
<tr>
<th class="name">Package</th>
<th class="coverageStat
">
Class, %
</th>
<th class="coverageStat
">
Method, %
</th>
<th class="coverageStat
">
Branch, %
</th>
<th class="coverageStat
">
Line, %
</th>
</tr>
<tr>
<td class="name">all classes</td>
<td class="coverageStat">
<span class="percent">
50.6%
</span>
<span class="absValue">
(45/89)
</span>
</td>
<td class="coverageStat">
<span class="percent">
45.4%
</span>
<span class="absValue">
(333/734)
</span>
</td>
<td class="coverageStat">
<span class="percent">
43.2%
</span>
<span class="absValue">
(664/1536)
</span>
</td>
<td class="coverageStat">
<span class="percent">
36%
</span>
<span class="absValue">
(1326/3684)
</span>
</td>
</tr>
</table>
<br/>
<h2>Coverage Breakdown</h2>
<table class="coverageStats">
<tr>
<th class="name
">
<a href="index.html">Package</a> </th>
<th class="coverageStat
">
<a href="index_SORT_BY_CLASS.html">Class, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_METHOD.html">Method, %</a>
</th>
<th class="coverageStat sortedAsc
">
<a href="index_SORT_BY_BLOCK_DESC.html">Branch, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_LINE.html">Line, %</a>
</th>
</tr>
<tr>
<td class="name"><a href="ns-5/index_SORT_BY_BLOCK.html">it.polimi.ingsw.gc14.Model.Cards.Building</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(1/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(2/2)
</span>
</td>
<td class="coverageStat"/>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(7/7)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-7/index_SORT_BY_BLOCK.html">it.polimi.ingsw.gc14.Model.Cards.TribeCards</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(4/4)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(15/15)
</span>
</td>
<td class="coverageStat"/>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(29/29)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-1/index_SORT_BY_BLOCK.html">it.polimi.ingsw.gc14</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/9)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/67)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/149)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/394)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-c/index_SORT_BY_BLOCK.html">it.polimi.ingsw.gc14.Network</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/4)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/20)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/28)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/64)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-d/index_SORT_BY_BLOCK.html">it.polimi.ingsw.gc14.Network.NetworkEvents</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/12)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/41)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/20)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/175)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-e/index_SORT_BY_BLOCK.html">it.polimi.ingsw.gc14.Network.RMI.Client</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/2)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/18)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/14)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/68)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-f/index_SORT_BY_BLOCK.html">it.polimi.ingsw.gc14.Network.RMI.Server</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/2)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/23)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/36)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/113)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-10/index_SORT_BY_BLOCK.html">it.polimi.ingsw.gc14.Network.TCP.Client</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/15)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/26)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/83)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-11/index_SORT_BY_BLOCK.html">it.polimi.ingsw.gc14.Network.TCP.Server</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/3)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/19)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/50)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/166)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-12/index_SORT_BY_BLOCK.html">it.polimi.ingsw.gc14.View.GUI</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/8)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/130)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/291)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1000)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-13/index_SORT_BY_BLOCK.html">it.polimi.ingsw.gc14.View.TUI</a></td>
<td class="coverageStat">
<span class="percent">
66.7%
</span>
<span class="absValue">
(2/3)
</span>
</td>
<td class="coverageStat">
<span class="percent">
53.3%
</span>
<span class="absValue">
(24/45)
</span>
</td>
<td class="coverageStat">
<span class="percent">
26.7%
</span>
<span class="absValue">
(40/150)
</span>
</td>
<td class="coverageStat">
<span class="percent">
38.7%
</span>
<span class="absValue">
(84/217)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-2/index_SORT_BY_BLOCK.html">it.polimi.ingsw.gc14.Controller</a></td>
<td class="coverageStat">
<span class="percent">
50%
</span>
<span class="absValue">
(1/2)
</span>
</td>
<td class="coverageStat">
<span class="percent">
45.2%
</span>
<span class="absValue">
(14/31)
</span>
</td>
<td class="coverageStat">
<span class="percent">
69.2%
</span>
<span class="absValue">
(18/26)
</span>
</td>
<td class="coverageStat">
<span class="percent">
65.6%
</span>
<span class="absValue">
(42/64)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-3/index_SORT_BY_BLOCK.html">it.polimi.ingsw.gc14.Model</a></td>
<td class="coverageStat">
<span class="percent">
90.9%
</span>
<span class="absValue">
(10/11)
</span>
</td>
<td class="coverageStat">
<span class="percent">
77.6%
</span>
<span class="absValue">
(97/125)
</span>
</td>
<td class="coverageStat">
<span class="percent">
73.5%
</span>
<span class="absValue">
(349/475)
</span>
</td>
<td class="coverageStat">
<span class="percent">
82%
</span>
<span class="absValue">
(547/667)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-b/index_SORT_BY_BLOCK.html">it.polimi.ingsw.gc14.Model.Orders</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(5/5)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(17/17)
</span>
</td>
<td class="coverageStat">
<span class="percent">
88.2%
</span>
<span class="absValue">
(67/76)
</span>
</td>
<td class="coverageStat">
<span class="percent">
96.5%
</span>
<span class="absValue">
(111/115)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-6/index_SORT_BY_BLOCK.html">it.polimi.ingsw.gc14.Model.Cards.Building.Effects</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(7/7)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(38/38)
</span>
</td>
<td class="coverageStat">
<span class="percent">
92%
</span>
<span class="absValue">
(46/50)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(129/129)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-a/index_SORT_BY_BLOCK.html">it.polimi.ingsw.gc14.Model.GamePackage</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(3/3)
</span>
</td>
<td class="coverageStat">
<span class="percent">
94.3%
</span>
<span class="absValue">
(33/35)
</span>
</td>
<td class="coverageStat">
<span class="percent">
96.9%
</span>
<span class="absValue">
(31/32)
</span>
</td>
<td class="coverageStat">
<span class="percent">
88.2%
</span>
<span class="absValue">
(120/136)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-4/index_SORT_BY_BLOCK.html">it.polimi.ingsw.gc14.Model.Cards</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(2/2)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(20/20)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(25/25)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(58/58)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-8/index_SORT_BY_BLOCK.html">it.polimi.ingsw.gc14.Model.Cards.TribeCards.Characters</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(6/6)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(49/49)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(40/40)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(108/108)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-9/index_SORT_BY_BLOCK.html">it.polimi.ingsw.gc14.Model.Cards.TribeCards.Events</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(4/4)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(24/24)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(48/48)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(91/91)
</span>
</td>
</tr>
</table>
</div>
<script type="text/javascript">
(function() {
var msie = false, msie9 = false;
/*@cc_on
msie = true;
@if (@_jscript_version >= 9)
msie9 = true;
@end
@*/
if (!msie || msie && msie9) {
hljs.highlightAll()
hljs.initLineNumbersOnLoad();
}
})();
</script>
<div class="footer">
<div style="float:right;">generated on 2026-06-14 21:53</div>
</div>
</body>
</html>
@@ -0,0 +1,782 @@
<!DOCTYPE html>
<html id="htmlId">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Coverage Report > Summary</title>
<style type="text/css">
@import "./css/coverage.css";
@import "./css/idea.min.css";
</style>
<script type="text/javascript" src="./js/highlight.min.js"></script>
<script type="text/javascript" src="./js/highlightjs-line-numbers.min.js"></script>
</head>
<body>
<div class="content">
<div class="breadCrumbs">
Current scope: all classes
</div>
<h1>Overall Coverage Summary </h1>
<table class="coverageStats">
<tr>
<th class="name">Package</th>
<th class="coverageStat
">
Class, %
</th>
<th class="coverageStat
">
Method, %
</th>
<th class="coverageStat
">
Branch, %
</th>
<th class="coverageStat
">
Line, %
</th>
</tr>
<tr>
<td class="name">all classes</td>
<td class="coverageStat">
<span class="percent">
50.6%
</span>
<span class="absValue">
(45/89)
</span>
</td>
<td class="coverageStat">
<span class="percent">
45.4%
</span>
<span class="absValue">
(333/734)
</span>
</td>
<td class="coverageStat">
<span class="percent">
43.2%
</span>
<span class="absValue">
(664/1536)
</span>
</td>
<td class="coverageStat">
<span class="percent">
36%
</span>
<span class="absValue">
(1326/3684)
</span>
</td>
</tr>
</table>
<br/>
<h2>Coverage Breakdown</h2>
<table class="coverageStats">
<tr>
<th class="name
">
<a href="index.html">Package</a> </th>
<th class="coverageStat
">
<a href="index_SORT_BY_CLASS.html">Class, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_METHOD.html">Method, %</a>
</th>
<th class="coverageStat sortedDesc
">
<a href="index_SORT_BY_BLOCK.html">Branch, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_LINE.html">Line, %</a>
</th>
</tr>
<tr>
<td class="name"><a href="ns-9/index_SORT_BY_BLOCK_DESC.html">it.polimi.ingsw.gc14.Model.Cards.TribeCards.Events</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(4/4)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(24/24)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(48/48)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(91/91)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-8/index_SORT_BY_BLOCK_DESC.html">it.polimi.ingsw.gc14.Model.Cards.TribeCards.Characters</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(6/6)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(49/49)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(40/40)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(108/108)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-4/index_SORT_BY_BLOCK_DESC.html">it.polimi.ingsw.gc14.Model.Cards</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(2/2)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(20/20)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(25/25)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(58/58)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-a/index_SORT_BY_BLOCK_DESC.html">it.polimi.ingsw.gc14.Model.GamePackage</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(3/3)
</span>
</td>
<td class="coverageStat">
<span class="percent">
94.3%
</span>
<span class="absValue">
(33/35)
</span>
</td>
<td class="coverageStat">
<span class="percent">
96.9%
</span>
<span class="absValue">
(31/32)
</span>
</td>
<td class="coverageStat">
<span class="percent">
88.2%
</span>
<span class="absValue">
(120/136)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-6/index_SORT_BY_BLOCK_DESC.html">it.polimi.ingsw.gc14.Model.Cards.Building.Effects</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(7/7)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(38/38)
</span>
</td>
<td class="coverageStat">
<span class="percent">
92%
</span>
<span class="absValue">
(46/50)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(129/129)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-b/index_SORT_BY_BLOCK_DESC.html">it.polimi.ingsw.gc14.Model.Orders</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(5/5)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(17/17)
</span>
</td>
<td class="coverageStat">
<span class="percent">
88.2%
</span>
<span class="absValue">
(67/76)
</span>
</td>
<td class="coverageStat">
<span class="percent">
96.5%
</span>
<span class="absValue">
(111/115)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-3/index_SORT_BY_BLOCK_DESC.html">it.polimi.ingsw.gc14.Model</a></td>
<td class="coverageStat">
<span class="percent">
90.9%
</span>
<span class="absValue">
(10/11)
</span>
</td>
<td class="coverageStat">
<span class="percent">
77.6%
</span>
<span class="absValue">
(97/125)
</span>
</td>
<td class="coverageStat">
<span class="percent">
73.5%
</span>
<span class="absValue">
(349/475)
</span>
</td>
<td class="coverageStat">
<span class="percent">
82%
</span>
<span class="absValue">
(547/667)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-2/index_SORT_BY_BLOCK_DESC.html">it.polimi.ingsw.gc14.Controller</a></td>
<td class="coverageStat">
<span class="percent">
50%
</span>
<span class="absValue">
(1/2)
</span>
</td>
<td class="coverageStat">
<span class="percent">
45.2%
</span>
<span class="absValue">
(14/31)
</span>
</td>
<td class="coverageStat">
<span class="percent">
69.2%
</span>
<span class="absValue">
(18/26)
</span>
</td>
<td class="coverageStat">
<span class="percent">
65.6%
</span>
<span class="absValue">
(42/64)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-13/index_SORT_BY_BLOCK_DESC.html">it.polimi.ingsw.gc14.View.TUI</a></td>
<td class="coverageStat">
<span class="percent">
66.7%
</span>
<span class="absValue">
(2/3)
</span>
</td>
<td class="coverageStat">
<span class="percent">
53.3%
</span>
<span class="absValue">
(24/45)
</span>
</td>
<td class="coverageStat">
<span class="percent">
26.7%
</span>
<span class="absValue">
(40/150)
</span>
</td>
<td class="coverageStat">
<span class="percent">
38.7%
</span>
<span class="absValue">
(84/217)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-12/index_SORT_BY_BLOCK_DESC.html">it.polimi.ingsw.gc14.View.GUI</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/8)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/130)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/291)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1000)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-11/index_SORT_BY_BLOCK_DESC.html">it.polimi.ingsw.gc14.Network.TCP.Server</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/3)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/19)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/50)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/166)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-10/index_SORT_BY_BLOCK_DESC.html">it.polimi.ingsw.gc14.Network.TCP.Client</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/15)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/26)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/83)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-f/index_SORT_BY_BLOCK_DESC.html">it.polimi.ingsw.gc14.Network.RMI.Server</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/2)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/23)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/36)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/113)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-e/index_SORT_BY_BLOCK_DESC.html">it.polimi.ingsw.gc14.Network.RMI.Client</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/2)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/18)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/14)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/68)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-d/index_SORT_BY_BLOCK_DESC.html">it.polimi.ingsw.gc14.Network.NetworkEvents</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/12)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/41)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/20)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/175)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-c/index_SORT_BY_BLOCK_DESC.html">it.polimi.ingsw.gc14.Network</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/4)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/20)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/28)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/64)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-1/index_SORT_BY_BLOCK_DESC.html">it.polimi.ingsw.gc14</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/9)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/67)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/149)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/394)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-7/index_SORT_BY_BLOCK_DESC.html">it.polimi.ingsw.gc14.Model.Cards.TribeCards</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(4/4)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(15/15)
</span>
</td>
<td class="coverageStat"/>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(29/29)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-5/index_SORT_BY_BLOCK_DESC.html">it.polimi.ingsw.gc14.Model.Cards.Building</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(1/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(2/2)
</span>
</td>
<td class="coverageStat"/>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(7/7)
</span>
</td>
</tr>
</table>
</div>
<script type="text/javascript">
(function() {
var msie = false, msie9 = false;
/*@cc_on
msie = true;
@if (@_jscript_version >= 9)
msie9 = true;
@end
@*/
if (!msie || msie && msie9) {
hljs.highlightAll()
hljs.initLineNumbersOnLoad();
}
})();
</script>
<div class="footer">
<div style="float:right;">generated on 2026-06-14 21:53</div>
</div>
</body>
</html>
@@ -0,0 +1,782 @@
<!DOCTYPE html>
<html id="htmlId">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Coverage Report > Summary</title>
<style type="text/css">
@import "./css/coverage.css";
@import "./css/idea.min.css";
</style>
<script type="text/javascript" src="./js/highlight.min.js"></script>
<script type="text/javascript" src="./js/highlightjs-line-numbers.min.js"></script>
</head>
<body>
<div class="content">
<div class="breadCrumbs">
Current scope: all classes
</div>
<h1>Overall Coverage Summary </h1>
<table class="coverageStats">
<tr>
<th class="name">Package</th>
<th class="coverageStat
">
Class, %
</th>
<th class="coverageStat
">
Method, %
</th>
<th class="coverageStat
">
Branch, %
</th>
<th class="coverageStat
">
Line, %
</th>
</tr>
<tr>
<td class="name">all classes</td>
<td class="coverageStat">
<span class="percent">
50.6%
</span>
<span class="absValue">
(45/89)
</span>
</td>
<td class="coverageStat">
<span class="percent">
45.4%
</span>
<span class="absValue">
(333/734)
</span>
</td>
<td class="coverageStat">
<span class="percent">
43.2%
</span>
<span class="absValue">
(664/1536)
</span>
</td>
<td class="coverageStat">
<span class="percent">
36%
</span>
<span class="absValue">
(1326/3684)
</span>
</td>
</tr>
</table>
<br/>
<h2>Coverage Breakdown</h2>
<table class="coverageStats">
<tr>
<th class="name
">
<a href="index.html">Package</a> </th>
<th class="coverageStat sortedAsc
">
<a href="index_SORT_BY_CLASS_DESC.html">Class, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_METHOD.html">Method, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_BLOCK.html">Branch, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_LINE.html">Line, %</a>
</th>
</tr>
<tr>
<td class="name"><a href="ns-1/index_SORT_BY_CLASS.html">it.polimi.ingsw.gc14</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/9)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/67)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/149)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/394)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-c/index_SORT_BY_CLASS.html">it.polimi.ingsw.gc14.Network</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/4)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/20)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/28)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/64)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-d/index_SORT_BY_CLASS.html">it.polimi.ingsw.gc14.Network.NetworkEvents</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/12)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/41)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/20)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/175)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-e/index_SORT_BY_CLASS.html">it.polimi.ingsw.gc14.Network.RMI.Client</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/2)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/18)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/14)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/68)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-f/index_SORT_BY_CLASS.html">it.polimi.ingsw.gc14.Network.RMI.Server</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/2)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/23)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/36)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/113)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-10/index_SORT_BY_CLASS.html">it.polimi.ingsw.gc14.Network.TCP.Client</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/15)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/26)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/83)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-11/index_SORT_BY_CLASS.html">it.polimi.ingsw.gc14.Network.TCP.Server</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/3)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/19)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/50)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/166)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-12/index_SORT_BY_CLASS.html">it.polimi.ingsw.gc14.View.GUI</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/8)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/130)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/291)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1000)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-2/index_SORT_BY_CLASS.html">it.polimi.ingsw.gc14.Controller</a></td>
<td class="coverageStat">
<span class="percent">
50%
</span>
<span class="absValue">
(1/2)
</span>
</td>
<td class="coverageStat">
<span class="percent">
45.2%
</span>
<span class="absValue">
(14/31)
</span>
</td>
<td class="coverageStat">
<span class="percent">
69.2%
</span>
<span class="absValue">
(18/26)
</span>
</td>
<td class="coverageStat">
<span class="percent">
65.6%
</span>
<span class="absValue">
(42/64)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-13/index_SORT_BY_CLASS.html">it.polimi.ingsw.gc14.View.TUI</a></td>
<td class="coverageStat">
<span class="percent">
66.7%
</span>
<span class="absValue">
(2/3)
</span>
</td>
<td class="coverageStat">
<span class="percent">
53.3%
</span>
<span class="absValue">
(24/45)
</span>
</td>
<td class="coverageStat">
<span class="percent">
26.7%
</span>
<span class="absValue">
(40/150)
</span>
</td>
<td class="coverageStat">
<span class="percent">
38.7%
</span>
<span class="absValue">
(84/217)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-3/index_SORT_BY_CLASS.html">it.polimi.ingsw.gc14.Model</a></td>
<td class="coverageStat">
<span class="percent">
90.9%
</span>
<span class="absValue">
(10/11)
</span>
</td>
<td class="coverageStat">
<span class="percent">
77.6%
</span>
<span class="absValue">
(97/125)
</span>
</td>
<td class="coverageStat">
<span class="percent">
73.5%
</span>
<span class="absValue">
(349/475)
</span>
</td>
<td class="coverageStat">
<span class="percent">
82%
</span>
<span class="absValue">
(547/667)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-4/index_SORT_BY_CLASS.html">it.polimi.ingsw.gc14.Model.Cards</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(2/2)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(20/20)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(25/25)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(58/58)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-5/index_SORT_BY_CLASS.html">it.polimi.ingsw.gc14.Model.Cards.Building</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(1/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(2/2)
</span>
</td>
<td class="coverageStat"/>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(7/7)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-6/index_SORT_BY_CLASS.html">it.polimi.ingsw.gc14.Model.Cards.Building.Effects</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(7/7)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(38/38)
</span>
</td>
<td class="coverageStat">
<span class="percent">
92%
</span>
<span class="absValue">
(46/50)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(129/129)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-7/index_SORT_BY_CLASS.html">it.polimi.ingsw.gc14.Model.Cards.TribeCards</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(4/4)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(15/15)
</span>
</td>
<td class="coverageStat"/>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(29/29)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-8/index_SORT_BY_CLASS.html">it.polimi.ingsw.gc14.Model.Cards.TribeCards.Characters</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(6/6)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(49/49)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(40/40)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(108/108)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-9/index_SORT_BY_CLASS.html">it.polimi.ingsw.gc14.Model.Cards.TribeCards.Events</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(4/4)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(24/24)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(48/48)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(91/91)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-a/index_SORT_BY_CLASS.html">it.polimi.ingsw.gc14.Model.GamePackage</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(3/3)
</span>
</td>
<td class="coverageStat">
<span class="percent">
94.3%
</span>
<span class="absValue">
(33/35)
</span>
</td>
<td class="coverageStat">
<span class="percent">
96.9%
</span>
<span class="absValue">
(31/32)
</span>
</td>
<td class="coverageStat">
<span class="percent">
88.2%
</span>
<span class="absValue">
(120/136)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-b/index_SORT_BY_CLASS.html">it.polimi.ingsw.gc14.Model.Orders</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(5/5)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(17/17)
</span>
</td>
<td class="coverageStat">
<span class="percent">
88.2%
</span>
<span class="absValue">
(67/76)
</span>
</td>
<td class="coverageStat">
<span class="percent">
96.5%
</span>
<span class="absValue">
(111/115)
</span>
</td>
</tr>
</table>
</div>
<script type="text/javascript">
(function() {
var msie = false, msie9 = false;
/*@cc_on
msie = true;
@if (@_jscript_version >= 9)
msie9 = true;
@end
@*/
if (!msie || msie && msie9) {
hljs.highlightAll()
hljs.initLineNumbersOnLoad();
}
})();
</script>
<div class="footer">
<div style="float:right;">generated on 2026-06-14 21:53</div>
</div>
</body>
</html>
@@ -0,0 +1,782 @@
<!DOCTYPE html>
<html id="htmlId">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Coverage Report > Summary</title>
<style type="text/css">
@import "./css/coverage.css";
@import "./css/idea.min.css";
</style>
<script type="text/javascript" src="./js/highlight.min.js"></script>
<script type="text/javascript" src="./js/highlightjs-line-numbers.min.js"></script>
</head>
<body>
<div class="content">
<div class="breadCrumbs">
Current scope: all classes
</div>
<h1>Overall Coverage Summary </h1>
<table class="coverageStats">
<tr>
<th class="name">Package</th>
<th class="coverageStat
">
Class, %
</th>
<th class="coverageStat
">
Method, %
</th>
<th class="coverageStat
">
Branch, %
</th>
<th class="coverageStat
">
Line, %
</th>
</tr>
<tr>
<td class="name">all classes</td>
<td class="coverageStat">
<span class="percent">
50.6%
</span>
<span class="absValue">
(45/89)
</span>
</td>
<td class="coverageStat">
<span class="percent">
45.4%
</span>
<span class="absValue">
(333/734)
</span>
</td>
<td class="coverageStat">
<span class="percent">
43.2%
</span>
<span class="absValue">
(664/1536)
</span>
</td>
<td class="coverageStat">
<span class="percent">
36%
</span>
<span class="absValue">
(1326/3684)
</span>
</td>
</tr>
</table>
<br/>
<h2>Coverage Breakdown</h2>
<table class="coverageStats">
<tr>
<th class="name
">
<a href="index.html">Package</a> </th>
<th class="coverageStat sortedDesc
">
<a href="index_SORT_BY_CLASS.html">Class, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_METHOD.html">Method, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_BLOCK.html">Branch, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_LINE.html">Line, %</a>
</th>
</tr>
<tr>
<td class="name"><a href="ns-b/index_SORT_BY_CLASS_DESC.html">it.polimi.ingsw.gc14.Model.Orders</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(5/5)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(17/17)
</span>
</td>
<td class="coverageStat">
<span class="percent">
88.2%
</span>
<span class="absValue">
(67/76)
</span>
</td>
<td class="coverageStat">
<span class="percent">
96.5%
</span>
<span class="absValue">
(111/115)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-a/index_SORT_BY_CLASS_DESC.html">it.polimi.ingsw.gc14.Model.GamePackage</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(3/3)
</span>
</td>
<td class="coverageStat">
<span class="percent">
94.3%
</span>
<span class="absValue">
(33/35)
</span>
</td>
<td class="coverageStat">
<span class="percent">
96.9%
</span>
<span class="absValue">
(31/32)
</span>
</td>
<td class="coverageStat">
<span class="percent">
88.2%
</span>
<span class="absValue">
(120/136)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-9/index_SORT_BY_CLASS_DESC.html">it.polimi.ingsw.gc14.Model.Cards.TribeCards.Events</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(4/4)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(24/24)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(48/48)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(91/91)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-8/index_SORT_BY_CLASS_DESC.html">it.polimi.ingsw.gc14.Model.Cards.TribeCards.Characters</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(6/6)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(49/49)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(40/40)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(108/108)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-7/index_SORT_BY_CLASS_DESC.html">it.polimi.ingsw.gc14.Model.Cards.TribeCards</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(4/4)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(15/15)
</span>
</td>
<td class="coverageStat"/>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(29/29)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-6/index_SORT_BY_CLASS_DESC.html">it.polimi.ingsw.gc14.Model.Cards.Building.Effects</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(7/7)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(38/38)
</span>
</td>
<td class="coverageStat">
<span class="percent">
92%
</span>
<span class="absValue">
(46/50)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(129/129)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-5/index_SORT_BY_CLASS_DESC.html">it.polimi.ingsw.gc14.Model.Cards.Building</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(1/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(2/2)
</span>
</td>
<td class="coverageStat"/>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(7/7)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-4/index_SORT_BY_CLASS_DESC.html">it.polimi.ingsw.gc14.Model.Cards</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(2/2)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(20/20)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(25/25)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(58/58)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-3/index_SORT_BY_CLASS_DESC.html">it.polimi.ingsw.gc14.Model</a></td>
<td class="coverageStat">
<span class="percent">
90.9%
</span>
<span class="absValue">
(10/11)
</span>
</td>
<td class="coverageStat">
<span class="percent">
77.6%
</span>
<span class="absValue">
(97/125)
</span>
</td>
<td class="coverageStat">
<span class="percent">
73.5%
</span>
<span class="absValue">
(349/475)
</span>
</td>
<td class="coverageStat">
<span class="percent">
82%
</span>
<span class="absValue">
(547/667)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-13/index_SORT_BY_CLASS_DESC.html">it.polimi.ingsw.gc14.View.TUI</a></td>
<td class="coverageStat">
<span class="percent">
66.7%
</span>
<span class="absValue">
(2/3)
</span>
</td>
<td class="coverageStat">
<span class="percent">
53.3%
</span>
<span class="absValue">
(24/45)
</span>
</td>
<td class="coverageStat">
<span class="percent">
26.7%
</span>
<span class="absValue">
(40/150)
</span>
</td>
<td class="coverageStat">
<span class="percent">
38.7%
</span>
<span class="absValue">
(84/217)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-2/index_SORT_BY_CLASS_DESC.html">it.polimi.ingsw.gc14.Controller</a></td>
<td class="coverageStat">
<span class="percent">
50%
</span>
<span class="absValue">
(1/2)
</span>
</td>
<td class="coverageStat">
<span class="percent">
45.2%
</span>
<span class="absValue">
(14/31)
</span>
</td>
<td class="coverageStat">
<span class="percent">
69.2%
</span>
<span class="absValue">
(18/26)
</span>
</td>
<td class="coverageStat">
<span class="percent">
65.6%
</span>
<span class="absValue">
(42/64)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-12/index_SORT_BY_CLASS_DESC.html">it.polimi.ingsw.gc14.View.GUI</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/8)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/130)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/291)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1000)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-11/index_SORT_BY_CLASS_DESC.html">it.polimi.ingsw.gc14.Network.TCP.Server</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/3)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/19)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/50)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/166)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-10/index_SORT_BY_CLASS_DESC.html">it.polimi.ingsw.gc14.Network.TCP.Client</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/15)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/26)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/83)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-f/index_SORT_BY_CLASS_DESC.html">it.polimi.ingsw.gc14.Network.RMI.Server</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/2)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/23)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/36)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/113)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-e/index_SORT_BY_CLASS_DESC.html">it.polimi.ingsw.gc14.Network.RMI.Client</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/2)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/18)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/14)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/68)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-d/index_SORT_BY_CLASS_DESC.html">it.polimi.ingsw.gc14.Network.NetworkEvents</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/12)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/41)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/20)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/175)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-c/index_SORT_BY_CLASS_DESC.html">it.polimi.ingsw.gc14.Network</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/4)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/20)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/28)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/64)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-1/index_SORT_BY_CLASS_DESC.html">it.polimi.ingsw.gc14</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/9)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/67)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/149)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/394)
</span>
</td>
</tr>
</table>
</div>
<script type="text/javascript">
(function() {
var msie = false, msie9 = false;
/*@cc_on
msie = true;
@if (@_jscript_version >= 9)
msie9 = true;
@end
@*/
if (!msie || msie && msie9) {
hljs.highlightAll()
hljs.initLineNumbersOnLoad();
}
})();
</script>
<div class="footer">
<div style="float:right;">generated on 2026-06-14 21:53</div>
</div>
</body>
</html>
@@ -0,0 +1,782 @@
<!DOCTYPE html>
<html id="htmlId">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Coverage Report > Summary</title>
<style type="text/css">
@import "./css/coverage.css";
@import "./css/idea.min.css";
</style>
<script type="text/javascript" src="./js/highlight.min.js"></script>
<script type="text/javascript" src="./js/highlightjs-line-numbers.min.js"></script>
</head>
<body>
<div class="content">
<div class="breadCrumbs">
Current scope: all classes
</div>
<h1>Overall Coverage Summary </h1>
<table class="coverageStats">
<tr>
<th class="name">Package</th>
<th class="coverageStat
">
Class, %
</th>
<th class="coverageStat
">
Method, %
</th>
<th class="coverageStat
">
Branch, %
</th>
<th class="coverageStat
">
Line, %
</th>
</tr>
<tr>
<td class="name">all classes</td>
<td class="coverageStat">
<span class="percent">
50.6%
</span>
<span class="absValue">
(45/89)
</span>
</td>
<td class="coverageStat">
<span class="percent">
45.4%
</span>
<span class="absValue">
(333/734)
</span>
</td>
<td class="coverageStat">
<span class="percent">
43.2%
</span>
<span class="absValue">
(664/1536)
</span>
</td>
<td class="coverageStat">
<span class="percent">
36%
</span>
<span class="absValue">
(1326/3684)
</span>
</td>
</tr>
</table>
<br/>
<h2>Coverage Breakdown</h2>
<table class="coverageStats">
<tr>
<th class="name
">
<a href="index.html">Package</a> </th>
<th class="coverageStat
">
<a href="index_SORT_BY_CLASS.html">Class, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_METHOD.html">Method, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_BLOCK.html">Branch, %</a>
</th>
<th class="coverageStat sortedAsc
">
<a href="index_SORT_BY_LINE_DESC.html">Line, %</a>
</th>
</tr>
<tr>
<td class="name"><a href="ns-1/index_SORT_BY_LINE.html">it.polimi.ingsw.gc14</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/9)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/67)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/149)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/394)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-c/index_SORT_BY_LINE.html">it.polimi.ingsw.gc14.Network</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/4)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/20)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/28)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/64)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-d/index_SORT_BY_LINE.html">it.polimi.ingsw.gc14.Network.NetworkEvents</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/12)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/41)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/20)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/175)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-e/index_SORT_BY_LINE.html">it.polimi.ingsw.gc14.Network.RMI.Client</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/2)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/18)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/14)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/68)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-f/index_SORT_BY_LINE.html">it.polimi.ingsw.gc14.Network.RMI.Server</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/2)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/23)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/36)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/113)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-10/index_SORT_BY_LINE.html">it.polimi.ingsw.gc14.Network.TCP.Client</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/15)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/26)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/83)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-11/index_SORT_BY_LINE.html">it.polimi.ingsw.gc14.Network.TCP.Server</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/3)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/19)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/50)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/166)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-12/index_SORT_BY_LINE.html">it.polimi.ingsw.gc14.View.GUI</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/8)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/130)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/291)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1000)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-13/index_SORT_BY_LINE.html">it.polimi.ingsw.gc14.View.TUI</a></td>
<td class="coverageStat">
<span class="percent">
66.7%
</span>
<span class="absValue">
(2/3)
</span>
</td>
<td class="coverageStat">
<span class="percent">
53.3%
</span>
<span class="absValue">
(24/45)
</span>
</td>
<td class="coverageStat">
<span class="percent">
26.7%
</span>
<span class="absValue">
(40/150)
</span>
</td>
<td class="coverageStat">
<span class="percent">
38.7%
</span>
<span class="absValue">
(84/217)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-2/index_SORT_BY_LINE.html">it.polimi.ingsw.gc14.Controller</a></td>
<td class="coverageStat">
<span class="percent">
50%
</span>
<span class="absValue">
(1/2)
</span>
</td>
<td class="coverageStat">
<span class="percent">
45.2%
</span>
<span class="absValue">
(14/31)
</span>
</td>
<td class="coverageStat">
<span class="percent">
69.2%
</span>
<span class="absValue">
(18/26)
</span>
</td>
<td class="coverageStat">
<span class="percent">
65.6%
</span>
<span class="absValue">
(42/64)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-3/index_SORT_BY_LINE.html">it.polimi.ingsw.gc14.Model</a></td>
<td class="coverageStat">
<span class="percent">
90.9%
</span>
<span class="absValue">
(10/11)
</span>
</td>
<td class="coverageStat">
<span class="percent">
77.6%
</span>
<span class="absValue">
(97/125)
</span>
</td>
<td class="coverageStat">
<span class="percent">
73.5%
</span>
<span class="absValue">
(349/475)
</span>
</td>
<td class="coverageStat">
<span class="percent">
82%
</span>
<span class="absValue">
(547/667)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-a/index_SORT_BY_LINE.html">it.polimi.ingsw.gc14.Model.GamePackage</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(3/3)
</span>
</td>
<td class="coverageStat">
<span class="percent">
94.3%
</span>
<span class="absValue">
(33/35)
</span>
</td>
<td class="coverageStat">
<span class="percent">
96.9%
</span>
<span class="absValue">
(31/32)
</span>
</td>
<td class="coverageStat">
<span class="percent">
88.2%
</span>
<span class="absValue">
(120/136)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-b/index_SORT_BY_LINE.html">it.polimi.ingsw.gc14.Model.Orders</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(5/5)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(17/17)
</span>
</td>
<td class="coverageStat">
<span class="percent">
88.2%
</span>
<span class="absValue">
(67/76)
</span>
</td>
<td class="coverageStat">
<span class="percent">
96.5%
</span>
<span class="absValue">
(111/115)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-4/index_SORT_BY_LINE.html">it.polimi.ingsw.gc14.Model.Cards</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(2/2)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(20/20)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(25/25)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(58/58)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-5/index_SORT_BY_LINE.html">it.polimi.ingsw.gc14.Model.Cards.Building</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(1/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(2/2)
</span>
</td>
<td class="coverageStat"/>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(7/7)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-6/index_SORT_BY_LINE.html">it.polimi.ingsw.gc14.Model.Cards.Building.Effects</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(7/7)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(38/38)
</span>
</td>
<td class="coverageStat">
<span class="percent">
92%
</span>
<span class="absValue">
(46/50)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(129/129)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-7/index_SORT_BY_LINE.html">it.polimi.ingsw.gc14.Model.Cards.TribeCards</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(4/4)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(15/15)
</span>
</td>
<td class="coverageStat"/>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(29/29)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-8/index_SORT_BY_LINE.html">it.polimi.ingsw.gc14.Model.Cards.TribeCards.Characters</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(6/6)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(49/49)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(40/40)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(108/108)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-9/index_SORT_BY_LINE.html">it.polimi.ingsw.gc14.Model.Cards.TribeCards.Events</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(4/4)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(24/24)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(48/48)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(91/91)
</span>
</td>
</tr>
</table>
</div>
<script type="text/javascript">
(function() {
var msie = false, msie9 = false;
/*@cc_on
msie = true;
@if (@_jscript_version >= 9)
msie9 = true;
@end
@*/
if (!msie || msie && msie9) {
hljs.highlightAll()
hljs.initLineNumbersOnLoad();
}
})();
</script>
<div class="footer">
<div style="float:right;">generated on 2026-06-14 21:53</div>
</div>
</body>
</html>
@@ -0,0 +1,782 @@
<!DOCTYPE html>
<html id="htmlId">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Coverage Report > Summary</title>
<style type="text/css">
@import "./css/coverage.css";
@import "./css/idea.min.css";
</style>
<script type="text/javascript" src="./js/highlight.min.js"></script>
<script type="text/javascript" src="./js/highlightjs-line-numbers.min.js"></script>
</head>
<body>
<div class="content">
<div class="breadCrumbs">
Current scope: all classes
</div>
<h1>Overall Coverage Summary </h1>
<table class="coverageStats">
<tr>
<th class="name">Package</th>
<th class="coverageStat
">
Class, %
</th>
<th class="coverageStat
">
Method, %
</th>
<th class="coverageStat
">
Branch, %
</th>
<th class="coverageStat
">
Line, %
</th>
</tr>
<tr>
<td class="name">all classes</td>
<td class="coverageStat">
<span class="percent">
50.6%
</span>
<span class="absValue">
(45/89)
</span>
</td>
<td class="coverageStat">
<span class="percent">
45.4%
</span>
<span class="absValue">
(333/734)
</span>
</td>
<td class="coverageStat">
<span class="percent">
43.2%
</span>
<span class="absValue">
(664/1536)
</span>
</td>
<td class="coverageStat">
<span class="percent">
36%
</span>
<span class="absValue">
(1326/3684)
</span>
</td>
</tr>
</table>
<br/>
<h2>Coverage Breakdown</h2>
<table class="coverageStats">
<tr>
<th class="name
">
<a href="index.html">Package</a> </th>
<th class="coverageStat
">
<a href="index_SORT_BY_CLASS.html">Class, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_METHOD.html">Method, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_BLOCK.html">Branch, %</a>
</th>
<th class="coverageStat sortedDesc
">
<a href="index_SORT_BY_LINE.html">Line, %</a>
</th>
</tr>
<tr>
<td class="name"><a href="ns-9/index_SORT_BY_LINE_DESC.html">it.polimi.ingsw.gc14.Model.Cards.TribeCards.Events</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(4/4)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(24/24)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(48/48)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(91/91)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-8/index_SORT_BY_LINE_DESC.html">it.polimi.ingsw.gc14.Model.Cards.TribeCards.Characters</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(6/6)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(49/49)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(40/40)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(108/108)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-7/index_SORT_BY_LINE_DESC.html">it.polimi.ingsw.gc14.Model.Cards.TribeCards</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(4/4)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(15/15)
</span>
</td>
<td class="coverageStat"/>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(29/29)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-6/index_SORT_BY_LINE_DESC.html">it.polimi.ingsw.gc14.Model.Cards.Building.Effects</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(7/7)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(38/38)
</span>
</td>
<td class="coverageStat">
<span class="percent">
92%
</span>
<span class="absValue">
(46/50)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(129/129)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-5/index_SORT_BY_LINE_DESC.html">it.polimi.ingsw.gc14.Model.Cards.Building</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(1/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(2/2)
</span>
</td>
<td class="coverageStat"/>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(7/7)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-4/index_SORT_BY_LINE_DESC.html">it.polimi.ingsw.gc14.Model.Cards</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(2/2)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(20/20)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(25/25)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(58/58)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-b/index_SORT_BY_LINE_DESC.html">it.polimi.ingsw.gc14.Model.Orders</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(5/5)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(17/17)
</span>
</td>
<td class="coverageStat">
<span class="percent">
88.2%
</span>
<span class="absValue">
(67/76)
</span>
</td>
<td class="coverageStat">
<span class="percent">
96.5%
</span>
<span class="absValue">
(111/115)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-a/index_SORT_BY_LINE_DESC.html">it.polimi.ingsw.gc14.Model.GamePackage</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(3/3)
</span>
</td>
<td class="coverageStat">
<span class="percent">
94.3%
</span>
<span class="absValue">
(33/35)
</span>
</td>
<td class="coverageStat">
<span class="percent">
96.9%
</span>
<span class="absValue">
(31/32)
</span>
</td>
<td class="coverageStat">
<span class="percent">
88.2%
</span>
<span class="absValue">
(120/136)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-3/index_SORT_BY_LINE_DESC.html">it.polimi.ingsw.gc14.Model</a></td>
<td class="coverageStat">
<span class="percent">
90.9%
</span>
<span class="absValue">
(10/11)
</span>
</td>
<td class="coverageStat">
<span class="percent">
77.6%
</span>
<span class="absValue">
(97/125)
</span>
</td>
<td class="coverageStat">
<span class="percent">
73.5%
</span>
<span class="absValue">
(349/475)
</span>
</td>
<td class="coverageStat">
<span class="percent">
82%
</span>
<span class="absValue">
(547/667)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-2/index_SORT_BY_LINE_DESC.html">it.polimi.ingsw.gc14.Controller</a></td>
<td class="coverageStat">
<span class="percent">
50%
</span>
<span class="absValue">
(1/2)
</span>
</td>
<td class="coverageStat">
<span class="percent">
45.2%
</span>
<span class="absValue">
(14/31)
</span>
</td>
<td class="coverageStat">
<span class="percent">
69.2%
</span>
<span class="absValue">
(18/26)
</span>
</td>
<td class="coverageStat">
<span class="percent">
65.6%
</span>
<span class="absValue">
(42/64)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-13/index_SORT_BY_LINE_DESC.html">it.polimi.ingsw.gc14.View.TUI</a></td>
<td class="coverageStat">
<span class="percent">
66.7%
</span>
<span class="absValue">
(2/3)
</span>
</td>
<td class="coverageStat">
<span class="percent">
53.3%
</span>
<span class="absValue">
(24/45)
</span>
</td>
<td class="coverageStat">
<span class="percent">
26.7%
</span>
<span class="absValue">
(40/150)
</span>
</td>
<td class="coverageStat">
<span class="percent">
38.7%
</span>
<span class="absValue">
(84/217)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-12/index_SORT_BY_LINE_DESC.html">it.polimi.ingsw.gc14.View.GUI</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/8)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/130)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/291)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1000)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-11/index_SORT_BY_LINE_DESC.html">it.polimi.ingsw.gc14.Network.TCP.Server</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/3)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/19)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/50)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/166)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-10/index_SORT_BY_LINE_DESC.html">it.polimi.ingsw.gc14.Network.TCP.Client</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/15)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/26)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/83)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-f/index_SORT_BY_LINE_DESC.html">it.polimi.ingsw.gc14.Network.RMI.Server</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/2)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/23)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/36)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/113)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-e/index_SORT_BY_LINE_DESC.html">it.polimi.ingsw.gc14.Network.RMI.Client</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/2)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/18)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/14)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/68)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-d/index_SORT_BY_LINE_DESC.html">it.polimi.ingsw.gc14.Network.NetworkEvents</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/12)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/41)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/20)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/175)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-c/index_SORT_BY_LINE_DESC.html">it.polimi.ingsw.gc14.Network</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/4)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/20)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/28)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/64)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-1/index_SORT_BY_LINE_DESC.html">it.polimi.ingsw.gc14</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/9)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/67)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/149)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/394)
</span>
</td>
</tr>
</table>
</div>
<script type="text/javascript">
(function() {
var msie = false, msie9 = false;
/*@cc_on
msie = true;
@if (@_jscript_version >= 9)
msie9 = true;
@end
@*/
if (!msie || msie && msie9) {
hljs.highlightAll()
hljs.initLineNumbersOnLoad();
}
})();
</script>
<div class="footer">
<div style="float:right;">generated on 2026-06-14 21:53</div>
</div>
</body>
</html>
@@ -0,0 +1,782 @@
<!DOCTYPE html>
<html id="htmlId">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Coverage Report > Summary</title>
<style type="text/css">
@import "./css/coverage.css";
@import "./css/idea.min.css";
</style>
<script type="text/javascript" src="./js/highlight.min.js"></script>
<script type="text/javascript" src="./js/highlightjs-line-numbers.min.js"></script>
</head>
<body>
<div class="content">
<div class="breadCrumbs">
Current scope: all classes
</div>
<h1>Overall Coverage Summary </h1>
<table class="coverageStats">
<tr>
<th class="name">Package</th>
<th class="coverageStat
">
Class, %
</th>
<th class="coverageStat
">
Method, %
</th>
<th class="coverageStat
">
Branch, %
</th>
<th class="coverageStat
">
Line, %
</th>
</tr>
<tr>
<td class="name">all classes</td>
<td class="coverageStat">
<span class="percent">
50.6%
</span>
<span class="absValue">
(45/89)
</span>
</td>
<td class="coverageStat">
<span class="percent">
45.4%
</span>
<span class="absValue">
(333/734)
</span>
</td>
<td class="coverageStat">
<span class="percent">
43.2%
</span>
<span class="absValue">
(664/1536)
</span>
</td>
<td class="coverageStat">
<span class="percent">
36%
</span>
<span class="absValue">
(1326/3684)
</span>
</td>
</tr>
</table>
<br/>
<h2>Coverage Breakdown</h2>
<table class="coverageStats">
<tr>
<th class="name
">
<a href="index.html">Package</a> </th>
<th class="coverageStat
">
<a href="index_SORT_BY_CLASS.html">Class, %</a>
</th>
<th class="coverageStat sortedAsc
">
<a href="index_SORT_BY_METHOD_DESC.html">Method, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_BLOCK.html">Branch, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_LINE.html">Line, %</a>
</th>
</tr>
<tr>
<td class="name"><a href="ns-1/index_SORT_BY_METHOD.html">it.polimi.ingsw.gc14</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/9)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/67)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/149)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/394)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-c/index_SORT_BY_METHOD.html">it.polimi.ingsw.gc14.Network</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/4)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/20)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/28)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/64)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-d/index_SORT_BY_METHOD.html">it.polimi.ingsw.gc14.Network.NetworkEvents</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/12)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/41)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/20)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/175)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-e/index_SORT_BY_METHOD.html">it.polimi.ingsw.gc14.Network.RMI.Client</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/2)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/18)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/14)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/68)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-f/index_SORT_BY_METHOD.html">it.polimi.ingsw.gc14.Network.RMI.Server</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/2)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/23)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/36)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/113)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-10/index_SORT_BY_METHOD.html">it.polimi.ingsw.gc14.Network.TCP.Client</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/15)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/26)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/83)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-11/index_SORT_BY_METHOD.html">it.polimi.ingsw.gc14.Network.TCP.Server</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/3)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/19)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/50)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/166)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-12/index_SORT_BY_METHOD.html">it.polimi.ingsw.gc14.View.GUI</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/8)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/130)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/291)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1000)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-2/index_SORT_BY_METHOD.html">it.polimi.ingsw.gc14.Controller</a></td>
<td class="coverageStat">
<span class="percent">
50%
</span>
<span class="absValue">
(1/2)
</span>
</td>
<td class="coverageStat">
<span class="percent">
45.2%
</span>
<span class="absValue">
(14/31)
</span>
</td>
<td class="coverageStat">
<span class="percent">
69.2%
</span>
<span class="absValue">
(18/26)
</span>
</td>
<td class="coverageStat">
<span class="percent">
65.6%
</span>
<span class="absValue">
(42/64)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-13/index_SORT_BY_METHOD.html">it.polimi.ingsw.gc14.View.TUI</a></td>
<td class="coverageStat">
<span class="percent">
66.7%
</span>
<span class="absValue">
(2/3)
</span>
</td>
<td class="coverageStat">
<span class="percent">
53.3%
</span>
<span class="absValue">
(24/45)
</span>
</td>
<td class="coverageStat">
<span class="percent">
26.7%
</span>
<span class="absValue">
(40/150)
</span>
</td>
<td class="coverageStat">
<span class="percent">
38.7%
</span>
<span class="absValue">
(84/217)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-3/index_SORT_BY_METHOD.html">it.polimi.ingsw.gc14.Model</a></td>
<td class="coverageStat">
<span class="percent">
90.9%
</span>
<span class="absValue">
(10/11)
</span>
</td>
<td class="coverageStat">
<span class="percent">
77.6%
</span>
<span class="absValue">
(97/125)
</span>
</td>
<td class="coverageStat">
<span class="percent">
73.5%
</span>
<span class="absValue">
(349/475)
</span>
</td>
<td class="coverageStat">
<span class="percent">
82%
</span>
<span class="absValue">
(547/667)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-a/index_SORT_BY_METHOD.html">it.polimi.ingsw.gc14.Model.GamePackage</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(3/3)
</span>
</td>
<td class="coverageStat">
<span class="percent">
94.3%
</span>
<span class="absValue">
(33/35)
</span>
</td>
<td class="coverageStat">
<span class="percent">
96.9%
</span>
<span class="absValue">
(31/32)
</span>
</td>
<td class="coverageStat">
<span class="percent">
88.2%
</span>
<span class="absValue">
(120/136)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-4/index_SORT_BY_METHOD.html">it.polimi.ingsw.gc14.Model.Cards</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(2/2)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(20/20)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(25/25)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(58/58)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-5/index_SORT_BY_METHOD.html">it.polimi.ingsw.gc14.Model.Cards.Building</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(1/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(2/2)
</span>
</td>
<td class="coverageStat"/>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(7/7)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-6/index_SORT_BY_METHOD.html">it.polimi.ingsw.gc14.Model.Cards.Building.Effects</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(7/7)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(38/38)
</span>
</td>
<td class="coverageStat">
<span class="percent">
92%
</span>
<span class="absValue">
(46/50)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(129/129)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-7/index_SORT_BY_METHOD.html">it.polimi.ingsw.gc14.Model.Cards.TribeCards</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(4/4)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(15/15)
</span>
</td>
<td class="coverageStat"/>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(29/29)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-8/index_SORT_BY_METHOD.html">it.polimi.ingsw.gc14.Model.Cards.TribeCards.Characters</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(6/6)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(49/49)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(40/40)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(108/108)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-9/index_SORT_BY_METHOD.html">it.polimi.ingsw.gc14.Model.Cards.TribeCards.Events</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(4/4)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(24/24)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(48/48)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(91/91)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-b/index_SORT_BY_METHOD.html">it.polimi.ingsw.gc14.Model.Orders</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(5/5)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(17/17)
</span>
</td>
<td class="coverageStat">
<span class="percent">
88.2%
</span>
<span class="absValue">
(67/76)
</span>
</td>
<td class="coverageStat">
<span class="percent">
96.5%
</span>
<span class="absValue">
(111/115)
</span>
</td>
</tr>
</table>
</div>
<script type="text/javascript">
(function() {
var msie = false, msie9 = false;
/*@cc_on
msie = true;
@if (@_jscript_version >= 9)
msie9 = true;
@end
@*/
if (!msie || msie && msie9) {
hljs.highlightAll()
hljs.initLineNumbersOnLoad();
}
})();
</script>
<div class="footer">
<div style="float:right;">generated on 2026-06-14 21:53</div>
</div>
</body>
</html>
@@ -0,0 +1,782 @@
<!DOCTYPE html>
<html id="htmlId">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Coverage Report > Summary</title>
<style type="text/css">
@import "./css/coverage.css";
@import "./css/idea.min.css";
</style>
<script type="text/javascript" src="./js/highlight.min.js"></script>
<script type="text/javascript" src="./js/highlightjs-line-numbers.min.js"></script>
</head>
<body>
<div class="content">
<div class="breadCrumbs">
Current scope: all classes
</div>
<h1>Overall Coverage Summary </h1>
<table class="coverageStats">
<tr>
<th class="name">Package</th>
<th class="coverageStat
">
Class, %
</th>
<th class="coverageStat
">
Method, %
</th>
<th class="coverageStat
">
Branch, %
</th>
<th class="coverageStat
">
Line, %
</th>
</tr>
<tr>
<td class="name">all classes</td>
<td class="coverageStat">
<span class="percent">
50.6%
</span>
<span class="absValue">
(45/89)
</span>
</td>
<td class="coverageStat">
<span class="percent">
45.4%
</span>
<span class="absValue">
(333/734)
</span>
</td>
<td class="coverageStat">
<span class="percent">
43.2%
</span>
<span class="absValue">
(664/1536)
</span>
</td>
<td class="coverageStat">
<span class="percent">
36%
</span>
<span class="absValue">
(1326/3684)
</span>
</td>
</tr>
</table>
<br/>
<h2>Coverage Breakdown</h2>
<table class="coverageStats">
<tr>
<th class="name
">
<a href="index.html">Package</a> </th>
<th class="coverageStat
">
<a href="index_SORT_BY_CLASS.html">Class, %</a>
</th>
<th class="coverageStat sortedDesc
">
<a href="index_SORT_BY_METHOD.html">Method, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_BLOCK.html">Branch, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_LINE.html">Line, %</a>
</th>
</tr>
<tr>
<td class="name"><a href="ns-b/index_SORT_BY_METHOD_DESC.html">it.polimi.ingsw.gc14.Model.Orders</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(5/5)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(17/17)
</span>
</td>
<td class="coverageStat">
<span class="percent">
88.2%
</span>
<span class="absValue">
(67/76)
</span>
</td>
<td class="coverageStat">
<span class="percent">
96.5%
</span>
<span class="absValue">
(111/115)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-9/index_SORT_BY_METHOD_DESC.html">it.polimi.ingsw.gc14.Model.Cards.TribeCards.Events</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(4/4)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(24/24)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(48/48)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(91/91)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-8/index_SORT_BY_METHOD_DESC.html">it.polimi.ingsw.gc14.Model.Cards.TribeCards.Characters</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(6/6)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(49/49)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(40/40)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(108/108)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-7/index_SORT_BY_METHOD_DESC.html">it.polimi.ingsw.gc14.Model.Cards.TribeCards</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(4/4)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(15/15)
</span>
</td>
<td class="coverageStat"/>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(29/29)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-6/index_SORT_BY_METHOD_DESC.html">it.polimi.ingsw.gc14.Model.Cards.Building.Effects</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(7/7)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(38/38)
</span>
</td>
<td class="coverageStat">
<span class="percent">
92%
</span>
<span class="absValue">
(46/50)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(129/129)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-5/index_SORT_BY_METHOD_DESC.html">it.polimi.ingsw.gc14.Model.Cards.Building</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(1/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(2/2)
</span>
</td>
<td class="coverageStat"/>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(7/7)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-4/index_SORT_BY_METHOD_DESC.html">it.polimi.ingsw.gc14.Model.Cards</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(2/2)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(20/20)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(25/25)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(58/58)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-a/index_SORT_BY_METHOD_DESC.html">it.polimi.ingsw.gc14.Model.GamePackage</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(3/3)
</span>
</td>
<td class="coverageStat">
<span class="percent">
94.3%
</span>
<span class="absValue">
(33/35)
</span>
</td>
<td class="coverageStat">
<span class="percent">
96.9%
</span>
<span class="absValue">
(31/32)
</span>
</td>
<td class="coverageStat">
<span class="percent">
88.2%
</span>
<span class="absValue">
(120/136)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-3/index_SORT_BY_METHOD_DESC.html">it.polimi.ingsw.gc14.Model</a></td>
<td class="coverageStat">
<span class="percent">
90.9%
</span>
<span class="absValue">
(10/11)
</span>
</td>
<td class="coverageStat">
<span class="percent">
77.6%
</span>
<span class="absValue">
(97/125)
</span>
</td>
<td class="coverageStat">
<span class="percent">
73.5%
</span>
<span class="absValue">
(349/475)
</span>
</td>
<td class="coverageStat">
<span class="percent">
82%
</span>
<span class="absValue">
(547/667)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-13/index_SORT_BY_METHOD_DESC.html">it.polimi.ingsw.gc14.View.TUI</a></td>
<td class="coverageStat">
<span class="percent">
66.7%
</span>
<span class="absValue">
(2/3)
</span>
</td>
<td class="coverageStat">
<span class="percent">
53.3%
</span>
<span class="absValue">
(24/45)
</span>
</td>
<td class="coverageStat">
<span class="percent">
26.7%
</span>
<span class="absValue">
(40/150)
</span>
</td>
<td class="coverageStat">
<span class="percent">
38.7%
</span>
<span class="absValue">
(84/217)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-2/index_SORT_BY_METHOD_DESC.html">it.polimi.ingsw.gc14.Controller</a></td>
<td class="coverageStat">
<span class="percent">
50%
</span>
<span class="absValue">
(1/2)
</span>
</td>
<td class="coverageStat">
<span class="percent">
45.2%
</span>
<span class="absValue">
(14/31)
</span>
</td>
<td class="coverageStat">
<span class="percent">
69.2%
</span>
<span class="absValue">
(18/26)
</span>
</td>
<td class="coverageStat">
<span class="percent">
65.6%
</span>
<span class="absValue">
(42/64)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-12/index_SORT_BY_METHOD_DESC.html">it.polimi.ingsw.gc14.View.GUI</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/8)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/130)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/291)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1000)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-11/index_SORT_BY_METHOD_DESC.html">it.polimi.ingsw.gc14.Network.TCP.Server</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/3)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/19)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/50)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/166)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-10/index_SORT_BY_METHOD_DESC.html">it.polimi.ingsw.gc14.Network.TCP.Client</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/15)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/26)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/83)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-f/index_SORT_BY_METHOD_DESC.html">it.polimi.ingsw.gc14.Network.RMI.Server</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/2)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/23)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/36)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/113)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-e/index_SORT_BY_METHOD_DESC.html">it.polimi.ingsw.gc14.Network.RMI.Client</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/2)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/18)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/14)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/68)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-d/index_SORT_BY_METHOD_DESC.html">it.polimi.ingsw.gc14.Network.NetworkEvents</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/12)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/41)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/20)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/175)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-c/index_SORT_BY_METHOD_DESC.html">it.polimi.ingsw.gc14.Network</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/4)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/20)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/28)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/64)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-1/index_SORT_BY_METHOD_DESC.html">it.polimi.ingsw.gc14</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/9)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/67)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/149)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/394)
</span>
</td>
</tr>
</table>
</div>
<script type="text/javascript">
(function() {
var msie = false, msie9 = false;
/*@cc_on
msie = true;
@if (@_jscript_version >= 9)
msie9 = true;
@end
@*/
if (!msie || msie && msie9) {
hljs.highlightAll()
hljs.initLineNumbersOnLoad();
}
})();
</script>
<div class="footer">
<div style="float:right;">generated on 2026-06-14 21:53</div>
</div>
</body>
</html>
@@ -0,0 +1,782 @@
<!DOCTYPE html>
<html id="htmlId">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Coverage Report > Summary</title>
<style type="text/css">
@import "./css/coverage.css";
@import "./css/idea.min.css";
</style>
<script type="text/javascript" src="./js/highlight.min.js"></script>
<script type="text/javascript" src="./js/highlightjs-line-numbers.min.js"></script>
</head>
<body>
<div class="content">
<div class="breadCrumbs">
Current scope: all classes
</div>
<h1>Overall Coverage Summary </h1>
<table class="coverageStats">
<tr>
<th class="name">Package</th>
<th class="coverageStat
">
Class, %
</th>
<th class="coverageStat
">
Method, %
</th>
<th class="coverageStat
">
Branch, %
</th>
<th class="coverageStat
">
Line, %
</th>
</tr>
<tr>
<td class="name">all classes</td>
<td class="coverageStat">
<span class="percent">
50.6%
</span>
<span class="absValue">
(45/89)
</span>
</td>
<td class="coverageStat">
<span class="percent">
45.4%
</span>
<span class="absValue">
(333/734)
</span>
</td>
<td class="coverageStat">
<span class="percent">
43.2%
</span>
<span class="absValue">
(664/1536)
</span>
</td>
<td class="coverageStat">
<span class="percent">
36%
</span>
<span class="absValue">
(1326/3684)
</span>
</td>
</tr>
</table>
<br/>
<h2>Coverage Breakdown</h2>
<table class="coverageStats">
<tr>
<th class="name sortedDesc
">
<a href="index.html">Package</a> </th>
<th class="coverageStat
">
<a href="index_SORT_BY_CLASS.html">Class, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_METHOD.html">Method, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_BLOCK.html">Branch, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_LINE.html">Line, %</a>
</th>
</tr>
<tr>
<td class="name"><a href="ns-13/index_SORT_BY_NAME_DESC.html">it.polimi.ingsw.gc14.View.TUI</a></td>
<td class="coverageStat">
<span class="percent">
66.7%
</span>
<span class="absValue">
(2/3)
</span>
</td>
<td class="coverageStat">
<span class="percent">
53.3%
</span>
<span class="absValue">
(24/45)
</span>
</td>
<td class="coverageStat">
<span class="percent">
26.7%
</span>
<span class="absValue">
(40/150)
</span>
</td>
<td class="coverageStat">
<span class="percent">
38.7%
</span>
<span class="absValue">
(84/217)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-12/index_SORT_BY_NAME_DESC.html">it.polimi.ingsw.gc14.View.GUI</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/8)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/130)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/291)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1000)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-11/index_SORT_BY_NAME_DESC.html">it.polimi.ingsw.gc14.Network.TCP.Server</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/3)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/19)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/50)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/166)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-10/index_SORT_BY_NAME_DESC.html">it.polimi.ingsw.gc14.Network.TCP.Client</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/15)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/26)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/83)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-f/index_SORT_BY_NAME_DESC.html">it.polimi.ingsw.gc14.Network.RMI.Server</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/2)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/23)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/36)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/113)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-e/index_SORT_BY_NAME_DESC.html">it.polimi.ingsw.gc14.Network.RMI.Client</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/2)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/18)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/14)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/68)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-d/index_SORT_BY_NAME_DESC.html">it.polimi.ingsw.gc14.Network.NetworkEvents</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/12)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/41)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/20)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/175)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-c/index_SORT_BY_NAME_DESC.html">it.polimi.ingsw.gc14.Network</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/4)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/20)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/28)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/64)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-b/index_SORT_BY_NAME_DESC.html">it.polimi.ingsw.gc14.Model.Orders</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(5/5)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(17/17)
</span>
</td>
<td class="coverageStat">
<span class="percent">
88.2%
</span>
<span class="absValue">
(67/76)
</span>
</td>
<td class="coverageStat">
<span class="percent">
96.5%
</span>
<span class="absValue">
(111/115)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-a/index_SORT_BY_NAME_DESC.html">it.polimi.ingsw.gc14.Model.GamePackage</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(3/3)
</span>
</td>
<td class="coverageStat">
<span class="percent">
94.3%
</span>
<span class="absValue">
(33/35)
</span>
</td>
<td class="coverageStat">
<span class="percent">
96.9%
</span>
<span class="absValue">
(31/32)
</span>
</td>
<td class="coverageStat">
<span class="percent">
88.2%
</span>
<span class="absValue">
(120/136)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-9/index_SORT_BY_NAME_DESC.html">it.polimi.ingsw.gc14.Model.Cards.TribeCards.Events</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(4/4)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(24/24)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(48/48)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(91/91)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-8/index_SORT_BY_NAME_DESC.html">it.polimi.ingsw.gc14.Model.Cards.TribeCards.Characters</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(6/6)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(49/49)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(40/40)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(108/108)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-7/index_SORT_BY_NAME_DESC.html">it.polimi.ingsw.gc14.Model.Cards.TribeCards</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(4/4)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(15/15)
</span>
</td>
<td class="coverageStat"/>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(29/29)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-6/index_SORT_BY_NAME_DESC.html">it.polimi.ingsw.gc14.Model.Cards.Building.Effects</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(7/7)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(38/38)
</span>
</td>
<td class="coverageStat">
<span class="percent">
92%
</span>
<span class="absValue">
(46/50)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(129/129)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-5/index_SORT_BY_NAME_DESC.html">it.polimi.ingsw.gc14.Model.Cards.Building</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(1/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(2/2)
</span>
</td>
<td class="coverageStat"/>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(7/7)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-4/index_SORT_BY_NAME_DESC.html">it.polimi.ingsw.gc14.Model.Cards</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(2/2)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(20/20)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(25/25)
</span>
</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(58/58)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-3/index_SORT_BY_NAME_DESC.html">it.polimi.ingsw.gc14.Model</a></td>
<td class="coverageStat">
<span class="percent">
90.9%
</span>
<span class="absValue">
(10/11)
</span>
</td>
<td class="coverageStat">
<span class="percent">
77.6%
</span>
<span class="absValue">
(97/125)
</span>
</td>
<td class="coverageStat">
<span class="percent">
73.5%
</span>
<span class="absValue">
(349/475)
</span>
</td>
<td class="coverageStat">
<span class="percent">
82%
</span>
<span class="absValue">
(547/667)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-2/index_SORT_BY_NAME_DESC.html">it.polimi.ingsw.gc14.Controller</a></td>
<td class="coverageStat">
<span class="percent">
50%
</span>
<span class="absValue">
(1/2)
</span>
</td>
<td class="coverageStat">
<span class="percent">
45.2%
</span>
<span class="absValue">
(14/31)
</span>
</td>
<td class="coverageStat">
<span class="percent">
69.2%
</span>
<span class="absValue">
(18/26)
</span>
</td>
<td class="coverageStat">
<span class="percent">
65.6%
</span>
<span class="absValue">
(42/64)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="ns-1/index_SORT_BY_NAME_DESC.html">it.polimi.ingsw.gc14</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/9)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/67)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/149)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/394)
</span>
</td>
</tr>
</table>
</div>
<script type="text/javascript">
(function() {
var msie = false, msie9 = false;
/*@cc_on
msie = true;
@if (@_jscript_version >= 9)
msie9 = true;
@end
@*/
if (!msie || msie && msie9) {
hljs.highlightAll()
hljs.initLineNumbersOnLoad();
}
})();
</script>
<div class="footer">
<div style="float:right;">generated on 2026-06-14 21:53</div>
</div>
</body>
</html>
File diff suppressed because one or more lines are too long
@@ -0,0 +1,24 @@
/*
The MIT License (MIT)
Copyright (c) 2017 Yauheni Pakala
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
*/
!function(r,o){"use strict";var e,i="hljs-ln",l="hljs-ln-line",h="hljs-ln-code",s="hljs-ln-numbers",c="hljs-ln-n",m="data-line-number",a=/\r\n|\r|\n/g;function u(e){for(var n=e.toString(),t=e.anchorNode;"TD"!==t.nodeName;)t=t.parentNode;for(var r=e.focusNode;"TD"!==r.nodeName;)r=r.parentNode;var o=parseInt(t.dataset.lineNumber),a=parseInt(r.dataset.lineNumber);if(o==a)return n;var i,l=t.textContent,s=r.textContent;for(a<o&&(i=o,o=a,a=i,i=l,l=s,s=i);0!==n.indexOf(l);)l=l.slice(1);for(;-1===n.lastIndexOf(s);)s=s.slice(0,-1);for(var c=l,u=function(e){for(var n=e;"TABLE"!==n.nodeName;)n=n.parentNode;return n}(t),d=o+1;d<a;++d){var f=p('.{0}[{1}="{2}"]',[h,m,d]);c+="\n"+u.querySelector(f).textContent}return c+="\n"+s}function n(e){try{var n=o.querySelectorAll("code.hljs,code.nohighlight");for(var t in n)n.hasOwnProperty(t)&&(n[t].classList.contains("nohljsln")||d(n[t],e))}catch(e){r.console.error("LineNumbers error: ",e)}}function d(e,n){"object"==typeof e&&r.setTimeout(function(){e.innerHTML=f(e,n)},0)}function f(e,n){var t,r,o=(t=e,{singleLine:function(e){return!!e.singleLine&&e.singleLine}(r=(r=n)||{}),startFrom:function(e,n){var t=1;isFinite(n.startFrom)&&(t=n.startFrom);var r=function(e,n){return e.hasAttribute(n)?e.getAttribute(n):null}(e,"data-ln-start-from");return null!==r&&(t=function(e,n){if(!e)return n;var t=Number(e);return isFinite(t)?t:n}(r,1)),t}(t,r)});return function e(n){var t=n.childNodes;for(var r in t){var o;t.hasOwnProperty(r)&&(o=t[r],0<(o.textContent.trim().match(a)||[]).length&&(0<o.childNodes.length?e(o):v(o.parentNode)))}}(e),function(e,n){var t=g(e);""===t[t.length-1].trim()&&t.pop();if(1<t.length||n.singleLine){for(var r="",o=0,a=t.length;o<a;o++)r+=p('<tr><td class="{0} {1}" {3}="{5}"><div class="{2}" {3}="{5}"></div></td><td class="{0} {4}" {3}="{5}">{6}</td></tr>',[l,s,c,m,h,o+n.startFrom,0<t[o].length?t[o]:" "]);return p('<table class="{0}">{1}</table>',[i,r])}return e}(e.innerHTML,o)}function v(e){var n=e.className;if(/hljs-/.test(n)){for(var t=g(e.innerHTML),r=0,o="";r<t.length;r++){o+=p('<span class="{0}">{1}</span>\n',[n,0<t[r].length?t[r]:" "])}e.innerHTML=o.trim()}}function g(e){return 0===e.length?[]:e.split(a)}function p(e,t){return e.replace(/\{(\d+)\}/g,function(e,n){return void 0!==t[n]?t[n]:e})}r.hljs?(r.hljs.initLineNumbersOnLoad=function(e){"interactive"===o.readyState||"complete"===o.readyState?n(e):r.addEventListener("DOMContentLoaded",function(){n(e)})},r.hljs.lineNumbersBlock=d,r.hljs.lineNumbersValue=function(e,n){if("string"!=typeof e)return;var t=document.createElement("code");return t.innerHTML=e,f(t,n)},(e=o.createElement("style")).type="text/css",e.innerHTML=p(".{0}{border-collapse:collapse}.{0} td{padding:0}.{1}:before{content:attr({2})}",[i,c,m]),o.getElementsByTagName("head")[0].appendChild(e)):r.console.error("highlight.js not detected!"),document.addEventListener("copy",function(e){var n,t=window.getSelection();!function(e){for(var n=e;n;){if(n.className&&-1!==n.className.indexOf("hljs-ln-code"))return 1;n=n.parentNode}}(t.anchorNode)||(n=-1!==window.navigator.userAgent.indexOf("Edge")?u(t):t.toString(),e.clipboardData.setData("text/plain",n),e.preventDefault())})}(window,document);
@@ -0,0 +1,356 @@
<!DOCTYPE html>
<html id="htmlId">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Coverage Report > it.polimi.ingsw.gc14</title>
<style type="text/css">
@import "../css/coverage.css";
@import "../css/idea.min.css";
</style>
<script type="text/javascript" src="../js/highlight.min.js"></script>
<script type="text/javascript" src="../js/highlightjs-line-numbers.min.js"></script>
</head>
<body>
<div class="content">
<div class="breadCrumbs">
Current scope: <a href="../index.html">all classes</a>
<span class="separator">|</span>
it.polimi.ingsw.gc14</div>
<h1>Coverage Summary for Package: it.polimi.ingsw.gc14</h1>
<table class="coverageStats">
<tr>
<th class="name">Package</th>
<th class="coverageStat
">
Class, %
</th>
<th class="coverageStat
">
Method, %
</th>
<th class="coverageStat
">
Branch, %
</th>
<th class="coverageStat
">
Line, %
</th>
</tr>
<tr>
<td class="name">it.polimi.ingsw.gc14</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/9)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/67)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/149)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/394)
</span>
</td>
</tr>
</table>
<br/>
<br/>
<table class="coverageStats">
<tr>
<th class="name sortedAsc
">
<a href="index_SORT_BY_NAME_DESC.html">Class</a> </th>
<th class="coverageStat
">
<a href="index_SORT_BY_CLASS.html">Class, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_METHOD.html">Method, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_BLOCK.html">Branch, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_LINE.html">Line, %</a>
</th>
</tr>
<tr>
<td class="name"><a href="sources/source-1.html">ClientLauncherGUI</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/2)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/4)
</span>
</td>
<td class="coverageStat"/>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/9)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-2.html">ClientLauncherTUI</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/11)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/67)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/142)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-3.html">ErrorType</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/4)
</span>
</td>
<td class="coverageStat"/>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/12)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-4.html">GameEventProcessor</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/2)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/20)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/48)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/108)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-5.html">LimitedMap</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/16)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/10)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/28)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-6.html">SaveManager</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/4)
</span>
</td>
<td class="coverageStat"/>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/23)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-7.html">ServerLauncher</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/8)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/24)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/72)
</span>
</td>
</tr>
</table>
</div>
<script type="text/javascript">
(function() {
var msie = false, msie9 = false;
/*@cc_on
msie = true;
@if (@_jscript_version >= 9)
msie9 = true;
@end
@*/
if (!msie || msie && msie9) {
hljs.highlightAll()
hljs.initLineNumbersOnLoad();
}
})();
</script>
<div class="footer">
<div style="float:right;">generated on 2026-06-14 21:53</div>
</div>
</body>
</html>
@@ -0,0 +1,356 @@
<!DOCTYPE html>
<html id="htmlId">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Coverage Report > it.polimi.ingsw.gc14</title>
<style type="text/css">
@import "../css/coverage.css";
@import "../css/idea.min.css";
</style>
<script type="text/javascript" src="../js/highlight.min.js"></script>
<script type="text/javascript" src="../js/highlightjs-line-numbers.min.js"></script>
</head>
<body>
<div class="content">
<div class="breadCrumbs">
Current scope: <a href="../index_SORT_BY_BLOCK.html">all classes</a>
<span class="separator">|</span>
it.polimi.ingsw.gc14</div>
<h1>Coverage Summary for Package: it.polimi.ingsw.gc14</h1>
<table class="coverageStats">
<tr>
<th class="name">Package</th>
<th class="coverageStat
">
Class, %
</th>
<th class="coverageStat
">
Method, %
</th>
<th class="coverageStat
">
Branch, %
</th>
<th class="coverageStat
">
Line, %
</th>
</tr>
<tr>
<td class="name">it.polimi.ingsw.gc14</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/9)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/67)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/149)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/394)
</span>
</td>
</tr>
</table>
<br/>
<br/>
<table class="coverageStats">
<tr>
<th class="name
">
<a href="index.html">Class</a> </th>
<th class="coverageStat
">
<a href="index_SORT_BY_CLASS.html">Class, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_METHOD.html">Method, %</a>
</th>
<th class="coverageStat sortedAsc
">
<a href="index_SORT_BY_BLOCK_DESC.html">Branch, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_LINE.html">Line, %</a>
</th>
</tr>
<tr>
<td class="name"><a href="sources/source-1.html">ClientLauncherGUI</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/2)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/4)
</span>
</td>
<td class="coverageStat"/>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/9)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-3.html">ErrorType</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/4)
</span>
</td>
<td class="coverageStat"/>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/12)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-6.html">SaveManager</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/4)
</span>
</td>
<td class="coverageStat"/>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/23)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-2.html">ClientLauncherTUI</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/11)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/67)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/142)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-4.html">GameEventProcessor</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/2)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/20)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/48)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/108)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-5.html">LimitedMap</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/16)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/10)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/28)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-7.html">ServerLauncher</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/8)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/24)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/72)
</span>
</td>
</tr>
</table>
</div>
<script type="text/javascript">
(function() {
var msie = false, msie9 = false;
/*@cc_on
msie = true;
@if (@_jscript_version >= 9)
msie9 = true;
@end
@*/
if (!msie || msie && msie9) {
hljs.highlightAll()
hljs.initLineNumbersOnLoad();
}
})();
</script>
<div class="footer">
<div style="float:right;">generated on 2026-06-14 21:53</div>
</div>
</body>
</html>
@@ -0,0 +1,356 @@
<!DOCTYPE html>
<html id="htmlId">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Coverage Report > it.polimi.ingsw.gc14</title>
<style type="text/css">
@import "../css/coverage.css";
@import "../css/idea.min.css";
</style>
<script type="text/javascript" src="../js/highlight.min.js"></script>
<script type="text/javascript" src="../js/highlightjs-line-numbers.min.js"></script>
</head>
<body>
<div class="content">
<div class="breadCrumbs">
Current scope: <a href="../index_SORT_BY_BLOCK_DESC.html">all classes</a>
<span class="separator">|</span>
it.polimi.ingsw.gc14</div>
<h1>Coverage Summary for Package: it.polimi.ingsw.gc14</h1>
<table class="coverageStats">
<tr>
<th class="name">Package</th>
<th class="coverageStat
">
Class, %
</th>
<th class="coverageStat
">
Method, %
</th>
<th class="coverageStat
">
Branch, %
</th>
<th class="coverageStat
">
Line, %
</th>
</tr>
<tr>
<td class="name">it.polimi.ingsw.gc14</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/9)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/67)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/149)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/394)
</span>
</td>
</tr>
</table>
<br/>
<br/>
<table class="coverageStats">
<tr>
<th class="name
">
<a href="index.html">Class</a> </th>
<th class="coverageStat
">
<a href="index_SORT_BY_CLASS.html">Class, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_METHOD.html">Method, %</a>
</th>
<th class="coverageStat sortedDesc
">
<a href="index_SORT_BY_BLOCK.html">Branch, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_LINE.html">Line, %</a>
</th>
</tr>
<tr>
<td class="name"><a href="sources/source-7.html">ServerLauncher</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/8)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/24)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/72)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-5.html">LimitedMap</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/16)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/10)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/28)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-4.html">GameEventProcessor</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/2)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/20)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/48)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/108)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-2.html">ClientLauncherTUI</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/11)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/67)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/142)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-6.html">SaveManager</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/4)
</span>
</td>
<td class="coverageStat"/>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/23)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-3.html">ErrorType</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/4)
</span>
</td>
<td class="coverageStat"/>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/12)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-1.html">ClientLauncherGUI</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/2)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/4)
</span>
</td>
<td class="coverageStat"/>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/9)
</span>
</td>
</tr>
</table>
</div>
<script type="text/javascript">
(function() {
var msie = false, msie9 = false;
/*@cc_on
msie = true;
@if (@_jscript_version >= 9)
msie9 = true;
@end
@*/
if (!msie || msie && msie9) {
hljs.highlightAll()
hljs.initLineNumbersOnLoad();
}
})();
</script>
<div class="footer">
<div style="float:right;">generated on 2026-06-14 21:53</div>
</div>
</body>
</html>
@@ -0,0 +1,356 @@
<!DOCTYPE html>
<html id="htmlId">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Coverage Report > it.polimi.ingsw.gc14</title>
<style type="text/css">
@import "../css/coverage.css";
@import "../css/idea.min.css";
</style>
<script type="text/javascript" src="../js/highlight.min.js"></script>
<script type="text/javascript" src="../js/highlightjs-line-numbers.min.js"></script>
</head>
<body>
<div class="content">
<div class="breadCrumbs">
Current scope: <a href="../index_SORT_BY_CLASS.html">all classes</a>
<span class="separator">|</span>
it.polimi.ingsw.gc14</div>
<h1>Coverage Summary for Package: it.polimi.ingsw.gc14</h1>
<table class="coverageStats">
<tr>
<th class="name">Package</th>
<th class="coverageStat
">
Class, %
</th>
<th class="coverageStat
">
Method, %
</th>
<th class="coverageStat
">
Branch, %
</th>
<th class="coverageStat
">
Line, %
</th>
</tr>
<tr>
<td class="name">it.polimi.ingsw.gc14</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/9)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/67)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/149)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/394)
</span>
</td>
</tr>
</table>
<br/>
<br/>
<table class="coverageStats">
<tr>
<th class="name
">
<a href="index.html">Class</a> </th>
<th class="coverageStat sortedAsc
">
<a href="index_SORT_BY_CLASS_DESC.html">Class, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_METHOD.html">Method, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_BLOCK.html">Branch, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_LINE.html">Line, %</a>
</th>
</tr>
<tr>
<td class="name"><a href="sources/source-1.html">ClientLauncherGUI</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/2)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/4)
</span>
</td>
<td class="coverageStat"/>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/9)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-2.html">ClientLauncherTUI</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/11)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/67)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/142)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-3.html">ErrorType</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/4)
</span>
</td>
<td class="coverageStat"/>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/12)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-4.html">GameEventProcessor</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/2)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/20)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/48)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/108)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-5.html">LimitedMap</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/16)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/10)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/28)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-6.html">SaveManager</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/4)
</span>
</td>
<td class="coverageStat"/>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/23)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-7.html">ServerLauncher</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/8)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/24)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/72)
</span>
</td>
</tr>
</table>
</div>
<script type="text/javascript">
(function() {
var msie = false, msie9 = false;
/*@cc_on
msie = true;
@if (@_jscript_version >= 9)
msie9 = true;
@end
@*/
if (!msie || msie && msie9) {
hljs.highlightAll()
hljs.initLineNumbersOnLoad();
}
})();
</script>
<div class="footer">
<div style="float:right;">generated on 2026-06-14 21:53</div>
</div>
</body>
</html>
@@ -0,0 +1,356 @@
<!DOCTYPE html>
<html id="htmlId">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Coverage Report > it.polimi.ingsw.gc14</title>
<style type="text/css">
@import "../css/coverage.css";
@import "../css/idea.min.css";
</style>
<script type="text/javascript" src="../js/highlight.min.js"></script>
<script type="text/javascript" src="../js/highlightjs-line-numbers.min.js"></script>
</head>
<body>
<div class="content">
<div class="breadCrumbs">
Current scope: <a href="../index_SORT_BY_CLASS_DESC.html">all classes</a>
<span class="separator">|</span>
it.polimi.ingsw.gc14</div>
<h1>Coverage Summary for Package: it.polimi.ingsw.gc14</h1>
<table class="coverageStats">
<tr>
<th class="name">Package</th>
<th class="coverageStat
">
Class, %
</th>
<th class="coverageStat
">
Method, %
</th>
<th class="coverageStat
">
Branch, %
</th>
<th class="coverageStat
">
Line, %
</th>
</tr>
<tr>
<td class="name">it.polimi.ingsw.gc14</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/9)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/67)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/149)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/394)
</span>
</td>
</tr>
</table>
<br/>
<br/>
<table class="coverageStats">
<tr>
<th class="name
">
<a href="index.html">Class</a> </th>
<th class="coverageStat sortedDesc
">
<a href="index_SORT_BY_CLASS.html">Class, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_METHOD.html">Method, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_BLOCK.html">Branch, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_LINE.html">Line, %</a>
</th>
</tr>
<tr>
<td class="name"><a href="sources/source-7.html">ServerLauncher</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/8)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/24)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/72)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-6.html">SaveManager</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/4)
</span>
</td>
<td class="coverageStat"/>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/23)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-5.html">LimitedMap</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/16)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/10)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/28)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-4.html">GameEventProcessor</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/2)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/20)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/48)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/108)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-3.html">ErrorType</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/4)
</span>
</td>
<td class="coverageStat"/>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/12)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-2.html">ClientLauncherTUI</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/11)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/67)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/142)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-1.html">ClientLauncherGUI</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/2)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/4)
</span>
</td>
<td class="coverageStat"/>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/9)
</span>
</td>
</tr>
</table>
</div>
<script type="text/javascript">
(function() {
var msie = false, msie9 = false;
/*@cc_on
msie = true;
@if (@_jscript_version >= 9)
msie9 = true;
@end
@*/
if (!msie || msie && msie9) {
hljs.highlightAll()
hljs.initLineNumbersOnLoad();
}
})();
</script>
<div class="footer">
<div style="float:right;">generated on 2026-06-14 21:53</div>
</div>
</body>
</html>
@@ -0,0 +1,356 @@
<!DOCTYPE html>
<html id="htmlId">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Coverage Report > it.polimi.ingsw.gc14</title>
<style type="text/css">
@import "../css/coverage.css";
@import "../css/idea.min.css";
</style>
<script type="text/javascript" src="../js/highlight.min.js"></script>
<script type="text/javascript" src="../js/highlightjs-line-numbers.min.js"></script>
</head>
<body>
<div class="content">
<div class="breadCrumbs">
Current scope: <a href="../index_SORT_BY_LINE.html">all classes</a>
<span class="separator">|</span>
it.polimi.ingsw.gc14</div>
<h1>Coverage Summary for Package: it.polimi.ingsw.gc14</h1>
<table class="coverageStats">
<tr>
<th class="name">Package</th>
<th class="coverageStat
">
Class, %
</th>
<th class="coverageStat
">
Method, %
</th>
<th class="coverageStat
">
Branch, %
</th>
<th class="coverageStat
">
Line, %
</th>
</tr>
<tr>
<td class="name">it.polimi.ingsw.gc14</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/9)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/67)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/149)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/394)
</span>
</td>
</tr>
</table>
<br/>
<br/>
<table class="coverageStats">
<tr>
<th class="name
">
<a href="index.html">Class</a> </th>
<th class="coverageStat
">
<a href="index_SORT_BY_CLASS.html">Class, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_METHOD.html">Method, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_BLOCK.html">Branch, %</a>
</th>
<th class="coverageStat sortedAsc
">
<a href="index_SORT_BY_LINE_DESC.html">Line, %</a>
</th>
</tr>
<tr>
<td class="name"><a href="sources/source-1.html">ClientLauncherGUI</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/2)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/4)
</span>
</td>
<td class="coverageStat"/>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/9)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-2.html">ClientLauncherTUI</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/11)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/67)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/142)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-3.html">ErrorType</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/4)
</span>
</td>
<td class="coverageStat"/>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/12)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-4.html">GameEventProcessor</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/2)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/20)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/48)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/108)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-5.html">LimitedMap</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/16)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/10)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/28)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-6.html">SaveManager</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/4)
</span>
</td>
<td class="coverageStat"/>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/23)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-7.html">ServerLauncher</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/8)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/24)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/72)
</span>
</td>
</tr>
</table>
</div>
<script type="text/javascript">
(function() {
var msie = false, msie9 = false;
/*@cc_on
msie = true;
@if (@_jscript_version >= 9)
msie9 = true;
@end
@*/
if (!msie || msie && msie9) {
hljs.highlightAll()
hljs.initLineNumbersOnLoad();
}
})();
</script>
<div class="footer">
<div style="float:right;">generated on 2026-06-14 21:53</div>
</div>
</body>
</html>
@@ -0,0 +1,356 @@
<!DOCTYPE html>
<html id="htmlId">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Coverage Report > it.polimi.ingsw.gc14</title>
<style type="text/css">
@import "../css/coverage.css";
@import "../css/idea.min.css";
</style>
<script type="text/javascript" src="../js/highlight.min.js"></script>
<script type="text/javascript" src="../js/highlightjs-line-numbers.min.js"></script>
</head>
<body>
<div class="content">
<div class="breadCrumbs">
Current scope: <a href="../index_SORT_BY_LINE_DESC.html">all classes</a>
<span class="separator">|</span>
it.polimi.ingsw.gc14</div>
<h1>Coverage Summary for Package: it.polimi.ingsw.gc14</h1>
<table class="coverageStats">
<tr>
<th class="name">Package</th>
<th class="coverageStat
">
Class, %
</th>
<th class="coverageStat
">
Method, %
</th>
<th class="coverageStat
">
Branch, %
</th>
<th class="coverageStat
">
Line, %
</th>
</tr>
<tr>
<td class="name">it.polimi.ingsw.gc14</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/9)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/67)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/149)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/394)
</span>
</td>
</tr>
</table>
<br/>
<br/>
<table class="coverageStats">
<tr>
<th class="name
">
<a href="index.html">Class</a> </th>
<th class="coverageStat
">
<a href="index_SORT_BY_CLASS.html">Class, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_METHOD.html">Method, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_BLOCK.html">Branch, %</a>
</th>
<th class="coverageStat sortedDesc
">
<a href="index_SORT_BY_LINE.html">Line, %</a>
</th>
</tr>
<tr>
<td class="name"><a href="sources/source-7.html">ServerLauncher</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/8)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/24)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/72)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-6.html">SaveManager</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/4)
</span>
</td>
<td class="coverageStat"/>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/23)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-5.html">LimitedMap</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/16)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/10)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/28)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-4.html">GameEventProcessor</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/2)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/20)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/48)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/108)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-3.html">ErrorType</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/4)
</span>
</td>
<td class="coverageStat"/>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/12)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-2.html">ClientLauncherTUI</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/11)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/67)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/142)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-1.html">ClientLauncherGUI</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/2)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/4)
</span>
</td>
<td class="coverageStat"/>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/9)
</span>
</td>
</tr>
</table>
</div>
<script type="text/javascript">
(function() {
var msie = false, msie9 = false;
/*@cc_on
msie = true;
@if (@_jscript_version >= 9)
msie9 = true;
@end
@*/
if (!msie || msie && msie9) {
hljs.highlightAll()
hljs.initLineNumbersOnLoad();
}
})();
</script>
<div class="footer">
<div style="float:right;">generated on 2026-06-14 21:53</div>
</div>
</body>
</html>
@@ -0,0 +1,356 @@
<!DOCTYPE html>
<html id="htmlId">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Coverage Report > it.polimi.ingsw.gc14</title>
<style type="text/css">
@import "../css/coverage.css";
@import "../css/idea.min.css";
</style>
<script type="text/javascript" src="../js/highlight.min.js"></script>
<script type="text/javascript" src="../js/highlightjs-line-numbers.min.js"></script>
</head>
<body>
<div class="content">
<div class="breadCrumbs">
Current scope: <a href="../index_SORT_BY_METHOD.html">all classes</a>
<span class="separator">|</span>
it.polimi.ingsw.gc14</div>
<h1>Coverage Summary for Package: it.polimi.ingsw.gc14</h1>
<table class="coverageStats">
<tr>
<th class="name">Package</th>
<th class="coverageStat
">
Class, %
</th>
<th class="coverageStat
">
Method, %
</th>
<th class="coverageStat
">
Branch, %
</th>
<th class="coverageStat
">
Line, %
</th>
</tr>
<tr>
<td class="name">it.polimi.ingsw.gc14</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/9)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/67)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/149)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/394)
</span>
</td>
</tr>
</table>
<br/>
<br/>
<table class="coverageStats">
<tr>
<th class="name
">
<a href="index.html">Class</a> </th>
<th class="coverageStat
">
<a href="index_SORT_BY_CLASS.html">Class, %</a>
</th>
<th class="coverageStat sortedAsc
">
<a href="index_SORT_BY_METHOD_DESC.html">Method, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_BLOCK.html">Branch, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_LINE.html">Line, %</a>
</th>
</tr>
<tr>
<td class="name"><a href="sources/source-1.html">ClientLauncherGUI</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/2)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/4)
</span>
</td>
<td class="coverageStat"/>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/9)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-2.html">ClientLauncherTUI</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/11)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/67)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/142)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-3.html">ErrorType</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/4)
</span>
</td>
<td class="coverageStat"/>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/12)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-4.html">GameEventProcessor</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/2)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/20)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/48)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/108)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-5.html">LimitedMap</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/16)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/10)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/28)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-6.html">SaveManager</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/4)
</span>
</td>
<td class="coverageStat"/>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/23)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-7.html">ServerLauncher</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/8)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/24)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/72)
</span>
</td>
</tr>
</table>
</div>
<script type="text/javascript">
(function() {
var msie = false, msie9 = false;
/*@cc_on
msie = true;
@if (@_jscript_version >= 9)
msie9 = true;
@end
@*/
if (!msie || msie && msie9) {
hljs.highlightAll()
hljs.initLineNumbersOnLoad();
}
})();
</script>
<div class="footer">
<div style="float:right;">generated on 2026-06-14 21:53</div>
</div>
</body>
</html>
@@ -0,0 +1,356 @@
<!DOCTYPE html>
<html id="htmlId">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Coverage Report > it.polimi.ingsw.gc14</title>
<style type="text/css">
@import "../css/coverage.css";
@import "../css/idea.min.css";
</style>
<script type="text/javascript" src="../js/highlight.min.js"></script>
<script type="text/javascript" src="../js/highlightjs-line-numbers.min.js"></script>
</head>
<body>
<div class="content">
<div class="breadCrumbs">
Current scope: <a href="../index_SORT_BY_METHOD_DESC.html">all classes</a>
<span class="separator">|</span>
it.polimi.ingsw.gc14</div>
<h1>Coverage Summary for Package: it.polimi.ingsw.gc14</h1>
<table class="coverageStats">
<tr>
<th class="name">Package</th>
<th class="coverageStat
">
Class, %
</th>
<th class="coverageStat
">
Method, %
</th>
<th class="coverageStat
">
Branch, %
</th>
<th class="coverageStat
">
Line, %
</th>
</tr>
<tr>
<td class="name">it.polimi.ingsw.gc14</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/9)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/67)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/149)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/394)
</span>
</td>
</tr>
</table>
<br/>
<br/>
<table class="coverageStats">
<tr>
<th class="name
">
<a href="index.html">Class</a> </th>
<th class="coverageStat
">
<a href="index_SORT_BY_CLASS.html">Class, %</a>
</th>
<th class="coverageStat sortedDesc
">
<a href="index_SORT_BY_METHOD.html">Method, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_BLOCK.html">Branch, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_LINE.html">Line, %</a>
</th>
</tr>
<tr>
<td class="name"><a href="sources/source-7.html">ServerLauncher</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/8)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/24)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/72)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-6.html">SaveManager</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/4)
</span>
</td>
<td class="coverageStat"/>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/23)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-5.html">LimitedMap</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/16)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/10)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/28)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-4.html">GameEventProcessor</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/2)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/20)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/48)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/108)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-3.html">ErrorType</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/4)
</span>
</td>
<td class="coverageStat"/>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/12)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-2.html">ClientLauncherTUI</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/11)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/67)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/142)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-1.html">ClientLauncherGUI</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/2)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/4)
</span>
</td>
<td class="coverageStat"/>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/9)
</span>
</td>
</tr>
</table>
</div>
<script type="text/javascript">
(function() {
var msie = false, msie9 = false;
/*@cc_on
msie = true;
@if (@_jscript_version >= 9)
msie9 = true;
@end
@*/
if (!msie || msie && msie9) {
hljs.highlightAll()
hljs.initLineNumbersOnLoad();
}
})();
</script>
<div class="footer">
<div style="float:right;">generated on 2026-06-14 21:53</div>
</div>
</body>
</html>
@@ -0,0 +1,356 @@
<!DOCTYPE html>
<html id="htmlId">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Coverage Report > it.polimi.ingsw.gc14</title>
<style type="text/css">
@import "../css/coverage.css";
@import "../css/idea.min.css";
</style>
<script type="text/javascript" src="../js/highlight.min.js"></script>
<script type="text/javascript" src="../js/highlightjs-line-numbers.min.js"></script>
</head>
<body>
<div class="content">
<div class="breadCrumbs">
Current scope: <a href="../index_SORT_BY_NAME_DESC.html">all classes</a>
<span class="separator">|</span>
it.polimi.ingsw.gc14</div>
<h1>Coverage Summary for Package: it.polimi.ingsw.gc14</h1>
<table class="coverageStats">
<tr>
<th class="name">Package</th>
<th class="coverageStat
">
Class, %
</th>
<th class="coverageStat
">
Method, %
</th>
<th class="coverageStat
">
Branch, %
</th>
<th class="coverageStat
">
Line, %
</th>
</tr>
<tr>
<td class="name">it.polimi.ingsw.gc14</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/9)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/67)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/149)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/394)
</span>
</td>
</tr>
</table>
<br/>
<br/>
<table class="coverageStats">
<tr>
<th class="name sortedDesc
">
<a href="index.html">Class</a> </th>
<th class="coverageStat
">
<a href="index_SORT_BY_CLASS.html">Class, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_METHOD.html">Method, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_BLOCK.html">Branch, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_LINE.html">Line, %</a>
</th>
</tr>
<tr>
<td class="name"><a href="sources/source-7.html">ServerLauncher</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/8)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/24)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/72)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-6.html">SaveManager</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/4)
</span>
</td>
<td class="coverageStat"/>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/23)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-5.html">LimitedMap</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/16)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/10)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/28)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-4.html">GameEventProcessor</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/2)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/20)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/48)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/108)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-3.html">ErrorType</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/4)
</span>
</td>
<td class="coverageStat"/>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/12)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-2.html">ClientLauncherTUI</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/11)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/67)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/142)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-1.html">ClientLauncherGUI</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/2)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/4)
</span>
</td>
<td class="coverageStat"/>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/9)
</span>
</td>
</tr>
</table>
</div>
<script type="text/javascript">
(function() {
var msie = false, msie9 = false;
/*@cc_on
msie = true;
@if (@_jscript_version >= 9)
msie9 = true;
@end
@*/
if (!msie || msie && msie9) {
hljs.highlightAll()
hljs.initLineNumbersOnLoad();
}
})();
</script>
<div class="footer">
<div style="float:right;">generated on 2026-06-14 21:53</div>
</div>
</body>
</html>
@@ -0,0 +1,161 @@
<!DOCTYPE html>
<html id="htmlId">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Coverage Report > ClientLauncherGUI</title>
<style type="text/css">
@import "../../css/coverage.css";
@import "../../css/idea.min.css";
</style>
<script type="text/javascript" src="../../js/highlight.min.js"></script>
<script type="text/javascript" src="../../js/highlightjs-line-numbers.min.js"></script>
</head>
<body>
<div class="content">
<div class="breadCrumbs">
Current scope: <a href="../../index.html">all classes</a>
<span class="separator">|</span>
<a href="../index.html">it.polimi.ingsw.gc14</a>
</div>
<h1>Coverage Summary for Class: ClientLauncherGUI (it.polimi.ingsw.gc14)</h1>
<table class="coverageStats">
<tr>
<th class="name">Class</th>
<th class="coverageStat
">
Method, %
</th>
<th class="coverageStat
">
Line, %
</th>
</tr>
<tr>
<td class="name">ClientLauncherGUI</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/2)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/4)
</span>
</td>
</tr>
<tr>
<td class="name">ClientLauncherGUI$GUIApp</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/2)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/5)
</span>
</td>
</tr>
<tr>
<td class="name"><strong>Total</strong></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/4)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/9)
</span>
</td>
</tr>
</table>
<br/>
<br/>
<pre>
<code class="sourceCode" id="sourceCode">&nbsp;package it.polimi.ingsw.gc14;
&nbsp;
&nbsp;import it.polimi.ingsw.gc14.Controller.ClientController;
&nbsp;import it.polimi.ingsw.gc14.View.GUI.GUI;
&nbsp;import javafx.application.Application;
&nbsp;import javafx.stage.Stage;
&nbsp;
&nbsp;/** Entry point for launching the game client with the JavaFX GUI. */
<b class="nc">&nbsp;public class ClientLauncherGUI {</b>
&nbsp;
&nbsp; /**
&nbsp; * Launches the GUI application.
&nbsp; *
&nbsp; * @param args command-line arguments passed to the JavaFX runtime.
&nbsp; */
&nbsp; public static void main(String[] args) {
<b class="nc">&nbsp; System.setProperty(&quot;glass.gtk.uiScale&quot;, &quot;1.0&quot;);</b>
<b class="nc">&nbsp; System.setProperty(&quot;glass.win.uiScale&quot;, &quot;1.0&quot;);</b>
<b class="nc">&nbsp; Application.launch(GUIApp.class, args);</b>
&nbsp; }
&nbsp; //TODO
<b class="nc">&nbsp; public static class GUIApp extends Application {</b>
&nbsp; @Override
&nbsp; public void start(Stage stage) throws Exception {
<b class="nc">&nbsp; GUI view = new GUI();</b>
<b class="nc">&nbsp; ClientController controller = new ClientController(view);</b>
<b class="nc">&nbsp; view.setController(controller);</b>
<b class="nc">&nbsp; view.start(stage);</b>
&nbsp; }
&nbsp; }
&nbsp;}
</code>
</pre>
</div>
<script type="text/javascript">
(function() {
var msie = false, msie9 = false;
/*@cc_on
msie = true;
@if (@_jscript_version >= 9)
msie9 = true;
@end
@*/
if (!msie || msie && msie9) {
hljs.highlightAll()
hljs.initLineNumbersOnLoad();
}
})();
</script>
<div class="footer">
<div style="float:right;">generated on 2026-06-14 21:53</div>
</div>
</body>
</html>
@@ -0,0 +1,436 @@
<!DOCTYPE html>
<html id="htmlId">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Coverage Report > ClientLauncherTUI</title>
<style type="text/css">
@import "../../css/coverage.css";
@import "../../css/idea.min.css";
</style>
<script type="text/javascript" src="../../js/highlight.min.js"></script>
<script type="text/javascript" src="../../js/highlightjs-line-numbers.min.js"></script>
</head>
<body>
<div class="content">
<div class="breadCrumbs">
Current scope: <a href="../../index.html">all classes</a>
<span class="separator">|</span>
<a href="../index.html">it.polimi.ingsw.gc14</a>
</div>
<h1>Coverage Summary for Class: ClientLauncherTUI (it.polimi.ingsw.gc14)</h1>
<table class="coverageStats">
<tr>
<th class="name">Class</th>
<th class="coverageStat
">
Class, %
</th>
<th class="coverageStat
">
Method, %
</th>
<th class="coverageStat
">
Branch, %
</th>
<th class="coverageStat
">
Line, %
</th>
</tr>
<tr>
<td class="name">ClientLauncherTUI</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/11)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/67)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/142)
</span>
</td>
</tr>
</table>
<br/>
<br/>
<pre>
<code class="sourceCode" id="sourceCode">&nbsp;package it.polimi.ingsw.gc14;
&nbsp;
&nbsp;import it.polimi.ingsw.gc14.Controller.ClientController;
&nbsp;import it.polimi.ingsw.gc14.Model.GamePackage.GameStages;
&nbsp;import it.polimi.ingsw.gc14.Network.NetworkConfig;
&nbsp;import it.polimi.ingsw.gc14.Network.InterfaceResolver;
&nbsp;import it.polimi.ingsw.gc14.Network.RMI.Client.RMIClient;
&nbsp;import it.polimi.ingsw.gc14.Network.TCP.Client.TCPClient;
&nbsp;import it.polimi.ingsw.gc14.View.TUI.TUI;
&nbsp;
&nbsp;import org.jline.builtins.Completers.TreeCompleter;
&nbsp;import org.jline.reader.*;
&nbsp;import org.jline.reader.impl.completer.StringsCompleter;
&nbsp;import org.jline.terminal.Terminal;
&nbsp;import org.jline.terminal.TerminalBuilder;
&nbsp;
&nbsp;import java.io.IOException;
&nbsp;import java.io.PrintStream;
&nbsp;import java.nio.charset.StandardCharsets;
&nbsp;
&nbsp;import static org.jline.builtins.Completers.TreeCompleter.node;
&nbsp;
&nbsp;/**
&nbsp; * Entry point for the TUI-based game client.
&nbsp; * Handles login, connects to the server, and drives the JLine-powered command loop.
&nbsp; */
<b class="nc">&nbsp;public class ClientLauncherTUI {</b>
&nbsp; //TODO
&nbsp; private TUI view;
&nbsp; //TODO
&nbsp; private Terminal terminal;
&nbsp; //TODO
&nbsp; private LineReader gameReader;
&nbsp; //TODO
<b class="nc">&nbsp; private String currentUsername = &quot;&quot;;</b>
&nbsp;
&nbsp; private static final String BUILDING_DETAILS =
&nbsp; &quot;ID 0 — Each time you complete a set of 6 different Character cards, take 5 \uD83C\uDF56. (Sets completed before acquiring don&#39;t count.)\n&quot; +
&nbsp; &quot;ID 1 — During the Sustenance Event, pay 1 less \uD83C\uDF56 for each Artist/Inventor/Gatherer in your tribe.\n&quot; +
&nbsp; &quot;ID 2 — During the Shamanic Ritual Event, you do not lose Prestige Points if you have fewer ⭐ than all other players.\n&quot; +
&nbsp; &quot;ID 3 — When you move your Totem to a Food-bonus space, take 1 extra \uD83C\uDF56. If placed last, pay 1 \uD83C\uDF56 normally (no effect).\n&quot; +
&nbsp; &quot;ID 4 — Each time you obtain a pair of identical Inventors (same icon), take 3 \uD83C\uDF56. (Pairs owned before don&#39;t count.)\n&quot; +
&nbsp; &quot;ID 5 — During the Shamanic Ritual Event, your tribe has 3 additional ⭐ icons.\n&quot; +
&nbsp; &quot;ID 6 — During the Shamanic Ritual Event, if you have more ⭐ than any other player, gain double Prestige. Ties still count.\n&quot; +
&nbsp; &quot;ID 7 — During the Hunt Event, take 1 \uD83C\uDF56 and gain 1 extra Prestige Point for each Hunter in your tribe.\n&quot; +
&nbsp; &quot;ID 8 — At end of game, gain double the Prestige Points shown on Builder cards in your tribe.\n&quot; +
&nbsp; &quot;ID 9 — During the Cave Paintings Event, take 1 \uD83C\uDF56 for each Artist in your tribe.\n&quot; +
&nbsp; &quot;ID 10 — At end of game, gain 6 Prestige Points for each complete set of 6 different Character cards.\n&quot; +
&nbsp; &quot;ID 11 — At end of game, gain the indicated Prestige Points for each Character card of the indicated type.\n&quot; +
&nbsp; &quot;ID 12 — After all Totems return to Turn Order (before End of Round), take 1 Character or 1 Building card from the top row (paying its cost).\n&quot; +
&nbsp; &quot;ID 13 — At end of game, gain 25 Prestige Points.&quot;;
&nbsp;
&nbsp; private static final String EVENT_DETAILS =
&nbsp; &quot;SUSTENANCE — Pay 1 \uD83C\uDF56 per Character (Buildings don&#39;t count). If you can&#39;t feed all Characters, lose the\n&quot; +
&nbsp; &quot; Prestige Points shown on the card for each one you couldn&#39;t feed. Each Gatherer gives a 3\uD83C\uDF56 discount.\n&quot; +
&nbsp; &quot; You cannot choose to lose PP to avoid paying Food. Sustenance resolves last if multiple Events occur.\n&quot; +
&nbsp; &quot;\n&quot; +
&nbsp; &quot;HUNT — Take 1 \uD83C\uDF56 and gain the Prestige Points shown on the card for each Hunter in your tribe.\n&quot; +
&nbsp; &quot;\n&quot; +
&nbsp; &quot;SHAMANIC RITUAL — Player with the most \uD83C\uDF1F icons gains the Prestige Points on the card.\n&quot; +
&nbsp; &quot; Player with the fewest \uD83C\uDF1F icons loses those Prestige Points. In case of a tie, all tied players gain/lose.\n&quot; +
&nbsp; &quot;\n&quot; +
&nbsp; &quot;CAVE PAINTINGS — If you have fewer Artists than the top-line threshold, lose the indicated Prestige Points.\n&quot; +
&nbsp; &quot; If you meet the bottom-line threshold, gain the indicated Prestige Points for each Artist in your tribe.&quot;;
&nbsp;
&nbsp; private static final String CHARACTER_DETAILS =
&nbsp; &quot;INVENTORS — At end of game, gain PP equal to (number of Inventors) × (number of different Invention icons).\n&quot; +
&nbsp; &quot; There are 10 different Invention icons.\n&quot; +
&nbsp; &quot;\n&quot; +
&nbsp; &quot;GATHERERS — During Sustenance, each Gatherer gives a 3\uD83C\uDF56 discount on what you owe.\n&quot; +
&nbsp; &quot; Note: you do not take any Food from Gatherers under any circumstances.\n&quot; +
&nbsp; &quot;\n&quot; +
&nbsp; &quot;SHAMANS — Each Shaman shows 1–3 \uD83C\uDF1F icons. During Shamanic Ritual, majority = gain PP; minority = lose PP.\n&quot; +
&nbsp; &quot;\n&quot; +
&nbsp; &quot;BUILDERS — During the game, each Builder reduces the \uD83C\uDF56 cost of every Building card by the amount\n&quot; +
&nbsp; &quot; shown in the top-right corner. At end of game, each Builder gives the PP shown in the bottom-left corner.\n&quot; +
&nbsp; &quot;\n&quot; +
&nbsp; &quot;ARTISTS — During Cave Paintings, gain or lose PP based on Artist count (see &#39;details events&#39;).\n&quot; +
&nbsp; &quot; At end of game, gain 10 PP for every 2 Artists in your tribe.\n&quot; +
&nbsp; &quot;\n&quot; +
&nbsp; &quot;HUNTERS — Adding a Hunter without the \uD83C\uDF56 icon: nothing. Adding a Hunter WITH the \uD83C\uDF56 icon:\n&quot; +
&nbsp; &quot; immediately take 1 \uD83C\uDF56 for each Hunter in your tribe (with or without the icon).\n&quot; +
&nbsp; &quot; During Hunt Event, take \uD83C\uDF56 and gain PP based on your Hunter count (see &#39;details events&#39;).&quot;;
&nbsp; //TODO
&nbsp; public static void main(String[] args) throws InterruptedException {
<b class="nc">&nbsp; new ClientLauncherTUI().start();</b>
&nbsp; }
&nbsp;
&nbsp; /**
&nbsp; * Starts the TUI client. Creates a JLine terminal, loops through login → game → rematch.
&nbsp; *
&nbsp; * @throws InterruptedException if the thread is interrupted while waiting.
&nbsp; */
&nbsp; private void start() throws InterruptedException {
&nbsp; try {
<b class="nc">&nbsp; System.setOut(new PrintStream(System.out, true, StandardCharsets.UTF_8));</b>
<b class="nc">&nbsp; System.setErr(new PrintStream(System.err, true, StandardCharsets.UTF_8));</b>
<b class="nc">&nbsp; terminal = TerminalBuilder.builder()</b>
<b class="nc">&nbsp; .system(true)</b>
<b class="nc">&nbsp; .encoding(StandardCharsets.UTF_8)</b>
<b class="nc">&nbsp; .build();</b>
&nbsp; } catch (IOException e) {
<b class="nc">&nbsp; System.err.println(&quot;Could not initialise terminal: &quot; + e.getMessage());</b>
&nbsp; return;
&nbsp; }
<b class="nc">&nbsp; terminal.writer().print(&quot;\033[H\033[2J&quot;);</b>
<b class="nc">&nbsp; terminal.writer().flush();</b>
&nbsp;
<b class="nc">&nbsp; view = new TUI(null);</b>
<b class="nc">&nbsp; ClientController controller = new ClientController(view);</b>
<b class="nc">&nbsp; gameReader = buildGameReader();</b>
<b class="nc">&nbsp; view.setLineReader(gameReader);</b>
&nbsp;
&nbsp; while (true) {
<b class="nc">&nbsp; if (!doLogin(controller)) continue;</b>
&nbsp;
<b class="nc">&nbsp; while (controller.getClient() != null) {</b>
<b class="nc">&nbsp; String prompt = buildPrompt(controller);</b>
&nbsp; String line;
&nbsp; try {
<b class="nc">&nbsp; line = gameReader.readLine(prompt);</b>
&nbsp; } catch (UserInterruptException e) {
<b class="nc">&nbsp; safeQuit(controller);</b>
&nbsp; return;
&nbsp; } catch (EndOfFileException e) {
<b class="nc">&nbsp; safeQuit(controller);</b>
&nbsp; return;
&nbsp; }
<b class="nc">&nbsp; if (line == null || line.isBlank()) continue;</b>
<b class="nc">&nbsp; boolean rematch = handleCommand(line.trim(), controller);</b>
<b class="nc">&nbsp; if (rematch) break;</b>
&nbsp; }
&nbsp; }
&nbsp; }
&nbsp; //TODO
&nbsp; private boolean doLogin(ClientController controller) {
<b class="nc">&nbsp; LineReader loginReader = LineReaderBuilder.builder()</b>
<b class="nc">&nbsp; .terminal(terminal)</b>
<b class="nc">&nbsp; .completer(new StringsCompleter(&quot;rmi&quot;, &quot;tcp&quot;))</b>
<b class="nc">&nbsp; .build();</b>
<b class="nc">&nbsp; LineReader ipReader = LineReaderBuilder.builder()</b>
<b class="nc">&nbsp; .terminal(terminal)</b>
<b class="nc">&nbsp; .completer(new StringsCompleter(&quot;localhost&quot;))</b>
<b class="nc">&nbsp; .build();</b>
&nbsp;
&nbsp; String username, networkStr, ip;
&nbsp; int nPlayers;
&nbsp;
&nbsp; try {
<b class="nc">&nbsp; username = loginReader.readLine(&quot;Username: &quot;).trim();</b>
<b class="nc">&nbsp; nPlayers = Integer.parseInt(loginReader.readLine(&quot;Number of players [2-5]: &quot;).trim());</b>
<b class="nc">&nbsp; networkStr = loginReader.readLine(&quot;Network [rmi/tcp]: &quot;).trim().toLowerCase();</b>
<b class="nc">&nbsp; ip = ipReader.readLine(&quot;Server IP [localhost]: &quot;).trim();</b>
<b class="nc">&nbsp; if (ip.isEmpty()) ip = &quot;localhost&quot;;</b>
&nbsp; } catch (UserInterruptException | EndOfFileException e) {
<b class="nc">&nbsp; System.exit(0);</b>
<b class="nc">&nbsp; return false;</b>
&nbsp; } catch (NumberFormatException e) {
<b class="nc">&nbsp; System.out.println(&quot;Invalid number of players.&quot;);</b>
<b class="nc">&nbsp; return false;</b>
&nbsp; }
&nbsp;
<b class="nc">&nbsp; currentUsername = username;</b>
<b class="nc">&nbsp; view.setUsername(username);</b>
<b class="nc">&nbsp; controller.setMyUsername(username);</b>
&nbsp;
<b class="nc">&nbsp; if (networkStr.equals(&quot;rmi&quot;)) {</b>
&nbsp; String myIP;
&nbsp; try {
<b class="nc">&nbsp; myIP = InterfaceResolver.resolveLocalInterface(ip);</b>
&nbsp; } catch (Exception e) {
<b class="nc">&nbsp; System.out.println(&quot;Cannot resolve local interface: &quot; + e.getMessage());</b>
<b class="nc">&nbsp; return false;</b>
&nbsp; }
<b class="nc">&nbsp; System.setProperty(&quot;java.rmi.server.hostname&quot;, myIP);</b>
<b class="nc">&nbsp; RMIClient client = new RMIClient(controller, ip, NetworkConfig.RMI_PORT, myIP);</b>
<b class="nc">&nbsp; ErrorType err = client.connect(username, nPlayers);</b>
<b class="nc">&nbsp; if (err != null) {</b>
<b class="nc">&nbsp; terminal.writer().print(&quot;\033[H\033[2J&quot;);</b>
<b class="nc">&nbsp; terminal.writer().flush();</b>
<b class="nc">&nbsp; System.out.println(&quot;Errore: &quot; + err);</b>
<b class="nc">&nbsp; return false;</b>
&nbsp; }
<b class="nc">&nbsp; System.out.println(&quot;Connected via RMI.&quot;);</b>
<b class="nc">&nbsp; controller.setClient(client);</b>
&nbsp;
<b class="nc">&nbsp; } else if (networkStr.equals(&quot;tcp&quot;)) {</b>
<b class="nc">&nbsp; TCPClient client = new TCPClient(controller, ip, NetworkConfig.TCP_PORT, NetworkConfig.HEARTBEAT_PORT);</b>
<b class="nc">&nbsp; ErrorType err = client.connect(username, nPlayers);</b>
<b class="nc">&nbsp; if (err != null) {</b>
<b class="nc">&nbsp; terminal.writer().print(&quot;\033[H\033[2J&quot;);</b>
<b class="nc">&nbsp; terminal.writer().flush();</b>
<b class="nc">&nbsp; System.out.println(&quot;Errore: &quot; + err);</b>
<b class="nc">&nbsp; return false;</b>
&nbsp; }
<b class="nc">&nbsp; System.out.println(&quot;Connected via TCP.&quot;);</b>
<b class="nc">&nbsp; controller.setClient(client);</b>
&nbsp;
&nbsp; } else {
<b class="nc">&nbsp; System.out.println(&quot;Unknown network type &#39;&quot; + networkStr + &quot;&#39;. Use rmi or tcp.&quot;);</b>
<b class="nc">&nbsp; return false;</b>
&nbsp; }
<b class="nc">&nbsp; return true;</b>
&nbsp; }
&nbsp; //TODO
&nbsp; private LineReader buildGameReader() {
<b class="nc">&nbsp; Completer completer = new TreeCompleter(</b>
<b class="nc">&nbsp; node(&quot;slot&quot;),</b>
<b class="nc">&nbsp; node(&quot;draw&quot;,</b>
<b class="nc">&nbsp; node(&quot;upper&quot;,</b>
<b class="nc">&nbsp; node(&quot;tribe&quot;),</b>
<b class="nc">&nbsp; node(&quot;building&quot;)),</b>
<b class="nc">&nbsp; node(&quot;lower&quot;,</b>
<b class="nc">&nbsp; node(&quot;tribe&quot;),</b>
<b class="nc">&nbsp; node(&quot;building&quot;))),</b>
<b class="nc">&nbsp; node(&quot;totem&quot;),</b>
<b class="nc">&nbsp; node(&quot;skip&quot;),</b>
<b class="nc">&nbsp; node(&quot;render&quot;),</b>
<b class="nc">&nbsp; node(&quot;help&quot;),</b>
<b class="nc">&nbsp; node(&quot;details&quot;, node(&quot;buildings&quot;), node(&quot;events&quot;), node(&quot;characters&quot;)),</b>
<b class="nc">&nbsp; node(&quot;rematch&quot;),</b>
<b class="nc">&nbsp; node(&quot;quit&quot;)</b>
&nbsp; );
<b class="nc">&nbsp; return LineReaderBuilder.builder()</b>
<b class="nc">&nbsp; .terminal(terminal)</b>
<b class="nc">&nbsp; .completer(completer)</b>
<b class="nc">&nbsp; .option(LineReader.Option.DISABLE_EVENT_EXPANSION, true)</b>
<b class="nc">&nbsp; .build();</b>
&nbsp; }
&nbsp; //TODO
&nbsp; private String buildPrompt(ClientController controller) {
<b class="nc">&nbsp; return currentUsername.isEmpty() ? &quot;&gt; &quot; : currentUsername + &quot;&gt; &quot;;</b>
&nbsp; }
&nbsp;
&nbsp; /** Returns {@code true} when the caller should break out of the game loop (rematch requested). */
&nbsp; private boolean handleCommand(String line, ClientController controller) {
<b class="nc">&nbsp; String[] parts = line.split(&quot;\\s+&quot;);</b>
<b class="nc">&nbsp; String cmd = parts[0].toLowerCase();</b>
&nbsp;
<b class="nc">&nbsp; switch (cmd) {</b>
&nbsp; case &quot;slot&quot; -&gt; {
<b class="nc">&nbsp; int pos = parsePos(parts, 1);</b>
<b class="nc">&nbsp; if (pos &gt;= 0) controller.slotChoice(pos);</b>
&nbsp; }
<b class="nc">&nbsp; case &quot;draw&quot; -&gt; handleDraw(parts, controller);</b>
&nbsp; case &quot;totem&quot; -&gt; {
<b class="nc">&nbsp; int pos = parsePos(parts, 1);</b>
<b class="nc">&nbsp; if (pos &gt;= 0) controller.totemChoice(pos);</b>
&nbsp; }
<b class="nc">&nbsp; case &quot;skip&quot; -&gt; controller.skipTurn();</b>
<b class="nc">&nbsp; case &quot;render&quot; -&gt; handleRender(parts);</b>
<b class="nc">&nbsp; case &quot;help&quot; -&gt; gameReader.printAbove(&quot;Commands: slot, draw, totem, skip, render, help, details, rematch, quit&quot;);</b>
&nbsp; case &quot;details&quot; -&gt; {
<b class="nc">&nbsp; if (parts.length &gt; 1 &amp;&amp; parts[1].equalsIgnoreCase(&quot;buildings&quot;))</b>
<b class="nc">&nbsp; gameReader.printAbove(BUILDING_DETAILS);</b>
<b class="nc">&nbsp; else if (parts.length &gt; 1 &amp;&amp; parts[1].equalsIgnoreCase(&quot;events&quot;))</b>
<b class="nc">&nbsp; gameReader.printAbove(EVENT_DETAILS);</b>
<b class="nc">&nbsp; else if (parts.length &gt; 1 &amp;&amp; parts[1].equalsIgnoreCase(&quot;characters&quot;))</b>
<b class="nc">&nbsp; gameReader.printAbove(CHARACTER_DETAILS);</b>
&nbsp; else
<b class="nc">&nbsp; gameReader.printAbove(&quot;Usage: details buildings | details events | details characters&quot;);</b>
&nbsp; }
&nbsp; case &quot;rematch&quot; -&gt; {
<b class="nc">&nbsp; if (controller.getMiniModel() == null</b>
<b class="nc">&nbsp; || !controller.getMiniModel().currentState.getGameStage().equals(GameStages.ENDED)) {</b>
<b class="nc">&nbsp; System.out.println(&quot;Game not ended yet. Use &#39;quit&#39; to disconnect.&quot;);</b>
<b class="nc">&nbsp; return false;</b>
&nbsp; }
<b class="nc">&nbsp; controller.disconnect();</b>
<b class="nc">&nbsp; controller.setClient(null);</b>
<b class="nc">&nbsp; controller.setModel(null);</b>
<b class="nc">&nbsp; return true;</b>
&nbsp; }
&nbsp; case &quot;quit&quot; -&gt; {
<b class="nc">&nbsp; safeQuit(controller);</b>
<b class="nc">&nbsp; System.exit(0);</b>
&nbsp; }
<b class="nc">&nbsp; default -&gt; view.showError(ErrorType.GENERIC_ERROR, &quot;Unknown command: &quot; + cmd);</b>
&nbsp; }
<b class="nc">&nbsp; return false;</b>
&nbsp; }
&nbsp; //TODO
&nbsp; private void handleDraw(String[] parts, ClientController controller) {
<b class="nc">&nbsp; if (parts.length &lt; 4) {</b>
<b class="nc">&nbsp; view.showError(ErrorType.GENERIC_ERROR, &quot;Usage: draw upper|lower tribe|building &lt;pos&gt;&quot;);</b>
&nbsp; return;
&nbsp; }
<b class="nc">&nbsp; boolean upper = parts[1].equalsIgnoreCase(&quot;upper&quot;);</b>
<b class="nc">&nbsp; boolean tribe = parts[2].equalsIgnoreCase(&quot;tribe&quot;);</b>
<b class="nc">&nbsp; int pos = parsePos(parts, 3);</b>
<b class="nc">&nbsp; if (pos &lt; 0) return;</b>
&nbsp;
<b class="nc">&nbsp; if (upper &amp;&amp; tribe) controller.drawUpperTribeCard(pos);</b>
<b class="nc">&nbsp; else if (upper) controller.drawUpperBuildingCard(pos);</b>
<b class="nc">&nbsp; else if (tribe) controller.drawLowerTribeCard(pos);</b>
<b class="nc">&nbsp; else controller.drawLowerBuildingCard(pos);</b>
&nbsp; }
&nbsp; //TODO
&nbsp; private void handleRender(String[] parts) {
<b class="nc">&nbsp; view.renderBoard();</b>
&nbsp; }
&nbsp; //TODO
&nbsp; private int parsePos(String[] parts, int idx) {
<b class="nc">&nbsp; if (parts.length &lt;= idx) {</b>
<b class="nc">&nbsp; view.showError(ErrorType.GENERIC_ERROR, &quot;Missing position argument.&quot;);</b>
<b class="nc">&nbsp; return -1;</b>
&nbsp; }
&nbsp; try {
<b class="nc">&nbsp; return Integer.parseInt(parts[idx]);</b>
&nbsp; } catch (NumberFormatException e) {
<b class="nc">&nbsp; view.showError(ErrorType.GENERIC_ERROR,</b>
&nbsp; &quot;Invalid position &#39;&quot; + parts[idx] + &quot;&#39; — expected integer.&quot;);
<b class="nc">&nbsp; return -1;</b>
&nbsp; }
&nbsp; }
&nbsp; //TODO
&nbsp; private void safeQuit(ClientController controller) {
<b class="nc">&nbsp; if (controller.getClient() != null) controller.disconnect();</b>
&nbsp; }
&nbsp;}
</code>
</pre>
</div>
<script type="text/javascript">
(function() {
var msie = false, msie9 = false;
/*@cc_on
msie = true;
@if (@_jscript_version >= 9)
msie9 = true;
@end
@*/
if (!msie || msie && msie9) {
hljs.highlightAll()
hljs.initLineNumbersOnLoad();
}
})();
</script>
<div class="footer">
<div style="float:right;">generated on 2026-06-14 21:53</div>
</div>
</body>
</html>
@@ -0,0 +1,126 @@
<!DOCTYPE html>
<html id="htmlId">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Coverage Report > ErrorType</title>
<style type="text/css">
@import "../../css/coverage.css";
@import "../../css/idea.min.css";
</style>
<script type="text/javascript" src="../../js/highlight.min.js"></script>
<script type="text/javascript" src="../../js/highlightjs-line-numbers.min.js"></script>
</head>
<body>
<div class="content">
<div class="breadCrumbs">
Current scope: <a href="../../index.html">all classes</a>
<span class="separator">|</span>
<a href="../index.html">it.polimi.ingsw.gc14</a>
</div>
<h1>Coverage Summary for Class: ErrorType (it.polimi.ingsw.gc14)</h1>
<table class="coverageStats">
<tr>
<th class="name">Class</th>
<th class="coverageStat
">
Class, %
</th>
<th class="coverageStat
">
Method, %
</th>
<th class="coverageStat
">
Line, %
</th>
</tr>
<tr>
<td class="name">ErrorType</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/4)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/12)
</span>
</td>
</tr>
</table>
<br/>
<br/>
<pre>
<code class="sourceCode" id="sourceCode">&nbsp;package it.polimi.ingsw.gc14;
&nbsp;
&nbsp;/** Enumeration of error types that can be returned by server-side operations. */
<b class="nc">&nbsp;public enum ErrorType {</b>
<b class="nc">&nbsp; USER_NOT_FOUND(&quot;User not found&quot;),</b>
<b class="nc">&nbsp; USERNAME_ALREADY_USED(&quot;Username is already in use&quot;),</b>
<b class="nc">&nbsp; USER_ALREADY_CONNECTED(&quot;User is already connected&quot;),</b>
<b class="nc">&nbsp; WRONG_PLAYER_NUMBER(&quot;Wrong player number&quot;),</b>
<b class="nc">&nbsp; SERVER_CRASHED(&quot;Server crashed&quot;),</b>
<b class="nc">&nbsp; GENERIC_ERROR(&quot;Generic error&quot;),</b>
<b class="nc">&nbsp; GAME_ALREADY_STARTED(&quot;Game already started&quot;),</b>
<b class="nc">&nbsp; WRONG_ACTION(&quot;Wrong action&quot;);</b>
&nbsp; //TODO
&nbsp; private final String description;
<b class="nc">&nbsp; ErrorType(String description) {</b>
<b class="nc">&nbsp; this.description = description;</b>
&nbsp; }
&nbsp; @Override
&nbsp; public String toString() {
<b class="nc">&nbsp; return description;</b>
&nbsp; }
&nbsp;}
</code>
</pre>
</div>
<script type="text/javascript">
(function() {
var msie = false, msie9 = false;
/*@cc_on
msie = true;
@if (@_jscript_version >= 9)
msie9 = true;
@end
@*/
if (!msie || msie && msie9) {
hljs.highlightAll()
hljs.initLineNumbersOnLoad();
}
})();
</script>
<div class="footer">
<div style="float:right;">generated on 2026-06-14 21:53</div>
</div>
</body>
</html>
@@ -0,0 +1,523 @@
<!DOCTYPE html>
<html id="htmlId">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Coverage Report > GameEventProcessor</title>
<style type="text/css">
@import "../../css/coverage.css";
@import "../../css/idea.min.css";
</style>
<script type="text/javascript" src="../../js/highlight.min.js"></script>
<script type="text/javascript" src="../../js/highlightjs-line-numbers.min.js"></script>
</head>
<body>
<div class="content">
<div class="breadCrumbs">
Current scope: <a href="../../index.html">all classes</a>
<span class="separator">|</span>
<a href="../index.html">it.polimi.ingsw.gc14</a>
</div>
<h1>Coverage Summary for Class: GameEventProcessor (it.polimi.ingsw.gc14)</h1>
<table class="coverageStats">
<tr>
<th class="name">Class</th>
<th class="coverageStat
">
Method, %
</th>
<th class="coverageStat
">
Branch, %
</th>
<th class="coverageStat
">
Line, %
</th>
</tr>
<tr>
<td class="name">GameEventProcessor</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/19)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/48)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/107)
</span>
</td>
</tr>
<tr>
<td class="name">GameEventProcessor$1</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
</tr>
<tr>
<td class="name"><strong>Total</strong></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/20)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/48)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/108)
</span>
</td>
</tr>
</table>
<br/>
<br/>
<pre>
<code class="sourceCode" id="sourceCode">&nbsp;package it.polimi.ingsw.gc14;
&nbsp;
&nbsp;import it.polimi.ingsw.gc14.Controller.GameController;
&nbsp;import it.polimi.ingsw.gc14.Model.Game;
&nbsp;import it.polimi.ingsw.gc14.Model.GamePackage.GameStages;
&nbsp;import it.polimi.ingsw.gc14.Network.CompositeClientBroadcaster;
&nbsp;import it.polimi.ingsw.gc14.Network.EventType;
&nbsp;import it.polimi.ingsw.gc14.Network.NetworkEvent;
&nbsp;import it.polimi.ingsw.gc14.Network.NetworkEvents.*;
&nbsp;
&nbsp;import java.util.ArrayList;
&nbsp;import java.util.List;
&nbsp;import java.util.Map;
&nbsp;import java.util.concurrent.*;
&nbsp;import java.util.stream.Collectors;
&nbsp;
&nbsp;/**
&nbsp; * Processes game events from the action queue and routes each one
&nbsp; * based on the current game state.
&nbsp; *
&nbsp; * &lt;p&gt;The three top-level states that determine routing are:
&nbsp; * &lt;ul&gt;
&nbsp; * &lt;li&gt;&lt;b&gt;Inactive&lt;/b&gt; – no game model is present, or the game has ended.
&nbsp; * Only disconnection clean-up is performed.&lt;/li&gt;
&nbsp; * &lt;li&gt;&lt;b&gt;Suspended&lt;/b&gt; – a forfeit timer is running because exactly one
&nbsp; * player remains online. Only reconnection events are accepted.&lt;/li&gt;
&nbsp; * &lt;li&gt;&lt;b&gt;Active&lt;/b&gt; – normal gameplay; every event is applied, saved,
&nbsp; * and broadcast.&lt;/li&gt;
&nbsp; * &lt;/ul&gt;
&nbsp; *
&nbsp; * &lt;p&gt;This class is not thread-safe by itself: it relies on the caller
&nbsp; * (the game loop in {@code ServerLauncher}) to drive it from a single
&nbsp; * thread via {@link #doFirstEvent()}.
&nbsp; */
&nbsp;public class GameEventProcessor {
&nbsp;
&nbsp; private final BlockingQueue&lt;NetworkEvent&gt; actionQueue;
&nbsp; private final GameController gameController;
&nbsp; private final LimitedMap&lt;String, Boolean&gt; playerList;
&nbsp; private final CompositeClientBroadcaster broadcaster;
&nbsp; private final SaveManager saveManager;
&nbsp;
&nbsp; /** Single-thread executor used exclusively for the forfeit timer. Daemon so it does not block JVM shutdown. */
<b class="nc">&nbsp; private final ScheduledExecutorService timerExecutor =</b>
<b class="nc">&nbsp; Executors.newSingleThreadScheduledExecutor(r -&gt; {</b>
<b class="nc">&nbsp; Thread t = new Thread(r, &quot;forfeit-timer&quot;);</b>
<b class="nc">&nbsp; t.setDaemon(true);</b>
<b class="nc">&nbsp; return t;</b>
&nbsp; });
&nbsp;
&nbsp; /**
&nbsp; * Handle to the running forfeit timer, or {@code null} when no timer is active.
&nbsp; * A non-null value signals that the game is in the {@em suspended} state.
&nbsp; */
&nbsp; private ScheduledFuture&lt;?&gt; disconnectionTimer;
&nbsp;
&nbsp; /**
&nbsp; * Constructs a {@code GameEventProcessor} with all required dependencies.
&nbsp; *
&nbsp; * @param actionQueue the queue from which incoming events are consumed.
&nbsp; * @param gameController the server-side game controller.
&nbsp; * @param playerList the shared map tracking each player&#39;s online status.
&nbsp; * @param broadcaster the broadcaster used to notify all connected clients.
&nbsp; * @param saveManager the save manager used to persist the game state.
&nbsp; */
&nbsp; public GameEventProcessor(
&nbsp; BlockingQueue&lt;NetworkEvent&gt; actionQueue,
&nbsp; GameController gameController,
&nbsp; LimitedMap&lt;String, Boolean&gt; playerList,
&nbsp; CompositeClientBroadcaster broadcaster,
<b class="nc">&nbsp; SaveManager saveManager) {</b>
<b class="nc">&nbsp; this.actionQueue = actionQueue;</b>
<b class="nc">&nbsp; this.gameController = gameController;</b>
<b class="nc">&nbsp; this.playerList = playerList;</b>
<b class="nc">&nbsp; this.broadcaster = broadcaster;</b>
<b class="nc">&nbsp; this.saveManager = saveManager;</b>
&nbsp; }
&nbsp;
&nbsp; // ── Public entry point ────────────────────────────────────────────────────
&nbsp;
&nbsp; /**
&nbsp; * Blocks until one event is available in the queue, then routes it to the
&nbsp; * appropriate handler based on the current game state.
&nbsp; *
&nbsp; * @throws InterruptedException if the thread is interrupted while waiting
&nbsp; * for the next event.
&nbsp; */
&nbsp; public void doFirstEvent() throws InterruptedException {
<b class="nc">&nbsp; NetworkEvent event = actionQueue.take();</b>
&nbsp;
<b class="nc">&nbsp; if (!isGameActive()) {</b>
<b class="nc">&nbsp; handleInactiveGame(event);</b>
<b class="nc">&nbsp; } else if (isSuspended()) {</b>
<b class="nc">&nbsp; handleSuspendedGame(event);</b>
&nbsp; } else {
<b class="nc">&nbsp; applyAndBroadcast(event);</b>
&nbsp; }
&nbsp; }
&nbsp;
&nbsp; // ── State guards ──────────────────────────────────────────────────────────
&nbsp;
&nbsp; /**
&nbsp; * Returns {@code true} when there is an ongoing game that has not yet ended.
&nbsp; */
&nbsp; private boolean isGameActive() {
<b class="nc">&nbsp; Game model = gameController.getModel();</b>
<b class="nc">&nbsp; return model != null</b>
<b class="nc">&nbsp; &amp;&amp; model.getCurrentState().getGameStage() != GameStages.ENDED;</b>
&nbsp; }
&nbsp;
&nbsp; /**
&nbsp; * Returns {@code true} when the forfeit timer is running, meaning only one
&nbsp; * player is currently online and the game is waiting for a reconnection.
&nbsp; */
&nbsp; private boolean isSuspended() {
<b class="nc">&nbsp; return disconnectionTimer != null;</b>
&nbsp; }
&nbsp;
&nbsp; // ── Inactive game path ────────────────────────────────────────────────────
&nbsp;
&nbsp; /**
&nbsp; * Handles events that arrive when no active game exists (not yet started,
&nbsp; * or already ended). Only disconnection clean-up is relevant here.
&nbsp; *
&nbsp; * @param event the incoming event.
&nbsp; */
&nbsp; private void handleInactiveGame(NetworkEvent event) {
<b class="nc">&nbsp; if (event.getEventType() != EventType.DISCONNECTED_PLAYER) return;</b>
&nbsp;
<b class="nc">&nbsp; synchronized (gameController) {</b>
<b class="nc">&nbsp; playerList.remove(event.getUsername());</b>
<b class="nc">&nbsp; if (playerList.isEmpty()) {</b>
<b class="nc">&nbsp; gameController.setModel(null);</b>
<b class="nc">&nbsp; System.out.println(&quot;\n!!! Player list is now empty, ready for a new game init !!!\n&quot;);</b>
&nbsp; }
<b class="nc">&nbsp; }</b>
&nbsp; }
&nbsp;
&nbsp; // ── Suspended game path ───────────────────────────────────────────────────
&nbsp;
&nbsp; /**
&nbsp; * Routes events while the game is suspended waiting for a reconnection.
&nbsp; * &lt;ul&gt;
&nbsp; * &lt;li&gt;A second disconnection while suspended means no player remains
&nbsp; * online: the game is aborted entirely.&lt;/li&gt;
&nbsp; * &lt;li&gt;Any non-reconnection event is rejected with an error.&lt;/li&gt;
&nbsp; * &lt;li&gt;A reconnection event is allowed through to {@link #applyAndBroadcast}.&lt;/li&gt;
&nbsp; * &lt;/ul&gt;
&nbsp; *
&nbsp; * @param event the incoming event.
&nbsp; */
&nbsp; private void handleSuspendedGame(NetworkEvent event) {
<b class="nc">&nbsp; switch (event.getEventType()) {</b>
<b class="nc">&nbsp; case DISCONNECTED_PLAYER -&gt; abortGame();</b>
<b class="nc">&nbsp; case RECONNECT_PLAYER -&gt; applyAndBroadcast(event);</b>
<b class="nc">&nbsp; default -&gt; rejectEvent(event);</b>
&nbsp; }
&nbsp; }
&nbsp;
&nbsp; /**
&nbsp; * Cancels the forfeit timer, clears the player list, and resets the model.
&nbsp; * Called when the last remaining player disconnects while the game is suspended.
&nbsp; */
&nbsp; private void abortGame() {
<b class="nc">&nbsp; disconnectionTimer.cancel(true);</b>
<b class="nc">&nbsp; disconnectionTimer = null;</b>
<b class="nc">&nbsp; playerList.clear();</b>
<b class="nc">&nbsp; gameController.setModel(null);</b>
<b class="nc">&nbsp; System.out.println(&quot;\n!!! All players disconnected — game aborted, ready for a new game init !!!\n&quot;);</b>
&nbsp; }
&nbsp;
&nbsp; /**
&nbsp; * Marks the event as an error and broadcasts it back to the requesting
&nbsp; * player. Used to reject actions that are not permitted in the current state.
&nbsp; *
&nbsp; * @param event the event to reject.
&nbsp; */
&nbsp; private void rejectEvent(NetworkEvent event) {
<b class="nc">&nbsp; event.setIsError(true);</b>
<b class="nc">&nbsp; broadcaster.notifyAll(event);</b>
&nbsp; }
&nbsp;
&nbsp; // ── Active game path ──────────────────────────────────────────────────────
&nbsp;
&nbsp; /**
&nbsp; * Applies the event to the game controller, saves the updated state,
&nbsp; * and broadcasts the result to connected clients.
&nbsp; *
&nbsp; * &lt;p&gt;The entire method body is synchronized on {@code gameController} to
&nbsp; * prevent concurrent modification of the game model by the network threads.
&nbsp; *
&nbsp; * @param event the event to apply.
&nbsp; */
&nbsp; private void applyAndBroadcast(NetworkEvent event) {
<b class="nc">&nbsp; synchronized (gameController) {</b>
<b class="nc">&nbsp; int roundBefore = gameController.getModel().getCurrentState().getRound();</b>
&nbsp;
<b class="nc">&nbsp; event.setIsError(!event.apply(gameController));</b>
<b class="nc">&nbsp; Game game = gameController.getModel();</b>
&nbsp;
<b class="nc">&nbsp; if (event.isError()) {</b>
<b class="nc">&nbsp; broadcaster.notifyAll(event);</b>
<b class="nc">&nbsp; return;</b>
&nbsp; }
&nbsp;
<b class="nc">&nbsp; cancelForfeitTimerIfReconnect(event);</b>
&nbsp;
<b class="nc">&nbsp; if (!saveManager.save(game)) {</b>
<b class="nc">&nbsp; System.out.println(&quot;\n!!! Save failed !!!\n&quot;);</b>
&nbsp; }
&nbsp;
&nbsp; // During the lobby phase a disconnection only removes the player
&nbsp; // from the list; no broadcast is needed.
<b class="nc">&nbsp; if (event.getEventType() == EventType.DISCONNECTED_PLAYER</b>
<b class="nc">&nbsp; &amp;&amp; game.getCurrentState().getGameStage() == GameStages.WAITING) {</b>
<b class="nc">&nbsp; playerList.remove(event.getUsername());</b>
<b class="nc">&nbsp; return;</b>
&nbsp; }
&nbsp;
<b class="nc">&nbsp; enrichEvent(event, game);</b>
<b class="nc">&nbsp; startForfeitTimerIfNeeded(event, game);</b>
<b class="nc">&nbsp; broadcastResult(event, game, roundBefore);</b>
<b class="nc">&nbsp; }</b>
&nbsp; }
&nbsp;
&nbsp; /**
&nbsp; * Cancels the forfeit timer if the event is a successful reconnection.
&nbsp; *
&nbsp; * @param event the event that was just successfully applied.
&nbsp; */
&nbsp; private void cancelForfeitTimerIfReconnect(NetworkEvent event) {
<b class="nc">&nbsp; if (event.getEventType() == EventType.RECONNECT_PLAYER</b>
&nbsp; &amp;&amp; disconnectionTimer != null
<b class="nc">&nbsp; &amp;&amp; !disconnectionTimer.isDone()) {</b>
<b class="nc">&nbsp; disconnectionTimer.cancel(false);</b>
<b class="nc">&nbsp; disconnectionTimer = null;</b>
&nbsp; }
&nbsp; }
&nbsp;
&nbsp; /**
&nbsp; * Populates the event with the current game state so that clients can
&nbsp; * update their mini-model after receiving it.
&nbsp; *
&nbsp; * &lt;p&gt;Each event subclass overrides {@link NetworkEvent#enrichWithGameState}
&nbsp; * to append any type-specific extra fields (available totems, etc.).
&nbsp; *
&nbsp; * @param event the event to enrich.
&nbsp; * @param game the current game model.
&nbsp; */
&nbsp; private void enrichEvent(NetworkEvent event, Game game) {
<b class="nc">&nbsp; event.enrichWithGameState(game, buildDisconnectedList(game));</b>
&nbsp; }
&nbsp;
&nbsp; /**
&nbsp; * Schedules the 60-second forfeit timer if a disconnection has left
&nbsp; * exactly one player online.
&nbsp; *
&nbsp; * &lt;p&gt;If a previous timer is still pending it is cancelled first to avoid
&nbsp; * duplicate timers.
&nbsp; *
&nbsp; * @param event the event that was just applied.
&nbsp; * @param game the current game model.
&nbsp; */
&nbsp; private void startForfeitTimerIfNeeded(NetworkEvent event, Game game) {
<b class="nc">&nbsp; if (event.getEventType() != EventType.DISCONNECTED_PLAYER) return;</b>
<b class="nc">&nbsp; if (game.getCurrentState().getGameStage() == GameStages.ENDED) return;</b>
<b class="nc">&nbsp; if (onlinePlayerCount() != 1) return;</b>
&nbsp;
<b class="nc">&nbsp; if (disconnectionTimer != null &amp;&amp; !disconnectionTimer.isDone()) {</b>
<b class="nc">&nbsp; disconnectionTimer.cancel(false);</b>
&nbsp; }
&nbsp;
<b class="nc">&nbsp; disconnectionTimer = timerExecutor.schedule(</b>
<b class="nc">&nbsp; () -&gt; endGameForfeit(game),</b>
&nbsp; 1, TimeUnit.MINUTES
&nbsp; );
&nbsp; }
&nbsp;
&nbsp; /**
&nbsp; * Ends the game by forfeit when the timer expires without a reconnection.
&nbsp; * Broadcasts an {@link EndedGame} event, deletes the save, and resets state.
&nbsp; *
&nbsp; * @param game the game model captured when the timer was scheduled.
&nbsp; */
&nbsp; private void endGameForfeit(Game game) {
<b class="nc">&nbsp; synchronized (gameController) {</b>
<b class="nc">&nbsp; gameController.endGameForfeit();</b>
<b class="nc">&nbsp; EndedGame forfeitEnd = new EndedGame(</b>
<b class="nc">&nbsp; game.getSlotMap(), game.getOrderLogicCard(),</b>
<b class="nc">&nbsp; game.getCurrentState(), game.getPlayerStanding()</b>
&nbsp; );
<b class="nc">&nbsp; broadcaster.notifyAll(forfeitEnd);</b>
<b class="nc">&nbsp; System.out.println(&quot;Timer expired: no player reconnected in 60 s.&quot;);</b>
<b class="nc">&nbsp; removeOfflinePlayers();</b>
<b class="nc">&nbsp; if (!saveManager.delete()) {</b>
<b class="nc">&nbsp; System.out.println(&quot;\n!!! Couldn&#39;t delete save !!!\n&quot;);</b>
&nbsp; }
<b class="nc">&nbsp; disconnectionTimer = null;</b>
<b class="nc">&nbsp; }</b>
&nbsp; }
&nbsp;
&nbsp; /**
&nbsp; * Determines what to broadcast after a successful event application:
&nbsp; * &lt;ul&gt;
&nbsp; * &lt;li&gt;If the round advanced, an {@link ApplyNextRound} event (with updated
&nbsp; * card lists) replaces the original event.&lt;/li&gt;
&nbsp; * &lt;li&gt;If the game has ended, an {@link EndedGame} event is sent and the
&nbsp; * save file is deleted.&lt;/li&gt;
&nbsp; * &lt;li&gt;Otherwise the original event is broadcast as-is.&lt;/li&gt;
&nbsp; * &lt;/ul&gt;
&nbsp; *
&nbsp; * @param event the event that was applied.
&nbsp; * @param game the current game model (post-apply).
&nbsp; * @param roundBefore the round number before the event was applied.
&nbsp; */
&nbsp; private void broadcastResult(NetworkEvent event, Game game, int roundBefore) {
<b class="nc">&nbsp; broadcaster.notifyAll(event);</b>
<b class="nc">&nbsp; if (game.getCurrentState().getRound() != roundBefore) {</b>
<b class="nc">&nbsp; ApplyNextRound nextRound = new ApplyNextRound(</b>
<b class="nc">&nbsp; game.getSlotMap(), game.getOrderLogicCard(), game.getCurrentState(),</b>
<b class="nc">&nbsp; game.getPlayers(),</b>
<b class="nc">&nbsp; game.getUpperListTribeCards(), game.getLowerListTribeCards(),</b>
<b class="nc">&nbsp; game.getUpperListBuilding(), game.getLowerListBuilding()</b>
&nbsp; );
<b class="nc">&nbsp; broadcaster.notifyAll(nextRound);</b>
<b class="nc">&nbsp; } else if (game.getCurrentState().getGameStage() == GameStages.ENDED) {</b>
<b class="nc">&nbsp; EndedGame endedGame = new EndedGame(</b>
<b class="nc">&nbsp; game.getSlotMap(), game.getOrderLogicCard(),</b>
<b class="nc">&nbsp; game.getCurrentState(), game.getPlayerStanding()</b>
&nbsp; );
<b class="nc">&nbsp; broadcaster.notifyAll(endedGame);</b>
<b class="nc">&nbsp; if (!saveManager.delete()) {</b>
<b class="nc">&nbsp; System.out.println(&quot;\n!!! Couldn&#39;t delete save !!!\n&quot;);</b>
&nbsp; }
<b class="nc">&nbsp; removeOfflinePlayers();</b>
&nbsp; }
&nbsp; }
&nbsp;
&nbsp; // ── Utilities ─────────────────────────────────────────────────────────────
&nbsp;
&nbsp; /**
&nbsp; * Returns the number of players currently marked as online in the player list.
&nbsp; */
&nbsp; private long onlinePlayerCount() {
<b class="nc">&nbsp; return playerList.values().stream().filter(v -&gt; v).count();</b>
&nbsp; }
&nbsp;
&nbsp; /**
&nbsp; * Builds the list of usernames of players currently marked as disconnected
&nbsp; * in the game model.
&nbsp; *
&nbsp; * @param game the current game model.
&nbsp; * @return a new {@link ArrayList} of disconnected usernames.
&nbsp; */
&nbsp; private ArrayList&lt;String&gt; buildDisconnectedList(Game game) {
<b class="nc">&nbsp; return game.getDisconnectedPlayers().entrySet().stream()</b>
<b class="nc">&nbsp; .filter(Map.Entry::getValue)</b>
<b class="nc">&nbsp; .map(e -&gt; e.getKey().getUserName())</b>
<b class="nc">&nbsp; .collect(Collectors.toCollection(ArrayList::new));</b>
&nbsp; }
&nbsp;
&nbsp; /**
&nbsp; * Removes all offline entries (value {@code false}) from the player list.
&nbsp; * Online players remain until they disconnect naturally.
&nbsp; */
&nbsp; private void removeOfflinePlayers() {
<b class="nc">&nbsp; List&lt;String&gt; toRemove = playerList.entrySet().stream()</b>
<b class="nc">&nbsp; .filter(e -&gt; !e.getValue())</b>
<b class="nc">&nbsp; .map(Map.Entry::getKey)</b>
<b class="nc">&nbsp; .toList();</b>
<b class="nc">&nbsp; toRemove.forEach(playerList::remove);</b>
&nbsp; }
&nbsp;}
</code>
</pre>
</div>
<script type="text/javascript">
(function() {
var msie = false, msie9 = false;
/*@cc_on
msie = true;
@if (@_jscript_version >= 9)
msie9 = true;
@end
@*/
if (!msie || msie && msie9) {
hljs.highlightAll()
hljs.initLineNumbersOnLoad();
}
})();
</script>
<div class="footer">
<div style="float:right;">generated on 2026-06-14 21:53</div>
</div>
</body>
</html>
@@ -0,0 +1,236 @@
<!DOCTYPE html>
<html id="htmlId">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Coverage Report > LimitedMap</title>
<style type="text/css">
@import "../../css/coverage.css";
@import "../../css/idea.min.css";
</style>
<script type="text/javascript" src="../../js/highlight.min.js"></script>
<script type="text/javascript" src="../../js/highlightjs-line-numbers.min.js"></script>
</head>
<body>
<div class="content">
<div class="breadCrumbs">
Current scope: <a href="../../index.html">all classes</a>
<span class="separator">|</span>
<a href="../index.html">it.polimi.ingsw.gc14</a>
</div>
<h1>Coverage Summary for Class: LimitedMap (it.polimi.ingsw.gc14)</h1>
<table class="coverageStats">
<tr>
<th class="name">Class</th>
<th class="coverageStat
">
Class, %
</th>
<th class="coverageStat
">
Method, %
</th>
<th class="coverageStat
">
Branch, %
</th>
<th class="coverageStat
">
Line, %
</th>
</tr>
<tr>
<td class="name">LimitedMap</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/16)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/10)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/28)
</span>
</td>
</tr>
</table>
<br/>
<br/>
<pre>
<code class="sourceCode" id="sourceCode">&nbsp;package it.polimi.ingsw.gc14;
&nbsp;
&nbsp;import java.util.Collection;
&nbsp;import java.util.Map;
&nbsp;import java.util.Set;
&nbsp;import java.util.concurrent.ConcurrentHashMap;
&nbsp;
&nbsp;/**
&nbsp; * A {@link ConcurrentHashMap}-backed map with a configurable size limit and an associated action.
&nbsp; * When the number of elements reaches or exceeds the limit, the specified action is automatically triggered.
&nbsp; * This implementation is thread-safe for {@code put}; callers that need compound operations must synchronize externally.
&nbsp; *
&nbsp; * @param &lt;K&gt; the type of keys maintained by this map.
&nbsp; * @param &lt;V&gt; the type of mapped values.
&nbsp; */
&nbsp;public class LimitedMap&lt;K, V&gt; implements Map&lt;K, V&gt; {
&nbsp;
<b class="nc">&nbsp; private final ConcurrentHashMap&lt;K, V&gt; map = new ConcurrentHashMap&lt;&gt;();</b>
&nbsp;
&nbsp; /**
&nbsp; * The maximum number of elements allowed in the map before the action is triggered.
&nbsp; */
&nbsp; private volatile int limit;
&nbsp;
&nbsp; /**
&nbsp; * The action to execute when the map size reaches or exceeds the limit.
&nbsp; */
&nbsp; private volatile Runnable action;
&nbsp;
&nbsp; /**
&nbsp; * Creates a new {@code LimitedMap} with the specified limit and action.
&nbsp; *
&nbsp; * @param limit the maximum number of elements before the action is triggered.
&nbsp; * @param action the action to execute when the limit is reached.
&nbsp; */
<b class="nc">&nbsp; public LimitedMap(int limit, Runnable action) {</b>
<b class="nc">&nbsp; this.limit = limit;</b>
<b class="nc">&nbsp; this.action = action;</b>
&nbsp; }
&nbsp;
&nbsp; /**
&nbsp; * Associates the specified value with the specified key in this map.
&nbsp; * If the map size reaches or exceeds the limit after the insertion, the configured action is triggered.
&nbsp; *
&nbsp; * @param key the key with which the specified value is to be associated.
&nbsp; * @param value the value to be associated with the specified key.
&nbsp; * @return the previous value associated with the key, or {@code null} if there was no mapping.
&nbsp; */
&nbsp; @Override
&nbsp; public synchronized V put(K key, V value) {
<b class="nc">&nbsp; boolean added = true;</b>
<b class="nc">&nbsp; if (map.size() == limit) {</b>
<b class="nc">&nbsp; if (!map.containsKey(key))</b>
<b class="nc">&nbsp; return null;</b>
<b class="nc">&nbsp; added = false;</b>
&nbsp; }
<b class="nc">&nbsp; V result = map.put(key, value);</b>
<b class="nc">&nbsp; if (map.size() &gt;= limit &amp;&amp; added) {</b>
<b class="nc">&nbsp; action.run();</b>
&nbsp; }
<b class="nc">&nbsp; return result;</b>
&nbsp; }
&nbsp;
&nbsp; @Override
<b class="nc">&nbsp; public synchronized V remove(Object key) { return map.remove(key); }</b>
&nbsp;
&nbsp; @Override
<b class="nc">&nbsp; public V get(Object key) { return map.get(key); }</b>
&nbsp;
&nbsp; @Override
<b class="nc">&nbsp; public boolean containsKey(Object key) { return map.containsKey(key); }</b>
&nbsp;
&nbsp; @Override
<b class="nc">&nbsp; public boolean containsValue(Object value) { return map.containsValue(value); }</b>
&nbsp;
&nbsp; @Override
<b class="nc">&nbsp; public int size() { return map.size(); }</b>
&nbsp;
&nbsp; @Override
<b class="nc">&nbsp; public boolean isEmpty() { return map.isEmpty(); }</b>
&nbsp;
&nbsp; @Override
<b class="nc">&nbsp; public void putAll(Map&lt;? extends K, ? extends V&gt; m) { m.forEach(this::put); }</b>
&nbsp;
&nbsp; @Override
<b class="nc">&nbsp; public void clear() { map.clear(); }</b>
&nbsp;
&nbsp; @Override
<b class="nc">&nbsp; public Set&lt;K&gt; keySet() { return map.keySet(); }</b>
&nbsp;
&nbsp; @Override
<b class="nc">&nbsp; public Collection&lt;V&gt; values() { return map.values(); }</b>
&nbsp;
&nbsp; @Override
<b class="nc">&nbsp; public Set&lt;Entry&lt;K, V&gt;&gt; entrySet() { return map.entrySet(); }</b>
&nbsp;
&nbsp; /**
&nbsp; * Sets a new size limit for this map.
&nbsp; *
&nbsp; * @param num the new limit.
&nbsp; */
<b class="nc">&nbsp; public void setLimit(int num) { this.limit = num; }</b>
&nbsp;
&nbsp; /**
&nbsp; * Returns the current size limit of this map.
&nbsp; *
&nbsp; * @return the current limit.
&nbsp; */
<b class="nc">&nbsp; public int getLimit() { return limit; }</b>
&nbsp;
&nbsp; /**
&nbsp; * Sets a new action to execute when the map size reaches or exceeds the limit.
&nbsp; *
&nbsp; * @param action the new action to set; must not be {@code null}.
&nbsp; */
&nbsp; public void setAction(Runnable action) {
<b class="nc">&nbsp; if (action == null) throw new IllegalArgumentException(&quot;action must not be null&quot;);</b>
<b class="nc">&nbsp; this.action = action;</b>
&nbsp; }
&nbsp;}
</code>
</pre>
</div>
<script type="text/javascript">
(function() {
var msie = false, msie9 = false;
/*@cc_on
msie = true;
@if (@_jscript_version >= 9)
msie9 = true;
@end
@*/
if (!msie || msie && msie9) {
hljs.highlightAll()
hljs.initLineNumbersOnLoad();
}
})();
</script>
<div class="footer">
<div style="float:right;">generated on 2026-06-14 21:53</div>
</div>
</body>
</html>
@@ -0,0 +1,216 @@
<!DOCTYPE html>
<html id="htmlId">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Coverage Report > SaveManager</title>
<style type="text/css">
@import "../../css/coverage.css";
@import "../../css/idea.min.css";
</style>
<script type="text/javascript" src="../../js/highlight.min.js"></script>
<script type="text/javascript" src="../../js/highlightjs-line-numbers.min.js"></script>
</head>
<body>
<div class="content">
<div class="breadCrumbs">
Current scope: <a href="../../index.html">all classes</a>
<span class="separator">|</span>
<a href="../index.html">it.polimi.ingsw.gc14</a>
</div>
<h1>Coverage Summary for Class: SaveManager (it.polimi.ingsw.gc14)</h1>
<table class="coverageStats">
<tr>
<th class="name">Class</th>
<th class="coverageStat
">
Class, %
</th>
<th class="coverageStat
">
Method, %
</th>
<th class="coverageStat
">
Line, %
</th>
</tr>
<tr>
<td class="name">SaveManager</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/4)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/23)
</span>
</td>
</tr>
</table>
<br/>
<br/>
<pre>
<code class="sourceCode" id="sourceCode">&nbsp;package it.polimi.ingsw.gc14;
&nbsp;
&nbsp;import it.polimi.ingsw.gc14.Model.Game;
&nbsp;
&nbsp;import java.io.BufferedInputStream;
&nbsp;import java.io.BufferedOutputStream;
&nbsp;import java.io.FileInputStream;
&nbsp;import java.io.FileNotFoundException;
&nbsp;import java.io.FileOutputStream;
&nbsp;import java.io.IOException;
&nbsp;import java.io.ObjectInputStream;
&nbsp;import java.io.ObjectOutputStream;
&nbsp;import java.net.URISyntaxException;
&nbsp;import java.nio.file.Files;
&nbsp;import java.nio.file.Path;
&nbsp;import java.nio.file.Paths;
&nbsp;
&nbsp;/**
&nbsp; * Handles persistence of the game model to and from disk.
&nbsp; *
&nbsp; * &lt;p&gt;The save file is stored at {@code GameSaves/save.dat} relative to the
&nbsp; * directory containing the running JAR. The anchor class passed to the
&nbsp; * constructor is used to resolve that directory at construction time.
&nbsp; *
&nbsp; * &lt;p&gt;All three operations ({@link #save}, {@link #load}, {@link #delete})
&nbsp; * are independent and safe to call in any order; missing files are treated
&nbsp; * as a normal condition (no save present) rather than an error.
&nbsp; */
&nbsp;public class SaveManager {
&nbsp;
&nbsp; /** Relative sub-path of the save file inside the JAR directory. */
&nbsp; private static final String SAVE_RELATIVE_PATH = &quot;GameSaves/save.dat&quot;;
&nbsp;
&nbsp; /** Absolute path of the save file, resolved once at construction. */
&nbsp; private final Path filePath;
&nbsp;
&nbsp; /**
&nbsp; * Constructs a {@code SaveManager} whose save file is located relative
&nbsp; * to the JAR directory of the given anchor class.
&nbsp; *
&nbsp; * @param anchorClass the class whose code-source location is used as
&nbsp; * the base directory for the save file.
&nbsp; * @throws RuntimeException if the JAR path cannot be resolved.
&nbsp; */
<b class="nc">&nbsp; public SaveManager(Class&lt;?&gt; anchorClass) {</b>
&nbsp; try {
<b class="nc">&nbsp; Path jarDir = Paths.get(</b>
<b class="nc">&nbsp; anchorClass.getProtectionDomain().getCodeSource().getLocation().toURI()</b>
<b class="nc">&nbsp; ).getParent();</b>
<b class="nc">&nbsp; this.filePath = jarDir.resolve(SAVE_RELATIVE_PATH);</b>
&nbsp; } catch (URISyntaxException e) {
<b class="nc">&nbsp; throw new RuntimeException(&quot;Could not resolve save file path&quot;, e);</b>
&nbsp; }
&nbsp; }
&nbsp;
&nbsp; /**
&nbsp; * Serializes the game model to disk, creating parent directories if needed.
&nbsp; *
&nbsp; * @param game the game model to persist.
&nbsp; * @return {@code true} if the save succeeded, {@code false} on I/O error.
&nbsp; */
&nbsp; public boolean save(Game game) {
&nbsp; try {
<b class="nc">&nbsp; Files.createDirectories(filePath.getParent());</b>
<b class="nc">&nbsp; try (ObjectOutputStream oos = new ObjectOutputStream(</b>
<b class="nc">&nbsp; new BufferedOutputStream(new FileOutputStream(filePath.toFile())))) {</b>
<b class="nc">&nbsp; oos.writeObject(game);</b>
<b class="nc">&nbsp; System.out.println(&quot;Game saved to: &quot; + filePath.toAbsolutePath());</b>
<b class="nc">&nbsp; return true;</b>
&nbsp; }
&nbsp; } catch (IOException e) {
<b class="nc">&nbsp; e.printStackTrace();</b>
<b class="nc">&nbsp; return false;</b>
&nbsp; }
&nbsp; }
&nbsp;
&nbsp; /**
&nbsp; * Deserializes the game model from disk.
&nbsp; *
&nbsp; * @return the saved {@link Game} instance, or {@code null} if no save file
&nbsp; * exists or an I/O error prevents reading.
&nbsp; * @throws RuntimeException if the serialized class cannot be found on
&nbsp; * the classpath (indicates a deployment mismatch).
&nbsp; */
&nbsp; public Game load() {
<b class="nc">&nbsp; try (ObjectInputStream ois = new ObjectInputStream(</b>
<b class="nc">&nbsp; new BufferedInputStream(new FileInputStream(filePath.toFile())))) {</b>
<b class="nc">&nbsp; return (Game) ois.readObject();</b>
&nbsp; } catch (FileNotFoundException e) {
<b class="nc">&nbsp; return null;</b>
&nbsp; } catch (IOException e) {
<b class="nc">&nbsp; e.printStackTrace();</b>
<b class="nc">&nbsp; return null;</b>
&nbsp; } catch (ClassNotFoundException e) {
<b class="nc">&nbsp; throw new RuntimeException(&quot;Save file references an unknown class&quot;, e);</b>
&nbsp; }
&nbsp; }
&nbsp;
&nbsp; /**
&nbsp; * Deletes the save file.
&nbsp; *
&nbsp; * @return {@code true} if the file was deleted, {@code false} otherwise
&nbsp; * (including when the file did not exist).
&nbsp; */
&nbsp; public boolean delete() {
&nbsp; try {
<b class="nc">&nbsp; return Files.deleteIfExists(filePath);</b>
&nbsp; } catch (IOException e) {
<b class="nc">&nbsp; return false;</b>
&nbsp; }
&nbsp; }
&nbsp;}
</code>
</pre>
</div>
<script type="text/javascript">
(function() {
var msie = false, msie9 = false;
/*@cc_on
msie = true;
@if (@_jscript_version >= 9)
msie9 = true;
@end
@*/
if (!msie || msie && msie9) {
hljs.highlightAll()
hljs.initLineNumbersOnLoad();
}
})();
</script>
<div class="footer">
<div style="float:right;">generated on 2026-06-14 21:53</div>
</div>
</body>
</html>
@@ -0,0 +1,340 @@
<!DOCTYPE html>
<html id="htmlId">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Coverage Report > ServerLauncher</title>
<style type="text/css">
@import "../../css/coverage.css";
@import "../../css/idea.min.css";
</style>
<script type="text/javascript" src="../../js/highlight.min.js"></script>
<script type="text/javascript" src="../../js/highlightjs-line-numbers.min.js"></script>
</head>
<body>
<div class="content">
<div class="breadCrumbs">
Current scope: <a href="../../index.html">all classes</a>
<span class="separator">|</span>
<a href="../index.html">it.polimi.ingsw.gc14</a>
</div>
<h1>Coverage Summary for Class: ServerLauncher (it.polimi.ingsw.gc14)</h1>
<table class="coverageStats">
<tr>
<th class="name">Class</th>
<th class="coverageStat
">
Class, %
</th>
<th class="coverageStat
">
Method, %
</th>
<th class="coverageStat
">
Branch, %
</th>
<th class="coverageStat
">
Line, %
</th>
</tr>
<tr>
<td class="name">ServerLauncher</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/8)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/24)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/72)
</span>
</td>
</tr>
</table>
<br/>
<br/>
<pre>
<code class="sourceCode" id="sourceCode">&nbsp;package it.polimi.ingsw.gc14;
&nbsp;
&nbsp;import it.polimi.ingsw.gc14.Controller.GameController;
&nbsp;import it.polimi.ingsw.gc14.Model.Game;
&nbsp;import it.polimi.ingsw.gc14.Model.MiniModel;
&nbsp;import it.polimi.ingsw.gc14.Model.Player;
&nbsp;import it.polimi.ingsw.gc14.Network.CompositeClientBroadcaster;
&nbsp;import it.polimi.ingsw.gc14.Network.NetworkEvent;
&nbsp;import it.polimi.ingsw.gc14.Network.RMI.Server.RMIServer;
&nbsp;import it.polimi.ingsw.gc14.Network.NetworkConfig;
&nbsp;import it.polimi.ingsw.gc14.Network.TCP.Server.TCPServer;
&nbsp;
&nbsp;import java.net.*;
&nbsp;import java.rmi.RemoteException;
&nbsp;import java.util.*;
&nbsp;import java.util.concurrent.*;
&nbsp;import java.util.stream.Collectors;
&nbsp;
&nbsp;/**
&nbsp; * Main server entry point.
&nbsp; *
&nbsp; * &lt;p&gt;Responsibilities of this class are intentionally limited to wiring:
&nbsp; * it creates all components, connects them together, restores a previously
&nbsp; * saved game if one exists, and starts the event-processing loop and the
&nbsp; * network servers.
&nbsp; *
&nbsp; * &lt;p&gt;All game-logic and event-routing decisions are delegated to
&nbsp; * {@link GameEventProcessor}; persistence is delegated to {@link SaveManager}.
&nbsp; *
&nbsp; * &lt;p&gt;The original {@code ServerLauncher} class is preserved and untouched.
&nbsp; * This class is a clean replacement that uses the new component structure.
&nbsp; */
&nbsp;public class ServerLauncher {
&nbsp;
&nbsp; /** Drives the main game-event loop. */
&nbsp; private final GameEventProcessor eventProcessor;
&nbsp;
&nbsp; /**
&nbsp; * Constructs a {@code ServerLauncherTest} and wires all components together.
&nbsp; *
&nbsp; * @param actionQueue the shared event queue.
&nbsp; * @param gameController the server-side game controller.
&nbsp; * @param playerList the shared player-status map.
&nbsp; * @param broadcaster the broadcaster used to reach all connected clients.
&nbsp; * @param saveManager the save manager used to persist game state.
&nbsp; */
&nbsp; public ServerLauncher(
&nbsp; BlockingQueue&lt;NetworkEvent&gt; actionQueue,
&nbsp; GameController gameController,
&nbsp; LimitedMap&lt;String, Boolean&gt; playerList,
&nbsp; CompositeClientBroadcaster broadcaster,
<b class="nc">&nbsp; SaveManager saveManager) {</b>
<b class="nc">&nbsp; this.eventProcessor = new GameEventProcessor(</b>
&nbsp; actionQueue, gameController, playerList, broadcaster, saveManager);
&nbsp; }
&nbsp;
&nbsp; // ── Entry point ───────────────────────────────────────────────────────────
&nbsp;
&nbsp; /**
&nbsp; * Initialises all server components, wires them together, restores a saved
&nbsp; * game if available, and starts the event-processing loop and both network
&nbsp; * servers.
&nbsp; *
&nbsp; * @param args command-line arguments (unused).
&nbsp; * @throws RemoteException if the RMI server cannot be created.
&nbsp; */
&nbsp; public static void main(String[] args) throws RemoteException {
<b class="nc">&nbsp; LimitedMap&lt;String, Boolean&gt; playerList = new LimitedMap&lt;&gt;(5, () -&gt; {});</b>
<b class="nc">&nbsp; BlockingQueue&lt;NetworkEvent&gt; actionQueue = new LinkedBlockingQueue&lt;&gt;();</b>
<b class="nc">&nbsp; GameController gameController = new GameController();</b>
&nbsp;
&nbsp; String ip;
&nbsp; try {
<b class="nc">&nbsp; ip = chooseNetworkInterface(new Scanner(System.in));</b>
<b class="nc">&nbsp; System.out.println(ip);</b>
&nbsp; } catch (Exception e) {
<b class="nc">&nbsp; throw new RuntimeException(e);</b>
&nbsp; }
<b class="nc">&nbsp; System.setProperty(&quot;java.rmi.server.hostname&quot;, ip);</b>
&nbsp;
<b class="nc">&nbsp; RMIServer rmiServer = new RMIServer(gameController, NetworkConfig.RMI_PORT, actionQueue, playerList, ip);</b>
<b class="nc">&nbsp; TCPServer tcpServer = new TCPServer(gameController, NetworkConfig.TCP_PORT, NetworkConfig.HEARTBEAT_PORT, actionQueue, playerList);</b>
<b class="nc">&nbsp; CompositeClientBroadcaster broadcaster = new CompositeClientBroadcaster(rmiServer, tcpServer);</b>
<b class="nc">&nbsp; SaveManager saveManager = new SaveManager(ServerLauncher.class);</b>
&nbsp;
<b class="nc">&nbsp; restoreGameIfSaved(gameController, playerList, saveManager);</b>
&nbsp;
<b class="nc">&nbsp; ServerLauncher launcher = new ServerLauncher(</b>
&nbsp; actionQueue, gameController, playerList, broadcaster, saveManager);
&nbsp;
&nbsp; // When all required players have joined, broadcast the initial MiniModel.
<b class="nc">&nbsp; playerList.setAction(() -&gt; new Thread(() -&gt; {</b>
&nbsp; MiniModel miniModel;
<b class="nc">&nbsp; synchronized (gameController) {</b>
<b class="nc">&nbsp; Game game = gameController.getModel();</b>
<b class="nc">&nbsp; miniModel = new MiniModel(</b>
<b class="nc">&nbsp; game.getSlotMap(), game.getOrderLogicCard(), game.getCurrentState(),</b>
<b class="nc">&nbsp; game.getPlayers(), game.getAvailableTotems(),</b>
<b class="nc">&nbsp; game.getUpperListTribeCards(), game.getLowerListTribeCards(),</b>
<b class="nc">&nbsp; game.getUpperListBuilding(), game.getLowerListBuilding(),</b>
<b class="nc">&nbsp; game.getDisconnectedPlayers().entrySet().stream()</b>
<b class="nc">&nbsp; .filter(Map.Entry::getValue)</b>
<b class="nc">&nbsp; .map(e -&gt; e.getKey().getUserName())</b>
<b class="nc">&nbsp; .collect(Collectors.toCollection(ArrayList::new))</b>
&nbsp; );
<b class="nc">&nbsp; }</b>
<b class="nc">&nbsp; broadcaster.notifyAll(miniModel);</b>
<b class="nc">&nbsp; }).start());</b>
&nbsp;
<b class="nc">&nbsp; new Thread(() -&gt; {</b>
<b class="nc">&nbsp; try { launcher.run(); }</b>
&nbsp; catch (Exception e) {
<b class="nc">&nbsp; System.out.println(&quot;Unexpected exception in game loop&quot;);</b>
<b class="nc">&nbsp; e.printStackTrace();</b>
&nbsp; }
<b class="nc">&nbsp; }).start();</b>
&nbsp;
<b class="nc">&nbsp; rmiServer.start();</b>
<b class="nc">&nbsp; new Thread(() -&gt; tcpServer.start()).start();</b>
<b class="nc">&nbsp; System.out.println(&quot;Server RMI: &quot; + System.getProperty(&quot;java.rmi.server.hostname&quot;));</b>
&nbsp; }
&nbsp;
&nbsp; // ── Game loop ─────────────────────────────────────────────────────────────
&nbsp;
&nbsp; /**
&nbsp; * Runs the event-processing loop until the thread is interrupted.
&nbsp; *
&nbsp; * &lt;p&gt;A {@link ConcurrentModificationException} is caught and logged rather
&nbsp; */
&nbsp; public void run() {
&nbsp; while (true) {
&nbsp; try {
<b class="nc">&nbsp; eventProcessor.doFirstEvent();</b>
&nbsp; } catch (InterruptedException e) {
<b class="nc">&nbsp; Thread.currentThread().interrupt();</b>
&nbsp; break;
&nbsp; }
&nbsp; }
&nbsp; }
&nbsp;
&nbsp; // ── Crash recovery ────────────────────────────────────────────────────────
&nbsp;
&nbsp; /**
&nbsp; * Attempts to restore a previously saved game.
&nbsp; *
&nbsp; * &lt;p&gt;The save is discarded if all but at most one player was offline at the
&nbsp; * time of the crash, since there would be nobody to resume the game with.
&nbsp; * Otherwise the model is restored, the player-list limit is set, and each
&nbsp; * player who was offline at crash time is pre-populated as offline so the
&nbsp; * reconnection flow can handle them correctly.
&nbsp; *
&nbsp; * @param gameController the controller that will receive the restored model.
&nbsp; * @param playerList the player-status map to populate.
&nbsp; * @param saveManager the save manager to load from.
&nbsp; */
&nbsp; private static void restoreGameIfSaved(
&nbsp; GameController gameController,
&nbsp; LimitedMap&lt;String, Boolean&gt; playerList,
&nbsp; SaveManager saveManager) {
&nbsp;
<b class="nc">&nbsp; Game game = saveManager.load();</b>
<b class="nc">&nbsp; if (game == null) return;</b>
&nbsp;
<b class="nc">&nbsp; long disconnectedCount = game.getDisconnectedPlayers().entrySet().stream()</b>
<b class="nc">&nbsp; .filter(Map.Entry::getValue).count();</b>
&nbsp;
<b class="nc">&nbsp; if (disconnectedCount &gt;= game.getNPlayers() - 1) {</b>
<b class="nc">&nbsp; saveManager.delete();</b>
<b class="nc">&nbsp; System.out.println(&quot;Save discarded: too many players were offline at crash time.&quot;);</b>
&nbsp; return;
&nbsp; }
&nbsp;
<b class="nc">&nbsp; gameController.setModel(game);</b>
<b class="nc">&nbsp; playerList.setLimit(game.getNPlayers());</b>
&nbsp;
<b class="nc">&nbsp; for (Map.Entry&lt;Player, Boolean&gt; entry : game.getDisconnectedPlayers().entrySet()) {</b>
<b class="nc">&nbsp; if (entry.getValue()) {</b>
<b class="nc">&nbsp; playerList.put(entry.getKey().getUserName(), false);</b>
&nbsp; }
&nbsp; }
<b class="nc">&nbsp; System.out.println(&quot;Game restored from save (&quot; + game.getNPlayers() + &quot; players).&quot;);</b>
&nbsp; }
&nbsp;
&nbsp; // ── Network interface selection ───────────────────────────────────────────
&nbsp;
&nbsp; /**
&nbsp; * Lists active non-loopback IPv4 network interfaces and prompts the operator
&nbsp; * to choose one. If only one interface is available it is selected automatically.
&nbsp; *
&nbsp; * @param scanner the scanner used to read the operator&#39;s choice.
&nbsp; * @return the IPv4 address of the selected interface.
&nbsp; * @throws Exception if no valid network interface is available.
&nbsp; */
&nbsp; public static String chooseNetworkInterface(Scanner scanner) throws Exception {
<b class="nc">&nbsp; List&lt;String&gt; ips = new ArrayList&lt;&gt;();</b>
&nbsp;
<b class="nc">&nbsp; Enumeration&lt;NetworkInterface&gt; interfaces = NetworkInterface.getNetworkInterfaces();</b>
<b class="nc">&nbsp; while (interfaces.hasMoreElements()) {</b>
<b class="nc">&nbsp; NetworkInterface ni = interfaces.nextElement();</b>
<b class="nc">&nbsp; if (!ni.isUp() || ni.isLoopback() || ni.isVirtual()) continue;</b>
&nbsp;
<b class="nc">&nbsp; Enumeration&lt;InetAddress&gt; addresses = ni.getInetAddresses();</b>
<b class="nc">&nbsp; while (addresses.hasMoreElements()) {</b>
<b class="nc">&nbsp; InetAddress addr = addresses.nextElement();</b>
<b class="nc">&nbsp; if (addr instanceof Inet4Address) {</b>
<b class="nc">&nbsp; System.out.println(&quot;[&quot; + ips.size() + &quot;] &quot; + ni.getDisplayName()</b>
<b class="nc">&nbsp; + &quot; -&gt; &quot; + addr.getHostAddress());</b>
<b class="nc">&nbsp; ips.add(addr.getHostAddress());</b>
&nbsp; }
&nbsp; }
&nbsp; }
&nbsp;
<b class="nc">&nbsp; if (ips.isEmpty()) throw new Exception(&quot;No active network interface available&quot;);</b>
&nbsp;
<b class="nc">&nbsp; if (ips.size() == 1) {</b>
<b class="nc">&nbsp; System.out.println(&quot;One interface found, using: &quot; + ips.get(0));</b>
<b class="nc">&nbsp; return ips.get(0);</b>
&nbsp; }
&nbsp;
<b class="nc">&nbsp; System.out.print(&quot;Choose interface: &quot;);</b>
<b class="nc">&nbsp; int choice = Integer.parseInt(scanner.nextLine().trim());</b>
<b class="nc">&nbsp; return ips.get(choice);</b>
&nbsp; }
&nbsp;}
</code>
</pre>
</div>
<script type="text/javascript">
(function() {
var msie = false, msie9 = false;
/*@cc_on
msie = true;
@if (@_jscript_version >= 9)
msie9 = true;
@end
@*/
if (!msie || msie && msie9) {
hljs.highlightAll()
hljs.initLineNumbersOnLoad();
}
})();
</script>
<div class="footer">
<div style="float:right;">generated on 2026-06-14 21:53</div>
</div>
</body>
</html>
@@ -0,0 +1,167 @@
<!DOCTYPE html>
<html id="htmlId">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Coverage Report > it.polimi.ingsw.gc14.Network.TCP.Client</title>
<style type="text/css">
@import "../css/coverage.css";
@import "../css/idea.min.css";
</style>
<script type="text/javascript" src="../js/highlight.min.js"></script>
<script type="text/javascript" src="../js/highlightjs-line-numbers.min.js"></script>
</head>
<body>
<div class="content">
<div class="breadCrumbs">
Current scope: <a href="../index.html">all classes</a>
<span class="separator">|</span>
it.polimi.ingsw.gc14.Network.TCP.Client</div>
<h1>Coverage Summary for Package: it.polimi.ingsw.gc14.Network.TCP.Client</h1>
<table class="coverageStats">
<tr>
<th class="name">Package</th>
<th class="coverageStat
">
Class, %
</th>
<th class="coverageStat
">
Method, %
</th>
<th class="coverageStat
">
Branch, %
</th>
<th class="coverageStat
">
Line, %
</th>
</tr>
<tr>
<td class="name">it.polimi.ingsw.gc14.Network.TCP.Client</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/15)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/26)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/83)
</span>
</td>
</tr>
</table>
<br/>
<br/>
<table class="coverageStats">
<tr>
<th class="name sortedAsc
">
<a href="index_SORT_BY_NAME_DESC.html">Class</a> </th>
<th class="coverageStat
">
<a href="index_SORT_BY_CLASS.html">Class, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_METHOD.html">Method, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_BLOCK.html">Branch, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_LINE.html">Line, %</a>
</th>
</tr>
<tr>
<td class="name"><a href="sources/source-1.html">TCPClient</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/15)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/26)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/83)
</span>
</td>
</tr>
</table>
</div>
<script type="text/javascript">
(function() {
var msie = false, msie9 = false;
/*@cc_on
msie = true;
@if (@_jscript_version >= 9)
msie9 = true;
@end
@*/
if (!msie || msie && msie9) {
hljs.highlightAll()
hljs.initLineNumbersOnLoad();
}
})();
</script>
<div class="footer">
<div style="float:right;">generated on 2026-06-14 21:53</div>
</div>
</body>
</html>
@@ -0,0 +1,167 @@
<!DOCTYPE html>
<html id="htmlId">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Coverage Report > it.polimi.ingsw.gc14.Network.TCP.Client</title>
<style type="text/css">
@import "../css/coverage.css";
@import "../css/idea.min.css";
</style>
<script type="text/javascript" src="../js/highlight.min.js"></script>
<script type="text/javascript" src="../js/highlightjs-line-numbers.min.js"></script>
</head>
<body>
<div class="content">
<div class="breadCrumbs">
Current scope: <a href="../index_SORT_BY_BLOCK.html">all classes</a>
<span class="separator">|</span>
it.polimi.ingsw.gc14.Network.TCP.Client</div>
<h1>Coverage Summary for Package: it.polimi.ingsw.gc14.Network.TCP.Client</h1>
<table class="coverageStats">
<tr>
<th class="name">Package</th>
<th class="coverageStat
">
Class, %
</th>
<th class="coverageStat
">
Method, %
</th>
<th class="coverageStat
">
Branch, %
</th>
<th class="coverageStat
">
Line, %
</th>
</tr>
<tr>
<td class="name">it.polimi.ingsw.gc14.Network.TCP.Client</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/15)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/26)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/83)
</span>
</td>
</tr>
</table>
<br/>
<br/>
<table class="coverageStats">
<tr>
<th class="name
">
<a href="index.html">Class</a> </th>
<th class="coverageStat
">
<a href="index_SORT_BY_CLASS.html">Class, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_METHOD.html">Method, %</a>
</th>
<th class="coverageStat sortedAsc
">
<a href="index_SORT_BY_BLOCK_DESC.html">Branch, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_LINE.html">Line, %</a>
</th>
</tr>
<tr>
<td class="name"><a href="sources/source-1.html">TCPClient</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/15)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/26)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/83)
</span>
</td>
</tr>
</table>
</div>
<script type="text/javascript">
(function() {
var msie = false, msie9 = false;
/*@cc_on
msie = true;
@if (@_jscript_version >= 9)
msie9 = true;
@end
@*/
if (!msie || msie && msie9) {
hljs.highlightAll()
hljs.initLineNumbersOnLoad();
}
})();
</script>
<div class="footer">
<div style="float:right;">generated on 2026-06-14 21:53</div>
</div>
</body>
</html>
@@ -0,0 +1,167 @@
<!DOCTYPE html>
<html id="htmlId">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Coverage Report > it.polimi.ingsw.gc14.Network.TCP.Client</title>
<style type="text/css">
@import "../css/coverage.css";
@import "../css/idea.min.css";
</style>
<script type="text/javascript" src="../js/highlight.min.js"></script>
<script type="text/javascript" src="../js/highlightjs-line-numbers.min.js"></script>
</head>
<body>
<div class="content">
<div class="breadCrumbs">
Current scope: <a href="../index_SORT_BY_BLOCK_DESC.html">all classes</a>
<span class="separator">|</span>
it.polimi.ingsw.gc14.Network.TCP.Client</div>
<h1>Coverage Summary for Package: it.polimi.ingsw.gc14.Network.TCP.Client</h1>
<table class="coverageStats">
<tr>
<th class="name">Package</th>
<th class="coverageStat
">
Class, %
</th>
<th class="coverageStat
">
Method, %
</th>
<th class="coverageStat
">
Branch, %
</th>
<th class="coverageStat
">
Line, %
</th>
</tr>
<tr>
<td class="name">it.polimi.ingsw.gc14.Network.TCP.Client</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/15)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/26)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/83)
</span>
</td>
</tr>
</table>
<br/>
<br/>
<table class="coverageStats">
<tr>
<th class="name
">
<a href="index.html">Class</a> </th>
<th class="coverageStat
">
<a href="index_SORT_BY_CLASS.html">Class, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_METHOD.html">Method, %</a>
</th>
<th class="coverageStat sortedDesc
">
<a href="index_SORT_BY_BLOCK.html">Branch, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_LINE.html">Line, %</a>
</th>
</tr>
<tr>
<td class="name"><a href="sources/source-1.html">TCPClient</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/15)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/26)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/83)
</span>
</td>
</tr>
</table>
</div>
<script type="text/javascript">
(function() {
var msie = false, msie9 = false;
/*@cc_on
msie = true;
@if (@_jscript_version >= 9)
msie9 = true;
@end
@*/
if (!msie || msie && msie9) {
hljs.highlightAll()
hljs.initLineNumbersOnLoad();
}
})();
</script>
<div class="footer">
<div style="float:right;">generated on 2026-06-14 21:53</div>
</div>
</body>
</html>
@@ -0,0 +1,167 @@
<!DOCTYPE html>
<html id="htmlId">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Coverage Report > it.polimi.ingsw.gc14.Network.TCP.Client</title>
<style type="text/css">
@import "../css/coverage.css";
@import "../css/idea.min.css";
</style>
<script type="text/javascript" src="../js/highlight.min.js"></script>
<script type="text/javascript" src="../js/highlightjs-line-numbers.min.js"></script>
</head>
<body>
<div class="content">
<div class="breadCrumbs">
Current scope: <a href="../index_SORT_BY_CLASS.html">all classes</a>
<span class="separator">|</span>
it.polimi.ingsw.gc14.Network.TCP.Client</div>
<h1>Coverage Summary for Package: it.polimi.ingsw.gc14.Network.TCP.Client</h1>
<table class="coverageStats">
<tr>
<th class="name">Package</th>
<th class="coverageStat
">
Class, %
</th>
<th class="coverageStat
">
Method, %
</th>
<th class="coverageStat
">
Branch, %
</th>
<th class="coverageStat
">
Line, %
</th>
</tr>
<tr>
<td class="name">it.polimi.ingsw.gc14.Network.TCP.Client</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/15)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/26)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/83)
</span>
</td>
</tr>
</table>
<br/>
<br/>
<table class="coverageStats">
<tr>
<th class="name
">
<a href="index.html">Class</a> </th>
<th class="coverageStat sortedAsc
">
<a href="index_SORT_BY_CLASS_DESC.html">Class, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_METHOD.html">Method, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_BLOCK.html">Branch, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_LINE.html">Line, %</a>
</th>
</tr>
<tr>
<td class="name"><a href="sources/source-1.html">TCPClient</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/15)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/26)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/83)
</span>
</td>
</tr>
</table>
</div>
<script type="text/javascript">
(function() {
var msie = false, msie9 = false;
/*@cc_on
msie = true;
@if (@_jscript_version >= 9)
msie9 = true;
@end
@*/
if (!msie || msie && msie9) {
hljs.highlightAll()
hljs.initLineNumbersOnLoad();
}
})();
</script>
<div class="footer">
<div style="float:right;">generated on 2026-06-14 21:53</div>
</div>
</body>
</html>
@@ -0,0 +1,167 @@
<!DOCTYPE html>
<html id="htmlId">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Coverage Report > it.polimi.ingsw.gc14.Network.TCP.Client</title>
<style type="text/css">
@import "../css/coverage.css";
@import "../css/idea.min.css";
</style>
<script type="text/javascript" src="../js/highlight.min.js"></script>
<script type="text/javascript" src="../js/highlightjs-line-numbers.min.js"></script>
</head>
<body>
<div class="content">
<div class="breadCrumbs">
Current scope: <a href="../index_SORT_BY_CLASS_DESC.html">all classes</a>
<span class="separator">|</span>
it.polimi.ingsw.gc14.Network.TCP.Client</div>
<h1>Coverage Summary for Package: it.polimi.ingsw.gc14.Network.TCP.Client</h1>
<table class="coverageStats">
<tr>
<th class="name">Package</th>
<th class="coverageStat
">
Class, %
</th>
<th class="coverageStat
">
Method, %
</th>
<th class="coverageStat
">
Branch, %
</th>
<th class="coverageStat
">
Line, %
</th>
</tr>
<tr>
<td class="name">it.polimi.ingsw.gc14.Network.TCP.Client</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/15)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/26)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/83)
</span>
</td>
</tr>
</table>
<br/>
<br/>
<table class="coverageStats">
<tr>
<th class="name
">
<a href="index.html">Class</a> </th>
<th class="coverageStat sortedDesc
">
<a href="index_SORT_BY_CLASS.html">Class, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_METHOD.html">Method, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_BLOCK.html">Branch, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_LINE.html">Line, %</a>
</th>
</tr>
<tr>
<td class="name"><a href="sources/source-1.html">TCPClient</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/15)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/26)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/83)
</span>
</td>
</tr>
</table>
</div>
<script type="text/javascript">
(function() {
var msie = false, msie9 = false;
/*@cc_on
msie = true;
@if (@_jscript_version >= 9)
msie9 = true;
@end
@*/
if (!msie || msie && msie9) {
hljs.highlightAll()
hljs.initLineNumbersOnLoad();
}
})();
</script>
<div class="footer">
<div style="float:right;">generated on 2026-06-14 21:53</div>
</div>
</body>
</html>
@@ -0,0 +1,167 @@
<!DOCTYPE html>
<html id="htmlId">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Coverage Report > it.polimi.ingsw.gc14.Network.TCP.Client</title>
<style type="text/css">
@import "../css/coverage.css";
@import "../css/idea.min.css";
</style>
<script type="text/javascript" src="../js/highlight.min.js"></script>
<script type="text/javascript" src="../js/highlightjs-line-numbers.min.js"></script>
</head>
<body>
<div class="content">
<div class="breadCrumbs">
Current scope: <a href="../index_SORT_BY_LINE.html">all classes</a>
<span class="separator">|</span>
it.polimi.ingsw.gc14.Network.TCP.Client</div>
<h1>Coverage Summary for Package: it.polimi.ingsw.gc14.Network.TCP.Client</h1>
<table class="coverageStats">
<tr>
<th class="name">Package</th>
<th class="coverageStat
">
Class, %
</th>
<th class="coverageStat
">
Method, %
</th>
<th class="coverageStat
">
Branch, %
</th>
<th class="coverageStat
">
Line, %
</th>
</tr>
<tr>
<td class="name">it.polimi.ingsw.gc14.Network.TCP.Client</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/15)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/26)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/83)
</span>
</td>
</tr>
</table>
<br/>
<br/>
<table class="coverageStats">
<tr>
<th class="name
">
<a href="index.html">Class</a> </th>
<th class="coverageStat
">
<a href="index_SORT_BY_CLASS.html">Class, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_METHOD.html">Method, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_BLOCK.html">Branch, %</a>
</th>
<th class="coverageStat sortedAsc
">
<a href="index_SORT_BY_LINE_DESC.html">Line, %</a>
</th>
</tr>
<tr>
<td class="name"><a href="sources/source-1.html">TCPClient</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/15)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/26)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/83)
</span>
</td>
</tr>
</table>
</div>
<script type="text/javascript">
(function() {
var msie = false, msie9 = false;
/*@cc_on
msie = true;
@if (@_jscript_version >= 9)
msie9 = true;
@end
@*/
if (!msie || msie && msie9) {
hljs.highlightAll()
hljs.initLineNumbersOnLoad();
}
})();
</script>
<div class="footer">
<div style="float:right;">generated on 2026-06-14 21:53</div>
</div>
</body>
</html>
@@ -0,0 +1,167 @@
<!DOCTYPE html>
<html id="htmlId">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Coverage Report > it.polimi.ingsw.gc14.Network.TCP.Client</title>
<style type="text/css">
@import "../css/coverage.css";
@import "../css/idea.min.css";
</style>
<script type="text/javascript" src="../js/highlight.min.js"></script>
<script type="text/javascript" src="../js/highlightjs-line-numbers.min.js"></script>
</head>
<body>
<div class="content">
<div class="breadCrumbs">
Current scope: <a href="../index_SORT_BY_LINE_DESC.html">all classes</a>
<span class="separator">|</span>
it.polimi.ingsw.gc14.Network.TCP.Client</div>
<h1>Coverage Summary for Package: it.polimi.ingsw.gc14.Network.TCP.Client</h1>
<table class="coverageStats">
<tr>
<th class="name">Package</th>
<th class="coverageStat
">
Class, %
</th>
<th class="coverageStat
">
Method, %
</th>
<th class="coverageStat
">
Branch, %
</th>
<th class="coverageStat
">
Line, %
</th>
</tr>
<tr>
<td class="name">it.polimi.ingsw.gc14.Network.TCP.Client</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/15)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/26)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/83)
</span>
</td>
</tr>
</table>
<br/>
<br/>
<table class="coverageStats">
<tr>
<th class="name
">
<a href="index.html">Class</a> </th>
<th class="coverageStat
">
<a href="index_SORT_BY_CLASS.html">Class, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_METHOD.html">Method, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_BLOCK.html">Branch, %</a>
</th>
<th class="coverageStat sortedDesc
">
<a href="index_SORT_BY_LINE.html">Line, %</a>
</th>
</tr>
<tr>
<td class="name"><a href="sources/source-1.html">TCPClient</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/15)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/26)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/83)
</span>
</td>
</tr>
</table>
</div>
<script type="text/javascript">
(function() {
var msie = false, msie9 = false;
/*@cc_on
msie = true;
@if (@_jscript_version >= 9)
msie9 = true;
@end
@*/
if (!msie || msie && msie9) {
hljs.highlightAll()
hljs.initLineNumbersOnLoad();
}
})();
</script>
<div class="footer">
<div style="float:right;">generated on 2026-06-14 21:53</div>
</div>
</body>
</html>
@@ -0,0 +1,167 @@
<!DOCTYPE html>
<html id="htmlId">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Coverage Report > it.polimi.ingsw.gc14.Network.TCP.Client</title>
<style type="text/css">
@import "../css/coverage.css";
@import "../css/idea.min.css";
</style>
<script type="text/javascript" src="../js/highlight.min.js"></script>
<script type="text/javascript" src="../js/highlightjs-line-numbers.min.js"></script>
</head>
<body>
<div class="content">
<div class="breadCrumbs">
Current scope: <a href="../index_SORT_BY_METHOD.html">all classes</a>
<span class="separator">|</span>
it.polimi.ingsw.gc14.Network.TCP.Client</div>
<h1>Coverage Summary for Package: it.polimi.ingsw.gc14.Network.TCP.Client</h1>
<table class="coverageStats">
<tr>
<th class="name">Package</th>
<th class="coverageStat
">
Class, %
</th>
<th class="coverageStat
">
Method, %
</th>
<th class="coverageStat
">
Branch, %
</th>
<th class="coverageStat
">
Line, %
</th>
</tr>
<tr>
<td class="name">it.polimi.ingsw.gc14.Network.TCP.Client</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/15)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/26)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/83)
</span>
</td>
</tr>
</table>
<br/>
<br/>
<table class="coverageStats">
<tr>
<th class="name
">
<a href="index.html">Class</a> </th>
<th class="coverageStat
">
<a href="index_SORT_BY_CLASS.html">Class, %</a>
</th>
<th class="coverageStat sortedAsc
">
<a href="index_SORT_BY_METHOD_DESC.html">Method, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_BLOCK.html">Branch, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_LINE.html">Line, %</a>
</th>
</tr>
<tr>
<td class="name"><a href="sources/source-1.html">TCPClient</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/15)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/26)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/83)
</span>
</td>
</tr>
</table>
</div>
<script type="text/javascript">
(function() {
var msie = false, msie9 = false;
/*@cc_on
msie = true;
@if (@_jscript_version >= 9)
msie9 = true;
@end
@*/
if (!msie || msie && msie9) {
hljs.highlightAll()
hljs.initLineNumbersOnLoad();
}
})();
</script>
<div class="footer">
<div style="float:right;">generated on 2026-06-14 21:53</div>
</div>
</body>
</html>
@@ -0,0 +1,167 @@
<!DOCTYPE html>
<html id="htmlId">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Coverage Report > it.polimi.ingsw.gc14.Network.TCP.Client</title>
<style type="text/css">
@import "../css/coverage.css";
@import "../css/idea.min.css";
</style>
<script type="text/javascript" src="../js/highlight.min.js"></script>
<script type="text/javascript" src="../js/highlightjs-line-numbers.min.js"></script>
</head>
<body>
<div class="content">
<div class="breadCrumbs">
Current scope: <a href="../index_SORT_BY_METHOD_DESC.html">all classes</a>
<span class="separator">|</span>
it.polimi.ingsw.gc14.Network.TCP.Client</div>
<h1>Coverage Summary for Package: it.polimi.ingsw.gc14.Network.TCP.Client</h1>
<table class="coverageStats">
<tr>
<th class="name">Package</th>
<th class="coverageStat
">
Class, %
</th>
<th class="coverageStat
">
Method, %
</th>
<th class="coverageStat
">
Branch, %
</th>
<th class="coverageStat
">
Line, %
</th>
</tr>
<tr>
<td class="name">it.polimi.ingsw.gc14.Network.TCP.Client</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/15)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/26)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/83)
</span>
</td>
</tr>
</table>
<br/>
<br/>
<table class="coverageStats">
<tr>
<th class="name
">
<a href="index.html">Class</a> </th>
<th class="coverageStat
">
<a href="index_SORT_BY_CLASS.html">Class, %</a>
</th>
<th class="coverageStat sortedDesc
">
<a href="index_SORT_BY_METHOD.html">Method, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_BLOCK.html">Branch, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_LINE.html">Line, %</a>
</th>
</tr>
<tr>
<td class="name"><a href="sources/source-1.html">TCPClient</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/15)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/26)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/83)
</span>
</td>
</tr>
</table>
</div>
<script type="text/javascript">
(function() {
var msie = false, msie9 = false;
/*@cc_on
msie = true;
@if (@_jscript_version >= 9)
msie9 = true;
@end
@*/
if (!msie || msie && msie9) {
hljs.highlightAll()
hljs.initLineNumbersOnLoad();
}
})();
</script>
<div class="footer">
<div style="float:right;">generated on 2026-06-14 21:53</div>
</div>
</body>
</html>
@@ -0,0 +1,167 @@
<!DOCTYPE html>
<html id="htmlId">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Coverage Report > it.polimi.ingsw.gc14.Network.TCP.Client</title>
<style type="text/css">
@import "../css/coverage.css";
@import "../css/idea.min.css";
</style>
<script type="text/javascript" src="../js/highlight.min.js"></script>
<script type="text/javascript" src="../js/highlightjs-line-numbers.min.js"></script>
</head>
<body>
<div class="content">
<div class="breadCrumbs">
Current scope: <a href="../index_SORT_BY_NAME_DESC.html">all classes</a>
<span class="separator">|</span>
it.polimi.ingsw.gc14.Network.TCP.Client</div>
<h1>Coverage Summary for Package: it.polimi.ingsw.gc14.Network.TCP.Client</h1>
<table class="coverageStats">
<tr>
<th class="name">Package</th>
<th class="coverageStat
">
Class, %
</th>
<th class="coverageStat
">
Method, %
</th>
<th class="coverageStat
">
Branch, %
</th>
<th class="coverageStat
">
Line, %
</th>
</tr>
<tr>
<td class="name">it.polimi.ingsw.gc14.Network.TCP.Client</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/15)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/26)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/83)
</span>
</td>
</tr>
</table>
<br/>
<br/>
<table class="coverageStats">
<tr>
<th class="name sortedDesc
">
<a href="index.html">Class</a> </th>
<th class="coverageStat
">
<a href="index_SORT_BY_CLASS.html">Class, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_METHOD.html">Method, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_BLOCK.html">Branch, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_LINE.html">Line, %</a>
</th>
</tr>
<tr>
<td class="name"><a href="sources/source-1.html">TCPClient</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/15)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/26)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/83)
</span>
</td>
</tr>
</table>
</div>
<script type="text/javascript">
(function() {
var msie = false, msie9 = false;
/*@cc_on
msie = true;
@if (@_jscript_version >= 9)
msie9 = true;
@end
@*/
if (!msie || msie && msie9) {
hljs.highlightAll()
hljs.initLineNumbersOnLoad();
}
})();
</script>
<div class="footer">
<div style="float:right;">generated on 2026-06-14 21:53</div>
</div>
</body>
</html>
@@ -0,0 +1,429 @@
<!DOCTYPE html>
<html id="htmlId">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Coverage Report > TCPClient</title>
<style type="text/css">
@import "../../css/coverage.css";
@import "../../css/idea.min.css";
</style>
<script type="text/javascript" src="../../js/highlight.min.js"></script>
<script type="text/javascript" src="../../js/highlightjs-line-numbers.min.js"></script>
</head>
<body>
<div class="content">
<div class="breadCrumbs">
Current scope: <a href="../../index.html">all classes</a>
<span class="separator">|</span>
<a href="../index.html">it.polimi.ingsw.gc14.Network.TCP.Client</a>
</div>
<h1>Coverage Summary for Class: TCPClient (it.polimi.ingsw.gc14.Network.TCP.Client)</h1>
<table class="coverageStats">
<tr>
<th class="name">Class</th>
<th class="coverageStat
">
Class, %
</th>
<th class="coverageStat
">
Method, %
</th>
<th class="coverageStat
">
Branch, %
</th>
<th class="coverageStat
">
Line, %
</th>
</tr>
<tr>
<td class="name">TCPClient</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/15)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/26)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/83)
</span>
</td>
</tr>
</table>
<br/>
<br/>
<pre>
<code class="sourceCode" id="sourceCode">&nbsp;package it.polimi.ingsw.gc14.Network.TCP.Client;
&nbsp;
&nbsp;import it.polimi.ingsw.gc14.Controller.ClientController;
&nbsp;import it.polimi.ingsw.gc14.ErrorType;
&nbsp;import it.polimi.ingsw.gc14.Model.MiniModel;
&nbsp;import it.polimi.ingsw.gc14.Network.IClient;
&nbsp;import it.polimi.ingsw.gc14.Network.NetworkEvent;
&nbsp;import it.polimi.ingsw.gc14.Network.NetworkConfig;
&nbsp;import it.polimi.ingsw.gc14.Network.NetworkEvents.*;
&nbsp;
&nbsp;import java.io.*;
&nbsp;import java.net.*;
&nbsp;import java.util.concurrent.Executors;
&nbsp;import java.util.concurrent.ScheduledExecutorService;
&nbsp;import java.util.concurrent.TimeUnit;
&nbsp;
&nbsp;/**
&nbsp; * Client TCP. Sends and receives messages with the TCP server.
&nbsp; */
&nbsp;public class TCPClient implements IClient {
&nbsp; private static final int PING = 1;
&nbsp; private static final int PONG = 2;
&nbsp;
&nbsp; /** Socket TCP */
&nbsp; private Socket communicationSocket;
&nbsp;
&nbsp; /** Input stream used receive objects from the server */
&nbsp; private ObjectInputStream socketReceive;
&nbsp;
&nbsp; /** Output stream used to send objects to the server */
&nbsp; private ObjectOutputStream socketSend;
&nbsp;
&nbsp; /** Client game&#39;s controller */
&nbsp; private ClientController controller;
&nbsp;
&nbsp; /** IP address of the server to connect to */
&nbsp; private String hostname;
&nbsp;
&nbsp; private boolean running;
&nbsp; /** TCP port */
&nbsp; private int mainPort;
&nbsp;
&nbsp; private int heartbeatPort;
&nbsp; private Socket heartbeatSocket;
&nbsp; private OutputStream heartbeatOut;
&nbsp; private InputStream heartbeatIn;
&nbsp;
&nbsp;
&nbsp; /**
&nbsp; * Constructs a TCP client and initializes its connection parameters.
&nbsp; *
&nbsp; * @param controller the client controller.
&nbsp; * @param hostname the IP address or hostname of the server.
&nbsp; * @param mainPort the main TCP port of the server.
&nbsp; * @param heartbeatPort the TCP port used for heartbeat communication.
&nbsp; */
<b class="nc">&nbsp; public TCPClient(ClientController controller, String hostname, int mainPort,int heartbeatPort ) {</b>
<b class="nc">&nbsp; this.controller = controller;</b>
<b class="nc">&nbsp; this.hostname = hostname;</b>
<b class="nc">&nbsp; this.mainPort = mainPort;</b>
<b class="nc">&nbsp; this.heartbeatPort = heartbeatPort;</b>
&nbsp; }
&nbsp;
&nbsp;
&nbsp; /**
&nbsp; * Starts the TCP connection with the server.
&nbsp; * Sends an {@link AddPlayer} event, if the server responds with {@code -1}, the connection is refused and the method returns {@code false}.
&nbsp; * Otherwise, a listener thread is started.
&nbsp; * @param user The username of the player
&nbsp; * @param proposedNPlayers The desired number of players for the game
&nbsp; * @return true if the connection is successful, false otherwise.
&nbsp; */
&nbsp; public ErrorType connect(String user, int proposedNPlayers) {
&nbsp; try {
<b class="nc">&nbsp; communicationSocket = new Socket(hostname, mainPort);</b>
<b class="nc">&nbsp; socketSend = new ObjectOutputStream(communicationSocket.getOutputStream());</b>
<b class="nc">&nbsp; socketReceive = new ObjectInputStream(communicationSocket.getInputStream());</b>
<b class="nc">&nbsp; NetworkEvent event= new AddPlayer(user, proposedNPlayers);</b>
<b class="nc">&nbsp; socketSend.writeObject(event);</b>
&nbsp; try {
<b class="nc">&nbsp; if( socketReceive.readObject() instanceof AddPlayer x)</b>
&nbsp; {
<b class="nc">&nbsp; if(x.isError())</b>
<b class="nc">&nbsp; return x.getErrorType();</b>
&nbsp; }
&nbsp; } catch (ClassNotFoundException e) {
<b class="nc">&nbsp; return ErrorType.GENERIC_ERROR;</b>
&nbsp; }
&nbsp;
<b class="nc">&nbsp; running = true;</b>
&nbsp;
<b class="nc">&nbsp; new Thread(this::receiveMessage, &quot;tcp-reader&quot;).start();</b>
&nbsp;
&nbsp; // heartbeat socket
<b class="nc">&nbsp; this.heartbeatSocket = new Socket(hostname, heartbeatPort);</b>
<b class="nc">&nbsp; this.heartbeatOut = heartbeatSocket.getOutputStream();</b>
<b class="nc">&nbsp; this.heartbeatIn = heartbeatSocket.getInputStream();</b>
&nbsp;
&nbsp; // send username immediately so server can associate the two sockets
<b class="nc">&nbsp; new ObjectOutputStream(heartbeatSocket.getOutputStream()).writeObject(user);</b>
<b class="nc">&nbsp; heartbeatOut.flush();</b>
<b class="nc">&nbsp; new Thread(this::heartbeatLoop, &quot;heartbeat&quot;).start();</b>
&nbsp;
<b class="nc">&nbsp; return null;</b>
&nbsp;
&nbsp; } catch (IOException e) {
<b class="nc">&nbsp; e.printStackTrace();</b>
<b class="nc">&nbsp; return ErrorType.GENERIC_ERROR;</b>
&nbsp; }
&nbsp; }
&nbsp;
&nbsp; private void heartbeatLoop() {
<b class="nc">&nbsp; ScheduledExecutorService sender = Executors.newSingleThreadScheduledExecutor();</b>
<b class="nc">&nbsp; sender.scheduleAtFixedRate(() -&gt; {</b>
&nbsp; try {
<b class="nc">&nbsp; synchronized (heartbeatOut)</b>
&nbsp; {
<b class="nc">&nbsp; heartbeatOut.write(PING);</b>
<b class="nc">&nbsp; heartbeatOut.flush();</b>
<b class="nc">&nbsp; }</b>
&nbsp;
&nbsp; } catch (IOException e) {
<b class="nc">&nbsp; sender.shutdownNow();</b>
<b class="nc">&nbsp; if(running)</b>
&nbsp; {
<b class="nc">&nbsp; disconnect();</b>
<b class="nc">&nbsp; controller.getView().showError(ErrorType.SERVER_CRASHED,ErrorType.SERVER_CRASHED.toString());</b>
&nbsp; }
&nbsp;
&nbsp; }
&nbsp; }, 0, 3, TimeUnit.SECONDS);
&nbsp;
&nbsp; try {
<b class="nc">&nbsp; heartbeatSocket.setSoTimeout((int) NetworkConfig.SILENCE_THRESHOLD_MS);</b>
<b class="nc">&nbsp; while (running) {</b>
<b class="nc">&nbsp; int b = heartbeatIn.read();</b>
<b class="nc">&nbsp; if (b == -1 || b != PONG) {</b>
<b class="nc">&nbsp; disconnect();</b>
<b class="nc">&nbsp; controller.getView().showError(ErrorType.SERVER_CRASHED, ErrorType.SERVER_CRASHED.toString());</b>
&nbsp; break;
&nbsp; }
&nbsp; // pong received: server is alive
&nbsp; }
&nbsp; } catch (SocketTimeoutException e) {
<b class="nc">&nbsp; System.out.println(&quot;Server heartbeat timeout&quot;);</b>
<b class="nc">&nbsp; disconnect();</b>
<b class="nc">&nbsp; controller.getView().showError(ErrorType.SERVER_CRASHED, ErrorType.SERVER_CRASHED.toString());</b>
&nbsp; } catch (IOException e) {
<b class="nc">&nbsp; if (running) {</b>
<b class="nc">&nbsp; disconnect();</b>
<b class="nc">&nbsp; controller.getView().showError(ErrorType.SERVER_CRASHED, ErrorType.SERVER_CRASHED.toString());</b>
&nbsp; }
&nbsp; } finally {
<b class="nc">&nbsp; sender.shutdownNow();</b>
&nbsp; }
&nbsp; }
&nbsp; private synchronized void disconnect() {
<b class="nc">&nbsp; if (!running) return;</b>
<b class="nc">&nbsp; running = false;</b>
<b class="nc">&nbsp; try { communicationSocket.close(); } catch (IOException ignored) {}</b>
<b class="nc">&nbsp; try { heartbeatSocket.close(); } catch (IOException ignored) {}</b>
<b class="nc">&nbsp; controller.setClient(null);</b>
<b class="nc">&nbsp; controller.setModel(null);</b>
&nbsp; }
&nbsp;
&nbsp;
&nbsp; /**
&nbsp; * Listens continuously for incoming objects from the server.
&nbsp; * - If the received object is a {@link NetworkEvent} flagged as an error, it is printed.
&nbsp; * - If the received object is a valid {@link NetworkEvent}, it is applied to the game controller.
&nbsp; * - If the received object is a {@link MiniModel}, the controller&#39;s model is set.
&nbsp; */
&nbsp; private void receiveMessage() {
&nbsp; while (true) {
&nbsp; try {
&nbsp; Object read;
&nbsp; try {
<b class="nc">&nbsp; read = socketReceive.readObject();</b>
&nbsp; } catch (IOException e) {
<b class="nc">&nbsp; if (running) disconnect();</b>
&nbsp; break;
&nbsp; }
&nbsp;
<b class="nc">&nbsp; if (read instanceof NetworkEvent event) {</b>
<b class="nc">&nbsp; if (event.isError()) {</b>
<b class="nc">&nbsp; if(event.getErrorType() == ErrorType.WRONG_ACTION) {</b>
<b class="nc">&nbsp; controller.getView().showError(ErrorType.WRONG_ACTION,event.toString());</b>
&nbsp; }
&nbsp; else
<b class="nc">&nbsp; controller.getView().showError(event.getErrorType(),event.getErrorType().toString());</b>
&nbsp; } else {
<b class="nc">&nbsp; event.apply(controller.getMiniModel());</b>
<b class="nc">&nbsp; controller.getView().render();</b>
&nbsp; }
&nbsp;
<b class="nc">&nbsp; } else if (read instanceof MiniModel model) {</b>
<b class="nc">&nbsp; controller.setModel(model);</b>
<b class="nc">&nbsp; controller.getView().render();</b>
&nbsp; }
&nbsp;
&nbsp; } catch (ClassNotFoundException e) {
<b class="nc">&nbsp; e.printStackTrace();</b>
&nbsp; break;
&nbsp; }
&nbsp; }
&nbsp; }
&nbsp;
&nbsp; /**
&nbsp; * Requests to draw a tribe card from the upper list.
&nbsp; * Creates a NetworkEvent and sends it through the network client.
&nbsp; * @param playerUsername the name of the player performing the action
&nbsp; * @param pos the index of the card to draw
&nbsp; */
&nbsp; public void drawUpperTribeCard(String playerUsername, int pos) {
<b class="nc">&nbsp; doEvent(new DrawUpperTribeCard(playerUsername,pos));</b>
&nbsp;
&nbsp; }
&nbsp;
&nbsp;
&nbsp; /**
&nbsp; * Requests to draw a tribe card from the lower list.
&nbsp; * Creates a NetworkEvent and sends it through the network client.
&nbsp; * @param playerUsername the name of the player performing the action
&nbsp; * @param pos the index of the card to draw
&nbsp; */
&nbsp; public void drawLowerTribeCard(String playerUsername,int pos) {
<b class="nc">&nbsp; doEvent(new DrawLowerTribeCard(playerUsername,pos));</b>
&nbsp; }
&nbsp;
&nbsp;
&nbsp; /**
&nbsp; * Requests to draw a building card from the upper list.
&nbsp; * Creates a NetworkEvent and sends it through the network client.
&nbsp; * @param playerUsername the name of the player performing the action
&nbsp; * @param pos the index of the card to draw
&nbsp; */
&nbsp; public void drawUpperBuildingCard(String playerUsername,int pos) {
<b class="nc">&nbsp; doEvent(new DrawUpperBuildingCard(playerUsername,pos));</b>
&nbsp;
&nbsp; }
&nbsp;
&nbsp;
&nbsp; /**
&nbsp; * Requests to draw a building card from the lower list.
&nbsp; * Creates a NetworkEvent and sends it through the network client.
&nbsp; * @param playerUsername the name of the player performing the action
&nbsp; * @param pos the index of the card to draw
&nbsp; */
&nbsp; public void drawLowerBuildingCard(String playerUsername,int pos) {
<b class="nc">&nbsp; doEvent(new DrawLowerBuildingCard(playerUsername,pos));</b>
&nbsp; }
&nbsp;
&nbsp;
&nbsp;
&nbsp; /**
&nbsp; * Requests to skip drawing turn.
&nbsp; * This action is available only when the player cannot draw any tribe card, but still can buy some buildings.
&nbsp; * @param playerUsername the name of the player performing the action
&nbsp; */
&nbsp; public void skipTurn(String playerUsername) {
<b class="nc">&nbsp; doEvent(new SkipTurn(playerUsername));</b>
&nbsp; }
&nbsp;
&nbsp;
&nbsp; /**
&nbsp; * Used to perform the slot choice action for the specified player at the specified position.
&nbsp; * @param playerUsername the name of the player performing the action
&nbsp; * @param pos the index of the selected slot
&nbsp; */
&nbsp; public void slotChoice(String playerUsername,int pos) {
<b class="nc">&nbsp; doEvent(new SlotChoice(playerUsername,pos));</b>
&nbsp; }
&nbsp; /**
&nbsp; * Sends a {@link NetworkEvent} to the server.
&nbsp; * @param event The NetworkEvent to send.
&nbsp; */
&nbsp; private void doEvent(NetworkEvent event) {
&nbsp; try {
<b class="nc">&nbsp; synchronized (socketSend) {</b>
<b class="nc">&nbsp; socketSend.writeObject(event);</b>
<b class="nc">&nbsp; }</b>
&nbsp; } catch (IOException e) {
<b class="nc">&nbsp; e.printStackTrace();</b>
&nbsp; }
&nbsp; }
&nbsp;
&nbsp; /**
&nbsp; * Sends a totem choice event to the server for the specified player.
&nbsp; *
&nbsp; * @param playerUsername the username of the player choosing the totem.
&nbsp; * @param totems the name of the chosen totem.
&nbsp; */
&nbsp; public void totemChoice(String playerUsername,String totems) {
<b class="nc">&nbsp; doEvent(new TotemChoice(playerUsername,totems));</b>
&nbsp; }
&nbsp;
&nbsp; /**
&nbsp; * Notifies the server of a voluntary disconnection by sending a sentinel value
&nbsp; * on the heartbeat channel, then closes the connection.
&nbsp; */
&nbsp; public void notifyDisconnection()
&nbsp; {
<b class="nc">&nbsp; synchronized (heartbeatOut)</b>
&nbsp; {
&nbsp; try {
<b class="nc">&nbsp; heartbeatOut.write(-1);</b>
&nbsp; } catch (IOException e) {
<b class="nc">&nbsp; disconnect();</b>
&nbsp; }
<b class="nc">&nbsp; }</b>
<b class="nc">&nbsp; disconnect();</b>
&nbsp; }
&nbsp;}
</code>
</pre>
</div>
<script type="text/javascript">
(function() {
var msie = false, msie9 = false;
/*@cc_on
msie = true;
@if (@_jscript_version >= 9)
msie9 = true;
@end
@*/
if (!msie || msie && msie9) {
hljs.highlightAll()
hljs.initLineNumbersOnLoad();
}
})();
</script>
<div class="footer">
<div style="float:right;">generated on 2026-06-14 21:53</div>
</div>
</body>
</html>
@@ -0,0 +1,237 @@
<!DOCTYPE html>
<html id="htmlId">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Coverage Report > it.polimi.ingsw.gc14.Network.TCP.Server</title>
<style type="text/css">
@import "../css/coverage.css";
@import "../css/idea.min.css";
</style>
<script type="text/javascript" src="../js/highlight.min.js"></script>
<script type="text/javascript" src="../js/highlightjs-line-numbers.min.js"></script>
</head>
<body>
<div class="content">
<div class="breadCrumbs">
Current scope: <a href="../index.html">all classes</a>
<span class="separator">|</span>
it.polimi.ingsw.gc14.Network.TCP.Server</div>
<h1>Coverage Summary for Package: it.polimi.ingsw.gc14.Network.TCP.Server</h1>
<table class="coverageStats">
<tr>
<th class="name">Package</th>
<th class="coverageStat
">
Class, %
</th>
<th class="coverageStat
">
Method, %
</th>
<th class="coverageStat
">
Branch, %
</th>
<th class="coverageStat
">
Line, %
</th>
</tr>
<tr>
<td class="name">it.polimi.ingsw.gc14.Network.TCP.Server</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/3)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/19)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/50)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/166)
</span>
</td>
</tr>
</table>
<br/>
<br/>
<table class="coverageStats">
<tr>
<th class="name sortedAsc
">
<a href="index_SORT_BY_NAME_DESC.html">Class</a> </th>
<th class="coverageStat
">
<a href="index_SORT_BY_CLASS.html">Class, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_METHOD.html">Method, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_BLOCK.html">Branch, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_LINE.html">Line, %</a>
</th>
</tr>
<tr>
<td class="name"><a href="sources/source-1.html">ClientHandler</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/6)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/14)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/32)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-2.html">HeartbeatHandler</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/5)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/8)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/29)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-3.html">TCPServer</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/8)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/28)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/105)
</span>
</td>
</tr>
</table>
</div>
<script type="text/javascript">
(function() {
var msie = false, msie9 = false;
/*@cc_on
msie = true;
@if (@_jscript_version >= 9)
msie9 = true;
@end
@*/
if (!msie || msie && msie9) {
hljs.highlightAll()
hljs.initLineNumbersOnLoad();
}
})();
</script>
<div class="footer">
<div style="float:right;">generated on 2026-06-14 21:53</div>
</div>
</body>
</html>
@@ -0,0 +1,237 @@
<!DOCTYPE html>
<html id="htmlId">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Coverage Report > it.polimi.ingsw.gc14.Network.TCP.Server</title>
<style type="text/css">
@import "../css/coverage.css";
@import "../css/idea.min.css";
</style>
<script type="text/javascript" src="../js/highlight.min.js"></script>
<script type="text/javascript" src="../js/highlightjs-line-numbers.min.js"></script>
</head>
<body>
<div class="content">
<div class="breadCrumbs">
Current scope: <a href="../index_SORT_BY_BLOCK.html">all classes</a>
<span class="separator">|</span>
it.polimi.ingsw.gc14.Network.TCP.Server</div>
<h1>Coverage Summary for Package: it.polimi.ingsw.gc14.Network.TCP.Server</h1>
<table class="coverageStats">
<tr>
<th class="name">Package</th>
<th class="coverageStat
">
Class, %
</th>
<th class="coverageStat
">
Method, %
</th>
<th class="coverageStat
">
Branch, %
</th>
<th class="coverageStat
">
Line, %
</th>
</tr>
<tr>
<td class="name">it.polimi.ingsw.gc14.Network.TCP.Server</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/3)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/19)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/50)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/166)
</span>
</td>
</tr>
</table>
<br/>
<br/>
<table class="coverageStats">
<tr>
<th class="name
">
<a href="index.html">Class</a> </th>
<th class="coverageStat
">
<a href="index_SORT_BY_CLASS.html">Class, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_METHOD.html">Method, %</a>
</th>
<th class="coverageStat sortedAsc
">
<a href="index_SORT_BY_BLOCK_DESC.html">Branch, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_LINE.html">Line, %</a>
</th>
</tr>
<tr>
<td class="name"><a href="sources/source-1.html">ClientHandler</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/6)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/14)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/32)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-2.html">HeartbeatHandler</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/5)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/8)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/29)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-3.html">TCPServer</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/8)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/28)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/105)
</span>
</td>
</tr>
</table>
</div>
<script type="text/javascript">
(function() {
var msie = false, msie9 = false;
/*@cc_on
msie = true;
@if (@_jscript_version >= 9)
msie9 = true;
@end
@*/
if (!msie || msie && msie9) {
hljs.highlightAll()
hljs.initLineNumbersOnLoad();
}
})();
</script>
<div class="footer">
<div style="float:right;">generated on 2026-06-14 21:53</div>
</div>
</body>
</html>
@@ -0,0 +1,237 @@
<!DOCTYPE html>
<html id="htmlId">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Coverage Report > it.polimi.ingsw.gc14.Network.TCP.Server</title>
<style type="text/css">
@import "../css/coverage.css";
@import "../css/idea.min.css";
</style>
<script type="text/javascript" src="../js/highlight.min.js"></script>
<script type="text/javascript" src="../js/highlightjs-line-numbers.min.js"></script>
</head>
<body>
<div class="content">
<div class="breadCrumbs">
Current scope: <a href="../index_SORT_BY_BLOCK_DESC.html">all classes</a>
<span class="separator">|</span>
it.polimi.ingsw.gc14.Network.TCP.Server</div>
<h1>Coverage Summary for Package: it.polimi.ingsw.gc14.Network.TCP.Server</h1>
<table class="coverageStats">
<tr>
<th class="name">Package</th>
<th class="coverageStat
">
Class, %
</th>
<th class="coverageStat
">
Method, %
</th>
<th class="coverageStat
">
Branch, %
</th>
<th class="coverageStat
">
Line, %
</th>
</tr>
<tr>
<td class="name">it.polimi.ingsw.gc14.Network.TCP.Server</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/3)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/19)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/50)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/166)
</span>
</td>
</tr>
</table>
<br/>
<br/>
<table class="coverageStats">
<tr>
<th class="name
">
<a href="index.html">Class</a> </th>
<th class="coverageStat
">
<a href="index_SORT_BY_CLASS.html">Class, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_METHOD.html">Method, %</a>
</th>
<th class="coverageStat sortedDesc
">
<a href="index_SORT_BY_BLOCK.html">Branch, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_LINE.html">Line, %</a>
</th>
</tr>
<tr>
<td class="name"><a href="sources/source-3.html">TCPServer</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/8)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/28)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/105)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-2.html">HeartbeatHandler</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/5)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/8)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/29)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-1.html">ClientHandler</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/6)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/14)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/32)
</span>
</td>
</tr>
</table>
</div>
<script type="text/javascript">
(function() {
var msie = false, msie9 = false;
/*@cc_on
msie = true;
@if (@_jscript_version >= 9)
msie9 = true;
@end
@*/
if (!msie || msie && msie9) {
hljs.highlightAll()
hljs.initLineNumbersOnLoad();
}
})();
</script>
<div class="footer">
<div style="float:right;">generated on 2026-06-14 21:53</div>
</div>
</body>
</html>
@@ -0,0 +1,237 @@
<!DOCTYPE html>
<html id="htmlId">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Coverage Report > it.polimi.ingsw.gc14.Network.TCP.Server</title>
<style type="text/css">
@import "../css/coverage.css";
@import "../css/idea.min.css";
</style>
<script type="text/javascript" src="../js/highlight.min.js"></script>
<script type="text/javascript" src="../js/highlightjs-line-numbers.min.js"></script>
</head>
<body>
<div class="content">
<div class="breadCrumbs">
Current scope: <a href="../index_SORT_BY_CLASS.html">all classes</a>
<span class="separator">|</span>
it.polimi.ingsw.gc14.Network.TCP.Server</div>
<h1>Coverage Summary for Package: it.polimi.ingsw.gc14.Network.TCP.Server</h1>
<table class="coverageStats">
<tr>
<th class="name">Package</th>
<th class="coverageStat
">
Class, %
</th>
<th class="coverageStat
">
Method, %
</th>
<th class="coverageStat
">
Branch, %
</th>
<th class="coverageStat
">
Line, %
</th>
</tr>
<tr>
<td class="name">it.polimi.ingsw.gc14.Network.TCP.Server</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/3)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/19)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/50)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/166)
</span>
</td>
</tr>
</table>
<br/>
<br/>
<table class="coverageStats">
<tr>
<th class="name
">
<a href="index.html">Class</a> </th>
<th class="coverageStat sortedAsc
">
<a href="index_SORT_BY_CLASS_DESC.html">Class, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_METHOD.html">Method, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_BLOCK.html">Branch, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_LINE.html">Line, %</a>
</th>
</tr>
<tr>
<td class="name"><a href="sources/source-1.html">ClientHandler</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/6)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/14)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/32)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-2.html">HeartbeatHandler</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/5)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/8)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/29)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-3.html">TCPServer</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/8)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/28)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/105)
</span>
</td>
</tr>
</table>
</div>
<script type="text/javascript">
(function() {
var msie = false, msie9 = false;
/*@cc_on
msie = true;
@if (@_jscript_version >= 9)
msie9 = true;
@end
@*/
if (!msie || msie && msie9) {
hljs.highlightAll()
hljs.initLineNumbersOnLoad();
}
})();
</script>
<div class="footer">
<div style="float:right;">generated on 2026-06-14 21:53</div>
</div>
</body>
</html>
@@ -0,0 +1,237 @@
<!DOCTYPE html>
<html id="htmlId">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Coverage Report > it.polimi.ingsw.gc14.Network.TCP.Server</title>
<style type="text/css">
@import "../css/coverage.css";
@import "../css/idea.min.css";
</style>
<script type="text/javascript" src="../js/highlight.min.js"></script>
<script type="text/javascript" src="../js/highlightjs-line-numbers.min.js"></script>
</head>
<body>
<div class="content">
<div class="breadCrumbs">
Current scope: <a href="../index_SORT_BY_CLASS_DESC.html">all classes</a>
<span class="separator">|</span>
it.polimi.ingsw.gc14.Network.TCP.Server</div>
<h1>Coverage Summary for Package: it.polimi.ingsw.gc14.Network.TCP.Server</h1>
<table class="coverageStats">
<tr>
<th class="name">Package</th>
<th class="coverageStat
">
Class, %
</th>
<th class="coverageStat
">
Method, %
</th>
<th class="coverageStat
">
Branch, %
</th>
<th class="coverageStat
">
Line, %
</th>
</tr>
<tr>
<td class="name">it.polimi.ingsw.gc14.Network.TCP.Server</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/3)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/19)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/50)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/166)
</span>
</td>
</tr>
</table>
<br/>
<br/>
<table class="coverageStats">
<tr>
<th class="name
">
<a href="index.html">Class</a> </th>
<th class="coverageStat sortedDesc
">
<a href="index_SORT_BY_CLASS.html">Class, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_METHOD.html">Method, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_BLOCK.html">Branch, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_LINE.html">Line, %</a>
</th>
</tr>
<tr>
<td class="name"><a href="sources/source-3.html">TCPServer</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/8)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/28)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/105)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-2.html">HeartbeatHandler</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/5)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/8)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/29)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-1.html">ClientHandler</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/6)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/14)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/32)
</span>
</td>
</tr>
</table>
</div>
<script type="text/javascript">
(function() {
var msie = false, msie9 = false;
/*@cc_on
msie = true;
@if (@_jscript_version >= 9)
msie9 = true;
@end
@*/
if (!msie || msie && msie9) {
hljs.highlightAll()
hljs.initLineNumbersOnLoad();
}
})();
</script>
<div class="footer">
<div style="float:right;">generated on 2026-06-14 21:53</div>
</div>
</body>
</html>
@@ -0,0 +1,237 @@
<!DOCTYPE html>
<html id="htmlId">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Coverage Report > it.polimi.ingsw.gc14.Network.TCP.Server</title>
<style type="text/css">
@import "../css/coverage.css";
@import "../css/idea.min.css";
</style>
<script type="text/javascript" src="../js/highlight.min.js"></script>
<script type="text/javascript" src="../js/highlightjs-line-numbers.min.js"></script>
</head>
<body>
<div class="content">
<div class="breadCrumbs">
Current scope: <a href="../index_SORT_BY_LINE.html">all classes</a>
<span class="separator">|</span>
it.polimi.ingsw.gc14.Network.TCP.Server</div>
<h1>Coverage Summary for Package: it.polimi.ingsw.gc14.Network.TCP.Server</h1>
<table class="coverageStats">
<tr>
<th class="name">Package</th>
<th class="coverageStat
">
Class, %
</th>
<th class="coverageStat
">
Method, %
</th>
<th class="coverageStat
">
Branch, %
</th>
<th class="coverageStat
">
Line, %
</th>
</tr>
<tr>
<td class="name">it.polimi.ingsw.gc14.Network.TCP.Server</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/3)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/19)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/50)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/166)
</span>
</td>
</tr>
</table>
<br/>
<br/>
<table class="coverageStats">
<tr>
<th class="name
">
<a href="index.html">Class</a> </th>
<th class="coverageStat
">
<a href="index_SORT_BY_CLASS.html">Class, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_METHOD.html">Method, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_BLOCK.html">Branch, %</a>
</th>
<th class="coverageStat sortedAsc
">
<a href="index_SORT_BY_LINE_DESC.html">Line, %</a>
</th>
</tr>
<tr>
<td class="name"><a href="sources/source-1.html">ClientHandler</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/6)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/14)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/32)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-2.html">HeartbeatHandler</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/5)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/8)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/29)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-3.html">TCPServer</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/8)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/28)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/105)
</span>
</td>
</tr>
</table>
</div>
<script type="text/javascript">
(function() {
var msie = false, msie9 = false;
/*@cc_on
msie = true;
@if (@_jscript_version >= 9)
msie9 = true;
@end
@*/
if (!msie || msie && msie9) {
hljs.highlightAll()
hljs.initLineNumbersOnLoad();
}
})();
</script>
<div class="footer">
<div style="float:right;">generated on 2026-06-14 21:53</div>
</div>
</body>
</html>
@@ -0,0 +1,237 @@
<!DOCTYPE html>
<html id="htmlId">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Coverage Report > it.polimi.ingsw.gc14.Network.TCP.Server</title>
<style type="text/css">
@import "../css/coverage.css";
@import "../css/idea.min.css";
</style>
<script type="text/javascript" src="../js/highlight.min.js"></script>
<script type="text/javascript" src="../js/highlightjs-line-numbers.min.js"></script>
</head>
<body>
<div class="content">
<div class="breadCrumbs">
Current scope: <a href="../index_SORT_BY_LINE_DESC.html">all classes</a>
<span class="separator">|</span>
it.polimi.ingsw.gc14.Network.TCP.Server</div>
<h1>Coverage Summary for Package: it.polimi.ingsw.gc14.Network.TCP.Server</h1>
<table class="coverageStats">
<tr>
<th class="name">Package</th>
<th class="coverageStat
">
Class, %
</th>
<th class="coverageStat
">
Method, %
</th>
<th class="coverageStat
">
Branch, %
</th>
<th class="coverageStat
">
Line, %
</th>
</tr>
<tr>
<td class="name">it.polimi.ingsw.gc14.Network.TCP.Server</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/3)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/19)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/50)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/166)
</span>
</td>
</tr>
</table>
<br/>
<br/>
<table class="coverageStats">
<tr>
<th class="name
">
<a href="index.html">Class</a> </th>
<th class="coverageStat
">
<a href="index_SORT_BY_CLASS.html">Class, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_METHOD.html">Method, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_BLOCK.html">Branch, %</a>
</th>
<th class="coverageStat sortedDesc
">
<a href="index_SORT_BY_LINE.html">Line, %</a>
</th>
</tr>
<tr>
<td class="name"><a href="sources/source-3.html">TCPServer</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/8)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/28)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/105)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-2.html">HeartbeatHandler</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/5)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/8)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/29)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-1.html">ClientHandler</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/6)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/14)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/32)
</span>
</td>
</tr>
</table>
</div>
<script type="text/javascript">
(function() {
var msie = false, msie9 = false;
/*@cc_on
msie = true;
@if (@_jscript_version >= 9)
msie9 = true;
@end
@*/
if (!msie || msie && msie9) {
hljs.highlightAll()
hljs.initLineNumbersOnLoad();
}
})();
</script>
<div class="footer">
<div style="float:right;">generated on 2026-06-14 21:53</div>
</div>
</body>
</html>
@@ -0,0 +1,237 @@
<!DOCTYPE html>
<html id="htmlId">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Coverage Report > it.polimi.ingsw.gc14.Network.TCP.Server</title>
<style type="text/css">
@import "../css/coverage.css";
@import "../css/idea.min.css";
</style>
<script type="text/javascript" src="../js/highlight.min.js"></script>
<script type="text/javascript" src="../js/highlightjs-line-numbers.min.js"></script>
</head>
<body>
<div class="content">
<div class="breadCrumbs">
Current scope: <a href="../index_SORT_BY_METHOD.html">all classes</a>
<span class="separator">|</span>
it.polimi.ingsw.gc14.Network.TCP.Server</div>
<h1>Coverage Summary for Package: it.polimi.ingsw.gc14.Network.TCP.Server</h1>
<table class="coverageStats">
<tr>
<th class="name">Package</th>
<th class="coverageStat
">
Class, %
</th>
<th class="coverageStat
">
Method, %
</th>
<th class="coverageStat
">
Branch, %
</th>
<th class="coverageStat
">
Line, %
</th>
</tr>
<tr>
<td class="name">it.polimi.ingsw.gc14.Network.TCP.Server</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/3)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/19)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/50)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/166)
</span>
</td>
</tr>
</table>
<br/>
<br/>
<table class="coverageStats">
<tr>
<th class="name
">
<a href="index.html">Class</a> </th>
<th class="coverageStat
">
<a href="index_SORT_BY_CLASS.html">Class, %</a>
</th>
<th class="coverageStat sortedAsc
">
<a href="index_SORT_BY_METHOD_DESC.html">Method, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_BLOCK.html">Branch, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_LINE.html">Line, %</a>
</th>
</tr>
<tr>
<td class="name"><a href="sources/source-1.html">ClientHandler</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/6)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/14)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/32)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-2.html">HeartbeatHandler</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/5)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/8)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/29)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-3.html">TCPServer</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/8)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/28)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/105)
</span>
</td>
</tr>
</table>
</div>
<script type="text/javascript">
(function() {
var msie = false, msie9 = false;
/*@cc_on
msie = true;
@if (@_jscript_version >= 9)
msie9 = true;
@end
@*/
if (!msie || msie && msie9) {
hljs.highlightAll()
hljs.initLineNumbersOnLoad();
}
})();
</script>
<div class="footer">
<div style="float:right;">generated on 2026-06-14 21:53</div>
</div>
</body>
</html>
@@ -0,0 +1,237 @@
<!DOCTYPE html>
<html id="htmlId">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Coverage Report > it.polimi.ingsw.gc14.Network.TCP.Server</title>
<style type="text/css">
@import "../css/coverage.css";
@import "../css/idea.min.css";
</style>
<script type="text/javascript" src="../js/highlight.min.js"></script>
<script type="text/javascript" src="../js/highlightjs-line-numbers.min.js"></script>
</head>
<body>
<div class="content">
<div class="breadCrumbs">
Current scope: <a href="../index_SORT_BY_METHOD_DESC.html">all classes</a>
<span class="separator">|</span>
it.polimi.ingsw.gc14.Network.TCP.Server</div>
<h1>Coverage Summary for Package: it.polimi.ingsw.gc14.Network.TCP.Server</h1>
<table class="coverageStats">
<tr>
<th class="name">Package</th>
<th class="coverageStat
">
Class, %
</th>
<th class="coverageStat
">
Method, %
</th>
<th class="coverageStat
">
Branch, %
</th>
<th class="coverageStat
">
Line, %
</th>
</tr>
<tr>
<td class="name">it.polimi.ingsw.gc14.Network.TCP.Server</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/3)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/19)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/50)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/166)
</span>
</td>
</tr>
</table>
<br/>
<br/>
<table class="coverageStats">
<tr>
<th class="name
">
<a href="index.html">Class</a> </th>
<th class="coverageStat
">
<a href="index_SORT_BY_CLASS.html">Class, %</a>
</th>
<th class="coverageStat sortedDesc
">
<a href="index_SORT_BY_METHOD.html">Method, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_BLOCK.html">Branch, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_LINE.html">Line, %</a>
</th>
</tr>
<tr>
<td class="name"><a href="sources/source-3.html">TCPServer</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/8)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/28)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/105)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-2.html">HeartbeatHandler</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/5)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/8)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/29)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-1.html">ClientHandler</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/6)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/14)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/32)
</span>
</td>
</tr>
</table>
</div>
<script type="text/javascript">
(function() {
var msie = false, msie9 = false;
/*@cc_on
msie = true;
@if (@_jscript_version >= 9)
msie9 = true;
@end
@*/
if (!msie || msie && msie9) {
hljs.highlightAll()
hljs.initLineNumbersOnLoad();
}
})();
</script>
<div class="footer">
<div style="float:right;">generated on 2026-06-14 21:53</div>
</div>
</body>
</html>
@@ -0,0 +1,237 @@
<!DOCTYPE html>
<html id="htmlId">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Coverage Report > it.polimi.ingsw.gc14.Network.TCP.Server</title>
<style type="text/css">
@import "../css/coverage.css";
@import "../css/idea.min.css";
</style>
<script type="text/javascript" src="../js/highlight.min.js"></script>
<script type="text/javascript" src="../js/highlightjs-line-numbers.min.js"></script>
</head>
<body>
<div class="content">
<div class="breadCrumbs">
Current scope: <a href="../index_SORT_BY_NAME_DESC.html">all classes</a>
<span class="separator">|</span>
it.polimi.ingsw.gc14.Network.TCP.Server</div>
<h1>Coverage Summary for Package: it.polimi.ingsw.gc14.Network.TCP.Server</h1>
<table class="coverageStats">
<tr>
<th class="name">Package</th>
<th class="coverageStat
">
Class, %
</th>
<th class="coverageStat
">
Method, %
</th>
<th class="coverageStat
">
Branch, %
</th>
<th class="coverageStat
">
Line, %
</th>
</tr>
<tr>
<td class="name">it.polimi.ingsw.gc14.Network.TCP.Server</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/3)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/19)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/50)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/166)
</span>
</td>
</tr>
</table>
<br/>
<br/>
<table class="coverageStats">
<tr>
<th class="name sortedDesc
">
<a href="index.html">Class</a> </th>
<th class="coverageStat
">
<a href="index_SORT_BY_CLASS.html">Class, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_METHOD.html">Method, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_BLOCK.html">Branch, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_LINE.html">Line, %</a>
</th>
</tr>
<tr>
<td class="name"><a href="sources/source-3.html">TCPServer</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/8)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/28)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/105)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-2.html">HeartbeatHandler</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/5)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/8)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/29)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-1.html">ClientHandler</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/6)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/14)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/32)
</span>
</td>
</tr>
</table>
</div>
<script type="text/javascript">
(function() {
var msie = false, msie9 = false;
/*@cc_on
msie = true;
@if (@_jscript_version >= 9)
msie9 = true;
@end
@*/
if (!msie || msie && msie9) {
hljs.highlightAll()
hljs.initLineNumbersOnLoad();
}
})();
</script>
<div class="footer">
<div style="float:right;">generated on 2026-06-14 21:53</div>
</div>
</body>
</html>
@@ -0,0 +1,267 @@
<!DOCTYPE html>
<html id="htmlId">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Coverage Report > ClientHandler</title>
<style type="text/css">
@import "../../css/coverage.css";
@import "../../css/idea.min.css";
</style>
<script type="text/javascript" src="../../js/highlight.min.js"></script>
<script type="text/javascript" src="../../js/highlightjs-line-numbers.min.js"></script>
</head>
<body>
<div class="content">
<div class="breadCrumbs">
Current scope: <a href="../../index.html">all classes</a>
<span class="separator">|</span>
<a href="../index.html">it.polimi.ingsw.gc14.Network.TCP.Server</a>
</div>
<h1>Coverage Summary for Class: ClientHandler (it.polimi.ingsw.gc14.Network.TCP.Server)</h1>
<table class="coverageStats">
<tr>
<th class="name">Class</th>
<th class="coverageStat
">
Class, %
</th>
<th class="coverageStat
">
Method, %
</th>
<th class="coverageStat
">
Branch, %
</th>
<th class="coverageStat
">
Line, %
</th>
</tr>
<tr>
<td class="name">ClientHandler</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/6)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/14)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/32)
</span>
</td>
</tr>
</table>
<br/>
<br/>
<pre>
<code class="sourceCode" id="sourceCode">&nbsp;package it.polimi.ingsw.gc14.Network.TCP.Server;
&nbsp;
&nbsp;import it.polimi.ingsw.gc14.LimitedMap;
&nbsp;import it.polimi.ingsw.gc14.Model.Game;
&nbsp;import it.polimi.ingsw.gc14.Model.MiniModel;
&nbsp;import it.polimi.ingsw.gc14.Network.NetworkEvent;
&nbsp;import it.polimi.ingsw.gc14.Network.NetworkEvents.DisconnectedPlayer;
&nbsp;
&nbsp;import java.io.*;
&nbsp;import java.net.*;
&nbsp;import java.util.List;
&nbsp;import java.util.concurrent.BlockingQueue;
&nbsp;
&nbsp;/**
&nbsp; * Handles the TCP connection with a single client.
&nbsp; * Each instance runs on a dedicated thread and is responsible for receiving {@link NetworkEvent} from its client and adding them
&nbsp; * to the {@link #actionQueue}.
&nbsp; * It is also responsible to send events and game model updates back to the client.
&nbsp; */
&nbsp;public class ClientHandler implements Runnable {
&nbsp; /**
&nbsp; * The username of the connected client on this handler
&nbsp; */
&nbsp; private final String username;
&nbsp;
&nbsp; private volatile boolean running;
&nbsp;
&nbsp; /**
&nbsp; * Returns the username associated with this client.
&nbsp; *
&nbsp; * @return the username associated with this client.
&nbsp; */
&nbsp; public String getUsername() {
<b class="nc">&nbsp; return username;</b>
&nbsp; }
&nbsp; /** The TCP socket */
&nbsp; private Socket clientSocket;
&nbsp;
&nbsp; /** Input stream used to receive objects from the client */
&nbsp; private ObjectInputStream in;
&nbsp;
&nbsp; /** Output stream used to send objects to the client */
&nbsp; private ObjectOutputStream out;
&nbsp;
&nbsp; /**
&nbsp; * Shared list of all client handlers.
&nbsp; * This handler removes itself from the list when disconnected.
&nbsp; */
&nbsp; private List&lt;ClientHandler&gt; clientHandlers;
&nbsp;
&nbsp; /** Maps each connected player&#39;s username to their connection state (true = connected). */
&nbsp; private LimitedMap&lt;String, Boolean&gt; limitedMap;
&nbsp;
&nbsp; /** Queue containing the events to be applied to the game model */
&nbsp; private BlockingQueue&lt;NetworkEvent&gt; actionQueue;
&nbsp;
&nbsp;
&nbsp; /**
&nbsp; * Class constructor that initializes the attributes.
&nbsp; *
&nbsp; * @param username the username associated with the client.
&nbsp; * @param clientSocket the socket representing the client&#39;s TCP connection.
&nbsp; * @param out the output stream used to send data to the client.
&nbsp; * @param in the input stream used to receive data from the client.
&nbsp; * @param clientHandlers the shared list of all active client handlers.
&nbsp; * @param playersMap the shared map containing the connected players.
&nbsp; * @param actionQueue the queue containing incoming events.
&nbsp; */
<b class="nc">&nbsp; public ClientHandler(String username, Socket clientSocket, ObjectOutputStream out, ObjectInputStream in, List&lt;ClientHandler&gt; clientHandlers, LimitedMap&lt;String,Boolean&gt; playersMap, BlockingQueue&lt;NetworkEvent&gt; actionQueue) {</b>
<b class="nc">&nbsp; this.username=username;</b>
<b class="nc">&nbsp; this.clientSocket = clientSocket;</b>
<b class="nc">&nbsp; this.in = in;</b>
<b class="nc">&nbsp; this.out = out;</b>
<b class="nc">&nbsp; this.clientHandlers = clientHandlers;</b>
<b class="nc">&nbsp; this.actionQueue = actionQueue;</b>
<b class="nc">&nbsp; this.limitedMap = playersMap;</b>
&nbsp; }
&nbsp;
&nbsp;
&nbsp; /**
&nbsp; * Listens for incoming {@link NetworkEvent}s from the client and adds them to the {@link #actionQueue}.
&nbsp; * Upon disconnection, this handler removes itself from {@link #clientHandlers}.
&nbsp; */
&nbsp; @Override
&nbsp; public void run() {
<b class="nc">&nbsp; running = true;</b>
&nbsp; try {
<b class="nc">&nbsp; while (running) {</b>
<b class="nc">&nbsp; NetworkEvent event = (NetworkEvent) in.readObject();</b>
<b class="nc">&nbsp; if (!actionQueue.offer(event)) {</b>
<b class="nc">&nbsp; System.out.println(&quot;Error inserting action into queue&quot;);</b>
&nbsp; }
&nbsp; }
&nbsp; } catch (IOException e) {
<b class="nc">&nbsp; System.err.println(&quot;Error in incoming connection/disconnection: &quot; + username);</b>
&nbsp; } catch (ClassNotFoundException e) {
<b class="nc">&nbsp; System.err.println(&quot;Class not found: &quot; + username);</b>
&nbsp; } finally {
<b class="nc">&nbsp; if (running) disconnect();</b>
&nbsp; }
&nbsp; }
&nbsp;
&nbsp;
&nbsp;
&nbsp; /**
&nbsp; * Sends a {@link NetworkEvent} to the client.
&nbsp; * @param event The network event to send to the client.
&nbsp; */
&nbsp; public synchronized void notifyEvent(NetworkEvent event) {
&nbsp; try {
<b class="nc">&nbsp; out.reset();</b>
<b class="nc">&nbsp; out.writeObject(event);</b>
&nbsp; } catch (IOException e) {
<b class="nc">&nbsp; e.printStackTrace();</b>
<b class="nc">&nbsp; disconnect();</b>
&nbsp; }
&nbsp;
&nbsp; }
&nbsp;
&nbsp;
&nbsp; /**
&nbsp; * Sends the current game model to this client.
&nbsp; * @param game The current state of the game to send to the client.
&nbsp; */
&nbsp; public synchronized void notifyMiniModel(MiniModel game) {
&nbsp; try {
<b class="nc">&nbsp; out.reset();</b>
<b class="nc">&nbsp; out.writeObject(game);</b>
&nbsp; } catch (IOException e) {
<b class="nc">&nbsp; e.printStackTrace();</b>
<b class="nc">&nbsp; disconnect();</b>
&nbsp; }
&nbsp; }
&nbsp;
&nbsp; /**
&nbsp; * Disconnects the client from the server.
&nbsp; *
&nbsp; * &lt;p&gt;The client handler is stopped and removed from the list of active handlers.
&nbsp; * The player is marked as disconnected, a {@link DisconnectedPlayer} event is
&nbsp; * added to the action queue, and the associated socket is closed.
&nbsp; */
&nbsp; public synchronized void disconnect() {
<b class="nc">&nbsp; if (!running) return;</b>
<b class="nc">&nbsp; running = false;</b>
<b class="nc">&nbsp; clientHandlers.remove(this);</b>
<b class="nc">&nbsp; limitedMap.put(username, false);</b>
<b class="nc">&nbsp; actionQueue.add(new DisconnectedPlayer(username));</b>
<b class="nc">&nbsp; System.out.println(&quot;Disconnected player: &quot; + username);</b>
<b class="nc">&nbsp; try { clientSocket.close(); } catch (IOException ignored) {}</b>
&nbsp; }
&nbsp;}
</code>
</pre>
</div>
<script type="text/javascript">
(function() {
var msie = false, msie9 = false;
/*@cc_on
msie = true;
@if (@_jscript_version >= 9)
msie9 = true;
@end
@*/
if (!msie || msie && msie9) {
hljs.highlightAll()
hljs.initLineNumbersOnLoad();
}
})();
</script>
<div class="footer">
<div style="float:right;">generated on 2026-06-14 21:53</div>
</div>
</body>
</html>
@@ -0,0 +1,247 @@
<!DOCTYPE html>
<html id="htmlId">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Coverage Report > HeartbeatHandler</title>
<style type="text/css">
@import "../../css/coverage.css";
@import "../../css/idea.min.css";
</style>
<script type="text/javascript" src="../../js/highlight.min.js"></script>
<script type="text/javascript" src="../../js/highlightjs-line-numbers.min.js"></script>
</head>
<body>
<div class="content">
<div class="breadCrumbs">
Current scope: <a href="../../index.html">all classes</a>
<span class="separator">|</span>
<a href="../index.html">it.polimi.ingsw.gc14.Network.TCP.Server</a>
</div>
<h1>Coverage Summary for Class: HeartbeatHandler (it.polimi.ingsw.gc14.Network.TCP.Server)</h1>
<table class="coverageStats">
<tr>
<th class="name">Class</th>
<th class="coverageStat
">
Class, %
</th>
<th class="coverageStat
">
Method, %
</th>
<th class="coverageStat
">
Branch, %
</th>
<th class="coverageStat
">
Line, %
</th>
</tr>
<tr>
<td class="name">HeartbeatHandler</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/5)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/8)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/29)
</span>
</td>
</tr>
</table>
<br/>
<br/>
<pre>
<code class="sourceCode" id="sourceCode">&nbsp;package it.polimi.ingsw.gc14.Network.TCP.Server;
&nbsp;
&nbsp;import java.io.*;
&nbsp;import java.net.*;
&nbsp;import java.util.concurrent.Executors;
&nbsp;import java.util.concurrent.ScheduledExecutorService;
&nbsp;import java.util.concurrent.TimeUnit;
&nbsp;import it.polimi.ingsw.gc14.Network.NetworkConfig;
&nbsp;
&nbsp;/**
&nbsp; * Handles the heartbeat communication associated with a TCP client.
&nbsp; *
&nbsp; * &lt;p&gt;This component listens for heartbeat {@code PING} messages from the client,
&nbsp; * replies with {@code PONG} messages, and periodically checks whether the client
&nbsp; * has remained silent for too long. If a timeout or communication error occurs,
&nbsp; * both the heartbeat connection and the main client connection are disconnected.
&nbsp; */
&nbsp;public class HeartbeatHandler implements Runnable {
&nbsp;
&nbsp; private final String username;
&nbsp; private final Socket socket;
&nbsp; private final InputStream in;
&nbsp; private final OutputStream out;
&nbsp;
&nbsp; /**
&nbsp; * Byte value representing a heartbeat ping message.
&nbsp; */
&nbsp; private static final int PING = 1;
&nbsp;
&nbsp; /**
&nbsp; * Byte value representing a heartbeat pong response.
&nbsp; */
&nbsp; private static final int PONG = 2;
&nbsp;
&nbsp; /**
&nbsp; * Main client handler associated with this heartbeat connection.
&nbsp; */
&nbsp; private final ClientHandler mainHandler;
&nbsp;
&nbsp; /**
&nbsp; * Timestamp of the last received heartbeat message.
&nbsp; */
<b class="nc">&nbsp; private volatile long lastReceivedTime = System.currentTimeMillis();</b>
&nbsp;
&nbsp; /**
&nbsp; * Indicates whether the heartbeat handler is still active.
&nbsp; */
<b class="nc">&nbsp; private volatile boolean running = true;</b>
&nbsp;
&nbsp;
&nbsp; /**
&nbsp; * Executor used to periodically check heartbeat timeouts.
&nbsp; */
<b class="nc">&nbsp; private final ScheduledExecutorService watchdog =</b>
<b class="nc">&nbsp; Executors.newSingleThreadScheduledExecutor();</b>
&nbsp;
&nbsp; /**
&nbsp; * Constructs a heartbeat handler for the specified client.
&nbsp; *
&nbsp; * @param username the username of the connected client.
&nbsp; * @param socket the socket dedicated to heartbeat communication.
&nbsp; * @param mainHandler the main client handler associated with the same player.
&nbsp; * @throws IOException if the input or output stream cannot be obtained from the socket.
&nbsp; */
&nbsp; public HeartbeatHandler(String username, Socket socket, ClientHandler mainHandler)
<b class="nc">&nbsp; throws IOException {</b>
<b class="nc">&nbsp; this.username = username;</b>
<b class="nc">&nbsp; this.socket = socket;</b>
<b class="nc">&nbsp; this.mainHandler = mainHandler;</b>
<b class="nc">&nbsp; this.in = socket.getInputStream();</b>
<b class="nc">&nbsp; this.out = socket.getOutputStream();</b>
&nbsp; }
&nbsp;
&nbsp; /**
&nbsp; * Starts the heartbeat listening loop.
&nbsp; *
&nbsp; * &lt;p&gt;The method activates the watchdog task, then waits for incoming heartbeat
&nbsp; * messages. When a {@code PING} is received, the last-received timestamp is
&nbsp; * updated and a {@code PONG} response is sent back to the client.
&nbsp; * If the stream is closed or an I/O error occurs, the client is disconnected.
&nbsp; */
&nbsp; @Override
&nbsp; public void run() {
<b class="nc">&nbsp; startWatchdog();</b>
&nbsp; try {
<b class="nc">&nbsp; while (running) {</b>
<b class="nc">&nbsp; int b = in.read(); // blocks until a byte arrives</b>
<b class="nc">&nbsp; if (b == -1) {</b>
<b class="nc">&nbsp; disconnect();</b>
&nbsp; break; // stream closed
&nbsp; }
<b class="nc">&nbsp; if (b == PING) {</b>
<b class="nc">&nbsp; lastReceivedTime = System.currentTimeMillis();</b>
<b class="nc">&nbsp; out.write(PONG);</b>
<b class="nc">&nbsp; out.flush();</b>
&nbsp; }
&nbsp; }
&nbsp; } catch (IOException e) {
<b class="nc">&nbsp; disconnect();</b>
&nbsp; }
&nbsp; }
&nbsp;
&nbsp; /**
&nbsp; * Starts the periodic watchdog task that detects heartbeat timeouts.
&nbsp; *
&nbsp; * &lt;p&gt;If no heartbeat message is received within the configured silence threshold,
&nbsp; * the associated client is disconnected.
&nbsp; */
&nbsp; private void startWatchdog() {
<b class="nc">&nbsp; watchdog.scheduleAtFixedRate(() -&gt; {</b>
<b class="nc">&nbsp; if (System.currentTimeMillis() - lastReceivedTime &gt; NetworkConfig.SILENCE_THRESHOLD_MS) {</b>
<b class="nc">&nbsp; System.out.println(&quot;Heartbeat timeout: &quot; + username);</b>
<b class="nc">&nbsp; disconnect();</b>
&nbsp; }
&nbsp; }, 1, 1, TimeUnit.SECONDS);
&nbsp; }
&nbsp;
&nbsp; /**
&nbsp; * Disconnects the heartbeat channel and the associated main client connection.
&nbsp; *
&nbsp; * &lt;p&gt;The handler is stopped, the watchdog task is terminated, the main
&nbsp; * {@link ClientHandler} is disconnected, and the heartbeat socket is closed.
&nbsp; */
&nbsp; private synchronized void disconnect() {
<b class="nc">&nbsp; running = false;</b>
<b class="nc">&nbsp; watchdog.shutdownNow();</b>
<b class="nc">&nbsp; mainHandler.disconnect(); // disconnette anche il socket principale</b>
<b class="nc">&nbsp; System.out.println(&quot;Disconnected: &quot; + username);</b>
<b class="nc">&nbsp; try { socket.close(); } catch (IOException ignored) {}</b>
&nbsp; }
&nbsp;}
</code>
</pre>
</div>
<script type="text/javascript">
(function() {
var msie = false, msie9 = false;
/*@cc_on
msie = true;
@if (@_jscript_version >= 9)
msie9 = true;
@end
@*/
if (!msie || msie && msie9) {
hljs.highlightAll()
hljs.initLineNumbersOnLoad();
}
})();
</script>
<div class="footer">
<div style="float:right;">generated on 2026-06-14 21:53</div>
</div>
</body>
</html>
@@ -0,0 +1,438 @@
<!DOCTYPE html>
<html id="htmlId">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Coverage Report > TCPServer</title>
<style type="text/css">
@import "../../css/coverage.css";
@import "../../css/idea.min.css";
</style>
<script type="text/javascript" src="../../js/highlight.min.js"></script>
<script type="text/javascript" src="../../js/highlightjs-line-numbers.min.js"></script>
</head>
<body>
<div class="content">
<div class="breadCrumbs">
Current scope: <a href="../../index.html">all classes</a>
<span class="separator">|</span>
<a href="../index.html">it.polimi.ingsw.gc14.Network.TCP.Server</a>
</div>
<h1>Coverage Summary for Class: TCPServer (it.polimi.ingsw.gc14.Network.TCP.Server)</h1>
<table class="coverageStats">
<tr>
<th class="name">Class</th>
<th class="coverageStat
">
Class, %
</th>
<th class="coverageStat
">
Method, %
</th>
<th class="coverageStat
">
Branch, %
</th>
<th class="coverageStat
">
Line, %
</th>
</tr>
<tr>
<td class="name">TCPServer</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/8)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/28)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/105)
</span>
</td>
</tr>
</table>
<br/>
<br/>
<pre>
<code class="sourceCode" id="sourceCode">&nbsp;package it.polimi.ingsw.gc14.Network.TCP.Server;
&nbsp;
&nbsp;import it.polimi.ingsw.gc14.Controller.GameController;
&nbsp;import it.polimi.ingsw.gc14.ErrorType;
&nbsp;import it.polimi.ingsw.gc14.LimitedMap;
&nbsp;import it.polimi.ingsw.gc14.Model.Game;
&nbsp;import it.polimi.ingsw.gc14.Model.GamePackage.GameStages;
&nbsp;import it.polimi.ingsw.gc14.Model.MiniModel;
&nbsp;import it.polimi.ingsw.gc14.Network.EventType;
&nbsp;import it.polimi.ingsw.gc14.Network.NetworkConfig;
&nbsp;import it.polimi.ingsw.gc14.Network.NetworkEvent;
&nbsp;import it.polimi.ingsw.gc14.Network.NetworkEvents.AddPlayer;
&nbsp;import it.polimi.ingsw.gc14.Network.NetworkEvents.ReconnectPlayer;
&nbsp;
&nbsp;import java.io.*;
&nbsp;import java.net.*;
&nbsp;import java.util.ArrayList;
&nbsp;import java.util.Map;
&nbsp;import java.util.concurrent.CopyOnWriteArrayList;
&nbsp;import java.util.concurrent.BlockingQueue;
&nbsp;import java.util.concurrent.ConcurrentHashMap;
&nbsp;import java.util.stream.Collectors;
&nbsp;
&nbsp;/**
&nbsp; * TCP server responsible for accepting client connections,
&nbsp; * handling player registration and reconnection, and sending
&nbsp; * game updates to connected clients.
&nbsp; *
&nbsp; * &lt;p&gt;The server also manages a dedicated heartbeat channel used
&nbsp; * to detect disconnected clients and associate each heartbeat
&nbsp; * connection with the corresponding {@link ClientHandler}.
&nbsp; */
&nbsp;public class TCPServer {
&nbsp;
&nbsp; /**
&nbsp; * Main TCP port used for standard client-server communication.
&nbsp; */
&nbsp; private int port;
&nbsp;
&nbsp; /**
&nbsp; * TCP port dedicated to heartbeat communication.
&nbsp; */
&nbsp; private int heartbeatPort;
&nbsp;
&nbsp; /**
&nbsp; * Main server socket used to accept client connections.
&nbsp; */
&nbsp; private ServerSocket socketTCP;
&nbsp;
&nbsp; /**
&nbsp; * Server socket used to accept heartbeat connections.
&nbsp; */
&nbsp; private ServerSocket heartbeatSocketTCP;
&nbsp;
&nbsp; /**
&nbsp; * Game controller used to manage the server-side game logic.
&nbsp; */
&nbsp; private final GameController controller;
&nbsp;
&nbsp; /**
&nbsp; * Queue containing network events received from clients.
&nbsp; */
&nbsp; private BlockingQueue&lt;NetworkEvent&gt; actionQueue;
&nbsp;
&nbsp; /**
&nbsp; * Map storing the online/offline status of connected players.
&nbsp; */
&nbsp; private LimitedMap&lt;String, Boolean&gt; playerList;
&nbsp;
&nbsp; /**
&nbsp; * List of active TCP client handlers.
&nbsp; */
&nbsp; private CopyOnWriteArrayList&lt;ClientHandler&gt; clientHandlers;
&nbsp;
&nbsp;
&nbsp; /**
&nbsp; * Temporary map associating each username with the corresponding
&nbsp; * {@link ClientHandler} waiting for its heartbeat connection.
&nbsp; */
<b class="nc">&nbsp; private final Map&lt;String, ClientHandler&gt; pendingHeartbeat = new ConcurrentHashMap&lt;&gt;();</b>
&nbsp;
&nbsp; /**
&nbsp; * Constructs a TCP server with the required game and network components.
&nbsp; *
&nbsp; * @param controller the game controller used to manage the game logic.
&nbsp; * @param port the main TCP port used for client communication.
&nbsp; * @param heartbeatPort the TCP port dedicated to heartbeat connections.
&nbsp; * @param actionQueue the queue containing incoming network events.
&nbsp; * @param playerList the map storing the connection status of the players.
&nbsp; */
&nbsp; public TCPServer(GameController controller,
&nbsp; int port,
&nbsp; int heartbeatPort,
&nbsp; BlockingQueue&lt;NetworkEvent&gt; actionQueue,
<b class="nc">&nbsp; LimitedMap&lt;String, Boolean&gt; playerList) {</b>
<b class="nc">&nbsp; this.port = port;</b>
<b class="nc">&nbsp; this.heartbeatPort = heartbeatPort;</b>
<b class="nc">&nbsp; this.controller = controller;</b>
<b class="nc">&nbsp; this.actionQueue = actionQueue;</b>
<b class="nc">&nbsp; this.playerList = playerList;</b>
<b class="nc">&nbsp; this.clientHandlers = new CopyOnWriteArrayList&lt;&gt;();</b>
&nbsp; }
&nbsp;
&nbsp; /**
&nbsp; * Starts the TCP server and begins accepting client connections.
&nbsp; *
&nbsp; * &lt;p&gt;The method opens both the main TCP server socket and the dedicated
&nbsp; * heartbeat server socket. It then starts a separate thread for heartbeat
&nbsp; * connections and continuously waits for new players or reconnecting clients.
&nbsp; *
&nbsp; * &lt;p&gt;When a new connection is received, the first event must be an
&nbsp; * {@link AddPlayer} request. Depending on the current server state,
&nbsp; * the connection is handled either as a new player joining the game
&nbsp; * or as a reconnection attempt.
&nbsp; *
&nbsp; */
&nbsp; public void start() {
&nbsp; try {
<b class="nc">&nbsp; socketTCP = new ServerSocket(port);</b>
<b class="nc">&nbsp; heartbeatSocketTCP = new ServerSocket(heartbeatPort);</b>
&nbsp; } catch (IOException e) {
<b class="nc">&nbsp; System.out.println(&quot;Could not start TCP server&quot;);</b>
<b class="nc">&nbsp; e.printStackTrace();</b>
&nbsp; return;
&nbsp; }
&nbsp;
<b class="nc">&nbsp; System.out.println(&quot;TCP server started on port: &quot; + port);</b>
<b class="nc">&nbsp; System.out.println(&quot;Heartbeat server started on port: &quot; + heartbeatPort);</b>
&nbsp;
<b class="nc">&nbsp; new Thread(this::acceptHeartbeat, &quot;heartbeat-acceptor&quot;).start();</b>
&nbsp;
&nbsp; while (true) {
&nbsp; try {
<b class="nc">&nbsp; Socket clientSocket = socketTCP.accept();</b>
&nbsp;
<b class="nc">&nbsp; ObjectOutputStream clientSend = new ObjectOutputStream(clientSocket.getOutputStream());</b>
<b class="nc">&nbsp; clientSend.flush();</b>
<b class="nc">&nbsp; ObjectInputStream clientReceive = new ObjectInputStream(clientSocket.getInputStream());</b>
&nbsp;
<b class="nc">&nbsp; NetworkEvent event = (NetworkEvent) clientReceive.readObject();</b>
&nbsp;
<b class="nc">&nbsp; if (!(event.getEventType() == EventType.ADD_PLAYER)) {</b>
&nbsp; clientSocket.close();
<b class="nc">&nbsp; System.out.println(&quot;Invalid parameters. Connection terminated.&quot;);</b>
&nbsp; continue;
&nbsp; }
&nbsp;
<b class="nc">&nbsp; AddPlayer eventAddPlayer = (AddPlayer) event;</b>
&nbsp;
<b class="nc">&nbsp; if (eventAddPlayer.getProposedNPlayer() &lt; NetworkConfig.MIN_PLAYERS</b>
<b class="nc">&nbsp; || eventAddPlayer.getProposedNPlayer() &gt; NetworkConfig.MAX_PLAYERS) {</b>
<b class="nc">&nbsp; eventAddPlayer.setErrorType(ErrorType.WRONG_PLAYER_NUMBER);</b>
<b class="nc">&nbsp; eventAddPlayer.setIsError(true);</b>
<b class="nc">&nbsp; clientSend.writeObject(eventAddPlayer);</b>
&nbsp; clientSocket.close();
<b class="nc">&nbsp; System.out.println(&quot;Invalid parameters. Connection terminated.&quot;);</b>
&nbsp; continue;
&nbsp; }
&nbsp;
<b class="nc">&nbsp; synchronized (controller) {</b>
<b class="nc">&nbsp; String username = eventAddPlayer.getUsername();</b>
&nbsp; //reconnect players after a server crash
<b class="nc">&nbsp; if (playerList.isEmpty()&amp;&amp; controller.getModel()==null) {</b>
<b class="nc">&nbsp; Game model = new Game(eventAddPlayer.getProposedNPlayer());</b>
<b class="nc">&nbsp; controller.setModel(model);</b>
<b class="nc">&nbsp; playerList.setLimit(eventAddPlayer.getProposedNPlayer());</b>
<b class="nc">&nbsp; System.out.println(&quot;Game Created With :&quot;+eventAddPlayer.getProposedNPlayer()+&quot; Players&quot;);</b>
&nbsp; }
<b class="nc">&nbsp; if(controller.getModel().getCurrentState().getGameStage()!= GameStages.WAITING ) {</b>
<b class="nc">&nbsp; if (controller.getModel().getPlayers().stream().noneMatch(p -&gt; p.getUserName().equals(username))|| controller.getModel().getCurrentState().getGameStage()==GameStages.ENDED) {</b>
<b class="nc">&nbsp; eventAddPlayer.setErrorType(ErrorType.GAME_ALREADY_STARTED);</b>
<b class="nc">&nbsp; eventAddPlayer.setIsError(true);</b>
<b class="nc">&nbsp; clientSend.writeObject(eventAddPlayer);</b>
&nbsp; clientSocket.close();
<b class="nc">&nbsp; System.out.println(&quot;Invalid parameters. Connection terminated.&quot;);</b>
<b class="nc">&nbsp; continue;</b>
&nbsp; }
&nbsp; }
&nbsp; else {
<b class="nc">&nbsp; if (controller.addPlayer(username)) {</b>
<b class="nc">&nbsp; playerList.put(username, true);</b>
<b class="nc">&nbsp; System.out.println(&quot;Accepted player: &quot; + username);</b>
<b class="nc">&nbsp; clientSend.writeObject(eventAddPlayer);</b>
<b class="nc">&nbsp; ClientHandler handler = createAndRegisterHandler(</b>
&nbsp; username, clientSocket, clientSend, clientReceive);
<b class="nc">&nbsp; new Thread(handler).start();</b>
<b class="nc">&nbsp; continue;</b>
&nbsp; } else {
<b class="nc">&nbsp; eventAddPlayer.setErrorType(ErrorType.USERNAME_ALREADY_USED);</b>
<b class="nc">&nbsp; eventAddPlayer.setIsError(true);</b>
<b class="nc">&nbsp; clientSend.writeObject(eventAddPlayer);</b>
&nbsp; clientSocket.close();
<b class="nc">&nbsp; System.out.println(&quot;Invalid parameters. Connection terminated.&quot;);</b>
<b class="nc">&nbsp; continue;</b>
&nbsp; }
&nbsp; }
&nbsp;
<b class="nc">&nbsp; if (!playerList.containsKey(username)) {</b>
<b class="nc">&nbsp; playerList.put(username, true);</b>
<b class="nc">&nbsp; System.out.println(&quot;(After crash)Reconnected player: &quot; + username);</b>
<b class="nc">&nbsp; clientSend.writeObject(eventAddPlayer);</b>
<b class="nc">&nbsp; ClientHandler handler = createAndRegisterHandler(</b>
&nbsp; username, clientSocket, clientSend, clientReceive);
<b class="nc">&nbsp; new Thread(handler).start();</b>
<b class="nc">&nbsp; } else if (!playerList.get(username)) {</b>
&nbsp; // reconnect a previously disconnected player
<b class="nc">&nbsp; playerList.put(username, true);</b>
<b class="nc">&nbsp; System.out.println(&quot;Reconnected player: &quot; + username);</b>
<b class="nc">&nbsp; clientSend.writeObject(eventAddPlayer);</b>
<b class="nc">&nbsp; ClientHandler handler = createAndRegisterHandler(</b>
&nbsp; username, clientSocket, clientSend, clientReceive);
<b class="nc">&nbsp; Game game = controller.getModel();</b>
<b class="nc">&nbsp; handler.notifyMiniModel(new MiniModel(</b>
<b class="nc">&nbsp; game.getSlotMap(), game.getOrderLogicCard(),</b>
<b class="nc">&nbsp; game.getCurrentState(), game.getPlayers(),</b>
<b class="nc">&nbsp; game.getAvailableTotems(),</b>
<b class="nc">&nbsp; game.getUpperListTribeCards(), game.getLowerListTribeCards(),</b>
<b class="nc">&nbsp; game.getUpperListBuilding(), game.getLowerListBuilding(),</b>
<b class="nc">&nbsp; disconnectedUsernames(game)));</b>
<b class="nc">&nbsp; new Thread(handler).start();</b>
<b class="nc">&nbsp; actionQueue.add(new ReconnectPlayer(username));</b>
&nbsp; } else {
<b class="nc">&nbsp; eventAddPlayer.setErrorType(ErrorType.USER_ALREADY_CONNECTED);</b>
<b class="nc">&nbsp; eventAddPlayer.setIsError(true);</b>
<b class="nc">&nbsp; clientSend.writeObject(eventAddPlayer);</b>
&nbsp; clientSocket.close();
<b class="nc">&nbsp; System.out.println(&quot;Invalid parameters. Connection terminated.&quot;);</b>
&nbsp; }
<b class="nc">&nbsp; }</b>
&nbsp; } catch (IOException | ClassNotFoundException e) {
<b class="nc">&nbsp; e.printStackTrace();</b>
&nbsp; }
&nbsp; }
&nbsp; }
&nbsp;
&nbsp; /**
&nbsp; * Accepts heartbeat connections and associates them with the correct client handler.
&nbsp; *
&nbsp; * &lt;p&gt;Each client immediately sends its username on the heartbeat channel.
&nbsp; * The method uses that username to retrieve the pending {@link ClientHandler}
&nbsp; * and starts a dedicated {@link HeartbeatHandler}. If no pending handler is found,
&nbsp; * the heartbeat socket is closed.
&nbsp; */
&nbsp; private void acceptHeartbeat() {
&nbsp; while (true) {
&nbsp; try {
<b class="nc">&nbsp; Socket hbSocket = heartbeatSocketTCP.accept();</b>
<b class="nc">&nbsp; ObjectInputStream hbIn =</b>
<b class="nc">&nbsp; new ObjectInputStream(hbSocket.getInputStream());</b>
&nbsp;
<b class="nc">&nbsp; String username = (String) hbIn.readObject();</b>
&nbsp;
<b class="nc">&nbsp; ClientHandler handler = pendingHeartbeat.remove(username);</b>
&nbsp;
<b class="nc">&nbsp; if (handler != null) {</b>
<b class="nc">&nbsp; HeartbeatHandler hb =</b>
&nbsp; new HeartbeatHandler(username, hbSocket, handler);
&nbsp;
<b class="nc">&nbsp; new Thread(hb, &quot;heartbeat-&quot; + username).start();</b>
<b class="nc">&nbsp; System.out.println(&quot;Heartbeat connected for: &quot; + username);</b>
&nbsp; } else {
<b class="nc">&nbsp; System.out.println(</b>
&nbsp; &quot;No pending handler for: &quot; + username + &quot;, closing heartbeat.&quot;
&nbsp; );
&nbsp; hbSocket.close();
&nbsp; }
&nbsp;
&nbsp; } catch (IOException | ClassNotFoundException e) {
<b class="nc">&nbsp; e.printStackTrace();</b>
&nbsp; }
&nbsp; }
&nbsp; }
&nbsp;
&nbsp; /**
&nbsp; * Notifies connected TCP clients of a new network event.
&nbsp; *
&nbsp; * &lt;p&gt;If the event does not represent an error, it is sent to all connected clients.
&nbsp; * If it represents an error, it is sent only to the client that requested the action.
&nbsp; *
&nbsp; * @param event the network event to send to the clients.
&nbsp; */
&nbsp; public void notifyAll(NetworkEvent event) {
<b class="nc">&nbsp; clientHandlers.forEach(h -&gt; {</b>
<b class="nc">&nbsp; if (!event.isError() || event.getUsername().equals(h.getUsername())) {</b>
<b class="nc">&nbsp; h.notifyEvent(event);</b>
&nbsp; }
&nbsp; });
&nbsp; }
&nbsp;
&nbsp; /**
&nbsp; * Notifies all connected TCP clients of a new game model.
&nbsp; *
&nbsp; * @param model the updated mini model to send to the clients.
&nbsp; */
&nbsp; public void notifyAll(MiniModel model) {
<b class="nc">&nbsp; clientHandlers.forEach(h -&gt; h.notifyMiniModel(model));</b>
&nbsp; }
&nbsp;
&nbsp; /**
&nbsp; * Creates a {@link ClientHandler}, registers it in {@code pendingHeartbeat}
&nbsp; * and {@code clientHandlers}, but does NOT start its thread — callers start
&nbsp; * the thread after any extra setup (e.g. sending a model snapshot).
&nbsp; */
&nbsp; private ClientHandler createAndRegisterHandler(String username,
&nbsp; Socket socket,
&nbsp; ObjectOutputStream out,
&nbsp; ObjectInputStream in) {
<b class="nc">&nbsp; ClientHandler handler = new ClientHandler(</b>
&nbsp; username, socket, out, in, clientHandlers, playerList, actionQueue);
<b class="nc">&nbsp; pendingHeartbeat.put(username, handler);</b>
<b class="nc">&nbsp; clientHandlers.add(handler);</b>
<b class="nc">&nbsp; return handler;</b>
&nbsp; }
&nbsp;
&nbsp; /** Returns usernames of players currently marked as disconnected in the given game. */
&nbsp; private static ArrayList&lt;String&gt; disconnectedUsernames(Game game) {
<b class="nc">&nbsp; return game.getDisconnectedPlayers().entrySet().stream()</b>
<b class="nc">&nbsp; .filter(Map.Entry::getValue)</b>
<b class="nc">&nbsp; .map(e -&gt; e.getKey().getUserName())</b>
<b class="nc">&nbsp; .collect(Collectors.toCollection(ArrayList::new));</b>
&nbsp; }
&nbsp;}
</code>
</pre>
</div>
<script type="text/javascript">
(function() {
var msie = false, msie9 = false;
/*@cc_on
msie = true;
@if (@_jscript_version >= 9)
msie9 = true;
@end
@*/
if (!msie || msie && msie9) {
hljs.highlightAll()
hljs.initLineNumbersOnLoad();
}
})();
</script>
<div class="footer">
<div style="float:right;">generated on 2026-06-14 21:53</div>
</div>
</body>
</html>
@@ -0,0 +1,342 @@
<!DOCTYPE html>
<html id="htmlId">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Coverage Report > it.polimi.ingsw.gc14.View.GUI</title>
<style type="text/css">
@import "../css/coverage.css";
@import "../css/idea.min.css";
</style>
<script type="text/javascript" src="../js/highlight.min.js"></script>
<script type="text/javascript" src="../js/highlightjs-line-numbers.min.js"></script>
</head>
<body>
<div class="content">
<div class="breadCrumbs">
Current scope: <a href="../index.html">all classes</a>
<span class="separator">|</span>
it.polimi.ingsw.gc14.View.GUI</div>
<h1>Coverage Summary for Package: it.polimi.ingsw.gc14.View.GUI</h1>
<table class="coverageStats">
<tr>
<th class="name">Package</th>
<th class="coverageStat
">
Class, %
</th>
<th class="coverageStat
">
Method, %
</th>
<th class="coverageStat
">
Branch, %
</th>
<th class="coverageStat
">
Line, %
</th>
</tr>
<tr>
<td class="name">it.polimi.ingsw.gc14.View.GUI</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/8)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/130)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/291)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1000)
</span>
</td>
</tr>
</table>
<br/>
<br/>
<table class="coverageStats">
<tr>
<th class="name sortedAsc
">
<a href="index_SORT_BY_NAME_DESC.html">Class</a> </th>
<th class="coverageStat
">
<a href="index_SORT_BY_CLASS.html">Class, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_METHOD.html">Method, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_BLOCK.html">Branch, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_LINE.html">Line, %</a>
</th>
</tr>
<tr>
<td class="name"><a href="sources/source-1.html">FireParticleSystem</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/3)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/15)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/73)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/123)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-2.html">GUI</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/16)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/22)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/116)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-3.html">LeaderboardFXMLController</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/19)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/34)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/182)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-4.html">LoginFXMLController</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/14)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/14)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/63)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-5.html">MainFXMLController</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/50)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/124)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/426)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-6.html">TotemFXMLController</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/16)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/24)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/90)
</span>
</td>
</tr>
</table>
</div>
<script type="text/javascript">
(function() {
var msie = false, msie9 = false;
/*@cc_on
msie = true;
@if (@_jscript_version >= 9)
msie9 = true;
@end
@*/
if (!msie || msie && msie9) {
hljs.highlightAll()
hljs.initLineNumbersOnLoad();
}
})();
</script>
<div class="footer">
<div style="float:right;">generated on 2026-06-14 21:53</div>
</div>
</body>
</html>
@@ -0,0 +1,342 @@
<!DOCTYPE html>
<html id="htmlId">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Coverage Report > it.polimi.ingsw.gc14.View.GUI</title>
<style type="text/css">
@import "../css/coverage.css";
@import "../css/idea.min.css";
</style>
<script type="text/javascript" src="../js/highlight.min.js"></script>
<script type="text/javascript" src="../js/highlightjs-line-numbers.min.js"></script>
</head>
<body>
<div class="content">
<div class="breadCrumbs">
Current scope: <a href="../index_SORT_BY_BLOCK.html">all classes</a>
<span class="separator">|</span>
it.polimi.ingsw.gc14.View.GUI</div>
<h1>Coverage Summary for Package: it.polimi.ingsw.gc14.View.GUI</h1>
<table class="coverageStats">
<tr>
<th class="name">Package</th>
<th class="coverageStat
">
Class, %
</th>
<th class="coverageStat
">
Method, %
</th>
<th class="coverageStat
">
Branch, %
</th>
<th class="coverageStat
">
Line, %
</th>
</tr>
<tr>
<td class="name">it.polimi.ingsw.gc14.View.GUI</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/8)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/130)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/291)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1000)
</span>
</td>
</tr>
</table>
<br/>
<br/>
<table class="coverageStats">
<tr>
<th class="name
">
<a href="index.html">Class</a> </th>
<th class="coverageStat
">
<a href="index_SORT_BY_CLASS.html">Class, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_METHOD.html">Method, %</a>
</th>
<th class="coverageStat sortedAsc
">
<a href="index_SORT_BY_BLOCK_DESC.html">Branch, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_LINE.html">Line, %</a>
</th>
</tr>
<tr>
<td class="name"><a href="sources/source-1.html">FireParticleSystem</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/3)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/15)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/73)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/123)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-2.html">GUI</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/16)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/22)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/116)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-3.html">LeaderboardFXMLController</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/19)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/34)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/182)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-4.html">LoginFXMLController</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/14)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/14)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/63)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-5.html">MainFXMLController</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/50)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/124)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/426)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-6.html">TotemFXMLController</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/16)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/24)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/90)
</span>
</td>
</tr>
</table>
</div>
<script type="text/javascript">
(function() {
var msie = false, msie9 = false;
/*@cc_on
msie = true;
@if (@_jscript_version >= 9)
msie9 = true;
@end
@*/
if (!msie || msie && msie9) {
hljs.highlightAll()
hljs.initLineNumbersOnLoad();
}
})();
</script>
<div class="footer">
<div style="float:right;">generated on 2026-06-14 21:53</div>
</div>
</body>
</html>
@@ -0,0 +1,342 @@
<!DOCTYPE html>
<html id="htmlId">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Coverage Report > it.polimi.ingsw.gc14.View.GUI</title>
<style type="text/css">
@import "../css/coverage.css";
@import "../css/idea.min.css";
</style>
<script type="text/javascript" src="../js/highlight.min.js"></script>
<script type="text/javascript" src="../js/highlightjs-line-numbers.min.js"></script>
</head>
<body>
<div class="content">
<div class="breadCrumbs">
Current scope: <a href="../index_SORT_BY_BLOCK_DESC.html">all classes</a>
<span class="separator">|</span>
it.polimi.ingsw.gc14.View.GUI</div>
<h1>Coverage Summary for Package: it.polimi.ingsw.gc14.View.GUI</h1>
<table class="coverageStats">
<tr>
<th class="name">Package</th>
<th class="coverageStat
">
Class, %
</th>
<th class="coverageStat
">
Method, %
</th>
<th class="coverageStat
">
Branch, %
</th>
<th class="coverageStat
">
Line, %
</th>
</tr>
<tr>
<td class="name">it.polimi.ingsw.gc14.View.GUI</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/8)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/130)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/291)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1000)
</span>
</td>
</tr>
</table>
<br/>
<br/>
<table class="coverageStats">
<tr>
<th class="name
">
<a href="index.html">Class</a> </th>
<th class="coverageStat
">
<a href="index_SORT_BY_CLASS.html">Class, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_METHOD.html">Method, %</a>
</th>
<th class="coverageStat sortedDesc
">
<a href="index_SORT_BY_BLOCK.html">Branch, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_LINE.html">Line, %</a>
</th>
</tr>
<tr>
<td class="name"><a href="sources/source-6.html">TotemFXMLController</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/16)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/24)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/90)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-5.html">MainFXMLController</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/50)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/124)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/426)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-4.html">LoginFXMLController</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/14)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/14)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/63)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-3.html">LeaderboardFXMLController</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/19)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/34)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/182)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-2.html">GUI</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/16)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/22)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/116)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-1.html">FireParticleSystem</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/3)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/15)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/73)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/123)
</span>
</td>
</tr>
</table>
</div>
<script type="text/javascript">
(function() {
var msie = false, msie9 = false;
/*@cc_on
msie = true;
@if (@_jscript_version >= 9)
msie9 = true;
@end
@*/
if (!msie || msie && msie9) {
hljs.highlightAll()
hljs.initLineNumbersOnLoad();
}
})();
</script>
<div class="footer">
<div style="float:right;">generated on 2026-06-14 21:53</div>
</div>
</body>
</html>
@@ -0,0 +1,342 @@
<!DOCTYPE html>
<html id="htmlId">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Coverage Report > it.polimi.ingsw.gc14.View.GUI</title>
<style type="text/css">
@import "../css/coverage.css";
@import "../css/idea.min.css";
</style>
<script type="text/javascript" src="../js/highlight.min.js"></script>
<script type="text/javascript" src="../js/highlightjs-line-numbers.min.js"></script>
</head>
<body>
<div class="content">
<div class="breadCrumbs">
Current scope: <a href="../index_SORT_BY_CLASS.html">all classes</a>
<span class="separator">|</span>
it.polimi.ingsw.gc14.View.GUI</div>
<h1>Coverage Summary for Package: it.polimi.ingsw.gc14.View.GUI</h1>
<table class="coverageStats">
<tr>
<th class="name">Package</th>
<th class="coverageStat
">
Class, %
</th>
<th class="coverageStat
">
Method, %
</th>
<th class="coverageStat
">
Branch, %
</th>
<th class="coverageStat
">
Line, %
</th>
</tr>
<tr>
<td class="name">it.polimi.ingsw.gc14.View.GUI</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/8)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/130)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/291)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1000)
</span>
</td>
</tr>
</table>
<br/>
<br/>
<table class="coverageStats">
<tr>
<th class="name
">
<a href="index.html">Class</a> </th>
<th class="coverageStat sortedAsc
">
<a href="index_SORT_BY_CLASS_DESC.html">Class, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_METHOD.html">Method, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_BLOCK.html">Branch, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_LINE.html">Line, %</a>
</th>
</tr>
<tr>
<td class="name"><a href="sources/source-1.html">FireParticleSystem</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/3)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/15)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/73)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/123)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-2.html">GUI</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/16)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/22)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/116)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-3.html">LeaderboardFXMLController</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/19)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/34)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/182)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-4.html">LoginFXMLController</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/14)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/14)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/63)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-5.html">MainFXMLController</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/50)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/124)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/426)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-6.html">TotemFXMLController</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/16)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/24)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/90)
</span>
</td>
</tr>
</table>
</div>
<script type="text/javascript">
(function() {
var msie = false, msie9 = false;
/*@cc_on
msie = true;
@if (@_jscript_version >= 9)
msie9 = true;
@end
@*/
if (!msie || msie && msie9) {
hljs.highlightAll()
hljs.initLineNumbersOnLoad();
}
})();
</script>
<div class="footer">
<div style="float:right;">generated on 2026-06-14 21:53</div>
</div>
</body>
</html>
@@ -0,0 +1,342 @@
<!DOCTYPE html>
<html id="htmlId">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Coverage Report > it.polimi.ingsw.gc14.View.GUI</title>
<style type="text/css">
@import "../css/coverage.css";
@import "../css/idea.min.css";
</style>
<script type="text/javascript" src="../js/highlight.min.js"></script>
<script type="text/javascript" src="../js/highlightjs-line-numbers.min.js"></script>
</head>
<body>
<div class="content">
<div class="breadCrumbs">
Current scope: <a href="../index_SORT_BY_CLASS_DESC.html">all classes</a>
<span class="separator">|</span>
it.polimi.ingsw.gc14.View.GUI</div>
<h1>Coverage Summary for Package: it.polimi.ingsw.gc14.View.GUI</h1>
<table class="coverageStats">
<tr>
<th class="name">Package</th>
<th class="coverageStat
">
Class, %
</th>
<th class="coverageStat
">
Method, %
</th>
<th class="coverageStat
">
Branch, %
</th>
<th class="coverageStat
">
Line, %
</th>
</tr>
<tr>
<td class="name">it.polimi.ingsw.gc14.View.GUI</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/8)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/130)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/291)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1000)
</span>
</td>
</tr>
</table>
<br/>
<br/>
<table class="coverageStats">
<tr>
<th class="name
">
<a href="index.html">Class</a> </th>
<th class="coverageStat sortedDesc
">
<a href="index_SORT_BY_CLASS.html">Class, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_METHOD.html">Method, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_BLOCK.html">Branch, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_LINE.html">Line, %</a>
</th>
</tr>
<tr>
<td class="name"><a href="sources/source-6.html">TotemFXMLController</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/16)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/24)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/90)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-5.html">MainFXMLController</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/50)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/124)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/426)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-4.html">LoginFXMLController</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/14)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/14)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/63)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-3.html">LeaderboardFXMLController</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/19)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/34)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/182)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-2.html">GUI</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/16)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/22)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/116)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-1.html">FireParticleSystem</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/3)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/15)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/73)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/123)
</span>
</td>
</tr>
</table>
</div>
<script type="text/javascript">
(function() {
var msie = false, msie9 = false;
/*@cc_on
msie = true;
@if (@_jscript_version >= 9)
msie9 = true;
@end
@*/
if (!msie || msie && msie9) {
hljs.highlightAll()
hljs.initLineNumbersOnLoad();
}
})();
</script>
<div class="footer">
<div style="float:right;">generated on 2026-06-14 21:53</div>
</div>
</body>
</html>
@@ -0,0 +1,342 @@
<!DOCTYPE html>
<html id="htmlId">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Coverage Report > it.polimi.ingsw.gc14.View.GUI</title>
<style type="text/css">
@import "../css/coverage.css";
@import "../css/idea.min.css";
</style>
<script type="text/javascript" src="../js/highlight.min.js"></script>
<script type="text/javascript" src="../js/highlightjs-line-numbers.min.js"></script>
</head>
<body>
<div class="content">
<div class="breadCrumbs">
Current scope: <a href="../index_SORT_BY_LINE.html">all classes</a>
<span class="separator">|</span>
it.polimi.ingsw.gc14.View.GUI</div>
<h1>Coverage Summary for Package: it.polimi.ingsw.gc14.View.GUI</h1>
<table class="coverageStats">
<tr>
<th class="name">Package</th>
<th class="coverageStat
">
Class, %
</th>
<th class="coverageStat
">
Method, %
</th>
<th class="coverageStat
">
Branch, %
</th>
<th class="coverageStat
">
Line, %
</th>
</tr>
<tr>
<td class="name">it.polimi.ingsw.gc14.View.GUI</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/8)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/130)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/291)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1000)
</span>
</td>
</tr>
</table>
<br/>
<br/>
<table class="coverageStats">
<tr>
<th class="name
">
<a href="index.html">Class</a> </th>
<th class="coverageStat
">
<a href="index_SORT_BY_CLASS.html">Class, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_METHOD.html">Method, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_BLOCK.html">Branch, %</a>
</th>
<th class="coverageStat sortedAsc
">
<a href="index_SORT_BY_LINE_DESC.html">Line, %</a>
</th>
</tr>
<tr>
<td class="name"><a href="sources/source-1.html">FireParticleSystem</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/3)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/15)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/73)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/123)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-2.html">GUI</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/16)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/22)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/116)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-3.html">LeaderboardFXMLController</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/19)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/34)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/182)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-4.html">LoginFXMLController</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/14)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/14)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/63)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-5.html">MainFXMLController</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/50)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/124)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/426)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-6.html">TotemFXMLController</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/16)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/24)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/90)
</span>
</td>
</tr>
</table>
</div>
<script type="text/javascript">
(function() {
var msie = false, msie9 = false;
/*@cc_on
msie = true;
@if (@_jscript_version >= 9)
msie9 = true;
@end
@*/
if (!msie || msie && msie9) {
hljs.highlightAll()
hljs.initLineNumbersOnLoad();
}
})();
</script>
<div class="footer">
<div style="float:right;">generated on 2026-06-14 21:53</div>
</div>
</body>
</html>
@@ -0,0 +1,342 @@
<!DOCTYPE html>
<html id="htmlId">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Coverage Report > it.polimi.ingsw.gc14.View.GUI</title>
<style type="text/css">
@import "../css/coverage.css";
@import "../css/idea.min.css";
</style>
<script type="text/javascript" src="../js/highlight.min.js"></script>
<script type="text/javascript" src="../js/highlightjs-line-numbers.min.js"></script>
</head>
<body>
<div class="content">
<div class="breadCrumbs">
Current scope: <a href="../index_SORT_BY_LINE_DESC.html">all classes</a>
<span class="separator">|</span>
it.polimi.ingsw.gc14.View.GUI</div>
<h1>Coverage Summary for Package: it.polimi.ingsw.gc14.View.GUI</h1>
<table class="coverageStats">
<tr>
<th class="name">Package</th>
<th class="coverageStat
">
Class, %
</th>
<th class="coverageStat
">
Method, %
</th>
<th class="coverageStat
">
Branch, %
</th>
<th class="coverageStat
">
Line, %
</th>
</tr>
<tr>
<td class="name">it.polimi.ingsw.gc14.View.GUI</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/8)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/130)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/291)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1000)
</span>
</td>
</tr>
</table>
<br/>
<br/>
<table class="coverageStats">
<tr>
<th class="name
">
<a href="index.html">Class</a> </th>
<th class="coverageStat
">
<a href="index_SORT_BY_CLASS.html">Class, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_METHOD.html">Method, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_BLOCK.html">Branch, %</a>
</th>
<th class="coverageStat sortedDesc
">
<a href="index_SORT_BY_LINE.html">Line, %</a>
</th>
</tr>
<tr>
<td class="name"><a href="sources/source-6.html">TotemFXMLController</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/16)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/24)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/90)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-5.html">MainFXMLController</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/50)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/124)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/426)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-4.html">LoginFXMLController</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/14)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/14)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/63)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-3.html">LeaderboardFXMLController</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/19)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/34)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/182)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-2.html">GUI</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/16)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/22)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/116)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-1.html">FireParticleSystem</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/3)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/15)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/73)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/123)
</span>
</td>
</tr>
</table>
</div>
<script type="text/javascript">
(function() {
var msie = false, msie9 = false;
/*@cc_on
msie = true;
@if (@_jscript_version >= 9)
msie9 = true;
@end
@*/
if (!msie || msie && msie9) {
hljs.highlightAll()
hljs.initLineNumbersOnLoad();
}
})();
</script>
<div class="footer">
<div style="float:right;">generated on 2026-06-14 21:53</div>
</div>
</body>
</html>
@@ -0,0 +1,342 @@
<!DOCTYPE html>
<html id="htmlId">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Coverage Report > it.polimi.ingsw.gc14.View.GUI</title>
<style type="text/css">
@import "../css/coverage.css";
@import "../css/idea.min.css";
</style>
<script type="text/javascript" src="../js/highlight.min.js"></script>
<script type="text/javascript" src="../js/highlightjs-line-numbers.min.js"></script>
</head>
<body>
<div class="content">
<div class="breadCrumbs">
Current scope: <a href="../index_SORT_BY_METHOD.html">all classes</a>
<span class="separator">|</span>
it.polimi.ingsw.gc14.View.GUI</div>
<h1>Coverage Summary for Package: it.polimi.ingsw.gc14.View.GUI</h1>
<table class="coverageStats">
<tr>
<th class="name">Package</th>
<th class="coverageStat
">
Class, %
</th>
<th class="coverageStat
">
Method, %
</th>
<th class="coverageStat
">
Branch, %
</th>
<th class="coverageStat
">
Line, %
</th>
</tr>
<tr>
<td class="name">it.polimi.ingsw.gc14.View.GUI</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/8)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/130)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/291)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1000)
</span>
</td>
</tr>
</table>
<br/>
<br/>
<table class="coverageStats">
<tr>
<th class="name
">
<a href="index.html">Class</a> </th>
<th class="coverageStat
">
<a href="index_SORT_BY_CLASS.html">Class, %</a>
</th>
<th class="coverageStat sortedAsc
">
<a href="index_SORT_BY_METHOD_DESC.html">Method, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_BLOCK.html">Branch, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_LINE.html">Line, %</a>
</th>
</tr>
<tr>
<td class="name"><a href="sources/source-1.html">FireParticleSystem</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/3)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/15)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/73)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/123)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-2.html">GUI</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/16)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/22)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/116)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-3.html">LeaderboardFXMLController</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/19)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/34)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/182)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-4.html">LoginFXMLController</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/14)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/14)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/63)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-5.html">MainFXMLController</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/50)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/124)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/426)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-6.html">TotemFXMLController</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/16)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/24)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/90)
</span>
</td>
</tr>
</table>
</div>
<script type="text/javascript">
(function() {
var msie = false, msie9 = false;
/*@cc_on
msie = true;
@if (@_jscript_version >= 9)
msie9 = true;
@end
@*/
if (!msie || msie && msie9) {
hljs.highlightAll()
hljs.initLineNumbersOnLoad();
}
})();
</script>
<div class="footer">
<div style="float:right;">generated on 2026-06-14 21:53</div>
</div>
</body>
</html>
@@ -0,0 +1,342 @@
<!DOCTYPE html>
<html id="htmlId">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Coverage Report > it.polimi.ingsw.gc14.View.GUI</title>
<style type="text/css">
@import "../css/coverage.css";
@import "../css/idea.min.css";
</style>
<script type="text/javascript" src="../js/highlight.min.js"></script>
<script type="text/javascript" src="../js/highlightjs-line-numbers.min.js"></script>
</head>
<body>
<div class="content">
<div class="breadCrumbs">
Current scope: <a href="../index_SORT_BY_METHOD_DESC.html">all classes</a>
<span class="separator">|</span>
it.polimi.ingsw.gc14.View.GUI</div>
<h1>Coverage Summary for Package: it.polimi.ingsw.gc14.View.GUI</h1>
<table class="coverageStats">
<tr>
<th class="name">Package</th>
<th class="coverageStat
">
Class, %
</th>
<th class="coverageStat
">
Method, %
</th>
<th class="coverageStat
">
Branch, %
</th>
<th class="coverageStat
">
Line, %
</th>
</tr>
<tr>
<td class="name">it.polimi.ingsw.gc14.View.GUI</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/8)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/130)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/291)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1000)
</span>
</td>
</tr>
</table>
<br/>
<br/>
<table class="coverageStats">
<tr>
<th class="name
">
<a href="index.html">Class</a> </th>
<th class="coverageStat
">
<a href="index_SORT_BY_CLASS.html">Class, %</a>
</th>
<th class="coverageStat sortedDesc
">
<a href="index_SORT_BY_METHOD.html">Method, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_BLOCK.html">Branch, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_LINE.html">Line, %</a>
</th>
</tr>
<tr>
<td class="name"><a href="sources/source-6.html">TotemFXMLController</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/16)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/24)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/90)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-5.html">MainFXMLController</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/50)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/124)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/426)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-4.html">LoginFXMLController</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/14)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/14)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/63)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-3.html">LeaderboardFXMLController</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/19)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/34)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/182)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-2.html">GUI</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/16)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/22)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/116)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-1.html">FireParticleSystem</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/3)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/15)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/73)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/123)
</span>
</td>
</tr>
</table>
</div>
<script type="text/javascript">
(function() {
var msie = false, msie9 = false;
/*@cc_on
msie = true;
@if (@_jscript_version >= 9)
msie9 = true;
@end
@*/
if (!msie || msie && msie9) {
hljs.highlightAll()
hljs.initLineNumbersOnLoad();
}
})();
</script>
<div class="footer">
<div style="float:right;">generated on 2026-06-14 21:53</div>
</div>
</body>
</html>
@@ -0,0 +1,342 @@
<!DOCTYPE html>
<html id="htmlId">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Coverage Report > it.polimi.ingsw.gc14.View.GUI</title>
<style type="text/css">
@import "../css/coverage.css";
@import "../css/idea.min.css";
</style>
<script type="text/javascript" src="../js/highlight.min.js"></script>
<script type="text/javascript" src="../js/highlightjs-line-numbers.min.js"></script>
</head>
<body>
<div class="content">
<div class="breadCrumbs">
Current scope: <a href="../index_SORT_BY_NAME_DESC.html">all classes</a>
<span class="separator">|</span>
it.polimi.ingsw.gc14.View.GUI</div>
<h1>Coverage Summary for Package: it.polimi.ingsw.gc14.View.GUI</h1>
<table class="coverageStats">
<tr>
<th class="name">Package</th>
<th class="coverageStat
">
Class, %
</th>
<th class="coverageStat
">
Method, %
</th>
<th class="coverageStat
">
Branch, %
</th>
<th class="coverageStat
">
Line, %
</th>
</tr>
<tr>
<td class="name">it.polimi.ingsw.gc14.View.GUI</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/8)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/130)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/291)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1000)
</span>
</td>
</tr>
</table>
<br/>
<br/>
<table class="coverageStats">
<tr>
<th class="name sortedDesc
">
<a href="index.html">Class</a> </th>
<th class="coverageStat
">
<a href="index_SORT_BY_CLASS.html">Class, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_METHOD.html">Method, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_BLOCK.html">Branch, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_LINE.html">Line, %</a>
</th>
</tr>
<tr>
<td class="name"><a href="sources/source-6.html">TotemFXMLController</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/16)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/24)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/90)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-5.html">MainFXMLController</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/50)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/124)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/426)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-4.html">LoginFXMLController</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/14)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/14)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/63)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-3.html">LeaderboardFXMLController</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/19)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/34)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/182)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-2.html">GUI</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/16)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/22)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/116)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-1.html">FireParticleSystem</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/3)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/15)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/73)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/123)
</span>
</td>
</tr>
</table>
</div>
<script type="text/javascript">
(function() {
var msie = false, msie9 = false;
/*@cc_on
msie = true;
@if (@_jscript_version >= 9)
msie9 = true;
@end
@*/
if (!msie || msie && msie9) {
hljs.highlightAll()
hljs.initLineNumbersOnLoad();
}
})();
</script>
<div class="footer">
<div style="float:right;">generated on 2026-06-14 21:53</div>
</div>
</body>
</html>
@@ -0,0 +1,413 @@
<!DOCTYPE html>
<html id="htmlId">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Coverage Report > FireParticleSystem</title>
<style type="text/css">
@import "../../css/coverage.css";
@import "../../css/idea.min.css";
</style>
<script type="text/javascript" src="../../js/highlight.min.js"></script>
<script type="text/javascript" src="../../js/highlightjs-line-numbers.min.js"></script>
</head>
<body>
<div class="content">
<div class="breadCrumbs">
Current scope: <a href="../../index.html">all classes</a>
<span class="separator">|</span>
<a href="../index.html">it.polimi.ingsw.gc14.View.GUI</a>
</div>
<h1>Coverage Summary for Class: FireParticleSystem (it.polimi.ingsw.gc14.View.GUI)</h1>
<table class="coverageStats">
<tr>
<th class="name">Class</th>
<th class="coverageStat
">
Method, %
</th>
<th class="coverageStat
">
Branch, %
</th>
<th class="coverageStat
">
Line, %
</th>
</tr>
<tr>
<td class="name">FireParticleSystem</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/6)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/31)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/50)
</span>
</td>
</tr>
<tr>
<td class="name">FireParticleSystem$1</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/2)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/2)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/4)
</span>
</td>
</tr>
<tr>
<td class="name">FireParticleSystem$Particle</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/7)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/40)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/69)
</span>
</td>
</tr>
<tr>
<td class="name"><strong>Total</strong></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/15)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/73)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/123)
</span>
</td>
</tr>
</table>
<br/>
<br/>
<pre>
<code class="sourceCode" id="sourceCode">&nbsp;package it.polimi.ingsw.gc14.View.GUI;
&nbsp;
&nbsp;import javafx.animation.AnimationTimer;
&nbsp;import javafx.scene.Scene;
&nbsp;import javafx.scene.layout.Pane;
&nbsp;import javafx.scene.paint.Color;
&nbsp;import javafx.scene.shape.Circle;
&nbsp;
&nbsp;import java.util.ArrayList;
&nbsp;import java.util.Iterator;
&nbsp;import java.util.List;
&nbsp;import java.util.Random;
&nbsp;
&nbsp;//TODO ALL JAVADOC
&nbsp;public class FireParticleSystem {
&nbsp;
&nbsp; private static final int MAX_PARTICLES = 30;
&nbsp; private static final long SPAWN_INTERVAL_NS = 100_000_000L;
&nbsp; private static final long FRAME_INTERVAL_NS = 1_000_000_000L / 30; // 30 fps cap
&nbsp; private static final int STEPS_PER_FRAME = 3; // physics steps per frame → 3× speed
&nbsp;
&nbsp; private final Pane pane;
&nbsp; private final Scene scene;
<b class="nc">&nbsp; private final List&lt;Particle&gt; particles = new ArrayList&lt;&gt;();</b>
<b class="nc">&nbsp; private final Random rnd = new Random();</b>
&nbsp; private AnimationTimer timer;
<b class="nc">&nbsp; private long lastSpawn = 0;</b>
<b class="nc">&nbsp; private long lastFrame = 0;</b>
<b class="nc">&nbsp; private boolean warmedUp = false;</b>
&nbsp;
<b class="nc">&nbsp; public FireParticleSystem(Scene scene) {</b>
<b class="nc">&nbsp; this.scene = scene;</b>
<b class="nc">&nbsp; pane = new Pane();</b>
<b class="nc">&nbsp; pane.setMouseTransparent(true);</b>
<b class="nc">&nbsp; pane.setPickOnBounds(false);</b>
&nbsp; }
&nbsp;
&nbsp; /** Returns the transparent overlay pane that holds all particle nodes. */
<b class="nc">&nbsp; public Pane getPane() { return pane; }</b>
&nbsp;
&nbsp; /** Starts the animation timer. */
&nbsp; public void start() {
<b class="nc">&nbsp; timer = new AnimationTimer() {</b>
&nbsp; @Override
&nbsp; public void handle(long now) {
<b class="nc">&nbsp; if (now - lastFrame &lt; FRAME_INTERVAL_NS) return;</b>
<b class="nc">&nbsp; lastFrame = now;</b>
<b class="nc">&nbsp; tick(now);</b>
&nbsp; }
&nbsp; };
<b class="nc">&nbsp; timer.start();</b>
&nbsp; }
&nbsp;
&nbsp; /** Stops the animation timer. */
&nbsp; public void stop() {
<b class="nc">&nbsp; if (timer != null) timer.stop();</b>
&nbsp; }
&nbsp;
&nbsp; private void tick(long now) {
<b class="nc">&nbsp; double w = scene.getWidth();</b>
<b class="nc">&nbsp; double h = scene.getHeight();</b>
<b class="nc">&nbsp; if (w == 0 || h == 0) return;</b>
&nbsp;
<b class="nc">&nbsp; if (!warmedUp) {</b>
<b class="nc">&nbsp; warmedUp = true;</b>
<b class="nc">&nbsp; for (int i = 0; i &lt; MAX_PARTICLES; i++) {</b>
<b class="nc">&nbsp; Particle p = spawnParticle(w, h);</b>
<b class="nc">&nbsp; int advance = rnd.nextInt(800) + 100;</b>
<b class="nc">&nbsp; for (int f = 0; f &lt; advance; f++) p.update();</b>
<b class="nc">&nbsp; if (!p.isDead(w, h)) {</b>
<b class="nc">&nbsp; p.addTo(pane);</b>
<b class="nc">&nbsp; p.updateVisual(w, h);</b>
<b class="nc">&nbsp; particles.add(p);</b>
&nbsp; }
&nbsp; }
&nbsp; }
&nbsp;
<b class="nc">&nbsp; if (now - lastSpawn &gt; SPAWN_INTERVAL_NS &amp;&amp; particles.size() &lt; MAX_PARTICLES) {</b>
<b class="nc">&nbsp; lastSpawn = now;</b>
<b class="nc">&nbsp; int count = rnd.nextInt(2) + 1;</b>
<b class="nc">&nbsp; for (int i = 0; i &lt; count &amp;&amp; particles.size() &lt; MAX_PARTICLES; i++) {</b>
<b class="nc">&nbsp; Particle p = spawnParticle(w, h);</b>
<b class="nc">&nbsp; p.addTo(pane);</b>
<b class="nc">&nbsp; particles.add(p);</b>
&nbsp; }
&nbsp; }
&nbsp;
<b class="nc">&nbsp; Iterator&lt;Particle&gt; it = particles.iterator();</b>
<b class="nc">&nbsp; while (it.hasNext()) {</b>
<b class="nc">&nbsp; Particle p = it.next();</b>
<b class="nc">&nbsp; for (int s = 0; s &lt; STEPS_PER_FRAME; s++) p.update();</b>
<b class="nc">&nbsp; if (p.isDead(w, h)) {</b>
<b class="nc">&nbsp; p.removeFrom(pane);</b>
<b class="nc">&nbsp; it.remove();</b>
&nbsp; } else {
<b class="nc">&nbsp; p.updateVisual(w, h);</b>
&nbsp; }
&nbsp; }
&nbsp; }
&nbsp;
&nbsp; private Particle spawnParticle(double w, double h) {
<b class="nc">&nbsp; int corner = rnd.nextInt(4);</b>
<b class="nc">&nbsp; double margin = 0.12;</b>
&nbsp; double x, y;
<b class="nc">&nbsp; switch (corner) {</b>
<b class="nc">&nbsp; case 0 -&gt; { x = rnd.nextDouble() * w * margin; y = h - rnd.nextDouble() * h * margin; }</b>
<b class="nc">&nbsp; case 1 -&gt; { x = w - rnd.nextDouble() * w * margin; y = h - rnd.nextDouble() * h * margin; }</b>
<b class="nc">&nbsp; case 2 -&gt; { x = rnd.nextDouble() * w * margin; y = rnd.nextDouble() * h * margin; }</b>
<b class="nc">&nbsp; default -&gt; { x = w - rnd.nextDouble() * w * margin; y = rnd.nextDouble() * h * margin; }</b>
&nbsp; }
<b class="nc">&nbsp; return new Particle(x, y, w, h, corner, rnd);</b>
&nbsp; }
&nbsp;
&nbsp; // ── Particle ──────────────────────────────────────────────────────────────
&nbsp;
&nbsp; private static class Particle {
&nbsp;
&nbsp; double x, y, vx, vy;
&nbsp; double life;
&nbsp; double size;
&nbsp; double wobblePhase, wobbleSpeed, wobbleAmp;
&nbsp; final int type;
&nbsp; final Random rnd;
&nbsp;
&nbsp; final Circle core;
&nbsp; final Circle glow; // non-null only for embers
&nbsp;
<b class="nc">&nbsp; Particle(double x, double y, double w, double h, int corner, Random rnd) {</b>
<b class="nc">&nbsp; this.x = x;</b>
<b class="nc">&nbsp; this.y = y;</b>
<b class="nc">&nbsp; this.life = 1.0;</b>
<b class="nc">&nbsp; this.rnd = rnd;</b>
<b class="nc">&nbsp; this.type = weightedType(rnd);</b>
&nbsp;
<b class="nc">&nbsp; double targetX = (corner == 0 || corner == 2) ? w * 0.75 : w * 0.25;</b>
<b class="nc">&nbsp; double targetY = (corner == 0 || corner == 1) ? h * 0.25 : h * 0.75;</b>
<b class="nc">&nbsp; double baseAngle = Math.atan2(targetY - y, targetX - x);</b>
<b class="nc">&nbsp; double angle = baseAngle + (rnd.nextDouble() - 0.5) * (Math.PI / 3.5);</b>
&nbsp;
&nbsp; double speed;
<b class="nc">&nbsp; if (type == 0) { // ember</b>
<b class="nc">&nbsp; speed = 0.5 + rnd.nextDouble() * 0.7;</b>
<b class="nc">&nbsp; size = rnd.nextDouble() * 3 + 2;</b>
<b class="nc">&nbsp; glow = new Circle(size * 2.2);</b>
<b class="nc">&nbsp; core = new Circle(size / 2);</b>
<b class="nc">&nbsp; } else if (type == 1) { // spark</b>
<b class="nc">&nbsp; speed = 1.5 + rnd.nextDouble() * 2.0;</b>
<b class="nc">&nbsp; size = rnd.nextDouble() * 1.5 + 0.5;</b>
<b class="nc">&nbsp; glow = null;</b>
<b class="nc">&nbsp; core = new Circle(size / 2);</b>
&nbsp; } else { // dust
<b class="nc">&nbsp; speed = 0.2 + rnd.nextDouble() * 0.35;</b>
<b class="nc">&nbsp; size = rnd.nextDouble() * 8 + 5;</b>
<b class="nc">&nbsp; glow = null;</b>
<b class="nc">&nbsp; core = new Circle(size);</b>
<b class="nc">&nbsp; core.setFill(Color.color(0.55, 0.38, 0.22));</b>
&nbsp; }
&nbsp;
<b class="nc">&nbsp; vx = Math.cos(angle) * speed;</b>
<b class="nc">&nbsp; vy = Math.sin(angle) * speed;</b>
<b class="nc">&nbsp; wobblePhase = rnd.nextDouble() * Math.PI * 2;</b>
<b class="nc">&nbsp; wobbleSpeed = 0.025 + rnd.nextDouble() * 0.04;</b>
<b class="nc">&nbsp; wobbleAmp = 0.1 + rnd.nextDouble() * 0.4;</b>
&nbsp; }
&nbsp;
&nbsp; private static int weightedType(Random rnd) {
<b class="nc">&nbsp; double r = rnd.nextDouble();</b>
<b class="nc">&nbsp; if (r &lt; 0.55) return 0;</b>
<b class="nc">&nbsp; if (r &lt; 0.78) return 1;</b>
<b class="nc">&nbsp; return 2;</b>
&nbsp; }
&nbsp;
&nbsp; void addTo(Pane pane) {
<b class="nc">&nbsp; if (glow != null) pane.getChildren().add(glow);</b>
<b class="nc">&nbsp; pane.getChildren().add(core);</b>
&nbsp; }
&nbsp;
&nbsp; void removeFrom(Pane pane) {
<b class="nc">&nbsp; pane.getChildren().remove(core);</b>
<b class="nc">&nbsp; if (glow != null) pane.getChildren().remove(glow);</b>
&nbsp; }
&nbsp;
&nbsp; void update() {
<b class="nc">&nbsp; wobblePhase += wobbleSpeed;</b>
<b class="nc">&nbsp; vx += Math.sin(wobblePhase) * wobbleAmp * 0.05;</b>
<b class="nc">&nbsp; vy += Math.cos(wobblePhase) * wobbleAmp * 0.02;</b>
<b class="nc">&nbsp; x += vx;</b>
<b class="nc">&nbsp; y += vy;</b>
<b class="nc">&nbsp; if (type == 1) life -= 0.008 + rnd.nextDouble() * 0.006;</b>
&nbsp; }
&nbsp;
&nbsp; boolean isDead(double w, double h) {
<b class="nc">&nbsp; double pad = size * 4;</b>
<b class="nc">&nbsp; return x &lt; -pad || x &gt; w + pad || y &lt; -pad || y &gt; h + pad</b>
&nbsp; || (type == 1 &amp;&amp; life &lt;= 0);
&nbsp; }
&nbsp;
&nbsp; void updateVisual(double w, double h) {
<b class="nc">&nbsp; double edge = Math.min(w, h) * 0.05;</b>
<b class="nc">&nbsp; double fadeX = Math.min(x / edge, Math.min((w - x) / edge, 1.0));</b>
<b class="nc">&nbsp; double fadeY = Math.min(y / edge, Math.min((h - y) / edge, 1.0));</b>
<b class="nc">&nbsp; double posAlpha = Math.max(0, Math.min(fadeX, fadeY));</b>
<b class="nc">&nbsp; double lifeAlpha = (type == 1) ? Math.min(life * 2.0, 1.0) : 1.0;</b>
<b class="nc">&nbsp; double alpha = posAlpha * lifeAlpha;</b>
&nbsp;
<b class="nc">&nbsp; core.setTranslateX(x);</b>
<b class="nc">&nbsp; core.setTranslateY(y);</b>
&nbsp;
<b class="nc">&nbsp; if (type == 0) {</b>
<b class="nc">&nbsp; double dist = Math.sqrt((x - w/2) * (x - w/2) + (y - h/2) * (y - h/2));</b>
<b class="nc">&nbsp; double hotness = Math.max(0, 1.0 - dist / (Math.sqrt(w * w + h * h) * 0.4));</b>
<b class="nc">&nbsp; double g = 0.3 + hotness * 0.5;</b>
<b class="nc">&nbsp; core.setFill(Color.color(1.0, g, 0.0));</b>
<b class="nc">&nbsp; core.setOpacity(alpha * 0.88);</b>
<b class="nc">&nbsp; glow.setTranslateX(x);</b>
<b class="nc">&nbsp; glow.setTranslateY(y);</b>
<b class="nc">&nbsp; glow.setFill(Color.color(1.0, g * 0.35, 0.0));</b>
<b class="nc">&nbsp; glow.setOpacity(alpha * 0.10);</b>
<b class="nc">&nbsp; } else if (type == 1) {</b>
<b class="nc">&nbsp; double brightness = Math.min(life * 2.5, 1.0);</b>
<b class="nc">&nbsp; core.setFill(Color.color(1.0, brightness * 0.85 + 0.15, brightness * 0.15));</b>
<b class="nc">&nbsp; core.setOpacity(alpha);</b>
&nbsp; } else {
<b class="nc">&nbsp; core.setOpacity(alpha * 0.20);</b>
&nbsp; }
&nbsp; }
&nbsp; }
&nbsp;}
</code>
</pre>
</div>
<script type="text/javascript">
(function() {
var msie = false, msie9 = false;
/*@cc_on
msie = true;
@if (@_jscript_version >= 9)
msie9 = true;
@end
@*/
if (!msie || msie && msie9) {
hljs.highlightAll()
hljs.initLineNumbersOnLoad();
}
})();
</script>
<div class="footer">
<div style="float:right;">generated on 2026-06-14 21:53</div>
</div>
</body>
</html>
@@ -0,0 +1,398 @@
<!DOCTYPE html>
<html id="htmlId">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Coverage Report > GUI</title>
<style type="text/css">
@import "../../css/coverage.css";
@import "../../css/idea.min.css";
</style>
<script type="text/javascript" src="../../js/highlight.min.js"></script>
<script type="text/javascript" src="../../js/highlightjs-line-numbers.min.js"></script>
</head>
<body>
<div class="content">
<div class="breadCrumbs">
Current scope: <a href="../../index.html">all classes</a>
<span class="separator">|</span>
<a href="../index.html">it.polimi.ingsw.gc14.View.GUI</a>
</div>
<h1>Coverage Summary for Class: GUI (it.polimi.ingsw.gc14.View.GUI)</h1>
<table class="coverageStats">
<tr>
<th class="name">Class</th>
<th class="coverageStat
">
Class, %
</th>
<th class="coverageStat
">
Method, %
</th>
<th class="coverageStat
">
Branch, %
</th>
<th class="coverageStat
">
Line, %
</th>
</tr>
<tr>
<td class="name">GUI</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/16)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/22)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/116)
</span>
</td>
</tr>
</table>
<br/>
<br/>
<pre>
<code class="sourceCode" id="sourceCode">&nbsp;package it.polimi.ingsw.gc14.View.GUI;
&nbsp;
&nbsp;import it.polimi.ingsw.gc14.Controller.ClientController;
&nbsp;import it.polimi.ingsw.gc14.ErrorType;
&nbsp;import it.polimi.ingsw.gc14.Model.MiniModel;
&nbsp;import it.polimi.ingsw.gc14.View.IView;
&nbsp;import javafx.animation.FadeTransition;
&nbsp;import javafx.application.Application;
&nbsp;import javafx.application.Platform;
&nbsp;import javafx.fxml.FXMLLoader;
&nbsp;import javafx.geometry.Rectangle2D;
&nbsp;import javafx.scene.Parent;
&nbsp;import javafx.scene.Scene;
&nbsp;import javafx.scene.input.KeyCode;
&nbsp;import javafx.scene.input.KeyEvent;
&nbsp;import javafx.scene.input.KeyCombination;
&nbsp;import javafx.scene.layout.StackPane;
&nbsp;import javafx.scene.media.Media;
&nbsp;import javafx.scene.media.MediaPlayer;
&nbsp;import javafx.scene.paint.Color;
&nbsp;import javafx.scene.shape.Rectangle;
&nbsp;import javafx.stage.Screen;
&nbsp;import javafx.stage.Stage;
&nbsp;import javafx.util.Duration;
&nbsp;
&nbsp;import static it.polimi.ingsw.gc14.Model.GamePackage.GameStages.ENDED;
&nbsp;import static it.polimi.ingsw.gc14.Model.GamePackage.GameStages.TOTEM_CHOICE;
&nbsp;
&nbsp;/**
&nbsp; * JavaFX-based GUI implementation of {@link it.polimi.ingsw.gc14.View.IView IView}.
&nbsp; *
&nbsp; * &lt;p&gt;Manages the primary stage and switches between the login, totem choice,
&nbsp; * main game, and leaderboard scenes based on the current game state.
&nbsp; */
<b class="nc">&nbsp;public class GUI extends Application implements IView {</b>
&nbsp; //TODO
&nbsp; private Stage primaryStage;
&nbsp; //TODO
&nbsp; private volatile MiniModel miniModel;
&nbsp; //TODO
&nbsp; private FXMLLoader loaderLogin;
&nbsp; //TODO
&nbsp; private Scene loginScene;
&nbsp; //TODO
&nbsp; private LoginFXMLController controllerLogin;
&nbsp; //TODO
&nbsp; private FXMLLoader loaderTotem;
&nbsp; //TODO
&nbsp; private Scene totemScene;
&nbsp; //TODO
&nbsp; private TotemFXMLController controllerTotem;
&nbsp; //TODO
&nbsp; private FXMLLoader loaderMain;
&nbsp;
&nbsp; //TODO
&nbsp; private Scene mainScene;
&nbsp; //TODO
&nbsp; private MainFXMLController controllerMain;
&nbsp; //TODO
&nbsp; private FXMLLoader loaderLeaderboard;
&nbsp; //TODO
&nbsp; private Scene leaderboardScene;
&nbsp; //TODO
&nbsp; private LeaderboardFXMLController controllerLeaderboard;
&nbsp;
&nbsp; //TODO
&nbsp; private ClientController controller;
&nbsp; //TODO
<b class="nc">&nbsp; private boolean autoReenterFullscreen = true;</b>
&nbsp; //TODO
<b class="nc">&nbsp; private boolean isFading = false;</b>
&nbsp; //TODO
&nbsp; private MediaPlayer bgMusic;
&nbsp;
&nbsp;
&nbsp; /**
&nbsp; * JavaFX entry point: loads all FXML scenes, wires up controllers,
&nbsp; * configures fullscreen behaviour, and shows the login scene.
&nbsp; *
&nbsp; * @param stage the primary stage provided by the JavaFX runtime.
&nbsp; * @throws Exception if any FXML resource cannot be loaded.
&nbsp; */
&nbsp; @Override
&nbsp; public void start(Stage stage) throws Exception {
<b class="nc">&nbsp; this.primaryStage = stage;</b>
<b class="nc">&nbsp; loaderLogin = new FXMLLoader(getClass().getResource(&quot;/GUIScene/login.fxml&quot;));</b>
<b class="nc">&nbsp; loginScene = new Scene(loaderLogin.load());</b>
<b class="nc">&nbsp; controllerLogin = loaderLogin.getController();</b>
<b class="nc">&nbsp; controllerLogin.setController(controller);</b>
&nbsp;
&nbsp;
<b class="nc">&nbsp; loaderTotem = new FXMLLoader(getClass().getResource(&quot;/GUIScene/totem.fxml&quot;));</b>
<b class="nc">&nbsp; totemScene = new Scene(loaderTotem.load());</b>
<b class="nc">&nbsp; controllerTotem = loaderTotem.getController();</b>
<b class="nc">&nbsp; controllerTotem.setController(controller);</b>
&nbsp;
&nbsp;
<b class="nc">&nbsp; loaderMain = new FXMLLoader(getClass().getResource(&quot;/GUIScene/main.fxml&quot;));</b>
<b class="nc">&nbsp; mainScene = new Scene(loaderMain.load());</b>
<b class="nc">&nbsp; controllerMain = loaderMain.getController();</b>
<b class="nc">&nbsp; controllerMain.setController(controller);</b>
&nbsp;
<b class="nc">&nbsp; loaderLeaderboard = new FXMLLoader(getClass().getResource(&quot;/GUIScene/standing.fxml&quot;));</b>
<b class="nc">&nbsp; leaderboardScene = new Scene(loaderLeaderboard.load());</b>
<b class="nc">&nbsp; controllerLeaderboard = loaderLeaderboard.getController();</b>
<b class="nc">&nbsp; controllerLeaderboard.setController(controller, () -&gt; {</b>
<b class="nc">&nbsp; controllerLogin.updateLoginButton(true);</b>
<b class="nc">&nbsp; controllerLogin.showError(&quot;&quot;);</b>
<b class="nc">&nbsp; fadeToScene(loginScene);</b>
&nbsp; }, loginScene);
&nbsp;
&nbsp;
&nbsp;
&nbsp;
&nbsp;
<b class="nc">&nbsp; wrapScene(loginScene);</b>
<b class="nc">&nbsp; wrapScene(totemScene);</b>
<b class="nc">&nbsp; wrapScene(mainScene);</b>
<b class="nc">&nbsp; wrapScene(leaderboardScene);</b>
&nbsp;
<b class="nc">&nbsp; FireParticleSystem fireParticles = new FireParticleSystem(mainScene);</b>
<b class="nc">&nbsp; ((StackPane) mainScene.getRoot()).getChildren().add(fireParticles.getPane());</b>
<b class="nc">&nbsp; fireParticles.start();</b>
&nbsp;
<b class="nc">&nbsp; primaryStage.setScene(loginScene);</b>
<b class="nc">&nbsp; Rectangle2D tmp = Screen.getPrimary().getVisualBounds();</b>
<b class="nc">&nbsp; primaryStage.setWidth(tmp.getWidth());</b>
<b class="nc">&nbsp; primaryStage.setHeight(tmp.getHeight());</b>
<b class="nc">&nbsp; primaryStage.setX(tmp.getMinX());</b>
<b class="nc">&nbsp; primaryStage.setY(tmp.getMinY());</b>
<b class="nc">&nbsp; primaryStage.setResizable(false);</b>
<b class="nc">&nbsp; primaryStage.setFullScreenExitHint(&quot;&quot;);</b>
<b class="nc">&nbsp; primaryStage.setFullScreenExitKeyCombination(KeyCombination.NO_MATCH);</b>
&nbsp;
<b class="nc">&nbsp; primaryStage.fullScreenProperty().addListener((obs, was, isNow) -&gt; {</b>
<b class="nc">&nbsp; if (!isNow &amp;&amp; autoReenterFullscreen) {</b>
<b class="nc">&nbsp; Platform.runLater(() -&gt; primaryStage.setFullScreen(true));</b>
&nbsp; }
&nbsp; });
&nbsp;
<b class="nc">&nbsp; primaryStage.addEventFilter(KeyEvent.KEY_PRESSED, e -&gt; {</b>
<b class="nc">&nbsp; if (e.getCode() == KeyCode.ESCAPE) {</b>
<b class="nc">&nbsp; autoReenterFullscreen = false;</b>
<b class="nc">&nbsp; primaryStage.setFullScreen(false);</b>
<b class="nc">&nbsp; e.consume();</b>
<b class="nc">&nbsp; } else if (e.getCode() == KeyCode.F11) {</b>
<b class="nc">&nbsp; autoReenterFullscreen = true;</b>
<b class="nc">&nbsp; primaryStage.setFullScreen(true);</b>
<b class="nc">&nbsp; e.consume();</b>
&nbsp; }
&nbsp; });
&nbsp;
<b class="nc">&nbsp; primaryStage.setTitle(&quot;Mesos&quot;);</b>
<b class="nc">&nbsp; primaryStage.setOnCloseRequest(e -&gt; {</b>
<b class="nc">&nbsp; Platform.exit();</b>
<b class="nc">&nbsp; System.exit(0);</b>
&nbsp; });
<b class="nc">&nbsp; primaryStage.show();</b>
<b class="nc">&nbsp; Platform.runLater(() -&gt; primaryStage.setFullScreen(true));</b>
&nbsp;
&nbsp; try {
<b class="nc">&nbsp; String musicUrl = getClass().getResource(&quot;/Audio/Music.mp3&quot;).toExternalForm();</b>
<b class="nc">&nbsp; bgMusic = new MediaPlayer(new Media(musicUrl));</b>
<b class="nc">&nbsp; bgMusic.setCycleCount(MediaPlayer.INDEFINITE);</b>
<b class="nc">&nbsp; bgMusic.setVolume(0.4);</b>
<b class="nc">&nbsp; bgMusic.play();</b>
&nbsp; } catch (Exception e) {
<b class="nc">&nbsp; System.err.println(&quot;Audio unavailable: &quot; + e.getMessage());</b>
&nbsp; }
&nbsp; }
&nbsp;
&nbsp;
&nbsp; /**
&nbsp; * Updates the local mini model reference used by the GUI.
&nbsp; *
&nbsp; * @param miniModel the latest mini model received from the server.
&nbsp; */
&nbsp; @Override
&nbsp; public void setModel(MiniModel miniModel) {
<b class="nc">&nbsp; this.miniModel = miniModel;</b>
&nbsp; }
&nbsp;
&nbsp; /**
&nbsp; * Injects the client controller into this GUI.
&nbsp; *
&nbsp; * @param controller the client controller to use.
&nbsp; */
&nbsp; public void setController(ClientController controller) {
<b class="nc">&nbsp; this.controller=controller;</b>
&nbsp; }
&nbsp;
&nbsp; /**
&nbsp; * Re-renders the GUI on the JavaFX application thread, switching to the
&nbsp; * appropriate scene based on the current game stage.
&nbsp; */
&nbsp; public void render() {
<b class="nc">&nbsp; Platform.runLater(() -&gt; {</b>
<b class="nc">&nbsp; if (miniModel == null) return;</b>
<b class="nc">&nbsp; if (controller.getMiniModel().currentState.getGameStage() == TOTEM_CHOICE) {</b>
<b class="nc">&nbsp; controllerTotem.render();</b>
<b class="nc">&nbsp; fadeToScene(totemScene);</b>
<b class="nc">&nbsp; } else if (controller.getMiniModel().currentState.getGameStage() == ENDED) {</b>
<b class="nc">&nbsp; controllerLeaderboard.render();</b>
<b class="nc">&nbsp; fadeToScene(leaderboardScene);</b>
&nbsp; } else {
<b class="nc">&nbsp; controllerMain.render();</b>
<b class="nc">&nbsp; fadeToScene(mainScene);</b>
&nbsp; }
&nbsp; });
&nbsp; }
&nbsp; //TODO
&nbsp; private void wrapScene(Scene scene) {
<b class="nc">&nbsp; Parent root = scene.getRoot();</b>
<b class="nc">&nbsp; scene.setRoot(new StackPane(root));</b>
&nbsp; }
&nbsp; //TODO
&nbsp; private void fadeToScene(Scene newScene) {
<b class="nc">&nbsp; Scene currentScene = primaryStage.getScene();</b>
<b class="nc">&nbsp; if (currentScene == newScene || isFading) return;</b>
<b class="nc">&nbsp; isFading = true;</b>
&nbsp;
<b class="nc">&nbsp; StackPane currentRoot = (StackPane) currentScene.getRoot();</b>
<b class="nc">&nbsp; Rectangle overlay = new Rectangle();</b>
<b class="nc">&nbsp; overlay.setFill(Color.BLACK);</b>
<b class="nc">&nbsp; overlay.setOpacity(0);</b>
<b class="nc">&nbsp; overlay.widthProperty().bind(currentRoot.widthProperty());</b>
<b class="nc">&nbsp; overlay.heightProperty().bind(currentRoot.heightProperty());</b>
<b class="nc">&nbsp; currentRoot.getChildren().add(overlay);</b>
&nbsp;
<b class="nc">&nbsp; FadeTransition fadeOut = new FadeTransition(Duration.millis(500), overlay);</b>
<b class="nc">&nbsp; fadeOut.setFromValue(0);</b>
<b class="nc">&nbsp; fadeOut.setToValue(1);</b>
<b class="nc">&nbsp; fadeOut.setOnFinished(e -&gt; {</b>
<b class="nc">&nbsp; currentRoot.getChildren().remove(overlay);</b>
&nbsp;
<b class="nc">&nbsp; StackPane newRoot = (StackPane) newScene.getRoot();</b>
<b class="nc">&nbsp; Rectangle newOverlay = new Rectangle();</b>
<b class="nc">&nbsp; newOverlay.setFill(Color.BLACK);</b>
<b class="nc">&nbsp; newOverlay.setOpacity(1);</b>
<b class="nc">&nbsp; newOverlay.widthProperty().bind(newRoot.widthProperty());</b>
<b class="nc">&nbsp; newOverlay.heightProperty().bind(newRoot.heightProperty());</b>
<b class="nc">&nbsp; newRoot.getChildren().add(newOverlay);</b>
&nbsp;
<b class="nc">&nbsp; primaryStage.setScene(newScene);</b>
&nbsp;
<b class="nc">&nbsp; FadeTransition fadeIn = new FadeTransition(Duration.millis(500), newOverlay);</b>
<b class="nc">&nbsp; fadeIn.setFromValue(1);</b>
<b class="nc">&nbsp; fadeIn.setToValue(0);</b>
<b class="nc">&nbsp; fadeIn.setOnFinished(ev -&gt; {</b>
<b class="nc">&nbsp; newRoot.getChildren().remove(newOverlay);</b>
<b class="nc">&nbsp; isFading = false;</b>
&nbsp; });
<b class="nc">&nbsp; fadeIn.play();</b>
&nbsp; });
<b class="nc">&nbsp; fadeOut.play();</b>
&nbsp; }
&nbsp;
&nbsp; /**
&nbsp; * Displays an error on the JavaFX application thread.
&nbsp; *
&nbsp; * &lt;p&gt;If the server crashed, returns to the login scene and re-enables the login button.
&nbsp; * Otherwise delegates to the active scene&#39;s error display.
&nbsp; *
&nbsp; * @param error the error type.
&nbsp; * @param message a human-readable description of the error.
&nbsp; */
&nbsp; @Override
&nbsp; public void showError(ErrorType error,String message) {
<b class="nc">&nbsp; Platform.runLater(() -&gt; {</b>
<b class="nc">&nbsp; if (error == ErrorType.SERVER_CRASHED) {</b>
<b class="nc">&nbsp; controllerLogin.updateLoginButton(true);</b>
<b class="nc">&nbsp; controllerLogin.showError(error);</b>
<b class="nc">&nbsp; fadeToScene(loginScene);</b>
&nbsp; } else {
<b class="nc">&nbsp; if (miniModel == null) return;</b>
<b class="nc">&nbsp; controllerMain.setError(true);</b>
<b class="nc">&nbsp; controllerMain.render();</b>
&nbsp; }
&nbsp; });
&nbsp; }
&nbsp;
&nbsp;}
</code>
</pre>
</div>
<script type="text/javascript">
(function() {
var msie = false, msie9 = false;
/*@cc_on
msie = true;
@if (@_jscript_version >= 9)
msie9 = true;
@end
@*/
if (!msie || msie && msie9) {
hljs.highlightAll()
hljs.initLineNumbersOnLoad();
}
})();
</script>
<div class="footer">
<div style="float:right;">generated on 2026-06-14 21:53</div>
</div>
</body>
</html>
@@ -0,0 +1,498 @@
<!DOCTYPE html>
<html id="htmlId">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Coverage Report > LeaderboardFXMLController</title>
<style type="text/css">
@import "../../css/coverage.css";
@import "../../css/idea.min.css";
</style>
<script type="text/javascript" src="../../js/highlight.min.js"></script>
<script type="text/javascript" src="../../js/highlightjs-line-numbers.min.js"></script>
</head>
<body>
<div class="content">
<div class="breadCrumbs">
Current scope: <a href="../../index.html">all classes</a>
<span class="separator">|</span>
<a href="../index.html">it.polimi.ingsw.gc14.View.GUI</a>
</div>
<h1>Coverage Summary for Class: LeaderboardFXMLController (it.polimi.ingsw.gc14.View.GUI)</h1>
<table class="coverageStats">
<tr>
<th class="name">Class</th>
<th class="coverageStat
">
Class, %
</th>
<th class="coverageStat
">
Method, %
</th>
<th class="coverageStat
">
Branch, %
</th>
<th class="coverageStat
">
Line, %
</th>
</tr>
<tr>
<td class="name">LeaderboardFXMLController</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/19)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/34)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/182)
</span>
</td>
</tr>
</table>
<br/>
<br/>
<pre>
<code class="sourceCode" id="sourceCode">&nbsp;package it.polimi.ingsw.gc14.View.GUI;
&nbsp;
&nbsp;import it.polimi.ingsw.gc14.Controller.ClientController;
&nbsp;import it.polimi.ingsw.gc14.Model.Player;
&nbsp;import javafx.animation.ScaleTransition;
&nbsp;import it.polimi.ingsw.gc14.Model.PlayableCard;
&nbsp;import javafx.event.Event;
&nbsp;import javafx.fxml.FXML;
&nbsp;import javafx.scene.Scene;
&nbsp;import javafx.scene.control.ScrollPane;
&nbsp;import javafx.stage.Popup;
&nbsp;import javafx.geometry.Insets;
&nbsp;import javafx.geometry.Pos;
&nbsp;import javafx.scene.Cursor;
&nbsp;import javafx.scene.Node;
&nbsp;import javafx.scene.control.Label;
&nbsp;import javafx.scene.effect.DropShadow;
&nbsp;import javafx.scene.image.Image;
&nbsp;import javafx.scene.image.ImageView;
&nbsp;import javafx.scene.input.MouseEvent;
&nbsp;import javafx.scene.layout.*;
&nbsp;import javafx.scene.paint.Color;
&nbsp;import javafx.scene.paint.LinearGradient;
&nbsp;import javafx.scene.paint.Stop;
&nbsp;import javafx.scene.paint.CycleMethod;
&nbsp;import javafx.scene.text.Font;
&nbsp;import javafx.stage.Stage;
&nbsp;import javafx.stage.Window;
&nbsp;import javafx.util.Duration;
&nbsp;
&nbsp;import java.util.*;
&nbsp;
&nbsp;/**
&nbsp; * FXML controller for the end-of-game leaderboard scene.
&nbsp; *
&nbsp; * &lt;p&gt;Displays the final player rankings and a winner/game-over banner.
&nbsp; */
<b class="nc">&nbsp;public class LeaderboardFXMLController {</b>
&nbsp;
&nbsp; @FXML private StackPane rootPane;
&nbsp; @FXML private VBox mainVBox;
&nbsp; @FXML private VBox rankingList;
&nbsp; // title label removed; outcome text is added dynamically in render()
&nbsp; //TODO
&nbsp; private ClientController controller;
&nbsp; //TODO
&nbsp; private Popup popup;
&nbsp; //TODO
&nbsp; private VBox popupContent;
&nbsp; //TODO
<b class="nc">&nbsp; private static final Map&lt;String, Image&gt; imageCache = new HashMap&lt;&gt;();</b>
&nbsp; //TODO
&nbsp; private Scene loginScene;
&nbsp;
&nbsp; //TODO
&nbsp; private Runnable action;
&nbsp;
&nbsp; /** Returns a cached {@link Image} for the given classpath {@code path}, loading it on first access. */
&nbsp; private Image loadImage(String path) {
<b class="nc">&nbsp; return imageCache.computeIfAbsent(path,</b>
<b class="nc">&nbsp; p -&gt; new Image(getClass().getResourceAsStream(p)));</b>
&nbsp; }
&nbsp;
&nbsp;
&nbsp; /**
&nbsp; * Injects the client controller, a post-game action, and the login scene reference.
&nbsp; *
&nbsp; * @param controller the client controller.
&nbsp; * @param action the action to run when the player returns to the login screen.
&nbsp; * @param loginScene the login scene to show on exit.
&nbsp; */
&nbsp; public void setController(ClientController controller, Runnable action, Scene loginScene) {
<b class="nc">&nbsp; this.controller = controller;</b>
<b class="nc">&nbsp; this.loginScene = loginScene;</b>
<b class="nc">&nbsp; this.action = action;</b>
&nbsp; }
&nbsp;
&nbsp;
&nbsp; /** Initializes the scene: loads fonts, sets up the background, and initializes the popup. */
&nbsp; @FXML
&nbsp; public void initialize() {
<b class="nc">&nbsp; Font.loadFont(getClass().getResourceAsStream(&quot;/Fonts/InknutAntiqua-Regular.ttf&quot;), 14);</b>
<b class="nc">&nbsp; mainVBox.sceneProperty().addListener((obs, oldScene, newScene) -&gt; {</b>
<b class="nc">&nbsp; if (newScene != null) newScene.getRoot().applyCss();</b>
&nbsp; });
<b class="nc">&nbsp; renderBackground();</b>
<b class="nc">&nbsp; initPopup();</b>
&nbsp; }
&nbsp;
&nbsp;
&nbsp; /** Populates the ranking list with the final player standings and shows the outcome banner. */
&nbsp; public void render() {
<b class="nc">&nbsp; rankingList.getChildren().clear();</b>
<b class="nc">&nbsp; if(!controller.getMiniModel().standingPlayers.isEmpty())</b>
&nbsp; {
<b class="nc">&nbsp; List&lt;Player&gt; sorted = controller.getMiniModel().standingPlayers;</b>
&nbsp;
<b class="nc">&nbsp; boolean iWon = sorted.get(0).getUserName().equals(controller.getMyUsername());</b>
&nbsp;
&nbsp; // Label grande Winner / Game Over
<b class="nc">&nbsp; Label outcomeLabel = new Label(iWon ? &quot;\uD83C\uDFC6 WINNER! \uD83C\uDFC6&quot; : &quot;GAME OVER&quot;);</b>
<b class="nc">&nbsp; outcomeLabel.setStyle(</b>
&nbsp; &quot;-fx-font-size: 64px;&quot; +
&nbsp; &quot;-fx-font-weight: bold;&quot; +
<b class="nc">&nbsp; &quot;-fx-text-fill: &quot; + (iWon ? &quot;#FFD700;&quot; : &quot;#FF4444;&quot;)</b>
&nbsp; );
<b class="nc">&nbsp; DropShadow glow = new DropShadow();</b>
<b class="nc">&nbsp; glow.setColor(iWon ? Color.rgb(255, 200, 0, 0.95) : Color.rgb(220, 0, 0, 0.95));</b>
<b class="nc">&nbsp; glow.setRadius(35);</b>
<b class="nc">&nbsp; glow.setSpread(0.35);</b>
<b class="nc">&nbsp; outcomeLabel.setEffect(glow);</b>
<b class="nc">&nbsp; rankingList.getChildren().add(outcomeLabel);</b>
&nbsp;
<b class="nc">&nbsp; Region sep = new Region();</b>
<b class="nc">&nbsp; sep.setPrefHeight(16);</b>
<b class="nc">&nbsp; rankingList.getChildren().add(sep);</b>
&nbsp;
<b class="nc">&nbsp; for (int i = 0; i &lt; sorted.size(); i++) {</b>
<b class="nc">&nbsp; rankingList.getChildren().add(createPlayerRow(i + 1, sorted.get(i)));</b>
&nbsp; }
&nbsp; }
&nbsp; }
&nbsp;
&nbsp;
&nbsp; // ==== EFFECTS ====
&nbsp; /** Scales {@code node} to 1.02× on hover and sets a hand cursor. */
&nbsp; private void addHoverZoom(Node node) {
<b class="nc">&nbsp; ScaleTransition scaleUp = new ScaleTransition(Duration.millis(150), node);</b>
<b class="nc">&nbsp; scaleUp.setToX(1.02);</b>
<b class="nc">&nbsp; scaleUp.setToY(1.02);</b>
<b class="nc">&nbsp; ScaleTransition scaleDown = new ScaleTransition(Duration.millis(150), node);</b>
<b class="nc">&nbsp; scaleDown.setToX(1.0);</b>
<b class="nc">&nbsp; scaleDown.setToY(1.0);</b>
<b class="nc">&nbsp; node.addEventHandler(MouseEvent.MOUSE_ENTERED, e -&gt; { scaleUp.play(); node.setCursor(Cursor.HAND); });</b>
<b class="nc">&nbsp; node.addEventHandler(MouseEvent.MOUSE_EXITED, e -&gt; { scaleDown.play(); node.setCursor(Cursor.DEFAULT); });</b>
&nbsp; }
&nbsp;
&nbsp; /** Applies a static drop-shadow to {@code node}. */
&nbsp; private void addShadow(Node node) {
<b class="nc">&nbsp; DropShadow shadow = new DropShadow();</b>
<b class="nc">&nbsp; shadow.setColor(Color.rgb(0, 0, 0, 0.6));</b>
<b class="nc">&nbsp; shadow.setRadius(12);</b>
<b class="nc">&nbsp; shadow.setOffsetX(3);</b>
<b class="nc">&nbsp; shadow.setOffsetY(3);</b>
<b class="nc">&nbsp; node.setEffect(shadow);</b>
&nbsp; }
&nbsp;
&nbsp;
&nbsp; // ==== ROW ====
&nbsp; /** Builds a styled leaderboard row showing rank, totem, username, stats, and prestige for {@code player}. */
&nbsp; private HBox createPlayerRow(int position, Player player) {
<b class="nc">&nbsp; HBox row = new HBox(20);</b>
<b class="nc">&nbsp; row.setAlignment(Pos.CENTER_LEFT);</b>
<b class="nc">&nbsp; row.setPadding(new Insets(14, 28, 14, 28));</b>
<b class="nc">&nbsp; row.setMaxWidth(Double.MAX_VALUE);</b>
&nbsp;
<b class="nc">&nbsp; LinearGradient gradient = new LinearGradient(</b>
&nbsp; 0, 0, 1, 0, true, CycleMethod.NO_CYCLE,
<b class="nc">&nbsp; new Stop(0.0, Color.rgb(0, 0, 0, 0.75)),</b>
<b class="nc">&nbsp; new Stop(0.5, Color.rgb(0, 0, 0, 0.60)),</b>
<b class="nc">&nbsp; new Stop(1.0, Color.rgb(0, 0, 0, 0.75))</b>
&nbsp; );
<b class="nc">&nbsp; row.setBackground(new Background(new BackgroundFill(</b>
&nbsp; gradient,
&nbsp; new CornerRadii(12),
&nbsp; Insets.EMPTY
&nbsp; )));
<b class="nc">&nbsp; addShadow(row);</b>
<b class="nc">&nbsp; addHoverZoom(row);</b>
&nbsp;
<b class="nc">&nbsp; Label posLabel = new Label(position + &quot;°&quot;);</b>
<b class="nc">&nbsp; posLabel.setMinWidth(55);</b>
<b class="nc">&nbsp; String medalColor = switch (position) {</b>
<b class="nc">&nbsp; case 1 -&gt; &quot;#FFD700&quot;; // oro</b>
<b class="nc">&nbsp; case 2 -&gt; &quot;#C0C0C0&quot;; // argento</b>
<b class="nc">&nbsp; case 3 -&gt; &quot;#CD7F32&quot;; // bronzo</b>
<b class="nc">&nbsp; default -&gt; &quot;#EEEEEE&quot;;</b>
<b class="nc">&nbsp; };</b>
<b class="nc">&nbsp; posLabel.setStyle(&quot;-fx-font-size: 28px; -fx-font-weight: bold; -fx-text-fill: &quot; + medalColor + &quot;;&quot;);</b>
&nbsp;
&nbsp;
<b class="nc">&nbsp; ImageView totem = new ImageView(loadImage(</b>
<b class="nc">&nbsp; &quot;/GUIImages/Totems/totem_&quot; + player.getTotem().toString().toLowerCase(Locale.ROOT) + &quot;.png&quot;));</b>
<b class="nc">&nbsp; totem.setFitHeight(55);</b>
<b class="nc">&nbsp; totem.setPreserveRatio(true);</b>
&nbsp;
<b class="nc">&nbsp; Label nameLabel = new Label(player.getUserName());</b>
<b class="nc">&nbsp; nameLabel.setStyle(</b>
&nbsp; &quot;-fx-font-size: 22px; -fx-font-weight: bold; -fx-text-fill: &quot; +
<b class="nc">&nbsp; (player.getUserName().equals(controller.getMyUsername()) ? &quot;#ff6b6b;&quot; : &quot;#FFFFFF;&quot;)</b>
&nbsp; );
<b class="nc">&nbsp; HBox.setHgrow(nameLabel, Priority.ALWAYS);</b>
&nbsp;
<b class="nc">&nbsp; HBox stats = createStatsBox(player);</b>
&nbsp;
<b class="nc">&nbsp; HBox ppBox = new HBox(6);</b>
<b class="nc">&nbsp; ppBox.setAlignment(Pos.CENTER);</b>
<b class="nc">&nbsp; ImageView ppIcon = new ImageView(loadImage(&quot;/GUIImages/Icons/PrestigePoint.png&quot;));</b>
<b class="nc">&nbsp; ppIcon.setFitHeight(45);</b>
<b class="nc">&nbsp; ppIcon.setPreserveRatio(true);</b>
<b class="nc">&nbsp; Label ppLabel = new Label(String.valueOf(player.getPrestigeValue()));</b>
<b class="nc">&nbsp; ppLabel.setStyle(&quot;-fx-font-size: 28px; -fx-font-weight: bold; -fx-text-fill: #FFD700;&quot;);</b>
<b class="nc">&nbsp; ppBox.getChildren().addAll(ppIcon, ppLabel);</b>
&nbsp;
<b class="nc">&nbsp; row.getChildren().addAll(posLabel, totem, nameLabel, stats, ppBox);</b>
<b class="nc">&nbsp; row.setOnMouseClicked(e -&gt; openPlayerPopup(player));</b>
<b class="nc">&nbsp; return row;</b>
&nbsp; }
&nbsp;
&nbsp; /** Creates a compact icon+count stats strip for all card types of {@code player}. */
&nbsp; private HBox createStatsBox(Player player) {
<b class="nc">&nbsp; HBox stats = new HBox(14);</b>
<b class="nc">&nbsp; stats.setAlignment(Pos.CENTER);</b>
&nbsp;
<b class="nc">&nbsp; stats.getChildren().add(createStatItem(&quot;/GUIImages/Icons/Food.png&quot;, String.valueOf(player.getFoodValue()), 26));</b>
<b class="nc">&nbsp; stats.getChildren().add(createStatItem(&quot;/GUIImages/Icons/Artist.png&quot;, String.valueOf(player.getArtists().size()), 26));</b>
<b class="nc">&nbsp; stats.getChildren().add(createStatItem(&quot;/GUIImages/Icons/Gatherer.png&quot;, String.valueOf(player.getGatherers().size()), 26));</b>
<b class="nc">&nbsp; stats.getChildren().add(createStatItem(&quot;/GUIImages/Icons/Inventor.png&quot;, String.valueOf(player.getInventors().size()), 26));</b>
<b class="nc">&nbsp; stats.getChildren().add(createStatItem(&quot;/GUIImages/Icons/Builder.png&quot;, String.valueOf(player.getBuilders().size()), 26));</b>
<b class="nc">&nbsp; stats.getChildren().add(createStatItem(&quot;/GUIImages/Icons/Shaman.png&quot;, String.valueOf(player.getShamans().size()), 26));</b>
<b class="nc">&nbsp; stats.getChildren().add(createStatItem(&quot;/GUIImages/Icons/Hunter.png&quot;, String.valueOf(player.getHunters().size()), 26));</b>
<b class="nc">&nbsp; stats.getChildren().add(createStatItem(&quot;/GUIImages/Icons/Building.png&quot;, String.valueOf(player.getBuildingCards().size()), 26));</b>
&nbsp;
<b class="nc">&nbsp; return stats;</b>
&nbsp; }
&nbsp;
&nbsp; /** Creates a single icon + label widget for one stat type. */
&nbsp; private HBox createStatItem(String iconPath, String value, double iconHeight) {
<b class="nc">&nbsp; HBox box = new HBox(4);</b>
<b class="nc">&nbsp; box.setAlignment(Pos.CENTER);</b>
<b class="nc">&nbsp; ImageView icon = new ImageView(loadImage(iconPath));</b>
<b class="nc">&nbsp; icon.setFitHeight(iconHeight);</b>
<b class="nc">&nbsp; icon.setPreserveRatio(true);</b>
<b class="nc">&nbsp; Label label = new Label(value);</b>
<b class="nc">&nbsp; label.setStyle(&quot;-fx-font-size: 16px; -fx-text-fill: #FFFFFF; -fx-font-weight: bold;&quot;);</b>
<b class="nc">&nbsp; DropShadow textShadow = new DropShadow();</b>
<b class="nc">&nbsp; textShadow.setColor(Color.rgb(0, 0, 0, 0.9));</b>
<b class="nc">&nbsp; textShadow.setRadius(4);</b>
<b class="nc">&nbsp; label.setEffect(textShadow);</b>
<b class="nc">&nbsp; box.getChildren().addAll(icon, label);</b>
<b class="nc">&nbsp; return box;</b>
&nbsp; }
&nbsp;
&nbsp;
&nbsp; // ==== POPUP ====
&nbsp; /** Creates and configures the auto-hiding player-detail popup. */
&nbsp; private void initPopup() {
<b class="nc">&nbsp; popupContent = new VBox(12);</b>
<b class="nc">&nbsp; popupContent.setAlignment(Pos.CENTER);</b>
<b class="nc">&nbsp; popupContent.setPadding(new Insets(16));</b>
<b class="nc">&nbsp; popupContent.setStyle(</b>
&nbsp; &quot;-fx-background-color: rgba(20,10,5,0.97);&quot; +
&nbsp; &quot;-fx-border-color: #8B4513;&quot; +
&nbsp; &quot;-fx-border-width: 3;&quot; +
&nbsp; &quot;-fx-border-radius: 14;&quot; +
&nbsp; &quot;-fx-background-radius: 14;&quot;
&nbsp; );
&nbsp;
<b class="nc">&nbsp; popup = new Popup();</b>
<b class="nc">&nbsp; popup.getContent().add(popupContent);</b>
<b class="nc">&nbsp; popup.setAutoHide(true);</b>
<b class="nc">&nbsp; popup.addEventHandler(Event.ANY, e -&gt; {</b>
<b class="nc">&nbsp; if (popup.getScene() != null) popup.getScene().setFill(Color.TRANSPARENT);</b>
&nbsp; });
&nbsp; }
&nbsp;
&nbsp; /** Opens the player-detail popup showing all cards held by {@code player}, grouped by type. */
&nbsp; private void openPlayerPopup(Player player) {
<b class="nc">&nbsp; popupContent.getChildren().clear();</b>
&nbsp;
<b class="nc">&nbsp; HBox header = new HBox(10);</b>
<b class="nc">&nbsp; header.setAlignment(Pos.CENTER);</b>
<b class="nc">&nbsp; ImageView totem = new ImageView(loadImage(</b>
<b class="nc">&nbsp; &quot;/GUIImages/Totems/totem_&quot; + player.getTotem().toString().toLowerCase(Locale.ROOT) + &quot;.png&quot;));</b>
<b class="nc">&nbsp; totem.setFitHeight(30);</b>
<b class="nc">&nbsp; totem.setPreserveRatio(true);</b>
<b class="nc">&nbsp; Label nameLabel = new Label(player.getUserName());</b>
<b class="nc">&nbsp; nameLabel.setStyle(&quot;-fx-font-size: 18px; -fx-font-weight: bold; -fx-text-fill: #FFD700;&quot;);</b>
<b class="nc">&nbsp; header.getChildren().addAll(totem, nameLabel);</b>
<b class="nc">&nbsp; popupContent.getChildren().add(header);</b>
&nbsp;
<b class="nc">&nbsp; String[][] types = {</b>
&nbsp; {&quot;Artist&quot;, &quot;artists&quot;},
&nbsp; {&quot;Gatherer&quot;, &quot;gatherers&quot;},
&nbsp; {&quot;Inventor&quot;, &quot;inventors&quot;},
&nbsp; {&quot;Builder&quot;, &quot;builders&quot;},
&nbsp; {&quot;Shaman&quot;, &quot;shamans&quot;},
&nbsp; {&quot;Hunter&quot;, &quot;hunters&quot;},
&nbsp; {&quot;Building&quot;, &quot;buildingCards&quot;}
&nbsp; };
&nbsp;
<b class="nc">&nbsp; VBox grid = new VBox(6);</b>
<b class="nc">&nbsp; grid.setAlignment(Pos.CENTER_LEFT);</b>
<b class="nc">&nbsp; boolean hasAnyCard = false;</b>
&nbsp;
<b class="nc">&nbsp; for (String[] type : types) {</b>
<b class="nc">&nbsp; String typeName = type[0];</b>
<b class="nc">&nbsp; String field = type[1];</b>
<b class="nc">&nbsp; ArrayList&lt;PlayableCard&gt; cards = getPlayerCards(player.getUserName(), field);</b>
<b class="nc">&nbsp; if (cards.isEmpty()) continue;</b>
<b class="nc">&nbsp; hasAnyCard = true;</b>
&nbsp;
<b class="nc">&nbsp; HBox row = new HBox(6);</b>
<b class="nc">&nbsp; row.setAlignment(Pos.CENTER_LEFT);</b>
&nbsp;
<b class="nc">&nbsp; ImageView typeIcon = new ImageView(loadImage(&quot;/GUIImages/Icons/&quot;+typeName+&quot;.png&quot;));</b>
<b class="nc">&nbsp; typeIcon.setFitHeight(22);</b>
<b class="nc">&nbsp; typeIcon.setPreserveRatio(true);</b>
<b class="nc">&nbsp; row.getChildren().add(typeIcon);</b>
&nbsp;
<b class="nc">&nbsp; for (PlayableCard card : cards) {</b>
<b class="nc">&nbsp; ImageView img = new ImageView(loadImage(&quot;/GUIImages/Fronts/card-&quot; + card.getIdIMG() + &quot;.png&quot;));</b>
<b class="nc">&nbsp; img.setFitHeight(230);</b>
<b class="nc">&nbsp; img.setPreserveRatio(true);</b>
<b class="nc">&nbsp; img.setCursor(Cursor.HAND);</b>
<b class="nc">&nbsp; row.getChildren().add(img);</b>
&nbsp; }
&nbsp;
<b class="nc">&nbsp; grid.getChildren().add(row);</b>
&nbsp; }
&nbsp;
<b class="nc">&nbsp; if (!hasAnyCard) {</b>
<b class="nc">&nbsp; Label empty = new Label(&quot;No cards&quot;);</b>
<b class="nc">&nbsp; empty.setStyle(&quot;-fx-font-size: 14px; -fx-text-fill: #888888;&quot;);</b>
<b class="nc">&nbsp; grid.getChildren().add(empty);</b>
&nbsp; }
&nbsp;
<b class="nc">&nbsp; ScrollPane scrollPane = new ScrollPane(grid);</b>
<b class="nc">&nbsp; scrollPane.setFitToWidth(true);</b>
<b class="nc">&nbsp; scrollPane.setHbarPolicy(ScrollPane.ScrollBarPolicy.NEVER);</b>
<b class="nc">&nbsp; scrollPane.setVbarPolicy(ScrollPane.ScrollBarPolicy.AS_NEEDED);</b>
<b class="nc">&nbsp; scrollPane.setStyle(&quot;-fx-background: transparent; -fx-background-color: transparent;&quot;);</b>
&nbsp;
<b class="nc">&nbsp; Window window = rootPane.getScene().getWindow();</b>
<b class="nc">&nbsp; scrollPane.setMaxHeight(window.getHeight() * 0.8); // cap scroll area to 80% of window height</b>
<b class="nc">&nbsp; popupContent.getChildren().add(scrollPane);</b>
<b class="nc">&nbsp; popup.show(window, 0, 0);</b>
<b class="nc">&nbsp; popup.getScene().setFill(Color.TRANSPARENT);</b>
<b class="nc">&nbsp; popup.setX(window.getX() + (window.getWidth() - popup.getWidth()) / 2);</b>
<b class="nc">&nbsp; popup.setY(window.getY() + (window.getHeight() - popup.getHeight()) / 2);</b>
&nbsp; }
&nbsp;
&nbsp; /** Returns a copy of the named card collection for {@code username}. */
&nbsp; private ArrayList&lt;PlayableCard&gt; getPlayerCards(String username, String type) {
<b class="nc">&nbsp; Player p = controller.getMiniModel().players.get(username);</b>
<b class="nc">&nbsp; return switch (type) {</b>
<b class="nc">&nbsp; case &quot;artists&quot; -&gt; new ArrayList&lt;&gt;(p.getArtists());</b>
<b class="nc">&nbsp; case &quot;gatherers&quot; -&gt; new ArrayList&lt;&gt;(p.getGatherers());</b>
<b class="nc">&nbsp; case &quot;inventors&quot; -&gt; new ArrayList&lt;&gt;(p.getInventors());</b>
<b class="nc">&nbsp; case &quot;builders&quot; -&gt; new ArrayList&lt;&gt;(p.getBuilders());</b>
<b class="nc">&nbsp; case &quot;shamans&quot; -&gt; new ArrayList&lt;&gt;(p.getShamans());</b>
<b class="nc">&nbsp; case &quot;hunters&quot; -&gt; new ArrayList&lt;&gt;(p.getHunters());</b>
<b class="nc">&nbsp; case &quot;buildingCards&quot; -&gt; new ArrayList&lt;&gt;(p.getBuildingCards());</b>
<b class="nc">&nbsp; default -&gt; new ArrayList&lt;&gt;();</b>
&nbsp; };
&nbsp; }
&nbsp;
&nbsp; // ==== BACKGROUND ====
&nbsp; /** Sets the full-cover background image on the root pane. */
&nbsp; private void renderBackground() {
<b class="nc">&nbsp; BackgroundSize size = new BackgroundSize(</b>
&nbsp; BackgroundSize.AUTO, BackgroundSize.AUTO,
&nbsp; false, false, true, true
&nbsp; );
<b class="nc">&nbsp; rootPane.setBackground(new Background(new BackgroundImage(</b>
<b class="nc">&nbsp; loadImage(&quot;/GUIImages/Background.png&quot;),</b>
&nbsp; BackgroundRepeat.NO_REPEAT,
&nbsp; BackgroundRepeat.NO_REPEAT,
&nbsp; BackgroundPosition.CENTER,
&nbsp; size
&nbsp; )));
&nbsp; }
&nbsp;
&nbsp;
&nbsp; // ==== ACTIONS ====
&nbsp; /** Disconnects the client and invokes the post-game action to return to the login scene. */
&nbsp; @FXML
&nbsp; private void onNewGame() {
<b class="nc">&nbsp; controller.disconnect();</b>
<b class="nc">&nbsp; action.run();</b>
&nbsp; }
&nbsp;}
</code>
</pre>
</div>
<script type="text/javascript">
(function() {
var msie = false, msie9 = false;
/*@cc_on
msie = true;
@if (@_jscript_version >= 9)
msie9 = true;
@end
@*/
if (!msie || msie && msie9) {
hljs.highlightAll()
hljs.initLineNumbersOnLoad();
}
})();
</script>
<div class="footer">
<div style="float:right;">generated on 2026-06-14 21:53</div>
</div>
</body>
</html>
@@ -0,0 +1,329 @@
<!DOCTYPE html>
<html id="htmlId">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Coverage Report > LoginFXMLController</title>
<style type="text/css">
@import "../../css/coverage.css";
@import "../../css/idea.min.css";
</style>
<script type="text/javascript" src="../../js/highlight.min.js"></script>
<script type="text/javascript" src="../../js/highlightjs-line-numbers.min.js"></script>
</head>
<body>
<div class="content">
<div class="breadCrumbs">
Current scope: <a href="../../index.html">all classes</a>
<span class="separator">|</span>
<a href="../index.html">it.polimi.ingsw.gc14.View.GUI</a>
</div>
<h1>Coverage Summary for Class: LoginFXMLController (it.polimi.ingsw.gc14.View.GUI)</h1>
<table class="coverageStats">
<tr>
<th class="name">Class</th>
<th class="coverageStat
">
Class, %
</th>
<th class="coverageStat
">
Method, %
</th>
<th class="coverageStat
">
Branch, %
</th>
<th class="coverageStat
">
Line, %
</th>
</tr>
<tr>
<td class="name">LoginFXMLController</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/14)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/14)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/63)
</span>
</td>
</tr>
</table>
<br/>
<br/>
<pre>
<code class="sourceCode" id="sourceCode">&nbsp;package it.polimi.ingsw.gc14.View.GUI;
&nbsp;
&nbsp;import it.polimi.ingsw.gc14.Controller.ClientController;
&nbsp;import it.polimi.ingsw.gc14.ErrorType;
&nbsp;import it.polimi.ingsw.gc14.Network.NetworkConfig;
&nbsp;import it.polimi.ingsw.gc14.Network.InterfaceResolver;
&nbsp;import it.polimi.ingsw.gc14.Network.RMI.Client.RMIClient;
&nbsp;import it.polimi.ingsw.gc14.Network.TCP.Client.TCPClient;
&nbsp;import javafx.animation.*;
&nbsp;import javafx.application.Platform;
&nbsp;import javafx.css.PseudoClass;
&nbsp;import javafx.fxml.FXML;
&nbsp;import javafx.geometry.Rectangle2D;
&nbsp;import javafx.scene.control.*;
&nbsp;import javafx.scene.image.Image;
&nbsp;import javafx.scene.image.ImageView;
&nbsp;import javafx.scene.layout.*;
&nbsp;import javafx.scene.paint.Color;
&nbsp;import javafx.stage.Screen;
&nbsp;import javafx.util.Duration;
&nbsp;
&nbsp;import java.net.*;
&nbsp;import java.util.Enumeration;
&nbsp;
&nbsp;/**
&nbsp; * FXML controller for the login scene.
&nbsp; *
&nbsp; * &lt;p&gt;Handles username/IP/player-count input, protocol selection (TCP/RMI),
&nbsp; * and initiates the connection to the server.
&nbsp; */
<b class="nc">&nbsp;public class LoginFXMLController {</b>
&nbsp; //TODO
&nbsp; @FXML private ImageView backgroundImage;
&nbsp; //TODO
&nbsp; @FXML private TextField campoNome;
&nbsp; //TODO
&nbsp; @FXML private TextField campoNumPlayers;
&nbsp; //TODO
&nbsp; @FXML private TextField campoIP;
&nbsp; //TODO
&nbsp; @FXML private Button btnAccedi;
&nbsp; //TODO
&nbsp; @FXML private Label labelErrore;
&nbsp; //TODO
&nbsp; @FXML private VBox formPanel;
&nbsp; //TODO
&nbsp; @FXML private StackPane protocolToggle;
&nbsp; //TODO
&nbsp; @FXML private Region toggleThumb;
&nbsp; //TODO
&nbsp; @FXML private Label labelRMI;
&nbsp; //TODO
&nbsp; @FXML private Label labelTCP;
&nbsp; //TODO
<b class="nc">&nbsp; private boolean isRMI = true;</b>
&nbsp; //TODO
&nbsp; private ClientController controller;
&nbsp; //TODO
<b class="nc">&nbsp; private final PseudoClass activeProtocolPseudo = PseudoClass.getPseudoClass(&quot;active-protocol&quot;);</b>
&nbsp;
&nbsp; /**
&nbsp; * Injects the client controller into this FXML controller.
&nbsp; *
&nbsp; * @param controller the client controller to use.
&nbsp; */
&nbsp; public void setController(ClientController controller) {
<b class="nc">&nbsp; this.controller = controller;</b>
&nbsp; }
&nbsp;
&nbsp; /** Initializes the scene: loads background, sets up animations, and binds input listeners. */
&nbsp; @FXML
&nbsp; public void initialize() {
&nbsp; // Background setup
<b class="nc">&nbsp; Image img = new Image(getClass().getResourceAsStream(&quot;/GUIImages/BackgroundLogin.png&quot;));</b>
<b class="nc">&nbsp; backgroundImage.setImage(img);</b>
<b class="nc">&nbsp; Rectangle2D screenBounds = Screen.getPrimary().getBounds();</b>
<b class="nc">&nbsp; backgroundImage.setFitWidth(screenBounds.getWidth());</b>
<b class="nc">&nbsp; backgroundImage.setFitHeight(screenBounds.getHeight());</b>
&nbsp;
&nbsp; // Protocol toggle configuration
<b class="nc">&nbsp; protocolToggle.setOnMouseClicked(e -&gt; switchProtocol());</b>
<b class="nc">&nbsp; protocolToggle.setStyle(protocolToggle.getStyle() + &quot; -fx-cursor: hand;&quot;);</b>
&nbsp;
<b class="nc">&nbsp; labelRMI.pseudoClassStateChanged(activeProtocolPseudo, true);</b>
<b class="nc">&nbsp; labelTCP.pseudoClassStateChanged(activeProtocolPseudo, false);</b>
&nbsp;
&nbsp; // Login Action
<b class="nc">&nbsp; btnAccedi.setOnAction(e -&gt; onAccediClick());</b>
&nbsp; }
&nbsp;
&nbsp; /** Toggles the selected protocol between RMI and TCP, animating the toggle thumb and updating label styles. */
&nbsp; private void switchProtocol() {
<b class="nc">&nbsp; isRMI = !isRMI;</b>
&nbsp;
<b class="nc">&nbsp; TranslateTransition tt = new TranslateTransition(Duration.millis(200), toggleThumb);</b>
<b class="nc">&nbsp; tt.setToX(isRMI ? 0 : 110);</b>
<b class="nc">&nbsp; tt.play();</b>
&nbsp;
&nbsp; // pseudoClassStateChanged preserves layout properties unlike direct style mutation
<b class="nc">&nbsp; labelRMI.pseudoClassStateChanged(activeProtocolPseudo, isRMI);</b>
<b class="nc">&nbsp; labelTCP.pseudoClassStateChanged(activeProtocolPseudo, !isRMI);</b>
&nbsp; }
&nbsp;
&nbsp; /** Validates form input and starts a background thread to connect to the server. */
&nbsp; @FXML
&nbsp; private void onAccediClick() {
<b class="nc">&nbsp; String name = campoNome.getText().trim();</b>
<b class="nc">&nbsp; String ip = campoIP.getText().trim();</b>
&nbsp;
<b class="nc">&nbsp; if (name.isEmpty()) {</b>
<b class="nc">&nbsp; showError(&quot;Please select a name.&quot;);</b>
&nbsp; return;
&nbsp; }
&nbsp;
&nbsp; int numPlayers;
&nbsp; try {
<b class="nc">&nbsp; numPlayers = Integer.parseInt(campoNumPlayers.getText().trim());</b>
&nbsp; } catch (NumberFormatException e) {
<b class="nc">&nbsp; showError(&quot;Invalid number of players.&quot;);</b>
&nbsp; return;
&nbsp; }
&nbsp;
<b class="nc">&nbsp; updateLoginButton(false);</b>
<b class="nc">&nbsp; controller.setMyUsername(name);</b>
&nbsp;
<b class="nc">&nbsp; new Thread(() -&gt; {</b>
&nbsp; try {
<b class="nc">&nbsp; String localInterface = InterfaceResolver.resolveLocalInterface(ip);</b>
<b class="nc">&nbsp; System.setProperty(&quot;java.rmi.server.hostname&quot;, localInterface);</b>
<b class="nc">&nbsp; connect(name, ip, numPlayers, localInterface);</b>
&nbsp; } catch (Exception ex) {
<b class="nc">&nbsp; Platform.runLater(() -&gt; {</b>
<b class="nc">&nbsp; showError(&quot;Network error: &quot; + ex.getMessage());</b>
<b class="nc">&nbsp; updateLoginButton(true);</b>
&nbsp; });
&nbsp; }
<b class="nc">&nbsp; }).start();</b>
&nbsp; }
&nbsp;
&nbsp; /**
&nbsp; * Enables or disables the login button and updates its visual style.
&nbsp; *
&nbsp; * @param enabled {@code true} to enable the button, {@code false} to disable it.
&nbsp; */
&nbsp; public void updateLoginButton(boolean enabled) {
<b class="nc">&nbsp; btnAccedi.setDisable(!enabled);</b>
<b class="nc">&nbsp; btnAccedi.setStyle(</b>
&nbsp; &quot;-fx-font-family: &#39;Cinzel&#39;; -fx-font-size: 12; -fx-font-weight: bold;&quot; +
&nbsp; &quot;-fx-letter-spacing: 4; -fx-text-fill: #0c0601;&quot; +
&nbsp; &quot;-fx-background-color: linear-gradient(to right, #f4c05a, #c8791a, #f4c05a);&quot; +
&nbsp; &quot;-fx-padding: 13 48 13 48; -fx-background-radius: 2;&quot; +
<b class="nc">&nbsp; &quot;-fx-opacity: &quot; + (enabled ? &quot;1.0&quot; : &quot;0.3&quot;) + &quot;;&quot; +</b>
<b class="nc">&nbsp; &quot;-fx-cursor: &quot; + (enabled ? &quot;hand&quot; : &quot;default&quot;) + &quot;;&quot;</b>
&nbsp; );
&nbsp; }
&nbsp;
&nbsp;
&nbsp;
&nbsp;
&nbsp; /** Connects to the server using the selected protocol and transitions to the waiting state on success. */
&nbsp; private void connect(String nome, String ip, int numPlayers, String localInterface) {
<b class="nc">&nbsp; if (isRMI) {</b>
<b class="nc">&nbsp; RMIClient client = new RMIClient(controller, ip, NetworkConfig.RMI_PORT, localInterface);</b>
<b class="nc">&nbsp; ErrorType serverResponse = client.connect(nome, numPlayers);</b>
<b class="nc">&nbsp; if (serverResponse == null) {</b>
<b class="nc">&nbsp; controller.setClient(client);</b>
<b class="nc">&nbsp; Platform.runLater(() -&gt; showSuccess(&quot;Connected! Waiting for other players…&quot;));</b>
&nbsp; } else {
<b class="nc">&nbsp; Platform.runLater(() -&gt; {</b>
<b class="nc">&nbsp; showError(serverResponse);</b>
<b class="nc">&nbsp; updateLoginButton(true);</b>
&nbsp; });
&nbsp; }
&nbsp; } else {
<b class="nc">&nbsp; TCPClient client = new TCPClient(controller, ip, NetworkConfig.TCP_PORT, NetworkConfig.HEARTBEAT_PORT);</b>
<b class="nc">&nbsp; ErrorType serverResponse = client.connect(nome, numPlayers);</b>
<b class="nc">&nbsp; if (serverResponse == null) {</b>
<b class="nc">&nbsp; controller.setClient(client);</b>
<b class="nc">&nbsp; Platform.runLater(() -&gt; showSuccess(&quot;Connected! Waiting for other players…&quot;));</b>
&nbsp; } else {
<b class="nc">&nbsp; Platform.runLater(() -&gt; {</b>
<b class="nc">&nbsp; showError(serverResponse);</b>
<b class="nc">&nbsp; updateLoginButton(true);</b>
&nbsp; });
&nbsp; }
&nbsp; }
&nbsp; }
&nbsp; /**
&nbsp; * Displays an error from an {@link ErrorType} constant in the login form label.
&nbsp; *
&nbsp; * @param errorType the error to display.
&nbsp; */
&nbsp; public void showError(ErrorType errorType) {
<b class="nc">&nbsp; labelErrore.setTextFill(Color.web(&quot;#e05050&quot;));</b>
<b class="nc">&nbsp; labelErrore.setText(errorType.toString());</b>
&nbsp; }
&nbsp;
&nbsp; /**
&nbsp; * Displays an arbitrary error message in the login form label.
&nbsp; *
&nbsp; * @param msg the error message to display.
&nbsp; */
&nbsp; public void showError(String msg) {
<b class="nc">&nbsp; labelErrore.setTextFill(Color.web(&quot;#e05050&quot;));</b>
<b class="nc">&nbsp; labelErrore.setText(msg);</b>
&nbsp; }
&nbsp;
&nbsp; /** Displays a success message in green in the login form label. */
&nbsp; private void showSuccess(String msg) {
<b class="nc">&nbsp; labelErrore.setTextFill(Color.web(&quot;#6fcf8a&quot;));</b>
<b class="nc">&nbsp; labelErrore.setText(msg);</b>
&nbsp; }
&nbsp;}
</code>
</pre>
</div>
<script type="text/javascript">
(function() {
var msie = false, msie9 = false;
/*@cc_on
msie = true;
@if (@_jscript_version >= 9)
msie9 = true;
@end
@*/
if (!msie || msie && msie9) {
hljs.highlightAll()
hljs.initLineNumbersOnLoad();
}
})();
</script>
<div class="footer">
<div style="float:right;">generated on 2026-06-14 21:53</div>
</div>
</body>
</html>
@@ -0,0 +1,902 @@
<!DOCTYPE html>
<html id="htmlId">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Coverage Report > MainFXMLController</title>
<style type="text/css">
@import "../../css/coverage.css";
@import "../../css/idea.min.css";
</style>
<script type="text/javascript" src="../../js/highlight.min.js"></script>
<script type="text/javascript" src="../../js/highlightjs-line-numbers.min.js"></script>
</head>
<body>
<div class="content">
<div class="breadCrumbs">
Current scope: <a href="../../index.html">all classes</a>
<span class="separator">|</span>
<a href="../index.html">it.polimi.ingsw.gc14.View.GUI</a>
</div>
<h1>Coverage Summary for Class: MainFXMLController (it.polimi.ingsw.gc14.View.GUI)</h1>
<table class="coverageStats">
<tr>
<th class="name">Class</th>
<th class="coverageStat
">
Class, %
</th>
<th class="coverageStat
">
Method, %
</th>
<th class="coverageStat
">
Branch, %
</th>
<th class="coverageStat
">
Line, %
</th>
</tr>
<tr>
<td class="name">MainFXMLController</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/50)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/124)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/426)
</span>
</td>
</tr>
</table>
<br/>
<br/>
<pre>
<code class="sourceCode" id="sourceCode">&nbsp;package it.polimi.ingsw.gc14.View.GUI;
&nbsp;
&nbsp;import it.polimi.ingsw.gc14.Controller.ClientController;
&nbsp;import it.polimi.ingsw.gc14.Model.*;
&nbsp;import it.polimi.ingsw.gc14.Model.Cards.BuildingCard;
&nbsp;import it.polimi.ingsw.gc14.Model.Cards.TribeCard;
&nbsp;import it.polimi.ingsw.gc14.Model.Orders.OrderPlayer;
&nbsp;import it.polimi.ingsw.gc14.Network.EventType;
&nbsp;import it.polimi.ingsw.gc14.Network.NetworkEvent;
&nbsp;import javafx.animation.ScaleTransition;
&nbsp;import javafx.animation.TranslateTransition;
&nbsp;import javafx.application.Platform;
&nbsp;import javafx.beans.value.ChangeListener;
&nbsp;import javafx.beans.value.ObservableValue;
&nbsp;import javafx.event.Event;
&nbsp;import javafx.fxml.FXML;
&nbsp;import javafx.geometry.Bounds;
&nbsp;import javafx.geometry.Insets;
&nbsp;import javafx.geometry.Pos;
&nbsp;import javafx.geometry.Rectangle2D;
&nbsp;import javafx.scene.Cursor;
&nbsp;import javafx.scene.Node;
&nbsp;import javafx.scene.Scene;
&nbsp;import javafx.scene.control.Button;
&nbsp;import javafx.scene.control.Label;
&nbsp;import javafx.scene.control.ScrollPane;
&nbsp;import javafx.scene.effect.ColorAdjust;
&nbsp;import javafx.scene.effect.DropShadow;
&nbsp;import javafx.scene.image.*;
&nbsp;import javafx.scene.input.MouseEvent;
&nbsp;import javafx.scene.layout.*;
&nbsp;import javafx.scene.paint.Color;
&nbsp;import javafx.scene.shape.*;
&nbsp;import javafx.scene.text.Font;
&nbsp;import javafx.stage.Popup;
&nbsp;import javafx.stage.Screen;
&nbsp;import javafx.stage.Window;
&nbsp;import javafx.util.Duration;
&nbsp;
&nbsp;import java.util.*;
&nbsp;
&nbsp;/**
&nbsp; * FXML controller for the main game scene.
&nbsp; *
&nbsp; * &lt;p&gt;Renders the board (upper/lower tribe and building card rows), player stats,
&nbsp; * the player&#39;s hand, and action buttons (skip, details).
&nbsp; */
<b class="nc">&nbsp;public class MainFXMLController {</b>
&nbsp; //TODO
&nbsp; @FXML private GridPane leftGrid;
&nbsp; //TODO
&nbsp; @FXML private ScrollPane playerSide;
&nbsp; //TODO
&nbsp; @FXML private HBox mainHBox;
&nbsp; //TODO
&nbsp; @FXML private ImageView backgroundImage;
&nbsp; //TODO
&nbsp; @FXML private HBox board;
&nbsp; //TODO
&nbsp; @FXML private HBox upperList;
&nbsp; //TODO
&nbsp; @FXML private HBox lowerList;
&nbsp; //TODO
&nbsp; @FXML private HBox myHand;
&nbsp; //TODO
&nbsp; @FXML private Button skipBtn;
&nbsp; //TODO
&nbsp; @FXML private Button detailsBtn;
&nbsp; //TODO
&nbsp; @FXML private Label infoText;
&nbsp; //TODO
<b class="nc">&nbsp; private final Map&lt;String, Label&gt; foodLabels = new HashMap&lt;&gt;();</b>
&nbsp; //TODO
<b class="nc">&nbsp; private final Map&lt;String, Label&gt; prestigeLabels = new HashMap&lt;&gt;();</b>
&nbsp; //TODO
<b class="nc">&nbsp; private final Map&lt;String, VBox&gt; playerCards = new HashMap&lt;&gt;();</b>
&nbsp; //TODO
<b class="nc">&nbsp; private final Map&lt;String, List&lt;ImageView&gt;&gt; iconViews = new HashMap&lt;&gt;();</b>
&nbsp; //TODO
&nbsp; private Popup popup;
&nbsp; //TODO
&nbsp; private HBox popupCards;
&nbsp; //TODO
&nbsp; private ClientController controller;
&nbsp;
&nbsp; /** {@code true} when the last received event was an error response. */
&nbsp; private boolean isError;
&nbsp;
&nbsp; /** Sets the error flag; called by {@link GUI} before delegating to {@link #render()}. */
<b class="nc">&nbsp; public void setError(boolean error) { this.isError = error; }</b>
&nbsp;
&nbsp; // ==== IMAGE CACHE ====
<b class="nc">&nbsp; private static final Map&lt;String, Image&gt; imageCache = new HashMap&lt;&gt;();</b>
&nbsp;
&nbsp; /** Returns a cached {@link Image} for the given classpath {@code path}, loading it on first access. */
&nbsp; private Image loadImage(String path) {
<b class="nc">&nbsp; return imageCache.computeIfAbsent(path,</b>
<b class="nc">&nbsp; p -&gt; new Image(getClass().getResourceAsStream(p)));</b>
&nbsp; }
&nbsp;
&nbsp; /**
&nbsp; * Injects the client controller and wires up the skip-turn button action.
&nbsp; *
&nbsp; * @param controller the client controller to use.
&nbsp; */
&nbsp; public void setController(ClientController controller) {
<b class="nc">&nbsp; this.controller = controller;</b>
<b class="nc">&nbsp; skipBtn.setOnAction(e -&gt; controller.skipTurn());</b>
&nbsp; }
&nbsp;
&nbsp; /** Initializes the scene: loads fonts, sets up the popup, and registers input listeners. */
&nbsp; @FXML
&nbsp; public void initialize() {
<b class="nc">&nbsp; Font.loadFont(getClass().getResourceAsStream(&quot;/Fonts/InknutAntiqua-Regular.ttf&quot;), 14);</b>
&nbsp;
<b class="nc">&nbsp; addHoverZoom(skipBtn);</b>
<b class="nc">&nbsp; addHoverZoom(detailsBtn);</b>
<b class="nc">&nbsp; popup = new Popup();</b>
<b class="nc">&nbsp; mainHBox.sceneProperty().addListener((obs, oldScene, newScene) -&gt; {</b>
<b class="nc">&nbsp; if (newScene != null) {</b>
<b class="nc">&nbsp; newScene.addEventFilter(MouseEvent.MOUSE_PRESSED, e -&gt; {</b>
<b class="nc">&nbsp; if (popup.isShowing()) popup.hide();</b>
&nbsp; });
<b class="nc">&nbsp; newScene.getRoot().applyCss();</b>
<b class="nc">&nbsp; newScene.windowProperty().addListener((o2, ow, nw) -&gt; {</b>
<b class="nc">&nbsp; if (nw != null) {</b>
<b class="nc">&nbsp; nw.focusedProperty().addListener((o3, wf, nf) -&gt; {</b>
<b class="nc">&nbsp; if (!nf) popup.hide();</b>
&nbsp; });
&nbsp; }
&nbsp; });
&nbsp; }
&nbsp; else {
<b class="nc">&nbsp; popup.hide();</b>
&nbsp; }
&nbsp; });
<b class="nc">&nbsp; initPopup();</b>
<b class="nc">&nbsp; detailsBtn.setOnAction(e -&gt; openDetailsPopup());</b>
<b class="nc">&nbsp; renderBackground();</b>
<b class="nc">&nbsp; isError=false;</b>
&nbsp; }
&nbsp;
&nbsp;
&nbsp; // ==== RENDER ====
&nbsp; /** Incrementally re-renders only the parts of the scene affected by the last network event. */
&nbsp; public void render() {
<b class="nc">&nbsp; if(foodLabels.isEmpty() || controller.getMiniModel().lastEvent == null</b>
<b class="nc">&nbsp; || controller.getMiniModel().lastEvent.getEventType().equals(EventType.TOTEM_CHOICE))</b>
<b class="nc">&nbsp; buildSidePanel();</b>
<b class="nc">&nbsp; if(isError)</b>
&nbsp; {
<b class="nc">&nbsp; updateSidePanel();</b>
<b class="nc">&nbsp; isError=false;</b>
&nbsp; return;
&nbsp; }
<b class="nc">&nbsp; if(controller.getMiniModel().lastEvent==null ||controller.getMiniModel().lastEvent.getEventType().equals(EventType.TOTEM_CHOICE) || controller.getMiniModel().lastEvent.getEventType().equals(EventType.NEXT_ROUND)) {</b>
<b class="nc">&nbsp; renderMyHand();</b>
<b class="nc">&nbsp; renderUpper();</b>
<b class="nc">&nbsp; renderBoard();</b>
<b class="nc">&nbsp; renderLower();</b>
<b class="nc">&nbsp; updateSidePanel();</b>
&nbsp; return;
&nbsp; }
<b class="nc">&nbsp; if(controller.getMiniModel().lastEvent.getEventType().equals(EventType.DRAW_UPPER_TRIBE) || controller.getMiniModel().lastEvent.getEventType().equals(EventType.DRAW_UPPER_BUILD))</b>
&nbsp; {
<b class="nc">&nbsp; renderUpper();</b>
&nbsp; }
<b class="nc">&nbsp; if(controller.getMiniModel().lastEvent.getEventType().equals(EventType.DRAW_LOWER_TRIBE) || controller.getMiniModel().lastEvent.getEventType().equals(EventType.DRAW_LOWER_BUILD))</b>
&nbsp; {
<b class="nc">&nbsp; renderLower();</b>
&nbsp; }
<b class="nc">&nbsp; if(controller.getMiniModel().lastEvent.getUsername().equals(controller.getMyUsername()))</b>
&nbsp; {
<b class="nc">&nbsp; renderMyHand();</b>
&nbsp; }
<b class="nc">&nbsp; renderBoard();</b>
<b class="nc">&nbsp; updateSidePanel();</b>
&nbsp; }
&nbsp;
&nbsp;
&nbsp; // ==== EFFECTS ====
&nbsp; /** Binds a rounded-rectangle clip to {@code img} so its corners are cropped. */
&nbsp; private void addClip(ImageView img) {
<b class="nc">&nbsp; Rectangle clip = new Rectangle();</b>
<b class="nc">&nbsp; clip.setArcWidth(20);</b>
<b class="nc">&nbsp; clip.setArcHeight(20);</b>
<b class="nc">&nbsp; img.setClip(clip);</b>
<b class="nc">&nbsp; clip.heightProperty().bind(img.layoutBoundsProperty().map(b -&gt; b.getHeight()));</b>
<b class="nc">&nbsp; clip.widthProperty().bind(img.layoutBoundsProperty().map(b -&gt; b.getWidth()));</b>
&nbsp; }
&nbsp;
&nbsp; /** Scales {@code node} to 1.1× on hover and restores on exit; sets a hand cursor. */
&nbsp; private void addHoverZoom(Node node) {
<b class="nc">&nbsp; ScaleTransition scaleUp = new ScaleTransition(Duration.millis(150), node);</b>
<b class="nc">&nbsp; scaleUp.setToX(1.1);</b>
<b class="nc">&nbsp; scaleUp.setToY(1.1);</b>
<b class="nc">&nbsp; ScaleTransition scaleDown = new ScaleTransition(Duration.millis(150), node);</b>
<b class="nc">&nbsp; scaleDown.setToX(1.0);</b>
<b class="nc">&nbsp; scaleDown.setToY(1.0);</b>
<b class="nc">&nbsp; node.addEventHandler(MouseEvent.MOUSE_ENTERED, e -&gt; { scaleUp.play(); node.setCursor(Cursor.HAND); });</b>
<b class="nc">&nbsp; node.addEventHandler(MouseEvent.MOUSE_EXITED, e -&gt; { scaleDown.play(); node.setCursor(Cursor.DEFAULT); });</b>
&nbsp; }
&nbsp;
&nbsp; /** Applies a drop-shadow to {@code node} that intensifies on hover. */
&nbsp; private void addShadow(Node node) {
<b class="nc">&nbsp; DropShadow shadow = new DropShadow();</b>
<b class="nc">&nbsp; shadow.setColor(Color.rgb(0, 0, 0, 0.3));</b>
<b class="nc">&nbsp; shadow.setRadius(6);</b>
<b class="nc">&nbsp; shadow.setOffsetX(2);</b>
<b class="nc">&nbsp; shadow.setOffsetY(2);</b>
<b class="nc">&nbsp; node.setEffect(shadow);</b>
<b class="nc">&nbsp; node.addEventHandler(MouseEvent.MOUSE_ENTERED, e -&gt; {</b>
<b class="nc">&nbsp; shadow.setRadius(16);</b>
<b class="nc">&nbsp; shadow.setOffsetX(4);</b>
<b class="nc">&nbsp; shadow.setOffsetY(4);</b>
<b class="nc">&nbsp; shadow.setColor(Color.rgb(0, 0, 0, 0.5));</b>
&nbsp; });
<b class="nc">&nbsp; node.addEventHandler(MouseEvent.MOUSE_EXITED, e -&gt; {</b>
<b class="nc">&nbsp; shadow.setRadius(6);</b>
<b class="nc">&nbsp; shadow.setOffsetX(2);</b>
<b class="nc">&nbsp; shadow.setOffsetY(2);</b>
<b class="nc">&nbsp; shadow.setColor(Color.rgb(0, 0, 0, 0.3));</b>
&nbsp; });
&nbsp; }
&nbsp;
&nbsp;
&nbsp; // ==== ELEMENTS ====
&nbsp;
&nbsp; /** Builds the side-panel card widget for {@code player} with totem, stats, and card-type icons. */
&nbsp; private VBox buildPlayerCard(Player player) {
<b class="nc">&nbsp; VBox card = new VBox(3);</b>
<b class="nc">&nbsp; VBox.setMargin(card, new Insets(15, 15, 0, 15));</b>
<b class="nc">&nbsp; card.getStyleClass().add(&quot;player-card&quot;);</b>
<b class="nc">&nbsp; card.setPadding(new Insets(4));</b>
&nbsp;
<b class="nc">&nbsp; HBox headerRow = new HBox(8);</b>
<b class="nc">&nbsp; headerRow.setAlignment(Pos.CENTER);</b>
<b class="nc">&nbsp; ImageView totem = new ImageView(loadImage(&quot;/GUIImages/Totems/totem_&quot;</b>
<b class="nc">&nbsp; + player.getTotem().toString().toLowerCase(Locale.ROOT) + &quot;.png&quot;));</b>
<b class="nc">&nbsp; totem.setFitHeight(20);</b>
<b class="nc">&nbsp; totem.setPreserveRatio(true);</b>
<b class="nc">&nbsp; Label usernameLabel = new Label(player.getUserName());</b>
<b class="nc">&nbsp; usernameLabel.getStyleClass().add(&quot;label-medium&quot;);</b>
<b class="nc">&nbsp; usernameLabel.setStyle(&quot;-fx-text-fill: #711423;&quot;);</b>
<b class="nc">&nbsp; if (player.getUserName().equals(controller.getMyUsername())) {</b>
<b class="nc">&nbsp; usernameLabel.setText(usernameLabel.getText() + &quot; (you)&quot;);</b>
&nbsp; }
<b class="nc">&nbsp; if (controller.getMiniModel().disconnectedPlayers.contains(player.getUserName())) {</b>
<b class="nc">&nbsp; card.getStyleClass().add(&quot;player-card-crashed&quot;);</b>
&nbsp; }
<b class="nc">&nbsp; headerRow.getChildren().addAll(totem, usernameLabel);</b>
&nbsp;
<b class="nc">&nbsp; HBox statsRow = new HBox(10);</b>
<b class="nc">&nbsp; statsRow.setAlignment(Pos.CENTER);</b>
&nbsp;
<b class="nc">&nbsp; HBox foodBox = new HBox(4);</b>
<b class="nc">&nbsp; foodBox.setAlignment(Pos.CENTER);</b>
<b class="nc">&nbsp; ImageView foodIcon = new ImageView(loadImage(&quot;/GUIImages/Icons/Food.png&quot;));</b>
<b class="nc">&nbsp; foodIcon.setFitHeight(20);</b>
<b class="nc">&nbsp; foodIcon.setPreserveRatio(true);</b>
<b class="nc">&nbsp; Label foodLabel = new Label(String.valueOf(player.getFoodValue()));</b>
<b class="nc">&nbsp; foodLabel.getStyleClass().add(&quot;label-small&quot;);</b>
<b class="nc">&nbsp; foodLabels.put(player.getUserName(), foodLabel);</b>
<b class="nc">&nbsp; foodBox.getChildren().addAll(foodIcon, foodLabel);</b>
&nbsp;
<b class="nc">&nbsp; HBox prestigeBox = new HBox(1);</b>
<b class="nc">&nbsp; prestigeBox.setAlignment(Pos.CENTER);</b>
<b class="nc">&nbsp; ImageView ppIcon = new ImageView(loadImage(&quot;/GUIImages/Icons/PrestigePoint.png&quot;));</b>
<b class="nc">&nbsp; ppIcon.setFitHeight(35);</b>
<b class="nc">&nbsp; ppIcon.setPreserveRatio(true);</b>
<b class="nc">&nbsp; Label prestigeLabel = new Label(String.valueOf(player.getPrestigeValue()));</b>
<b class="nc">&nbsp; prestigeLabel.getStyleClass().add(&quot;label-small&quot;);</b>
<b class="nc">&nbsp; prestigeLabels.put(player.getUserName(), prestigeLabel);</b>
<b class="nc">&nbsp; prestigeBox.getChildren().addAll(ppIcon, prestigeLabel);</b>
&nbsp;
<b class="nc">&nbsp; ImageView buildingIcon = new ImageView(loadImage(&quot;/GUIImages/Icons/Building.png&quot;));</b>
<b class="nc">&nbsp; buildingIcon.setFitWidth(28);</b>
<b class="nc">&nbsp; buildingIcon.setFitHeight(28);</b>
<b class="nc">&nbsp; buildingIcon.setPreserveRatio(true);</b>
<b class="nc">&nbsp; buildingIcon.setOnMouseClicked(e -&gt; {</b>
<b class="nc">&nbsp; ArrayList&lt;PlayableCard&gt; cards = getPlayerCards(player.getUserName(), &quot;building&quot;);</b>
<b class="nc">&nbsp; if (!cards.isEmpty()) openPopup(cards);</b>
&nbsp; });
<b class="nc">&nbsp; addHoverZoom(buildingIcon);</b>
&nbsp;
<b class="nc">&nbsp; statsRow.getChildren().addAll(foodBox, prestigeBox, buildingIcon);</b>
&nbsp;
<b class="nc">&nbsp; HBox iconsRow1 = new HBox(6);</b>
<b class="nc">&nbsp; iconsRow1.setSpacing(20);</b>
<b class="nc">&nbsp; iconsRow1.setAlignment(Pos.CENTER);</b>
<b class="nc">&nbsp; HBox iconsRow2 = new HBox(6);</b>
<b class="nc">&nbsp; iconsRow2.setAlignment(Pos.CENTER);</b>
<b class="nc">&nbsp; iconsRow2.setSpacing(20);</b>
&nbsp;
<b class="nc">&nbsp; String[][] iconTypes = {</b>
&nbsp; {&quot;Artist&quot;, &quot;artists&quot;},
&nbsp; {&quot;Gatherer&quot;, &quot;gatherers&quot;},
&nbsp; {&quot;Inventor&quot;, &quot;inventors&quot;},
&nbsp; {&quot;Builder&quot;, &quot;builders&quot;},
&nbsp; {&quot;Shaman&quot;, &quot;shamans&quot;},
&nbsp; {&quot;Hunter&quot;, &quot;hunters&quot;}
&nbsp; };
&nbsp;
<b class="nc">&nbsp; List&lt;ImageView&gt; icons = new ArrayList&lt;&gt;();</b>
&nbsp; // building must be index 0; updateSidePanel iterates icons in [&quot;building&quot;,&quot;artists&quot;,...] order
<b class="nc">&nbsp; icons.add(buildingIcon);</b>
&nbsp;
<b class="nc">&nbsp; for (int i = 0; i &lt; iconTypes.length; i++) {</b>
<b class="nc">&nbsp; String iconName = iconTypes[i][0];</b>
<b class="nc">&nbsp; String fieldName = iconTypes[i][1];</b>
&nbsp;
<b class="nc">&nbsp; ImageView icon = new ImageView(loadImage(&quot;/GUIImages/Icons/&quot; + iconName + &quot;.png&quot;));</b>
<b class="nc">&nbsp; icon.setFitWidth(28);</b>
<b class="nc">&nbsp; icon.setFitHeight(28);</b>
<b class="nc">&nbsp; icon.setPreserveRatio(true);</b>
<b class="nc">&nbsp; icon.setOnMouseClicked(e -&gt; {</b>
<b class="nc">&nbsp; ArrayList&lt;PlayableCard&gt; cards = getPlayerCards(player.getUserName(), fieldName);</b>
<b class="nc">&nbsp; if (!cards.isEmpty()) openPopup(cards);</b>
&nbsp; });
<b class="nc">&nbsp; addHoverZoom(icon);</b>
<b class="nc">&nbsp; icons.add(icon);</b>
&nbsp;
<b class="nc">&nbsp; if (i &lt; 3) iconsRow1.getChildren().add(icon);</b>
<b class="nc">&nbsp; else iconsRow2.getChildren().add(icon);</b>
&nbsp; }
&nbsp;
<b class="nc">&nbsp; iconViews.put(player.getUserName(), icons);</b>
&nbsp;
<b class="nc">&nbsp; card.getChildren().addAll(headerRow, statsRow, iconsRow1, iconsRow2);</b>
<b class="nc">&nbsp; return card;</b>
&nbsp; }
&nbsp;
&nbsp; /** Creates a {@link StackPane} containing the order card image for a game of {@code num} players. */
&nbsp; private StackPane createOrder(String num) {
<b class="nc">&nbsp; ImageView img = new ImageView(loadImage(&quot;/GUIImages/Orders/order-&quot; + num + &quot;.png&quot;));</b>
<b class="nc">&nbsp; img.fitHeightProperty().bind(board.sceneProperty().get().heightProperty().subtract(56).divide(4).multiply(0.94));</b>
<b class="nc">&nbsp; img.setPreserveRatio(true);</b>
<b class="nc">&nbsp; addClip(img);</b>
<b class="nc">&nbsp; return new StackPane(img);</b>
&nbsp; }
&nbsp;
&nbsp; /** Creates a {@link StackPane} for a board slot, optionally overlaying the occupying player&#39;s totem. */
&nbsp; private StackPane createSlot(Slot slot, boolean withZoom, boolean withShadow) {
<b class="nc">&nbsp; ImageView img = new ImageView(loadImage(&quot;/GUIImages/Fronts/card-&quot; + slot.getSlotId() + &quot;.png&quot;));</b>
<b class="nc">&nbsp; img.setPreserveRatio(true);</b>
<b class="nc">&nbsp; img.fitHeightProperty().bind(board.sceneProperty().get().heightProperty().subtract(56).divide(4).multiply(0.94));</b>
<b class="nc">&nbsp; addClip(img);</b>
<b class="nc">&nbsp; StackPane wrapper = new StackPane(img);</b>
&nbsp;
<b class="nc">&nbsp; Player player = controller.getMiniModel().slotPlayerMap.get(slot);</b>
<b class="nc">&nbsp; if (player != null &amp;&amp; controller.getMiniModel().getPositionByUsername(player.getUserName()) != -1) {</b>
<b class="nc">&nbsp; ImageView totem = new ImageView(loadImage(&quot;/GUIImages/Totems/totem_&quot; + player.getTotem().toString().toLowerCase(Locale.ROOT) + &quot;.png&quot;));</b>
<b class="nc">&nbsp; totem.fitHeightProperty().bind(img.fitHeightProperty().multiply(0.332));</b>
<b class="nc">&nbsp; totem.setPreserveRatio(true);</b>
<b class="nc">&nbsp; StackPane.setAlignment(totem, Pos.TOP_LEFT);</b>
<b class="nc">&nbsp; img.fitHeightProperty().addListener((obs, ov, nv) -&gt; {</b>
<b class="nc">&nbsp; StackPane.setMargin(totem, new Insets(0, 0, 0, 0.224 * nv.doubleValue()));</b>
&nbsp; });
<b class="nc">&nbsp; if (img.getFitHeight() &gt; 0) {</b>
<b class="nc">&nbsp; StackPane.setMargin(totem, new Insets(0, 0, 0, 0.224 * img.getFitHeight()));</b>
&nbsp; }
<b class="nc">&nbsp; wrapper.getChildren().add(totem);</b>
&nbsp; }
&nbsp;
<b class="nc">&nbsp; if (withShadow) addShadow(wrapper);</b>
<b class="nc">&nbsp; if (withZoom) addHoverZoom(wrapper);</b>
<b class="nc">&nbsp; return wrapper;</b>
&nbsp; }
&nbsp;
&nbsp; /** Creates a {@link StackPane} for a playable card, scaling its height to a fraction of {@code parent}&#39;s scene. */
&nbsp; private StackPane createCard(PlayableCard card, boolean withZoom, boolean withShadow, Region parent) {
<b class="nc">&nbsp; ImageView img = new ImageView(loadImage(&quot;/GUIImages/Fronts/card-&quot; + card.getIdIMG() + &quot;.png&quot;));</b>
<b class="nc">&nbsp; img.setPreserveRatio(true);</b>
<b class="nc">&nbsp; if(controller.getMiniModel().players.size()==5)</b>
&nbsp; {
<b class="nc">&nbsp; img.fitHeightProperty().bind(parent.getScene().heightProperty().subtract(56).divide(4).multiply(0.85));</b>
&nbsp; }
&nbsp; else
<b class="nc">&nbsp; img.fitHeightProperty().bind(parent.getScene().heightProperty().subtract(56).divide(4).multiply(0.90));</b>
<b class="nc">&nbsp; addClip(img);</b>
<b class="nc">&nbsp; StackPane wrapper = new StackPane(img);</b>
<b class="nc">&nbsp; if (withShadow) addShadow(wrapper);</b>
<b class="nc">&nbsp; if (withZoom) addHoverZoom(wrapper);</b>
<b class="nc">&nbsp; return wrapper;</b>
&nbsp; }
&nbsp;
&nbsp;
&nbsp;
&nbsp; // ==== GROUPS ====
&nbsp; /** Builds the full side panel from scratch, creating a player card for each connected player. */
&nbsp; private void buildSidePanel() {
<b class="nc">&nbsp; infoText.setText(&quot;Round: &quot;+Integer.toString(controller.getMiniModel().currentState.getRound()) + &quot; • &quot; + controller.getMiniModel().currentState.getGameStage().toString());</b>
<b class="nc">&nbsp; VBox playerList = new VBox();</b>
<b class="nc">&nbsp; playerList.setFillWidth(true);</b>
<b class="nc">&nbsp; for (Player p : controller.getMiniModel().players.values()) {</b>
<b class="nc">&nbsp; VBox card = buildPlayerCard(p);</b>
<b class="nc">&nbsp; playerCards.put(p.getUserName(), card);</b>
<b class="nc">&nbsp; playerList.getChildren().add(card);</b>
&nbsp; }
<b class="nc">&nbsp; playerSide.setContent(playerList);</b>
&nbsp; }
&nbsp;
&nbsp; /** Updates food/prestige labels, current-player highlight, card-icon opacity, and plays error shake if needed. */
&nbsp; private void updateSidePanel() {
<b class="nc">&nbsp; infoText.setText(&quot;Round: &quot;+Integer.toString(controller.getMiniModel().currentState.getRound()) + &quot; • &quot; + controller.getMiniModel().currentState.getGameStage().toString());</b>
<b class="nc">&nbsp; if (controller.getMiniModel().currentState.getCurrentPlayer() == null) return;</b>
<b class="nc">&nbsp; String current = controller.getMiniModel().currentState.getCurrentPlayer().getUserName();</b>
&nbsp; // ordine: building, artists, gatherers, inventors, builders, shamans, hunters
<b class="nc">&nbsp; String[] fields = {&quot;building&quot;, &quot;artists&quot;, &quot;gatherers&quot;, &quot;inventors&quot;, &quot;builders&quot;, &quot;shamans&quot;, &quot;hunters&quot;};</b>
&nbsp;
<b class="nc">&nbsp; for (Player p : controller.getMiniModel().players.values()) {</b>
<b class="nc">&nbsp; String u = p.getUserName();</b>
&nbsp;
<b class="nc">&nbsp; foodLabels.get(u).setText(String.valueOf(p.getFoodValue()));</b>
<b class="nc">&nbsp; prestigeLabels.get(u).setText(String.valueOf(p.getPrestigeValue()));</b>
&nbsp;
<b class="nc">&nbsp; List&lt;ImageView&gt; icons = iconViews.get(u);</b>
<b class="nc">&nbsp; for (int i = 0; i &lt; icons.size(); i++) {</b>
<b class="nc">&nbsp; boolean empty = getPlayerCards(u, fields[i]).isEmpty();</b>
<b class="nc">&nbsp; icons.get(i).setOpacity(empty ? 0.3 : 1.0);</b>
<b class="nc">&nbsp; icons.get(i).setEffect(empty ? new ColorAdjust() : null);</b>
&nbsp; }
&nbsp;
<b class="nc">&nbsp; VBox card = playerCards.get(u);</b>
<b class="nc">&nbsp; if(controller.getMiniModel().disconnectedPlayers.contains(u))</b>
&nbsp; {
<b class="nc">&nbsp; card.getStyleClass().clear();</b>
<b class="nc">&nbsp; card.getStyleClass().add(&quot;player-card-crashed&quot;);</b>
&nbsp; }
&nbsp; else {
<b class="nc">&nbsp; card.getStyleClass().clear();</b>
<b class="nc">&nbsp; card.getStyleClass().add(&quot;player-card&quot;);</b>
&nbsp; }
&nbsp;
<b class="nc">&nbsp; if (u.equals(current)) {</b>
<b class="nc">&nbsp; card.setStyle(&quot;-fx-effect: dropshadow(gaussian, #fff8dc, 15, 0.10, 0, 0)&quot;);</b>
<b class="nc">&nbsp; ScaleTransition st = new ScaleTransition(Duration.millis(150), card);</b>
<b class="nc">&nbsp; st.setToX(1.1);</b>
<b class="nc">&nbsp; st.setToY(1.1);</b>
<b class="nc">&nbsp; st.play();</b>
&nbsp; } else {
<b class="nc">&nbsp; ScaleTransition st = new ScaleTransition(Duration.millis(150), card);</b>
<b class="nc">&nbsp; st.setToX(1.0);</b>
<b class="nc">&nbsp; st.setToY(1.0);</b>
<b class="nc">&nbsp; st.play();</b>
<b class="nc">&nbsp; card.setStyle(&quot;&quot;);</b>
&nbsp; }
&nbsp;
<b class="nc">&nbsp; if (isError &amp;&amp; u.equals(controller.getMyUsername())) {</b>
<b class="nc">&nbsp; TranslateTransition tt = new TranslateTransition(Duration.millis(56), card);</b>
<b class="nc">&nbsp; tt.setFromX(0);</b>
<b class="nc">&nbsp; tt.setByX(10);</b>
<b class="nc">&nbsp; tt.setCycleCount(6);</b>
<b class="nc">&nbsp; tt.setAutoReverse(true);</b>
<b class="nc">&nbsp; tt.play();</b>
&nbsp; }
&nbsp; }
&nbsp; }
&nbsp;
&nbsp; /** Renders the top card of the upper building stack with a count badge; clicking opens the selection popup. */
&nbsp; private void drawUpperBuilding() {
<b class="nc">&nbsp; ArrayList&lt;BuildingCard&gt; cardList = new ArrayList&lt;&gt;(controller.getMiniModel().upperListBuildingCards);</b>
<b class="nc">&nbsp; if (!cardList.isEmpty()) {</b>
<b class="nc">&nbsp; StackPane img = createCard(cardList.getLast(), true, true, upperList);</b>
<b class="nc">&nbsp; Label label = new Label(String.valueOf(cardList.size()));</b>
<b class="nc">&nbsp; label.setTranslateY(-56);</b>
<b class="nc">&nbsp; label.setTranslateX(10);</b>
<b class="nc">&nbsp; label.getStyleClass().add(&quot;label-large&quot;);</b>
<b class="nc">&nbsp; StackPane.setAlignment(label, Pos.TOP_RIGHT);</b>
<b class="nc">&nbsp; img.getChildren().add(label);</b>
<b class="nc">&nbsp; img.setOnMouseClicked(e -&gt; openPopupUpperBuilding(cardList));</b>
<b class="nc">&nbsp; upperList.getChildren().add(img);</b>
&nbsp; }
&nbsp; }
&nbsp;
&nbsp; /** Renders the top card of the lower building stack with a count badge; clicking opens the selection popup. */
&nbsp; private void drawLowerBuilding() {
<b class="nc">&nbsp; ArrayList&lt;BuildingCard&gt; cardList = new ArrayList&lt;&gt;(controller.getMiniModel().lowerListBuildingCards);</b>
<b class="nc">&nbsp; if (!cardList.isEmpty()) {</b>
<b class="nc">&nbsp; StackPane img = createCard(cardList.getLast(), true, true, lowerList);</b>
<b class="nc">&nbsp; Label label = new Label(String.valueOf(cardList.size()));</b>
<b class="nc">&nbsp; label.setTranslateY(-56);</b>
<b class="nc">&nbsp; label.setTranslateX(10);</b>
<b class="nc">&nbsp; label.getStyleClass().add(&quot;label-large&quot;);</b>
<b class="nc">&nbsp; StackPane.setAlignment(label, Pos.TOP_RIGHT);</b>
<b class="nc">&nbsp; img.getChildren().add(label);</b>
<b class="nc">&nbsp; img.setOnMouseClicked(e -&gt; openPopupLowerBuilding(cardList));</b>
<b class="nc">&nbsp; lowerList.getChildren().add(img);</b>
&nbsp; }
&nbsp; }
&nbsp;
&nbsp; /** Renders a single card-type pile in the hand area, or an invisible placeholder if the list is empty. */
&nbsp; private void drawMyHandList(ArrayList&lt;? extends PlayableCard&gt; cardList) {
<b class="nc">&nbsp; if (!cardList.isEmpty()) {</b>
<b class="nc">&nbsp; StackPane img = createCard(cardList.getLast(), true, true, myHand);</b>
<b class="nc">&nbsp; Label label = new Label(String.valueOf(cardList.size()));</b>
<b class="nc">&nbsp; label.setTranslateY(-56);</b>
<b class="nc">&nbsp; label.setTranslateX(10);</b>
<b class="nc">&nbsp; label.getStyleClass().add(&quot;label-large&quot;);</b>
<b class="nc">&nbsp; StackPane.setAlignment(label, Pos.TOP_RIGHT);</b>
<b class="nc">&nbsp; img.getChildren().add(label);</b>
<b class="nc">&nbsp; img.setOnMouseClicked(e -&gt; openPopup(new ArrayList&lt;&gt;(cardList)));</b>
<b class="nc">&nbsp; myHand.getChildren().add(img);</b>
&nbsp; } else {
<b class="nc">&nbsp; Region placeholder = new Region();</b>
<b class="nc">&nbsp; placeholder.prefHeightProperty().bind(myHand.getScene().heightProperty().subtract(56).divide(4).multiply(0.90));</b>
<b class="nc">&nbsp; placeholder.prefWidthProperty().bind(placeholder.prefHeightProperty().multiply(0.675));</b>
<b class="nc">&nbsp; placeholder.setStyle(&quot;-fx-background-color: transparent;&quot;);</b>
<b class="nc">&nbsp; myHand.getChildren().add(placeholder);</b>
&nbsp; }
&nbsp; }
&nbsp;
&nbsp; /** Returns a copy of the named card collection for {@code username}. */
&nbsp; private ArrayList&lt;PlayableCard&gt; getPlayerCards(String username, String type) {
<b class="nc">&nbsp; Player p = controller.getMiniModel().players.get(username);</b>
<b class="nc">&nbsp; return switch (type) {</b>
<b class="nc">&nbsp; case &quot;artists&quot; -&gt; new ArrayList&lt;&gt;(p.getArtists());</b>
<b class="nc">&nbsp; case &quot;gatherers&quot; -&gt; new ArrayList&lt;&gt;(p.getGatherers());</b>
<b class="nc">&nbsp; case &quot;inventors&quot; -&gt; new ArrayList&lt;&gt;(p.getInventors());</b>
<b class="nc">&nbsp; case &quot;builders&quot; -&gt; new ArrayList&lt;&gt;(p.getBuilders());</b>
<b class="nc">&nbsp; case &quot;shamans&quot; -&gt; new ArrayList&lt;&gt;(p.getShamans());</b>
<b class="nc">&nbsp; case &quot;hunters&quot; -&gt; new ArrayList&lt;&gt;(p.getHunters());</b>
<b class="nc">&nbsp; case &quot;building&quot; -&gt; new ArrayList&lt;&gt;(p.getBuildingCards());</b>
<b class="nc">&nbsp; default -&gt; new ArrayList&lt;&gt;();</b>
&nbsp; };
&nbsp; }
&nbsp;
&nbsp;
&nbsp; // ==== ABSOLUTES ====
&nbsp; /** Clears and rebuilds the upper tribe row with click handlers for drawing, then appends the upper building stack. */
&nbsp; private void renderUpper() {
<b class="nc">&nbsp; upperList.setSpacing(14);</b>
<b class="nc">&nbsp; upperList.setAlignment(Pos.CENTER);</b>
<b class="nc">&nbsp; upperList.getChildren().clear();</b>
&nbsp;
<b class="nc">&nbsp; int i = 0;</b>
<b class="nc">&nbsp; for (TribeCard card : controller.getMiniModel().upperListTribeCards) {</b>
<b class="nc">&nbsp; final int index = i;</b>
<b class="nc">&nbsp; StackPane img = createCard(card, true, true, upperList);</b>
<b class="nc">&nbsp; img.setOnMouseClicked(e -&gt; controller.drawUpperTribeCard(index));</b>
<b class="nc">&nbsp; upperList.getChildren().add(img);</b>
<b class="nc">&nbsp; i++;</b>
&nbsp; }
<b class="nc">&nbsp; drawUpperBuilding();</b>
&nbsp; }
&nbsp;
&nbsp; /** Clears and rebuilds the lower tribe row with click handlers for drawing, then appends the lower building stack. */
&nbsp; private void renderLower() {
<b class="nc">&nbsp; lowerList.setSpacing(14);</b>
<b class="nc">&nbsp; lowerList.setAlignment(Pos.CENTER);</b>
<b class="nc">&nbsp; lowerList.getChildren().clear();</b>
&nbsp;
<b class="nc">&nbsp; int i = 0;</b>
<b class="nc">&nbsp; for (TribeCard card : controller.getMiniModel().lowerListTribeCards) {</b>
<b class="nc">&nbsp; final int index = i;</b>
<b class="nc">&nbsp; StackPane img = createCard(card, true, true, lowerList);</b>
<b class="nc">&nbsp; img.setOnMouseClicked(e -&gt; controller.drawLowerTribeCard(index));</b>
<b class="nc">&nbsp; lowerList.getChildren().add(img);</b>
<b class="nc">&nbsp; i++;</b>
&nbsp; }
<b class="nc">&nbsp; drawLowerBuilding();</b>
&nbsp; }
&nbsp;
&nbsp; /** Sets the full-cover background image on the main HBox container. */
&nbsp; private void renderBackground() {
<b class="nc">&nbsp; BackgroundSize size = new BackgroundSize(</b>
&nbsp; BackgroundSize.AUTO, BackgroundSize.AUTO,
&nbsp; false, false, true, true
&nbsp; );
<b class="nc">&nbsp; mainHBox.setBackground(new Background(new BackgroundImage(</b>
<b class="nc">&nbsp; loadImage(&quot;/GUIImages/Background.png&quot;),</b>
&nbsp; BackgroundRepeat.NO_REPEAT,
&nbsp; BackgroundRepeat.NO_REPEAT,
&nbsp; BackgroundPosition.CENTER,
&nbsp; size
&nbsp; )));
&nbsp; }
&nbsp;
&nbsp; /** Clears the board area and orchestrates deck, order card, and slot-map rendering. */
&nbsp; private void renderBoard() {
<b class="nc">&nbsp; board.setSpacing(14);</b>
<b class="nc">&nbsp; board.setAlignment(Pos.CENTER);</b>
<b class="nc">&nbsp; board.getChildren().clear();</b>
<b class="nc">&nbsp; renderDeck();</b>
<b class="nc">&nbsp; renderOrder();</b>
<b class="nc">&nbsp; renderSlotMap();</b>
&nbsp; }
&nbsp;
&nbsp; /** Adds the era-specific deck back image to the board. */
&nbsp; private void renderDeck() {
<b class="nc">&nbsp; String path = switch (controller.getMiniModel().currentState.getEra()) {</b>
<b class="nc">&nbsp; case 1 -&gt; &quot;/GUIImages/Backs/back-001.png&quot;;</b>
<b class="nc">&nbsp; case 2 -&gt; &quot;/GUIImages/Backs/back-030.png&quot;;</b>
<b class="nc">&nbsp; case 3 -&gt; &quot;/GUIImages/Backs/back-058.png&quot;;</b>
<b class="nc">&nbsp; default -&gt; &quot;/GUIImages/Backs/back-001.png&quot;;</b>
<b class="nc">&nbsp; };</b>
<b class="nc">&nbsp; ImageView back = new ImageView(loadImage(path));</b>
<b class="nc">&nbsp; back.fitHeightProperty().bind(board.sceneProperty().get().heightProperty().subtract(56).divide(4).multiply(0.94));</b>
<b class="nc">&nbsp; back.setPreserveRatio(true);</b>
<b class="nc">&nbsp; addClip(back);</b>
<b class="nc">&nbsp; addShadow(back);</b>
<b class="nc">&nbsp; addHoverZoom(back);</b>
<b class="nc">&nbsp; board.getChildren().add(back);</b>
&nbsp; }
&nbsp;
&nbsp; /** Renders the order card and overlays each player&#39;s totem at their proportional position. */
&nbsp; private void renderOrder() {
<b class="nc">&nbsp; int numPlayers = controller.getMiniModel().players.size();</b>
<b class="nc">&nbsp; StackPane card = createOrder(Integer.toString(numPlayers));</b>
&nbsp;
<b class="nc">&nbsp; Map&lt;Integer, double[]&gt; slotPositions = Map.of(</b>
<b class="nc">&nbsp; 2, new double[]{0.229, 0.413},</b>
<b class="nc">&nbsp; 3, new double[]{0.183, 0.367, 0.548},</b>
<b class="nc">&nbsp; 4, new double[]{0.142, 0.316, 0.503, 0.690},</b>
<b class="nc">&nbsp; 5, new double[]{0.066, 0.251, 0.433, 0.617, 0.802}</b>
&nbsp; );
<b class="nc">&nbsp; double[] positions = slotPositions.get(numPlayers);</b>
<b class="nc">&nbsp; if (positions == null) return;</b>
&nbsp;
<b class="nc">&nbsp; Pane overlay = new Pane();</b>
<b class="nc">&nbsp; overlay.setPickOnBounds(false);</b>
<b class="nc">&nbsp; overlay.setMouseTransparent(true);</b>
&nbsp;
<b class="nc">&nbsp; for (int i = 0; i &lt; controller.getMiniModel().orderLogicCard.getPlayerList().size(); i++) {</b>
<b class="nc">&nbsp; OrderPlayer op = controller.getMiniModel().orderLogicCard.getPlayerList().get(i);</b>
&nbsp;
<b class="nc">&nbsp; ImageView totem = new ImageView(loadImage(</b>
<b class="nc">&nbsp; &quot;/GUIImages/Totems/totem_&quot; + op.getPlayer().getTotem().toString().toLowerCase(Locale.ROOT) + &quot;.png&quot;</b>
&nbsp; ));
<b class="nc">&nbsp; totem.setPreserveRatio(true);</b>
&nbsp;
<b class="nc">&nbsp; if (op.isPlayed()) {</b>
<b class="nc">&nbsp; totem.setVisible(false);</b>
&nbsp; }
&nbsp;
<b class="nc">&nbsp; final double yRatio = positions[i];</b>
&nbsp;
<b class="nc">&nbsp; overlay.prefHeightProperty().bind(card.heightProperty());</b>
<b class="nc">&nbsp; overlay.prefWidthProperty().bind(card.widthProperty());</b>
&nbsp;
<b class="nc">&nbsp; totem.fitHeightProperty().bind(card.heightProperty().multiply(0.323));</b>
&nbsp;
<b class="nc">&nbsp; card.heightProperty().addListener((obs, ov, nv) -&gt; {</b>
<b class="nc">&nbsp; totem.setLayoutY(nv.doubleValue() * (yRatio-0.196));</b>
&nbsp; });
<b class="nc">&nbsp; card.widthProperty().addListener((obs, ov, nv) -&gt; {</b>
<b class="nc">&nbsp; totem.setLayoutX(nv.doubleValue() * 0.364);</b>
&nbsp; });
&nbsp;
&nbsp; // initialize immediately if already laid out
<b class="nc">&nbsp; if (card.getHeight() &gt; 0) totem.setLayoutY(card.getHeight() *(yRatio-0.196));</b>
<b class="nc">&nbsp; if (card.getWidth() &gt; 0) totem.setLayoutX(card.getWidth() * 0.364);</b>
&nbsp;
<b class="nc">&nbsp; overlay.getChildren().add(totem);</b>
&nbsp; }
&nbsp;
<b class="nc">&nbsp; card.getChildren().add(overlay);</b>
<b class="nc">&nbsp; board.getChildren().add(card);</b>
&nbsp; }
&nbsp;
&nbsp; /** Adds a clickable slot widget for each entry in the slot-player map. */
&nbsp; private void renderSlotMap() {
<b class="nc">&nbsp; int i = 0;</b>
<b class="nc">&nbsp; for (Map.Entry&lt;Slot, Player&gt; entry : controller.getMiniModel().slotPlayerMap.entrySet()) {</b>
<b class="nc">&nbsp; Slot slot = entry.getKey();</b>
<b class="nc">&nbsp; final int index = i;</b>
<b class="nc">&nbsp; StackPane img = createSlot(slot, true, true);</b>
<b class="nc">&nbsp; img.setOnMouseClicked(e -&gt; controller.slotChoice(index));</b>
<b class="nc">&nbsp; board.getChildren().add(img);</b>
<b class="nc">&nbsp; i++;</b>
&nbsp; }
&nbsp; }
&nbsp;
&nbsp; /** Clears and re-renders all seven card-type piles in the local player&#39;s hand area. */
&nbsp; private void renderMyHand() {
<b class="nc">&nbsp; myHand.getChildren().clear();</b>
<b class="nc">&nbsp; myHand.setSpacing(14);</b>
<b class="nc">&nbsp; myHand.setAlignment(Pos.CENTER);</b>
&nbsp;
<b class="nc">&nbsp; Player me = controller.getMiniModel().players.get(controller.getMyUsername());</b>
<b class="nc">&nbsp; drawMyHandList(me.getArtists());</b>
<b class="nc">&nbsp; drawMyHandList(me.getGatherers());</b>
<b class="nc">&nbsp; drawMyHandList(me.getInventors());</b>
<b class="nc">&nbsp; drawMyHandList(me.getBuilders());</b>
<b class="nc">&nbsp; drawMyHandList(me.getShamans());</b>
<b class="nc">&nbsp; drawMyHandList(me.getHunters());</b>
<b class="nc">&nbsp; drawMyHandList(me.getBuildingCards());</b>
&nbsp; }
&nbsp;
&nbsp;
&nbsp; // ==== POPUP ====
&nbsp; /** Creates and configures the shared card-preview popup container. */
&nbsp; private void initPopup() {
<b class="nc">&nbsp; popupCards = new HBox(10);</b>
<b class="nc">&nbsp; popupCards.setAlignment(Pos.CENTER);</b>
<b class="nc">&nbsp; popupCards.setPadding(new Insets(10));</b>
<b class="nc">&nbsp; popupCards.setStyle(</b>
&nbsp; &quot;-fx-background-color: #b42224;&quot; +
&nbsp; &quot;-fx-border-color: black;&quot; +
&nbsp; &quot;-fx-border-width: 2;&quot; +
&nbsp; &quot;-fx-border-radius: 10;&quot; +
&nbsp; &quot;-fx-background-radius: 10;&quot;
&nbsp; );
&nbsp;
<b class="nc">&nbsp; popup.getContent().add(popupCards);</b>
<b class="nc">&nbsp; popup.setAutoHide(false);</b>
<b class="nc">&nbsp; popup.addEventHandler(Event.ANY, e -&gt; {</b>
<b class="nc">&nbsp; if (popup.getScene() != null) {</b>
<b class="nc">&nbsp; popup.getScene().setFill(Color.TRANSPARENT);</b>
&nbsp; }
&nbsp; });
&nbsp; }
&nbsp;
&nbsp; /** Centers the popup over the current window and makes it visible. */
&nbsp; private void showPopup() {
<b class="nc">&nbsp; Window window = myHand.getScene().getWindow();</b>
<b class="nc">&nbsp; popup.show(window, 0, 0);</b>
<b class="nc">&nbsp; popup.getScene().setFill(Color.TRANSPARENT);</b>
<b class="nc">&nbsp; popup.setX(window.getX() + (window.getWidth() - popup.getWidth()) / 2);</b>
<b class="nc">&nbsp; popup.setY(window.getY() + (window.getHeight() - popup.getHeight()) / 2);</b>
&nbsp; }
&nbsp;
&nbsp; /** Populates the popup with non-clickable card images and shows it. */
&nbsp; private void openPopup(ArrayList&lt;? extends PlayableCard&gt; cardList) {
<b class="nc">&nbsp; popupCards.getChildren().clear();</b>
<b class="nc">&nbsp; for (PlayableCard card : cardList) {</b>
<b class="nc">&nbsp; popupCards.getChildren().add(createCardPopup(card, false, false));</b>
&nbsp; }
<b class="nc">&nbsp; showPopup();</b>
&nbsp; }
&nbsp;
&nbsp; /** Populates the popup with clickable upper-building cards; clicking one draws it via the controller. */
&nbsp; private void openPopupUpperBuilding(ArrayList&lt;BuildingCard&gt; cardList) {
<b class="nc">&nbsp; popupCards.getChildren().clear();</b>
<b class="nc">&nbsp; for (int i = 0; i &lt; cardList.size(); i++) {</b>
<b class="nc">&nbsp; final int index = i;</b>
<b class="nc">&nbsp; StackPane img = createCardPopup(cardList.get(i), true, false);</b>
<b class="nc">&nbsp; img.setOnMouseClicked(e -&gt; {</b>
<b class="nc">&nbsp; popup.hide();</b>
<b class="nc">&nbsp; controller.drawUpperBuildingCard(index);</b>
&nbsp; });
<b class="nc">&nbsp; popupCards.getChildren().add(img);</b>
&nbsp; }
<b class="nc">&nbsp; showPopup();</b>
&nbsp; }
&nbsp;
&nbsp; /** Populates the popup with clickable lower-building cards; clicking one draws it via the controller. */
&nbsp; private void openPopupLowerBuilding(ArrayList&lt;BuildingCard&gt; cardList) {
<b class="nc">&nbsp; popupCards.getChildren().clear();</b>
<b class="nc">&nbsp; for (int i = 0; i &lt; cardList.size(); i++) {</b>
<b class="nc">&nbsp; final int index = i;</b>
<b class="nc">&nbsp; StackPane img = createCardPopup(cardList.get(i), true, false);</b>
<b class="nc">&nbsp; img.setOnMouseClicked(e -&gt; {</b>
<b class="nc">&nbsp; popup.hide();</b>
<b class="nc">&nbsp; controller.drawLowerBuildingCard(index);</b>
&nbsp; });
<b class="nc">&nbsp; popupCards.getChildren().add(img);</b>
&nbsp; }
<b class="nc">&nbsp; showPopup();</b>
&nbsp; }
&nbsp;
&nbsp; /** Shows the deck details/rules card in the popup. */
&nbsp; private void openDetailsPopup() {
<b class="nc">&nbsp; popupCards.getChildren().clear();</b>
<b class="nc">&nbsp; ImageView img = new ImageView(loadImage(&quot;/GUIImages/Backs/back-118.png&quot;));</b>
<b class="nc">&nbsp; img.setFitHeight(290);</b>
<b class="nc">&nbsp; img.setPreserveRatio(true);</b>
<b class="nc">&nbsp; addClip(img);</b>
<b class="nc">&nbsp; StackPane wrapper = new StackPane(img);</b>
<b class="nc">&nbsp; addShadow(wrapper);</b>
<b class="nc">&nbsp; popupCards.getChildren().add(wrapper);</b>
<b class="nc">&nbsp; showPopup();</b>
&nbsp; }
&nbsp;
&nbsp; /** Creates a fixed-height {@link StackPane} card widget suitable for use inside the popup. */
&nbsp; private StackPane createCardPopup(PlayableCard card, boolean withZoom, boolean withShadow) {
<b class="nc">&nbsp; ImageView img = new ImageView(loadImage(&quot;/GUIImages/Fronts/card-&quot; + card.getIdIMG() + &quot;.png&quot;));</b>
<b class="nc">&nbsp; img.setFitHeight(200);</b>
<b class="nc">&nbsp; img.setPreserveRatio(true);</b>
<b class="nc">&nbsp; addClip(img);</b>
<b class="nc">&nbsp; StackPane wrapper = new StackPane(img);</b>
<b class="nc">&nbsp; if (withShadow) addShadow(wrapper);</b>
<b class="nc">&nbsp; if (withZoom) addHoverZoom(wrapper);</b>
<b class="nc">&nbsp; return wrapper;</b>
&nbsp; }
&nbsp;}
</code>
</pre>
</div>
<script type="text/javascript">
(function() {
var msie = false, msie9 = false;
/*@cc_on
msie = true;
@if (@_jscript_version >= 9)
msie9 = true;
@end
@*/
if (!msie || msie && msie9) {
hljs.highlightAll()
hljs.initLineNumbersOnLoad();
}
})();
</script>
<div class="footer">
<div style="float:right;">generated on 2026-06-14 21:53</div>
</div>
</body>
</html>
@@ -0,0 +1,345 @@
<!DOCTYPE html>
<html id="htmlId">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Coverage Report > TotemFXMLController</title>
<style type="text/css">
@import "../../css/coverage.css";
@import "../../css/idea.min.css";
</style>
<script type="text/javascript" src="../../js/highlight.min.js"></script>
<script type="text/javascript" src="../../js/highlightjs-line-numbers.min.js"></script>
</head>
<body>
<div class="content">
<div class="breadCrumbs">
Current scope: <a href="../../index.html">all classes</a>
<span class="separator">|</span>
<a href="../index.html">it.polimi.ingsw.gc14.View.GUI</a>
</div>
<h1>Coverage Summary for Class: TotemFXMLController (it.polimi.ingsw.gc14.View.GUI)</h1>
<table class="coverageStats">
<tr>
<th class="name">Class</th>
<th class="coverageStat
">
Class, %
</th>
<th class="coverageStat
">
Method, %
</th>
<th class="coverageStat
">
Branch, %
</th>
<th class="coverageStat
">
Line, %
</th>
</tr>
<tr>
<td class="name">TotemFXMLController</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/16)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/24)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/90)
</span>
</td>
</tr>
</table>
<br/>
<br/>
<pre>
<code class="sourceCode" id="sourceCode">&nbsp;package it.polimi.ingsw.gc14.View.GUI;
&nbsp;
&nbsp;import it.polimi.ingsw.gc14.Controller.ClientController;
&nbsp;import it.polimi.ingsw.gc14.Model.Totems;
&nbsp;import javafx.animation.*;
&nbsp;import javafx.fxml.FXML;
&nbsp;import javafx.geometry.Pos;
&nbsp;import javafx.geometry.Rectangle2D;
&nbsp;import javafx.scene.Cursor;
&nbsp;import javafx.scene.control.Button;
&nbsp;import javafx.scene.control.Label;
&nbsp;import javafx.scene.image.Image;
&nbsp;import javafx.scene.image.ImageView;
&nbsp;import javafx.scene.layout.*;
&nbsp;import javafx.stage.Screen;
&nbsp;import javafx.util.Duration;
&nbsp;
&nbsp;import java.util.Locale;
&nbsp;
&nbsp;/**
&nbsp; * FXML controller for the totem selection scene.
&nbsp; *
&nbsp; * &lt;p&gt;Displays the available totems and lets the current player choose one;
&nbsp; * other players see a waiting banner.
&nbsp; */
<b class="nc">&nbsp;public class TotemFXMLController {</b>
&nbsp; //TODO
&nbsp; @FXML private ImageView backgroundImage;
&nbsp; //TODO
&nbsp; @FXML private HBox mainHBox;
&nbsp; //TODO
&nbsp; @FXML private Label turnBanner;
&nbsp; //TODO
&nbsp; @FXML private Button confirmButton;
&nbsp;
&nbsp; //TODO
&nbsp; private ClientController controller;
&nbsp; //TODO
<b class="nc">&nbsp; private int selectedIndex = -1;</b>
&nbsp; //TODO
<b class="nc">&nbsp; private StackPane selectedFrame = null;</b>
&nbsp;
&nbsp; /**
&nbsp; * Injects the client controller into this FXML controller.
&nbsp; *
&nbsp; * @param controller the client controller to use.
&nbsp; */
&nbsp; public void setController(ClientController controller) {
<b class="nc">&nbsp; this.controller = controller;</b>
&nbsp; }
&nbsp;
&nbsp; /** Initializes the scene: sets the background image to fill the screen. */
&nbsp; @FXML
&nbsp; public void initialize() {
<b class="nc">&nbsp; Image img = new Image(getClass().getResourceAsStream(&quot;/GUIImages/Background.png&quot;));</b>
<b class="nc">&nbsp; backgroundImage.setImage(img);</b>
<b class="nc">&nbsp; Rectangle2D screenBounds = Screen.getPrimary().getBounds();</b>
<b class="nc">&nbsp; backgroundImage.setFitWidth(screenBounds.getWidth());</b>
<b class="nc">&nbsp; backgroundImage.setFitHeight(screenBounds.getHeight());</b>
&nbsp; }
&nbsp;
&nbsp; /**
&nbsp; * Renders the totem selection cards with entry animations.
&nbsp; * Disables interaction for players who are not the current chooser.
&nbsp; */
&nbsp; public void render() {
<b class="nc">&nbsp; mainHBox.getChildren().clear();</b>
<b class="nc">&nbsp; selectedIndex = -1;</b>
<b class="nc">&nbsp; selectedFrame = null;</b>
&nbsp;
<b class="nc">&nbsp; if (controller.getMiniModel().currentState.getCurrentPlayer() == null) return;</b>
<b class="nc">&nbsp; String chooser = controller.getMiniModel().currentState.getCurrentPlayer().getUserName();</b>
<b class="nc">&nbsp; boolean myTurn = chooser.equals(controller.getMyUsername());</b>
&nbsp;
<b class="nc">&nbsp; updateBanner(chooser, myTurn);</b>
<b class="nc">&nbsp; updateConfirmButton(false);</b>
&nbsp;
<b class="nc">&nbsp; for (int i = 0; i &lt; controller.getMiniModel().availableTotems.size(); i++) {</b>
<b class="nc">&nbsp; Totems totem = controller.getMiniModel().availableTotems.get(i);</b>
<b class="nc">&nbsp; VBox card = buildCard(totem, i, myTurn);</b>
<b class="nc">&nbsp; mainHBox.getChildren().add(card);</b>
&nbsp;
<b class="nc">&nbsp; card.setOpacity(0);</b>
<b class="nc">&nbsp; card.setTranslateY(14);</b>
<b class="nc">&nbsp; PauseTransition delay = new PauseTransition(Duration.millis(80 + i * 65));</b>
<b class="nc">&nbsp; delay.setOnFinished(e -&gt; {</b>
<b class="nc">&nbsp; FadeTransition ft = new FadeTransition(Duration.millis(320), card);</b>
<b class="nc">&nbsp; ft.setToValue(1);</b>
<b class="nc">&nbsp; TranslateTransition tt = new TranslateTransition(Duration.millis(320), card);</b>
<b class="nc">&nbsp; tt.setToY(0);</b>
<b class="nc">&nbsp; new ParallelTransition(ft, tt).play();</b>
&nbsp; });
<b class="nc">&nbsp; delay.play();</b>
&nbsp; }
&nbsp; }
&nbsp;
&nbsp; /** Updates the turn banner text and style based on whether it is the local player&#39;s turn. */
&nbsp; private void updateBanner(String chooser, boolean myTurn) {
<b class="nc">&nbsp; if (myTurn) {</b>
<b class="nc">&nbsp; turnBanner.setText(&quot;✦ It&#39;s your turn to choose ✦&quot;);</b>
<b class="nc">&nbsp; turnBanner.setStyle(</b>
&nbsp; &quot;-fx-font-family: &#39;Cinzel&#39;; -fx-font-size: 13; -fx-font-weight: &#39;bold&#39;; -fx-letter-spacing: 3;&quot; +
&nbsp; &quot;-fx-text-fill: #000000;&quot; +
&nbsp; &quot;-fx-background-color: linear-gradient(to right, #f4c05a, #c8791a, #f4c05a);&quot; +
&nbsp; &quot;-fx-border-color: #000000; -fx-border-width: 1;&quot; +
&nbsp; &quot;-fx-border-radius: 3; -fx-background-radius: 3;&quot; +
&nbsp; &quot;-fx-padding: 10 28 10 28;&quot; +
&nbsp; &quot;-fx-effect: dropshadow(gaussian, rgba(244,192,90,0.3), 18, 0, 0, 0);&quot;
&nbsp; );
&nbsp; } else {
<b class="nc">&nbsp; turnBanner.setText(&quot;Waiting for &quot; + chooser + &quot; to choose his totem…&quot;);</b>
<b class="nc">&nbsp; turnBanner.setStyle(</b>
&nbsp; &quot;-fx-font-family: &#39;Cinzel&#39;; -fx-font-size: 11; -fx-letter-spacing: 2;&quot; +
&nbsp; &quot;-fx-text-fill: #000000;&quot; +
&nbsp; &quot;-fx-background-color: linear-gradient(to right, #f4c05a, #c8791a, #f4c05a);&quot; +
&nbsp; &quot;-fx-border-color: #000000; -fx-border-width: 1;&quot; +
&nbsp; &quot;-fx-border-radius: 3; -fx-background-radius: 3;&quot; +
&nbsp; &quot;-fx-padding: 10 28 10 28;&quot;
&nbsp; );
&nbsp; }
&nbsp; }
&nbsp;
&nbsp; /** Builds a totem card widget; if {@code interactive}, wires click/hover handlers and selection logic. */
&nbsp; private VBox buildCard(Totems totem, int idx, boolean interactive) {
<b class="nc">&nbsp; ImageView img = new ImageView(new Image(getClass().getResourceAsStream(&quot;/GUIImages/Totems/totem_&quot; + String.valueOf(totem).toLowerCase(Locale.ROOT) + &quot;.png&quot;)));</b>
<b class="nc">&nbsp; img.setFitHeight(150);</b>
<b class="nc">&nbsp; img.setPreserveRatio(true);</b>
&nbsp;
<b class="nc">&nbsp; StackPane frame = new StackPane(img);</b>
<b class="nc">&nbsp; frame.setPrefSize(100, 145);</b>
<b class="nc">&nbsp; frame.setBackground(Background.EMPTY);</b>
<b class="nc">&nbsp; img.setStyle(frameStyle(false));</b>
&nbsp;
<b class="nc">&nbsp; Region base = new Region();</b>
<b class="nc">&nbsp; base.setPrefSize(100, 10);</b>
&nbsp;
<b class="nc">&nbsp; Label name = new Label(capitalize(totem));</b>
<b class="nc">&nbsp; name.setStyle(nameStyle(false));</b>
&nbsp;
<b class="nc">&nbsp; VBox card = new VBox(4, frame, base, name);</b>
<b class="nc">&nbsp; card.setAlignment(Pos.CENTER);</b>
&nbsp;
<b class="nc">&nbsp; if (!interactive) {</b>
<b class="nc">&nbsp; card.setOpacity(0.35);</b>
<b class="nc">&nbsp; card.setCursor(Cursor.DEFAULT);</b>
<b class="nc">&nbsp; return card;</b>
&nbsp; }
&nbsp;
<b class="nc">&nbsp; card.setCursor(Cursor.HAND);</b>
&nbsp;
<b class="nc">&nbsp; card.setOnMouseEntered(e -&gt; {</b>
<b class="nc">&nbsp; if (frame != selectedFrame) {</b>
<b class="nc">&nbsp; ScaleTransition st = new ScaleTransition(Duration.millis(140), card);</b>
<b class="nc">&nbsp; st.setToX(1.06); st.setToY(1.06); st.play();</b>
&nbsp; }
&nbsp; });
<b class="nc">&nbsp; card.setOnMouseExited(e -&gt; {</b>
<b class="nc">&nbsp; if (frame != selectedFrame) {</b>
<b class="nc">&nbsp; ScaleTransition st = new ScaleTransition(Duration.millis(140), card);</b>
<b class="nc">&nbsp; st.setToX(1.0); st.setToY(1.0); st.play();</b>
&nbsp; }
&nbsp; });
&nbsp;
<b class="nc">&nbsp; card.setOnMouseClicked(e -&gt; {</b>
<b class="nc">&nbsp; mainHBox.getChildren().forEach(n -&gt; {</b>
<b class="nc">&nbsp; if (n instanceof VBox v) {</b>
<b class="nc">&nbsp; StackPane f = (StackPane) v.getChildren().get(0);</b>
<b class="nc">&nbsp; Label l = (Label) v.getChildren().get(2);</b>
<b class="nc">&nbsp; f.setStyle(frameStyle(false));</b>
<b class="nc">&nbsp; l.setStyle(nameStyle(false));</b>
<b class="nc">&nbsp; ScaleTransition st = new ScaleTransition(Duration.millis(130), v);</b>
<b class="nc">&nbsp; st.setToX(1.0); st.setToY(1.0); st.play();</b>
&nbsp; }
&nbsp; });
&nbsp;
<b class="nc">&nbsp; frame.setStyle(frameStyle(true));</b>
<b class="nc">&nbsp; name.setStyle(nameStyle(true));</b>
<b class="nc">&nbsp; selectedFrame = frame;</b>
<b class="nc">&nbsp; selectedIndex = idx;</b>
&nbsp;
<b class="nc">&nbsp; ScaleTransition pop = new ScaleTransition(Duration.millis(160), card);</b>
<b class="nc">&nbsp; pop.setToX(1.08); pop.setToY(1.08);</b>
<b class="nc">&nbsp; pop.setAutoReverse(true); pop.setCycleCount(2); pop.play();</b>
&nbsp;
<b class="nc">&nbsp; updateConfirmButton(true);</b>
&nbsp; });
&nbsp;
<b class="nc">&nbsp; return card;</b>
&nbsp; }
&nbsp;
&nbsp; /** Enables or disables the confirm button and updates its visual opacity to reflect the state. */
&nbsp; private void updateConfirmButton(boolean enabled) {
<b class="nc">&nbsp; confirmButton.setDisable(!enabled);</b>
<b class="nc">&nbsp; confirmButton.setStyle(</b>
&nbsp; &quot;-fx-font-family: &#39;Cinzel&#39;; -fx-font-size: 12; -fx-font-weight: bold;&quot; +
&nbsp; &quot;-fx-letter-spacing: 4; -fx-text-fill: #0c0601;&quot; +
&nbsp; &quot;-fx-background-color: linear-gradient(to right, #f4c05a, #c8791a, #f4c05a);&quot; +
&nbsp; &quot;-fx-padding: 12 48 12 48; -fx-background-radius: 2;&quot; +
<b class="nc">&nbsp; &quot;-fx-opacity: &quot; + (enabled ? &quot;1.0&quot; : &quot;0.3&quot;) + &quot;;&quot; +</b>
<b class="nc">&nbsp; &quot;-fx-cursor: &quot; + (enabled ? &quot;hand&quot; : &quot;default&quot;) + &quot;;&quot;</b>
&nbsp; );
&nbsp; }
&nbsp;
&nbsp; /** Returns the CSS style string for the totem card frame, highlighting it when {@code selected}. */
&nbsp; private String frameStyle(boolean selected) {
<b class="nc">&nbsp; return selected ? &quot;-fx-effect: dropshadow(gaussian, #ffffff, 20, 0.33, 0, 0);&quot; : &quot;&quot;;</b>
&nbsp; }
&nbsp;
&nbsp; /** Returns the CSS style string for the totem name label, brightening it when {@code selected}. */
&nbsp; private String nameStyle(boolean selected) {
&nbsp; return &quot;-fx-font-family: &#39;Cinzel&#39;; -fx-font-size: 10; -fx-letter-spacing: 2;&quot; +
<b class="nc">&nbsp; &quot;-fx-text-fill: &quot; + (selected ? &quot;#FFD700&quot; : &quot;#ffffff&quot;) + &quot;;&quot;;</b>
&nbsp; }
&nbsp;
&nbsp; /** Returns the totem name with only the first letter capitalised. */
&nbsp; private String capitalize(Totems t) {
<b class="nc">&nbsp; String s = t.name().toLowerCase(Locale.ROOT);</b>
<b class="nc">&nbsp; return Character.toUpperCase(s.charAt(0)) + s.substring(1);</b>
&nbsp; }
&nbsp;
&nbsp;
&nbsp; /** Submits the selected totem index to the controller when the confirm button is clicked. */
&nbsp; @FXML
&nbsp; private void onConfirm() {
<b class="nc">&nbsp; if (selectedIndex &gt;= 0) {</b>
<b class="nc">&nbsp; controller.totemChoice(selectedIndex);</b>
&nbsp; }
&nbsp; }
&nbsp;}
</code>
</pre>
</div>
<script type="text/javascript">
(function() {
var msie = false, msie9 = false;
/*@cc_on
msie = true;
@if (@_jscript_version >= 9)
msie9 = true;
@end
@*/
if (!msie || msie && msie9) {
hljs.highlightAll()
hljs.initLineNumbersOnLoad();
}
})();
</script>
<div class="footer">
<div style="float:right;">generated on 2026-06-14 21:53</div>
</div>
</body>
</html>
@@ -0,0 +1,230 @@
<!DOCTYPE html>
<html id="htmlId">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Coverage Report > it.polimi.ingsw.gc14.View.TUI</title>
<style type="text/css">
@import "../css/coverage.css";
@import "../css/idea.min.css";
</style>
<script type="text/javascript" src="../js/highlight.min.js"></script>
<script type="text/javascript" src="../js/highlightjs-line-numbers.min.js"></script>
</head>
<body>
<div class="content">
<div class="breadCrumbs">
Current scope: <a href="../index.html">all classes</a>
<span class="separator">|</span>
it.polimi.ingsw.gc14.View.TUI</div>
<h1>Coverage Summary for Package: it.polimi.ingsw.gc14.View.TUI</h1>
<table class="coverageStats">
<tr>
<th class="name">Package</th>
<th class="coverageStat
">
Class, %
</th>
<th class="coverageStat
">
Method, %
</th>
<th class="coverageStat
">
Branch, %
</th>
<th class="coverageStat
">
Line, %
</th>
</tr>
<tr>
<td class="name">it.polimi.ingsw.gc14.View.TUI</td>
<td class="coverageStat">
<span class="percent">
66.7%
</span>
<span class="absValue">
(2/3)
</span>
</td>
<td class="coverageStat">
<span class="percent">
53.3%
</span>
<span class="absValue">
(24/45)
</span>
</td>
<td class="coverageStat">
<span class="percent">
26.7%
</span>
<span class="absValue">
(40/150)
</span>
</td>
<td class="coverageStat">
<span class="percent">
38.7%
</span>
<span class="absValue">
(84/217)
</span>
</td>
</tr>
</table>
<br/>
<br/>
<table class="coverageStats">
<tr>
<th class="name sortedAsc
">
<a href="index_SORT_BY_NAME_DESC.html">Class</a> </th>
<th class="coverageStat
">
<a href="index_SORT_BY_CLASS.html">Class, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_METHOD.html">Method, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_BLOCK.html">Branch, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_LINE.html">Line, %</a>
</th>
</tr>
<tr>
<td class="name"><a href="sources/source-1.html">AsciiTable</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(1/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
90.9%
</span>
<span class="absValue">
(10/11)
</span>
</td>
<td class="coverageStat">
<span class="percent">
52.6%
</span>
<span class="absValue">
(40/76)
</span>
</td>
<td class="coverageStat">
<span class="percent">
82.2%
</span>
<span class="absValue">
(60/73)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-2.html">BorderStyle</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(1/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
82.4%
</span>
<span class="absValue">
(14/17)
</span>
</td>
<td class="coverageStat"/>
<td class="coverageStat">
<span class="percent">
88.9%
</span>
<span class="absValue">
(24/27)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-3.html">TUI</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/17)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/74)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/117)
</span>
</td>
</tr>
</table>
</div>
<script type="text/javascript">
(function() {
var msie = false, msie9 = false;
/*@cc_on
msie = true;
@if (@_jscript_version >= 9)
msie9 = true;
@end
@*/
if (!msie || msie && msie9) {
hljs.highlightAll()
hljs.initLineNumbersOnLoad();
}
})();
</script>
<div class="footer">
<div style="float:right;">generated on 2026-06-14 21:53</div>
</div>
</body>
</html>
@@ -0,0 +1,230 @@
<!DOCTYPE html>
<html id="htmlId">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Coverage Report > it.polimi.ingsw.gc14.View.TUI</title>
<style type="text/css">
@import "../css/coverage.css";
@import "../css/idea.min.css";
</style>
<script type="text/javascript" src="../js/highlight.min.js"></script>
<script type="text/javascript" src="../js/highlightjs-line-numbers.min.js"></script>
</head>
<body>
<div class="content">
<div class="breadCrumbs">
Current scope: <a href="../index_SORT_BY_BLOCK.html">all classes</a>
<span class="separator">|</span>
it.polimi.ingsw.gc14.View.TUI</div>
<h1>Coverage Summary for Package: it.polimi.ingsw.gc14.View.TUI</h1>
<table class="coverageStats">
<tr>
<th class="name">Package</th>
<th class="coverageStat
">
Class, %
</th>
<th class="coverageStat
">
Method, %
</th>
<th class="coverageStat
">
Branch, %
</th>
<th class="coverageStat
">
Line, %
</th>
</tr>
<tr>
<td class="name">it.polimi.ingsw.gc14.View.TUI</td>
<td class="coverageStat">
<span class="percent">
66.7%
</span>
<span class="absValue">
(2/3)
</span>
</td>
<td class="coverageStat">
<span class="percent">
53.3%
</span>
<span class="absValue">
(24/45)
</span>
</td>
<td class="coverageStat">
<span class="percent">
26.7%
</span>
<span class="absValue">
(40/150)
</span>
</td>
<td class="coverageStat">
<span class="percent">
38.7%
</span>
<span class="absValue">
(84/217)
</span>
</td>
</tr>
</table>
<br/>
<br/>
<table class="coverageStats">
<tr>
<th class="name
">
<a href="index.html">Class</a> </th>
<th class="coverageStat
">
<a href="index_SORT_BY_CLASS.html">Class, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_METHOD.html">Method, %</a>
</th>
<th class="coverageStat sortedAsc
">
<a href="index_SORT_BY_BLOCK_DESC.html">Branch, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_LINE.html">Line, %</a>
</th>
</tr>
<tr>
<td class="name"><a href="sources/source-2.html">BorderStyle</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(1/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
82.4%
</span>
<span class="absValue">
(14/17)
</span>
</td>
<td class="coverageStat"/>
<td class="coverageStat">
<span class="percent">
88.9%
</span>
<span class="absValue">
(24/27)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-3.html">TUI</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/17)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/74)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/117)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-1.html">AsciiTable</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(1/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
90.9%
</span>
<span class="absValue">
(10/11)
</span>
</td>
<td class="coverageStat">
<span class="percent">
52.6%
</span>
<span class="absValue">
(40/76)
</span>
</td>
<td class="coverageStat">
<span class="percent">
82.2%
</span>
<span class="absValue">
(60/73)
</span>
</td>
</tr>
</table>
</div>
<script type="text/javascript">
(function() {
var msie = false, msie9 = false;
/*@cc_on
msie = true;
@if (@_jscript_version >= 9)
msie9 = true;
@end
@*/
if (!msie || msie && msie9) {
hljs.highlightAll()
hljs.initLineNumbersOnLoad();
}
})();
</script>
<div class="footer">
<div style="float:right;">generated on 2026-06-14 21:53</div>
</div>
</body>
</html>
@@ -0,0 +1,230 @@
<!DOCTYPE html>
<html id="htmlId">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Coverage Report > it.polimi.ingsw.gc14.View.TUI</title>
<style type="text/css">
@import "../css/coverage.css";
@import "../css/idea.min.css";
</style>
<script type="text/javascript" src="../js/highlight.min.js"></script>
<script type="text/javascript" src="../js/highlightjs-line-numbers.min.js"></script>
</head>
<body>
<div class="content">
<div class="breadCrumbs">
Current scope: <a href="../index_SORT_BY_BLOCK_DESC.html">all classes</a>
<span class="separator">|</span>
it.polimi.ingsw.gc14.View.TUI</div>
<h1>Coverage Summary for Package: it.polimi.ingsw.gc14.View.TUI</h1>
<table class="coverageStats">
<tr>
<th class="name">Package</th>
<th class="coverageStat
">
Class, %
</th>
<th class="coverageStat
">
Method, %
</th>
<th class="coverageStat
">
Branch, %
</th>
<th class="coverageStat
">
Line, %
</th>
</tr>
<tr>
<td class="name">it.polimi.ingsw.gc14.View.TUI</td>
<td class="coverageStat">
<span class="percent">
66.7%
</span>
<span class="absValue">
(2/3)
</span>
</td>
<td class="coverageStat">
<span class="percent">
53.3%
</span>
<span class="absValue">
(24/45)
</span>
</td>
<td class="coverageStat">
<span class="percent">
26.7%
</span>
<span class="absValue">
(40/150)
</span>
</td>
<td class="coverageStat">
<span class="percent">
38.7%
</span>
<span class="absValue">
(84/217)
</span>
</td>
</tr>
</table>
<br/>
<br/>
<table class="coverageStats">
<tr>
<th class="name
">
<a href="index.html">Class</a> </th>
<th class="coverageStat
">
<a href="index_SORT_BY_CLASS.html">Class, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_METHOD.html">Method, %</a>
</th>
<th class="coverageStat sortedDesc
">
<a href="index_SORT_BY_BLOCK.html">Branch, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_LINE.html">Line, %</a>
</th>
</tr>
<tr>
<td class="name"><a href="sources/source-1.html">AsciiTable</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(1/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
90.9%
</span>
<span class="absValue">
(10/11)
</span>
</td>
<td class="coverageStat">
<span class="percent">
52.6%
</span>
<span class="absValue">
(40/76)
</span>
</td>
<td class="coverageStat">
<span class="percent">
82.2%
</span>
<span class="absValue">
(60/73)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-3.html">TUI</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/17)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/74)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/117)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-2.html">BorderStyle</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(1/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
82.4%
</span>
<span class="absValue">
(14/17)
</span>
</td>
<td class="coverageStat"/>
<td class="coverageStat">
<span class="percent">
88.9%
</span>
<span class="absValue">
(24/27)
</span>
</td>
</tr>
</table>
</div>
<script type="text/javascript">
(function() {
var msie = false, msie9 = false;
/*@cc_on
msie = true;
@if (@_jscript_version >= 9)
msie9 = true;
@end
@*/
if (!msie || msie && msie9) {
hljs.highlightAll()
hljs.initLineNumbersOnLoad();
}
})();
</script>
<div class="footer">
<div style="float:right;">generated on 2026-06-14 21:53</div>
</div>
</body>
</html>
@@ -0,0 +1,230 @@
<!DOCTYPE html>
<html id="htmlId">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Coverage Report > it.polimi.ingsw.gc14.View.TUI</title>
<style type="text/css">
@import "../css/coverage.css";
@import "../css/idea.min.css";
</style>
<script type="text/javascript" src="../js/highlight.min.js"></script>
<script type="text/javascript" src="../js/highlightjs-line-numbers.min.js"></script>
</head>
<body>
<div class="content">
<div class="breadCrumbs">
Current scope: <a href="../index_SORT_BY_CLASS.html">all classes</a>
<span class="separator">|</span>
it.polimi.ingsw.gc14.View.TUI</div>
<h1>Coverage Summary for Package: it.polimi.ingsw.gc14.View.TUI</h1>
<table class="coverageStats">
<tr>
<th class="name">Package</th>
<th class="coverageStat
">
Class, %
</th>
<th class="coverageStat
">
Method, %
</th>
<th class="coverageStat
">
Branch, %
</th>
<th class="coverageStat
">
Line, %
</th>
</tr>
<tr>
<td class="name">it.polimi.ingsw.gc14.View.TUI</td>
<td class="coverageStat">
<span class="percent">
66.7%
</span>
<span class="absValue">
(2/3)
</span>
</td>
<td class="coverageStat">
<span class="percent">
53.3%
</span>
<span class="absValue">
(24/45)
</span>
</td>
<td class="coverageStat">
<span class="percent">
26.7%
</span>
<span class="absValue">
(40/150)
</span>
</td>
<td class="coverageStat">
<span class="percent">
38.7%
</span>
<span class="absValue">
(84/217)
</span>
</td>
</tr>
</table>
<br/>
<br/>
<table class="coverageStats">
<tr>
<th class="name
">
<a href="index.html">Class</a> </th>
<th class="coverageStat sortedAsc
">
<a href="index_SORT_BY_CLASS_DESC.html">Class, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_METHOD.html">Method, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_BLOCK.html">Branch, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_LINE.html">Line, %</a>
</th>
</tr>
<tr>
<td class="name"><a href="sources/source-3.html">TUI</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/17)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/74)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/117)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-1.html">AsciiTable</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(1/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
90.9%
</span>
<span class="absValue">
(10/11)
</span>
</td>
<td class="coverageStat">
<span class="percent">
52.6%
</span>
<span class="absValue">
(40/76)
</span>
</td>
<td class="coverageStat">
<span class="percent">
82.2%
</span>
<span class="absValue">
(60/73)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-2.html">BorderStyle</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(1/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
82.4%
</span>
<span class="absValue">
(14/17)
</span>
</td>
<td class="coverageStat"/>
<td class="coverageStat">
<span class="percent">
88.9%
</span>
<span class="absValue">
(24/27)
</span>
</td>
</tr>
</table>
</div>
<script type="text/javascript">
(function() {
var msie = false, msie9 = false;
/*@cc_on
msie = true;
@if (@_jscript_version >= 9)
msie9 = true;
@end
@*/
if (!msie || msie && msie9) {
hljs.highlightAll()
hljs.initLineNumbersOnLoad();
}
})();
</script>
<div class="footer">
<div style="float:right;">generated on 2026-06-14 21:53</div>
</div>
</body>
</html>
@@ -0,0 +1,230 @@
<!DOCTYPE html>
<html id="htmlId">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Coverage Report > it.polimi.ingsw.gc14.View.TUI</title>
<style type="text/css">
@import "../css/coverage.css";
@import "../css/idea.min.css";
</style>
<script type="text/javascript" src="../js/highlight.min.js"></script>
<script type="text/javascript" src="../js/highlightjs-line-numbers.min.js"></script>
</head>
<body>
<div class="content">
<div class="breadCrumbs">
Current scope: <a href="../index_SORT_BY_CLASS_DESC.html">all classes</a>
<span class="separator">|</span>
it.polimi.ingsw.gc14.View.TUI</div>
<h1>Coverage Summary for Package: it.polimi.ingsw.gc14.View.TUI</h1>
<table class="coverageStats">
<tr>
<th class="name">Package</th>
<th class="coverageStat
">
Class, %
</th>
<th class="coverageStat
">
Method, %
</th>
<th class="coverageStat
">
Branch, %
</th>
<th class="coverageStat
">
Line, %
</th>
</tr>
<tr>
<td class="name">it.polimi.ingsw.gc14.View.TUI</td>
<td class="coverageStat">
<span class="percent">
66.7%
</span>
<span class="absValue">
(2/3)
</span>
</td>
<td class="coverageStat">
<span class="percent">
53.3%
</span>
<span class="absValue">
(24/45)
</span>
</td>
<td class="coverageStat">
<span class="percent">
26.7%
</span>
<span class="absValue">
(40/150)
</span>
</td>
<td class="coverageStat">
<span class="percent">
38.7%
</span>
<span class="absValue">
(84/217)
</span>
</td>
</tr>
</table>
<br/>
<br/>
<table class="coverageStats">
<tr>
<th class="name
">
<a href="index.html">Class</a> </th>
<th class="coverageStat sortedDesc
">
<a href="index_SORT_BY_CLASS.html">Class, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_METHOD.html">Method, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_BLOCK.html">Branch, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_LINE.html">Line, %</a>
</th>
</tr>
<tr>
<td class="name"><a href="sources/source-2.html">BorderStyle</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(1/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
82.4%
</span>
<span class="absValue">
(14/17)
</span>
</td>
<td class="coverageStat"/>
<td class="coverageStat">
<span class="percent">
88.9%
</span>
<span class="absValue">
(24/27)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-1.html">AsciiTable</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(1/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
90.9%
</span>
<span class="absValue">
(10/11)
</span>
</td>
<td class="coverageStat">
<span class="percent">
52.6%
</span>
<span class="absValue">
(40/76)
</span>
</td>
<td class="coverageStat">
<span class="percent">
82.2%
</span>
<span class="absValue">
(60/73)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-3.html">TUI</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/17)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/74)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/117)
</span>
</td>
</tr>
</table>
</div>
<script type="text/javascript">
(function() {
var msie = false, msie9 = false;
/*@cc_on
msie = true;
@if (@_jscript_version >= 9)
msie9 = true;
@end
@*/
if (!msie || msie && msie9) {
hljs.highlightAll()
hljs.initLineNumbersOnLoad();
}
})();
</script>
<div class="footer">
<div style="float:right;">generated on 2026-06-14 21:53</div>
</div>
</body>
</html>
@@ -0,0 +1,230 @@
<!DOCTYPE html>
<html id="htmlId">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Coverage Report > it.polimi.ingsw.gc14.View.TUI</title>
<style type="text/css">
@import "../css/coverage.css";
@import "../css/idea.min.css";
</style>
<script type="text/javascript" src="../js/highlight.min.js"></script>
<script type="text/javascript" src="../js/highlightjs-line-numbers.min.js"></script>
</head>
<body>
<div class="content">
<div class="breadCrumbs">
Current scope: <a href="../index_SORT_BY_LINE.html">all classes</a>
<span class="separator">|</span>
it.polimi.ingsw.gc14.View.TUI</div>
<h1>Coverage Summary for Package: it.polimi.ingsw.gc14.View.TUI</h1>
<table class="coverageStats">
<tr>
<th class="name">Package</th>
<th class="coverageStat
">
Class, %
</th>
<th class="coverageStat
">
Method, %
</th>
<th class="coverageStat
">
Branch, %
</th>
<th class="coverageStat
">
Line, %
</th>
</tr>
<tr>
<td class="name">it.polimi.ingsw.gc14.View.TUI</td>
<td class="coverageStat">
<span class="percent">
66.7%
</span>
<span class="absValue">
(2/3)
</span>
</td>
<td class="coverageStat">
<span class="percent">
53.3%
</span>
<span class="absValue">
(24/45)
</span>
</td>
<td class="coverageStat">
<span class="percent">
26.7%
</span>
<span class="absValue">
(40/150)
</span>
</td>
<td class="coverageStat">
<span class="percent">
38.7%
</span>
<span class="absValue">
(84/217)
</span>
</td>
</tr>
</table>
<br/>
<br/>
<table class="coverageStats">
<tr>
<th class="name
">
<a href="index.html">Class</a> </th>
<th class="coverageStat
">
<a href="index_SORT_BY_CLASS.html">Class, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_METHOD.html">Method, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_BLOCK.html">Branch, %</a>
</th>
<th class="coverageStat sortedAsc
">
<a href="index_SORT_BY_LINE_DESC.html">Line, %</a>
</th>
</tr>
<tr>
<td class="name"><a href="sources/source-3.html">TUI</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/17)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/74)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/117)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-1.html">AsciiTable</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(1/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
90.9%
</span>
<span class="absValue">
(10/11)
</span>
</td>
<td class="coverageStat">
<span class="percent">
52.6%
</span>
<span class="absValue">
(40/76)
</span>
</td>
<td class="coverageStat">
<span class="percent">
82.2%
</span>
<span class="absValue">
(60/73)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-2.html">BorderStyle</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(1/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
82.4%
</span>
<span class="absValue">
(14/17)
</span>
</td>
<td class="coverageStat"/>
<td class="coverageStat">
<span class="percent">
88.9%
</span>
<span class="absValue">
(24/27)
</span>
</td>
</tr>
</table>
</div>
<script type="text/javascript">
(function() {
var msie = false, msie9 = false;
/*@cc_on
msie = true;
@if (@_jscript_version >= 9)
msie9 = true;
@end
@*/
if (!msie || msie && msie9) {
hljs.highlightAll()
hljs.initLineNumbersOnLoad();
}
})();
</script>
<div class="footer">
<div style="float:right;">generated on 2026-06-14 21:53</div>
</div>
</body>
</html>
@@ -0,0 +1,230 @@
<!DOCTYPE html>
<html id="htmlId">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Coverage Report > it.polimi.ingsw.gc14.View.TUI</title>
<style type="text/css">
@import "../css/coverage.css";
@import "../css/idea.min.css";
</style>
<script type="text/javascript" src="../js/highlight.min.js"></script>
<script type="text/javascript" src="../js/highlightjs-line-numbers.min.js"></script>
</head>
<body>
<div class="content">
<div class="breadCrumbs">
Current scope: <a href="../index_SORT_BY_LINE_DESC.html">all classes</a>
<span class="separator">|</span>
it.polimi.ingsw.gc14.View.TUI</div>
<h1>Coverage Summary for Package: it.polimi.ingsw.gc14.View.TUI</h1>
<table class="coverageStats">
<tr>
<th class="name">Package</th>
<th class="coverageStat
">
Class, %
</th>
<th class="coverageStat
">
Method, %
</th>
<th class="coverageStat
">
Branch, %
</th>
<th class="coverageStat
">
Line, %
</th>
</tr>
<tr>
<td class="name">it.polimi.ingsw.gc14.View.TUI</td>
<td class="coverageStat">
<span class="percent">
66.7%
</span>
<span class="absValue">
(2/3)
</span>
</td>
<td class="coverageStat">
<span class="percent">
53.3%
</span>
<span class="absValue">
(24/45)
</span>
</td>
<td class="coverageStat">
<span class="percent">
26.7%
</span>
<span class="absValue">
(40/150)
</span>
</td>
<td class="coverageStat">
<span class="percent">
38.7%
</span>
<span class="absValue">
(84/217)
</span>
</td>
</tr>
</table>
<br/>
<br/>
<table class="coverageStats">
<tr>
<th class="name
">
<a href="index.html">Class</a> </th>
<th class="coverageStat
">
<a href="index_SORT_BY_CLASS.html">Class, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_METHOD.html">Method, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_BLOCK.html">Branch, %</a>
</th>
<th class="coverageStat sortedDesc
">
<a href="index_SORT_BY_LINE.html">Line, %</a>
</th>
</tr>
<tr>
<td class="name"><a href="sources/source-2.html">BorderStyle</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(1/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
82.4%
</span>
<span class="absValue">
(14/17)
</span>
</td>
<td class="coverageStat"/>
<td class="coverageStat">
<span class="percent">
88.9%
</span>
<span class="absValue">
(24/27)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-1.html">AsciiTable</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(1/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
90.9%
</span>
<span class="absValue">
(10/11)
</span>
</td>
<td class="coverageStat">
<span class="percent">
52.6%
</span>
<span class="absValue">
(40/76)
</span>
</td>
<td class="coverageStat">
<span class="percent">
82.2%
</span>
<span class="absValue">
(60/73)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-3.html">TUI</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/17)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/74)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/117)
</span>
</td>
</tr>
</table>
</div>
<script type="text/javascript">
(function() {
var msie = false, msie9 = false;
/*@cc_on
msie = true;
@if (@_jscript_version >= 9)
msie9 = true;
@end
@*/
if (!msie || msie && msie9) {
hljs.highlightAll()
hljs.initLineNumbersOnLoad();
}
})();
</script>
<div class="footer">
<div style="float:right;">generated on 2026-06-14 21:53</div>
</div>
</body>
</html>
@@ -0,0 +1,230 @@
<!DOCTYPE html>
<html id="htmlId">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Coverage Report > it.polimi.ingsw.gc14.View.TUI</title>
<style type="text/css">
@import "../css/coverage.css";
@import "../css/idea.min.css";
</style>
<script type="text/javascript" src="../js/highlight.min.js"></script>
<script type="text/javascript" src="../js/highlightjs-line-numbers.min.js"></script>
</head>
<body>
<div class="content">
<div class="breadCrumbs">
Current scope: <a href="../index_SORT_BY_METHOD.html">all classes</a>
<span class="separator">|</span>
it.polimi.ingsw.gc14.View.TUI</div>
<h1>Coverage Summary for Package: it.polimi.ingsw.gc14.View.TUI</h1>
<table class="coverageStats">
<tr>
<th class="name">Package</th>
<th class="coverageStat
">
Class, %
</th>
<th class="coverageStat
">
Method, %
</th>
<th class="coverageStat
">
Branch, %
</th>
<th class="coverageStat
">
Line, %
</th>
</tr>
<tr>
<td class="name">it.polimi.ingsw.gc14.View.TUI</td>
<td class="coverageStat">
<span class="percent">
66.7%
</span>
<span class="absValue">
(2/3)
</span>
</td>
<td class="coverageStat">
<span class="percent">
53.3%
</span>
<span class="absValue">
(24/45)
</span>
</td>
<td class="coverageStat">
<span class="percent">
26.7%
</span>
<span class="absValue">
(40/150)
</span>
</td>
<td class="coverageStat">
<span class="percent">
38.7%
</span>
<span class="absValue">
(84/217)
</span>
</td>
</tr>
</table>
<br/>
<br/>
<table class="coverageStats">
<tr>
<th class="name
">
<a href="index.html">Class</a> </th>
<th class="coverageStat
">
<a href="index_SORT_BY_CLASS.html">Class, %</a>
</th>
<th class="coverageStat sortedAsc
">
<a href="index_SORT_BY_METHOD_DESC.html">Method, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_BLOCK.html">Branch, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_LINE.html">Line, %</a>
</th>
</tr>
<tr>
<td class="name"><a href="sources/source-3.html">TUI</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/17)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/74)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/117)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-2.html">BorderStyle</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(1/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
82.4%
</span>
<span class="absValue">
(14/17)
</span>
</td>
<td class="coverageStat"/>
<td class="coverageStat">
<span class="percent">
88.9%
</span>
<span class="absValue">
(24/27)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-1.html">AsciiTable</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(1/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
90.9%
</span>
<span class="absValue">
(10/11)
</span>
</td>
<td class="coverageStat">
<span class="percent">
52.6%
</span>
<span class="absValue">
(40/76)
</span>
</td>
<td class="coverageStat">
<span class="percent">
82.2%
</span>
<span class="absValue">
(60/73)
</span>
</td>
</tr>
</table>
</div>
<script type="text/javascript">
(function() {
var msie = false, msie9 = false;
/*@cc_on
msie = true;
@if (@_jscript_version >= 9)
msie9 = true;
@end
@*/
if (!msie || msie && msie9) {
hljs.highlightAll()
hljs.initLineNumbersOnLoad();
}
})();
</script>
<div class="footer">
<div style="float:right;">generated on 2026-06-14 21:53</div>
</div>
</body>
</html>
@@ -0,0 +1,230 @@
<!DOCTYPE html>
<html id="htmlId">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Coverage Report > it.polimi.ingsw.gc14.View.TUI</title>
<style type="text/css">
@import "../css/coverage.css";
@import "../css/idea.min.css";
</style>
<script type="text/javascript" src="../js/highlight.min.js"></script>
<script type="text/javascript" src="../js/highlightjs-line-numbers.min.js"></script>
</head>
<body>
<div class="content">
<div class="breadCrumbs">
Current scope: <a href="../index_SORT_BY_METHOD_DESC.html">all classes</a>
<span class="separator">|</span>
it.polimi.ingsw.gc14.View.TUI</div>
<h1>Coverage Summary for Package: it.polimi.ingsw.gc14.View.TUI</h1>
<table class="coverageStats">
<tr>
<th class="name">Package</th>
<th class="coverageStat
">
Class, %
</th>
<th class="coverageStat
">
Method, %
</th>
<th class="coverageStat
">
Branch, %
</th>
<th class="coverageStat
">
Line, %
</th>
</tr>
<tr>
<td class="name">it.polimi.ingsw.gc14.View.TUI</td>
<td class="coverageStat">
<span class="percent">
66.7%
</span>
<span class="absValue">
(2/3)
</span>
</td>
<td class="coverageStat">
<span class="percent">
53.3%
</span>
<span class="absValue">
(24/45)
</span>
</td>
<td class="coverageStat">
<span class="percent">
26.7%
</span>
<span class="absValue">
(40/150)
</span>
</td>
<td class="coverageStat">
<span class="percent">
38.7%
</span>
<span class="absValue">
(84/217)
</span>
</td>
</tr>
</table>
<br/>
<br/>
<table class="coverageStats">
<tr>
<th class="name
">
<a href="index.html">Class</a> </th>
<th class="coverageStat
">
<a href="index_SORT_BY_CLASS.html">Class, %</a>
</th>
<th class="coverageStat sortedDesc
">
<a href="index_SORT_BY_METHOD.html">Method, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_BLOCK.html">Branch, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_LINE.html">Line, %</a>
</th>
</tr>
<tr>
<td class="name"><a href="sources/source-1.html">AsciiTable</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(1/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
90.9%
</span>
<span class="absValue">
(10/11)
</span>
</td>
<td class="coverageStat">
<span class="percent">
52.6%
</span>
<span class="absValue">
(40/76)
</span>
</td>
<td class="coverageStat">
<span class="percent">
82.2%
</span>
<span class="absValue">
(60/73)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-2.html">BorderStyle</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(1/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
82.4%
</span>
<span class="absValue">
(14/17)
</span>
</td>
<td class="coverageStat"/>
<td class="coverageStat">
<span class="percent">
88.9%
</span>
<span class="absValue">
(24/27)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-3.html">TUI</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/17)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/74)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/117)
</span>
</td>
</tr>
</table>
</div>
<script type="text/javascript">
(function() {
var msie = false, msie9 = false;
/*@cc_on
msie = true;
@if (@_jscript_version >= 9)
msie9 = true;
@end
@*/
if (!msie || msie && msie9) {
hljs.highlightAll()
hljs.initLineNumbersOnLoad();
}
})();
</script>
<div class="footer">
<div style="float:right;">generated on 2026-06-14 21:53</div>
</div>
</body>
</html>
@@ -0,0 +1,230 @@
<!DOCTYPE html>
<html id="htmlId">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Coverage Report > it.polimi.ingsw.gc14.View.TUI</title>
<style type="text/css">
@import "../css/coverage.css";
@import "../css/idea.min.css";
</style>
<script type="text/javascript" src="../js/highlight.min.js"></script>
<script type="text/javascript" src="../js/highlightjs-line-numbers.min.js"></script>
</head>
<body>
<div class="content">
<div class="breadCrumbs">
Current scope: <a href="../index_SORT_BY_NAME_DESC.html">all classes</a>
<span class="separator">|</span>
it.polimi.ingsw.gc14.View.TUI</div>
<h1>Coverage Summary for Package: it.polimi.ingsw.gc14.View.TUI</h1>
<table class="coverageStats">
<tr>
<th class="name">Package</th>
<th class="coverageStat
">
Class, %
</th>
<th class="coverageStat
">
Method, %
</th>
<th class="coverageStat
">
Branch, %
</th>
<th class="coverageStat
">
Line, %
</th>
</tr>
<tr>
<td class="name">it.polimi.ingsw.gc14.View.TUI</td>
<td class="coverageStat">
<span class="percent">
66.7%
</span>
<span class="absValue">
(2/3)
</span>
</td>
<td class="coverageStat">
<span class="percent">
53.3%
</span>
<span class="absValue">
(24/45)
</span>
</td>
<td class="coverageStat">
<span class="percent">
26.7%
</span>
<span class="absValue">
(40/150)
</span>
</td>
<td class="coverageStat">
<span class="percent">
38.7%
</span>
<span class="absValue">
(84/217)
</span>
</td>
</tr>
</table>
<br/>
<br/>
<table class="coverageStats">
<tr>
<th class="name sortedDesc
">
<a href="index.html">Class</a> </th>
<th class="coverageStat
">
<a href="index_SORT_BY_CLASS.html">Class, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_METHOD.html">Method, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_BLOCK.html">Branch, %</a>
</th>
<th class="coverageStat
">
<a href="index_SORT_BY_LINE.html">Line, %</a>
</th>
</tr>
<tr>
<td class="name"><a href="sources/source-3.html">TUI</a></td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/17)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/74)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/117)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-2.html">BorderStyle</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(1/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
82.4%
</span>
<span class="absValue">
(14/17)
</span>
</td>
<td class="coverageStat"/>
<td class="coverageStat">
<span class="percent">
88.9%
</span>
<span class="absValue">
(24/27)
</span>
</td>
</tr>
<tr>
<td class="name"><a href="sources/source-1.html">AsciiTable</a></td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(1/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
90.9%
</span>
<span class="absValue">
(10/11)
</span>
</td>
<td class="coverageStat">
<span class="percent">
52.6%
</span>
<span class="absValue">
(40/76)
</span>
</td>
<td class="coverageStat">
<span class="percent">
82.2%
</span>
<span class="absValue">
(60/73)
</span>
</td>
</tr>
</table>
</div>
<script type="text/javascript">
(function() {
var msie = false, msie9 = false;
/*@cc_on
msie = true;
@if (@_jscript_version >= 9)
msie9 = true;
@end
@*/
if (!msie || msie && msie9) {
hljs.highlightAll()
hljs.initLineNumbersOnLoad();
}
})();
</script>
<div class="footer">
<div style="float:right;">generated on 2026-06-14 21:53</div>
</div>
</body>
</html>
@@ -0,0 +1,279 @@
<!DOCTYPE html>
<html id="htmlId">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Coverage Report > AsciiTable</title>
<style type="text/css">
@import "../../css/coverage.css";
@import "../../css/idea.min.css";
</style>
<script type="text/javascript" src="../../js/highlight.min.js"></script>
<script type="text/javascript" src="../../js/highlightjs-line-numbers.min.js"></script>
</head>
<body>
<div class="content">
<div class="breadCrumbs">
Current scope: <a href="../../index.html">all classes</a>
<span class="separator">|</span>
<a href="../index.html">it.polimi.ingsw.gc14.View.TUI</a>
</div>
<h1>Coverage Summary for Class: AsciiTable (it.polimi.ingsw.gc14.View.TUI)</h1>
<table class="coverageStats">
<tr>
<th class="name">Class</th>
<th class="coverageStat
">
Class, %
</th>
<th class="coverageStat
">
Method, %
</th>
<th class="coverageStat
">
Branch, %
</th>
<th class="coverageStat
">
Line, %
</th>
</tr>
<tr>
<td class="name">AsciiTable</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(1/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
90.9%
</span>
<span class="absValue">
(10/11)
</span>
</td>
<td class="coverageStat">
<span class="percent">
52.6%
</span>
<span class="absValue">
(40/76)
</span>
</td>
<td class="coverageStat">
<span class="percent">
82.2%
</span>
<span class="absValue">
(60/73)
</span>
</td>
</tr>
</table>
<br/>
<br/>
<pre>
<code class="sourceCode" id="sourceCode">&nbsp;package it.polimi.ingsw.gc14.View.TUI;
&nbsp;import java.util.*;
&nbsp;
&nbsp;/**
&nbsp; * General-purpose helper for building fixed-width ASCII/Unicode tables in a TUI.
&nbsp; *
&nbsp; * &lt;p&gt;A table is built by adding rows one at a time, then calling {@link #build()}
&nbsp; * to obtain the fully rendered string. Column width is computed automatically
&nbsp; * from the widest cell across all rows.
&nbsp; *
&nbsp; * &lt;p&gt;Cell widths are measured in terminal columns, not Java {@code char} units:
&nbsp; * wide characters (emoji, CJK) count as 2 columns each.
&nbsp; *
&nbsp; * &lt;p&gt;Example usage:
&nbsp; * &lt;pre&gt;{@code
&nbsp; * AsciiTable table = new AsciiTable(BorderStyle.UNICODE, 3);
&nbsp; * table.addHeader(&quot;Name&quot;, &quot;🍖&quot;, &quot;⭐&quot;);
&nbsp; * table.addRow(&quot;Alice&quot;, &quot;4&quot;, &quot;12&quot;);
&nbsp; * table.addRow(&quot;Bob&quot;, &quot;2&quot;, &quot;8&quot;);
&nbsp; * System.out.println(table.build());
&nbsp; * }&lt;/pre&gt;
&nbsp; */
&nbsp;public class AsciiTable {
&nbsp; //TODO
&nbsp; private final BorderStyle s;
&nbsp; //TODO
&nbsp; private final int cols;
&nbsp; //TODO
<b class="fc">&nbsp; private final List&lt;List&lt;String&gt;&gt; rows = new ArrayList&lt;&gt;();</b>
&nbsp; //TODO
<b class="fc">&nbsp; private final List&lt;Integer&gt; separators = new ArrayList&lt;&gt;();</b>
&nbsp; //TODO
<b class="fc">&nbsp; public AsciiTable(BorderStyle s, int cols) {</b>
<b class="fc">&nbsp; this.s = s; this.cols = cols;</b>
&nbsp; }
&nbsp; //TODO
<b class="fc">&nbsp; public void addRow(String... cells) { rows.add(Arrays.asList(cells)); }</b>
&nbsp; //TODO
<b class="fc">&nbsp; public void addRow(List&lt;String&gt; cells) { rows.add(cells); }</b>
&nbsp; //TODO
&nbsp; public void addHeader(String... cells) {
<b class="fc">&nbsp; rows.add(0, Arrays.asList(cells));</b>
<b class="fc">&nbsp; separators.add(0);</b>
&nbsp; }
&nbsp; //TODO
<b class="fc">&nbsp; public void addSeparator() { separators.add(rows.size() - 1); }</b>
&nbsp;
&nbsp; /**
&nbsp; * Renders the table to a multi-line string.
&nbsp; * Column width is the widest cell in display columns (wide chars = 2), plus 1.
&nbsp; */
&nbsp; public String build() {
<b class="fc">&nbsp; var sb = new StringBuilder();</b>
<b class="fc">&nbsp; int maxWidth = rows.stream()</b>
<b class="fc">&nbsp; .mapToInt(x -&gt; x.stream().mapToInt(AsciiTable::displayWidth).max().orElse(0))</b>
<b class="fc">&nbsp; .max().orElse(0) + 1;</b>
<b class="fc">&nbsp; sb.append(hline(s.tl(), s.mt(), s.tr(), maxWidth)).append(&#39;\n&#39;);</b>
&nbsp;
<b class="fc">&nbsp; for (int i = 0; i &lt; rows.size(); i++) {</b>
<b class="fc">&nbsp; sb.append(s.v());</b>
<b class="fc">&nbsp; for (String cell : rows.get(i))</b>
<b class="fc">&nbsp; sb.append(rpad(&quot; &quot; + cell, maxWidth)).append(s.v());</b>
<b class="fc">&nbsp; sb.append(&#39;\n&#39;);</b>
<b class="pc">&nbsp; if (separators.contains(i) &amp;&amp; i &lt; rows.size() - 1)</b>
<b class="fc">&nbsp; sb.append(hline(s.sl(), s.sx(), s.sr(), maxWidth)).append(&#39;\n&#39;);</b>
&nbsp; }
<b class="fc">&nbsp; sb.append(hline(s.bl(), s.mb(), s.br(), maxWidth));</b>
<b class="fc">&nbsp; return sb.toString();</b>
&nbsp; }
&nbsp; //TODO
&nbsp; private String hline(String l, String m, String r, int maxWidth) {
<b class="fc">&nbsp; var sb = new StringBuilder(l);</b>
<b class="fc">&nbsp; for (int i = 0; i &lt; cols; i++) {</b>
<b class="fc">&nbsp; sb.append(s.h().repeat(maxWidth));</b>
<b class="fc">&nbsp; if (i &lt; cols - 1) sb.append(m);</b>
&nbsp; }
<b class="fc">&nbsp; return sb.append(r).toString();</b>
&nbsp; }
&nbsp;
&nbsp; /**
&nbsp; * Pads {@code s} with trailing spaces so its display width equals {@code w}.
&nbsp; * If the string is already at or over {@code w} columns, it is returned as-is.
&nbsp; */
&nbsp; private static String rpad(String s, int w) {
<b class="fc">&nbsp; int dw = displayWidth(s);</b>
<b class="fc">&nbsp; if (dw &gt;= w) return s;</b>
<b class="fc">&nbsp; return s + &quot; &quot;.repeat(w - dw);</b>
&nbsp; }
&nbsp;
&nbsp; /**
&nbsp; * Places two pre-rendered text blocks side by side, separated by a gap.
&nbsp; * Left-block lines are padded to a uniform display width so the right block
&nbsp; * always starts at the same column. Uses {@link #displayWidth} for measurement.
&nbsp; */
&nbsp; public static String sideBySide(List&lt;String&gt; left, List&lt;String&gt; right, int gap) {
<b class="nc">&nbsp; int leftWidth = left.stream().mapToInt(AsciiTable::displayWidth).max().orElse(0);</b>
<b class="nc">&nbsp; int maxHeight = Math.max(left.size(), right.size());</b>
<b class="nc">&nbsp; String padding = &quot; &quot;.repeat(gap);</b>
&nbsp;
<b class="nc">&nbsp; var sb = new StringBuilder();</b>
<b class="nc">&nbsp; for (int i = 0; i &lt; maxHeight; i++) {</b>
<b class="nc">&nbsp; String l = i &lt; left.size() ? left.get(i) : &quot; &quot;.repeat(leftWidth);</b>
<b class="nc">&nbsp; l = rpad(l, leftWidth);</b>
<b class="nc">&nbsp; String r = i &lt; right.size() ? right.get(i) : &quot;&quot;;</b>
<b class="nc">&nbsp; sb.append(l).append(padding).append(r).append(&#39;\n&#39;);</b>
&nbsp; }
<b class="nc">&nbsp; return sb.toString();</b>
&nbsp; }
&nbsp;
&nbsp; // ── Wide-character width ──────────────────────────────────────────────────
&nbsp;
&nbsp; /**
&nbsp; * Returns the number of terminal columns required to display {@code s}.
&nbsp; * Wide characters (emoji, CJK, full-width) count as 2; all others as 1.
&nbsp; */
&nbsp; public static int displayWidth(String s) {
<b class="fc">&nbsp; s = s.replaceAll(&quot;\033\\[[^m]*m&quot;, &quot;&quot;);</b>
<b class="fc">&nbsp; int w = 0;</b>
<b class="fc">&nbsp; for (int i = 0; i &lt; s.length(); ) {</b>
<b class="fc">&nbsp; int cp = s.codePointAt(i);</b>
<b class="fc">&nbsp; w += isWide(cp) ? 2 : 1;</b>
<b class="fc">&nbsp; i += Character.charCount(cp);</b>
&nbsp; }
<b class="fc">&nbsp; return w;</b>
&nbsp; }
&nbsp;
&nbsp; /**
&nbsp; * Returns {@code true} when {@code cp} is a wide (2-column) character.
&nbsp; * Covers CJK blocks, Hangul, full-width forms, and emoji (including
&nbsp; * the specific emoji used in this project: 🍖 U+1F357, ⭐ U+2B50).
&nbsp; */
&nbsp; private static boolean isWide(int cp) {
<b class="fc">&nbsp; if (cp &lt; 0x1100) return false;</b>
<b class="pc">&nbsp; if (cp &lt;= 0x115F) return true; // Hangul Jamo</b>
<b class="pc">&nbsp; if (cp &lt; 0x2E80) {</b>
&nbsp; // Specific wide symbols below 0x2E80
<b class="nc">&nbsp; return cp == 0x2B50 // ⭐ STAR</b>
&nbsp; || cp == 0x2B55; // ⭕ HEAVY LARGE CIRCLE
&nbsp; }
<b class="pc">&nbsp; if (cp &lt;= 0x303E) return true; // CJK Radicals, Kangxi, CJK Symbols</b>
<b class="pc">&nbsp; if (cp &lt; 0x3041) return false;</b>
<b class="pc">&nbsp; if (cp &lt;= 0xA4CF) return true; // Hiragana, Katakana, Bopomofo, CJK Unified</b>
<b class="pc">&nbsp; if (cp &lt; 0xA960) return false;</b>
<b class="pc">&nbsp; if (cp &lt;= 0xA97F) return true; // Hangul Jamo Extended-A</b>
<b class="pc">&nbsp; if (cp &lt; 0xAC00) return false;</b>
<b class="pc">&nbsp; if (cp &lt;= 0xD7AF) return true; // Hangul Syllables</b>
<b class="pc">&nbsp; if (cp &lt; 0xF900) return false;</b>
<b class="pc">&nbsp; if (cp &lt;= 0xFAFF) return true; // CJK Compatibility Ideographs</b>
<b class="pc">&nbsp; if (cp &lt; 0xFE10) return false;</b>
<b class="pc">&nbsp; if (cp &lt;= 0xFE1F) return true; // Vertical Forms</b>
<b class="pc">&nbsp; if (cp &lt; 0xFE30) return false;</b>
<b class="pc">&nbsp; if (cp &lt;= 0xFE6F) return true; // CJK Compatibility Forms</b>
<b class="pc">&nbsp; if (cp &lt; 0xFF00) return false;</b>
<b class="pc">&nbsp; if (cp &lt;= 0xFF60) return true; // Fullwidth Latin, punctuation</b>
<b class="pc">&nbsp; if (cp &lt; 0xFFE0) return false;</b>
<b class="pc">&nbsp; if (cp &lt;= 0xFFE6) return true; // Fullwidth Signs</b>
<b class="pc">&nbsp; if (cp &lt; 0x1F004) return false;</b>
<b class="pc">&nbsp; if (cp &lt;= 0x1FAFF) return true; // Emoji (mahjong, playing cards, flags,</b>
&nbsp; // misc symbols, transport, 🍖 U+1F357, ...)
<b class="nc">&nbsp; if (cp &lt; 0x20000) return false;</b>
<b class="nc">&nbsp; return cp &lt;= 0x3FFFD; // CJK Extension B through G</b>
&nbsp; }
&nbsp;}
</code>
</pre>
</div>
<script type="text/javascript">
(function() {
var msie = false, msie9 = false;
/*@cc_on
msie = true;
@if (@_jscript_version >= 9)
msie9 = true;
@end
@*/
if (!msie || msie && msie9) {
hljs.highlightAll()
hljs.initLineNumbersOnLoad();
}
})();
</script>
<div class="footer">
<div style="float:right;">generated on 2026-06-14 21:53</div>
</div>
</body>
</html>
@@ -0,0 +1,216 @@
<!DOCTYPE html>
<html id="htmlId">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Coverage Report > BorderStyle</title>
<style type="text/css">
@import "../../css/coverage.css";
@import "../../css/idea.min.css";
</style>
<script type="text/javascript" src="../../js/highlight.min.js"></script>
<script type="text/javascript" src="../../js/highlightjs-line-numbers.min.js"></script>
</head>
<body>
<div class="content">
<div class="breadCrumbs">
Current scope: <a href="../../index.html">all classes</a>
<span class="separator">|</span>
<a href="../index.html">it.polimi.ingsw.gc14.View.TUI</a>
</div>
<h1>Coverage Summary for Class: BorderStyle (it.polimi.ingsw.gc14.View.TUI)</h1>
<table class="coverageStats">
<tr>
<th class="name">Class</th>
<th class="coverageStat
">
Class, %
</th>
<th class="coverageStat
">
Method, %
</th>
<th class="coverageStat
">
Line, %
</th>
</tr>
<tr>
<td class="name">BorderStyle</td>
<td class="coverageStat">
<span class="percent">
100%
</span>
<span class="absValue">
(1/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
82.4%
</span>
<span class="absValue">
(14/17)
</span>
</td>
<td class="coverageStat">
<span class="percent">
88.9%
</span>
<span class="absValue">
(24/27)
</span>
</td>
</tr>
</table>
<br/>
<br/>
<pre>
<code class="sourceCode" id="sourceCode">&nbsp;package it.polimi.ingsw.gc14.View.TUI;
&nbsp;
&nbsp;/**
&nbsp; * Defines the available border styles used to render {@link AsciiTable}
&nbsp; * instances in the text-based user interface.
&nbsp; *
&nbsp; * &lt;p&gt;Each style stores the characters needed to draw table corners,
&nbsp; * horizontal and vertical lines, and junctions.
&nbsp; */
<b class="fc">&nbsp;public enum BorderStyle {</b>
&nbsp;
&nbsp; /**
&nbsp; * Unicode box-drawing border style.
&nbsp; */
<b class="fc">&nbsp; UNICODE(&quot;╔&quot;,&quot;╗&quot;,&quot;╚&quot;,&quot;╝&quot;,&quot;═&quot;,&quot;║&quot;,&quot;╠&quot;,&quot;╣&quot;,&quot;╦&quot;,&quot;╩&quot;,&quot;╬&quot;,&quot;├&quot;,&quot;┤&quot;,&quot;┼&quot;),</b>
&nbsp;
&nbsp; /**
&nbsp; * Plain ASCII border style.
&nbsp; */
<b class="fc">&nbsp; ASCII (&quot;+&quot;,&quot;+&quot;,&quot;+&quot;,&quot;+&quot;,&quot;-&quot;,&quot;|&quot;,&quot;+&quot;,&quot;+&quot;,&quot;+&quot;,&quot;+&quot;,&quot;+&quot;,&quot;+&quot;,&quot;+&quot;,&quot;+&quot;),</b>
&nbsp;
&nbsp; /**
&nbsp; * Rounded Unicode border style.
&nbsp; */
<b class="fc">&nbsp; ROUNDED(&quot;╭&quot;,&quot;╮&quot;,&quot;╰&quot;,&quot;╯&quot;,&quot;─&quot;,&quot;│&quot;,&quot;├&quot;,&quot;┤&quot;,&quot;┬&quot;,&quot;┴&quot;,&quot;┼&quot;,&quot;├&quot;,&quot;┤&quot;,&quot;┼&quot;);</b>
&nbsp;
&nbsp; private final String tl,tr,bl,br,h,v,ml,mr,mt,mb,x,sl,sr,sx;
&nbsp;
&nbsp; BorderStyle(String tl,String tr,String bl,String br,
&nbsp; String h, String v, String ml,String mr,
&nbsp; String mt,String mb,String x,
<b class="fc">&nbsp; String sl,String sr,String sx) {</b>
<b class="fc">&nbsp; this.tl = tl; this.tr = tr;</b>
<b class="fc">&nbsp; this.bl = bl; this.br = br;</b>
<b class="fc">&nbsp; this.h = h; this.v = v;</b>
<b class="fc">&nbsp; this.ml = ml; this.mr = mr;</b>
<b class="fc">&nbsp; this.mt = mt; this.mb = mb;</b>
<b class="fc">&nbsp; this.x = x;</b>
<b class="fc">&nbsp; this.sl = sl; this.sr = sr;</b>
<b class="fc">&nbsp; this.sx = sx;</b>
&nbsp; }
&nbsp;
&nbsp; /**
&nbsp; * @return the top-left corner character.
&nbsp; */
<b class="fc">&nbsp; public String tl() { return tl; }</b>
&nbsp;
&nbsp; /**
&nbsp; * @return the top-right corner character.
&nbsp; */
<b class="fc">&nbsp; public String tr() { return tr; }</b>
&nbsp;
&nbsp; /**
&nbsp; * @return the bottom-left corner character.
&nbsp; */
<b class="fc">&nbsp; public String bl() { return bl; }</b>
&nbsp;
&nbsp; /**
&nbsp; * @return the bottom-right corner character.
&nbsp; */
<b class="fc">&nbsp; public String br() { return br; }</b>
&nbsp;
&nbsp; /**
&nbsp; * @return the horizontal line character.
&nbsp; */
<b class="fc">&nbsp; public String h() { return h; }</b>
&nbsp;
&nbsp; /**
&nbsp; * @return the vertical line character.
&nbsp; */
<b class="fc">&nbsp; public String v() { return v; }</b>
&nbsp;
&nbsp; /**
&nbsp; * @return the middle-left junction character.
&nbsp; */
<b class="nc">&nbsp; public String ml() { return ml; }</b>
&nbsp;
&nbsp; /**
&nbsp; * @return the middle-right junction character.
&nbsp; */
<b class="nc">&nbsp; public String mr() { return mr; }</b>
&nbsp;
&nbsp; /**
&nbsp; * @return the top-middle junction character.
&nbsp; */
<b class="fc">&nbsp; public String mt() { return mt; }</b>
&nbsp;
&nbsp; /**
&nbsp; * @return the bottom-middle junction character.
&nbsp; */
<b class="fc">&nbsp; public String mb() { return mb; }</b>
&nbsp;
&nbsp; /**
&nbsp; * @return the center junction character.
&nbsp; */
<b class="nc">&nbsp; public String x() { return x; }</b>
&nbsp;
&nbsp; /**
&nbsp; * @return the separator-left junction character.
&nbsp; */
<b class="fc">&nbsp; public String sl() { return sl; }</b>
&nbsp;
&nbsp; /**
&nbsp; * @return the separator-right junction character.
&nbsp; */
<b class="fc">&nbsp; public String sr() { return sr; }</b>
&nbsp;
&nbsp; /**
&nbsp; * @return the separator center junction character.
&nbsp; */
<b class="fc">&nbsp; public String sx() { return sx; }</b>
&nbsp;}
</code>
</pre>
</div>
<script type="text/javascript">
(function() {
var msie = false, msie9 = false;
/*@cc_on
msie = true;
@if (@_jscript_version >= 9)
msie9 = true;
@end
@*/
if (!msie || msie && msie9) {
hljs.highlightAll()
hljs.initLineNumbersOnLoad();
}
})();
</script>
<div class="footer">
<div style="float:right;">generated on 2026-06-14 21:53</div>
</div>
</body>
</html>
@@ -0,0 +1,428 @@
<!DOCTYPE html>
<html id="htmlId">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Coverage Report > TUI</title>
<style type="text/css">
@import "../../css/coverage.css";
@import "../../css/idea.min.css";
</style>
<script type="text/javascript" src="../../js/highlight.min.js"></script>
<script type="text/javascript" src="../../js/highlightjs-line-numbers.min.js"></script>
</head>
<body>
<div class="content">
<div class="breadCrumbs">
Current scope: <a href="../../index.html">all classes</a>
<span class="separator">|</span>
<a href="../index.html">it.polimi.ingsw.gc14.View.TUI</a>
</div>
<h1>Coverage Summary for Class: TUI (it.polimi.ingsw.gc14.View.TUI)</h1>
<table class="coverageStats">
<tr>
<th class="name">Class</th>
<th class="coverageStat
">
Class, %
</th>
<th class="coverageStat
">
Method, %
</th>
<th class="coverageStat
">
Branch, %
</th>
<th class="coverageStat
">
Line, %
</th>
</tr>
<tr>
<td class="name">TUI</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/1)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/17)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/74)
</span>
</td>
<td class="coverageStat">
<span class="percent">
0%
</span>
<span class="absValue">
(0/117)
</span>
</td>
</tr>
</table>
<br/>
<br/>
<pre>
<code class="sourceCode" id="sourceCode">&nbsp;package it.polimi.ingsw.gc14.View.TUI;
&nbsp;import it.polimi.ingsw.gc14.ErrorType;
&nbsp;import it.polimi.ingsw.gc14.Model.*;
&nbsp;import it.polimi.ingsw.gc14.Model.GamePackage.GameStages;
&nbsp;import it.polimi.ingsw.gc14.View.IView;
&nbsp;
&nbsp;import org.jline.reader.LineReader;
&nbsp;import org.jline.terminal.Terminal;
&nbsp;
&nbsp;import java.util.ArrayList;
&nbsp;import java.util.List;
&nbsp;import java.util.Map;
&nbsp;
&nbsp;/**
&nbsp; * Text-based User Interface (TUI) implementation of {@link IView}.
&nbsp; *
&nbsp; * &lt;p&gt;Single render view: board + menu on top, all players&#39; hands in a
&nbsp; * responsive grid below. Hands wrap to a new row when their combined width
&nbsp; * would exceed the terminal width.
&nbsp; *
&nbsp; * &lt;p&gt;All output goes through {@link #display(String)}, which uses
&nbsp; * {@link LineReader#printAbove} when a JLine reader is set so that the
&nbsp; * readline prompt is correctly redrawn after background-thread renders.
&nbsp; */
&nbsp;public class TUI implements IView {
&nbsp;
&nbsp; private MiniModel model;
&nbsp; private String username;
&nbsp;
&nbsp; /**
&nbsp; * JLine reader — when non-null, all output uses {@code printAbove} so the
&nbsp; * readline prompt is preserved after background-thread renders.
&nbsp; */
&nbsp; private LineReader lineReader;
&nbsp;
&nbsp; /** JLine terminal — used to query terminal width for centering and grid layout. */
&nbsp; private Terminal terminal;
&nbsp;
&nbsp; /**
&nbsp; * Constructs a {@code TUI} bound to the given model.
&nbsp; *
&nbsp; * @param model the model to display; may be {@code null} initially.
&nbsp; */
<b class="nc">&nbsp; public TUI(MiniModel model) {</b>
<b class="nc">&nbsp; this.model = model;</b>
<b class="nc">&nbsp; this.username = &quot;&quot;;</b>
&nbsp; }
&nbsp;
&nbsp; // ── Setters ───────────────────────────────────────────────────────────────
&nbsp;
&nbsp; /** Sets the username of the local player. */
&nbsp; public void setUsername(String username) {
<b class="nc">&nbsp; this.username = username;</b>
&nbsp; }
&nbsp;
&nbsp; /** Updates the model stored in this view. */
&nbsp; @Override
&nbsp; public void setModel(MiniModel model) {
<b class="nc">&nbsp; this.model = model;</b>
&nbsp; }
&nbsp;
&nbsp; /**
&nbsp; * Registers the active JLine {@link LineReader}.
&nbsp; * Once set, all output routes through {@link LineReader#printAbove} so the
&nbsp; * prompt survives background-thread renders.
&nbsp; */
&nbsp; public void setLineReader(LineReader lineReader) {
<b class="nc">&nbsp; this.lineReader = lineReader;</b>
<b class="nc">&nbsp; this.terminal = lineReader.getTerminal();</b>
&nbsp; }
&nbsp;
&nbsp; // ── Public render entry points ────────────────────────────────────────────
&nbsp;
&nbsp; /**
&nbsp; * Default render: dispatches to the right view based on game stage.
&nbsp; */
&nbsp; @Override
&nbsp; public synchronized void render() {
<b class="nc">&nbsp; if (model == null) return;</b>
<b class="nc">&nbsp; GameStages stage = model.currentState.getGameStage();</b>
<b class="nc">&nbsp; if (stage == GameStages.TOTEM_CHOICE) {</b>
<b class="nc">&nbsp; display(buildTotemsContent());</b>
<b class="nc">&nbsp; } else if (stage == GameStages.ENDED) {</b>
<b class="nc">&nbsp; display(buildStandingContent() + &quot;\nType &#39;rematch&#39; to play again or &#39;quit&#39; to exit&quot;);</b>
&nbsp; } else {
<b class="nc">&nbsp; display(buildBoardContent());</b>
&nbsp; }
&nbsp; }
&nbsp;
&nbsp; /** Renders the board + menu (top) and all players&#39; hands in a grid (bottom). */
&nbsp; public void renderBoard() {
<b class="nc">&nbsp; display(buildBoardContent());</b>
&nbsp; }
&nbsp;
&nbsp; /** Renders the totem-choice panel. */
&nbsp; public void renderTotems() {
<b class="nc">&nbsp; display(buildTotemsContent());</b>
&nbsp; }
&nbsp;
&nbsp; /**
&nbsp; * Shows an error message combined with the current board in one display call,
&nbsp; * so only one {@code printAbove} is issued and the prompt is redrawn correctly.
&nbsp; *
&nbsp; * @param error the error type.
&nbsp; * @param message the human-readable message to append.
&nbsp; */
&nbsp; public void showError(ErrorType error, String message) {
&nbsp; String text;
<b class="nc">&nbsp; if (error == ErrorType.WRONG_ACTION</b>
&nbsp; &amp;&amp; model != null
<b class="nc">&nbsp; &amp;&amp; model.currentState.getCurrentPlayer() != null</b>
<b class="nc">&nbsp; &amp;&amp; !model.currentState.getCurrentPlayer().getUserName().equals(username)) {</b>
<b class="nc">&nbsp; text = &quot;It&#39;s not your turn&quot;;</b>
&nbsp; } else {
<b class="nc">&nbsp; text = message;</b>
<b class="nc">&nbsp; if (error == ErrorType.SERVER_CRASHED) {</b>
<b class="nc">&nbsp; text += &quot;\nPress any key to continue&quot;;</b>
&nbsp; }
&nbsp; }
<b class="nc">&nbsp; printLine(text);</b>
&nbsp; }
&nbsp;
&nbsp; // ── Content builders (return strings, do not print) ───────────────────────
&nbsp;
&nbsp; /**
&nbsp; * Builds the main view: board + menu side by side, followed by all players&#39;
&nbsp; * hands arranged in a responsive grid.
&nbsp; */
&nbsp; private String buildBoardContent() {
<b class="nc">&nbsp; List&lt;String&gt; left = List.of(boardStamp().split(&quot;\n&quot;));</b>
<b class="nc">&nbsp; List&lt;String&gt; right = List.of(buildAllHandsContent().split(&quot;\n&quot;));</b>
<b class="nc">&nbsp; return AsciiTable.sideBySide(left, right, 3);</b>
&nbsp; }
&nbsp;
&nbsp; /**
&nbsp; * Arranges every player&#39;s hand side-by-side, wrapping to a new grid row
&nbsp; * whenever the next panel would exceed the terminal width.
&nbsp; */
&nbsp; private String buildAllHandsContent() {
<b class="nc">&nbsp; List&lt;Player&gt; players = new ArrayList&lt;&gt;(model.players.values());</b>
<b class="nc">&nbsp; if (players.isEmpty()) return &quot;&quot;;</b>
&nbsp;
<b class="nc">&nbsp; int n = players.size();</b>
<b class="nc">&nbsp; int leftCount = Math.min(3, n);</b>
&nbsp;
<b class="nc">&nbsp; StringBuilder leftSb = new StringBuilder();</b>
<b class="nc">&nbsp; StringBuilder rightSb = new StringBuilder();</b>
<b class="nc">&nbsp; for (int i = 0; i &lt; leftCount; i++) leftSb.append(players.get(i).toString()).append(&quot;\n&quot;);</b>
<b class="nc">&nbsp; for (int i = leftCount; i &lt; n; i++) rightSb.append(players.get(i).toString()).append(&quot;\n&quot;);</b>
&nbsp;
<b class="nc">&nbsp; if (rightSb.isEmpty()) return leftSb.toString();</b>
&nbsp;
<b class="nc">&nbsp; return AsciiTable.sideBySide(</b>
<b class="nc">&nbsp; List.of(leftSb.toString().split(&quot;\n&quot;, -1)),</b>
<b class="nc">&nbsp; List.of(rightSb.toString().split(&quot;\n&quot;, -1)), 3);</b>
&nbsp; }
&nbsp;
&nbsp; private String buildTotemsContent() {
<b class="nc">&nbsp; var table = new AsciiTable(BorderStyle.ROUNDED, model.availableTotems.size());</b>
<b class="nc">&nbsp; List&lt;String&gt; lines = new ArrayList&lt;&gt;();</b>
<b class="nc">&nbsp; for (int i = 0; i &lt; model.availableTotems.size(); i++) {</b>
<b class="nc">&nbsp; lines.add(i + &quot;.&quot; + model.availableTotems.get(i));</b>
&nbsp; }
<b class="nc">&nbsp; table.addRow(lines);</b>
<b class="nc">&nbsp; String current = model.currentState.getCurrentPlayer() != null</b>
<b class="nc">&nbsp; ? model.currentState.getCurrentPlayer().getUserName() + &quot; — &quot;</b>
<b class="nc">&nbsp; : &quot;&quot;;</b>
<b class="nc">&nbsp; return current + &quot;TOTEMS AVAILABLE:\n&quot; + table.build() + &quot;\nType: totem &lt;pos&gt;&quot;;</b>
&nbsp; }
&nbsp;
&nbsp; private String buildStandingContent() {
<b class="nc">&nbsp; if (model.standingPlayers == null || model.standingPlayers.isEmpty()) return &quot;&quot;;</b>
<b class="nc">&nbsp; StringBuilder sb = new StringBuilder();</b>
<b class="nc">&nbsp; int size = model.standingPlayers.size();</b>
<b class="nc">&nbsp; for (int i = 0; i &lt; size / 2; i++) {</b>
<b class="nc">&nbsp; sb.append(AsciiTable.sideBySide(</b>
<b class="nc">&nbsp; List.of(model.standingPlayers.get(i * 2).toString().split(&quot;\n&quot;)),</b>
<b class="nc">&nbsp; List.of(model.standingPlayers.get(i * 2 + 1).toString().split(&quot;\n&quot;)), 2));</b>
&nbsp; }
<b class="nc">&nbsp; sb.append(&quot;\n&quot;);</b>
<b class="nc">&nbsp; if (size % 2 != 0) {</b>
<b class="nc">&nbsp; sb.append(model.standingPlayers.get(size - 1)).append(&quot;\n&quot;);</b>
&nbsp; }
<b class="nc">&nbsp; if (model.standingPlayers.get(0).getUserName().equals(username)) {</b>
<b class="nc">&nbsp; sb.append(&quot;GAME ENDED: !!!YOU WON!!!&quot;);</b>
&nbsp; } else {
<b class="nc">&nbsp; sb.append(&quot;GAME ENDED: !!!YOU LOST!!!&quot;);</b>
&nbsp; }
<b class="nc">&nbsp; return sb.toString();</b>
&nbsp; }
&nbsp;
&nbsp; // ── Core display primitive ────────────────────────────────────────────────
&nbsp;
&nbsp; /**
&nbsp; * Clears the terminal and displays {@code content}, horizontally centered.
&nbsp; *
&nbsp; * &lt;p&gt;When a JLine {@link LineReader} is registered, output is routed through
&nbsp; * {@link LineReader#printAbove} which pauses readline, prints the content,
&nbsp; * and redraws the prompt — safe to call from any thread.
&nbsp; * Otherwise, ANSI codes are written directly to stdout.
&nbsp; */
&nbsp; private void display(String content) {
<b class="nc">&nbsp; String cleared = &quot;\033[H\033[2J&quot; + center(content);</b>
<b class="nc">&nbsp; if (lineReader != null) {</b>
<b class="nc">&nbsp; lineReader.printAbove(cleared);</b>
&nbsp; } else {
<b class="nc">&nbsp; System.out.print(cleared);</b>
<b class="nc">&nbsp; System.out.println();</b>
<b class="nc">&nbsp; System.out.flush();</b>
&nbsp; }
&nbsp; }
&nbsp;
&nbsp; /** Prints {@code text} above the prompt without clearing the screen. */
&nbsp; private void printLine(String text) {
<b class="nc">&nbsp; if (lineReader != null) {</b>
<b class="nc">&nbsp; lineReader.printAbove(text);</b>
&nbsp; } else {
<b class="nc">&nbsp; System.out.println(text);</b>
<b class="nc">&nbsp; System.out.flush();</b>
&nbsp; }
&nbsp; }
&nbsp;
&nbsp; /**
&nbsp; * Horizontally centers each line of {@code content} within the terminal width.
&nbsp; * Empty lines are left unpadded. Falls back to the original string when the
&nbsp; * terminal width is unknown.
&nbsp; */
&nbsp; private String center(String content) {
<b class="nc">&nbsp; if (terminal == null) return content;</b>
<b class="nc">&nbsp; int termWidth = terminal.getWidth();</b>
<b class="nc">&nbsp; if (termWidth &lt;= 0) return content;</b>
&nbsp;
<b class="nc">&nbsp; String[] lines = content.split(&quot;\n&quot;, -1);</b>
&nbsp;
<b class="nc">&nbsp; int maxWidth = 0;</b>
<b class="nc">&nbsp; for (String line : lines) {</b>
<b class="nc">&nbsp; int w = visibleLength(line);</b>
<b class="nc">&nbsp; if (w &gt; maxWidth) maxWidth = w;</b>
&nbsp; }
&nbsp;
<b class="nc">&nbsp; int pad = Math.max(0, (termWidth - maxWidth) / 2);</b>
<b class="nc">&nbsp; if (pad == 0) return content;</b>
&nbsp;
<b class="nc">&nbsp; String prefix = &quot; &quot;.repeat(pad);</b>
<b class="nc">&nbsp; StringBuilder sb = new StringBuilder();</b>
<b class="nc">&nbsp; for (int i = 0; i &lt; lines.length; i++) {</b>
<b class="nc">&nbsp; if (!lines[i].isEmpty()) sb.append(prefix);</b>
<b class="nc">&nbsp; sb.append(lines[i]);</b>
<b class="nc">&nbsp; if (i &lt; lines.length - 1) sb.append(&quot;\n&quot;);</b>
&nbsp; }
<b class="nc">&nbsp; return sb.toString();</b>
&nbsp; }
&nbsp;
&nbsp; /** Returns the display width of a string in terminal columns, stripping ANSI escape codes. */
&nbsp; private int visibleLength(String line) {
<b class="nc">&nbsp; return AsciiTable.displayWidth(line);</b>
&nbsp; }
&nbsp;
&nbsp; // ── Board / players stamp helpers ─────────────────────────────────────────
&nbsp;
&nbsp; /**
&nbsp; * Returns the board state as a multi-line string: turn order, upper cards,
&nbsp; * offer track, lower cards.
&nbsp; *
&nbsp; * @return multi-line board string.
&nbsp; */
&nbsp; public String boardStamp() {
<b class="nc">&nbsp; var offerTrack = new AsciiTable(BorderStyle.ROUNDED, model.slotPlayerMap.size());</b>
<b class="nc">&nbsp; List&lt;String&gt; slotNames = new ArrayList&lt;&gt;();</b>
<b class="nc">&nbsp; List&lt;String&gt; slotPlayers = new ArrayList&lt;&gt;();</b>
&nbsp;
<b class="nc">&nbsp; int index = 0;</b>
<b class="nc">&nbsp; for (Map.Entry&lt;Slot, Player&gt; entry : model.slotPlayerMap.entrySet()) {</b>
<b class="nc">&nbsp; slotNames.add((index++) + &quot;.&quot; + entry.getKey().toStringTUI());</b>
<b class="nc">&nbsp; slotPlayers.add(entry.getValue() != null ? entry.getValue().getUserName() : &quot; &quot;);</b>
&nbsp; }
&nbsp;
<b class="nc">&nbsp; var upperCards = new AsciiTable(BorderStyle.ROUNDED, 2);</b>
<b class="nc">&nbsp; var lowerCards = new AsciiTable(BorderStyle.ROUNDED, 2);</b>
<b class="nc">&nbsp; upperCards.addHeader(&quot;Char/Events&quot;, &quot;Building&quot;);</b>
<b class="nc">&nbsp; lowerCards.addHeader(&quot;Char/Events&quot;, &quot;Building&quot;);</b>
&nbsp;
<b class="nc">&nbsp; int maxU = Math.max(model.upperListTribeCards.size(), model.upperListBuildingCards.size());</b>
<b class="nc">&nbsp; for (int i = 0; i &lt; maxU; i++) {</b>
<b class="nc">&nbsp; String t = i &lt; model.upperListTribeCards.size() ? i + model.upperListTribeCards.get(i).toStringBoard() : &quot;&quot;;</b>
<b class="nc">&nbsp; String b = i &lt; model.upperListBuildingCards.size() ? i + model.upperListBuildingCards.get(i).toString() : &quot;&quot;;</b>
<b class="nc">&nbsp; upperCards.addRow(t, b);</b>
&nbsp; }
&nbsp;
<b class="nc">&nbsp; int maxL = Math.max(model.lowerListTribeCards.size(), model.lowerListBuildingCards.size());</b>
<b class="nc">&nbsp; for (int i = 0; i &lt; maxL; i++) {</b>
<b class="nc">&nbsp; String t = i &lt; model.lowerListTribeCards.size() ? i + model.lowerListTribeCards.get(i).toStringBoard() : &quot;&quot;;</b>
<b class="nc">&nbsp; String b = i &lt; model.lowerListBuildingCards.size() ? i + model.lowerListBuildingCards.get(i).toString() : &quot;&quot;;</b>
<b class="nc">&nbsp; lowerCards.addRow(t, b);</b>
&nbsp; }
&nbsp;
<b class="nc">&nbsp; offerTrack.addRow(slotPlayers);</b>
<b class="nc">&nbsp; offerTrack.addRow(slotNames);</b>
&nbsp;
<b class="nc">&nbsp; String upperSection = upperCards.build();</b>
&nbsp;
<b class="nc">&nbsp; String middleSection = model.orderLogicCard.toString() + offerTrack.build();</b>
&nbsp;
<b class="nc">&nbsp; String lowerSection = lowerCards.build();</b>
&nbsp;
<b class="nc">&nbsp; return model.currentState + &quot;\n&quot;</b>
&nbsp; + upperSection + &quot;\n&quot;
&nbsp; + middleSection + &quot;\n&quot;
&nbsp; + lowerSection;
&nbsp; }
&nbsp;
&nbsp;}
</code>
</pre>
</div>
<script type="text/javascript">
(function() {
var msie = false, msie9 = false;
/*@cc_on
msie = true;
@if (@_jscript_version >= 9)
msie9 = true;
@end
@*/
if (!msie || msie && msie9) {
hljs.highlightAll()
hljs.initLineNumbersOnLoad();
}
})();
</script>
<div class="footer">
<div style="float:right;">generated on 2026-06-14 21:53</div>
</div>
</body>
</html>
@@ -0,0 +1,68 @@
<!DOCTYPE html>
<html id="htmlId">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Coverage Report > it.polimi.ingsw.gc14.View</title>
<style type="text/css">
@import "../css/coverage.css";
@import "../css/idea.min.css";
</style>
<script type="text/javascript" src="../js/highlight.min.js"></script>
<script type="text/javascript" src="../js/highlightjs-line-numbers.min.js"></script>
</head>
<body>
<div class="content">
<div class="breadCrumbs">
Current scope: <a href="../index.html">all classes</a>
<span class="separator">|</span>
it.polimi.ingsw.gc14.View</div>
<h1>Coverage Summary for Package: it.polimi.ingsw.gc14.View</h1>
<table class="coverageStats">
<tr>
<th class="name">Package</th>
</tr>
<tr>
<td class="name">it.polimi.ingsw.gc14.View</td>
</tr>
</table>
<br/>
<br/>
<table class="coverageStats">
<tr>
<th class="name sortedAsc
">
<a href="index_SORT_BY_NAME_DESC.html">Class</a> </th>
</tr>
</table>
</div>
<script type="text/javascript">
(function() {
var msie = false, msie9 = false;
/*@cc_on
msie = true;
@if (@_jscript_version >= 9)
msie9 = true;
@end
@*/
if (!msie || msie && msie9) {
hljs.highlightAll()
hljs.initLineNumbersOnLoad();
}
})();
</script>
<div class="footer">
<div style="float:right;">generated on 2026-06-14 21:53</div>
</div>
</body>
</html>
@@ -0,0 +1,68 @@
<!DOCTYPE html>
<html id="htmlId">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Coverage Report > it.polimi.ingsw.gc14.View</title>
<style type="text/css">
@import "../css/coverage.css";
@import "../css/idea.min.css";
</style>
<script type="text/javascript" src="../js/highlight.min.js"></script>
<script type="text/javascript" src="../js/highlightjs-line-numbers.min.js"></script>
</head>
<body>
<div class="content">
<div class="breadCrumbs">
Current scope: <a href="../index_SORT_BY_BLOCK.html">all classes</a>
<span class="separator">|</span>
it.polimi.ingsw.gc14.View</div>
<h1>Coverage Summary for Package: it.polimi.ingsw.gc14.View</h1>
<table class="coverageStats">
<tr>
<th class="name">Package</th>
</tr>
<tr>
<td class="name">it.polimi.ingsw.gc14.View</td>
</tr>
</table>
<br/>
<br/>
<table class="coverageStats">
<tr>
<th class="name
">
<a href="index.html">Class</a> </th>
</tr>
</table>
</div>
<script type="text/javascript">
(function() {
var msie = false, msie9 = false;
/*@cc_on
msie = true;
@if (@_jscript_version >= 9)
msie9 = true;
@end
@*/
if (!msie || msie && msie9) {
hljs.highlightAll()
hljs.initLineNumbersOnLoad();
}
})();
</script>
<div class="footer">
<div style="float:right;">generated on 2026-06-14 21:53</div>
</div>
</body>
</html>
@@ -0,0 +1,68 @@
<!DOCTYPE html>
<html id="htmlId">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Coverage Report > it.polimi.ingsw.gc14.View</title>
<style type="text/css">
@import "../css/coverage.css";
@import "../css/idea.min.css";
</style>
<script type="text/javascript" src="../js/highlight.min.js"></script>
<script type="text/javascript" src="../js/highlightjs-line-numbers.min.js"></script>
</head>
<body>
<div class="content">
<div class="breadCrumbs">
Current scope: <a href="../index_SORT_BY_BLOCK_DESC.html">all classes</a>
<span class="separator">|</span>
it.polimi.ingsw.gc14.View</div>
<h1>Coverage Summary for Package: it.polimi.ingsw.gc14.View</h1>
<table class="coverageStats">
<tr>
<th class="name">Package</th>
</tr>
<tr>
<td class="name">it.polimi.ingsw.gc14.View</td>
</tr>
</table>
<br/>
<br/>
<table class="coverageStats">
<tr>
<th class="name
">
<a href="index.html">Class</a> </th>
</tr>
</table>
</div>
<script type="text/javascript">
(function() {
var msie = false, msie9 = false;
/*@cc_on
msie = true;
@if (@_jscript_version >= 9)
msie9 = true;
@end
@*/
if (!msie || msie && msie9) {
hljs.highlightAll()
hljs.initLineNumbersOnLoad();
}
})();
</script>
<div class="footer">
<div style="float:right;">generated on 2026-06-14 21:53</div>
</div>
</body>
</html>
@@ -0,0 +1,68 @@
<!DOCTYPE html>
<html id="htmlId">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Coverage Report > it.polimi.ingsw.gc14.View</title>
<style type="text/css">
@import "../css/coverage.css";
@import "../css/idea.min.css";
</style>
<script type="text/javascript" src="../js/highlight.min.js"></script>
<script type="text/javascript" src="../js/highlightjs-line-numbers.min.js"></script>
</head>
<body>
<div class="content">
<div class="breadCrumbs">
Current scope: <a href="../index_SORT_BY_CLASS.html">all classes</a>
<span class="separator">|</span>
it.polimi.ingsw.gc14.View</div>
<h1>Coverage Summary for Package: it.polimi.ingsw.gc14.View</h1>
<table class="coverageStats">
<tr>
<th class="name">Package</th>
</tr>
<tr>
<td class="name">it.polimi.ingsw.gc14.View</td>
</tr>
</table>
<br/>
<br/>
<table class="coverageStats">
<tr>
<th class="name
">
<a href="index.html">Class</a> </th>
</tr>
</table>
</div>
<script type="text/javascript">
(function() {
var msie = false, msie9 = false;
/*@cc_on
msie = true;
@if (@_jscript_version >= 9)
msie9 = true;
@end
@*/
if (!msie || msie && msie9) {
hljs.highlightAll()
hljs.initLineNumbersOnLoad();
}
})();
</script>
<div class="footer">
<div style="float:right;">generated on 2026-06-14 21:53</div>
</div>
</body>
</html>
@@ -0,0 +1,68 @@
<!DOCTYPE html>
<html id="htmlId">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Coverage Report > it.polimi.ingsw.gc14.View</title>
<style type="text/css">
@import "../css/coverage.css";
@import "../css/idea.min.css";
</style>
<script type="text/javascript" src="../js/highlight.min.js"></script>
<script type="text/javascript" src="../js/highlightjs-line-numbers.min.js"></script>
</head>
<body>
<div class="content">
<div class="breadCrumbs">
Current scope: <a href="../index_SORT_BY_CLASS_DESC.html">all classes</a>
<span class="separator">|</span>
it.polimi.ingsw.gc14.View</div>
<h1>Coverage Summary for Package: it.polimi.ingsw.gc14.View</h1>
<table class="coverageStats">
<tr>
<th class="name">Package</th>
</tr>
<tr>
<td class="name">it.polimi.ingsw.gc14.View</td>
</tr>
</table>
<br/>
<br/>
<table class="coverageStats">
<tr>
<th class="name
">
<a href="index.html">Class</a> </th>
</tr>
</table>
</div>
<script type="text/javascript">
(function() {
var msie = false, msie9 = false;
/*@cc_on
msie = true;
@if (@_jscript_version >= 9)
msie9 = true;
@end
@*/
if (!msie || msie && msie9) {
hljs.highlightAll()
hljs.initLineNumbersOnLoad();
}
})();
</script>
<div class="footer">
<div style="float:right;">generated on 2026-06-14 21:53</div>
</div>
</body>
</html>
@@ -0,0 +1,68 @@
<!DOCTYPE html>
<html id="htmlId">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Coverage Report > it.polimi.ingsw.gc14.View</title>
<style type="text/css">
@import "../css/coverage.css";
@import "../css/idea.min.css";
</style>
<script type="text/javascript" src="../js/highlight.min.js"></script>
<script type="text/javascript" src="../js/highlightjs-line-numbers.min.js"></script>
</head>
<body>
<div class="content">
<div class="breadCrumbs">
Current scope: <a href="../index_SORT_BY_LINE.html">all classes</a>
<span class="separator">|</span>
it.polimi.ingsw.gc14.View</div>
<h1>Coverage Summary for Package: it.polimi.ingsw.gc14.View</h1>
<table class="coverageStats">
<tr>
<th class="name">Package</th>
</tr>
<tr>
<td class="name">it.polimi.ingsw.gc14.View</td>
</tr>
</table>
<br/>
<br/>
<table class="coverageStats">
<tr>
<th class="name
">
<a href="index.html">Class</a> </th>
</tr>
</table>
</div>
<script type="text/javascript">
(function() {
var msie = false, msie9 = false;
/*@cc_on
msie = true;
@if (@_jscript_version >= 9)
msie9 = true;
@end
@*/
if (!msie || msie && msie9) {
hljs.highlightAll()
hljs.initLineNumbersOnLoad();
}
})();
</script>
<div class="footer">
<div style="float:right;">generated on 2026-06-14 21:53</div>
</div>
</body>
</html>
@@ -0,0 +1,68 @@
<!DOCTYPE html>
<html id="htmlId">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Coverage Report > it.polimi.ingsw.gc14.View</title>
<style type="text/css">
@import "../css/coverage.css";
@import "../css/idea.min.css";
</style>
<script type="text/javascript" src="../js/highlight.min.js"></script>
<script type="text/javascript" src="../js/highlightjs-line-numbers.min.js"></script>
</head>
<body>
<div class="content">
<div class="breadCrumbs">
Current scope: <a href="../index_SORT_BY_LINE_DESC.html">all classes</a>
<span class="separator">|</span>
it.polimi.ingsw.gc14.View</div>
<h1>Coverage Summary for Package: it.polimi.ingsw.gc14.View</h1>
<table class="coverageStats">
<tr>
<th class="name">Package</th>
</tr>
<tr>
<td class="name">it.polimi.ingsw.gc14.View</td>
</tr>
</table>
<br/>
<br/>
<table class="coverageStats">
<tr>
<th class="name
">
<a href="index.html">Class</a> </th>
</tr>
</table>
</div>
<script type="text/javascript">
(function() {
var msie = false, msie9 = false;
/*@cc_on
msie = true;
@if (@_jscript_version >= 9)
msie9 = true;
@end
@*/
if (!msie || msie && msie9) {
hljs.highlightAll()
hljs.initLineNumbersOnLoad();
}
})();
</script>
<div class="footer">
<div style="float:right;">generated on 2026-06-14 21:53</div>
</div>
</body>
</html>
@@ -0,0 +1,68 @@
<!DOCTYPE html>
<html id="htmlId">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Coverage Report > it.polimi.ingsw.gc14.View</title>
<style type="text/css">
@import "../css/coverage.css";
@import "../css/idea.min.css";
</style>
<script type="text/javascript" src="../js/highlight.min.js"></script>
<script type="text/javascript" src="../js/highlightjs-line-numbers.min.js"></script>
</head>
<body>
<div class="content">
<div class="breadCrumbs">
Current scope: <a href="../index_SORT_BY_METHOD.html">all classes</a>
<span class="separator">|</span>
it.polimi.ingsw.gc14.View</div>
<h1>Coverage Summary for Package: it.polimi.ingsw.gc14.View</h1>
<table class="coverageStats">
<tr>
<th class="name">Package</th>
</tr>
<tr>
<td class="name">it.polimi.ingsw.gc14.View</td>
</tr>
</table>
<br/>
<br/>
<table class="coverageStats">
<tr>
<th class="name
">
<a href="index.html">Class</a> </th>
</tr>
</table>
</div>
<script type="text/javascript">
(function() {
var msie = false, msie9 = false;
/*@cc_on
msie = true;
@if (@_jscript_version >= 9)
msie9 = true;
@end
@*/
if (!msie || msie && msie9) {
hljs.highlightAll()
hljs.initLineNumbersOnLoad();
}
})();
</script>
<div class="footer">
<div style="float:right;">generated on 2026-06-14 21:53</div>
</div>
</body>
</html>
@@ -0,0 +1,68 @@
<!DOCTYPE html>
<html id="htmlId">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Coverage Report > it.polimi.ingsw.gc14.View</title>
<style type="text/css">
@import "../css/coverage.css";
@import "../css/idea.min.css";
</style>
<script type="text/javascript" src="../js/highlight.min.js"></script>
<script type="text/javascript" src="../js/highlightjs-line-numbers.min.js"></script>
</head>
<body>
<div class="content">
<div class="breadCrumbs">
Current scope: <a href="../index_SORT_BY_METHOD_DESC.html">all classes</a>
<span class="separator">|</span>
it.polimi.ingsw.gc14.View</div>
<h1>Coverage Summary for Package: it.polimi.ingsw.gc14.View</h1>
<table class="coverageStats">
<tr>
<th class="name">Package</th>
</tr>
<tr>
<td class="name">it.polimi.ingsw.gc14.View</td>
</tr>
</table>
<br/>
<br/>
<table class="coverageStats">
<tr>
<th class="name
">
<a href="index.html">Class</a> </th>
</tr>
</table>
</div>
<script type="text/javascript">
(function() {
var msie = false, msie9 = false;
/*@cc_on
msie = true;
@if (@_jscript_version >= 9)
msie9 = true;
@end
@*/
if (!msie || msie && msie9) {
hljs.highlightAll()
hljs.initLineNumbersOnLoad();
}
})();
</script>
<div class="footer">
<div style="float:right;">generated on 2026-06-14 21:53</div>
</div>
</body>
</html>
@@ -0,0 +1,68 @@
<!DOCTYPE html>
<html id="htmlId">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Coverage Report > it.polimi.ingsw.gc14.View</title>
<style type="text/css">
@import "../css/coverage.css";
@import "../css/idea.min.css";
</style>
<script type="text/javascript" src="../js/highlight.min.js"></script>
<script type="text/javascript" src="../js/highlightjs-line-numbers.min.js"></script>
</head>
<body>
<div class="content">
<div class="breadCrumbs">
Current scope: <a href="../index_SORT_BY_NAME_DESC.html">all classes</a>
<span class="separator">|</span>
it.polimi.ingsw.gc14.View</div>
<h1>Coverage Summary for Package: it.polimi.ingsw.gc14.View</h1>
<table class="coverageStats">
<tr>
<th class="name">Package</th>
</tr>
<tr>
<td class="name">it.polimi.ingsw.gc14.View</td>
</tr>
</table>
<br/>
<br/>
<table class="coverageStats">
<tr>
<th class="name sortedDesc
">
<a href="index.html">Class</a> </th>
</tr>
</table>
</div>
<script type="text/javascript">
(function() {
var msie = false, msie9 = false;
/*@cc_on
msie = true;
@if (@_jscript_version >= 9)
msie9 = true;
@end
@*/
if (!msie || msie && msie9) {
hljs.highlightAll()
hljs.initLineNumbersOnLoad();
}
})();
</script>
<div class="footer">
<div style="float:right;">generated on 2026-06-14 21:53</div>
</div>
</body>
</html>
@@ -0,0 +1,94 @@
<!DOCTYPE html>
<html id="htmlId">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Coverage Report > IView</title>
<style type="text/css">
@import "../../css/coverage.css";
@import "../../css/idea.min.css";
</style>
<script type="text/javascript" src="../../js/highlight.min.js"></script>
<script type="text/javascript" src="../../js/highlightjs-line-numbers.min.js"></script>
</head>
<body>
<div class="content">
<div class="breadCrumbs">
Current scope: <a href="../../index.html">all classes</a>
<span class="separator">|</span>
<a href="../index.html">it.polimi.ingsw.gc14.View</a>
</div>
<h1>Coverage Summary for Class: IView (it.polimi.ingsw.gc14.View)</h1>
<table class="coverageStats">
<tr>
<th class="name">Class</th>
</tr>
<tr>
<td class="name">IView</td>
</tr>
</table>
<br/>
<br/>
<pre>
<code class="sourceCode" id="sourceCode">&nbsp;package it.polimi.ingsw.gc14.View;
&nbsp;
&nbsp;import it.polimi.ingsw.gc14.ErrorType;
&nbsp;import it.polimi.ingsw.gc14.Model.MiniModel;
&nbsp;
&nbsp;/** View interface implemented by both the TUI and GUI. */
&nbsp;public interface IView {
&nbsp; /**
&nbsp; * Updates the view&#39;s local copy of the game model.
&nbsp; *
&nbsp; * @param miniModel the latest mini model received from the server.
&nbsp; */
&nbsp; void setModel(MiniModel miniModel);
&nbsp;
&nbsp; /** Re-renders the view based on the current mini model state. */
&nbsp; void render();
&nbsp;
&nbsp; /**
&nbsp; * Displays an error message to the user.
&nbsp; *
&nbsp; * @param error the error type.
&nbsp; * @param message a human-readable description of the error.
&nbsp; */
&nbsp; void showError(ErrorType error, String message);
&nbsp;
&nbsp;}
</code>
</pre>
</div>
<script type="text/javascript">
(function() {
var msie = false, msie9 = false;
/*@cc_on
msie = true;
@if (@_jscript_version >= 9)
msie9 = true;
@end
@*/
if (!msie || msie && msie9) {
hljs.highlightAll()
hljs.initLineNumbersOnLoad();
}
})();
</script>
<div class="footer">
<div style="float:right;">generated on 2026-06-14 21:53</div>
</div>
</body>
</html>
@@ -0,0 +1,68 @@
<!DOCTYPE html>
<html id="htmlId">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Coverage Report > it.polimi.ingsw.gc14.Network.RMI.Common</title>
<style type="text/css">
@import "../css/coverage.css";
@import "../css/idea.min.css";
</style>
<script type="text/javascript" src="../js/highlight.min.js"></script>
<script type="text/javascript" src="../js/highlightjs-line-numbers.min.js"></script>
</head>
<body>
<div class="content">
<div class="breadCrumbs">
Current scope: <a href="../index.html">all classes</a>
<span class="separator">|</span>
it.polimi.ingsw.gc14.Network.RMI.Common</div>
<h1>Coverage Summary for Package: it.polimi.ingsw.gc14.Network.RMI.Common</h1>
<table class="coverageStats">
<tr>
<th class="name">Package</th>
</tr>
<tr>
<td class="name">it.polimi.ingsw.gc14.Network.RMI.Common</td>
</tr>
</table>
<br/>
<br/>
<table class="coverageStats">
<tr>
<th class="name sortedAsc
">
<a href="index_SORT_BY_NAME_DESC.html">Class</a> </th>
</tr>
</table>
</div>
<script type="text/javascript">
(function() {
var msie = false, msie9 = false;
/*@cc_on
msie = true;
@if (@_jscript_version >= 9)
msie9 = true;
@end
@*/
if (!msie || msie && msie9) {
hljs.highlightAll()
hljs.initLineNumbersOnLoad();
}
})();
</script>
<div class="footer">
<div style="float:right;">generated on 2026-06-14 21:53</div>
</div>
</body>
</html>

Some files were not shown because too many files have changed in this diff Show More