The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use warnings;
use utf8;
use Test::More;
use SQL::TwoWay;
use Test::Difflet qw(is_deeply);

sub VARIABLE () { SQL::TwoWay::VARIABLE }
sub SQL      () { SQL::TwoWay::SQL      }
sub IF       () { SQL::TwoWay::IF       }
sub END_     () { SQL::TwoWay::END_     }
sub ELSE     () { SQL::TwoWay::ELSE     }

sub tokenize { SQL::TwoWay::tokenize_two_way_sql(@_) }

ok SQL;
ok VARIABLE;

is_deeply(
    tokenize(
       q{/* IF $f *//* $y */"2"/* END */"2"}
    ),
    [
        [IF, 'f'],
        [VARIABLE, 'y'],
        [END_],
        [SQL, q{"2"}],
    ],
    'error'
);

is_deeply(
    tokenize(
       q{/* IF $f *//* $y */'2'/* END */'2'}
    ),
    [
        [IF, 'f'],
        [VARIABLE, 'y'],
        [END_],
        [SQL, q{'2'}],
    ],
    'error'
);

is_deeply(
    tokenize(
        'SELECT * FROM foo /* IF $var */v=/* $var */3/* END */'
    ),
    [
        [SQL, 'SELECT * FROM foo '],
        [IF, 'var'],
        [SQL, 'v='],
        [VARIABLE, 'var'],
        [END_],
    ],
    'Simple'
);

is_deeply(
    tokenize(
        'SELECT * FROM foo'
    ),
    [
        [SQL, 'SELECT * FROM foo']
    ],
    'Simple'
);

is_deeply(
    tokenize(
        'SELECT * FROM foo WHERE v=/* $v */3'
    ),
    [
        [SQL, 'SELECT * FROM foo WHERE v='],
        [VARIABLE, 'v']
    ],
    'Variable with integer'
);

is_deeply(
    tokenize(
        'SELECT * FROM foo WHERE 1=1 AND /* IF $c */v=/* $v */3/* END */'
    ),
    [
        [SQL, 'SELECT * FROM foo WHERE 1=1 AND '],
        [IF, 'c'],
        [SQL, 'v='],
        [VARIABLE, 'v'],
        [END_],
    ],
    'Simple IF stmt'
);

is_deeply(
    tokenize(
        'SELECT * FROM foo WHERE 1=1 AND /* IF $c */v=/* $v */3/* ELSE */g=4/* END */'
    ),
    [
        [SQL, 'SELECT * FROM foo WHERE 1=1 AND '],
        [IF, 'c'],
        [SQL, 'v='],
        [VARIABLE, 'v'],
        [ELSE],
        [SQL, 'g=4'],
        [END_],
    ],
    'IF-ELSE stmt'
);

done_testing;