1   /**
2    * Logback: the generic, reliable, fast and flexible logging framework.
3    * 
4    * Copyright (C) 1999-2006, QOS.ch
5    * 
6    * This library is free software, you can redistribute it and/or modify it under
7    * the terms of the GNU Lesser General Public License as published by the Free
8    * Software Foundation.
9    */
10  
11  package ch.qos.logback.core.pattern.parser;
12  
13  
14  
15  import static org.junit.Assert.assertEquals;
16  
17  import java.util.ArrayList;
18  import java.util.List;
19  
20  import org.junit.Test;
21  
22  import ch.qos.logback.core.pattern.util.AlmostAsIsEscapeUtil;
23  
24  public class TokenStreamTest  {
25  
26  
27    @Test
28    public void testEmpty() throws ScanException {
29      List tl = new TokenStream("").tokenize();
30      List witness = new ArrayList();
31      assertEquals(witness, tl);
32    }
33  
34    @Test
35    public void testSingleLiteral() throws ScanException {
36      List tl = new TokenStream("hello").tokenize();
37      List<Token> witness = new ArrayList<Token>();
38      witness.add(new Token(Token.LITERAL, "hello"));
39      assertEquals(witness, tl);
40    }
41  
42    @Test
43    public void testLiteralWithPercent() throws ScanException {
44      {
45        List tl = new TokenStream("hello\\%world").tokenize();
46  
47        List<Token> witness = new ArrayList<Token>();
48        witness.add(new Token(Token.LITERAL, "hello%world"));
49        assertEquals(witness, tl);
50      }
51      {
52        List tl = new TokenStream("hello\\%").tokenize();
53        List<Token> witness = new ArrayList<Token>();
54        witness.add(new Token(Token.LITERAL, "hello%"));
55        assertEquals(witness, tl);
56      }
57  
58      {
59        List tl = new TokenStream("\\%").tokenize();
60        List<Token> witness = new ArrayList<Token>();
61        witness.add(new Token(Token.LITERAL, "%"));
62        assertEquals(witness, tl);
63      }
64    }
65  
66    @Test
67    public void testBasic() throws ScanException {
68  
69      // test "%c"
70      {
71        List tl = new TokenStream("%c").tokenize();
72        List<Token> witness = new ArrayList<Token>();
73        witness.add(Token.PERCENT_TOKEN);
74        witness.add(new Token(Token.KEYWORD, "c"));
75        assertEquals(witness, tl);
76      }
77  
78      {
79        // test "xyz%-34c"
80        List tl = new TokenStream("%a%b").tokenize();
81        List<Token> witness = new ArrayList<Token>();
82        witness.add(Token.PERCENT_TOKEN);
83        witness.add(new Token(Token.KEYWORD, "a"));
84        witness.add(Token.PERCENT_TOKEN);
85        witness.add(new Token(Token.KEYWORD, "b"));
86        assertEquals(witness, tl);
87      }
88  
89      {
90        // test "xyz%-34c"
91        List tl = new TokenStream("xyz%-34c").tokenize();
92        List<Token> witness = new ArrayList<Token>();
93        witness.add(new Token(Token.LITERAL, "xyz"));
94        witness.add(Token.PERCENT_TOKEN);
95        witness.add(new Token(Token.FORMAT_MODIFIER, "-34"));
96        witness.add(new Token(Token.KEYWORD, "c"));
97        assertEquals(witness, tl);
98      }
99    }
100 
101   @Test
102   public void testComplexNR() throws ScanException {
103     List tl = new TokenStream("%d{1234} [%34.-67toto] %n").tokenize();
104     List<Token> witness = new ArrayList<Token>();
105     witness.add(Token.PERCENT_TOKEN);
106     witness.add(new Token(Token.KEYWORD, "d"));
107     witness.add(new Token(Token.OPTION, "1234"));
108     witness.add(new Token(Token.LITERAL, " ["));
109     witness.add(Token.PERCENT_TOKEN);
110     witness.add(new Token(Token.FORMAT_MODIFIER, "34.-67"));
111     witness.add(new Token(Token.KEYWORD, "toto"));
112     witness.add(new Token(Token.LITERAL, "] "));
113     witness.add(Token.PERCENT_TOKEN);
114     witness.add(new Token(Token.KEYWORD, "n"));
115     assertEquals(witness, tl);
116   }
117 
118   @Test
119   public void testEmptyP() throws ScanException {
120     List tl = new TokenStream("()").tokenize();
121     List<Token> witness = new ArrayList<Token>();
122     witness.add(new Token(Token.LITERAL, "("));
123     witness.add(Token.RIGHT_PARENTHESIS_TOKEN);
124     assertEquals(witness, tl);
125   }
126 
127   @Test
128   public void testEmptyP2() throws ScanException {
129     List tl = new TokenStream("%()").tokenize();
130     List<Token> witness = new ArrayList<Token>();
131     witness.add(Token.PERCENT_TOKEN);
132     witness.add(Token.LEFT_PARENTHESIS_TOKEN);
133     witness.add(Token.RIGHT_PARENTHESIS_TOKEN);
134     assertEquals(witness, tl);
135   }
136 
137   @Test
138   public void testEscape() throws ScanException {
139     {
140       List tl = new TokenStream("\\%").tokenize();
141       List<Token> witness = new ArrayList<Token>();
142       witness.add(new Token(Token.LITERAL, "%"));
143       assertEquals(witness, tl);
144     }
145 
146     {
147       List tl = new TokenStream("\\%\\(\\t\\)\\r\\n").tokenize();
148       List<Token> witness = new ArrayList<Token>();
149       witness.add(new Token(Token.LITERAL, "%(\t)\r\n"));
150       assertEquals(witness, tl);
151     }
152 
153     {
154       List tl = new TokenStream("\\\\%x").tokenize();
155       List<Token> witness = new ArrayList<Token>();
156       witness.add(new Token(Token.LITERAL, "\\"));
157       witness.add(Token.PERCENT_TOKEN);
158       witness.add(new Token(Token.KEYWORD, "x"));
159       assertEquals(witness, tl);
160     }
161 
162     {
163       List tl = new TokenStream("%x\\)").tokenize();
164       List<Token> witness = new ArrayList<Token>();
165       witness.add(Token.PERCENT_TOKEN);
166       witness.add(new Token(Token.KEYWORD, "x"));
167       witness.add(new Token(Token.LITERAL, ")"));
168       assertEquals(witness, tl);
169     }
170 
171     {
172       List tl = new TokenStream("%x\\_a").tokenize();
173       List<Token> witness = new ArrayList<Token>();
174       witness.add(Token.PERCENT_TOKEN);
175       witness.add(new Token(Token.KEYWORD, "x"));
176       witness.add(new Token(Token.LITERAL, "a"));
177       assertEquals(witness, tl);
178     }
179     {
180       List tl = new TokenStream("%x\\_%b").tokenize();
181       List<Token> witness = new ArrayList<Token>();
182       witness.add(Token.PERCENT_TOKEN);
183       witness.add(new Token(Token.KEYWORD, "x"));
184       witness.add(Token.PERCENT_TOKEN);
185       witness.add(new Token(Token.KEYWORD, "b"));
186       assertEquals(witness, tl);
187     }
188   }
189 
190   @Test
191   public void testOptions() throws ScanException {
192     {
193       List tl = new TokenStream("%x{t}").tokenize();
194       List<Token> witness = new ArrayList<Token>();
195       witness.add(Token.PERCENT_TOKEN);
196       witness.add(new Token(Token.KEYWORD, "x"));
197       witness.add(new Token(Token.OPTION, "t"));
198       assertEquals(witness, tl);
199     }
200 
201     {
202       List tl = new TokenStream("%x{t,y}").tokenize();
203       List<Token> witness = new ArrayList<Token>();
204       witness.add(Token.PERCENT_TOKEN);
205       witness.add(new Token(Token.KEYWORD, "x"));
206       witness.add(new Token(Token.OPTION, "t,y"));
207       assertEquals(witness, tl);
208     }
209 
210     {
211       List tl = new TokenStream("%x{\"hello world.\", \"12y  \"}").tokenize();
212       List<Token> witness = new ArrayList<Token>();
213       witness.add(Token.PERCENT_TOKEN);
214       witness.add(new Token(Token.KEYWORD, "x"));
215       witness.add(new Token(Token.OPTION, "\"hello world.\", \"12y  \""));
216       assertEquals(witness, tl);
217     }
218 
219     {
220       List tl = new TokenStream("%x{opt\\}}").tokenize();
221       List<Token> witness = new ArrayList<Token>();
222       witness.add(Token.PERCENT_TOKEN);
223       witness.add(new Token(Token.KEYWORD, "x"));
224       witness.add(new Token(Token.OPTION, "opt}"));
225       assertEquals(witness, tl);
226     }
227   }
228 
229   @Test
230   public void testSimpleP() throws ScanException {
231     List tl = new TokenStream("%(hello %class{.4?})").tokenize();
232     List<Token> witness = new ArrayList<Token>();
233     witness.add(Token.PERCENT_TOKEN);
234     witness.add(Token.LEFT_PARENTHESIS_TOKEN);
235     witness.add(new Token(Token.LITERAL, "hello "));
236     witness.add(Token.PERCENT_TOKEN);
237     witness.add(new Token(Token.KEYWORD, "class"));
238     witness.add(new Token(Token.OPTION, ".4?"));
239     witness.add(Token.RIGHT_PARENTHESIS_TOKEN);
240     assertEquals(witness, tl);
241   }
242 
243   @Test
244   public void testSimpleP2() throws ScanException {
245     List tl = new TokenStream("X %a %-12.550(hello %class{.4?})").tokenize();
246     List<Token> witness = new ArrayList<Token>();
247     witness.add(new Token(Token.LITERAL, "X "));
248     witness.add(Token.PERCENT_TOKEN);
249     witness.add(new Token(Token.KEYWORD, "a"));
250     witness.add(new Token(Token.LITERAL, " "));
251     witness.add(Token.PERCENT_TOKEN);
252     witness.add(new Token(Token.FORMAT_MODIFIER, "-12.550"));
253     witness.add(Token.LEFT_PARENTHESIS_TOKEN);
254     witness.add(new Token(Token.LITERAL, "hello "));
255     witness.add(Token.PERCENT_TOKEN);
256     witness.add(new Token(Token.KEYWORD, "class"));
257     witness.add(new Token(Token.OPTION, ".4?"));
258     witness.add(Token.RIGHT_PARENTHESIS_TOKEN);
259     assertEquals(witness, tl);
260   }
261 
262   @Test
263   public void testMultipleRecursion() throws ScanException {
264     List tl = new TokenStream("%-1(%d %45(%class %file))").tokenize();
265     List<Token> witness = new ArrayList<Token>();
266     witness.add(Token.PERCENT_TOKEN);
267     witness.add(new Token(Token.FORMAT_MODIFIER, "-1"));
268     witness.add(Token.LEFT_PARENTHESIS_TOKEN);
269     witness.add(Token.PERCENT_TOKEN);
270     witness.add(new Token(Token.KEYWORD, "d"));
271     witness.add(new Token(Token.LITERAL, " "));
272     witness.add(Token.PERCENT_TOKEN);
273     witness.add(new Token(Token.FORMAT_MODIFIER, "45"));
274     witness.add(Token.LEFT_PARENTHESIS_TOKEN);
275     witness.add(Token.PERCENT_TOKEN);
276     witness.add(new Token(Token.KEYWORD, "class"));
277     witness.add(new Token(Token.LITERAL, " "));
278     witness.add(Token.PERCENT_TOKEN);
279     witness.add(new Token(Token.KEYWORD, "file"));
280     witness.add(Token.RIGHT_PARENTHESIS_TOKEN);
281     witness.add(Token.RIGHT_PARENTHESIS_TOKEN);
282 
283     assertEquals(witness, tl);
284   }
285 
286   @Test
287   public void testNested() throws ScanException {
288     List tl = new TokenStream("%(%a%(%b))").tokenize();
289     List<Token> witness = new ArrayList<Token>();
290     witness.add(Token.PERCENT_TOKEN);
291     witness.add(Token.LEFT_PARENTHESIS_TOKEN);
292     witness.add(Token.PERCENT_TOKEN);
293     witness.add(new Token(Token.KEYWORD, "a"));
294     witness.add(Token.PERCENT_TOKEN);
295     witness.add(Token.LEFT_PARENTHESIS_TOKEN);
296     witness.add(Token.PERCENT_TOKEN);
297     witness.add(new Token(Token.KEYWORD, "b"));
298     witness.add(Token.RIGHT_PARENTHESIS_TOKEN);
299     witness.add(Token.RIGHT_PARENTHESIS_TOKEN);
300 
301     assertEquals(witness, tl);
302 
303   }
304 
305   @Test
306   public void testEscapedParanteheses() throws ScanException {
307     {
308       List tl = new TokenStream("\\(%h\\)").tokenize();
309       List<Token> witness = new ArrayList<Token>();
310       witness.add(new Token(Token.LITERAL, "("));
311       witness.add(Token.PERCENT_TOKEN);
312       witness.add(new Token(Token.KEYWORD, "h"));
313       witness.add(new Token(Token.LITERAL, ")"));
314       assertEquals(witness, tl);
315     }
316     {
317       List tl = new TokenStream("(%h\\)").tokenize();
318       List<Token> witness = new ArrayList<Token>();
319       witness.add(new Token(Token.LITERAL, "("));
320       witness.add(Token.PERCENT_TOKEN);
321       witness.add(new Token(Token.KEYWORD, "h"));
322       witness.add(new Token(Token.LITERAL, ")"));
323       assertEquals(witness, tl);
324     }
325   }
326 
327   @Test
328   public void testWindowsLikeBackSlashes() throws ScanException {
329     {
330       List tl = new TokenStream("c:\\hello\\world.%i", new AlmostAsIsEscapeUtil())
331           .tokenize();
332 
333       List<Token> witness = new ArrayList<Token>();
334       witness.add(new Token(Token.LITERAL, "c:\\hello\\world."));
335       witness.add(Token.PERCENT_TOKEN);
336       witness.add(new Token(Token.KEYWORD, "i"));
337       assertEquals(witness, tl);
338     }
339   }
340 }