diff --git a/src/main/java/dan200/computercraft/core/terminal/TextBuffer.java b/src/main/java/dan200/computercraft/core/terminal/TextBuffer.java index e855ff5d1..d042a2b34 100644 --- a/src/main/java/dan200/computercraft/core/terminal/TextBuffer.java +++ b/src/main/java/dan200/computercraft/core/terminal/TextBuffer.java @@ -12,46 +12,12 @@ public class TextBuffer public TextBuffer( char c, int length ) { text = new char[length]; - for( int i = 0; i < length; i++ ) - { - text[i] = c; - } + this.fill( c ); } public TextBuffer( String text ) { - this( text, 1 ); - } - - public TextBuffer( String text, int repetitions ) - { - int textLength = text.length(); - this.text = new char[textLength * repetitions]; - for( int i = 0; i < repetitions; i++ ) - { - for( int j = 0; j < textLength; j++ ) - { - this.text[j + i * textLength] = text.charAt( j ); - } - } - } - - public TextBuffer( TextBuffer text ) - { - this( text, 1 ); - } - - public TextBuffer( TextBuffer text, int repetitions ) - { - int textLength = text.length(); - this.text = new char[textLength * repetitions]; - for( int i = 0; i < repetitions; i++ ) - { - for( int j = 0; j < textLength; j++ ) - { - this.text[j + i * textLength] = text.charAt( j ); - } - } + this.text = text.toCharArray(); } public int length() @@ -59,39 +25,16 @@ public class TextBuffer return text.length; } - public String read() - { - return read( 0, text.length ); - } - - public String read( int start ) - { - return read( start, text.length ); - } - - public String read( int start, int end ) - { - start = Math.max( start, 0 ); - end = Math.min( end, text.length ); - int textLength = Math.max( end - start, 0 ); - return new String( text, start, textLength ); - } - public void write( String text ) { - write( text, 0, text.length() ); + write( text, 0 ); } public void write( String text, int start ) - { - write( text, start, start + text.length() ); - } - - public void write( String text, int start, int end ) { int pos = start; start = Math.max( start, 0 ); - end = Math.min( end, pos + text.length() ); + int end = Math.min( start + text.length(), pos + text.length() ); end = Math.min( end, this.text.length ); for( int i = start; i < end; i++ ) { @@ -101,23 +44,10 @@ public class TextBuffer public void write( TextBuffer text ) { - write( text, 0, text.length() ); - } - - public void write( TextBuffer text, int start ) - { - write( text, start, start + text.length() ); - } - - public void write( TextBuffer text, int start, int end ) - { - int pos = start; - start = Math.max( start, 0 ); - end = Math.min( end, pos + text.length() ); - end = Math.min( end, this.text.length ); - for( int i = start; i < end; i++ ) + int end = Math.min( text.length(), this.text.length ); + for( int i = 0; i < end; i++ ) { - this.text[i] = text.charAt( i - pos ); + this.text[i] = text.charAt( i ); } } @@ -126,11 +56,6 @@ public class TextBuffer fill( c, 0, text.length ); } - public void fill( char c, int start ) - { - fill( c, start, text.length ); - } - public void fill( char c, int start, int end ) { start = Math.max( start, 0 ); @@ -141,52 +66,6 @@ public class TextBuffer } } - public void fill( String text ) - { - fill( text, 0, this.text.length ); - } - - public void fill( String text, int start ) - { - fill( text, start, this.text.length ); - } - - public void fill( String text, int start, int end ) - { - int pos = start; - start = Math.max( start, 0 ); - end = Math.min( end, this.text.length ); - - int textLength = text.length(); - for( int i = start; i < end; i++ ) - { - this.text[i] = text.charAt( (i - pos) % textLength ); - } - } - - public void fill( TextBuffer text ) - { - fill( text, 0, this.text.length ); - } - - public void fill( TextBuffer text, int start ) - { - fill( text, start, this.text.length ); - } - - public void fill( TextBuffer text, int start, int end ) - { - int pos = start; - start = Math.max( start, 0 ); - end = Math.min( end, this.text.length ); - - int textLength = text.length(); - for( int i = start; i < end; i++ ) - { - this.text[i] = text.charAt( (i - pos) % textLength ); - } - } - public char charAt( int i ) { return text[i]; diff --git a/src/test/java/dan200/computercraft/core/terminal/TextBufferTest.java b/src/test/java/dan200/computercraft/core/terminal/TextBufferTest.java new file mode 100644 index 000000000..286e62ad6 --- /dev/null +++ b/src/test/java/dan200/computercraft/core/terminal/TextBufferTest.java @@ -0,0 +1,150 @@ +/* + * This file is part of ComputerCraft - http://www.computercraft.info + * Copyright Daniel Ratcliffe, 2011-2021. Do not distribute without permission. + * Send enquiries to dratcliffe@gmail.com + */ +package dan200.computercraft.core.terminal; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class TextBufferTest +{ + @Test + void testStringConstructor() + { + TextBuffer textBuffer = new TextBuffer( "test" ); + assertEquals( "test", textBuffer.toString() ); + } + + @Test + void testCharRepetitionConstructor() + { + TextBuffer textBuffer = new TextBuffer( 'a', 5 ); + assertEquals( "aaaaa", textBuffer.toString() ); + } + + @Test + void testLength() + { + TextBuffer textBuffer = new TextBuffer( "test" ); + assertEquals( 4, textBuffer.length() ); + } + + @Test + void testWrite() + { + TextBuffer textBuffer = new TextBuffer( ' ', 4 ); + textBuffer.write( "test" ); + assertEquals( "test", textBuffer.toString() ); + } + + @Test + void testWriteTextBuffer() + { + TextBuffer source = new TextBuffer( "test" ); + TextBuffer target = new TextBuffer( " " ); + target.write( source ); + assertEquals( "test", target.toString() ); + } + + @Test + void testWriteFromPos() + { + TextBuffer textBuffer = new TextBuffer( "test" ); + textBuffer.write( "il", 1 ); + assertEquals( "tilt", textBuffer.toString() ); + } + + @Test + void testWriteOutOfBounds() + { + TextBuffer textBuffer = new TextBuffer( "test" ); + textBuffer.write( "abcdefghijklmnop", -5 ); + assertEquals( "fghi", textBuffer.toString() ); + } + + @Test + void testWriteOutOfBounds2() + { + TextBuffer textBuffer = new TextBuffer( " " ); + textBuffer.write( "Hello, world!", -3 ); + assertEquals( "lo, world! ", textBuffer.toString() ); + } + + @Test + void testFill() + { + TextBuffer textBuffer = new TextBuffer( "test" ); + textBuffer.fill( 'c' ); + assertEquals( "cccc", textBuffer.toString() ); + } + + @Test + void testFillSubstring() + { + TextBuffer textBuffer = new TextBuffer( "test" ); + textBuffer.fill( 'c', 1, 3 ); + assertEquals( "tcct", textBuffer.toString() ); + } + + @Test + void testFillOutOfBounds() + { + TextBuffer textBuffer = new TextBuffer( "test" ); + textBuffer.fill( 'c', -5, 5 ); + assertEquals( "cccc", textBuffer.toString() ); + } + + @Test + void testCharAt() + { + TextBuffer textBuffer = new TextBuffer( "test" ); + assertEquals( 'e', textBuffer.charAt( 1 ) ); + } + + @Test + void testSetChar() + { + TextBuffer textBuffer = new TextBuffer( "test" ); + textBuffer.setChar( 2, 'n' ); + assertEquals( "tent", textBuffer.toString() ); + } + + @Test + void testSetCharWithNegativeIndex() + { + TextBuffer textBuffer = new TextBuffer( "test" ); + textBuffer.setChar( -5, 'n' ); + assertEquals( "test", textBuffer.toString(), "Buffer should not change after setting char with negative index." ); + } + + @Test + void testSetCharWithIndexBeyondBufferEnd() + { + TextBuffer textBuffer = new TextBuffer( "test" ); + textBuffer.setChar( 10, 'n' ); + assertEquals( "test", textBuffer.toString(), "Buffer should not change after setting char beyond buffer end." ); + } + + @Test + void testMultipleOperations() + { + TextBuffer textBuffer = new TextBuffer( ' ', 5 ); + textBuffer.setChar( 0, 'H' ); + textBuffer.setChar( 1, 'e' ); + textBuffer.setChar( 2, 'l' ); + textBuffer.write( "lo", 3 ); + assertEquals( "Hello", textBuffer.toString(), "TextBuffer failed to persist over multiple operations." ); + } + + @Test + void testEmptyBuffer() + { + TextBuffer textBuffer = new TextBuffer( "" ); + // exception on writing to empty buffer would fail the test + textBuffer.write( "test" ); + assertEquals( "", textBuffer.toString() ); + } +}