Branch Coverage

src/constraints.c
Criterion Covered Total %
branch 284 320 88.7


line true false branch
32 0 90 if(SvNOK(osv))
34 90 0 if(SvIOK(osv) && SvIsUV(osv))
0 90 if(SvIOK(osv) && SvIsUV(osv))
84 157 196 for(int i = 0; i < n; i++)
93 0 102 if(!sv_isa(sv, "Data::Checks::Constraint"))
105 16 0 if(!stash || !Gv_AMG(stash))
16 0 if(!stash || !Gv_AMG(stash))
16 0 if(!stash || !Gv_AMG(stash))
0 16 if(!stash || !Gv_AMG(stash))
0 0 if(!stash || !Gv_AMG(stash))
9 7 if(!stash || !Gv_AMG(stash))
109 0 7 if(!mg)
113 0 7 if(AMT_AMAGIC((AMT *)mg->mg_ptr))
119 2 5 if(!cv)
132 8 4 return SvROK(value) && SvOBJECT(SvRV(value));
6 2 return SvROK(value) && SvOBJECT(SvRV(value));
137 4 35 if(!SvOK(value))
140 18 17 if(SvROK(value)) {
142 12 6 if(!SvOBJECT(rv))
145 5 1 if(sv_has_overload(value, string_amg))
157 1 6 if(!constraint_Str(aTHX_ c, value))
161 3 3 if(SvTYPE(strs) != SVt_PVAV)
169 1 7 for(size_t i = 0; i < n; i++)
170 5 2 if(sv_streq(value, svp[i]))
183 0 9 if(!nargs)
186 5 4 if(nargs == 1)
191 11 4 for(size_t i = 0; i < nargs; i++)
202 4 5 if(!constraint_Str(aTHX_ c, value))
215 2 0 if(!SvROK(arg0) || !SvRXOK(SvRV(arg0)))
0 2 if(!SvROK(arg0) || !SvRXOK(SvRV(arg0)))
218 2 0 c->args[0] = SvREFCNT_inc(SvRV(arg0));
225 3 45 if(!SvOK(value))
228 10 35 if(SvROK(value)) {
230 6 4 if(!SvOBJECT(rv))
233 3 1 if(sv_has_overload(value, numer_amg))
238 5 30 else if(SvPOK(value)) {
239 2 3 if(!looks_like_number(value))
243 2 1 if(SvPVX(value)[0] == 'N' || SvPVX(value)[0] == 'n')
250 2 28 if(SvNOK(value) && Perl_isnan(SvNV(value)))
1 1 if(SvNOK(value) && Perl_isnan(SvNV(value)))
265 6 21 if(!constraint_Num(aTHX_ c, value))
268 15 6 if(c->args[0]) {
270 3 12 if(cmp > 0 || (cmp == 0 && !(c->flags & NUMBOUND_LOWER_INCLUSIVE)))
4 8 if(cmp > 0 || (cmp == 0 && !(c->flags & NUMBOUND_LOWER_INCLUSIVE)))
1 3 if(cmp > 0 || (cmp == 0 && !(c->flags & NUMBOUND_LOWER_INCLUSIVE)))
274 14 3 if(c->args[1]) {
276 6 8 if(cmp > 0 || (cmp == 0 && !(c->flags & NUMBOUND_UPPER_INCLUSIVE)))
3 5 if(cmp > 0 || (cmp == 0 && !(c->flags & NUMBOUND_UPPER_INCLUSIVE)))
1 2 if(cmp > 0 || (cmp == 0 && !(c->flags & NUMBOUND_UPPER_INCLUSIVE)))
353 1 6 if(!constraint_Num(aTHX_ c, value))
357 3 3 if(SvTYPE(nums) != SVt_PVAV)
365 1 7 for(size_t i = 0; i < n; i++)
366 5 2 if(sv_numcmp(value, svp[i]) == 0)
379 0 5 if(!nargs)
382 3 2 if(nargs == 1)
387 5 2 for(size_t i = 0; i < nargs; i++)
415 11 8 if(SvROK(value) && SvOBJECT(SvRV(value)))
5 6 if(SvROK(value) && SvOBJECT(SvRV(value)))
417 12 2 else if(SvOK(value)) {
419 10 2 if(!stash)
429 3 4 size_t nmethods = SvTYPE(methods) == SVt_PVAV ? av_count((AV *)methods) : 1;
430 13 6 for(size_t idx = 0; idx < nmethods; idx++) {
431 9 4 SV *method = SvTYPE(methods) == SVt_PVAV ? AvARRAY((AV *)methods)[idx] : methods;
432 1 12 if(!gv_fetchmeth_sv(stash, method,
452 0 3 if(!nargs)
455 1 2 if(nargs == 1)
460 5 2 for(size_t i = 0; i < nargs; i++)
471 7 1 if(!SvOK(value) || !SvROK(value))
5 2 if(!SvOK(value) || !SvROK(value))
476 3 2 if(!SvOBJECT(rv))
485 7 1 if(!SvOK(value) || !SvROK(value))
5 2 if(!SvOK(value) || !SvROK(value))
490 3 2 if(!SvOBJECT(rv))
499 8 1 if(!SvOK(value) || !SvROK(value))
6 2 if(!SvOK(value) || !SvROK(value))
504 4 2 if(!SvOBJECT(rv))
513 6 1 if(!SvOK(value))
529 3 0 c->args[0] = SvREFCNT_inc(inner);
540 12 4 for(size_t i = 0; i < n; i++) {
542 9 3 if((*inner->func)(aTHX_ inner, value))
551 0 8 if(!nargs)
553 1 7 if(nargs == 1)
559 14 7 for(size_t i = 0; i < nargs; i++) {
563 2 12 if(inner->func == &constraint_Any) {
566 4 2 for(size_t kidi = 0; kidi < nkids; kidi++) {
567 4 0 av_push(inners, SvREFCNT_inc(AvARRAY(kidav)[kidi]));
579 7 0 c->args[0] = SvREFCNT_inc(inners);
587 7 0 if(!inners)
593 0 0 for(size_t i = 0; i < n; i++) {
595 0 0 if(!(*inner->func)(aTHX_ inner, value))
605 1 21 if(nargs == 1)
609 19 2 if(nargs) {
619 39 19 for(size_t i = 0; i < nargs; i++) {
623 1 38 if(inner->func == &constraint_All) {
626 2 1 for(size_t kidi = 0; kidi < nkids; kidi++) {
627 2 0 av_push(inners, SvREFCNT_inc(AvARRAY(kidav)[kidi]));
630 32 6 else if(inner->func == &constraint_NumBound) {
631 16 16 if(!all_nums) {
640 18 14 if(innerL) {
641 5 13 if(!all_nums->args[0] || (cmp = sv_numcmp(all_nums->args[0], innerL)) < 0) {
4 1 if(!all_nums->args[0] || (cmp = sv_numcmp(all_nums->args[0], innerL)) < 0) {
647 1 0 else if(cmp == 0 && !(inner->flags & NUMBOUND_LOWER_INCLUSIVE))
1 0 else if(cmp == 0 && !(inner->flags & NUMBOUND_LOWER_INCLUSIVE))
650 18 14 if(innerU) {
651 5 13 if(!all_nums->args[1] || (cmp = sv_numcmp(all_nums->args[1], innerU)) > 0) {
2 3 if(!all_nums->args[1] || (cmp = sv_numcmp(all_nums->args[1], innerU)) > 0) {
657 1 2 else if(cmp == 0 && !(inner->flags & NUMBOUND_UPPER_INCLUSIVE))
1 0 else if(cmp == 0 && !(inner->flags & NUMBOUND_UPPER_INCLUSIVE))
667 16 3 if(all_nums_sv && av_count(inners) == 1)
15 1 if(all_nums_sv && av_count(inners) == 1)
676 4 2 c->args[0] = SvREFCNT_inc(inners);
747 2 45 SV **svp = PL_stack_base + POPMARK + 1;
751 2 45 if(!nargs)
752 0 2 EXTEND(SP, 1);
860 110 21 for(STRLEN i = 0; i < len; i++) {
861 0 110 if(len == 256) {
866 110 0 if(c == '\\' || c == quote || (quote != '\'' && (c == '$' || c == '@')))
108 2 if(c == '\\' || c == quote || (quote != '\'' && (c == '$' || c == '@')))
108 0 if(c == '\\' || c == quote || (quote != '\'' && (c == '$' || c == '@')))
1 107 if(c == '\\' || c == quote || (quote != '\'' && (c == '$' || c == '@')))
879 10 4 for(U32 i = 0; i < n; i++) {
880 6 4 if(i > 0)
894 91 5 if (c->func == &constraint_Defined)
896 85 6 else if(c->func == &constraint_Object)
898 83 2 else if(c->func == &constraint_ArrayRef)
900 81 2 else if(c->func == &constraint_HashRef)
902 79 2 else if(c->func == &constraint_Callable)
904 77 2 else if(c->func == &constraint_Num)
906 58 19 else if(c->func == &constraint_Str)
909 3 55 else if(c->func == &constraint_Isa) {
913 2 53 else if(c->func == &constraint_StrMatch) {
918 2 51 else if(c->func == &constraint_Maybe) {
923 26 25 else if(c->func == &constraint_NumBound) {
924 7 19 if(!c->args[0])
925 4 3 name = (c->flags & NUMBOUND_UPPER_INCLUSIVE ) ? "NumLE" : "NumLT";
926 7 12 else if(!c->args[1])
927 4 3 name = (c->flags & NUMBOUND_LOWER_INCLUSIVE ) ? "NumGE" : "NumGT";
928 6 6 else if(c->flags == NUMBOUND_LOWER_INCLUSIVE)
935 2 4 sv_catpvf(args, "NumG%c(%" SVf "), NumL%c(%" SVf ")",
3 3 sv_catpvf(args, "NumG%c(%" SVf "), NumL%c(%" SVf ")",
940 20 6 if(!SvCUR(args)) {
941 13 7 if(c->args[0])
943 13 7 if(c->args[0] && c->args[1])
6 7 if(c->args[0] && c->args[1])
945 13 7 if(c->args[1])
950 5 20 else if(c->func == &constraint_NumEq) {
952 3 2 if(SvTYPE(c->args[0]) != SVt_PVAV)
957 5 2 for(U32 i = 0; i < n; i++) {
958 3 2 if(i > 0)
964 7 13 else if(c->func == &constraint_StrEq) {
966 2 5 if(SvTYPE(c->args[0]) == SVt_PVAV)
971 3 10 else if(c->func == &constraint_Can) {
973 2 1 if(SvTYPE(c->args[0]) == SVt_PVAV)
978 5 5 else if(c->func == &constraint_Any || c->func == &constraint_All) {
5 0 else if(c->func == &constraint_Any || c->func == &constraint_All) {
979 5 5 name = (c->func == &constraint_Any) ? "Any" : "All";
980 8 2 if(c->args[0]) {
983 19 8 for(U32 i = 0; i < n; i++) {
984 11 8 if(i > 0)
995 56 40 if(SvCUR(args))