Code Coverage
 
Lines
Branches
Paths
Functions and Methods
Classes and Traits
Total
94.44% covered (success)
94.44%
17 / 18
78.26% covered (warning)
78.26%
18 / 23
47.06% covered (danger)
47.06%
8 / 17
80.00% covered (warning)
80.00%
4 / 5
CRAP
0.00% covered (danger)
0.00%
0 / 1
OffenseLevelCriterion
94.44% covered (success)
94.44%
17 / 18
78.26% covered (warning)
78.26%
18 / 23
47.06% covered (danger)
47.06%
8 / 17
80.00% covered (warning)
80.00%
4 / 5
38.08
0.00% covered (danger)
0.00%
0 / 1
 __construct
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getAllowedValues
92.86% covered (success)
92.86%
13 / 14
73.68% covered (warning)
73.68%
14 / 19
30.77% covered (danger)
30.77%
4 / 13
0.00% covered (danger)
0.00%
0 / 1
35.88
 getField
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 shouldApply
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getTargetEntity
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
1<?php
2
3namespace App\Specification\Criterion;
4
5use App\Entity\Word;
6use App\Enum\OffenseLevel;
7
8/**
9 * @implements EnumCriterion<OffenseLevel>
10 *
11 * @author Wilhelm Zwertvaegher
12 */
13readonly class OffenseLevelCriterion implements EnumCriterion
14{
15    public function __construct(
16        private ?OffenseLevel $offenseLevel = null,
17        private ?OffenseConstraintType $offenseConstraintType = OffenseConstraintType::LTE,
18    ) {
19    }
20
21    /**
22     * @return array<OffenseLevel>
23     */
24    public function getAllowedValues(): array
25    {
26        if (!$this->offenseLevel) {
27            return OffenseLevel::cases();
28        }
29
30        if (OffenseConstraintType::EXACT == $this->offenseConstraintType) {
31            return [$this->offenseLevel];
32        }
33
34        // create result for LT constraint
35        $result = match ($this->offenseLevel) {
36            OffenseLevel::LOW => [],
37            OffenseLevel::MEDIUM => [OffenseLevel::LOW],
38            OffenseLevel::HIGH => [OffenseLevel::LOW, OffenseLevel::MEDIUM],
39            OffenseLevel::VERY_HIGH => [OffenseLevel::LOW, OffenseLevel::MEDIUM, OffenseLevel::HIGH],
40            OffenseLevel::MAX => [OffenseLevel::LOW, OffenseLevel::MEDIUM, OffenseLevel::HIGH, OffenseLevel::VERY_HIGH],
41        };
42
43        if (OffenseConstraintType::LTE == $this->offenseConstraintType) {
44            // add current OffenseLevel to allow equality
45            $result[] = $this->offenseLevel;
46        }
47
48        return $result;
49    }
50
51    public function getField(): string
52    {
53        return 'offenseLevel';
54    }
55
56    public function shouldApply(): bool
57    {
58        return !empty($this->offenseLevel);
59    }
60
61    public function getTargetEntity(): string
62    {
63        return Word::class;
64    }
65}