77use SilverStripe \ORM \DB ;
88use SilverStripe \Dev \SapphireTest ;
99use SilverStripe \i18n \i18n ;
10+ use PHPUnit \Framework \Attributes \DataProvider ;
1011
1112class DBMoneyTest extends SapphireTest
1213{
@@ -339,6 +340,84 @@ public function testHasAmount()
339340 $ this ->assertFalse ($ obj ->MyMoney ->hasAmount ());
340341 }
341342
343+ public static function provideSetGetValue (): array
344+ {
345+ return [
346+ 'int ' => [
347+ 'amount ' => 3 ,
348+ 'currency ' => 'NZD ' ,
349+ 'expected ' => '3 NZD ' ,
350+ ],
351+ 'string-int ' => [
352+ 'amount ' => '3 ' ,
353+ 'currency ' => 'NZD ' ,
354+ 'expected ' => '3 NZD ' ,
355+ ],
356+ 'negative-int ' => [
357+ 'amount ' => -3 ,
358+ 'currency ' => 'NZD ' ,
359+ 'expected ' => '-3 NZD ' ,
360+ ],
361+ 'negative-string-int ' => [
362+ 'amount ' => '-3 ' ,
363+ 'currency ' => 'NZD ' ,
364+ 'expected ' => '-3 NZD ' ,
365+ ],
366+ 'float ' => [
367+ 'amount ' => 3.65 ,
368+ 'currency ' => 'NZD ' ,
369+ 'expected ' => '3.65 NZD ' ,
370+ ],
371+ 'string-float ' => [
372+ 'amount ' => '3.65 ' ,
373+ 'currency ' => 'NZD ' ,
374+ 'expected ' => '3.65 NZD ' ,
375+ ],
376+ 'negative-float ' => [
377+ 'amount ' => -3.65 ,
378+ 'currency ' => 'NZD ' ,
379+ 'expected ' => '-3.65 NZD ' ,
380+ ],
381+ 'negative-string-float ' => [
382+ 'amount ' => '-3.65 ' ,
383+ 'currency ' => 'NZD ' ,
384+ 'expected ' => '-3.65 NZD ' ,
385+ ],
386+ 'no-curency ' => [
387+ 'amount ' => '1.23 ' ,
388+ 'currency ' => null ,
389+ 'expected ' => '1.23 ' ,
390+ ],
391+ 'non-numeric-no-currency ' => [
392+ 'amount ' => 'fish ' ,
393+ 'currency ' => null ,
394+ 'expected ' => 'fish ' ,
395+ ],
396+ 'string ' => [
397+ 'amount ' => 'fish ' ,
398+ 'currency ' => 'NZD ' ,
399+ 'expected ' => 'fish NZD ' ,
400+ ],
401+ 'array ' => [
402+ 'amount ' => [],
403+ 'currency ' => 'NZD ' ,
404+ 'expected ' => null ,
405+ ],
406+ 'null ' => [
407+ 'amount ' => null ,
408+ 'currency ' => 'NZD ' ,
409+ 'expected ' => null ,
410+ ],
411+ ];
412+ }
413+
414+ #[DataProvider('provideSetGetValue ' )]
415+ public function testSetGetValue (mixed $ amount , ?string $ currency , mixed $ expected ): void
416+ {
417+ $ field = new DBMoney ('MyField ' );
418+ $ field ->setValue (['Amount ' => $ amount , 'Currency ' => $ currency ]);
419+ $ this ->assertSame ($ expected , $ field ->getValue ());
420+ }
342421
343422 /**
344423 * In some cases and locales, validation expects non-breaking spaces.
@@ -353,4 +432,103 @@ protected function clean($input)
353432 $ nbsp = html_entity_decode (' ' , 0 , 'UTF-8 ' );
354433 return str_replace (' ' , $ nbsp ?? '' , trim ($ input ?? '' ));
355434 }
435+
436+ public static function provideValidate (): array
437+ {
438+ return [
439+ 'zero ' => [
440+ 'currency ' => 'NZD ' ,
441+ 'amount ' => 1 ,
442+ 'expected ' => true ,
443+ ],
444+ 'no-cents ' => [
445+ 'currency ' => 'NZD ' ,
446+ 'amount ' => 1 ,
447+ 'expected ' => true ,
448+ ],
449+ 'cents ' => [
450+ 'currency ' => 'NZD ' ,
451+ 'amount ' => 1.52 ,
452+ 'expected ' => true ,
453+ ],
454+ 'negative-zero-point-five ' => [
455+ 'currency ' => 'NZD ' ,
456+ 'amount ' => -0.5 ,
457+ 'expected ' => true ,
458+ ],
459+ 'string-zero ' => [
460+ 'currency ' => 'NZD ' ,
461+ 'amount ' => '0 ' ,
462+ 'expected ' => true ,
463+ ],
464+ 'string-no-cents ' => [
465+ 'currency ' => 'NZD ' ,
466+ 'amount ' => '1 ' ,
467+ 'expected ' => true ,
468+ ],
469+ 'string-cents ' => [
470+ 'currency ' => 'NZD ' ,
471+ 'amount ' => '1.5 ' ,
472+ 'expected ' => true ,
473+ ],
474+ 'string-negative-zero-point-five ' => [
475+ 'currency ' => 'NZD ' ,
476+ 'amount ' => '-0.5 ' ,
477+ 'expected ' => true ,
478+ ],
479+ 'string-fish ' => [
480+ 'currency ' => 'NZD ' ,
481+ 'amount ' => 'fish ' ,
482+ 'expected ' => false ,
483+ ],
484+ 'empty-string ' => [
485+ 'currency ' => 'NZD ' ,
486+ 'amount ' => '' ,
487+ 'expected ' => false ,
488+ ],
489+ 'null ' => [
490+ 'currency ' => 'NZD ' ,
491+ 'amount ' => null ,
492+ 'expected ' => true ,
493+ ],
494+ 'true ' => [
495+ 'currency ' => 'NZD ' ,
496+ 'amount ' => true ,
497+ 'expected ' => false ,
498+ ],
499+ 'false ' => [
500+ 'currency ' => 'NZD ' ,
501+ 'amount ' => false ,
502+ 'expected ' => false ,
503+ ],
504+ 'currency-blank ' => [
505+ 'currency ' => '' ,
506+ 'amount ' => 1 ,
507+ 'expected ' => true ,
508+ ],
509+ 'currency-null ' => [
510+ 'currency ' => null ,
511+ 'amount ' => 1 ,
512+ 'expected ' => true ,
513+ ],
514+ 'currency-true ' => [
515+ 'currency ' => true ,
516+ 'amount ' => 1 ,
517+ 'expected ' => false ,
518+ ],
519+ 'currency-false ' => [
520+ 'currency ' => false ,
521+ 'amount ' => 1 ,
522+ 'expected ' => false ,
523+ ],
524+ ];
525+ }
526+
527+ #[DataProvider('provideValidate ' )]
528+ public function testValidate (mixed $ currency , mixed $ amount , bool $ expected ): void
529+ {
530+ $ money = new DBMoney ();
531+ $ money ->setValue (['Currency ' => $ currency , 'Amount ' => $ amount ]);
532+ $ this ->assertEquals ($ expected , $ money ->validate ()->isValid ());
533+ }
356534}
0 commit comments