Repository: briannesbitt/Carbon (php)

Issue:
[Translation tool] mn
## Additional fixes
1 week ago => 1 долоо хоногийн өмнө
2 week ago => 2 долоо хоногийн өмнө
3 week ago => 3 долоо хоногийн өмнө
like "хоногийн"(correct way) not "хоногн"(this is current and wrong way)

Pull request description:
Fix week declension in Mongolian for "ago"
Fix #2556

Patch:
diff --git a/composer.json b/composer.json
index 4da48a5e..84ec1361 100644
--- a/composer.json
+++ b/composer.json
@@ -35,16 +35,14 @@
         "phpmd/phpmd": "^2.9",
         "phpstan/extension-installer": "^1.0",
         "phpstan/phpstan": "^0.12.54 || ^1.0",
-        "phpunit/phpunit": "^7.5.20 || ^8.5.23",
-        "phpunit/php-file-iterator": "^2.0.5",
+        "phpunit/phpunit": "^7.5.20 || ^8.5.14",
         "squizlabs/php_codesniffer": "^3.4"
     },
     "config": {
         "process-timeout": 0,
         "sort-packages": true,
         "allow-plugins": {
-            "phpstan/extension-installer": true,
-            "composer/package-versions-deprecated": true
+            "phpstan/extension-installer": true
         }
     },
     "extra": {
diff --git a/phpunit.xml.dist b/phpunit.xml.dist
index abdf80ff..b27bad32 100644
--- a/phpunit.xml.dist
+++ b/phpunit.xml.dist
@@ -2,7 +2,6 @@
 <phpunit
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/8.5/phpunit.xsd"
-    bootstrap="tests/bootstrap.php"
     colors="true"
 >
     <filter>
diff --git a/readme.md b/readme.md
index 100e60f2..5d827219 100644
--- a/readme.md
+++ b/readme.md
@@ -126,10 +126,6 @@ Support this project by becoming a sponsor. Your logo will show up here with a l
 <a href="https://opencollective.com/Carbon/sponsor/2/website" target="_blank"><img src="https://opencollective.com/Carbon/sponsor/2/avatar.svg"></a>
 <a href="https://opencollective.com/Carbon/sponsor/3/website" target="_blank"><img src="https://opencollective.com/Carbon/sponsor/3/avatar.svg"></a>
 <a href="https://opencollective.com/Carbon/sponsor/4/website" target="_blank"><img src="https://opencollective.com/Carbon/sponsor/4/avatar.svg"></a>
-<a href="https://opencollective.com/Carbon/sponsor/5/website" target="_blank"><img src="https://opencollective.com/Carbon/sponsor/5/avatar.svg"></a>
-<a href="https://opencollective.com/Carbon/sponsor/6/website" target="_blank"><img src="https://opencollective.com/Carbon/sponsor/6/avatar.svg"></a>
-<a href="https://opencollective.com/Carbon/sponsor/7/website" target="_blank"><img src="https://opencollective.com/Carbon/sponsor/7/avatar.svg"></a>
-<a href="https://opencollective.com/Carbon/sponsor/8/website" target="_blank"><img src="https://opencollective.com/Carbon/sponsor/8/avatar.svg"></a>
 
 [[Become a sponsor](https://opencollective.com/Carbon#sponsor)]
 
diff --git a/src/Carbon/Lang/en.php b/src/Carbon/Lang/en.php
index f81f617e..a8633fef 100644
--- a/src/Carbon/Lang/en.php
+++ b/src/Carbon/Lang/en.php
@@ -72,7 +72,7 @@ return [
         $lastDigit = $number % 10;
 
         return $number.(
-            ((int) ($number % 100 / 10) === 1) ? 'th' : (
+            (~~($number % 100 / 10) === 1) ? 'th' : (
                 ($lastDigit === 1) ? 'st' : (
                     ($lastDigit === 2) ? 'nd' : (
                         ($lastDigit === 3) ? 'rd' : 'th'
diff --git a/src/Carbon/Lang/fr.php b/src/Carbon/Lang/fr.php
index 8c81ec65..73fe5e41 100644
--- a/src/Carbon/Lang/fr.php
+++ b/src/Carbon/Lang/fr.php
@@ -90,7 +90,7 @@ return [
     'weekdays_min' => ['di', 'lu', 'ma', 'me', 'je', 've', 'sa'],
     'ordinal' => function ($number, $period) {
         switch ($period) {
-            // In French, only the first has to be ordinal, other number remains cardinal
+            // In french, only the first has be ordinal, other number remains cardinal
             // @link https://fr.wikihow.com/%C3%A9crire-la-date-en-fran%C3%A7ais
             case 'D':
                 return $number.($number === 1 ? 'er' : '');
diff --git a/src/Carbon/Lang/mn.php b/src/Carbon/Lang/mn.php
index 717d199b..1a37d630 100644
--- a/src/Carbon/Lang/mn.php
+++ b/src/Carbon/Lang/mn.php
@@ -26,6 +26,7 @@
  * - Nicolás Hock Isaza
  * - Ochirkhuyag
  * - Batmandakh
+ * - lucifer-crybaby
  */
 return [
     'year' => ':count жил',
@@ -43,38 +44,52 @@ return [
     'second' => ':count секунд',
     's' => ':countс',
 
-    'ago' => ':timeн өмнө',
-    'year_ago' => ':count жилий',
-    'month_ago' => ':count сары',
-    'day_ago' => ':count хоногий',
-    'hour_ago' => ':count цагий',
-    'minute_ago' => ':count минуты',
-    'second_ago' => ':count секунды',
+    'ago' => ':time өмнө',
+    'year_ago' => ':count жилийн',
+    'y_ago' => ':count жилийн',
+    'month_ago' => ':count сарын',
+    'm_ago' => ':count сарын',
+    'day_ago' => ':count хоногийн',
+    'd_ago' => ':count хоногийн',
+    'week_ago' => ':count долоо хоногийн',
+    'w_ago' => ':count долоо хоногийн',
+    'hour_ago' => ':count цагийн',
+    'minute_ago' => ':count минутын',
+    'second_ago' => ':count секундын',
 
     'from_now' => 'одоогоос :time',
     'year_from_now' => ':count жилийн дараа',
+    'y_from_now' => ':count жилийн дараа',
     'month_from_now' => ':count сарын дараа',
+    'm_from_now' => ':count сарын дараа',
     'day_from_now' => ':count хоногийн дараа',
+    'd_from_now' => ':count хоногийн дараа',
     'hour_from_now' => ':count цагийн дараа',
     'minute_from_now' => ':count минутын дараа',
     'second_from_now' => ':count секундын дараа',
 
     // Does it required to make translation for before, after as follows? hmm, I think we've made it with ago and from now keywords already. Anyway, I've included it just in case of undesired action...
-    'after' => ':timeн дараа',
-    'year_after' => ':count жилий',
-    'month_after' => ':count сары',
-    'day_after' => ':count хоногий',
-    'hour_after' => ':count цагий',
-    'minute_after' => ':count минуты',
-    'second_after' => ':count секунды',
+    'after' => ':time дараа',
+    'year_after' => ':count жилийн',
+    'y_after' => ':count жилийн',
+    'month_after' => ':count сарын',
+    'm_after' => ':count сарын',
+    'day_after' => ':count хоногийн',
+    'd_after' => ':count хоногийн',
+    'hour_after' => ':count цагийн',
+    'minute_after' => ':count минутын',
+    'second_after' => ':count секундын',
 
-    'before' => ':timeн өмнө',
-    'year_before' => ':count жилий',
-    'month_before' => ':count сары',
-    'day_before' => ':count хоногий',
-    'hour_before' => ':count цагий',
-    'minute_before' => ':count минуты',
-    'second_before' => ':count секунды',
+    'before' => ':time өмнө',
+    'year_before' => ':count жилийн',
+    'y_before' => ':count жилийн',
+    'month_before' => ':count сарын',
+    'm_before' => ':count сарын',
+    'day_before' => ':count хоногийн',
+    'd_before' => ':count хоногийн',
+    'hour_before' => ':count цагийн',
+    'minute_before' => ':count минутын',
+    'second_before' => ':count секундын',
 
     'list' => ', ',
     'diff_now' => 'одоо',
diff --git a/src/Carbon/Lang/ss.php b/src/Carbon/Lang/ss.php
index 1c52c9bf..cd4b9190 100644
--- a/src/Carbon/Lang/ss.php
+++ b/src/Carbon/Lang/ss.php
@@ -50,7 +50,7 @@ return [
         $lastDigit = $number % 10;
 
         return $number.(
-            ((int) ($number % 100 / 10) === 1) ? 'e' : (
+            (~~($number % 100 / 10) === 1) ? 'e' : (
                 ($lastDigit === 1 || $lastDigit === 2) ? 'a' : 'e'
             )
         );
diff --git a/src/Carbon/Lang/sv.php b/src/Carbon/Lang/sv.php
index 1706c719..ca33e1c4 100644
--- a/src/Carbon/Lang/sv.php
+++ b/src/Carbon/Lang/sv.php
@@ -70,7 +70,7 @@ return [
         $lastDigit = $number % 10;
 
         return $number.(
-            ((int) ($number % 100 / 10) === 1) ? 'e' : (
+            (~~($number % 100 / 10) === 1) ? 'e' : (
                 ($lastDigit === 1 || $lastDigit === 2) ? 'a' : 'e'
             )
         );
diff --git a/src/Carbon/Traits/Date.php b/src/Carbon/Traits/Date.php
index bdffefeb..8c8af6fb 100644
--- a/src/Carbon/Traits/Date.php
+++ b/src/Carbon/Traits/Date.php
@@ -1848,10 +1848,7 @@ trait Date
             $format = preg_replace('#(?<!%)((?:%%)*)%e#', '\1%#d', $format); // @codeCoverageIgnore
         }
 
-        $time = strtotime($this->toDateTimeString());
-        $formatted = ($this->localStrictModeEnabled ?? static::isStrictModeEnabled())
-            ? strftime($format, $time)
-            : @strftime($format, $time);
+        $formatted = strftime($format, strtotime($this->toDateTimeString()));
 
         return static::$utf8 ? utf8_encode($formatted) : $formatted;
     }
@@ -2362,7 +2359,7 @@ trait Date
         $symbol = $second < 0 ? '-' : '+';
         $minute = abs($second) / static::SECONDS_PER_MINUTE;
         $hour = str_pad((string) floor($minute / static::MINUTES_PER_HOUR), 2, '0', STR_PAD_LEFT);
-        $minute = str_pad((string) (((int) $minute) % static::MINUTES_PER_HOUR), 2, '0', STR_PAD_LEFT);
+        $minute = str_pad((string) ($minute % static::MINUTES_PER_HOUR), 2, '0', STR_PAD_LEFT);
 
         return "$symbol$hour$separator$minute";
     }


Test patch:
diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml
index 43f06f5c..8efaf34a 100644
--- a/.github/workflows/tests.yml
+++ b/.github/workflows/tests.yml
@@ -61,9 +61,20 @@ jobs:
 
           - php: 8.0
             laravel: true
+            reference: 9.x
 
           - php: 8.0
             laravel: true
+            reference: 9.x
+            classmap-authoritative: true
+
+          - php: 8.1
+            laravel: true
+            reference: master
+
+          - php: 8.1
+            laravel: true
+            reference: master
             classmap-authoritative: true
 
     name: ${{ matrix.laravel && 'Laravel compatibility - ' || '' }}${{ matrix.classmap-authoritative && 'classmap-authoritative - ' || '' }}${{ matrix.coverage && 'Coverage - ' || '' }}PHP ${{ matrix.php }} - ${{ matrix.setup || 'stable' }} - ubuntu
@@ -94,19 +105,19 @@ jobs:
           if [[ "${{ matrix.laravel }}" != 'true' ]]; then
             composer remove --no-update kylekatarnls/multi-tester --no-interaction;
           fi;
-          ${{ matrix.php >= 8.1 && 'composer require --no-update phpunit/phpunit:^8.5.23 --no-interaction;' || '' }}
-          composer update --prefer-dist --no-progress --prefer-${{ matrix.setup || 'stable' }} ${{ matrix.classmap-authoritative && '--classmap-authoritative' || '' }};
+          ${{ matrix.php >= 8.1 && 'composer require --no-update phpunit/phpunit:^8.5.14 --no-interaction;' || '' }}
+          composer update --prefer-dist --no-progress --prefer-${{ matrix.setup || 'stable' }} ${{ matrix.php >= 8.1 && '--ignore-platform-req=php' || '' }} ${{ matrix.classmap-authoritative && '--classmap-authoritative' || '' }};
 
       - name: Run test suite
         run: |
           if [[ "${{ matrix.laravel }}" != 'true' && "${{ matrix.coverage }}" = 'true' ]]; then
-            php -d memory_limit=-1 -d zend.enable_gc=0 -d error_reporting=-1 vendor/phpunit/phpunit/phpunit --coverage-clover=coverage.xml --coverage-text;
+            php -d memory_limit=-1 -d zend.enable_gc=0 vendor/phpunit/phpunit/phpunit --coverage-clover=coverage.xml --coverage-text;
           fi;
           if [[ "${{ matrix.laravel }}" != 'true' && "${{ matrix.coverage }}" != 'true' ]]; then
-            php -d memory_limit=-1 -d zend.enable_gc=0 -d error_reporting=-1 vendor/phpunit/phpunit/phpunit;
+            php -d memory_limit=-1 -d zend.enable_gc=0 vendor/phpunit/phpunit/phpunit;
           fi;
           if [[ "${{ matrix.laravel }}" = 'true' ]]; then
-            vendor/bin/multi-tester;
+            vendor/bin/multi-tester tests/Laravel/laravel-${{ matrix.reference }}.multi-tester.yml;
           fi;
         env:
           PHP_VERSION: ${{ matrix.php }}
@@ -185,12 +196,12 @@ jobs:
       - name: Install dependencies
         run: |
           composer remove --no-update kylekatarnls/multi-tester phpmd/phpmd friendsofphp/php-cs-fixer --no-interaction;
-          ${{ matrix.php >= 8.1 && 'composer require --no-update phpunit/phpunit:^8.5.23 --no-interaction;' || '' }}
-          composer update --prefer-dist --no-progress --prefer-${{ matrix.setup || 'stable' }};
+          ${{ matrix.php >= 8.1 && 'composer require --no-update phpunit/phpunit:^8.5.14 --no-interaction;' || '' }}
+          composer update --prefer-dist --no-progress --prefer-${{ matrix.setup || 'stable' }} ${{ matrix.php >= 8.1 && '--ignore-platform-req=php' || '' }};
 
       - name: Run test suite
         run: |
-          php -d memory_limit=-1 -d zend.enable_gc=0 -d error_reporting=-1 vendor/phpunit/phpunit/phpunit;
+          php -d memory_limit=-1 -d zend.enable_gc=0 vendor/phpunit/phpunit/phpunit;
         env:
           PHP_VERSION: ${{ matrix.php }}
           REDIS_HOST: 127.0.0.1
diff --git a/.multi-tester.yml b/.multi-tester.yml
deleted file mode 100644
index 1cbc825e..00000000
--- a/.multi-tester.yml
+++ /dev/null
@@ -1,10 +0,0 @@
-laravel/framework:
-  source:
-    type: git
-    url: https://github.com/laravel/framework.git
-    reference: master
-    success_only: true
-  install:
-    - composer require psr/log:2.0.0 --no-update
-    - composer update --prefer-dist --no-interaction --prefer-stable
-    - echo -e "\nREDIS_HOST=127.0.0.1\nREDIS_PORT=6379" >> .env
diff --git a/tests/Carbon/GettersTest.php b/tests/Carbon/GettersTest.php
index 217578e2..35b1c828 100644
--- a/tests/Carbon/GettersTest.php
+++ b/tests/Carbon/GettersTest.php
@@ -197,8 +197,6 @@ class GettersTest extends AbstractTestCase
 
     public function testLocalizedGetters()
     {
-        Carbon::useStrictMode(false);
-
         $currentLocale = setlocale(LC_ALL, '0');
         if (setlocale(LC_ALL, 'fr_FR.UTF-8', 'fr_FR.utf8', 'fr_FR', 'fr') === false) {
             $this->markTestSkipped('testSetLocaleToAuto test need fr_FR.UTF-8.');
diff --git a/tests/Carbon/IssetTest.php b/tests/Carbon/IssetTest.php
index ba7a2693..10a4c4a2 100644
--- a/tests/Carbon/IssetTest.php
+++ b/tests/Carbon/IssetTest.php
@@ -13,7 +13,6 @@ declare(strict_types=1);
 
 namespace Tests\Carbon;
 
-use Carbon\CarbonImmutable as Carbon;
 use Generator;
 use Tests\AbstractTestCase;
 
@@ -100,7 +99,6 @@ class IssetTest extends AbstractTestCase
      */
     public function testIssetReturnTrueForProperties(string $property): void
     {
-        Carbon::useStrictMode(false);
-        $this->assertTrue(isset($this->immutableNow->{$property}));
+        $this->assertTrue(isset($this->now->{$property}));
     }
 }
diff --git a/tests/Carbon/StringsTest.php b/tests/Carbon/StringsTest.php
index 73a49348..b5ec4086 100644
--- a/tests/Carbon/StringsTest.php
+++ b/tests/Carbon/StringsTest.php
@@ -17,7 +17,6 @@ use Carbon\Carbon;
 use Carbon\CarbonInterface;
 use Carbon\Factory;
 use DateTime;
-use ErrorException;
 use InvalidArgumentException;
 use Tests\AbstractTestCase;
 use Tests\Carbon\Fixtures\BadIsoCarbon;
@@ -145,8 +144,6 @@ class StringsTest extends AbstractTestCase
 
     public function testToLocalizedFormattedDateString()
     {
-        Carbon::useStrictMode(false);
-
         $this->wrapWithUtf8LcTimeLocale('fr_FR', function () {
             $d = Carbon::create(1975, 12, 25, 14, 15, 16);
             $date = $d->formatLocalized('%A %d %B %Y');
@@ -155,25 +152,8 @@ class StringsTest extends AbstractTestCase
         });
     }
 
-    public function testToLocalizedFormattedDeprecation()
-    {
-        if (version_compare(PHP_VERSION, '8.1.0-dev', '>=')) {
-            $this->expectExceptionObject(
-                new ErrorException('Function strftime() is deprecated', E_DEPRECATED)
-            );
-        }
-
-        $this->wrapWithUtf8LcTimeLocale('fr_FR', function () {
-            $date = Carbon::parse('2021-05-26')->formatLocalized('%A %d %B %Y');
-
-            $this->assertSame('mercredi 26 mai 2021', $date);
-        });
-    }
-
     public function testToLocalizedFormattedDateStringWhenUtf8IsNedded()
     {
-        Carbon::useStrictMode(false);
-
         $this->wrapWithUtf8LcTimeLocale('fr_FR', function () {
             $d = Carbon::create(1975, 12, 25, 14, 15, 16, 'Europe/Paris');
             Carbon::setUtf8(false);
@@ -189,8 +169,6 @@ class StringsTest extends AbstractTestCase
 
     public function testToLocalizedFormattedTimezonedDateString()
     {
-        Carbon::useStrictMode(false);
-
         $d = Carbon::create(1975, 12, 25, 14, 15, 16, 'Europe/London');
         $this->assertSame('Thursday 25 December 1975 14:15', $d->formatLocalized('%A %d %B %Y %H:%M'));
     }
@@ -343,11 +321,6 @@ class StringsTest extends AbstractTestCase
         $this->assertSame('ene.', $d->locale('es')->isoFormat('MMM'));
         $this->assertSame('1 de enero de 2017', $d->locale('es')->isoFormat('LL'));
         $this->assertSame('1 de ene. de 2017', $d->locale('es')->isoFormat('ll'));
-
-        $this->assertSame('1st', Carbon::parse('2018-06-01')->isoFormat('Do'));
-        $this->assertSame('11th', Carbon::parse('2018-06-11')->isoFormat('Do'));
-        $this->assertSame('21st', Carbon::parse('2018-06-21')->isoFormat('Do'));
-        $this->assertSame('15th', Carbon::parse('2018-06-15')->isoFormat('Do'));
     }
 
     public function testBadIsoFormat()
diff --git a/tests/CarbonImmutable/IssetTest.php b/tests/CarbonImmutable/IssetTest.php
index 9f84d0ad..4864bb10 100644
--- a/tests/CarbonImmutable/IssetTest.php
+++ b/tests/CarbonImmutable/IssetTest.php
@@ -13,7 +13,6 @@ declare(strict_types=1);
 
 namespace Tests\CarbonImmutable;
 
-use Carbon\CarbonImmutable as Carbon;
 use Generator;
 use Tests\AbstractTestCase;
 
@@ -100,7 +99,6 @@ class IssetTest extends AbstractTestCase
      */
     public function testIssetReturnTrueForProperties(string $property): void
     {
-        Carbon::useStrictMode(false);
         $this->assertTrue(isset($this->immutableNow->{$property}));
     }
 }
diff --git a/tests/CarbonImmutable/StringsTest.php b/tests/CarbonImmutable/StringsTest.php
index 73dff184..fb2c93f3 100644
--- a/tests/CarbonImmutable/StringsTest.php
+++ b/tests/CarbonImmutable/StringsTest.php
@@ -93,8 +93,6 @@ class StringsTest extends AbstractTestCase
 
     public function testToLocalizedFormattedDateString()
     {
-        Carbon::useStrictMode(false);
-
         $this->wrapWithUtf8LcTimeLocale('fr_FR', function () {
             $d = Carbon::create(1975, 12, 25, 14, 15, 16);
             $date = $d->formatLocalized('%A %d %B %Y');
@@ -105,8 +103,6 @@ class StringsTest extends AbstractTestCase
 
     public function testToLocalizedFormattedDateStringWhenUtf8IsNedded()
     {
-        Carbon::useStrictMode(false);
-
         $this->wrapWithUtf8LcTimeLocale('fr_FR', function () {
             $d = Carbon::create(1975, 12, 25, 14, 15, 16, 'Europe/Paris');
             Carbon::setUtf8(false);
@@ -122,7 +118,6 @@ class StringsTest extends AbstractTestCase
 
     public function testToLocalizedFormattedTimezonedDateString()
     {
-        Carbon::useStrictMode(false);
         $d = Carbon::create(1975, 12, 25, 14, 15, 16, 'Europe/London');
         $this->assertSame('Thursday 25 December 1975 14:15', $d->formatLocalized('%A %d %B %Y %H:%M'));
     }
@@ -275,11 +270,6 @@ class StringsTest extends AbstractTestCase
         $this->assertSame('ene.', $d->locale('es')->isoFormat('MMM'));
         $this->assertSame('1 de enero de 2017', $d->locale('es')->isoFormat('LL'));
         $this->assertSame('1 de ene. de 2017', $d->locale('es')->isoFormat('ll'));
-
-        $this->assertSame('1st', Carbon::parse('2018-06-01')->isoFormat('Do'));
-        $this->assertSame('11th', Carbon::parse('2018-06-11')->isoFormat('Do'));
-        $this->assertSame('21st', Carbon::parse('2018-06-21')->isoFormat('Do'));
-        $this->assertSame('15th', Carbon::parse('2018-06-15')->isoFormat('Do'));
     }
 
     public function testBadIsoFormat()
diff --git a/tests/Laravel/App.php b/tests/Laravel/App.php
index 6837aac6..8a0ef16d 100644
--- a/tests/Laravel/App.php
+++ b/tests/Laravel/App.php
@@ -88,25 +88,21 @@ class App implements ArrayAccess
         return isset($this->{$service});
     }
 
-    #[\ReturnTypeWillChange]
     public function offsetExists($offset)
     {
         return isset($this->$offset);
     }
 
-    #[\ReturnTypeWillChange]
     public function offsetGet($offset)
     {
         return $this->$offset;
     }
 
-    #[\ReturnTypeWillChange]
     public function offsetSet($offset, $value)
     {
         // noop
     }
 
-    #[\ReturnTypeWillChange]
     public function offsetUnset($offset)
     {
         // noop
diff --git a/tests/Laravel/laravel-9.x.multi-tester.yml b/tests/Laravel/laravel-9.x.multi-tester.yml
new file mode 100644
index 00000000..a4e6fc65
--- /dev/null
+++ b/tests/Laravel/laravel-9.x.multi-tester.yml
@@ -0,0 +1,14 @@
+config:
+  directory: ../..
+
+projects:
+  laravel/framework:
+    source:
+      type: git
+      url: https://github.com/laravel/framework.git
+      reference: 9.x
+      success_only: true
+    install:
+      - composer require psr/log:2.0.0 --no-update
+      - composer update --prefer-dist --no-interaction --prefer-stable
+      - echo -e "\nREDIS_HOST=127.0.0.1\nREDIS_PORT=6379" >> .env
diff --git a/tests/Laravel/laravel-master.multi-tester.yml b/tests/Laravel/laravel-master.multi-tester.yml
new file mode 100644
index 00000000..0733702e
--- /dev/null
+++ b/tests/Laravel/laravel-master.multi-tester.yml
@@ -0,0 +1,14 @@
+config:
+  directory: ../..
+
+projects:
+  laravel/framework:
+    source:
+      type: git
+      url: https://github.com/laravel/framework.git
+      reference: master
+      success_only: true
+    install:
+      - composer require psr/log:2.0.0 --no-update
+      - composer update --prefer-dist --no-interaction --prefer-stable
+      - echo -e "\nREDIS_HOST=127.0.0.1\nREDIS_PORT=6379" >> .env
diff --git a/tests/Localization/MnMnTest.php b/tests/Localization/MnMnTest.php
index a7c96064..6dcd18c0 100644
--- a/tests/Localization/MnMnTest.php
+++ b/tests/Localization/MnMnTest.php
@@ -126,59 +126,59 @@ class MnMnTest extends LocalizationTestCase
         // Carbon::now()->subSeconds(1)->diffForHumans()
         '1 секундын өмнө',
         // Carbon::now()->subSeconds(1)->diffForHumans(null, false, true)
-        '1сн өмнө',
+        '1с өмнө',
         // Carbon::now()->subSeconds(2)->diffForHumans()
         '2 секундын өмнө',
         // Carbon::now()->subSeconds(2)->diffForHumans(null, false, true)
-        '2сн өмнө',
+        '2с өмнө',
         // Carbon::now()->subMinutes(1)->diffForHumans()
         '1 минутын өмнө',
         // Carbon::now()->subMinutes(1)->diffForHumans(null, false, true)
-        '1мн өмнө',
+        '1м өмнө',
         // Carbon::now()->subMinutes(2)->diffForHumans()
         '2 минутын өмнө',
         // Carbon::now()->subMinutes(2)->diffForHumans(null, false, true)
-        '2мн өмнө',
+        '2м өмнө',
         // Carbon::now()->subHours(1)->diffForHumans()
         '1 цагийн өмнө',
         // Carbon::now()->subHours(1)->diffForHumans(null, false, true)
-        '1цн өмнө',
+        '1ц өмнө',
         // Carbon::now()->subHours(2)->diffForHumans()
         '2 цагийн өмнө',
         // Carbon::now()->subHours(2)->diffForHumans(null, false, true)
-        '2цн өмнө',
+        '2ц өмнө',
         // Carbon::now()->subDays(1)->diffForHumans()
         '1 хоногийн өмнө',
         // Carbon::now()->subDays(1)->diffForHumans(null, false, true)
-        '1 өдөрн өмнө',
+        '1 хоногийн өмнө',
         // Carbon::now()->subDays(2)->diffForHumans()
         '2 хоногийн өмнө',
         // Carbon::now()->subDays(2)->diffForHumans(null, false, true)
-        '2 өдөрн өмнө',
+        '2 хоногийн өмнө',
         // Carbon::now()->subWeeks(1)->diffForHumans()
-        '1 долоо хоногн өмнө',
+        '1 долоо хоногийн өмнө',
         // Carbon::now()->subWeeks(1)->diffForHumans(null, false, true)
-        '1 долоо хоногн өмнө',
+        '1 долоо хоногийн өмнө',
         // Carbon::now()->subWeeks(2)->diffForHumans()
-        '2 долоо хоногн өмнө',
+        '2 долоо хоногийн өмнө',
         // Carbon::now()->subWeeks(2)->diffForHumans(null, false, true)
-        '2 долоо хоногн өмнө',
+        '2 долоо хоногийн өмнө',
         // Carbon::now()->subMonths(1)->diffForHumans()
         '1 сарын өмнө',
         // Carbon::now()->subMonths(1)->diffForHumans(null, false, true)
-        '1 сарн өмнө',
+        '1 сарын өмнө',
         // Carbon::now()->subMonths(2)->diffForHumans()
         '2 сарын өмнө',
         // Carbon::now()->subMonths(2)->diffForHumans(null, false, true)
-        '2 сарн өмнө',
+        '2 сарын өмнө',
         // Carbon::now()->subYears(1)->diffForHumans()
         '1 жилийн өмнө',
         // Carbon::now()->subYears(1)->diffForHumans(null, false, true)
-        '1 жилн өмнө',
+        '1 жилийн өмнө',
         // Carbon::now()->subYears(2)->diffForHumans()
         '2 жилийн өмнө',
         // Carbon::now()->subYears(2)->diffForHumans(null, false, true)
-        '2 жилн өмнө',
+        '2 жилийн өмнө',
         // Carbon::now()->addSecond()->diffForHumans()
         'одоогоос 1 секундын дараа',
         // Carbon::now()->addSecond()->diffForHumans(null, false, true)
@@ -186,11 +186,11 @@ class MnMnTest extends LocalizationTestCase
         // Carbon::now()->addSecond()->diffForHumans(Carbon::now())
         '1 секундын дараа',
         // Carbon::now()->addSecond()->diffForHumans(Carbon::now(), false, true)
-        '1сн дараа',
+        '1с дараа',
         // Carbon::now()->diffForHumans(Carbon::now()->addSecond())
         '1 секундын өмнө',
         // Carbon::now()->diffForHumans(Carbon::now()->addSecond(), false, true)
-        '1сн өмнө',
+        '1с өмнө',
         // Carbon::now()->addSecond()->diffForHumans(Carbon::now(), true)
         '1 секунд',
         // Carbon::now()->addSecond()->diffForHumans(Carbon::now(), true, true)
@@ -208,9 +208,9 @@ class MnMnTest extends LocalizationTestCase
         // Carbon::now()->addYears(3)->diffForHumans(null, null, false, 4)
         'одоогоос 3 жилийн дараа',
         // Carbon::now()->subMonths(5)->diffForHumans(null, null, true, 4)
-        '5 сарн өмнө',
+        '5 сарын өмнө',
         // Carbon::now()->subYears(2)->subMonths(3)->subDay()->subSecond()->diffForHumans(null, null, true, 4)
-        '2 жил 3 сар 1 өдөр 1сн өмнө',
+        '2 жилийн 3 сарын 1 хоногийн 1с өмнө',
         // Carbon::now()->addWeek()->addHours(10)->diffForHumans(null, true, false, 2)
         '1 долоо хоног 10 цаг',
         // Carbon::now()->addWeek()->addDays(6)->diffForHumans(null, true, false, 2)
diff --git a/tests/Localization/MnTest.php b/tests/Localization/MnTest.php
index 15935c40..9f40d3cb 100644
--- a/tests/Localization/MnTest.php
+++ b/tests/Localization/MnTest.php
@@ -126,59 +126,59 @@ class MnTest extends LocalizationTestCase
         // Carbon::now()->subSeconds(1)->diffForHumans()
         '1 секундын өмнө',
         // Carbon::now()->subSeconds(1)->diffForHumans(null, false, true)
-        '1сн өмнө',
+        '1с өмнө',
         // Carbon::now()->subSeconds(2)->diffForHumans()
         '2 секундын өмнө',
         // Carbon::now()->subSeconds(2)->diffForHumans(null, false, true)
-        '2сн өмнө',
+        '2с өмнө',
         // Carbon::now()->subMinutes(1)->diffForHumans()
         '1 минутын өмнө',
         // Carbon::now()->subMinutes(1)->diffForHumans(null, false, true)
-        '1мн өмнө',
+        '1м өмнө',
         // Carbon::now()->subMinutes(2)->diffForHumans()
         '2 минутын өмнө',
         // Carbon::now()->subMinutes(2)->diffForHumans(null, false, true)
-        '2мн өмнө',
+        '2м өмнө',
         // Carbon::now()->subHours(1)->diffForHumans()
         '1 цагийн өмнө',
         // Carbon::now()->subHours(1)->diffForHumans(null, false, true)
-        '1цн өмнө',
+        '1ц өмнө',
         // Carbon::now()->subHours(2)->diffForHumans()
         '2 цагийн өмнө',
         // Carbon::now()->subHours(2)->diffForHumans(null, false, true)
-        '2цн өмнө',
+        '2ц өмнө',
         // Carbon::now()->subDays(1)->diffForHumans()
         '1 хоногийн өмнө',
         // Carbon::now()->subDays(1)->diffForHumans(null, false, true)
-        '1 өдөрн өмнө',
+        '1 хоногийн өмнө',
         // Carbon::now()->subDays(2)->diffForHumans()
         '2 хоногийн өмнө',
         // Carbon::now()->subDays(2)->diffForHumans(null, false, true)
-        '2 өдөрн өмнө',
+        '2 хоногийн өмнө',
         // Carbon::now()->subWeeks(1)->diffForHumans()
-        '1 долоо хоногн өмнө',
+        '1 долоо хоногийн өмнө',
         // Carbon::now()->subWeeks(1)->diffForHumans(null, false, true)
-        '1 долоо хоногн өмнө',
+        '1 долоо хоногийн өмнө',
         // Carbon::now()->subWeeks(2)->diffForHumans()
-        '2 долоо хоногн өмнө',
+        '2 долоо хоногийн өмнө',
         // Carbon::now()->subWeeks(2)->diffForHumans(null, false, true)
-        '2 долоо хоногн өмнө',
+        '2 долоо хоногийн өмнө',
         // Carbon::now()->subMonths(1)->diffForHumans()
         '1 сарын өмнө',
         // Carbon::now()->subMonths(1)->diffForHumans(null, false, true)
-        '1 сарн өмнө',
+        '1 сарын өмнө',
         // Carbon::now()->subMonths(2)->diffForHumans()
         '2 сарын өмнө',
         // Carbon::now()->subMonths(2)->diffForHumans(null, false, true)
-        '2 сарн өмнө',
+        '2 сарын өмнө',
         // Carbon::now()->subYears(1)->diffForHumans()
         '1 жилийн өмнө',
         // Carbon::now()->subYears(1)->diffForHumans(null, false, true)
-        '1 жилн өмнө',
+        '1 жилийн өмнө',
         // Carbon::now()->subYears(2)->diffForHumans()
         '2 жилийн өмнө',
         // Carbon::now()->subYears(2)->diffForHumans(null, false, true)
-        '2 жилн өмнө',
+        '2 жилийн өмнө',
         // Carbon::now()->addSecond()->diffForHumans()
         'одоогоос 1 секундын дараа',
         // Carbon::now()->addSecond()->diffForHumans(null, false, true)
@@ -186,11 +186,11 @@ class MnTest extends LocalizationTestCase
         // Carbon::now()->addSecond()->diffForHumans(Carbon::now())
         '1 секундын дараа',
         // Carbon::now()->addSecond()->diffForHumans(Carbon::now(), false, true)
-        '1сн дараа',
+        '1с дараа',
         // Carbon::now()->diffForHumans(Carbon::now()->addSecond())
         '1 секундын өмнө',
         // Carbon::now()->diffForHumans(Carbon::now()->addSecond(), false, true)
-        '1сн өмнө',
+        '1с өмнө',
         // Carbon::now()->addSecond()->diffForHumans(Carbon::now(), true)
         '1 секунд',
         // Carbon::now()->addSecond()->diffForHumans(Carbon::now(), true, true)
@@ -208,9 +208,9 @@ class MnTest extends LocalizationTestCase
         // Carbon::now()->addYears(3)->diffForHumans(null, null, false, 4)
         'одоогоос 3 жилийн дараа',
         // Carbon::now()->subMonths(5)->diffForHumans(null, null, true, 4)
-        '5 сарн өмнө',
+        '5 сарын өмнө',
         // Carbon::now()->subYears(2)->subMonths(3)->subDay()->subSecond()->diffForHumans(null, null, true, 4)
-        '2 жил 3 сар 1 өдөр 1сн өмнө',
+        '2 жилийн 3 сарын 1 хоногийн 1с өмнө',
         // Carbon::now()->addWeek()->addHours(10)->diffForHumans(null, true, false, 2)
         '1 долоо хоног 10 цаг',
         // Carbon::now()->addWeek()->addDays(6)->diffForHumans(null, true, false, 2)
diff --git a/tests/bootstrap.php b/tests/bootstrap.php
deleted file mode 100644
index 29bc3a77..00000000
--- a/tests/bootstrap.php
+++ /dev/null
@@ -1,28 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-/**
- * This file is part of the Carbon package.
- *
- * (c) Brian Nesbitt <brian@nesbot.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-require_once __DIR__.'/../vendor/autoload.php';
-
-set_error_handler(static function (
-    int $errno,
-    string $errstr,
-    string $errfile = '',
-    int $errline = 0,
-    array $errcontext = []
-): bool {
-    if (!(error_reporting() & $errno)) {
-        return false;
-    }
-
-    throw new ErrorException($errstr, $errno, $errno, $errfile, $errline);
-});