Skip to content

Commit e3242be

Browse files
committed
Improve assert for contains / startsWith / endsWith
1 parent ae758a2 commit e3242be

File tree

1 file changed

+126
-7
lines changed

1 file changed

+126
-7
lines changed

src/Type/WebMozartAssert/AssertTypeSpecifyingExtension.php

Lines changed: 126 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -754,17 +754,136 @@ private function getExpressionResolvers(): array
754754
)
755755
);
756756
},
757-
];
757+
'contains' => static function (Scope $scope, Arg $value, Arg $subString): Expr {
758+
if ($scope->getType($subString->value)->isNonEmptyString()->yes()) {
759+
return new BooleanAnd(
760+
new BooleanAnd(
761+
new FuncCall(
762+
new Name('is_string'),
763+
[$value]
764+
),
765+
new NotIdentical(
766+
$value->value,
767+
new String_('')
768+
)
769+
),
770+
new GreaterOrEqual(
771+
new FuncCall(
772+
new Name('strpos'),
773+
[$value]
774+
),
775+
new LNumber(0)
776+
)
777+
);
778+
}
758779

759-
foreach (['contains', 'startsWith', 'endsWith'] as $name) {
760-
$this->resolvers[$name] = function (Scope $scope, Arg $value, Arg $subString) use ($name): array {
780+
return new BooleanAnd(
781+
new FuncCall(
782+
new Name('is_string'),
783+
[$value]
784+
),
785+
new GreaterOrEqual(
786+
new FuncCall(
787+
new Name('strpos'),
788+
[$value]
789+
),
790+
new LNumber(0)
791+
)
792+
);
793+
},
794+
'startsWith' => static function (Scope $scope, Arg $value, Arg $subString): Expr {
761795
if ($scope->getType($subString->value)->isNonEmptyString()->yes()) {
762-
return self::createIsNonEmptyStringAndSomethingExprPair($name, [$value, $subString]);
796+
return new BooleanAnd(
797+
new BooleanAnd(
798+
new FuncCall(
799+
new Name('is_string'),
800+
[$value]
801+
),
802+
new NotIdentical(
803+
$value->value,
804+
new String_('')
805+
)
806+
),
807+
new Identical(
808+
new FuncCall(
809+
new Name('strpos'),
810+
[$value, $subString]
811+
),
812+
new LNumber(0)
813+
)
814+
);
763815
}
764816

765-
return [$this->resolvers['string']($scope, $value), null];
766-
};
767-
}
817+
return new BooleanAnd(
818+
new FuncCall(
819+
new Name('is_string'),
820+
[$value]
821+
),
822+
new Identical(
823+
new FuncCall(
824+
new Name('strpos'),
825+
[$value, $subString]
826+
),
827+
new LNumber(0)
828+
)
829+
);
830+
},
831+
'endsWith' => static function (Scope $scope, Arg $value, Arg $subString): Expr {
832+
if ($scope->getType($subString->value)->isNonEmptyString()->yes()) {
833+
return new BooleanAnd(
834+
new BooleanAnd(
835+
new FuncCall(
836+
new Name('is_string'),
837+
[$value]
838+
),
839+
new NotIdentical(
840+
$value->value,
841+
new String_('')
842+
)
843+
),
844+
new Identical(
845+
new FuncCall(
846+
new Name('strpos'),
847+
[$value, $subString]
848+
),
849+
new BinaryOp\Minus(
850+
new FuncCall(
851+
new Name('strlen'),
852+
[$value]
853+
),
854+
new FuncCall(
855+
new Name('strlen'),
856+
[$subString]
857+
)
858+
)
859+
)
860+
);
861+
}
862+
863+
return new BooleanAnd(
864+
new FuncCall(
865+
new Name('is_string'),
866+
[$value]
867+
),
868+
new Identical(
869+
new FuncCall(
870+
new Name('strpos'),
871+
[$value, $subString]
872+
),
873+
new BinaryOp\Minus(
874+
new FuncCall(
875+
new Name('strlen'),
876+
[$value]
877+
),
878+
new FuncCall(
879+
new Name('strlen'),
880+
[$subString]
881+
)
882+
)
883+
)
884+
);
885+
},
886+
];
768887

769888
$assertionsResultingAtLeastInNonEmptyString = [
770889
'startsWithLetter',

0 commit comments

Comments
 (0)