Tests for some external operations
This commit is contained in:
parent
eb7cc5fb4d
commit
da22bbf21c
@ -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());
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user