Skip to content

Commit

Permalink
Merge 9d2329a into 277af72
Browse files Browse the repository at this point in the history
  • Loading branch information
Kharhamel committed Sep 23, 2019
2 parents 277af72 + 9d2329a commit 7e931e0
Show file tree
Hide file tree
Showing 6 changed files with 445 additions and 4 deletions.
10 changes: 6 additions & 4 deletions generated/apcu.php
Original file line number Diff line number Diff line change
Expand Up @@ -53,14 +53,15 @@ function apcu_cas(string $key, int $old, int $new): void
* @param int $step The step, or value to decrease.
* @param bool $success Optionally pass the success or fail boolean value to
* this referenced variable.
* @param int $ttl TTL to use if the operation inserts a new value (rather than decrementing an existing one).
* @return int Returns the current value of key's value on success
* @throws ApcuException
*
*/
function apcu_dec(string $key, int $step = 1, ?bool &$success = null): int
function apcu_dec(string $key, int $step = 1, ?bool &$success = null, int $ttl = 0): int
{
error_clear_last();
$result = \apcu_dec($key, $step, $success);
$result = \apcu_dec($key, $step, $success, $ttl);
if ($result === false) {
throw ApcuException::createFromPhpError();
}
Expand Down Expand Up @@ -96,14 +97,15 @@ function apcu_delete($key): void
* @param int $step The step, or value to increase.
* @param bool $success Optionally pass the success or fail boolean value to
* this referenced variable.
* @param int $ttl TTL to use if the operation inserts a new value (rather than incrementing an existing one).
* @return int Returns the current value of key's value on success
* @throws ApcuException
*
*/
function apcu_inc(string $key, int $step = 1, ?bool &$success = null): int
function apcu_inc(string $key, int $step = 1, ?bool &$success = null, int $ttl = 0): int
{
error_clear_last();
$result = \apcu_inc($key, $step, $success);
$result = \apcu_inc($key, $step, $success, $ttl);
if ($result === false) {
throw ApcuException::createFromPhpError();
}
Expand Down
135 changes: 135 additions & 0 deletions generator/tests/DateTimeImmutableTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,135 @@
<?php


namespace Safe;


use PHPUnit\Framework\TestCase;
use Safe\Exceptions\DatetimeException;

class DateTimeImmutableTest extends TestCase
{
protected function setUp()
{
require_once __DIR__ . '/../../lib/Exceptions/SafeExceptionInterface.php';
require_once __DIR__ . '/../../lib/Exceptions/AbstractSafeException.php';
require_once __DIR__ . '/../../generated/Exceptions/DatetimeException.php';
require_once __DIR__ . '/../../lib/DateTimeImmutable.php';
}

public function testCreateFromFormatCrashOnError(): void
{
$this->expectException(DatetimeException::class);
$datetime = DateTimeImmutable::createFromFormat('lol', 'super');
}

public function testConstructorPreserveTimeAndTimezone(): void
{
$timezone = new \DateTimeZone('Pacific/Chatham');
$datetime = new DateTimeImmutable('now', $timezone);
$this->assertInstanceOf(DateTimeImmutable::class, $datetime);
$this->assertEquals($timezone, $datetime->getTimezone());
}

public function testCreateFromFormatPreserveTimeAndTimezone(): void
{
$timezone = new \DateTimeZone('Pacific/Chatham');
$datetime = DateTimeImmutable::createFromFormat('d-m-Y', '20-03-2006', $timezone);
$this->assertInstanceOf(DateTimeImmutable::class, $datetime);
$this->assertEquals('20-03-2006', $datetime->format('d-m-Y'));
$this->assertEquals($timezone, $datetime->getTimezone());
}

public function testSafeDatetimeImmutableIsImmutable(): void
{
$datetime1 = new DateTimeImmutable();
$datetime2 = $datetime1->add(new \DateInterval('P1W'));

$this->assertNotEquals($datetime1, $datetime2);
}

public function testSetDate(): void
{
$datetime = new \DateTimeImmutable();
$safeDatetime = new DateTimeImmutable();
$datetime = $datetime->setDate(2017, 4, 6);
$safeDatetime = $safeDatetime->setDate(2017, 4, 6);
$this->assertInstanceOf(DateTimeImmutable::class, $safeDatetime);
$this->assertEquals($datetime->format('Y-m-d'), $safeDatetime->format('Y-m-d'));
}

public function testSetIsoDate(): void
{
$datetime = new \DateTimeImmutable();
$safeDatetime = new DateTimeImmutable();
$datetime = $datetime->setISODate(2017, 4, 6);
$safeDatetime = $safeDatetime->setISODate(2017, 4, 6);
$this->assertInstanceOf(DateTimeImmutable::class, $safeDatetime);
$this->assertEquals($datetime->format('Y-m-d'), $safeDatetime->format('Y-m-d'));
}

public function testModify(): void
{
$datetime = new \DateTimeImmutable();
$datetime = $datetime->setDate(2017, 4, 6);
$datetime = $datetime->modify('+1 day');
$safeDatime = new DateTimeImmutable();
$safeDatime = $safeDatime->setDate(2017, 4, 6);
$safeDatime = $safeDatime->modify('+1 day');
$this->assertInstanceOf(DateTimeImmutable::class, $safeDatime);
$this->assertEquals($datetime->format('j-n-Y'), $safeDatime->format('j-n-Y'));
}

public function testSetTimestamp(): void
{
$datetime = new \DateTimeImmutable('2000-01-01');
$safeDatime = new DateTimeImmutable('2000-01-01');
$datetime = $datetime = $datetime->setTimestamp(12);
$safeDatime = $safeDatime->setTimestamp(12);

$this->assertEquals($datetime->getTimestamp(), $safeDatime->getTimestamp());
}

public function testSetTimezone(): void
{
$timezone = new \DateTimeZone('Pacific/Chatham');
$datetime = new \DateTimeImmutable('2000-01-01');
$safeDatime = new DateTimeImmutable('2000-01-01');
$datetime = $datetime->setTimezone($timezone);
$safeDatime = $safeDatime->setTimezone($timezone);

$this->assertEquals($datetime->getTimezone(), $safeDatime->getTimezone());
}

public function testSetTime(): void
{
$datetime = new \DateTimeImmutable('2000-01-01');
$safeDatime = new DateTimeImmutable('2000-01-01');
$datetime = $datetime->setTime(2, 3, 1, 5);
$safeDatime = $safeDatime->setTime(2, 3, 1, 5);

$this->assertEquals($datetime->format('H-i-s-u'), $safeDatime->format('H-i-s-u'));
}

public function testAdd(): void
{
$interval = new \DateInterval('P1M');
$datetime = new \DateTimeImmutable('2000-01-01');
$safeDatime = new DateTimeImmutable('2000-01-01');
$datetime = $datetime->add($interval);
$safeDatime = $safeDatime->add($interval);

$this->assertEquals($datetime->getTimestamp(), $safeDatime->getTimestamp());
}

public function testSub(): void
{
$interval = new \DateInterval('P1M');
$datetime = new \DateTimeImmutable('2000-01-01');
$safeDatime = new DateTimeImmutable('2000-01-01');
$datetime = $datetime->sub($interval);
$safeDatime = $safeDatime->sub($interval);

$this->assertEquals($datetime->getTimestamp(), $safeDatime->getTimestamp());
}
}
55 changes: 55 additions & 0 deletions generator/tests/DateTimeTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
<?php


namespace Safe;


use PHPUnit\Framework\TestCase;
use Safe\Exceptions\DatetimeException;

class DateTimeTest extends TestCase
{
protected function setUp()
{
require_once __DIR__ . '/../../lib/Exceptions/SafeExceptionInterface.php';
require_once __DIR__ . '/../../lib/Exceptions/AbstractSafeException.php';
require_once __DIR__ . '/../../generated/Exceptions/DatetimeException.php';
require_once __DIR__ . '/../../lib/DateTime.php';
}

public function testSafeDatetimeCrashOnError(): void
{
$this->expectException(DatetimeException::class);
$datetime = DateTime::createFromFormat('lol', 'super');
}

public function testSafeDatetimePreserveTimeAndTimezone(): void
{
$timezone = new \DateTimeZone('Pacific/Chatham');
$datetime = DateTime::createFromFormat('d-m-Y', '20-03-2006', $timezone);
$this->assertInstanceOf(DateTime::class, $datetime);
$this->assertEquals('20-03-2006', $datetime->format('d-m-Y'));
$this->assertEquals($timezone, $datetime->getTimezone());
}

public function testSafeDatetimeSetDate(): void
{
$datetime = new DateTime();
$datetime = $datetime->setDate(2017, 4, 6);
$this->assertInstanceOf(DateTime::class, $datetime);
$this->assertEquals(2017, $datetime->format('Y'));
$this->assertEquals(4, $datetime->format('n'));
$this->assertEquals(6, $datetime->format('j'));

//todo: test an error case
}

public function testSafeDatetimeModify(): void
{
$datetime = new DateTime();
$datetime = $datetime->setDate(2017, 4, 6);
$datetime = $datetime->modify('+1 day');
$this->assertInstanceOf(DateTime::class, $datetime);
$this->assertEquals('7-4-2017', $datetime->format('j-n-Y'));
}
}
1 change: 1 addition & 0 deletions generator/tests/SpecialCasesTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

class SpecialCasesTest extends TestCase
{

public function testPregReplace()
{
require_once __DIR__.'/../../lib/special_cases.php';
Expand Down
72 changes: 72 additions & 0 deletions lib/DateTime.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
<?php

namespace Safe;

use DateInterval;
use DateTimeInterface;
use DateTimeZone;
use Safe\Exceptions\DatetimeException;

//this class is used to implement a safe version of the Datetime
class DateTime extends \DateTime
{
//switch from regular datetime to safe version
private static function createFromRegular(\DateTime $datetime): self
{
return new self($datetime->format('Y-m-d H:i:s'), $datetime->getTimezone());
}

public static function createFromFormat($format, $time, DateTimeZone $timezone = null): self
{
$datetime = parent::createFromFormat($format, $time, $timezone);
if ($datetime === false) {
throw DatetimeException::createFromPhpError();
}
return self::createFromRegular($datetime);
}

/**
* @param DateTimeInterface $datetime2 The date to compare to.
* @param boolean $absolute [optional] Whether to return absolute difference.
* @return DateInterval The DateInterval object representing the difference between the two dates.
*/
public function diff($datetime2, $absolute = false): DateInterval
{
/** @var \DateInterval|false $result */
$result = parent::diff($datetime2, $absolute);
if ($result === false) {
throw DatetimeException::createFromPhpError();
}
return $result;
}

/**
* @param string $modify A date/time string. Valid formats are explained in <a href="https://secure.php.net/manual/en/datetime.formats.php">Date and Time Formats</a>.
* @return DateTime Returns the DateTime object for method chaining.
*/
public function modify($modify): self
{
/** @var DateTime|false $result */
$result = parent::modify($modify);
if ($result === false) {
throw DatetimeException::createFromPhpError();
}
return $result;
}

/**
* @param int $year
* @param int $month
* @param int $day
* @return DateTime
*/
public function setDate($year, $month, $day): self
{
/** @var DateTime|false $result */
$result = parent::setDate($year, $month, $day);
if ($result === false) {
throw DatetimeException::createFromPhpError();
}
return $result;
}
}
Loading

0 comments on commit 7e931e0

Please sign in to comment.