1   package org.gnomekr.potron.parser;
2   
3   import java.io.IOException;
4   import java.io.PrintWriter;
5   import java.io.Reader;
6   import java.io.StringReader;
7   import java.io.StringWriter;
8   import java.util.ArrayList;
9   import java.util.HashMap;
10  import java.util.List;
11  import java.util.Map;
12  
13  import junit.framework.TestCase;
14  
15  /***
16   * POParserTest.java
17   * @author Xavier Cho
18   * @version $Revision 1.1 $ $Date: 2005/08/28 11:47:15 $
19   */
20  public class POParserTest extends TestCase {
21  
22      private TestParserCallback callback;
23  
24      /***
25       * @see junit.framework.TestCase#setUp()
26       */
27      @Override
28      protected void setUp() throws Exception {
29          super.setUp();
30          this.callback = new TestParserCallback();
31      }
32  
33      /***
34       * @see junit.framework.TestCase#tearDown()
35       */
36      @Override
37      protected void tearDown() throws Exception {
38          super.tearDown();
39          this.callback = null;
40      }
41  
42      /***
43       * @throws IOException 
44       * @throws ParseException 
45       */
46      public void testParseComment() throws ParseException, IOException {
47          StringWriter writer = new StringWriter();
48          PrintWriter out = new PrintWriter(writer);
49  
50          out.println("# SOME DESCRIPTIVE TITLE.");
51          out.println("# Copyright (C) YEAR Free Software Foundation, Inc.");
52          out.println("# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.");
53          out.println("#");
54          out.println("#, fuzzy");
55  
56          String comment = writer.toString();
57  
58          out.println("msgid \"\"");
59          out.println("msgstr \"\"");
60  
61          writer.flush();
62  
63          Reader reader = new StringReader(writer.toString());
64  
65          POParser parser = new POParser(callback);
66          parser.parse(reader);
67  
68          assertEquals(callback.comment.trim(), comment.trim());
69      }
70  
71      /***
72       * @throws IOException 
73       * @throws ParseException 
74       */
75      public void testParseHeader() throws ParseException, IOException {
76          StringWriter writer = new StringWriter();
77          PrintWriter out = new PrintWriter(writer);
78  
79          out.println("#");
80          out.println("msgid \"\"");
81          out.println("msgstr \"\"");
82          out.println("\"Project-Id-Version: PACKAGE VERSION//n\"");
83          out.println("\"POT-Creation-Date: 2001-02-09 01:25+0100//n\"");
84  
85          writer.flush();
86  
87          Reader reader = new StringReader(writer.toString());
88  
89          POParser parser = new POParser(callback);
90          parser.parse(reader);
91  
92          assertEquals(2, callback.headers.size());
93  
94          assertTrue(callback.headers.containsKey("Project-Id-Version"));
95          assertEquals("PACKAGE VERSION", callback.headers
96                  .get("Project-Id-Version"));
97  
98          assertTrue(callback.headers.containsKey("POT-Creation-Date"));
99          assertEquals("2001-02-09 01:25+0100", callback.headers
100                 .get("POT-Creation-Date"));
101     }
102 
103     /***
104      * @throws IOException 
105      * @throws ParseException 
106      */
107     public void testParseEntry() throws ParseException, IOException {
108         StringWriter writer = new StringWriter();
109         PrintWriter out = new PrintWriter(writer);
110 
111         out.println("#");
112         out.println("msgid \"\"");
113         out.println("msgstr \"\"");
114         out.println("\"Project-Id-Version: PACKAGE VERSION//n\"");
115         out.println("\"POT-Creation-Date: 2001-02-09 01:25+0100//n\"");
116         out.println();
117         out.println("#: gpl.xml:11 gpl.xml:30");
118         out.println("#, no-c-format");
119         out.println("#. Tag: title");
120         out.println("msgid \"GNU General Public License\"");
121         out.println("msgstr \"test\"");
122         out.println();
123         out.println("#: gpl.xml:15");
124         out.println("#, no-c-format");
125         out.println("#, fuzzy");
126         out.println("msgid \"Free Software Foundation, Inc.\"");
127         out.println("msgstr \"test2\"");
128 
129         writer.flush();
130 
131         Reader reader = new StringReader(writer.toString());
132 
133         POParser parser = new POParser(callback);
134         parser.parse(reader);
135 
136         assertEquals(2, callback.entries.size());
137 
138         ParserEntry entry = callback.entries.get(0);
139         assertFalse(entry.isFuzzy());
140 
141         assertNotNull("test", entry.getMsgStr());
142 
143         assertEquals("gpl.xml:11 gpl.xml:30", entry.getReferences());
144         assertEquals("GNU General Public License", entry.getMsgId());
145         assertEquals("test", entry.getMsgStr().get(0));
146 
147         entry = callback.entries.get(1);
148         assertTrue(entry.isFuzzy());
149         assertEquals("gpl.xml:15", entry.getReferences());
150         assertEquals("Free Software Foundation, Inc.", entry.getMsgId());
151         assertEquals("test2", entry.getMsgStr().get(0));
152     }
153 
154     /***
155      * @throws IOException 
156      * @throws ParseException 
157      */
158     public void testParsePluralEntry() throws ParseException, IOException {
159         StringWriter writer = new StringWriter();
160         PrintWriter out = new PrintWriter(writer);
161 
162         out.println("#");
163         out.println("msgid \"\"");
164         out.println("msgstr \"\"");
165         out.println("\"Project-Id-Version: PACKAGE VERSION//n\"");
166         out.println("\"POT-Creation-Date: 2001-02-09 01:25+0100//n\"");
167         out.println("\"Plural-Forms: nplurals=3; plural=(n != 1);//n\"");
168         out.println();
169         out.println("#: gpl.xml:11 gpl.xml:30");
170         out.println("#, no-c-format");
171         out.println("#. Tag: title");
172         out.println("msgid \"GNU General Public License\"");
173         out.println("msgid_plural \"GNU General Public Licenses\"");
174         out.println("msgstr[0] \"test1\"");
175         out.println("msgstr[1] \"test2\"");
176         out.println("msgstr[2] \"test3\"");
177 
178         writer.flush();
179 
180         Reader reader = new StringReader(writer.toString());
181 
182         POParser parser = new POParser(callback);
183         parser.parse(reader);
184 
185         assertEquals(3, callback.nplural);
186         assertEquals("plural=(n != 1)", callback.pluralExpression);
187         assertEquals(1, callback.entries.size());
188 
189         ParserEntry entry = callback.entries.get(0);
190         assertEquals("GNU General Public Licenses", entry.getMsgIdPlural());
191         assertNotNull(entry.getMsgStr());
192         assertEquals(3, entry.getMsgStr().size());
193         assertEquals("test1", entry.getMsgStr().get(0));
194         assertEquals("test2", entry.getMsgStr().get(1));
195         assertEquals("test3", entry.getMsgStr().get(2));
196     }
197 
198     /***
199      * @throws IOException 
200      * @throws ParseException 
201      */
202     public void testStringNormalization() throws ParseException, IOException {
203         StringWriter writer = new StringWriter();
204         PrintWriter out = new PrintWriter(writer);
205 
206         out.println("#");
207         out.println("msgid \"\"");
208         out.println("msgstr \"\"");
209         out.println("\"Project-Id-Version: PACKAGE VERSION//n\"");
210         out.println();
211         out.println("#: gpl.xml:11 gpl.xml:30");
212         out.println("msgid \"GNU //nGeneral //tPublic//n \"License\"\"");
213         out.println("msgstr \"test\"");
214 
215         writer.flush();
216 
217         Reader reader = new StringReader(writer.toString());
218 
219         POParser parser = new POParser(callback);
220         parser.parse(reader);
221 
222         assertFalse(callback.entries.isEmpty());
223 
224         ParserEntry entry = callback.entries.get(0);
225         assertEquals("GNU \nGeneral \tPublic\n \"License\"", entry.getMsgId());
226     }
227 
228     private class TestParserCallback implements IPOParserCallback {
229 
230         private int nplural;
231         private String pluralExpression;
232         private String comment;
233         private Map<String, String> headers;
234         private List<ParserEntry> entries;
235 
236         private TestParserCallback() {
237             this.headers = new HashMap<String, String>();
238             this.entries = new ArrayList<ParserEntry>();
239         }
240 
241         public void startDocument() {
242         }
243 
244         public void onComment(String str) {
245             this.comment = str;
246         }
247 
248         public void onHeader(String name, String value) {
249             headers.put(name, value);
250         }
251 
252         public void onHeaderPluralForm(int nplural, String expression) {
253             this.nplural = nplural;
254             this.pluralExpression = expression;
255         }
256 
257         public void onEntry(ParserEntry entry) {
258             entries.add(entry);
259         }
260 
261         public void endDocument() {
262         }
263     }
264 }