1#!/usr/bin/perl
2
3use strict;
4use warnings;
5
6use Test::More;
7use Test::RunValgrind ();
8use Path::Tiny qw/ path /;
9
10my $bin_dir  = path($0)->parent->absolute;
11my $data_dir = $bin_dir->child('data');
12
13my $IS_WIN = ( $^O eq "MSWin32" );
14
15if ($IS_WIN)
16{
17    plan skip_all => 'valgrind is not available on Windows';
18}
19else
20{
21    plan tests => 5;
22}
23
24sub test_using_valgrind
25{
26    my $args  = shift;
27    my $blurb = shift;
28
29    my $log_fn = "valgrind.log";
30
31    if ( ref($args) eq "ARRAY" )
32    {
33        $args = { argv => $args, prog => "black-hole-solve", };
34    }
35
36    my $cmd_line_args = $args->{argv};
37    my $prog          = $args->{prog};
38    my $success       = Test::RunValgrind->new(
39        {
40            supress_stderr => $args->{supress_stderr},
41        }
42    )->run(
43        {
44            blurb  => $blurb,
45            log_fn => $log_fn,
46            prog   => $ENV{'FCS_BIN_PATH'} . "/$prog",
47            argv   => [ @$cmd_line_args, ],
48        },
49    );
50    if (0)
51    {
52        if ( not $success )
53        {
54            diag( path($log_fn)->slurp_utf8 );
55            require Carp;
56            Carp::confess("valgrind error");
57        }
58    }
59    return $success;
60}
61
62# TEST
63test_using_valgrind(
64    [
65        '--game', 'all_in_a_row', $data_dir->child('24.all_in_a_row.board.txt'),
66    ],
67    qq{valgrind all_in_a_row deal #24.}
68);
69
70# TEST
71test_using_valgrind(
72    [
73        '--game',           'all_in_a_row',
74        '--display-boards', '--rank-reach-prune',
75        $data_dir->child('24.all_in_a_row.board.txt'),
76    ],
77    qq{valgrind --display-boards --rank-reach-prune all_in_a_row deal #24.}
78);
79
80# TEST
81test_using_valgrind(
82    {
83        argv => [
84            '--game', 'black_hole',
85            'non-existent-board----------flakmuttterputter.board',
86        ],
87        prog           => 'black-hole-solve',
88        supress_stderr => 1,
89    },
90    qq{valgrind does not crash on non-existent board.}
91);
92
93# TEST
94test_using_valgrind(
95    [
96        '--game', 'black_hole', '--display-boards', '--rank-reach-prune',
97        $data_dir->child( '26464608654870335080.bh.board.txt', ),
98    ],
99    qq{valgrind --display-boards --rank-reach-prune black_hole deal.}
100);
101
102# TEST
103test_using_valgrind(
104    {
105        prog => './black-hole-solve',
106        argv => [
107            '--game', 'black_hole', '--iters-display-step', '1100',
108            $data_dir->child("26464608654870335080.bh.board.txt")
109        ],
110    },
111    qq{valgrind --iters-display-step resume api},
112);
113