GP-0 fix string representation rendering changes in tests

This commit is contained in:
dev747368 2023-12-27 21:52:27 +00:00
parent a806848b31
commit eb01064e3e
6 changed files with 130 additions and 84 deletions

View file

@ -457,8 +457,7 @@ public class StringDataTypeTest extends AbstractGTest {
newset().set(StandardCharsets.US_ASCII), buf.getLength());
//@formatter:off
String expected =
"\"\\0\"," +
"01h,02h,03h,04h,05h,06h,"+
"00h,01h,02h,03h,04h,05h,06h,"+
"\"\\a\\b\\t\\n\\v\\f\\r\",0Eh,0Fh,10h,11h,12h,13h,14h,15h,16h,17h,18h,19h,1Ah,1Bh,1Ch,1Dh,1Eh,1Fh,\""+
" !\\\"#$%&'()*+,-./0123456789:;<=>?@"+
"ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`"+
@ -484,8 +483,7 @@ public class StringDataTypeTest extends AbstractGTest {
allAsciiChars[i] = (byte) i;
}
String repr = "" +
"\"\\0\"," +
"01h,02h,03h,04h,05h,06h," +
"00h,01h,02h,03h,04h,05h,06h," +
"\"\\a\\b\\t\\n\\v\\f\\r\",0Eh,0Fh,10h,11h,12h,13h,14h,15h,16h,17h,18h,19h,1Ah,1Bh,1Ch,1Dh,1Eh,1Fh,\"" +
" !\\\"#$%&'()*+,-./0123456789:;<=>?@" +
"ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`" +

View file

