importation Hour et Time et d'autres vclasses
This commit is contained in:
		
							parent
							
								
									4f0d6d40dc
								
							
						
					
					
						commit
						efb4f037ec
					
				
							
								
								
									
										16
									
								
								php/src/php/time/Hour.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								php/src/php/time/Hour.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,16 @@ | |||||||
|  | <?php | ||||||
|  | namespace nulib\php\time; | ||||||
|  | 
 | ||||||
|  | class Hour extends Time { | ||||||
|  |   const UNIT = self::UNIT_MINUTES; | ||||||
|  | 
 | ||||||
|  |   const FORMAT = "%hh%M"; | ||||||
|  | 
 | ||||||
|  |   function format(?string $format=null): string { | ||||||
|  |     $string = parent::format($format); | ||||||
|  |     if (substr($string, -3) == "h00") { | ||||||
|  |       $string = substr($string, 0, -2); | ||||||
|  |     } | ||||||
|  |     return $string; | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										288
									
								
								php/src/php/time/Time.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										288
									
								
								php/src/php/time/Time.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,288 @@ | |||||||
|  | <?php | ||||||
|  | namespace nulib\php\time; | ||||||
|  | 
 | ||||||
|  | use DateTimeInterface; | ||||||
|  | use nulib\exceptions; | ||||||
|  | use nulib\php\types\vbool; | ||||||
|  | use nulib\php\types\vint; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * Class Time: une heure allant de 0h à 24h inclus. | ||||||
|  |  * | ||||||
|  |  * la seule utilisation autorisée de "24h" est comme borne supérieure pour une | ||||||
|  |  * plage horaire. | ||||||
|  |  */ | ||||||
|  | class Time { | ||||||
|  |   const UNIT_HOURS = 3600; | ||||||
|  |   const UNIT_MINUTES = 60; | ||||||
|  |   const UNIT_SECONDS = 1; | ||||||
|  | 
 | ||||||
|  |   const PATTERNS = [ | ||||||
|  |     '/^(\d+)[:.h](\d+)(?:[:.](\d+))?$/', | ||||||
|  |     '/^(\d+)h(?:(\d+)(?:[:.](\d+))?)?$/' | ||||||
|  |   ]; | ||||||
|  | 
 | ||||||
|  |   /** @var string format par défaut pour l'affichage */ | ||||||
|  |   const FORMAT = "%H:%M:%S"; | ||||||
|  | 
 | ||||||
|  |   static function with($time): self { | ||||||
|  |     if ($time instanceof static) return $time; | ||||||
|  |     else return new static($time); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   static function withn($time): ?self { | ||||||
|  |     if ($time === null) return null; | ||||||
|  |     elseif ($time instanceof static) return $time; | ||||||
|  |     else return new static($time); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   static function isa_time($time): bool { | ||||||
|  |     if ($time === null) return false; | ||||||
|  |     if ($time instanceof self) return true; | ||||||
|  |     if (is_int($time)) return true; | ||||||
|  |     if (is_string($time)) { | ||||||
|  |       foreach (self::PATTERNS as $pattern) { | ||||||
|  |         if (preg_match($pattern, $time)) return true; | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |     if ($time instanceof DateTimeInterface) return true; | ||||||
|  |     if (is_array($time) && count($time) == 3) return true; | ||||||
|  |     return false; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   protected static function s_now(): int { | ||||||
|  |     $hms = date('His'); | ||||||
|  |     return intval(substr($hms, 0, 2)) * 3600 | ||||||
|  |       + intval(substr($hms, 2, 2)) * 60 | ||||||
|  |       + intval(substr($hms, 4, 2)); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   protected static function s_get($time, int $unit=self::UNIT_SECONDS): int { | ||||||
|  |     if ($time === null) { | ||||||
|  |       return 0; | ||||||
|  |     } elseif ($time instanceof self) { | ||||||
|  |       return $time->getSeconds(); | ||||||
|  |     } elseif (is_int($time)) { | ||||||
|  |       return $time * $unit; | ||||||
|  |     } elseif (is_string($time)) { | ||||||
|  |       $matched = false; | ||||||
|  |       foreach (self::PATTERNS as $pattern) { | ||||||
|  |         if (preg_match($pattern, $time, $ms)) { | ||||||
|  |           $matched = true; | ||||||
|  |           break; | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |       if ($matched) { | ||||||
|  |         $h = $ms[1]; | ||||||
|  |         $m = $ms[2] ?? 0; | ||||||
|  |         $s = $ms[3] ?? 0; | ||||||
|  |         return intval($h) * 3600 + intval($m) * 60 + intval($s); | ||||||
|  |       } | ||||||
|  |     } elseif ($time instanceof DateTimeInterface) { | ||||||
|  |       $hms = $time->format('His'); | ||||||
|  |       return intval(substr($hms, 0, 2)) * 3600 | ||||||
|  |         + intval(substr($hms, 2, 2)) * 60 | ||||||
|  |         + intval(substr($hms, 4, 2)); | ||||||
|  |     } elseif (is_array($time) && count($time) == 3) { | ||||||
|  |       [$h, $m, $s] = $time; | ||||||
|  |       return $h * 3600 + $m * 60 + $s; | ||||||
|  |     } | ||||||
|  |     throw exceptions::invalid_value($time, "time"); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   protected static function s_adjust(int &$seconds, int $unit=self::UNIT_SECONDS, ?int $step=null): int { | ||||||
|  |     if ($step !== null) $unit *= $step; | ||||||
|  |     $adjust = $seconds % $unit; | ||||||
|  |     if ($seconds < 0) $adjust = -$adjust; | ||||||
|  |     $seconds -= $adjust; | ||||||
|  |     return $seconds; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   protected static function s_wrap_start(int &$seconds): int { | ||||||
|  |     while ($seconds < 0) $seconds += 86400; | ||||||
|  |     if ($seconds >= 86400) $seconds %= 86400; | ||||||
|  |     return $seconds; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   protected static function s_wrap_end(int &$seconds): int { | ||||||
|  |     while ($seconds < 0) $seconds += 86400; | ||||||
|  |     if ($seconds > 86400) $seconds %= 86400; | ||||||
|  |     return $seconds; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   /** | ||||||
|  |    * @var int la valeur de l'unité en secondes, pour le constructeur et les | ||||||
|  |    * méthodes {@link setu()}, {@link addu()} et {@link subu()} | ||||||
|  |    */ | ||||||
|  |   const UNIT = self::UNIT_SECONDS; | ||||||
|  | 
 | ||||||
|  |   /** | ||||||
|  |    * @var int|null un nombre d'unité dont l'heure doit être multiple. par | ||||||
|  |    * exemple, si l'unité est la minute, une valeur 5 permet d'avoir des heures | ||||||
|  |    * qui vont de 5 en 5 minutes (0h00, 0h05, 0h10, etc.) | ||||||
|  |    */ | ||||||
|  |   const STEP = null; | ||||||
|  | 
 | ||||||
|  |   /** @var bool s'il faut garder les heures dans la plage [0, 24h] */ | ||||||
|  |   const WRAP = true; | ||||||
|  | 
 | ||||||
|  |   function __construct($time=null, ?array $params=null) { | ||||||
|  |     $this->unit = vint::with($params["unit"] ?? static::UNIT); | ||||||
|  |     $this->step = vint::withn($params["step"] ?? self::STEP); | ||||||
|  |     $this->wrap = vbool::with($params["wrap"] ?? self::WRAP); | ||||||
|  |     if ($time === null) $seconds = self::s_now(); | ||||||
|  |     else $seconds = self::s_get($time, $this->unit); | ||||||
|  |     $this->setSeconds($seconds); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   protected int $unit; | ||||||
|  | 
 | ||||||
|  |   protected ?int $step; | ||||||
|  | 
 | ||||||
|  |   protected bool $wrap; | ||||||
|  | 
 | ||||||
|  |   protected int $seconds; | ||||||
|  | 
 | ||||||
|  |   function getSeconds(): int { | ||||||
|  |     return $this->seconds; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   /** | ||||||
|  |    * mettre à jour cet objet avec le nombre de secondes spécifié | ||||||
|  |    * | ||||||
|  |    * le nombre effectif de secondes est calculé en tenant compte de l'unité | ||||||
|  |    * actuelle | ||||||
|  |    * | ||||||
|  |    * @return int le nombre de seconde effectif, après correction | ||||||
|  |    */ | ||||||
|  |   protected function setSeconds(?int $seconds): int { | ||||||
|  |     $this->seconds = $seconds ?? self::s_now(); | ||||||
|  |     return $this->afterUpdate(); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   protected function afterUpdate(): int { | ||||||
|  |     self::s_adjust($this->seconds, $this->unit, $this->step); | ||||||
|  |     if ($this->wrap) $this->wrapEnd(); | ||||||
|  |     return $this->seconds; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   /** | ||||||
|  |    * wrapper l'heure pour la garder dans la plage [0h, 24h[ ce qui la rend | ||||||
|  |    * propice à l'utilisation comme borne inférieure d'une période | ||||||
|  |    */ | ||||||
|  |   function wrapStart(): self { | ||||||
|  |     self::s_wrap_start($this->seconds); | ||||||
|  |     return $this; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   /** | ||||||
|  |    * wrapper l'heure pour la garder dans la plage [0h, 24h] ce qui la rend | ||||||
|  |    * propice à l'utilisation comme borne supérieure d'une période | ||||||
|  |    */ | ||||||
|  |   function wrapEnd(): self { | ||||||
|  |     self::s_wrap_end($this->seconds); | ||||||
|  |     return $this; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   /** formatter cette heure pour affichage */ | ||||||
|  |   function format(?string $format=null): string { | ||||||
|  |     if ($format === null) $format = static::FORMAT; | ||||||
|  |     $v = $this->seconds; | ||||||
|  |     $h = intdiv($v, 3600); $v = $v % 3600; | ||||||
|  |     $m = intdiv($v, 60); | ||||||
|  |     $s = $v % 60; | ||||||
|  |     $searches = [ | ||||||
|  |       "%H", "%h", | ||||||
|  |       "%M", "%m", | ||||||
|  |       "%S", "%s", | ||||||
|  |       "%%", | ||||||
|  |     ]; | ||||||
|  |     $replaces = [ | ||||||
|  |       sprintf("%02u", $h), strval($h), | ||||||
|  |       sprintf("%02u", $m), strval($m), | ||||||
|  |       sprintf("%02u", $s), strval($s), | ||||||
|  |       "%", | ||||||
|  |     ]; | ||||||
|  |     return str_replace($searches, $replaces, $format); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   function __toString(): string { | ||||||
|  |     return $this->format(); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   /** @return int le nombre d'unités */ | ||||||
|  |   function getu(): int { | ||||||
|  |     return intdiv($this->seconds, $this->unit); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   /** créer une nouvelle heure avec le nombre d'unités spécifiées */ | ||||||
|  |   function setu(int $count): self { | ||||||
|  |     $this->setSeconds($count * $this->unit); | ||||||
|  |     return $this; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   /** créer une nouvelle heure en ajoutant à cette heure le nombre d'unités spécifiées */ | ||||||
|  |   function addu(int $count=1): self { | ||||||
|  |     $count *= $this->unit; | ||||||
|  |     if ($this->step !== null) $count *= $this->step; | ||||||
|  |     $this->setSeconds($this->seconds + $count); | ||||||
|  |     return $this; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   /** créer une nouvelle heure en soustrayant à cette heure le nombre d'unités spécifiées */ | ||||||
|  |   function subu(int $count=1): self { | ||||||
|  |     $count *= $this->unit; | ||||||
|  |     if ($this->step !== null) $count *= $this->step; | ||||||
|  |     $this->setSeconds($this->seconds - $count); | ||||||
|  |     return $this; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   /** forcer cette heure à l'heure spécifiée */ | ||||||
|  |   function set($time): self { | ||||||
|  |     if ($time === null) $seconds = self::s_now(); | ||||||
|  |     else $seconds = self::with($time)->getSeconds(); | ||||||
|  |     $this->setSeconds($seconds); | ||||||
|  |     return $this; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   /** ajouter à cette heure l'heure spécifiée */ | ||||||
|  |   function add($time): self { | ||||||
|  |     if ($time !== null) { | ||||||
|  |       $this->setSeconds($this->seconds + self::with($time)->getSeconds()); | ||||||
|  |     } | ||||||
|  |     return $this; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   /** soustraire à cette heure l'heure spécifiée */ | ||||||
|  |   function sub($time): self { | ||||||
|  |     if ($time !== null) { | ||||||
|  |       $this->setSeconds($this->seconds - self::with($time)->getSeconds()); | ||||||
|  |     } | ||||||
|  |     return $this; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   /** | ||||||
|  |    * comparer avec l'heure spécifiée. retourner une valeur négative, égale à | ||||||
|  |    * zéro ou positive suivant le résultat de la comparaison | ||||||
|  |    */ | ||||||
|  |   function compare($time): int { | ||||||
|  |     if ($time === null) return 1; | ||||||
|  |     else return $this->seconds - self::with($time)->getSeconds(); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   /** | ||||||
|  |    * tester si cette heure est avant ou égale à l'heure spécifiée | ||||||
|  |    */ | ||||||
|  |   function before($other): bool { | ||||||
|  |     if ($other === null) return false; | ||||||
|  |     else return $this->seconds <= self::with($other)->getSeconds(); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   /** | ||||||
|  |    * tester si cette heure est après ou égale à l'heure spécifiée | ||||||
|  |    */ | ||||||
|  |   function after($other): bool { | ||||||
|  |     if ($other === null) return true; | ||||||
|  |     else return $this->seconds >= self::with($other)->getSeconds(); | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										29
									
								
								php/src/php/types/vdate.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								php/src/php/types/vdate.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,29 @@ | |||||||
|  | <?php | ||||||
|  | namespace nulib\php\types; | ||||||
|  | 
 | ||||||
|  | use nulib\php\time\Date; | ||||||
|  | 
 | ||||||
|  | class vdate { | ||||||
|  |   static function isa($value, bool $strict=false) : bool { | ||||||
|  |     if ($strict) return $value instanceof Date; | ||||||
|  |     else return Date::isa_date($value); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   static function ensure(&$date): void { | ||||||
|  |     $date = Date::with($date); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   static function ensuren(&$date): void { | ||||||
|  |     $date = Date::withn($date); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   static function with($value): Date { | ||||||
|  |     self::ensure($value); | ||||||
|  |     return $value; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   static function withn($value): ?Date { | ||||||
|  |     self::ensuren($value); | ||||||
|  |     return $value; | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										29
									
								
								php/src/php/types/vdatetime.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								php/src/php/types/vdatetime.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,29 @@ | |||||||
|  | <?php | ||||||
|  | namespace nulib\php\types; | ||||||
|  | 
 | ||||||
|  | use nulib\php\time\DateTime; | ||||||
|  | 
 | ||||||
|  | class vdatetime { | ||||||
|  |   static function isa($value, bool $strict=false) : bool { | ||||||
|  |     if ($strict) return $value instanceof DateTime; | ||||||
|  |     else return DateTime::isa_datetime($value); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   static function ensure(&$datetime): void { | ||||||
|  |     $datetime = DateTime::with($datetime); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   static function ensuren(&$datetime): void { | ||||||
|  |     $datetime = DateTime::withn($datetime); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   static function with($value): DateTime { | ||||||
|  |     self::ensure($value); | ||||||
|  |     return $value; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   static function withn($value): ?DateTime { | ||||||
|  |     self::ensuren($value); | ||||||
|  |     return $value; | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										22
									
								
								php/src/php/types/vmixed.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								php/src/php/types/vmixed.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,22 @@ | |||||||
|  | <?php | ||||||
|  | namespace nulib\php\types; | ||||||
|  | 
 | ||||||
|  | class vmixed { | ||||||
|  |   static function isa($value, bool $strict=false) : bool { | ||||||
|  |     return true; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   static function ensure(&$mixed): void { | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   static function ensuren(&$mixed): void { | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   static function with($value) { | ||||||
|  |     return $value; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   static function withn($value) { | ||||||
|  |     return $value; | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										22
									
								
								php/src/php/types/vraw.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								php/src/php/types/vraw.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,22 @@ | |||||||
|  | <?php | ||||||
|  | namespace nulib\php\types; | ||||||
|  | 
 | ||||||
|  | class vraw { | ||||||
|  |   static function isa($value, bool $strict=false) : bool { | ||||||
|  |     return true; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   static function ensure(&$raw): void { | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   static function ensuren(&$raw): void { | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   static function with($value) { | ||||||
|  |     return $value; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   static function withn($value) { | ||||||
|  |     return $value; | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										30
									
								
								php/src/php/types/vtime.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								php/src/php/types/vtime.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,30 @@ | |||||||
|  | <?php | ||||||
|  | namespace nulib\php\types; | ||||||
|  | 
 | ||||||
|  | use nulib\php\time\DateTime; | ||||||
|  | use nulib\php\time\Time; | ||||||
|  | 
 | ||||||
|  | class vtime { | ||||||
|  |   static function isa($value, bool $strict=false) : bool { | ||||||
|  |     if ($strict) return $value instanceof Time; | ||||||
|  |     else return Time::isa_time($value); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   static function ensure(&$time): void { | ||||||
|  |     $time = Time::with($time); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   static function ensuren(&$time): void { | ||||||
|  |     $time = Time::withn($time); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   static function with($value): Time { | ||||||
|  |     self::ensure($value); | ||||||
|  |     return $value; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   static function withn($value): ?Time { | ||||||
|  |     self::ensuren($value); | ||||||
|  |     return $value; | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										60
									
								
								php/tests/php/time/HourTest.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								php/tests/php/time/HourTest.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,60 @@ | |||||||
|  | <?php | ||||||
|  | namespace nulib\php\time; | ||||||
|  | 
 | ||||||
|  | use nulib\tests\TestCase; | ||||||
|  | use nulib\ValueException; | ||||||
|  | 
 | ||||||
|  | class HourTest extends TestCase { | ||||||
|  |   function testParse() { | ||||||
|  |     self::assertSame("8h", strval(new Hour("08:00:00"))); | ||||||
|  |     self::assertSame("8h", strval(new Hour("8:0"))); | ||||||
|  |     self::assertSame("8h", strval(new Hour("8.0"))); | ||||||
|  |     self::assertSame("8h", strval(new Hour("8h"))); | ||||||
|  | 
 | ||||||
|  |     self::assertSame("8h15", strval(new Hour("08:15:00"))); | ||||||
|  |     self::assertSame("8h15", strval(new Hour("8:15"))); | ||||||
|  |     self::assertSame("8h15", strval(new Hour("8.15"))); | ||||||
|  |     self::assertSame("8h15", strval(new Hour("8h15"))); | ||||||
|  | 
 | ||||||
|  |     self::assertSame("8h15", strval(new Hour("08:15:23"))); | ||||||
|  |     self::assertSame("8h15", strval(new Hour("8:15.23"))); | ||||||
|  |     self::assertSame("8h15", strval(new Hour("8.15.23"))); | ||||||
|  |     self::assertSame("8h15", strval(new Hour("8h15.23"))); | ||||||
|  | 
 | ||||||
|  |     self::assertSame("31h11", strval(new Hour("30:70:80", [ | ||||||
|  |       "wrap" => false, | ||||||
|  |     ]))); | ||||||
|  |     self::assertSame("7h11", strval(new Hour("30:70:80"))); | ||||||
|  | 
 | ||||||
|  |     self::assertException(ValueException::class, function() { | ||||||
|  |       return strval(new Hour("bad format")); | ||||||
|  |     }); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   function testFormat() { | ||||||
|  |     self::assertSame("0h", (new Hour(0))->format()); | ||||||
|  |     self::assertSame("0h56", (new Hour(56))->format()); | ||||||
|  |     self::assertSame("2h", (new Hour(120))->format()); | ||||||
|  |     self::assertSame("23h59", (new Hour(1439))->format()); | ||||||
|  |     self::assertSame("24h", (new Hour(1440))->format()); | ||||||
|  |     self::assertSame("0h01", (new Hour(1441))->format()); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   function testStep() { | ||||||
|  |     $h = new Hour(null, [ | ||||||
|  |       "step" => 5, | ||||||
|  |     ]); | ||||||
|  |     $h->setu(10); self::assertSame("0h10", strval($h)); | ||||||
|  |     $h->setu(12); self::assertSame("0h10", strval($h)); | ||||||
|  |     $h->setu(15); self::assertSame("0h15", strval($h)); | ||||||
|  |     $h->setu(17); self::assertSame("0h15", strval($h)); | ||||||
|  | 
 | ||||||
|  |     $h->set("8h"); | ||||||
|  |     $h->addu(); self::assertSame("8h05", strval($h)); | ||||||
|  |     $h->addu(); self::assertSame("8h10", strval($h)); | ||||||
|  |     $h->addu(); self::assertSame("8h15", strval($h)); | ||||||
|  |     $h->subu(); self::assertSame("8h10", strval($h)); | ||||||
|  |     $h->subu(); self::assertSame("8h05", strval($h)); | ||||||
|  |     $h->subu(); self::assertSame("8h", strval($h)); | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										74
									
								
								php/tests/php/time/TimeTest.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										74
									
								
								php/tests/php/time/TimeTest.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,74 @@ | |||||||
|  | <?php | ||||||
|  | namespace nulib\php\time; | ||||||
|  | 
 | ||||||
|  | use nulib\tests\TestCase; | ||||||
|  | use nulib\ValueException; | ||||||
|  | 
 | ||||||
|  | class TimeTest extends TestCase { | ||||||
|  |   function testParse() { | ||||||
|  |     self::assertSame("08:00:00", strval(new Time("08:00:00"))); | ||||||
|  |     self::assertSame("08:00:00", strval(new Time("8:0"))); | ||||||
|  |     self::assertSame("08:00:00", strval(new Time("8.0"))); | ||||||
|  |     self::assertSame("08:00:00", strval(new Time("8h"))); | ||||||
|  | 
 | ||||||
|  |     self::assertSame("08:15:00", strval(new Time("08:15:00"))); | ||||||
|  |     self::assertSame("08:15:00", strval(new Time("8:15"))); | ||||||
|  |     self::assertSame("08:15:00", strval(new Time("8.15"))); | ||||||
|  |     self::assertSame("08:15:00", strval(new Time("8h15"))); | ||||||
|  | 
 | ||||||
|  |     self::assertSame("08:15:23", strval(new Time("08:15:23"))); | ||||||
|  |     self::assertSame("08:15:23", strval(new Time("8:15.23"))); | ||||||
|  |     self::assertSame("08:15:23", strval(new Time("8.15.23"))); | ||||||
|  |     self::assertSame("08:15:23", strval(new Time("8h15.23"))); | ||||||
|  | 
 | ||||||
|  |     self::assertSame("31:11:20", strval(new Time("30:70:80", [ | ||||||
|  |       "wrap" => false, | ||||||
|  |     ]))); | ||||||
|  |     self::assertSame("07:11:20", strval(new Time("30:70:80"))); | ||||||
|  | 
 | ||||||
|  |     self::assertException(ValueException::class, function() { | ||||||
|  |       return strval(new Time("bad format")); | ||||||
|  |     }); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   function testGetu() { | ||||||
|  |     self::assertSame(0, (new Time(0))->getu()); | ||||||
|  |     self::assertSame(86399, (new Time(-1))->getu()); | ||||||
|  |     self::assertSame(1, (new Time(1))->getu()); | ||||||
|  |     self::assertSame(120, (new Time(120))->getu()); | ||||||
|  |     self::assertSame(86400, (new Time(86400))->getu()); | ||||||
|  |     self::assertSame(0, (new Time(-86400))->getu()); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   function testAddu() { | ||||||
|  |     $t = new Time(0); | ||||||
|  |     $t->addu(0); self::assertSame(0, $t->getu()); | ||||||
|  |     $t->addu(10); self::assertSame(10, $t->getu()); | ||||||
|  |     $t->addu(10); self::assertSame(20, $t->getu()); | ||||||
|  |     $t->addu(100); self::assertSame(120, $t->getu()); | ||||||
|  |     $t->addu(86280); self::assertSame(86400, $t->getu()); | ||||||
|  |     $t->addu(86400); self::assertSame(0, $t->getu()); | ||||||
|  |     $t->addu(-86400); self::assertSame(0, $t->getu()); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   function testSubu() { | ||||||
|  |     $t = new Time(0); | ||||||
|  |     $t->subu(-86400); self::assertSame(86400, $t->getu()); | ||||||
|  |     $t->subu(86400); self::assertSame(0, $t->getu()); | ||||||
|  |      | ||||||
|  |     $t = new Time(120); | ||||||
|  |     $t->subu(100); self::assertSame(20, $t->getu()); | ||||||
|  |     $t->subu(10); self::assertSame(10, $t->getu()); | ||||||
|  |     $t->subu(10); self::assertSame(0, $t->getu()); | ||||||
|  |     $t->subu(0); self::assertSame(0, $t->getu()); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   function testFormat() { | ||||||
|  |     self::assertSame("00:00:00", (new Time(0))->format()); | ||||||
|  |     self::assertSame("00:00:56", (new Time(56))->format()); | ||||||
|  |     self::assertSame("00:02:00", (new Time(120))->format()); | ||||||
|  |     self::assertSame("23:59:59", (new Time(86399))->format()); | ||||||
|  |     self::assertSame("24:00:00", (new Time(86400))->format()); | ||||||
|  |     self::assertSame("00:00:01", (new Time(86401))->format()); | ||||||
|  |   } | ||||||
|  | } | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user