xref: /openbsd/gnu/usr.bin/perl/t/re/stclass_threads.t (revision 5486feef)
1f2a19305Safresh1#!./perl
2f2a19305Safresh1#
3f2a19305Safresh1# This is a home for regular expression tests that don't fit into
4f2a19305Safresh1# the format supported by re/regexp.t.  If you want to add a test
5f2a19305Safresh1# that does fit that format, add it to re/re_tests, not here.
6f2a19305Safresh1
7f2a19305Safresh1use strict;
8f2a19305Safresh1use warnings;
9f2a19305Safresh1
10f2a19305Safresh1sub run_tests;
11f2a19305Safresh1
12f2a19305Safresh1$| = 1;
13f2a19305Safresh1
14f2a19305Safresh1BEGIN {
15f2a19305Safresh1    chdir 't' if -d 't';
16f2a19305Safresh1    require './test.pl';
17f2a19305Safresh1    set_up_inc('../lib', '.', '../ext/re');
18*5486feefSafresh1    require Config; Config->import;
19f2a19305Safresh1}
20f2a19305Safresh1
21f2a19305Safresh1skip_all_without_config('useithreads');
22f2a19305Safresh1skip_all_if_miniperl("no dynamic loading on miniperl, no threads");
23f2a19305Safresh1
24f2a19305Safresh1plan tests => 6;  # Update this when adding/deleting tests.
25f2a19305Safresh1
26f2a19305Safresh1run_tests() unless caller;
27f2a19305Safresh1
28f2a19305Safresh1#
29f2a19305Safresh1# Tests start here.
30f2a19305Safresh1#
31f2a19305Safresh1sub run_tests {
32f2a19305Safresh1    my @res;
33f2a19305Safresh1    for my $len (10,100,1000) {
34f2a19305Safresh1        my $result1= fresh_perl(sprintf(<<'EOF_CODE', $len),
35f2a19305Safresh1        use threads;
36f2a19305Safresh1        use re 'debug';
37f2a19305Safresh1
38f2a19305Safresh1        sub start_thread {
39f2a19305Safresh1            warn "===\n";
40f2a19305Safresh1            split /[.;]+[\'\"]+/, $_[0];
41f2a19305Safresh1            warn "===\n";
42f2a19305Safresh1        }
43f2a19305Safresh1
44f2a19305Safresh1        my $buffer = '.' x %d;
45f2a19305Safresh1
46f2a19305Safresh1        start_thread $buffer;
47f2a19305Safresh1EOF_CODE
48f2a19305Safresh1        {});
49f2a19305Safresh1        my $result2= fresh_perl(sprintf(<<'EOF_CODE', $len),
50f2a19305Safresh1        use threads;
51f2a19305Safresh1        use re 'debug';
52f2a19305Safresh1
53f2a19305Safresh1        sub start_thread {
54f2a19305Safresh1            warn "\n===\n";
55f2a19305Safresh1            split /[.;]+[\'\"]+/, $_[0];
56f2a19305Safresh1            warn "\n===\n";
57f2a19305Safresh1        }
58f2a19305Safresh1
59f2a19305Safresh1        my $buffer = '.' x %d;
60f2a19305Safresh1        my $thr = threads->create('start_thread', $buffer);
61f2a19305Safresh1        $thr->join();
62f2a19305Safresh1EOF_CODE
63f2a19305Safresh1        {});
64f2a19305Safresh1        for ($result1, $result2) {
65f2a19305Safresh1            (undef,$_,undef)= split /\n===\n/, $_;
66f2a19305Safresh1        }
67f2a19305Safresh1        my @l1= split /\n/, $result1;
68f2a19305Safresh1        my @l2= split /\n/, $result2;
69f2a19305Safresh1        push @res, 0+@l2;
70f2a19305Safresh1        is(0+@l2,0+@l1, sprintf
71f2a19305Safresh1            "Threaded and unthreaded stclass behavior matches (n=%d)",
72f2a19305Safresh1            $len);
73f2a19305Safresh1    }
74f2a19305Safresh1    my $n10= $res[0]/10;
75f2a19305Safresh1    my $n100= $res[1]/100;
76f2a19305Safresh1    my $n1000= $res[2]/1000;
77f2a19305Safresh1    ok(abs($n10-$n100)<1,"Behavior appears to be sub quadratic ($n10, $n100)");
78f2a19305Safresh1    ok(abs($n100-$n1000)<0.1,"Behavior is linear and not quadratic ($n100, $n1000)");
79f2a19305Safresh1    ok(abs(3-$n1000)<0.1,"Behavior is linear as expected");
80f2a19305Safresh1}
81f2a19305Safresh1#
82