@ -18,6 +18,7 @@ package ghidra.program.model.data;
import static org.junit.Assert.*;
import java.nio.ByteBuffer;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import org.junit.Test;
@ -26,6 +27,10 @@ import generic.test.AbstractGTest;
import ghidra.program.model.data.RenderUnicodeSettingsDefinition.RENDER_ENUM;
public class StringRenderBuilderTest extends AbstractGTest {
private static final Charset US_ASCII = StandardCharsets.US_ASCII;
private static final Charset UTF8 = StandardCharsets.UTF_8;
private static final Charset UTF16 = StandardCharsets.UTF_16;
private static final Charset UTF32 = Charset.forName("UTF-32");
private ByteBuffer bb(int... values) {
return ByteBuffer.wrap(bytes(values));
@ -34,7 +39,7 @@ public class StringRenderBuilderTest extends AbstractGTest {
@Test
public void testEmptyString() {
StringRenderBuilder srb =
new StringRenderBuilder(false, 1, StringRenderBuilder.DOUBLE_QUOTE);
new StringRenderBuilder(US_ASCII, 1, StringRenderBuilder.DOUBLE_QUOTE);
String emptyString = srb.build();
assertEquals("\"\"", emptyString);
}
@ -42,7 +47,7 @@ public class StringRenderBuilderTest extends AbstractGTest {
@Test
public void testEmptyWChar2String() {
StringRenderBuilder srb =
new StringRenderBuilder(true, 2, StringRenderBuilder.DOUBLE_QUOTE);
new StringRenderBuilder(UTF16, 2, StringRenderBuilder.DOUBLE_QUOTE);
String emptyString = srb.build();
assertEquals("u\"\"", emptyString);
}
@ -50,7 +55,7 @@ public class StringRenderBuilderTest extends AbstractGTest {
@Test
public void testEmptyWChar4String() {
StringRenderBuilder srb =
new StringRenderBuilder(true, 4, StringRenderBuilder.DOUBLE_QUOTE);
new StringRenderBuilder(UTF32, 4, StringRenderBuilder.DOUBLE_QUOTE);
String emptyString = srb.build();
assertEquals("U\"\"", emptyString);
}
@ -59,8 +64,8 @@ public class StringRenderBuilderTest extends AbstractGTest {
public void testEmptyStringWithNulls() {
ByteBuffer bb = bb(0, 0, 0);
StringRenderBuilder srb =
new StringRenderBuilder(false, 1, StringRenderBuilder.DOUBLE_QUOTE);
srb.decodeBytesUsingCharset(bb, StandardCharsets.US_ASCII, RENDER_ENUM.ALL, true);
new StringRenderBuilder(US_ASCII, 1, StringRenderBuilder.DOUBLE_QUOTE);
srb.decodeBytesUsingCharset(bb, RENDER_ENUM.ALL, true);
String emptyString = srb.build();
assertEquals("\"\"", emptyString);
}
@ -69,18 +74,18 @@ public class StringRenderBuilderTest extends AbstractGTest {
public void testEmptyStringWithNullsNoTrim() {
ByteBuffer bb = bb(0, 0, 0);
StringRenderBuilder srb =
new StringRenderBuilder(false, 1, StringRenderBuilder.DOUBLE_QUOTE);
srb.decodeBytesUsingCharset(bb, StandardCharsets.US_ASCII, RENDER_ENUM.ALL, false);
new StringRenderBuilder(US_ASCII, 1, StringRenderBuilder.DOUBLE_QUOTE);
srb.decodeBytesUsingCharset(bb, RENDER_ENUM.ALL, false);
String s = srb.build();
assertEquals("\"\\0\\0\\0\"", s);
assertEquals("00h,00h,00h", s);
}
@Test
public void testInteriorNulls() {
ByteBuffer bb = bb('t', 'e', 0, 's', 't', 0);
StringRenderBuilder srb =
new StringRenderBuilder(false, 1, StringRenderBuilder.DOUBLE_QUOTE);
srb.decodeBytesUsingCharset(bb, StandardCharsets.US_ASCII, RENDER_ENUM.ALL, true);
new StringRenderBuilder(US_ASCII, 1, StringRenderBuilder.DOUBLE_QUOTE);
srb.decodeBytesUsingCharset(bb, RENDER_ENUM.ALL, true);
String s = srb.build();
assertEquals("\"te\\0st\"", s);
}
@ -89,8 +94,8 @@ public class StringRenderBuilderTest extends AbstractGTest {
public void testSimpleString() {
ByteBuffer bb = bb('t', 'e', 's', 't');
StringRenderBuilder srb =
new StringRenderBuilder(false, 1, StringRenderBuilder.DOUBLE_QUOTE);
srb.decodeBytesUsingCharset(bb, StandardCharsets.US_ASCII, RENDER_ENUM.ALL, true);
new StringRenderBuilder(US_ASCII, 1, StringRenderBuilder.DOUBLE_QUOTE);
srb.decodeBytesUsingCharset(bb, RENDER_ENUM.ALL, true);
String s = srb.build();
assertEquals("\"test\"", s);
}
@ -99,8 +104,8 @@ public class StringRenderBuilderTest extends AbstractGTest {
public void testStandardEscapedChars() {
ByteBuffer bb = bb('t', 'e', 's', 't', '\n', '\t', '\r');
StringRenderBuilder srb =
new StringRenderBuilder(false, 1, StringRenderBuilder.DOUBLE_QUOTE);
srb.decodeBytesUsingCharset(bb, StandardCharsets.US_ASCII, RENDER_ENUM.ALL, true);
new StringRenderBuilder(US_ASCII, 1, StringRenderBuilder.DOUBLE_QUOTE);
srb.decodeBytesUsingCharset(bb, RENDER_ENUM.ALL, true);
String s = srb.build();
assertEquals("\"test\\n\\t\\r\"", s);
}
@ -109,8 +114,8 @@ public class StringRenderBuilderTest extends AbstractGTest {
public void testQuotedQuotesChars() {
ByteBuffer bb = bb('t', 'e', 's', 't', '"', '1', '2', '3');
StringRenderBuilder srb =
new StringRenderBuilder(false, 1, StringRenderBuilder.DOUBLE_QUOTE);
srb.decodeBytesUsingCharset(bb, StandardCharsets.US_ASCII, RENDER_ENUM.ALL, true);
new StringRenderBuilder(US_ASCII, 1, StringRenderBuilder.DOUBLE_QUOTE);
srb.decodeBytesUsingCharset(bb, RENDER_ENUM.ALL, true);
String s = srb.build();
assertEquals("\"test\\\"123\"", s);
}
@ -119,8 +124,8 @@ public class StringRenderBuilderTest extends AbstractGTest {
public void testSingleQuoteChars() {
ByteBuffer bb = bb('t', 'e', 's', 't', '\'', '1', '2', '3');
StringRenderBuilder srb =
new StringRenderBuilder(false, 1, StringRenderBuilder.DOUBLE_QUOTE);
srb.decodeBytesUsingCharset(bb, StandardCharsets.US_ASCII, RENDER_ENUM.ALL, true);
new StringRenderBuilder(US_ASCII, 1, StringRenderBuilder.DOUBLE_QUOTE);
srb.decodeBytesUsingCharset(bb, RENDER_ENUM.ALL, true);
String s = srb.build();
assertEquals("\"test'123\"", s);
}
@ -129,8 +134,8 @@ public class StringRenderBuilderTest extends AbstractGTest {
public void testSimpleStringWithTrailingNulls() {
ByteBuffer bb = bb('t', 'e', 's', 't', 0, 0, 0);
StringRenderBuilder srb =
new StringRenderBuilder(false, 1, StringRenderBuilder.DOUBLE_QUOTE);
srb.decodeBytesUsingCharset(bb, StandardCharsets.US_ASCII, RENDER_ENUM.ALL, true);
new StringRenderBuilder(US_ASCII, 1, StringRenderBuilder.DOUBLE_QUOTE);
srb.decodeBytesUsingCharset(bb, RENDER_ENUM.ALL, true);
String s = srb.build();
assertEquals("\"test\"", s);
}
@ -139,8 +144,8 @@ public class StringRenderBuilderTest extends AbstractGTest {
public void testSimpleStringWithTrailingNullsNoTrim() {
ByteBuffer bb = bb('t', 'e', 's', 't', 0, 0, 0);
StringRenderBuilder srb =
new StringRenderBuilder(false, 1, StringRenderBuilder.DOUBLE_QUOTE);
srb.decodeBytesUsingCharset(bb, StandardCharsets.US_ASCII, RENDER_ENUM.ALL, false);
new StringRenderBuilder(US_ASCII, 1, StringRenderBuilder.DOUBLE_QUOTE);
srb.decodeBytesUsingCharset(bb, RENDER_ENUM.ALL, false);
String s = srb.build();
assertEquals("\"test\\0\\0\\0\"", s);
}
@ -149,8 +154,8 @@ public class StringRenderBuilderTest extends AbstractGTest {
public void testUtf8String() {
ByteBuffer bb = bb(0xE1, 0x84, 0xA2); // should decode to \u1122
StringRenderBuilder srb =
new StringRenderBuilder(true, 1, StringRenderBuilder.DOUBLE_QUOTE);
srb.decodeBytesUsingCharset(bb, StandardCharsets.UTF_8, RENDER_ENUM.ALL, true);
new StringRenderBuilder(UTF8, 1, StringRenderBuilder.DOUBLE_QUOTE);
srb.decodeBytesUsingCharset(bb, RENDER_ENUM.ALL, true);
String s = srb.build();
assertEquals("u8\"\u1122\"", s);
}
@ -159,8 +164,8 @@ public class StringRenderBuilderTest extends AbstractGTest {
public void testUtf8NoRenderNonLatinString() {
ByteBuffer bb = bb(0xE1, 0x84, 0xA2); // should decode to \u1122
StringRenderBuilder srb =
new StringRenderBuilder(true, 1, StringRenderBuilder.DOUBLE_QUOTE);
srb.decodeBytesUsingCharset(bb, StandardCharsets.UTF_8, RENDER_ENUM.ESC_SEQ, true);
new StringRenderBuilder(UTF8, 1, StringRenderBuilder.DOUBLE_QUOTE);
srb.decodeBytesUsingCharset(bb, RENDER_ENUM.ESC_SEQ, true);
String s = srb.build();
assertEquals("u8\"\\u1122\"", s); // <- result is \ u 1122
}
@ -169,8 +174,8 @@ public class StringRenderBuilderTest extends AbstractGTest {
public void testBadBytes_USASCII() {
ByteBuffer bb = bb('t', 'e', 's', 't', 0x80);
StringRenderBuilder srb =
new StringRenderBuilder(false, 1, StringRenderBuilder.DOUBLE_QUOTE);
srb.decodeBytesUsingCharset(bb, StandardCharsets.US_ASCII, RENDER_ENUM.ALL, true);
new StringRenderBuilder(US_ASCII, 1, StringRenderBuilder.DOUBLE_QUOTE);
srb.decodeBytesUsingCharset(bb, RENDER_ENUM.ALL, true);
String s = srb.build();
assertEquals("\"test\",80h", s);
}
@ -180,8 +185,8 @@ public class StringRenderBuilderTest extends AbstractGTest {
// bad bytes in interior of string, switching modes
ByteBuffer bb = bb('t', 'e', 0x80, 's', 't');
StringRenderBuilder srb =
new StringRenderBuilder(false, 1, StringRenderBuilder.DOUBLE_QUOTE);
srb.decodeBytesUsingCharset(bb, StandardCharsets.US_ASCII, RENDER_ENUM.ALL, true);
new StringRenderBuilder(US_ASCII, 1, StringRenderBuilder.DOUBLE_QUOTE);
srb.decodeBytesUsingCharset(bb, RENDER_ENUM.ALL, true);
String s = srb.build();
assertEquals("\"te\",80h,\"st\"", s);
}
@ -191,8 +196,8 @@ public class StringRenderBuilderTest extends AbstractGTest {
// bad bytes at beginning of string
ByteBuffer bb = bb(0x80, 't', 'e', 's', 't');
StringRenderBuilder srb =
new StringRenderBuilder(false, 1, StringRenderBuilder.DOUBLE_QUOTE);
srb.decodeBytesUsingCharset(bb, StandardCharsets.US_ASCII, RENDER_ENUM.ALL, true);
new StringRenderBuilder(US_ASCII, 1, StringRenderBuilder.DOUBLE_QUOTE);
srb.decodeBytesUsingCharset(bb, RENDER_ENUM.ALL, true);
String s = srb.build();
assertEquals("80h,\"test\"", s);
}
@ -201,8 +206,8 @@ public class StringRenderBuilderTest extends AbstractGTest {
public void testTruncatedUtf8() {
ByteBuffer bb = bb('t', 'e', 's', 't', 0xE1, 0x84);
StringRenderBuilder srb =
new StringRenderBuilder(true, 1, StringRenderBuilder.DOUBLE_QUOTE);
srb.decodeBytesUsingCharset(bb, StandardCharsets.UTF_8, RENDER_ENUM.ALL, true);
new StringRenderBuilder(UTF8, 1, StringRenderBuilder.DOUBLE_QUOTE);
srb.decodeBytesUsingCharset(bb, RENDER_ENUM.ALL, true);
String s = srb.build();
assertEquals("u8\"test\",E1h,84h", s);
}
@ -211,8 +216,8 @@ public class StringRenderBuilderTest extends AbstractGTest {
public void testUtf16() {
ByteBuffer bb = bb('t', 0, 'e', 0, 's', 0, 't', 0);
StringRenderBuilder srb =
new StringRenderBuilder(true, 2, StringRenderBuilder.DOUBLE_QUOTE);
srb.decodeBytesUsingCharset(bb, StandardCharsets.UTF_16LE, RENDER_ENUM.ALL, true);
new StringRenderBuilder(StandardCharsets.UTF_16LE, 2, StringRenderBuilder.DOUBLE_QUOTE);
srb.decodeBytesUsingCharset(bb, RENDER_ENUM.ALL, true);
String s = srb.build();
assertEquals("u\"test\"", s);
}
@ -221,9 +226,23 @@ public class StringRenderBuilderTest extends AbstractGTest {
public void testUtf16BOM_LE() {
ByteBuffer bb = bb(0xff, 0xfe, 't', 0, 'e', 0, 's', 0, 't', 0);
StringRenderBuilder srb =
new StringRenderBuilder(true, 2, StringRenderBuilder.DOUBLE_QUOTE);
srb.decodeBytesUsingCharset(bb, StandardCharsets.UTF_16LE, RENDER_ENUM.ALL, true);
new StringRenderBuilder(StandardCharsets.UTF_16LE, 2, StringRenderBuilder.DOUBLE_QUOTE);
srb.decodeBytesUsingCharset(bb, RENDER_ENUM.ALL, true);
String s = srb.build();
assertEquals("u\"\\uFEFFtest\"", s);
}
@Test
public void testUtf32BOM_LE() {
// This test demonstrates the inconsistency of decoding a BOM in UTF-16 vs UTF-32
// UTF-16 charset impls will preserve the BOM in the result, whereas the UTF-32 does not.
// This probably isn't a big deal as BOMs aren't used frequently (?)
ByteBuffer bb =
bb(0xff, 0xfe, 0, 0, 't', 0, 0, 0, 'e', 0, 0, 0, 's', 0, 0, 0, 't', 0, 0, 0);
StringRenderBuilder srb = new StringRenderBuilder(Charset.forName("UTF-32LE"), 4,
StringRenderBuilder.DOUBLE_QUOTE);
srb.decodeBytesUsingCharset(bb, RENDER_ENUM.ALL, true);
String s = srb.build();
assertEquals("U\"test\"", s);
}
}