Skip to content

Commit

Permalink
Implement type=month, type=week
Browse files Browse the repository at this point in the history
  • Loading branch information
g105b committed Dec 31, 2019
1 parent 7585654 commit 3dbfdfa
Show file tree
Hide file tree
Showing 2 changed files with 133 additions and 6 deletions.
65 changes: 60 additions & 5 deletions src/Rule/TypeDate.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,24 +7,79 @@
class TypeDate extends Rule {
// ISO-8601 derived date formats:
const FORMAT_DATE = "Y-m-d";
const FORMAT_MONTH = "Y-m";
const FORMAT_WEEK = "Y-\WW";

protected $attributes = [
"type=date",
"type=month",
"type=week",
];

public function isValid(DOMElement $element, string $value):bool {
if($value === "") {
return true;
}

$dateTime = DateTime::createFromFormat(
self::FORMAT_DATE,
$value
);
$dateTime = null;

switch($element->getAttribute("type")) {
case "date":
$dateTime = DateTime::createFromFormat(
self::FORMAT_DATE,
$value
);
break;

case "month":
$dateTime = DateTime::createFromFormat(
self::FORMAT_MONTH,
$value
);
break;

case "week":
if(strstr($value, "-W")) {
list($year, $week) = explode("-", $value);
}
else {
return false;
}

$week = ltrim($week, "W");

$dateTime = new DateTime();
$dateTime->setISODate($year, $week);

if(!is_numeric($week)
|| $week < 1 || $week > 52) {
return false;
}

break;
}

return $dateTime !== false;
}

public function getHint(DOMElement $element, string $value):string {
return "Field must be a date in the format YYYY-mm-dd";
$format = null;
$type = $element->getAttribute("type");

switch($type) {
case "date":
$format = self::FORMAT_DATE;
break;

case "month":
$format = self::FORMAT_MONTH;
break;

case "week":
$format = self::FORMAT_WEEK;
break;
}

return "Field must be a $type in the format $format";
}
}
74 changes: 73 additions & 1 deletion test/phpunit/Rule/TypeDateTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -37,9 +37,81 @@ public function testTypeDateInvalid() {
self::assertCount(1, $errorArray);
$dobErrorArray = $errorArray["dob"];
self::assertContains(
"Field must be a date in the format YYYY-mm-dd",
"Field must be a date in the format Y-m-d",
$dobErrorArray
);
}
}

public function testTypeMonth() {
$form = self::getFormFromHtml(Helper::HTML_DATE_TIME);
$validator = new Validator();

$exception = null;

try {
$validator->validate($form, [
"month" => "2020-11",
]);
}
catch(ValidationException $exception) {}

self::assertNull($exception);
}

public function testTypeMonthInvalid() {
$form = self::getFormFromHtml(Helper::HTML_DATE_TIME);
$validator = new Validator();

try {
$validator->validate($form, [
"month" => "November 2020",
]);
}
catch(ValidationException $exception) {
$errorArray = iterator_to_array($validator->getLastErrorList());
self::assertCount(1, $errorArray);
$monthErrorArray = $errorArray["month"];
self::assertContains(
"Field must be a month in the format Y-m",
$monthErrorArray
);
}
}

public function testTypeWeek() {
$form = self::getFormFromHtml(Helper::HTML_DATE_TIME);
$validator = new Validator();

$exception = null;

try {
$validator->validate($form, [
"week" => "2021-W24",
]);
}
catch(ValidationException $exception) {}

self::assertNull($exception);
}

public function testTypeWeekInvalid() {
$form = self::getFormFromHtml(Helper::HTML_DATE_TIME);
$validator = new Validator();

try {
$validator->validate($form, [
"week" => "2021, Week 24",
]);
}
catch(ValidationException $exception) {
$errorArray = iterator_to_array($validator->getLastErrorList());
self::assertCount(1, $errorArray);
$monthErrorArray = $errorArray["week"];
self::assertContains(
"Field must be a week in the format Y-\WW",
$monthErrorArray
);
}
}
}

0 comments on commit 3dbfdfa

Please sign in to comment.