Skip to content

Commit

Permalink
Merge branch 'master' into fallback
Browse files Browse the repository at this point in the history
* master:
  Tests: use assertThat instead assertMatchesRegularExpression
  Fix tests: PHP-7.4 on Windows
  Fix tests: PHP-7.4 on Windows
  Fix tests
  Fix test
  Action: add Windows and macOS test
  Fix test locale eu
  Fix test with PHP-8.3
  Actions: update checkout and cache
  Test only on ubuntu-latest
  Test on matrix
  Fix fatal error when using the default PHP locale alphp#17
  Code review tweaks
  alphp#15 Fix fatal error with non-Gregorian locales
  • Loading branch information
splitbrain committed Jan 26, 2024
2 parents 301592c + 17f8419 commit 676f230
Show file tree
Hide file tree
Showing 8 changed files with 64 additions and 20 deletions.
20 changes: 17 additions & 3 deletions .github/workflows/php.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,17 +8,31 @@ permissions:
jobs:
build:

runs-on: ubuntu-latest
runs-on: ${{ matrix.operating-system }}

strategy:
matrix:
operating-system: [ubuntu-latest, windows-latest, macOS-latest]
php-versions: ['7.4', '8.0', '8.1', '8.2', '8.3']

name: PHP ${{ matrix.php-versions }} Test on ${{ matrix.operating-system }}

steps:
- uses: actions/checkout@v3
- name: Checkout
uses: actions/checkout@v4

- name: Install PHP
uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php-versions }}
extensions: intl

- name: Validate composer.json and composer.lock
run: composer validate --strict

- name: Cache Composer packages
id: composer-cache
uses: actions/cache@v3
uses: actions/cache@v4
with:
path: vendor
key: ${{ runner.os }}-php-${{ hashFiles('**/composer.lock') }}
Expand Down
8 changes: 2 additions & 6 deletions src/php-8.1-strftime.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
use DateTimeZone;
use Exception;
use InvalidArgumentException;
use Locale;

