TimeSpellerTest.php 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. <?php
  2. namespace morphos\test\Russian;
  3. use DateInterval;
  4. use DateTime;
  5. use InvalidArgumentException;
  6. use morphos\Russian\TimeSpeller;
  7. use PHPUnit\Framework\TestCase;
  8. class TimeSpellerTest extends TestCase
  9. {
  10. /**
  11. * @dataProvider intervalsProvider()
  12. *
  13. * @param $interval
  14. * @param $options
  15. * @param $result
  16. *
  17. * @throws \Exception
  18. */
  19. public function testSpellInterval($interval, $options, $result)
  20. {
  21. $this->assertEquals($result, TimeSpeller::spellInterval(new DateInterval($interval), $options));
  22. }
  23. public function intervalsProvider()
  24. {
  25. return
  26. [
  27. ['P1Y5M10D', 0, '1 год 5 месяцев 10 дней'],
  28. ['P10Y1MT5H', 0, '10 лет 1 месяц 5 часов'],
  29. ['P3DT1H2M', 0, '3 дня 1 час 2 минуты'],
  30. ['P10MT40M30S', 0, '10 месяцев 40 минут 30 секунд'],
  31. ['P1Y5M10D', TimeSpeller::SEPARATE, '1 год, 5 месяцев и 10 дней'],
  32. ['P10Y1MT5H', TimeSpeller::DIRECTION, '10 лет 1 месяц 5 часов назад'],
  33. ['P3DT1H2M', TimeSpeller::SEPARATE | TimeSpeller::DIRECTION, '3 дня, 1 час и 2 минуты назад'],
  34. ['PT1M1S', TimeSpeller::SEPARATE | TimeSpeller::DIRECTION, '1 минута и 1 секунда назад'],
  35. ['P10MT40M30S', TimeSpeller::SEPARATE, '10 месяцев, 40 минут и 30 секунд'],
  36. ];
  37. }
  38. /**
  39. * @dataProvider timeUnitsProvider()
  40. * @throws \Exception
  41. */
  42. public function testSpellUnit($value, $unit, $result)
  43. {
  44. $this->assertEquals($result, TimeSpeller::spellUnit($value, $unit));
  45. }
  46. public function timeUnitsProvider()
  47. {
  48. return
  49. [
  50. [2, TimeSpeller::YEAR, '2 года'],
  51. [5, TimeSpeller::YEAR, '5 лет'],
  52. [105, TimeSpeller::YEAR, '105 лет'],
  53. [5, TimeSpeller::MONTH, '5 месяцев'],
  54. [5, TimeSpeller::HOUR, '5 часов'],
  55. [5, TimeSpeller::SECOND, '5 секунд'],
  56. ];
  57. }
  58. /**
  59. * @dataProvider differencesProvides()
  60. *
  61. * @param $dateTime
  62. * @param $limit
  63. *
  64. * @throws \Exception
  65. */
  66. public function testSpellDifference($dateTime, $limit)
  67. {
  68. $diff = (new DateTime('@' . time()))->diff(new DateTime(is_numeric($dateTime) ? '@' . $dateTime : $dateTime));
  69. $this->assertEquals(TimeSpeller::spellInterval($diff, 0, $limit),
  70. TimeSpeller::spellDifference($dateTime, 0, $limit));
  71. }
  72. public function differencesProvides()
  73. {
  74. return
  75. [
  76. ['+30 minutes 2 seconds', 1],
  77. [time() + 3600, 1],
  78. [time() + 86400, 1],
  79. ];
  80. }
  81. /**
  82. * @throws \Exception
  83. */
  84. public function testSpellUnitInvalid()
  85. {
  86. $this->expectException(InvalidArgumentException::class);
  87. TimeSpeller::spellUnit(1, 'Invalid-Unit');
  88. }
  89. }