View Javadoc
1   package com.atlassian.plugin.util;
2   
3   
4   import org.junit.Test;
5   
6   import static org.junit.Assert.assertEquals;
7   import static org.junit.Assert.assertFalse;
8   import static org.junit.Assert.assertTrue;
9   
10  public class TestVersionStringComparator {
11  
12      private final VersionStringComparator comparator = new VersionStringComparator();
13  
14      @Test
15      public void testIntegers() {
16          assertSecondGreater("0", "1");
17          assertSecondGreater("1", "2");
18          assertSecondGreater("75", "1000");
19      }
20  
21      @Test
22      public void testOneDot() {
23          assertSecondGreater("0.1", "0.2");
24          assertSecondGreater("0.9", "1.0");
25          assertSecondGreater("1.1", "1.10");
26          assertSecondGreater("1.1", "1.19");
27          assertSecondGreater("3.75", "4.19");
28          assertSecondGreater("0.1", "1");
29          assertSecondGreater("0.9", "1");
30      }
31  
32      @Test
33      public void testLongString() {
34          assertSecondGreater("1.0-1414575567068", "1.0-1414575567069");
35          assertBothSame("1.0-1414575567068", "1.0-00000000000000000001414575567068");
36      }
37  
38      @Test
39      public void testTwoDots() {
40          assertSecondGreater("0.0.1", "0.0.2");
41          assertSecondGreater("0.9.0", "1.0.0");
42          assertSecondGreater("1.0", "1.0.1");
43          assertSecondGreater("1.1.0", "1.10.0");
44          assertSecondGreater("1.1.9", "1.19");
45          assertSecondGreater("3.56.75", "4.46.19");
46      }
47  
48      @Test
49      public void testMoreDots() {
50          assertSecondGreater("0.0.0.1", "0.0.0.2");
51          assertSecondGreater("0.0.0.1", "0.0.1.0");
52          assertSecondGreater("2.5.7.3", "2.5.8.1");
53          assertSecondGreater("27.5.27.3.12", "56.5.8.1");
54      }
55  
56      @Test
57      public void testLetters() {
58          assertSecondGreater("0.1a", "0.1b");
59          assertSecondGreater("0.1-alpha", "0.2-beta");
60          assertSecondGreater("2.3-dr1", "2.3-dr2");
61          assertSecondGreater("2.3-dr1", "2.3-DR2");
62          assertSecondGreater("2.3-dr1", "2.3");
63          assertSecondGreater("1.0-rc1", "1.0");
64          assertSecondGreater("1.0a", "1.1");
65          assertSecondGreater("1.0a", "1.1a");
66          assertSecondGreater("1.0a", "2.0a");
67          assertSecondGreater("1.5", "1.6a");
68          assertSecondGreater("1.2-m2", "1.2.0");
69          assertSecondGreater("1.2-m2", "1.2.1");
70      }
71  
72      @Test
73      public void testBetas() {
74          assertSecondGreater("1.0-beta1", "1.0-beta2");
75          assertSecondGreater("1.0-beta", "1.0-beta2");
76      }
77  
78      @Test
79      public void testDates() {
80          assertSecondGreater("2006-01-12", "2006-10-07");
81          assertSecondGreater("2006.01.12", "2006-10-07");
82          assertSecondGreater("20060112", "20061007");
83      }
84  
85      /**
86       * Unfortunate side-effects of the implementation that can't be avoided
87       */
88      @Test
89      public void testUnintuitiveCases() {
90          assertBothSame("1.01", "1.1");
91          assertSecondGreater("1.0a", "1.0");
92  //        assertSecondGreater("1.0", "1.0a");
93          assertSecondGreater("1.0-beta10", "1.0-beta2");
94      }
95  
96      @Test
97      public void testValidVersions() {
98          assertValidVersion("1");
99          assertValidVersion("1.0");
100         assertValidVersion("1.2.0");
101         assertValidVersion("1.2.0.56");
102         assertValidVersion("0.223.0.56");
103         assertValidVersion("2.3-beta1");
104         assertValidVersion("alpha");
105         assertValidVersion("beta");
106         assertValidVersion("2005-12-03");
107     }
108 
109     @Test
110     public void testInvalidVersions() {
111         assertInvalidVersion("");
112         assertInvalidVersion(null);
113         assertInvalidVersion("%^&%#");
114     }
115 
116     @Test
117     public void testSnapshots() {
118         assertTrue(VersionStringComparator.isSnapshotVersion("1.0-SNAPSHOT"));
119         assertFalse(VersionStringComparator.isSnapshotVersion("1.0-snapshot"));
120         assertFalse(VersionStringComparator.isSnapshotVersion("1.0-SNAPSHOT-1"));
121         assertSecondGreater("1.0-SNAPSHOT", "1.0");
122         assertSecondGreater("1.0", "1.0.1-SNAPSHOT");
123         assertSecondGreater("1.0", "1.1-SNAPSHOT");
124         assertSecondGreater("1.1-m1", "1.1-SNAPSHOT");
125         assertBothSame("1.1-SNAPSHOT", "1.1-SNAPSHOT");
126     }
127 
128     private void assertSecondGreater(final String first, final String second) {
129         assertValidVersion(first);
130         assertValidVersion(second);
131 
132         // check both are reflexive
133         assertBothSame(first, first);
134         assertBothSame(second, second);
135 
136         // check for symmetry
137         assertTrue(first + " < " + second, comparator.compare(second, first) > 0);
138         assertTrue(first + " < " + second, comparator.compare(first, second) < 0);
139     }
140 
141     private void assertValidVersion(final String string) {
142         assertTrue(VersionStringComparator.isValidVersionString(string));
143     }
144 
145     private void assertInvalidVersion(final String string) {
146         assertFalse(VersionStringComparator.isValidVersionString(string));
147     }
148 
149     private void assertBothSame(final String first, final String second) {
150         assertEquals(first + " == " + second, 0, comparator.compare(first, second));
151     }
152 }