This commit is contained in:
+5
-1
@@ -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]);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user