1   /*
2       StatCvs - CVS statistics generation 
3       Copyright (C) 2002  Lukasz Pekacki <lukasz@pekacki.de>
4       http://statcvs.sf.net/
5       
6       This library is free software; you can redistribute it and/or
7       modify it under the terms of the GNU Lesser General Public
8       License as published by the Free Software Foundation; either
9       version 2.1 of the License, or (at your option) any later version.
10  
11      This library is distributed in the hope that it will be useful,
12      but WITHOUT ANY WARRANTY; without even the implied warranty of
13      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14      Lesser General Public License for more details.
15  
16      You should have received a copy of the GNU Lesser General Public
17      License along with this library; if not, write to the Free Software
18      Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19      
20  	$RCSfile: BuilderTest.java,v $ 
21  	Created on $Date: 2008/04/02 11:22:14 $ 
22  */
23  
24  package net.sf.statcvs.input;
25  
26  import java.util.Date;
27  import java.util.HashMap;
28  import java.util.Iterator;
29  import java.util.Set;
30  
31  import junit.framework.TestCase;
32  import net.sf.statcvs.model.Author;
33  import net.sf.statcvs.model.Directory;
34  import net.sf.statcvs.model.Repository;
35  import net.sf.statcvs.model.Revision;
36  import net.sf.statcvs.model.VersionedFile;
37  import net.sf.statcvs.util.FilePatternMatcher;
38  
39  /**
40   * Test cases for {@link Builder}.
41   * 
42   * @author Anja Jentzsch
43   * @author Richard Cyganiak
44   * @see LinesOfCodeTest
45   * @version $Id: BuilderTest.java,v 1.26 2008/04/02 11:22:14 benoitx Exp $
46   */
47  public class BuilderTest extends TestCase {
48      private Builder builder;
49      private RevisionData rev1;
50      private RevisionData rev2;
51      private RevisionData rev3;
52  
53      /**
54       * Constructor
55       * @param arg0 input
56       */
57      public BuilderTest(final String arg0) {
58          super(arg0);
59      }
60  
61      /**
62       * @see TestCase#setUp()
63       */
64      protected void setUp() throws Exception {
65          super.setUp();
66          builder = new Builder(null, null, null, null);
67          builder.buildModule("testmodule");
68          rev1 = new RevisionData();
69          rev1.setRevisionNumber("1.1");
70          rev1.setLoginName("author1");
71          rev1.setStateExp();
72          rev1.setDate(new Date(100000));
73          rev1.setComment("comment1");
74          rev2 = new RevisionData();
75          rev2.setRevisionNumber("1.2");
76          rev2.setLoginName("author2");
77          rev2.setStateExp();
78          rev2.setLines(10, 2);
79          rev2.setDate(new Date(200000));
80          rev2.setComment("comment2");
81          rev3 = new RevisionData();
82          rev3.setRevisionNumber("1.3");
83          rev3.setLoginName("author1");
84          rev3.setStateDead();
85          rev3.setDate(new Date(300000));
86          rev3.setComment("comment3");
87      }
88  
89      /**
90       * Test if the module name is correctly passed on
91       */
92      public void testBuildModule() {
93          final Builder b = new Builder(null, null, null, null);
94          b.buildModule("test");
95          assertEquals("test", b.getProjectName());
96          assertTrue(b.getAtticFileNames().isEmpty());
97      }
98  
99      /**
100      * test {@link Builder.getAuthor(String)}
101      */
102     public void testGetAuthor() {
103         final Author author1 = builder.getAuthor("author1");
104         final Author author2 = builder.getAuthor("author2");
105         final Author author1b = builder.getAuthor("author1");
106         assertEquals(author1, author1b);
107         assertTrue(!author1.equals(author2));
108         assertTrue(!author1b.equals(author2));
109     }
110 
111     /**
112      * On some Windows systems, people can use both upper and lower case
113      * for the same login
114      */
115     public void testGetAuthorCase() {
116         final Author upper = this.builder.getAuthor("richard");
117         final Author lower = this.builder.getAuthor("Richard");
118         assertSame(upper, lower);
119     }
120 
121     /**
122      * test {@link Builder.getDirectory(String)}
123      */
124     public void testGetDirectoryRoot() {
125         final Directory dir1 = builder.getDirectory("fileInRoot");
126         final Directory dir2 = builder.getDirectory("anotherFileInRoot");
127         assertEquals(dir1, dir2);
128         assertTrue(dir1.isRoot());
129         assertEquals("", dir1.getName());
130         assertEquals("", dir1.getPath());
131     }
132 
133     /**
134      * test {@link Builder.getDirectory(String)}
135      */
136     public void testGetDirectoryDeepPath() {
137         final Directory dir1 = builder.getDirectory("src/file");
138         final Directory dir2 = builder.getDirectory("src/net/sf/statcvs/Main.java");
139         assertEquals(dir1, dir2.getParent().getParent().getParent());
140         assertTrue(dir1.getParent().isRoot());
141     }
142 
143     /**
144      * test {@link Builder.getDirectory(String)}
145      */
146     public void testGetDirectorySeveralPaths() {
147         final Directory dir1 = builder.getDirectory("src/net/sf/statcvs/Main.java");
148         final Directory dir2 = builder.getDirectory("src/com/microsoft/Windows95.java");
149         final Directory dir3 = builder.getDirectory("src/com/microsoft/Windows98.java");
150         assertEquals(dir2, dir3);
151         assertEquals(dir1.getParent().getParent().getParent(), dir2.getParent().getParent());
152     }
153 
154     public void testFilesEmpty() throws Exception {
155         final Builder builder1 = new Builder(null, null, null, null);
156         final Repository repo = builder1.createCvsContent();
157         assertTrue(repo.isEmpty());
158     }
159 
160     /**
161      * test {@link Builder.addFile(CvsFile)} and {@link Builder.getFiles()}
162      */
163     public void testFilesOneFile() throws Exception {
164         builder.buildFile("file1", false, false, new HashMap());
165         builder.buildRevision(rev1);
166         final Repository content = builder.createCvsContent();
167 
168         assertNotNull(content.getFiles());
169         assertEquals(1, content.getFiles().size());
170         final VersionedFile file1 = (VersionedFile) content.getFiles().first();
171         assertEquals("file1", file1.getFilenameWithPath());
172         assertEquals(builder.getDirectory(""), file1.getDirectory());
173         assertEquals(1, file1.getRevisions().size());
174     }
175 
176     /**
177      * test {@link Builder.addFile(CvsFile)} and {@link Builder.getFiles()}
178      */
179     public void testFileTwoFiles() throws Exception {
180         builder.buildFile("file2", false, false, new HashMap());
181         builder.buildRevision(rev1);
182         builder.buildFile("file3", false, false, new HashMap());
183         builder.buildRevision(rev2);
184         final Repository content = builder.createCvsContent();
185 
186         assertNotNull(content.getFiles());
187         assertEquals(2, content.getFiles().size());
188         final VersionedFile file2 = (VersionedFile) content.getFiles().first();
189         final VersionedFile file3 = (VersionedFile) content.getFiles().last();
190         assertEquals("file2", file2.getFilenameWithPath());
191         assertEquals("file3", file3.getFilenameWithPath());
192     }
193 
194     /**
195      * Tests {@link Builder.buildRevisionBegin}
196      */
197     public void testBuildRevision() throws Exception {
198         builder.buildFile("file", false, false, new HashMap());
199         builder.buildRevision(rev3);
200         builder.buildRevision(rev2);
201         builder.buildRevision(rev1);
202         final Repository content = builder.createCvsContent();
203 
204         final VersionedFile file = (VersionedFile) content.getFiles().first();
205         final Iterator it = file.getRevisions().iterator();
206         assertTrue(it.hasNext());
207         final Revision r1 = (Revision) it.next();
208         assertTrue(it.hasNext());
209         final Revision r2 = (Revision) it.next();
210         assertTrue(it.hasNext());
211         final Revision r3 = (Revision) it.next();
212         assertTrue(!it.hasNext());
213 
214         assertEquals("1.1", r1.getRevisionNumber());
215         assertTrue(r1.isInitialRevision());
216         assertEquals("author1", r1.getAuthor().getName());
217         assertEquals("comment1", r1.getComment());
218 
219         assertEquals("1.2", r2.getRevisionNumber());
220         assertTrue(!r2.isInitialRevision());
221         assertEquals(2, r2.getReplacedLines());
222         assertEquals(8, r2.getLinesDelta());
223         assertEquals("author2", r2.getAuthor().getName());
224 
225         assertEquals("1.3", r3.getRevisionNumber());
226         assertTrue(r3.isDead());
227         assertEquals("author1", r3.getAuthor().getName());
228 
229         assertSame(r1.getAuthor(), r3.getAuthor());
230     }
231 
232     public void testStartDateForPartialLog() throws Exception {
233         final RevisionData rev4 = new RevisionData();
234         rev4.setRevisionNumber("1.5");
235         rev4.setLines(10, 5);
236         rev4.setStateExp();
237         rev4.setLoginName("somebody");
238         rev4.setDate(new Date(100000000));
239         builder.buildFile("dir/normal_file", true, false, new HashMap());
240         builder.buildRevision(rev3);
241         builder.buildRevision(rev2);
242         builder.buildRevision(rev1);
243         builder.buildFile("partial_logged_file", true, false, new HashMap());
244         builder.buildRevision(rev4);
245         final Repository content = builder.createCvsContent();
246 
247         final VersionedFile file = (VersionedFile) content.getRoot().getFiles().iterator().next();
248         assertTrue(file.getInitialRevision().isBeginOfLog());
249         final Date beforeRev1 = new Date(rev1.getDate().getTime() - 60000);
250         assertEquals(beforeRev1, file.getInitialRevision().getDate());
251     }
252 
253     public void testIncludePattern() throws Exception {
254         final Builder b = new Builder(null, new FilePatternMatcher("a*"), new FilePatternMatcher("*z"), null);
255         assertTrue(b.matchesPatterns("abc"));
256         assertTrue(!b.matchesPatterns("xyz"));
257         assertTrue(!b.matchesPatterns("az"));
258     }
259 
260     public void testNoAtticFiles() throws Exception {
261         builder.buildFile("file1", false, false, new HashMap());
262         builder.buildFile("file2", false, false, new HashMap());
263         builder.buildFile("file3", false, false, new HashMap());
264         assertTrue(builder.getAtticFileNames().isEmpty());
265     }
266 
267     public void testAtticFiles() throws Exception {
268         builder.buildFile("file1", false, false, new HashMap());
269         builder.buildFile("file2", false, true, new HashMap());
270         builder.buildFile("file3", false, true, new HashMap());
271         builder.buildFile("file4", false, false, new HashMap());
272         final Set attic = builder.getAtticFileNames();
273         assertTrue(attic.contains("file2"));
274         assertTrue(attic.contains("file3"));
275         assertEquals(2, attic.size());
276     }
277 }