Skip to content

Commit f0190d7

Browse files
committed
tests for ReadRef instruction
1 parent ca491ed commit f0190d7

File tree

1 file changed

+54
-0
lines changed
  • crates/move-bytecode-verifier/src/type_safety_tests

1 file changed

+54
-0
lines changed

crates/move-bytecode-verifier/src/type_safety_tests/mod.rs

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1068,3 +1068,57 @@ fn test_freeze_ref_no_arg() {
10681068
let fun_context = get_fun_context(&module);
10691069
let _result = type_safety::verify(&module, &fun_context, &mut DummyMeter);
10701070
}
1071+
1072+
1073+
#[test]
1074+
fn test_read_ref_correct_type() {
1075+
for instr in vec![
1076+
Bytecode::ImmBorrowLoc(0),
1077+
Bytecode::MutBorrowLoc(0),
1078+
] {
1079+
let code = vec![instr, Bytecode::ReadRef];
1080+
let module = make_module_with_local(code, SignatureToken::U64);
1081+
let fun_context = get_fun_context(&module);
1082+
let result = type_safety::verify(&module, &fun_context, &mut DummyMeter);
1083+
assert!(result.is_ok());
1084+
}
1085+
}
1086+
1087+
#[test]
1088+
fn test_read_ref_wrong_type() {
1089+
let code = vec![Bytecode::LdU64(42), Bytecode::ReadRef];
1090+
let module = make_module_with_local(code, SignatureToken::U64);
1091+
let fun_context = get_fun_context(&module);
1092+
let result = type_safety::verify(&module, &fun_context, &mut DummyMeter);
1093+
assert_eq!(
1094+
result.unwrap_err().major_status(),
1095+
StatusCode::READREF_TYPE_MISMATCH_ERROR
1096+
);
1097+
}
1098+
1099+
#[test]
1100+
fn test_read_ref_no_copy() {
1101+
for instr in vec![
1102+
Bytecode::ImmBorrowLoc(0),
1103+
Bytecode::MutBorrowLoc(0),
1104+
] {
1105+
let code = vec![instr, Bytecode::ReadRef];
1106+
let mut module = make_module_with_local(code, SignatureToken::Struct(StructHandleIndex(0)));
1107+
add_simple_struct_with_abilities(&mut module, AbilitySet::EMPTY);
1108+
let fun_context = get_fun_context(&module);
1109+
let result = type_safety::verify(&module, &fun_context, &mut DummyMeter);
1110+
assert_eq!(
1111+
result.unwrap_err().major_status(),
1112+
StatusCode::READREF_WITHOUT_COPY_ABILITY
1113+
);
1114+
}
1115+
}
1116+
1117+
#[test]
1118+
#[should_panic]
1119+
fn test_read_ref_no_arg() {
1120+
let code = vec![Bytecode::ReadRef];
1121+
let module = make_module_with_local(code, SignatureToken::U64);
1122+
let fun_context = get_fun_context(&module);
1123+
let _result = type_safety::verify(&module, &fun_context, &mut DummyMeter);
1124+
}

0 commit comments

Comments
 (0)