1use strict;
2use warnings;
3
4use Test::More;
5
6use SQL::Tokenizer;
7
8use constant SPACE => ' ';
9use constant COMMA => ',';
10use constant NL    => "\n";
11
12my $query;
13my @query;
14my @tokenized;
15
16my @tests = (
17    {
18        description => q{C style comment},
19        query       => <<COMPLEX_SQL,
20/* drop table */
21DROP TABLE test;
22/* create table */
23CREATE TABLE test (id INT, name VARCHAR);
24/* insert data */
25INSERT INTO test (id, name) VALUES (1, 't');
26INSERT INTO test (id, name) VALUES (2, '''quoted''');
27COMPLEX_SQL
28
29        wanted => [
30            q{/* drop table */}, NL,
31            'DROP',              SPACE,
32            'TABLE',             SPACE,
33            'test',              ';',
34            NL,                  q{/* create table */},
35            NL,                  'CREATE',
36            SPACE,               'TABLE',
37            SPACE,               'test',
38            SPACE,               '(',
39            'id',                SPACE,
40            'INT',               COMMA,
41            SPACE,               'name',
42            SPACE,               'VARCHAR',
43            ')',                 ';',
44            NL,                  q{/* insert data */},
45            NL,                  'INSERT',
46            SPACE,               'INTO',
47            SPACE,               'test',
48            SPACE,               '(',
49            'id',                COMMA,
50            SPACE,               'name',
51            ')',                 SPACE,
52            'VALUES',            SPACE,
53            '(',                 '1',
54            COMMA,               SPACE,
55            q{'t'},              ')',
56            ';',                 NL,
57            'INSERT',            SPACE,
58            'INTO',              SPACE,
59            'test',              SPACE,
60            '(',                 'id',
61            COMMA,               SPACE,
62            'name',              ')',
63            SPACE,               'VALUES',
64            SPACE,               '(',
65            '2',                 COMMA,
66            SPACE,               q{'''quoted'''},
67            ')',                 ';',
68            NL,
69        ],
70    },
71    {
72        description => q{multi-line C style comment},
73        query       => <<COMPLEX_SQL,
74/*
75    drop table
76*/
77DROP TABLE test;
78/*
79    create table
80*/
81CREATE TABLE test (id INT, name VARCHAR);
82/*
83    insert data
84*/
85INSERT INTO test (id, name) VALUES (1, 't');
86INSERT INTO test (id, name) VALUES (2, '''quoted''');
87COMPLEX_SQL
88
89        wanted => [
90            qq{/*\n    drop table\n*/}, NL,
91            'DROP',                     SPACE,
92            'TABLE',                    SPACE,
93            'test',                     ';',
94            NL,                         qq{/*\n    create table\n*/},
95            NL,                         'CREATE',
96            SPACE,                      'TABLE',
97            SPACE,                      'test',
98            SPACE,                      '(',
99            'id',                       SPACE,
100            'INT',                      COMMA,
101            SPACE,                      'name',
102            SPACE,                      'VARCHAR',
103            ')',                        ';',
104            NL,                         qq{/*\n    insert data\n*/},
105            NL,                         'INSERT',
106            SPACE,                      'INTO',
107            SPACE,                      'test',
108            SPACE,                      '(',
109            'id',                       COMMA,
110            SPACE,                      'name',
111            ')',                        SPACE,
112            'VALUES',                   SPACE,
113            '(',                        '1',
114            COMMA,                      SPACE,
115            q{'t'},                     ')',
116            ';',                        NL,
117            'INSERT',                   SPACE,
118            'INTO',                     SPACE,
119            'test',                     SPACE,
120            '(',                        'id',
121            COMMA,                      SPACE,
122            'name',                     ')',
123            SPACE,                      'VALUES',
124            SPACE,                      '(',
125            '2',                        COMMA,
126            SPACE,                      q{'''quoted'''},
127            ')',                        ';',
128            NL,
129        ],
130    },
131    {
132        description => q{multi-line C style comment with CR+LF newline},
133        query       => <<COMPLEX_SQL,
134/*\r
135    drop table\r
136*/\r
137DROP TABLE test;\r
138/*\r
139    create table\r
140*/\r
141CREATE TABLE test (id INT, name VARCHAR);\r
142/*\r
143    insert data\r
144*/\r
145INSERT INTO test (id, name) VALUES (1, 't');\r
146INSERT INTO test (id, name) VALUES (2, '''quoted''');\r
147COMPLEX_SQL
148
149        wanted => [
150            qq{/*\r\n    drop table\r\n*/}, NL,
151            'DROP',                         SPACE,
152            'TABLE',                        SPACE,
153            'test',                         ';',
154            NL,                             qq{/*\r\n    create table\r\n*/},
155            NL,                             'CREATE',
156            SPACE,                          'TABLE',
157            SPACE,                          'test',
158            SPACE,                          '(',
159            'id',                           SPACE,
160            'INT',                          COMMA,
161            SPACE,                          'name',
162            SPACE,                          'VARCHAR',
163            ')',                            ';',
164            NL,                             qq{/*\r\n    insert data\r\n*/},
165            NL,                             'INSERT',
166            SPACE,                          'INTO',
167            SPACE,                          'test',
168            SPACE,                          '(',
169            'id',                           COMMA,
170            SPACE,                          'name',
171            ')',                            SPACE,
172            'VALUES',                       SPACE,
173            '(',                            '1',
174            COMMA,                          SPACE,
175            q{'t'},                         ')',
176            ';',                            NL,
177            'INSERT',                       SPACE,
178            'INTO',                         SPACE,
179            'test',                         SPACE,
180            '(',                            'id',
181            COMMA,                          SPACE,
182            'name',                         ')',
183            SPACE,                          'VALUES',
184            SPACE,                          '(',
185            '2',                            COMMA,
186            SPACE,                          q{'''quoted'''},
187            ')',                            ';',
188            NL,
189        ],
190    },
191);
192
193plan tests => scalar @tests;
194
195foreach my $test (@tests) {
196    my @tokenized = SQL::Tokenizer->tokenize( $test->{query} );
197    is_deeply( \@tokenized, $test->{wanted}, $test->{description} );
198}
199