• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * [The "BSD license"]
3  *  Copyright (c) 2010 Terence Parr
4  *  All rights reserved.
5  *
6  *  Redistribution and use in source and binary forms, with or without
7  *  modification, are permitted provided that the following conditions
8  *  are met:
9  *  1. Redistributions of source code must retain the above copyright
10  *      notice, this list of conditions and the following disclaimer.
11  *  2. Redistributions in binary form must reproduce the above copyright
12  *      notice, this list of conditions and the following disclaimer in the
13  *      documentation and/or other materials provided with the distribution.
14  *  3. The name of the author may not be used to endorse or promote products
15  *      derived from this software without specific prior written permission.
16  *
17  *  THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18  *  IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19  *  OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20  *  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21  *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22  *  NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23  *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24  *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25  *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26  *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  */
28 package org.antlr.test;
29 
30 import org.antlr.analysis.Label;
31 import org.antlr.misc.IntervalSet;
32 import org.junit.Test;
33 
34 import java.util.ArrayList;
35 import java.util.List;
36 
37 
38 public class TestIntervalSet extends BaseTest {
39 
40     /** Public default constructor used by TestRig */
TestIntervalSet()41     public TestIntervalSet() {
42     }
43 
testSingleElement()44     @Test public void testSingleElement() throws Exception {
45         IntervalSet s = IntervalSet.of(99);
46         String expecting = "99";
47         assertEquals(s.toString(), expecting);
48     }
49 
testIsolatedElements()50     @Test public void testIsolatedElements() throws Exception {
51         IntervalSet s = new IntervalSet();
52         s.add(1);
53         s.add('z');
54         s.add('\uFFF0');
55         String expecting = "{1, 122, 65520}";
56         assertEquals(s.toString(), expecting);
57     }
58 
testMixedRangesAndElements()59     @Test public void testMixedRangesAndElements() throws Exception {
60         IntervalSet s = new IntervalSet();
61         s.add(1);
62         s.add('a','z');
63         s.add('0','9');
64         String expecting = "{1, 48..57, 97..122}";
65         assertEquals(s.toString(), expecting);
66     }
67 
testSimpleAnd()68     @Test public void testSimpleAnd() throws Exception {
69         IntervalSet s = IntervalSet.of(10,20);
70         IntervalSet s2 = IntervalSet.of(13,15);
71         String expecting = "13..15";
72         String result = (s.and(s2)).toString();
73         assertEquals(result, expecting);
74     }
75 
testRangeAndIsolatedElement()76     @Test public void testRangeAndIsolatedElement() throws Exception {
77         IntervalSet s = IntervalSet.of('a','z');
78         IntervalSet s2 = IntervalSet.of('d');
79         String expecting = "100";
80         String result = (s.and(s2)).toString();
81         assertEquals(result, expecting);
82     }
83 
testEmptyIntersection()84 	@Test public void testEmptyIntersection() throws Exception {
85 		IntervalSet s = IntervalSet.of('a','z');
86 		IntervalSet s2 = IntervalSet.of('0','9');
87 		String expecting = "{}";
88 		String result = (s.and(s2)).toString();
89 		assertEquals(result, expecting);
90 	}
91 
testEmptyIntersectionSingleElements()92 	@Test public void testEmptyIntersectionSingleElements() throws Exception {
93 		IntervalSet s = IntervalSet.of('a');
94 		IntervalSet s2 = IntervalSet.of('d');
95 		String expecting = "{}";
96 		String result = (s.and(s2)).toString();
97 		assertEquals(result, expecting);
98 	}
99 
testNotSingleElement()100     @Test public void testNotSingleElement() throws Exception {
101         IntervalSet vocabulary = IntervalSet.of(1,1000);
102         vocabulary.add(2000,3000);
103         IntervalSet s = IntervalSet.of(50,50);
104         String expecting = "{1..49, 51..1000, 2000..3000}";
105         String result = (s.complement(vocabulary)).toString();
106         assertEquals(result, expecting);
107     }
108 
testNotSet()109 	@Test public void testNotSet() throws Exception {
110 		IntervalSet vocabulary = IntervalSet.of(1,1000);
111 		IntervalSet s = IntervalSet.of(50,60);
112 		s.add(5);
113 		s.add(250,300);
114 		String expecting = "{1..4, 6..49, 61..249, 301..1000}";
115 		String result = (s.complement(vocabulary)).toString();
116 		assertEquals(result, expecting);
117 	}
118 
testNotEqualSet()119 	@Test public void testNotEqualSet() throws Exception {
120 		IntervalSet vocabulary = IntervalSet.of(1,1000);
121 		IntervalSet s = IntervalSet.of(1,1000);
122 		String expecting = "{}";
123 		String result = (s.complement(vocabulary)).toString();
124 		assertEquals(result, expecting);
125 	}
126 
testNotSetEdgeElement()127 	@Test public void testNotSetEdgeElement() throws Exception {
128 		IntervalSet vocabulary = IntervalSet.of(1,2);
129 		IntervalSet s = IntervalSet.of(1);
130 		String expecting = "2";
131 		String result = (s.complement(vocabulary)).toString();
132 		assertEquals(result, expecting);
133 	}
134 
testNotSetFragmentedVocabulary()135     @Test public void testNotSetFragmentedVocabulary() throws Exception {
136         IntervalSet vocabulary = IntervalSet.of(1,255);
137         vocabulary.add(1000,2000);
138         vocabulary.add(9999);
139         IntervalSet s = IntervalSet.of(50,60);
140         s.add(3);
141         s.add(250,300);
142         s.add(10000); // this is outside range of vocab and should be ignored
143         String expecting = "{1..2, 4..49, 61..249, 1000..2000, 9999}";
144         String result = (s.complement(vocabulary)).toString();
145         assertEquals(result, expecting);
146     }
147 
testSubtractOfCompletelyContainedRange()148     @Test public void testSubtractOfCompletelyContainedRange() throws Exception {
149         IntervalSet s = IntervalSet.of(10,20);
150         IntervalSet s2 = IntervalSet.of(12,15);
151         String expecting = "{10..11, 16..20}";
152         String result = (s.subtract(s2)).toString();
153         assertEquals(result, expecting);
154     }
155 
testSubtractOfOverlappingRangeFromLeft()156     @Test public void testSubtractOfOverlappingRangeFromLeft() throws Exception {
157         IntervalSet s = IntervalSet.of(10,20);
158         IntervalSet s2 = IntervalSet.of(5,11);
159         String expecting = "12..20";
160         String result = (s.subtract(s2)).toString();
161         assertEquals(result, expecting);
162 
163         IntervalSet s3 = IntervalSet.of(5,10);
164         expecting = "11..20";
165         result = (s.subtract(s3)).toString();
166         assertEquals(result, expecting);
167     }
168 
testSubtractOfOverlappingRangeFromRight()169     @Test public void testSubtractOfOverlappingRangeFromRight() throws Exception {
170         IntervalSet s = IntervalSet.of(10,20);
171         IntervalSet s2 = IntervalSet.of(15,25);
172         String expecting = "10..14";
173         String result = (s.subtract(s2)).toString();
174         assertEquals(result, expecting);
175 
176         IntervalSet s3 = IntervalSet.of(20,25);
177         expecting = "10..19";
178         result = (s.subtract(s3)).toString();
179         assertEquals(result, expecting);
180     }
181 
testSubtractOfCompletelyCoveredRange()182     @Test public void testSubtractOfCompletelyCoveredRange() throws Exception {
183         IntervalSet s = IntervalSet.of(10,20);
184         IntervalSet s2 = IntervalSet.of(1,25);
185         String expecting = "{}";
186         String result = (s.subtract(s2)).toString();
187         assertEquals(result, expecting);
188     }
189 
testSubtractOfRangeSpanningMultipleRanges()190     @Test public void testSubtractOfRangeSpanningMultipleRanges() throws Exception {
191         IntervalSet s = IntervalSet.of(10,20);
192         s.add(30,40);
193         s.add(50,60); // s has 3 ranges now: 10..20, 30..40, 50..60
194         IntervalSet s2 = IntervalSet.of(5,55); // covers one and touches 2nd range
195         String expecting = "56..60";
196         String result = (s.subtract(s2)).toString();
197         assertEquals(result, expecting);
198 
199         IntervalSet s3 = IntervalSet.of(15,55); // touches both
200         expecting = "{10..14, 56..60}";
201         result = (s.subtract(s3)).toString();
202         assertEquals(result, expecting);
203     }
204 
205 	/** The following was broken:
206 	 	{0..113, 115..65534}-{0..115, 117..65534}=116..65534
207 	 */
testSubtractOfWackyRange()208 	@Test public void testSubtractOfWackyRange() throws Exception {
209 		IntervalSet s = IntervalSet.of(0,113);
210 		s.add(115,200);
211 		IntervalSet s2 = IntervalSet.of(0,115);
212 		s2.add(117,200);
213 		String expecting = "116";
214 		String result = (s.subtract(s2)).toString();
215 		assertEquals(result, expecting);
216 	}
217 
testSimpleEquals()218     @Test public void testSimpleEquals() throws Exception {
219         IntervalSet s = IntervalSet.of(10,20);
220         IntervalSet s2 = IntervalSet.of(10,20);
221         Boolean expecting = new Boolean(true);
222         Boolean result = new Boolean(s.equals(s2));
223         assertEquals(result, expecting);
224 
225         IntervalSet s3 = IntervalSet.of(15,55);
226         expecting = new Boolean(false);
227         result = new Boolean(s.equals(s3));
228         assertEquals(result, expecting);
229     }
230 
testEquals()231     @Test public void testEquals() throws Exception {
232         IntervalSet s = IntervalSet.of(10,20);
233         s.add(2);
234         s.add(499,501);
235         IntervalSet s2 = IntervalSet.of(10,20);
236         s2.add(2);
237         s2.add(499,501);
238         Boolean expecting = new Boolean(true);
239         Boolean result = new Boolean(s.equals(s2));
240         assertEquals(result, expecting);
241 
242         IntervalSet s3 = IntervalSet.of(10,20);
243         s3.add(2);
244         expecting = new Boolean(false);
245         result = new Boolean(s.equals(s3));
246         assertEquals(result, expecting);
247     }
248 
testSingleElementMinusDisjointSet()249     @Test public void testSingleElementMinusDisjointSet() throws Exception {
250         IntervalSet s = IntervalSet.of(15,15);
251         IntervalSet s2 = IntervalSet.of(1,5);
252         s2.add(10,20);
253         String expecting = "{}"; // 15 - {1..5, 10..20} = {}
254         String result = s.subtract(s2).toString();
255         assertEquals(result, expecting);
256     }
257 
testMembership()258     @Test public void testMembership() throws Exception {
259         IntervalSet s = IntervalSet.of(15,15);
260         s.add(50,60);
261         assertTrue(!s.member(0));
262         assertTrue(!s.member(20));
263         assertTrue(!s.member(100));
264         assertTrue(s.member(15));
265         assertTrue(s.member(55));
266         assertTrue(s.member(50));
267         assertTrue(s.member(60));
268     }
269 
270     // {2,15,18} & 10..20
testIntersectionWithTwoContainedElements()271     @Test public void testIntersectionWithTwoContainedElements() throws Exception {
272         IntervalSet s = IntervalSet.of(10,20);
273         IntervalSet s2 = IntervalSet.of(2,2);
274         s2.add(15);
275         s2.add(18);
276         String expecting = "{15, 18}";
277         String result = (s.and(s2)).toString();
278         assertEquals(result, expecting);
279     }
280 
testIntersectionWithTwoContainedElementsReversed()281     @Test public void testIntersectionWithTwoContainedElementsReversed() throws Exception {
282         IntervalSet s = IntervalSet.of(10,20);
283         IntervalSet s2 = IntervalSet.of(2,2);
284         s2.add(15);
285         s2.add(18);
286         String expecting = "{15, 18}";
287         String result = (s2.and(s)).toString();
288         assertEquals(result, expecting);
289     }
290 
testComplement()291     @Test public void testComplement() throws Exception {
292         IntervalSet s = IntervalSet.of(100,100);
293         s.add(101,101);
294         IntervalSet s2 = IntervalSet.of(100,102);
295         String expecting = "102";
296         String result = (s.complement(s2)).toString();
297         assertEquals(result, expecting);
298     }
299 
testComplement2()300 	@Test public void testComplement2() throws Exception {
301 		IntervalSet s = IntervalSet.of(100,101);
302 		IntervalSet s2 = IntervalSet.of(100,102);
303 		String expecting = "102";
304 		String result = (s.complement(s2)).toString();
305 		assertEquals(result, expecting);
306 	}
307 
testComplement3()308 	@Test public void testComplement3() throws Exception {
309 		IntervalSet s = IntervalSet.of(1,96);
310 		s.add(99,Label.MAX_CHAR_VALUE);
311 		String expecting = "97..98";
312 		String result = (s.complement(1,Label.MAX_CHAR_VALUE)).toString();
313 		assertEquals(result, expecting);
314 	}
315 
testMergeOfRangesAndSingleValues()316     @Test public void testMergeOfRangesAndSingleValues() throws Exception {
317         // {0..41, 42, 43..65534}
318         IntervalSet s = IntervalSet.of(0,41);
319         s.add(42);
320         s.add(43,65534);
321         String expecting = "0..65534";
322         String result = s.toString();
323         assertEquals(result, expecting);
324     }
325 
testMergeOfRangesAndSingleValuesReverse()326     @Test public void testMergeOfRangesAndSingleValuesReverse() throws Exception {
327         IntervalSet s = IntervalSet.of(43,65534);
328         s.add(42);
329         s.add(0,41);
330         String expecting = "0..65534";
331         String result = s.toString();
332         assertEquals(result, expecting);
333     }
334 
testMergeWhereAdditionMergesTwoExistingIntervals()335     @Test public void testMergeWhereAdditionMergesTwoExistingIntervals() throws Exception {
336         // 42, 10, {0..9, 11..41, 43..65534}
337         IntervalSet s = IntervalSet.of(42);
338         s.add(10);
339         s.add(0,9);
340         s.add(43,65534);
341         s.add(11,41);
342         String expecting = "0..65534";
343         String result = s.toString();
344         assertEquals(result, expecting);
345     }
346 
testMergeWithDoubleOverlap()347 	@Test public void testMergeWithDoubleOverlap() throws Exception {
348 		IntervalSet s = IntervalSet.of(1,10);
349 		s.add(20,30);
350 		s.add(5,25); // overlaps two!
351 		String expecting = "1..30";
352 		String result = s.toString();
353 		assertEquals(result, expecting);
354 	}
355 
testSize()356 	@Test public void testSize() throws Exception {
357 		IntervalSet s = IntervalSet.of(20,30);
358 		s.add(50,55);
359 		s.add(5,19);
360 		String expecting = "32";
361 		String result = String.valueOf(s.size());
362 		assertEquals(result, expecting);
363 	}
364 
testToList()365 	@Test public void testToList() throws Exception {
366 		IntervalSet s = IntervalSet.of(20,25);
367 		s.add(50,55);
368 		s.add(5,5);
369 		String expecting = "[5, 20, 21, 22, 23, 24, 25, 50, 51, 52, 53, 54, 55]";
370 		List foo = new ArrayList();
371 		String result = String.valueOf(s.toList());
372 		assertEquals(result, expecting);
373 	}
374 
375 	/** The following was broken:
376 	    {'\u0000'..'s', 'u'..'\uFFFE'} & {'\u0000'..'q', 's'..'\uFFFE'}=
377 	    {'\u0000'..'q', 's'}!!!! broken...
378 	 	'q' is 113 ascii
379 	 	'u' is 117
380 	*/
testNotRIntersectionNotT()381 	@Test public void testNotRIntersectionNotT() throws Exception {
382 		IntervalSet s = IntervalSet.of(0,'s');
383 		s.add('u',200);
384 		IntervalSet s2 = IntervalSet.of(0,'q');
385 		s2.add('s',200);
386 		String expecting = "{0..113, 115, 117..200}";
387 		String result = (s.and(s2)).toString();
388 		assertEquals(result, expecting);
389 	}
390 
391 }
392