Tests for some external operations

This commit is contained in:
Tomusdrw 2016-02-03 11:26:24 +01:00
parent eb7cc5fb4d
commit da22bbf21c
2 changed files with 38 additions and 12 deletions

View File

@ -766,6 +766,7 @@ fn test_badinstruction(factory: super::Factory) {
_ => assert!(false, "Expected bad instruction") _ => assert!(false, "Expected bad instruction")
} }
} }
evm_test!{test_pop: test_pop_jit, test_pop_int} evm_test!{test_pop: test_pop_jit, test_pop_int}
fn test_pop(factory: super::Factory) { fn test_pop(factory: super::Factory) {
let code = "60f060aa50600055".from_hex().unwrap(); let code = "60f060aa50600055".from_hex().unwrap();
@ -784,6 +785,31 @@ fn test_pop(factory: super::Factory) {
assert_eq!(gas_left, U256::from(79_989)); assert_eq!(gas_left, U256::from(79_989));
} }
evm_test!{test_extops: test_extops_jit, test_extops_int}
fn test_extops(factory: super::Factory) {
let code = "5a6001555836553a600255386003553460045560016001526016590454600555".from_hex().unwrap();
let mut params = ActionParams::default();
params.gas = U256::from(150_000);
params.gas_price = U256::from(0x32);
params.value = ActionValue::Transfer(U256::from(0x99));
params.code = Some(code);
let mut ext = FakeExt::new();
let gas_left = {
let vm = factory.create();
vm.exec(params, &mut ext).unwrap()
};
assert_store(&ext, 0, "0000000000000000000000000000000000000000000000000000000000000004"); // PC / CALLDATASIZE
assert_store(&ext, 1, "00000000000000000000000000000000000000000000000000000000000249ee"); // GAS
assert_store(&ext, 2, "0000000000000000000000000000000000000000000000000000000000000032"); // GASPRICE
assert_store(&ext, 3, "0000000000000000000000000000000000000000000000000000000000000020"); // CODESIZE
assert_store(&ext, 4, "0000000000000000000000000000000000000000000000000000000000000099"); // CALLVALUE
assert_store(&ext, 5, "0000000000000000000000000000000000000000000000000000000000000032");
assert_eq!(gas_left, U256::from(29_898));
}
fn assert_store(ext: &FakeExt, pos: u64, val: &str) { fn assert_store(ext: &FakeExt, pos: u64, val: &str) {
assert_eq!(ext.store.get(&H256::from(pos)).unwrap(), &H256::from_str(val).unwrap()); assert_eq!(ext.store.get(&H256::from(pos)).unwrap(), &H256::from_str(val).unwrap());
} }

View File

@ -60,20 +60,20 @@ macro_rules! panic_on_overflow {
} }
} }
/// TODO [Gav Wood] Please document me /// Generic Uint of unspecified size
pub trait Uint: Sized + Default + FromStr + From<u64> + FromJson + fmt::Debug + fmt::Display + PartialOrd + Ord + PartialEq + Eq + Hash { pub trait Uint: Sized + Default + FromStr + From<u64> + FromJson + fmt::Debug + fmt::Display + PartialOrd + Ord + PartialEq + Eq + Hash {
/// Size of this type. /// Size of this type.
const SIZE: usize; const SIZE: usize;
/// TODO [Gav Wood] Please document me /// Returns `Uint(0)`
fn zero() -> Self; fn zero() -> Self;
/// TODO [Gav Wood] Please document me /// Returns `Uint(1)`
fn one() -> Self; fn one() -> Self;
/// TODO [Gav Wood] Please document me /// Error returned when `from_dec_str` method fails
type FromDecStrErr; type FromDecStrErr;
/// TODO [Gav Wood] Please document me /// Create `Uint` from specified decimal represented by string
fn from_dec_str(value: &str) -> Result<Self, Self::FromDecStrErr>; fn from_dec_str(value: &str) -> Result<Self, Self::FromDecStrErr>;
/// Conversion to u32 /// Conversion to u32
@ -105,25 +105,25 @@ pub trait Uint: Sized + Default + FromStr + From<u64> + FromJson + fmt::Debug +
fn overflowing_pow(self, other: Self) -> (Self, bool); fn overflowing_pow(self, other: Self) -> (Self, bool);
/// TODO [debris] Please document me /// Add this `Uint` to other returning result and possible overflow
fn overflowing_add(self, other: Self) -> (Self, bool); fn overflowing_add(self, other: Self) -> (Self, bool);
/// TODO [debris] Please document me /// Subtract another `Uint` from this returning result and possible overflow
fn overflowing_sub(self, other: Self) -> (Self, bool); fn overflowing_sub(self, other: Self) -> (Self, bool);
/// TODO [debris] Please document me /// Multiple this `Uint` with other returning result and possible overflow
fn overflowing_mul(self, other: Self) -> (Self, bool); fn overflowing_mul(self, other: Self) -> (Self, bool);
/// TODO [debris] Please document me /// Divide this `Uint` by other returning result and possible overflow
fn overflowing_div(self, other: Self) -> (Self, bool); fn overflowing_div(self, other: Self) -> (Self, bool);
/// TODO [debris] Please document me /// Returns reminder of division of this `Uint` by other and possible overflow
fn overflowing_rem(self, other: Self) -> (Self, bool); fn overflowing_rem(self, other: Self) -> (Self, bool);
/// TODO [debris] Please document me /// Returns negation of this `Uint` and overflow (always true)
fn overflowing_neg(self) -> (Self, bool); fn overflowing_neg(self) -> (Self, bool);
/// TODO [Gav Wood] Please document me /// Shifts this `Uint` and returns overflow
fn overflowing_shl(self, shift: u32) -> (Self, bool); fn overflowing_shl(self, shift: u32) -> (Self, bool);
} }