/**
* Locale-formatted strftime using IntlDateFormatter (PHP 8.1 compatible)
Expand Down Expand Up @@ -38,12 +39,7 @@ function strftime (string $format, $timestamp = null, ?string $locale = null) :

$timestamp->setTimezone(new DateTimeZone(date_default_timezone_get()));

if (empty($locale)) {
// get current locale
$locale = setlocale(LC_TIME, '0');
}
// remove trailing part not supported by ext-intl locale
$locale = preg_replace('/[^\w-].*$/', '', $locale);
$locale = Locale::canonicalize($locale ?? setlocale(LC_TIME, '0'));

if (class_exists('\\IntlDateFormatter') && !isset($_SERVER['STRFTIME_NO_INTL'])) {
$locale_formatter = new \PHP81_BC\strftime\IntlLocaleFormatter($locale);
Expand Down
10 changes: 8 additions & 2 deletions tests/LocaleTests/Locale_en_EN_TestTrait.php
Original file line number Diff line number Diff line change
Expand Up @@ -31,10 +31,16 @@ public function testLocale_en_EN () {
$this->assertEquals('Mar', $result, '%h: Abbreviated month name, based on the locale (an alias of %b)');

$result = strftime('%X', '20220306 13:02:03', $locale);
$this->assertEquals('1:02:03 PM', $result, '%X: Preferred time representation based on locale, without the date');
$this->assertThat($result, $this->logicalOr(
$this->equalTo('1:02:03 PM'), // PHP-7
$this->equalTo('13:02:03') // PHP-8
), '%X: Preferred time representation based on locale, without the date');

$result = strftime('%c', '20220306 13:02:03', $locale);
$this->assertEquals('March 6, 2022 at 1:02 PM', $result, '%c: Preferred date and time stamp based on locale');
$this->assertThat($result, $this->logicalOr(
$this->equalTo('March 6, 2022 at 1:02 PM'), // PHP-7
$this->equalTo('March 6, 2022 at 13:02') // PHP-8
), '%c: Preferred date and time stamp based on locale');

$result = strftime('%x', '20220306 13:02:03', $locale);
$this->assertEquals('3/6/22', $result, '%x: Preferred date representation based on locale, without the time');
Expand Down
15 changes: 12 additions & 3 deletions tests/LocaleTests/Locale_es_ES_TestTrait.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,19 +17,28 @@ public function testLocale_es_ES () {
}

$result = strftime('%a', '20220306 13:02:03', $locale);
$this->assertEquals('dom.', $result, '%a: An abbreviated textual representation of the day');
$this->assertThat($result, $this->logicalOr(
$this->equalTo('dom.'), // PHP-7
$this->equalTo('dom') // PHP-8
), '%a: An abbreviated textual representation of the day');

$result = strftime('%A', '20220306 13:02:03', $locale);
$this->assertEquals('domingo', $result, '%A: A full textual representation of the day');

$result = strftime('%b', '20220306 13:02:03', $locale);
$this->assertEquals('mar.', $result, '%b: Abbreviated month name, based on the locale');
$this->assertThat($result, $this->logicalOr(
$this->equalTo('mar.'), // PHP-7
$this->equalTo('mar') // PHP-8
), '%b: Abbreviated month name, based on the locale');

$result = strftime('%B', '20220306 13:02:03', $locale);
$this->assertEquals('marzo', $result, '%B: Full month name, based on the locale');

$result = strftime('%h', '20220306 13:02:03', $locale);
$this->assertEquals('mar.', $result, '%h: Abbreviated month name, based on the locale (an alias of %b)');
$this->assertThat($result, $this->logicalOr(
$this->equalTo('mar.'), // PHP-7
$this->equalTo('mar') // PHP-8
), '%h: Abbreviated month name, based on the locale (an alias of %b)');

$result = strftime('%X', '20220306 13:02:03', $locale);
$this->assertEquals('13:02:03', $result, '%X: Preferred time representation based on locale, without the date');
Expand Down
11 changes: 9 additions & 2 deletions tests/LocaleTests/Locale_eu_TestTrait.php
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,10 @@ public function testLocale_eu () {
$this->assertEquals('mar.', $result, '%b: Abbreviated month name, based on the locale');

$result = strftime('%B', '20220306 13:02:03', $locale);
$this->assertEquals('martxoa', $result, '%B: Full month name, based on the locale');
$this->assertThat($result, $this->logicalOr(
$this->equalTo('martxoak'),
$this->equalTo('martxoa') // PHP-7.4, PHP-8.3
), '%B: Full month name, based on the locale');

$result = strftime('%h', '20220306 13:02:03', $locale);
$this->assertEquals('mar.', $result, '%h: Abbreviated month name, based on the locale (an alias of %b)');
Expand All @@ -35,7 +38,11 @@ public function testLocale_eu () {
$this->assertEquals('13:02:03', $result, '%X: Preferred time representation based on locale, without the date');

$result = strftime('%c', '20220306 13:02:03', $locale);
$this->assertEquals('2022(e)ko martxoaren 6(a) 13:02', $result, '%c: Preferred date and time stamp based on locale');
$this->assertThat($result, $this->logicalOr(
$this->equalTo('2022(e)ko martxoaren 6(a) 13:02'), // PHP-7.4
$this->equalTo('2022(e)ko martxoakren 6(a) 13:02'),
$this->equalTo('2022(e)ko martxoaren 6(a) (13:02)') // PHP-8.3
), '%c: Preferred date and time stamp based on locale');

$result = strftime('%x', '20220306 13:02:03', $locale);
$this->assertEquals('22/3/6', $result, '%x: Preferred date representation based on locale, without the time');
Expand Down
5 changes: 4 additions & 1 deletion tests/LocaleTests/Locale_it_CH_TestTrait.php
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,10 @@ public function testLocale_it_CH () {
$this->assertEquals('13:02:03', $result, '%X: Preferred time representation based on locale, without the date');

$result = strftime('%c', '20220306 13:02:03', $locale);
$this->assertEquals('6 marzo 2022 13:02', $result, '%c: Preferred date and time stamp based on locale');
$this->assertThat($result, $this->logicalOr(
$this->equalTo('6 marzo 2022 13:02'),
$this->equalTo('6 marzo 2022 alle ore 13:02') // PHP-8.3
), '%c: Preferred date and time stamp based on locale');

$result = strftime('%x', '20220306 13:02:03', $locale);
$this->assertEquals('06.03.22', $result, '%x: Preferred date representation based on locale, without the time');
Expand Down
5 changes: 4 additions & 1 deletion tests/LocaleTests/Locale_it_IT_TestTrait.php
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,10 @@ public function testLocale_it_IT () {
$this->assertEquals('13:02:03', $result, '%X: Preferred time representation based on locale, without the date');

$result = strftime('%c', '20220306 13:02:03', $locale);
$this->assertEquals('6 marzo 2022 13:02', $result, '%c: Preferred date and time stamp based on locale');
$this->assertThat($result, $this->logicalOr(
$this->equalTo('6 marzo 2022 13:02'),
$this->equalTo('6 marzo 2022 alle ore 13:02') // PHP-8.3
), '%c: Preferred date and time stamp based on locale');

$result = strftime('%x', '20220306 13:02:03', $locale);
$this->assertEquals('06/03/22', $result, '%x: Preferred date representation based on locale, without the time');
Expand Down
10 changes: 8 additions & 2 deletions tests/strftimeTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,10 @@ public function testTimeFormats () {
$this->assertEquals('13:02:03', $result, '%T: Same as "%H:%M:%S"');

$result = strftime('%X', '20220306 13:02:03', 'en-EN');
$this->assertEquals('1:02:03 PM', $result, '%X: Preferred time representation based on locale, without the date');
$this->assertThat($result, $this->logicalOr(
$this->equalTo('1:02:03 PM'),
$this->equalTo('13:02:03') // PHP-8
), '%X: Preferred time representation based on locale, without the date');

$result = strftime('%z', '20220306 13:02:03');
$this->assertEquals('+0100', $result, '%z: The time zone offset');
Expand All @@ -144,7 +147,10 @@ public function testTimeFormats () {

public function testStampsFormats () {
$result = strftime('%c', '20220306 13:02:03', 'en-EN');
$this->assertEquals('March 6, 2022 at 1:02 PM', $result, '%c: Preferred date and time stamp based on locale');
$this->assertThat($result, $this->logicalOr(
$this->equalTo('March 6, 2022 at 1:02 PM'),
$this->equalTo('March 6, 2022 at 13:02') // PHP-8
), '%c: Preferred date and time stamp based on locale');

$result = strftime('%D', '20220306 13:02:03');
$this->assertEquals('03/06/2022', $result, '%D: Same as "%m/%d/%y"');
Expand Down

0 comments on commit 676f230

Please sign in to comment.