GDDM Tweaking
Build and Test j3270 / Build JAR & Run Tests (push) Successful in 41s

This commit is contained in:
2026-08-27 18:14:39 +00:00
parent 540a8dfd1d
commit 2e9b6d325a
9 changed files with 185 additions and 47 deletions
@@ -132,11 +132,15 @@ public class QueryReplyBuilderTest {
assertEquals(0x81, replies[3] & 0xFF);
assertEquals(QR_DDM, replies[4] & 0xFF);
// Second SF should be Usable Area
// Second SF should be Usable Area: 23 bytes (4 bytes header + 19 bytes payload)
int pos2 = 1 + len1;
int len2 = ((replies[pos2] & 0xFF) << 8) | (replies[pos2 + 1] & 0xFF);
assertEquals(23, len2);
assertEquals(0x81, replies[pos2 + 2] & 0xFF);
assertEquals(QR_USABLE_AREA, replies[pos2 + 3] & 0xFF);
// Offset 0x15 (21 in SF payload = pos2 + 21): Buffer size high
int bufSize = ((replies[pos2 + 21] & 0xFF) << 8) | (replies[pos2 + 22] & 0xFF);
assertEquals(80 * 43, bufSize);
}
@Test
@@ -138,7 +138,7 @@ public class InputProcessorTest {
byte[] sf = haus.nightmare.lib3270j.graphics.GraphicInputBuilder.buildGraphicInput(100, -50, AID_ENTER, false, false, false);
assertEquals(56, sf.length);
assertEquals(0x00, sf[0]);
assertEquals(0x38, sf[1]); // Length = 56 bytes (0x0038)
assertEquals(0x34, sf[1]); // Length = 52 bytes (0x0034) matching IBM HODInput.java
assertEquals(0x0F, sf[2]); // SF ID = 0x0F
assertEquals(0x0F, sf[3]); // SF ID = 0x0F
@@ -160,7 +160,7 @@ public class InputProcessorTest {
);
assertEquals(56, sfMouse.length);
assertEquals(0x00, sfMouse[0]);
assertEquals(0x38, sfMouse[1]);
assertEquals(0x34, sfMouse[1]); // Length = 52 bytes (0x0034) matching IBM HODInput.java
assertEquals(0x23, sfMouse[16]);
assertEquals(0x00, sfMouse[17]);
assertEquals(0x23, sfMouse[18]);
@@ -394,9 +394,9 @@ public class InputProcessorTest {
// 1 (AID_SF 0x88) + 56 (SF) + 1 (AID_ENTER 0x7D) + 2 (Cursor Addr) + 1 (SBA) + 2 (Field Addr) + 1 (Data 'A') = 64 bytes
assertEquals(64, result.length);
assertEquals((byte) AID_SF, result[0]);
// SF length = 56 (0x00 0x38)
// SF length = 52 (0x00 0x34) per IBM HOD / GOCA specification
assertEquals(0x00, result[1]);
assertEquals(0x38, result[2]);
assertEquals(0x34, result[2]);
// SF ID = 0x0F0F
assertEquals(0x0F, result[3]);
assertEquals(0x0F, result[4]);
@@ -418,4 +418,37 @@ public class InputProcessorTest {
// Trailing field content 'A' at 63
assertEquals((byte) 0xC1, result[63]);
}
@Test
public void testAidSelectFramingOmitsFieldData() {
// Formatted screen with an unprotected field at 0, modified, containing 'A' and 'B'
screen.erase(false);
screen.setCellFA(0, (byte) (FA_PRINTABLE | FA_MODIFY));
screen.setCellFA(10, (byte) (FA_PRINTABLE | FA_PROTECT));
screen.getCell(1).ec = (byte) 0xC1;
screen.getCell(1).ucs4 = 'A';
screen.getCell(2).ec = (byte) 0xC2;
screen.getCell(2).ucs4 = 'B';
screen.setCursorAddress(1);
java.util.concurrent.atomic.AtomicReference<byte[]> sent = new java.util.concurrent.atomic.AtomicReference<>();
InputProcessor input = new InputProcessor(screen, translator, null) {
@Override
protected void sendAidResponse(byte[] data) {
sent.set(data);
}
};
input.sendAid(AID_SELECT);
byte[] result = sent.get();
assertNotNull(result);
// For AID_SELECT (0x7E), the stream consists ONLY of:
// 1 byte AID (0x7E) + 2 bytes cursor address + 1 byte SBA (0x11) + 2 bytes designator address = 6 bytes total.
// Field character contents ('A', 'B') MUST NOT be sent per IBM 3270 DS architecture!
assertEquals(6, result.length);
assertEquals((byte) AID_SELECT, result[0]);
// SBA order at byte 3
assertEquals((byte) ORDER_SBA, result[3]);
}
}