mirror of
https://github.com/firefly-iii/firefly-iii.git
synced 2024-11-25 18:30:55 -06:00
Attempt to cover all cases in amount converter, this fixes #840
This commit is contained in:
parent
03f33c5e7e
commit
2dfe2ddaf3
@ -36,13 +36,14 @@ class Amount implements ConverterInterface
|
||||
*/
|
||||
public function convert($value): string
|
||||
{
|
||||
if(is_null($value)) {
|
||||
if (is_null($value)) {
|
||||
return '0';
|
||||
}
|
||||
$value = strval($value);
|
||||
Log::debug(sprintf('Start with amount "%s"', $value));
|
||||
$len = strlen($value);
|
||||
$decimalPosition = $len - 3;
|
||||
$altPosition = $len - 2;
|
||||
$decimal = null;
|
||||
|
||||
if (($len > 2 && $value{$decimalPosition} === '.') || ($len > 2 && strpos($value, '.') > $decimalPosition)) {
|
||||
@ -53,6 +54,11 @@ class Amount implements ConverterInterface
|
||||
$decimal = ',';
|
||||
Log::debug(sprintf('Decimal character in "%s" seems to be a comma.', $value));
|
||||
}
|
||||
// decimal character is null? find out if "0.1" or ".1" or "0,1" or ",1"
|
||||
if ($len > 1 && ($value{$altPosition} === '.' || $value{$altPosition} === ',')) {
|
||||
$decimal = $value{$altPosition};
|
||||
Log::debug(sprintf('Alternate search resulted in "%s" for decimal sign.', $decimal));
|
||||
}
|
||||
|
||||
// if decimal is dot, replace all comma's and spaces with nothing. then parse as float (round to 4 pos)
|
||||
if ($decimal === '.') {
|
||||
|
@ -32,13 +32,13 @@ use Watson\Validating\ValidatingTrait;
|
||||
* @property int $foreign_currency_dp
|
||||
*
|
||||
* @property int $account_id
|
||||
* @property-read string $account_name
|
||||
* @property string $account_name
|
||||
* @property string $account_iban
|
||||
* @property string $account_number
|
||||
* @property string $account_bic
|
||||
* @property string $account_currency_code
|
||||
*
|
||||
* @property-read int $opposing_account_id
|
||||
* @property int $opposing_account_id
|
||||
* @property string $opposing_account_name
|
||||
* @property string $opposing_account_iban
|
||||
* @property string $opposing_account_number
|
||||
@ -46,10 +46,10 @@ use Watson\Validating\ValidatingTrait;
|
||||
* @property string $opposing_currency_code
|
||||
*
|
||||
*
|
||||
* @property-read int $transaction_budget_id
|
||||
* @property-read string $transaction_budget_name
|
||||
* @property-read int $transaction_journal_budget_id
|
||||
* @property-read string $transaction_journal_budget_name
|
||||
* @property int $transaction_budget_id
|
||||
* @property string $transaction_budget_name
|
||||
* @property int $transaction_journal_budget_id
|
||||
* @property string $transaction_journal_budget_name
|
||||
*
|
||||
* @property-read int $transaction_category_id
|
||||
* @property-read string $transaction_category_name
|
||||
|
40
phpunit.coverage.specific.xml
Normal file
40
phpunit.coverage.specific.xml
Normal file
@ -0,0 +1,40 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<phpunit backupGlobals="false"
|
||||
backupStaticAttributes="false"
|
||||
bootstrap="vendor/autoload.php"
|
||||
colors="true"
|
||||
convertErrorsToExceptions="true"
|
||||
convertNoticesToExceptions="true"
|
||||
convertWarningsToExceptions="true"
|
||||
processIsolation="false"
|
||||
stopOnFailure="true">
|
||||
<testsuites>
|
||||
<testsuite name="Feature">
|
||||
<directory suffix="Test.php">./tests/Feature</directory>
|
||||
</testsuite>
|
||||
|
||||
<testsuite name="Unit">
|
||||
<directory suffix="Test.php">./tests/Unit</directory>
|
||||
</testsuite>
|
||||
</testsuites>
|
||||
<filter>
|
||||
<whitelist processUncoveredFilesFromWhitelist="true">
|
||||
<directory suffix=".php">./app</directory>
|
||||
<exclude>
|
||||
<file>app/Http/breadcrumbs.php</file>
|
||||
</exclude>
|
||||
</whitelist>
|
||||
<blacklist>
|
||||
<directory>vendor/</directory>
|
||||
</blacklist>
|
||||
</filter>
|
||||
<logging>
|
||||
<log type="coverage-clover" target="./storage/build/clover-specific.xml" charset="UTF-8"/>
|
||||
</logging>
|
||||
<php>
|
||||
<env name="APP_ENV" value="testing"/>
|
||||
<env name="CACHE_DRIVER" value="array"/>
|
||||
<env name="SESSION_DRIVER" value="array"/>
|
||||
<env name="QUEUE_DRIVER" value="sync"/>
|
||||
</php>
|
||||
</phpunit>
|
99
tests/Unit/Import/Converter/AmountTest.php
Normal file
99
tests/Unit/Import/Converter/AmountTest.php
Normal file
@ -0,0 +1,99 @@
|
||||
<?php
|
||||
/**
|
||||
* AmountTest.php
|
||||
* Copyright (c) 2017 thegrumpydictator@gmail.com
|
||||
* This software may be modified and distributed under the terms of the
|
||||
* Creative Commons Attribution-ShareAlike 4.0 International License.
|
||||
*
|
||||
* See the LICENSE file for details.
|
||||
*/
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Tests\Unit\Import\Converter;
|
||||
|
||||
use FireflyIII\Import\Converter\Amount;
|
||||
use Tests\TestCase;
|
||||
|
||||
/**
|
||||
* Class AmountTest
|
||||
*
|
||||
* 0, 0.0, 0.1, 0.01
|
||||
* 1, 1.0, 1.1, 1.12, 1.10
|
||||
* 12, 12.3, 12.34
|
||||
* 123, 123.4, 123.45
|
||||
* 1234, 1234.5, 1234.56
|
||||
* 1 234, 1 234.5, 1 234.56
|
||||
* 1.234, 1.234.5, 1.234.56
|
||||
*
|
||||
*
|
||||
*
|
||||
*
|
||||
*
|
||||
* @package Tests\Unit\Import\Converter
|
||||
*/
|
||||
class AmountTest extends TestCase
|
||||
{
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public function testConvert()
|
||||
{
|
||||
$values = [
|
||||
'0' => '0',
|
||||
'0.0' => '0',
|
||||
'0.1' => '0.1',
|
||||
'.2' => '0.2',
|
||||
'0.01' => '0.01',
|
||||
'1' => '1',
|
||||
'1.0' => '1',
|
||||
'1.1' => '1.1',
|
||||
'1.12' => '1.12',
|
||||
'1.10' => '1.1',
|
||||
'12' => '12',
|
||||
'12.3' => '12.3',
|
||||
'12.34' => '12.34',
|
||||
'123' => '123',
|
||||
'123.4' => '123.4',
|
||||
'123.45' => '123.45',
|
||||
'1234' => '1234',
|
||||
'1234.5' => '1234.5',
|
||||
'1234.56' => '1234.56',
|
||||
'1 234' => '1234',
|
||||
'1 234.5' => '1234.5',
|
||||
'1 234.56' => '1234.56',
|
||||
'1,234' => '1234',
|
||||
'1,234.5' => '1234.5',
|
||||
'1,234.56' => '1234.56',
|
||||
'0,0' => '0',
|
||||
'0,1' => '0.1',
|
||||
',2' => '0.2',
|
||||
'0,01' => '0.01',
|
||||
'1,0' => '1',
|
||||
'1,1' => '1.1',
|
||||
'1,12' => '1.12',
|
||||
'1,10' => '1.1',
|
||||
'12,3' => '12.3',
|
||||
'12,34' => '12.34',
|
||||
'123,4' => '123.4',
|
||||
'123,45' => '123.45',
|
||||
'1234,5' => '1234.5',
|
||||
'1234,56' => '1234.56',
|
||||
'1 234,5' => '1234.5',
|
||||
'1 234,56' => '1234.56',
|
||||
'1.234' => '1234',
|
||||
'1.234,5' => '1234.5',
|
||||
'1.234,56' => '1234.56',
|
||||
|
||||
];
|
||||
foreach ($values as $value => $expected) {
|
||||
$converter = new Amount;
|
||||
$result = $converter->convert($value);
|
||||
$this->assertEquals($expected, $result);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
Loading…
Reference in New Issue
Block a user