public void Decode_WithInvalidTransactionType_ShouldThrow()
        {
            byte[] data;

            using (var stream = RawTransaction.Create(2, 0))
            {
                data = stream.ToArray();
            }

            var ex = Assert.Throws <TransactionFieldException>(
                () => this.subject.Decode(TestAddress.Regtest1, TestAddress.Regtest2, data)
                );

            Assert.Equal(TransactionFieldException.TypeField, ex.Field);
        }
        public void Decode_WithValidTransactionType_ShouldInvokePayloadDecode()
        {
            // Arrange.
            ExodusTransaction tx = new FakeExodusTransaction(null, null);

            byte[] data;

            using (var stream = RawTransaction.Create(1, ExodusTransaction.MaxVersion))
            {
                data = stream.ToArray();
            }

            this.encoder1.Decode(
                Arg.Any <BitcoinAddress>(),
                Arg.Any <BitcoinAddress>(),
                Arg.Any <BinaryReader>(),
                Arg.Any <int>()
                ).Returns(tx);

            // Act.
            var result = this.subject.Decode(TestAddress.Regtest1, TestAddress.Regtest2, data);

            // Assert.
            Assert.Same(tx, result);

            this.encoder0.Received(0).Decode(
                Arg.Any <BitcoinAddress>(),
                Arg.Any <BitcoinAddress>(),
                Arg.Any <BinaryReader>(),
                Arg.Any <int>()
                );

            this.encoder1.Received(1).Decode(
                TestAddress.Regtest1,
                TestAddress.Regtest2,
                Arg.Is <BinaryReader>(r => r != null),
                ExodusTransaction.MaxVersion
                );
        }