diff --git a/core/src/test/java/org/bitcoinj/script/ScriptBuilderTest.java b/core/src/test/java/org/bitcoinj/script/ScriptBuilderTest.java index 8be1faf1c..19e14abb8 100644 --- a/core/src/test/java/org/bitcoinj/script/ScriptBuilderTest.java +++ b/core/src/test/java/org/bitcoinj/script/ScriptBuilderTest.java @@ -19,6 +19,7 @@ package org.bitcoinj.script; import static org.bitcoinj.script.ScriptOpCodes.OP_FALSE; import static org.bitcoinj.script.ScriptOpCodes.OP_TRUE; import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import org.junit.Test; @@ -35,6 +36,77 @@ public class ScriptBuilderTest { } } + @Test + public void numberBuilderZero() { + // Test encoding of zero, which should result in an opcode + final ScriptBuilder builder = new ScriptBuilder(); + + // 0 should encode directly to 0 + builder.number(0); + assertArrayEquals(new byte[] { + 0x00 // Pushed data + }, builder.build().getProgram()); + } + + @Test + public void numberBuilderPositiveOpCode() { + final ScriptBuilder builder = new ScriptBuilder(); + + builder.number(5); + assertArrayEquals(new byte[] { + 0x55 // Pushed data + }, builder.build().getProgram()); + } + + @Test + public void numberBuilderBigNum() { + ScriptBuilder builder = new ScriptBuilder(); + // 21066 should take up three bytes including the length byte + // at the start + + builder.number(0x524a); + assertArrayEquals(new byte[] { + 0x02, // Length of the pushed data + 0x4a, 0x52 // Pushed data + }, builder.build().getProgram()); + + // Test the trimming code ignores zeroes in the middle + builder = new ScriptBuilder(); + builder.number(0x110011); + assertEquals(4, builder.build().getProgram().length); + + // Check encoding of a value where signed/unsigned encoding differs + // because the most significant byte is 0x80, and therefore a + // sign byte has to be added to the end for the signed encoding. + builder = new ScriptBuilder(); + builder.number(0x8000); + assertArrayEquals(new byte[] { + 0x03, // Length of the pushed data + 0x00, (byte) 0x80, 0x00 // Pushed data + }, builder.build().getProgram()); + } + + @Test + public void numberBuilderNegative() { + // Check encoding of a negative value + final ScriptBuilder builder = new ScriptBuilder(); + builder.number(-5); + assertArrayEquals(new byte[] { + 0x01, // Length of the pushed data + ((byte) 133) // Pushed data + }, builder.build().getProgram()); + } + + @Test + public void numberBuilder16() { + ScriptBuilder builder = new ScriptBuilder(); + // Numbers greater than 16 must be encoded with PUSHDATA + builder.number(15).number(16).number(17); + builder.number(0, 17).number(1, 16).number(2, 15); + Script script = builder.build(); + assertEquals("PUSHDATA(1)[11] 16 15 15 16 PUSHDATA(1)[11]", script.toString()); + } + @Test public void testOpTrue() { byte[] expected = new byte[] { OP_TRUE }; diff --git a/core/src/test/java/org/bitcoinj/script/ScriptTest.java b/core/src/test/java/org/bitcoinj/script/ScriptTest.java index 27c9739ee..7582fa4c9 100644 --- a/core/src/test/java/org/bitcoinj/script/ScriptTest.java +++ b/core/src/test/java/org/bitcoinj/script/ScriptTest.java @@ -454,75 +454,4 @@ public class ScriptTest { public void getToAddressNoPubKey() throws Exception { ScriptBuilder.createOutputScript(new ECKey()).getToAddress(PARAMS, false); } - - /** Test encoding of zero, which should result in an opcode */ - @Test - public void numberBuilderZero() { - final ScriptBuilder builder = new ScriptBuilder(); - - // 0 should encode directly to 0 - builder.number(0); - assertArrayEquals(new byte[] { - 0x00 // Pushed data - }, builder.build().getProgram()); - } - - @Test - public void numberBuilderPositiveOpCode() { - final ScriptBuilder builder = new ScriptBuilder(); - - builder.number(5); - assertArrayEquals(new byte[] { - 0x55 // Pushed data - }, builder.build().getProgram()); - } - - @Test - public void numberBuilderBigNum() { - ScriptBuilder builder = new ScriptBuilder(); - // 21066 should take up three bytes including the length byte - // at the start - - builder.number(0x524a); - assertArrayEquals(new byte[] { - 0x02, // Length of the pushed data - 0x4a, 0x52 // Pushed data - }, builder.build().getProgram()); - - // Test the trimming code ignores zeroes in the middle - builder = new ScriptBuilder(); - builder.number(0x110011); - assertEquals(4, builder.build().getProgram().length); - - // Check encoding of a value where signed/unsigned encoding differs - // because the most significant byte is 0x80, and therefore a - // sign byte has to be added to the end for the signed encoding. - builder = new ScriptBuilder(); - builder.number(0x8000); - assertArrayEquals(new byte[] { - 0x03, // Length of the pushed data - 0x00, (byte) 0x80, 0x00 // Pushed data - }, builder.build().getProgram()); - } - - @Test - public void numberBuilderNegative() { - // Check encoding of a negative value - final ScriptBuilder builder = new ScriptBuilder(); - builder.number(-5); - assertArrayEquals(new byte[] { - 0x01, // Length of the pushed data - ((byte) 133) // Pushed data - }, builder.build().getProgram()); - } - - @Test - public void numberBuilder16() { - ScriptBuilder builder = new ScriptBuilder(); - // Numbers greater than 16 must be encoded with PUSHDATA - builder.number(15).number(16).number(17); - builder.number(0, 17).number(1, 16).number(2, 15); - Script script = builder.build(); - assertEquals("PUSHDATA(1)[11] 16 15 15 16 PUSHDATA(1)[11]", script.toString()); - } }