Rearrange settings, update sample config
Build and Test j3270 / Build JAR & Run Tests (Java 11) (push) Successful in 1m8s
Build and Test j3270 / Build JAR & Run Tests (Java 21) (push) Successful in 1m15s
Build and Test j3270 / Build JAR & Run Tests (Java 17) (push) Successful in 1m38s
Release j3270 / Build & Publish Release (push) Successful in 1m13s
Build and Test j3270 / Build JAR & Run Tests (Java 11) (push) Successful in 1m8s
Build and Test j3270 / Build JAR & Run Tests (Java 21) (push) Successful in 1m15s
Build and Test j3270 / Build JAR & Run Tests (Java 17) (push) Successful in 1m38s
Release j3270 / Build & Publish Release (push) Successful in 1m13s
This commit is contained in:
@@ -0,0 +1,144 @@
|
||||
package haus.nightmare.lib3270j.input;
|
||||
|
||||
import haus.nightmare.lib3270j.TerminalModel;
|
||||
import haus.nightmare.lib3270j.charset.EbcdicTranslator;
|
||||
import haus.nightmare.lib3270j.ecl.ECLPS;
|
||||
import haus.nightmare.lib3270j.screen.ScreenBuffer;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import static haus.nightmare.lib3270j.protocol.DS3270Constants.*;
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
|
||||
/**
|
||||
* Unit tests for the "Block paste" feature.
|
||||
* Ensures that multi-line pastes maintain column alignment with the initial start column
|
||||
* when blockPaste is active (the default), and revert to standard 3270 Newline field advance
|
||||
* when blockPaste is disabled.
|
||||
*/
|
||||
public class BlockPasteTest {
|
||||
|
||||
private ScreenBuffer screen;
|
||||
private EbcdicTranslator translator;
|
||||
private InputProcessor input;
|
||||
private ECLPS ps;
|
||||
|
||||
@BeforeEach
|
||||
public void setUp() {
|
||||
translator = new EbcdicTranslator();
|
||||
screen = new ScreenBuffer(TerminalModel.IBM_3278_2, translator);
|
||||
input = new InputProcessor(screen, translator, null);
|
||||
ps = new ECLPS(screen, input, translator);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testBlockPasteDefaultsToTrue() {
|
||||
assertTrue(input.isBlockPaste(), "InputProcessor blockPaste should default to true");
|
||||
assertTrue(ps.isBlockPaste(), "ECLPS blockPaste should default to true");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testBlockPasteAlignsStartColumnInUnformattedScreen() {
|
||||
screen.erase(false);
|
||||
// Start cursor at row 0, column 15
|
||||
int startPos = screen.rowColToAddress(0, 15);
|
||||
screen.setCursorAddress(startPos);
|
||||
|
||||
String multilineText = "FIRST\nSECOND\nTHIRD";
|
||||
int pasted = input.pasteText(multilineText, true, false, true);
|
||||
assertEquals(16, pasted);
|
||||
|
||||
// Verify row 0, col 15-19 has "FIRST"
|
||||
assertEquals("FIRST", ps.getString(startPos, 5));
|
||||
|
||||
// Verify row 1, col 15-20 has "SECOND"
|
||||
int row1Col15 = screen.rowColToAddress(1, 15);
|
||||
assertEquals("SECOND", ps.getString(row1Col15, 6));
|
||||
|
||||
// Verify row 2, col 15-19 has "THIRD"
|
||||
int row2Col15 = screen.rowColToAddress(2, 15);
|
||||
assertEquals("THIRD", ps.getString(row2Col15, 5));
|
||||
|
||||
// Verify start of row 1 (cols 0-5) did NOT receive the paste
|
||||
int row1Col0 = screen.rowColToAddress(1, 0);
|
||||
assertNotEquals("SECOND", ps.getString(row1Col0, 6));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testBlockPasteAlignsStartColumnInFormattedScreen() {
|
||||
screen.erase(false);
|
||||
// Set up 3 rows each with an unprotected field starting at col 0 (FA at 0, 80, 160)
|
||||
screen.setFieldAttribute(0, (byte) FA_PRINTABLE);
|
||||
screen.setFieldAttribute(80, (byte) FA_PRINTABLE);
|
||||
screen.setFieldAttribute(160, (byte) FA_PRINTABLE);
|
||||
|
||||
// Start pasting at Row 0, Col 25
|
||||
int startPos = screen.rowColToAddress(0, 25);
|
||||
screen.setCursorAddress(startPos);
|
||||
|
||||
String multilineText = "ALPHA\r\nBETA\r\nGAMMA";
|
||||
int pasted = input.pasteText(multilineText, true, false, true);
|
||||
assertEquals(14, pasted);
|
||||
|
||||
assertEquals("ALPHA", ps.getString(screen.rowColToAddress(0, 25), 5));
|
||||
assertEquals("BETA", ps.getString(screen.rowColToAddress(1, 25), 4));
|
||||
assertEquals("GAMMA", ps.getString(screen.rowColToAddress(2, 25), 5));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDisabledBlockPasteRevertsToFirstUnprotectedField() {
|
||||
screen.erase(false);
|
||||
// Row 0: FA at 0 (unprotected col 1-79)
|
||||
// Row 1: FA at 80 (unprotected col 1-79)
|
||||
screen.setFieldAttribute(0, (byte) FA_PRINTABLE);
|
||||
screen.setFieldAttribute(80, (byte) FA_PRINTABLE);
|
||||
|
||||
// Start pasting at Row 0, Col 25
|
||||
int startPos = screen.rowColToAddress(0, 25);
|
||||
screen.setCursorAddress(startPos);
|
||||
|
||||
// blockPaste = false: newline should advance to first unprotected field on next row (pos 81 / col 1)
|
||||
String multilineText = "LINE1\nLINE2";
|
||||
input.pasteText(multilineText, true, false, false);
|
||||
|
||||
assertEquals("LINE1", ps.getString(screen.rowColToAddress(0, 25), 5));
|
||||
// LINE2 must be at row 1, col 1 (pos 81) rather than col 25
|
||||
assertEquals("LINE2", ps.getString(81, 5));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testBlockPasteStopAtProtectedBoundary() {
|
||||
screen.erase(false);
|
||||
// Row 0: unprotected field at pos 0
|
||||
screen.setFieldAttribute(0, (byte) FA_PRINTABLE);
|
||||
// Row 1: entirely protected row
|
||||
screen.setFieldAttribute(80, (byte) (FA_PRINTABLE | FA_PROTECT));
|
||||
|
||||
int startPos = screen.rowColToAddress(0, 10);
|
||||
screen.setCursorAddress(startPos);
|
||||
|
||||
// pasteStopAtProtectedLine = true
|
||||
String multilineText = "ROW0\nROW1";
|
||||
int pasted = input.pasteText(multilineText, true, true, true);
|
||||
|
||||
// Should paste "ROW0" (4 chars) and halt when row 1 is protected
|
||||
assertEquals(4, pasted);
|
||||
assertEquals("ROW0", ps.getString(startPos, 4));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testEclPsPasteStringHonorsBlockPaste() {
|
||||
screen.erase(false);
|
||||
screen.setFieldAttribute(0, (byte) FA_PRINTABLE);
|
||||
screen.setFieldAttribute(80, (byte) FA_PRINTABLE);
|
||||
|
||||
ps.setBlockPaste(true);
|
||||
assertTrue(ps.isBlockPaste());
|
||||
|
||||
int pasted = ps.pasteString("DATA1\nDATA2", 0, 12);
|
||||
assertEquals(10, pasted);
|
||||
|
||||
assertEquals("DATA1", ps.getString(screen.rowColToAddress(0, 12), 5));
|
||||
assertEquals("DATA2", ps.getString(screen.rowColToAddress(1, 12), 5));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user