KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > scriptella > jdbc > SqlTokenizerTest


1 /*
2  * Copyright 2006-2007 The Scriptella Project Team.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */

16 package scriptella.jdbc;
17
18 import scriptella.AbstractTestCase;
19
20 import java.io.IOException JavaDoc;
21 import java.io.StringReader JavaDoc;
22 import java.util.Arrays JavaDoc;
23
24 /**
25  * Tests for {@link SqlReaderTokenizer}.
26  *
27  * @author Fyodor Kupolov
28  * @version 1.0
29  */

30 public class SqlTokenizerTest extends AbstractTestCase {
31     public void test() throws IOException JavaDoc {
32         String JavaDoc s="insert into table values 1,?v,\"?text\";st2";
33         SqlTokenizer tok = new SqlReaderTokenizer(new StringReader JavaDoc(s));
34         String JavaDoc actual = tok.nextStatement();
35         assertEquals("insert into table values 1,?v,\"?text\"", actual);
36         assertTrue(Arrays.equals(new int[] {27}, tok.getInjections()));
37         actual = tok.nextStatement();
38         assertEquals("st2", actual);
39         assertTrue(tok.getInjections().length==0);
40
41         s="DROP TABLE Test;";
42         tok = new SqlReaderTokenizer(new StringReader JavaDoc(s));
43         actual = tok.nextStatement();
44         assertEquals("DROP TABLE Test", actual);
45         actual = tok.nextStatement();
46         assertNull(actual);
47
48         s="UPDATE test set value='Updated1' where ID=1;";
49         tok = new SqlReaderTokenizer(new StringReader JavaDoc(s));
50         actual = tok.nextStatement();
51         assertEquals("UPDATE test set value='Updated1' where ID=1", actual);
52         actual = tok.nextStatement();
53         assertNull(actual);
54     }
55
56     public void testComments() throws IOException JavaDoc {
57         String JavaDoc s="insert into table values 1,?v--$comment\n;" +
58                 "-notacomment$v/**fdfdfd$comment\n$comment.v$$???\n;;;*/;stmt${var};\n" +
59                 "//$comment";
60         SqlReaderTokenizer tok = new SqlReaderTokenizer(new StringReader JavaDoc(s));
61         tok.setKeepFormat(true);
62         assertEquals("insert into table values 1,?v--$comment\n", tok.nextStatement());
63         assertTrue(Arrays.equals(new int[] {27}, tok.getInjections()));
64         assertEquals("-notacomment$v/**fdfdfd$comment\n$comment.v$$???\n;;;*/", tok.nextStatement());
65         assertTrue(Arrays.equals(new int[] {12}, tok.getInjections()));
66         assertEquals("stmt${var}", tok.nextStatement());
67         assertTrue(Arrays.equals(new int[] {4}, tok.getInjections()));
68         tok.nextStatement();
69         assertTrue(tok.getInjections().length==0);
70     }
71
72     public void testQuotes() throws IOException JavaDoc {
73         String JavaDoc data = "INSERT INTO \"$TBL\" VALUES (\"?V\")";
74         SqlTokenizer tok = new SqlReaderTokenizer(new StringReader JavaDoc(data));
75         tok.nextStatement();
76         assertTrue(Arrays.equals(new int[] {13}, tok.getInjections()));
77     }
78
79     /**
80      * Test correct handling of empty files.
81      */

82     public void testEmpty() throws IOException JavaDoc {
83         SqlTokenizer tok = new SqlReaderTokenizer(new StringReader JavaDoc(""));
84         assertNull(tok.nextStatement());
85     }
86
87     public void testSeparator() throws IOException JavaDoc {
88         String JavaDoc data = "st;1;;st 2";
89         SqlReaderTokenizer tok = new SqlReaderTokenizer(new StringReader JavaDoc(data));
90         tok.setSeparator(";;");
91         assertEquals("st;1", tok.nextStatement());
92         assertEquals("st 2", tok.nextStatement());
93         assertNull(tok.nextStatement());
94         tok = new SqlReaderTokenizer(new StringReader JavaDoc(data));
95         tok.setSeparator(";;");
96         tok.setSeparatorOnSingleLine(true);
97         assertEquals("st;1;;st 2", tok.nextStatement());
98         assertNull(tok.nextStatement());
99         data = "st;1 \n;;\nst 2";
100         tok = new SqlReaderTokenizer(new StringReader JavaDoc(data));
101         tok.setSeparator(";;");
102         tok.setSeparatorOnSingleLine(true);
103         assertEquals("st;1 \n", tok.nextStatement());
104         assertEquals("st 2", tok.nextStatement());
105         assertNull(tok.nextStatement());
106         data = "st;$v1\n / /*?comment*/ ?v2 2";
107         tok = new SqlReaderTokenizer(new StringReader JavaDoc(data));
108         tok.setSeparator("/");
109         tok.setSeparatorOnSingleLine(true);
110         tok.setKeepFormat(true);
111         assertEquals(data, tok.nextStatement());
112         assertTrue(Arrays.equals(new int[] {3, 23}, tok.getInjections()));
113         assertNull(tok.nextStatement());
114         ///
115
data = "st;$v1\r/\n/*?comment*/ ?v2 2";
116         tok = new SqlReaderTokenizer(new StringReader JavaDoc(data));
117         tok.setSeparator("/");
118         tok.setSeparatorOnSingleLine(true);
119         tok.setKeepFormat(true);
120         assertEquals("st;$v1\r", tok.nextStatement());
121         assertTrue(Arrays.equals(new int[] {3}, tok.getInjections()));
122         assertEquals("/*?comment*/ ?v2 2", tok.nextStatement());
123         assertTrue(Arrays.equals(new int[] {13}, tok.getInjections()));
124         assertNull(tok.nextStatement());
125         ///
126
data = "STATEMENT1 / \n\r" +
127                 " / \r\nSTATEMENT2\n/**fdfdfd**//";
128         tok = new SqlReaderTokenizer(new StringReader JavaDoc(data));
129         tok.setSeparator("/");
130         tok.setSeparatorOnSingleLine(true);
131         assertEquals("STATEMENT1 / \n", tok.nextStatement());
132         assertEquals("\nSTATEMENT2\n" +
133                 "/", tok.nextStatement());
134         ///
135
data = "/\nscript\n/\n";
136         tok = new SqlReaderTokenizer(new StringReader JavaDoc(data));
137         tok.setSeparator("/");
138         tok.setSeparatorOnSingleLine(true);
139         assertEquals("", tok.nextStatement());
140         assertEquals("script\n", tok.nextStatement());
141         assertNull(tok.nextStatement());
142         ///
143
data = "/\nscript\n/";
144         tok = new SqlReaderTokenizer(new StringReader JavaDoc(data));
145         tok.setSeparator("/");
146         tok.setSeparatorOnSingleLine(true);
147         assertEquals("", tok.nextStatement());
148         assertEquals("script\n", tok.nextStatement());
149         assertNull(tok.nextStatement());
150         ///
151
data = "statement;--comment\n/\nscrip$t\n/";
152         tok = new SqlReaderTokenizer(new StringReader JavaDoc(data));
153         tok.setSeparator("/");
154         tok.setSeparatorOnSingleLine(true);
155         assertEquals("statement;\n", tok.nextStatement());
156         assertEquals("scrip$t\n", tok.nextStatement());
157         assertTrue(Arrays.equals(new int[] {5}, tok.getInjections()));
158         assertNull(tok.nextStatement());
159     }
160
161     /**
162      * Tests if oracle hints are preserved.
163      */

164     public void testOracleHint() throws IOException JavaDoc {
165         String JavaDoc original = "SQL /*+ HINT */ --NOTAHINT \n\r /* +NOTAHINT*/";
166         SqlReaderTokenizer tok = new SqlReaderTokenizer(new StringReader JavaDoc(original));
167         assertEquals("SQL /*+ HINT */ \n",tok.nextStatement());
168         assertNull(tok.nextStatement());
169         tok = new SqlReaderTokenizer(new StringReader JavaDoc(original));
170         tok.setKeepFormat(true);
171         assertEquals(original,tok.nextStatement());
172         assertNull(tok.nextStatement());
173         //Now test with / separator - result should be the same
174
tok = new SqlReaderTokenizer(new StringReader JavaDoc(original));
175         tok.setKeepFormat(true);
176         tok.setSeparator("/");
177         tok.setSeparatorOnSingleLine(true);
178         assertEquals(original,tok.nextStatement());
179         assertNull(tok.nextStatement());
180         //Now test the ?,$ handling
181
original = "SQL $v1 ?v2 /*+ HINT */ --?NOT$AHINT \n\r'$v3'/* +$NOTAHINT*/ ?v4";
182         tok = new SqlReaderTokenizer(new StringReader JavaDoc(original));
183         assertEquals("SQL $v1 ?v2 /*+ HINT */ \n'$v3' ?v4",tok.nextStatement());
184         assertTrue(Arrays.equals(new int[] {4,8,26,31},tok.getInjections()));
185         //The same check but with keep format
186
tok = new SqlReaderTokenizer(new StringReader JavaDoc(original));
187         tok.setKeepFormat(true);
188         assertEquals(original,tok.nextStatement());
189         assertTrue(Arrays.equals(new int[] {4,8,40,60},tok.getInjections()));
190         assertNull(tok.nextStatement());
191     }
192
193     /**
194      * Tests if extra whitespaces are removed in keepformat=false mode.
195      * Single whitespace trimming is not performed, because performance is more important.
196      */

197     public void testWhitespaceTrim() throws IOException JavaDoc {
198         String JavaDoc sql = " --Comment\n\n\n SQL--text\n; SQL2";
199         SqlTokenizer tok = new SqlReaderTokenizer(new StringReader JavaDoc(sql));
200         assertEquals(" \nSQL\n", tok.nextStatement());
201         assertEquals(" SQL2", tok.nextStatement());
202         assertNull(tok.nextStatement());
203     }
204
205
206 }
207
Popular Tags