mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-04-23 22:52:11 +02:00
Bug 307311: Add back method to MIConst to avoid breaking API, use a map for the special characters and unicode codepoints, add more JUnit tests, add the JUnit tests to the Sessionless suite.
This commit is contained in:
parent
a974434ec3
commit
fdd2d8570d
4 changed files with 89 additions and 76 deletions
|
@ -38,6 +38,10 @@ public class MIConst extends MIValue {
|
|||
return MIStringHandler.translateCString(cstring, true);
|
||||
}
|
||||
|
||||
public static String getString(String str) {
|
||||
return MIStringHandler.translateCString(str, true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return getCString();
|
||||
|
|
|
@ -17,6 +17,9 @@ import java.nio.charset.CharsetDecoder;
|
|||
import java.nio.charset.CharsetEncoder;
|
||||
import java.text.ParseException;
|
||||
import java.util.EnumSet;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
|
||||
/**
|
||||
* The MIStringHandler class provides several static functions to handle C and / or MI strings.
|
||||
|
@ -25,46 +28,26 @@ import java.util.EnumSet;
|
|||
public class MIStringHandler {
|
||||
|
||||
/**
|
||||
* Defines special characters which are used within escape notations to represent a
|
||||
* corresponding Unicode code point (i.e. character code). See the specialCodePoints
|
||||
* list below on the same index for the corresponding code point.
|
||||
* A map of special characters which are used within escape notations to represent a
|
||||
* corresponding Unicode code point (i.e. character code).
|
||||
*/
|
||||
private static char[] specialChars = new char[] {
|
||||
'a', // Alert (bell) character
|
||||
'b', // Backspace character
|
||||
'e', // GNU extension: Escape character
|
||||
'E', // same as 'e'
|
||||
'f', // Form feed character
|
||||
'n', // New line character
|
||||
'r', // Carriage return character
|
||||
't', // Horizontal tabulation character
|
||||
'v', // Vertical tabulation character
|
||||
'\'', // Single quotation mark
|
||||
'"', // Double quotation mark
|
||||
'\\', // Backslash
|
||||
'?' // Literal question mark
|
||||
};
|
||||
|
||||
/**
|
||||
* Defines special Unicode code points (i.e. character codes) which can be escaped by a
|
||||
* corresponding special character. See the specialChars list above on the same index
|
||||
* for the corresponding special character.
|
||||
*/
|
||||
private static int[] specialCodePoints = new int[] {
|
||||
0x07, // corresponds to \a
|
||||
0x08, // corresponds to \b
|
||||
0x1B, // corresponds to \e
|
||||
0x1B, // corresponds to \E
|
||||
0x0C, // corresponds to \f
|
||||
0x0A, // corresponds to \n
|
||||
0x0D, // corresponds to \r
|
||||
0x09, // corresponds to \t
|
||||
0x0B, // corresponds to \v
|
||||
0x27, // corresponds to \'
|
||||
0x22, // corresponds to \"
|
||||
0x5C, // corresponds to \\
|
||||
0x3F // corresponds to \?
|
||||
};
|
||||
// Use a LinkedHashMap to preserve order, so as to get 'e' and not 'E'
|
||||
private static Map<Character,Integer> fSpecialCharactersToCodePointMap = new LinkedHashMap<Character,Integer>();
|
||||
static {
|
||||
fSpecialCharactersToCodePointMap.put('a', 0x07); // Alert (bell) character
|
||||
fSpecialCharactersToCodePointMap.put('b', 0x08); // Backspace character
|
||||
fSpecialCharactersToCodePointMap.put('e', 0x1B); // GNU extension: Escape character
|
||||
fSpecialCharactersToCodePointMap.put('E', 0x1B); // same as 'e'
|
||||
fSpecialCharactersToCodePointMap.put('f', 0x0C); // Form feed character
|
||||
fSpecialCharactersToCodePointMap.put('n', 0x0A); // New line character
|
||||
fSpecialCharactersToCodePointMap.put('r', 0x0D); // Carriage return character
|
||||
fSpecialCharactersToCodePointMap.put('t', 0x09); // Horizontal tabulation character
|
||||
fSpecialCharactersToCodePointMap.put('v', 0x0B); // Vertical tabulation character
|
||||
fSpecialCharactersToCodePointMap.put('\'', 0x27); // Single quotation mark
|
||||
fSpecialCharactersToCodePointMap.put('"', 0x22); // Double quotation mark
|
||||
fSpecialCharactersToCodePointMap.put('\\', 0x5C); // Backslash
|
||||
fSpecialCharactersToCodePointMap.put('?', 0x3F); // Literal question mark
|
||||
}
|
||||
|
||||
/**
|
||||
* An internal helper enumeration which holds the current status while parsing an escaped
|
||||
|
@ -139,12 +122,7 @@ public class MIStringHandler {
|
|||
* @return The test result.
|
||||
*/
|
||||
public static boolean isSpecialChar(char c) {
|
||||
for (int i = 0; i < specialChars.length; i++) {
|
||||
if (specialChars[i] == c) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
return fSpecialCharactersToCodePointMap.containsKey(c);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -153,12 +131,7 @@ public class MIStringHandler {
|
|||
* @return The test result.
|
||||
*/
|
||||
public static boolean isSpecialCodePoint(int codePoint) {
|
||||
for (int i = 0; i < specialCodePoints.length; i++) {
|
||||
if (specialCodePoints[i] == codePoint) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
return fSpecialCharactersToCodePointMap.containsValue(codePoint);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -169,10 +142,9 @@ public class MIStringHandler {
|
|||
* not a special character.
|
||||
*/
|
||||
public static int parseSpecialChar(char c) throws ParseException {
|
||||
for (int i = 0; i < specialChars.length; i++) {
|
||||
if (specialChars[i] == c) {
|
||||
return specialCodePoints[i];
|
||||
}
|
||||
Integer codePoint = fSpecialCharactersToCodePointMap.get(c);
|
||||
if (codePoint != null) {
|
||||
return codePoint;
|
||||
}
|
||||
throw new ParseException("The given character '" + c + "' is not a special character.", 0); //$NON-NLS-1$ //$NON-NLS-2$
|
||||
}
|
||||
|
@ -185,9 +157,9 @@ public class MIStringHandler {
|
|||
* when it's not a special code point.
|
||||
*/
|
||||
public static char parseSpecialCodePoint(int codePoint) throws ParseException {
|
||||
for (int i = 0; i < specialCodePoints.length; i++) {
|
||||
if (specialCodePoints[i] == codePoint) {
|
||||
return specialChars[i];
|
||||
for (Entry<Character, Integer> entry : fSpecialCharactersToCodePointMap.entrySet()) {
|
||||
if (entry.getValue().equals(codePoint)) {
|
||||
return entry.getKey();
|
||||
}
|
||||
}
|
||||
throw new ParseException("The given Unicode code point " + codePoint + " is not a special code point.", 0); //$NON-NLS-1$ //$NON-NLS-2$
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2008, 2009 Ericsson and others.
|
||||
* Copyright (c) 2008, 2012 Ericsson and others.
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the Eclipse Public License v1.0
|
||||
* which accompanies this distribution, and is available at
|
||||
|
@ -10,6 +10,7 @@
|
|||
*******************************************************************************/
|
||||
package org.eclipse.cdt.dsf.mi.service.command.commands;
|
||||
|
||||
import org.eclipse.cdt.dsf.mi.service.command.output.MIStringHandlerTests;
|
||||
import org.eclipse.cdt.dsf.mi.service.command.output.MIThreadTests;
|
||||
import org.eclipse.cdt.tests.dsf.gdb.framework.OnceOnlySuite;
|
||||
import org.eclipse.cdt.tests.dsf.gdb.tests.LaunchUtilsTest;
|
||||
|
@ -27,7 +28,8 @@ import org.junit.runners.Suite;
|
|||
TestMIBreakInsertCommand.class,
|
||||
TestMICommandConstructCommand.class,
|
||||
MIThreadTests.class,
|
||||
LaunchUtilsTest.class
|
||||
LaunchUtilsTest.class,
|
||||
MIStringHandlerTests.class
|
||||
/* Add your test class here */
|
||||
})
|
||||
public class Suite_Sessionless_Tests {
|
||||
|
|
|
@ -10,13 +10,15 @@
|
|||
*******************************************************************************/
|
||||
package org.eclipse.cdt.dsf.mi.service.command.output;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.fail;
|
||||
|
||||
import java.text.ParseException;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
import junit.framework.JUnit4TestAdapter;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
public class MIStringHandlerTests {
|
||||
@Test
|
||||
public void testTranscodeString() {
|
||||
|
@ -103,10 +105,18 @@ public class MIStringHandlerTests {
|
|||
|
||||
// Testing special chars.
|
||||
assertEquals(MIStringHandler.isSpecialChar('a'), true);
|
||||
assertEquals(MIStringHandler.isSpecialChar('b'), true);
|
||||
assertEquals(MIStringHandler.isSpecialChar('e'), true);
|
||||
assertEquals(MIStringHandler.isSpecialChar('E'), true);
|
||||
assertEquals(MIStringHandler.isSpecialChar('f'), true);
|
||||
assertEquals(MIStringHandler.isSpecialChar('n'), true);
|
||||
assertEquals(MIStringHandler.isSpecialChar('r'), true);
|
||||
assertEquals(MIStringHandler.isSpecialChar('t'), true);
|
||||
assertEquals(MIStringHandler.isSpecialChar('v'), true);
|
||||
assertEquals(MIStringHandler.isSpecialChar('\''), true);
|
||||
assertEquals(MIStringHandler.isSpecialChar('"'), true);
|
||||
assertEquals(MIStringHandler.isSpecialChar('\\'), true);
|
||||
assertEquals(MIStringHandler.isSpecialChar('?'), true);
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -118,11 +128,19 @@ public class MIStringHandlerTests {
|
|||
assertEquals(MIStringHandler.isSpecialCodePoint(0x6E), false); // 'n' character
|
||||
|
||||
// Testing special Unicode code points.
|
||||
assertEquals(MIStringHandler.isSpecialCodePoint(0x07), true); // '\a' character
|
||||
assertEquals(MIStringHandler.isSpecialCodePoint(0x0A), true); // '\n' character
|
||||
assertEquals(MIStringHandler.isSpecialCodePoint(0x09), true); // '\t' character
|
||||
assertEquals(MIStringHandler.isSpecialCodePoint(0x07), true); // 'a' character
|
||||
assertEquals(MIStringHandler.isSpecialCodePoint(0x08), true); // 'b' character
|
||||
assertEquals(MIStringHandler.isSpecialCodePoint(0x1B), true); // 'e' character
|
||||
assertEquals(MIStringHandler.isSpecialCodePoint(0x1B), true); // 'E' character
|
||||
assertEquals(MIStringHandler.isSpecialCodePoint(0x0C), true); // 'f' character
|
||||
assertEquals(MIStringHandler.isSpecialCodePoint(0x0A), true); // 'n' character
|
||||
assertEquals(MIStringHandler.isSpecialCodePoint(0x0D), true); // 'r' character
|
||||
assertEquals(MIStringHandler.isSpecialCodePoint(0x09), true); // 't' character
|
||||
assertEquals(MIStringHandler.isSpecialCodePoint(0x0B), true); // 'v' character
|
||||
assertEquals(MIStringHandler.isSpecialCodePoint(0x27), true); // '\'' character
|
||||
assertEquals(MIStringHandler.isSpecialCodePoint(0x22), true); // '"' character
|
||||
assertEquals(MIStringHandler.isSpecialCodePoint(0x5C), true); // '\\' character
|
||||
assertEquals(MIStringHandler.isSpecialCodePoint(0x3F), true); // '?' character
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -143,10 +161,19 @@ public class MIStringHandlerTests {
|
|||
try {
|
||||
// Testing special chars.
|
||||
assertEquals(MIStringHandler.parseSpecialChar('a'), 0x07);
|
||||
assertEquals(MIStringHandler.parseSpecialChar('b'), 0x08);
|
||||
assertEquals(MIStringHandler.parseSpecialChar('e'), 0x1B);
|
||||
assertEquals(MIStringHandler.parseSpecialChar('E'), 0x1B);
|
||||
assertEquals(MIStringHandler.parseSpecialChar('f'), 0x0C);
|
||||
assertEquals(MIStringHandler.parseSpecialChar('n'), 0x0A);
|
||||
assertEquals(MIStringHandler.parseSpecialChar('r'), 0x0D);
|
||||
assertEquals(MIStringHandler.parseSpecialChar('t'), 0x09);
|
||||
assertEquals(MIStringHandler.parseSpecialChar('v'), 0x0B);
|
||||
assertEquals(MIStringHandler.parseSpecialChar('\''), 0x27);
|
||||
assertEquals(MIStringHandler.parseSpecialChar('"'), 0x22);
|
||||
assertEquals(MIStringHandler.parseSpecialChar('\\'), 0x5C);
|
||||
assertEquals(MIStringHandler.parseSpecialChar('?'), 0x3F);
|
||||
|
||||
} catch (ParseException e) {
|
||||
fail("Parsing exception thrown."); //$NON-NLS-1$
|
||||
}
|
||||
|
@ -170,10 +197,18 @@ public class MIStringHandlerTests {
|
|||
|
||||
// Testing special Unicode code points.
|
||||
assertEquals(MIStringHandler.parseSpecialCodePoint(0x07), 'a');
|
||||
assertEquals(MIStringHandler.parseSpecialCodePoint(0x08), 'b');
|
||||
assertEquals(MIStringHandler.parseSpecialCodePoint(0x1B), 'e');
|
||||
assertEquals(MIStringHandler.parseSpecialCodePoint(0x0C), 'f');
|
||||
assertEquals(MIStringHandler.parseSpecialCodePoint(0x0A), 'n');
|
||||
assertEquals(MIStringHandler.parseSpecialCodePoint(0x0D), 'r');
|
||||
assertEquals(MIStringHandler.parseSpecialCodePoint(0x09), 't');
|
||||
assertEquals(MIStringHandler.parseSpecialCodePoint(0x0B), 'v');
|
||||
assertEquals(MIStringHandler.parseSpecialCodePoint(0x27), '\'');
|
||||
assertEquals(MIStringHandler.parseSpecialCodePoint(0x22), '"');
|
||||
assertEquals(MIStringHandler.parseSpecialCodePoint(0x5C), '\\');
|
||||
assertEquals(MIStringHandler.parseSpecialCodePoint(0x3F), '?');
|
||||
|
||||
} catch (ParseException e) {
|
||||
fail("Parsing exception thrown."); //$NON-NLS-1$
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue