GP-1374 - Update DataTypeWriter enum output to sort by enum value instead of name

Closes #1664
This commit is contained in:
dragonmacher 2021-10-12 14:26:44 -04:00
parent 91f94b8155
commit 290a7c256f
8 changed files with 225 additions and 108 deletions

View file

@ -33,10 +33,6 @@ public class DataTypeWriterTest extends AbstractGTest {
private StringWriter writer;
private DataTypeWriter dtWriter;
public DataTypeWriterTest() {
super();
}
@Before
public void setUp() throws Exception {
@ -105,8 +101,16 @@ public class DataTypeWriterTest extends AbstractGTest {
enumm.add("E", 4);
dtWriter.write(enumm, TaskMonitor.DUMMY);
String actual = writer.getBuffer().toString();
String expected = "typedef enum myEnum {" + EOL + " A=0," + EOL + " B=1," + EOL +
" C=2," + EOL + " D=3," + EOL + " E=4" + EOL + "} myEnum;" + EOL + EOL;
//@formatter:off
String expected = "typedef enum myEnum {" + EOL +
" A=0," + EOL +
" B=1," + EOL +
" C=2," + EOL +
" D=3," + EOL +
" E=4" + EOL +
"} myEnum;" + EOL + EOL;
//@formatter:on
assertEquals(expected, actual);
}
@ -120,8 +124,84 @@ public class DataTypeWriterTest extends AbstractGTest {
enumm.add("E", 254);
dtWriter.write(enumm, TaskMonitor.DUMMY);
String actual = writer.getBuffer().toString();
String expected = "typedef enum myEnum {" + EOL + " A=4," + EOL + " B=8," + EOL +
" C=16," + EOL + " D=32," + EOL + " E=254" + EOL + "} myEnum;" + EOL + EOL;
//@formatter:off
String expected = "typedef enum myEnum {" + EOL +
" A=4," + EOL +
" B=8," + EOL +
" C=16," + EOL +
" D=32," + EOL +
" E=254" + EOL +
"} myEnum;" + EOL + EOL;
//@formatter:on
assertEquals(expected, actual);
}
@Test
public void testEnum_WithComments() throws IOException, CancelledException {
Enum enumm = new EnumDataType("myEnum", 1);
enumm.add("A", 0);
enumm.add("B", 1, "B Comment");
enumm.add("C", 2);
enumm.add("D", 3, "D Comment");
enumm.add("E", 4);
dtWriter.write(enumm, TaskMonitor.DUMMY);
String actual = writer.getBuffer().toString();
//@formatter:off
String expected = "typedef enum myEnum {" + EOL +
" A=0," + EOL +
" B=1 /* B Comment */," + EOL +
" C=2," + EOL +
" D=3 /* D Comment */," + EOL +
" E=4" + EOL +
"} myEnum;" + EOL + EOL;
//@formatter:on
assertEquals(expected, actual);
}
@Test
public void testEnum_MultipleNamesPerValue() throws IOException, CancelledException {
Enum enumm = new EnumDataType("myEnum", 1);
enumm.add("A", 4);
enumm.add("Two", 8);
enumm.add("One", 8);
enumm.add("End", 32);
dtWriter.write(enumm, TaskMonitor.DUMMY);
String actual = writer.getBuffer().toString();
//@formatter:off
String expected = "typedef enum myEnum {" + EOL +
" A=4," + EOL +
" One=8," + EOL +
" Two=8," + EOL +
" End=32" + EOL +
"} myEnum;" + EOL + EOL;
//@formatter:on
assertEquals(expected, actual);
}
@Test
public void testEnum_NamesOrderDifferenentThanValueOrder()
throws IOException, CancelledException {
Enum enumm = new EnumDataType("myEnum", 1);
enumm.add("E", 4);
enumm.add("C", 8);
enumm.add("D", 16);
enumm.add("B", 32);
enumm.add("A", 254);
dtWriter.write(enumm, TaskMonitor.DUMMY);
String actual = writer.getBuffer().toString();
//@formatter:off
String expected = "typedef enum myEnum {" + EOL +
" E=4," + EOL +
" C=8," + EOL +
" D=16," + EOL +
" B=32," + EOL +
" A=254" + EOL +
"} myEnum;" + EOL + EOL;
//@formatter:on
assertEquals(expected, actual);
}

View file

@ -22,7 +22,7 @@ import java.util.NoSuchElementException;
import org.junit.*;
import generic.test.AbstractGTest;
import ghidra.util.task.TaskMonitorAdapter;
import ghidra.util.task.TaskMonitor;
/**
* Tests for Enum data types.
@ -166,7 +166,7 @@ public class EnumTest extends AbstractGTest {
Enum enummDT = (Enum) c.addDataType(enumm, DataTypeConflictHandler.DEFAULT_HANDLER);
assertNotNull(enummDT);
c.remove(enummDT, TaskMonitorAdapter.DUMMY_MONITOR);
c.remove(enummDT, TaskMonitor.DUMMY);
assertNull(c.getDataType("Color"));
assertTrue(enummDT.isDeleted());
@ -235,6 +235,7 @@ public class EnumTest extends AbstractGTest {
Assert.fail("Should have gotten no such element exception!");
}
catch (NoSuchElementException e) {
// expected
}
}