1 /*
2  * Copyright (c) 2012-2017 The ANTLR Project. All rights reserved.
3  * Use of this file is governed by the BSD 3-clause license that
4  * can be found in the LICENSE.txt file in the project root.
5  */
6 
7 package org.antlr.v4.test.tool;
8 
9 import org.antlr.v4.misc.EscapeSequenceParsing;
10 import org.antlr.v4.runtime.misc.IntervalSet;
11 import org.junit.Test;
12 
13 import static org.antlr.v4.misc.EscapeSequenceParsing.Result;
14 import static org.junit.Assert.assertEquals;
15 
16 public class TestEscapeSequenceParsing {
17 	@Test
testParseEmpty()18 	public void testParseEmpty() {
19 		assertEquals(
20 				EscapeSequenceParsing.Result.Type.INVALID,
21 				EscapeSequenceParsing.parseEscape("", 0).type);
22 	}
23 
24 	@Test
testParseJustBackslash()25 	public void testParseJustBackslash() {
26 		assertEquals(
27 				EscapeSequenceParsing.Result.Type.INVALID,
28 				EscapeSequenceParsing.parseEscape("\\", 0).type);
29 	}
30 
31 	@Test
testParseInvalidEscape()32 	public void testParseInvalidEscape() {
33 		assertEquals(
34 				EscapeSequenceParsing.Result.Type.INVALID,
35 				EscapeSequenceParsing.parseEscape("\\z", 0).type);
36 	}
37 
38 	@Test
testParseNewline()39 	public void testParseNewline() {
40 		assertEquals(
41 				new Result(Result.Type.CODE_POINT, '\n', IntervalSet.EMPTY_SET, 0,2),
42 				EscapeSequenceParsing.parseEscape("\\n", 0));
43 	}
44 
45 	@Test
testParseTab()46 	public void testParseTab() {
47 		assertEquals(
48 				new Result(Result.Type.CODE_POINT, '\t', IntervalSet.EMPTY_SET, 0,2),
49 				EscapeSequenceParsing.parseEscape("\\t", 0));
50 	}
51 
52 	@Test
testParseUnicodeTooShort()53 	public void testParseUnicodeTooShort() {
54 		assertEquals(
55 				EscapeSequenceParsing.Result.Type.INVALID,
56 				EscapeSequenceParsing.parseEscape("\\uABC", 0).type);
57 	}
58 
59 	@Test
testParseUnicodeBMP()60 	public void testParseUnicodeBMP() {
61 		assertEquals(
62 				new Result(Result.Type.CODE_POINT, 0xABCD, IntervalSet.EMPTY_SET, 0,6),
63 				EscapeSequenceParsing.parseEscape("\\uABCD", 0));
64 	}
65 
66 	@Test
testParseUnicodeSMPTooShort()67 	public void testParseUnicodeSMPTooShort() {
68 		assertEquals(
69 				EscapeSequenceParsing.Result.Type.INVALID,
70 				EscapeSequenceParsing.parseEscape("\\u{}", 0).type);
71 	}
72 
73 	@Test
testParseUnicodeSMPMissingCloseBrace()74 	public void testParseUnicodeSMPMissingCloseBrace() {
75 		assertEquals(
76 				EscapeSequenceParsing.Result.Type.INVALID,
77 				EscapeSequenceParsing.parseEscape("\\u{12345", 0).type);
78 	}
79 
80 	@Test
testParseUnicodeTooBig()81 	public void testParseUnicodeTooBig() {
82 		assertEquals(
83 				EscapeSequenceParsing.Result.Type.INVALID,
84 				EscapeSequenceParsing.parseEscape("\\u{110000}", 0).type);
85 	}
86 
87 	@Test
testParseUnicodeSMP()88 	public void testParseUnicodeSMP() {
89 		assertEquals(
90 				new Result(Result.Type.CODE_POINT, 0x10ABCD, IntervalSet.EMPTY_SET, 0,10),
91 				EscapeSequenceParsing.parseEscape("\\u{10ABCD}", 0));
92 	}
93 
94 	@Test
testParseUnicodePropertyTooShort()95 	public void testParseUnicodePropertyTooShort() {
96 		assertEquals(
97 				EscapeSequenceParsing.Result.Type.INVALID,
98 				EscapeSequenceParsing.parseEscape("\\p{}", 0).type);
99 	}
100 
101 	@Test
testParseUnicodePropertyMissingCloseBrace()102 	public void testParseUnicodePropertyMissingCloseBrace() {
103 		assertEquals(
104 				EscapeSequenceParsing.Result.Type.INVALID,
105 				EscapeSequenceParsing.parseEscape("\\p{1234", 0).type);
106 	}
107 
108 	@Test
testParseUnicodeProperty()109 	public void testParseUnicodeProperty() {
110 		assertEquals(
111 				new Result(Result.Type.PROPERTY, -1, IntervalSet.of(66560, 66639), 0,11),
112 				EscapeSequenceParsing.parseEscape("\\p{Deseret}", 0));
113 	}
114 
115 	@Test
testParseUnicodePropertyInvertedTooShort()116 	public void testParseUnicodePropertyInvertedTooShort() {
117 		assertEquals(
118 				EscapeSequenceParsing.Result.Type.INVALID,
119 				EscapeSequenceParsing.parseEscape("\\P{}", 0).type);
120 	}
121 
122 	@Test
testParseUnicodePropertyInvertedMissingCloseBrace()123 	public void testParseUnicodePropertyInvertedMissingCloseBrace() {
124 		assertEquals(
125 				EscapeSequenceParsing.Result.Type.INVALID,
126 				EscapeSequenceParsing.parseEscape("\\P{Deseret", 0).type);
127 	}
128 
129 	@Test
testParseUnicodePropertyInverted()130 	public void testParseUnicodePropertyInverted() {
131 		IntervalSet expected = IntervalSet.of(0, 66559);
132 		expected.add(66640, Character.MAX_CODE_POINT);
133 		assertEquals(
134 				new Result(Result.Type.PROPERTY, -1, expected, 0, 11),
135 				EscapeSequenceParsing.parseEscape("\\P{Deseret}", 0));
136 	}
137 }
138