1#!perl
2
3# test CALLREGEXEC()
4# (currently it just checks that it handles non-\0 terminated strings;
5# full tests haven't been added yet)
6
7use warnings;
8use strict;
9
10use XS::APItest;
11*callregexec = *XS::APItest::callregexec;
12
13use Test::More tests => 48;
14
15# Test that the regex engine can handle strings without terminating \0
16# XXX This is by no means comprehensive; it doesn't test all ops, nor all
17# code paths within those ops (especially not utf8).
18
19
20# this sub takes a string that has an extraneous char at the end.
21# First see if the string (less the last char) matches the regex;
22# then see if that string (including the last char) matches when
23# calling callregexec(), but with the length arg set to 1 char less than
24# the length of the string.
25# In theory the result should be the same for both matches, since
26# they should both not 'see' the final char.
27
28sub try {
29    my ($str, $re, $exp, $desc) = @_;
30
31    my $str1 = substr($str, 0, -1);
32    ok !!$exp == !!($str1 =~ $re), "$desc str =~ qr";
33
34    my $bytes = do { use bytes; length $str1 };
35    ok  !!$exp == !!callregexec($re, 0, $bytes, 0, $str, 0),
36	    "$desc callregexec";
37}
38
39
40{
41    try "\nx",         qr/\n^/m,          0, 'MBOL';
42    try "ax",          qr/a$/m,           1, 'MEOL';
43    try "ax",          qr/a$/s,           1, 'SEOL';
44    try "abx",         qr/^(ab|X)./s,     0, 'SANY';
45    try "abx",         qr/^(ab|X)./,      0, 'REG_ANY';
46    try "abx",         qr/^ab(c|d|e|x)/,  0, 'TRIE/TRIEC';
47    try "abx",         qr/^abx/,          0, 'EXACT';
48    try "abx",         qr/^ABX/i,         0, 'EXACTF';
49    try "abx",         qr/^ab\b/,         1, 'BOUND';
50    try "ab-",         qr/^ab\B/,         0, 'NBOUND';
51    try "aas",         qr/a[st]/,         0, 'ANYOF';
52    try "aas",         qr/a[s\xDF]/i,     0, 'ANYOFV';
53    try "ab1",         qr/ab\d/,          0, 'DIGIT';
54    try "ab\n",        qr/ab[[:ascii:]]/, 0, 'POSIX';
55    try "aP\x{307}",   qr/^a\X/,          1, 'CLUMP 1';
56    try "aP\x{307}x",  qr/^a\X/,          1, 'CLUMP 2';
57    try "\x{100}\r\n", qr/^\x{100}\X/,    1, 'CLUMP 3';
58    try "abb",         qr/^a(b)\1/,       0, 'REF';
59    try "ab\n",        qr/^.+\R/,         0, 'LNBREAK';
60    try "ab\n",        qr/^.+\v/,         0, 'VERTWS';
61    try "abx",         qr/^.+\V/,         1, 'NVERTWS';
62    try "ab\t",        qr/^.+\h/,         0, 'HORIZWS';
63    try "abx",         qr/^.+\H/,         1, 'NHORIZWS';
64    try "abx",         qr/a.*x/,          0, 'CURLY';
65}
66