Converter   A
last analyzed

Complexity

Total Complexity 6

Size/Duplication

Total Lines 53
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 2

Test Coverage

Coverage 100%

Importance

Changes 4
Bugs 0 Features 0
Metric Value
wmc 6
c 4
b 0
f 0
lcom 1
cbo 2
dl 0
loc 53
ccs 26
cts 26
cp 1
rs 10

1 Method

Rating   Name   Duplication   Size   Complexity  
B toDecimal() 0 40 6
1
<?php
2
3
namespace MaringaDojo\Romanizer;
4
5
use MaringaDojo\Romanizer\Exceptions\MaisDeTresSimbolosIguaisException;
6
use MaringaDojo\Romanizer\Exceptions\SimboloInvalidoException;
7
8
class Converter
9
{
10
    private $romanoParaNumero = [
11
        'M' => 1000,
12
        'D' => 500,
13
        'C' => 100,
14
        'L' => 50,
15
        'X' => 10,
16
        'V' => 5,
17
        'I' => 1,
18
    ];
19
20 36
    public function toDecimal($numeroRomano)
21
    {
22 36
        $valor = 0;
23 36
        $valorAnterior = 0;
24 36
        $repeticoes = 0;
25
26 36
        for ($i = strlen($numeroRomano) - 1; $i >= 0; $i--) {
27 36
            $letra = $numeroRomano[$i];
28
29 36
            if (! array_key_exists($letra, $this->romanoParaNumero)) {
30 3
                throw new SimboloInvalidoException(
31 1
                    $letra . 'É um simbolo invalido'
32 2
                );
33
            }
34
35 33
            $valorAtual = $this->romanoParaNumero[$letra];
36
37 33
            if ($valorAtual == $valorAnterior) {
38 9
                $repeticoes++;
39
40 9
                if ($repeticoes >= 3) {
41 3
                    throw new MaisDeTresSimbolosIguaisException(
42 3
                        'Os simbolos só podem ser repitidos até três vezes.'
43 2
                    );
44
                }
45 6
            } else {
46 33
                $repeticoes = 0;
47
            }
48
49 33
            if ($valorAtual >= $valorAnterior) {
50 33
                $valor += $valorAtual;
51 22
            } else {
52 6
                $valor -= $valorAtual;
53
            }
54
55 33
            $valorAnterior = $valorAtual;
56 22
        }
57
58 30
        return $valor;
59
    }
60
}
61