Skip to content

Commit 5794b86

Browse files
committed
tests for MutBorrowLoc operation
1 parent e8d3ed9 commit 5794b86

File tree

1 file changed

+71
-1
lines changed
  • crates/move-bytecode-verifier/src/type_safety_tests

1 file changed

+71
-1
lines changed

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

Lines changed: 71 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ fn add_simple_struct(module: &mut CompiledModule) {
121121
abilities: AbilitySet::EMPTY,
122122
type_parameters: vec![],
123123
};
124-
124+
125125
module.struct_defs.push(struct_def);
126126
module.struct_handles.push(struct_handle);
127127

@@ -1333,3 +1333,73 @@ fn test_imm_borrow_field_no_arg() {
13331333
let _result = type_safety::verify(&module, &fun_context, &mut DummyMeter);
13341334
}
13351335

1336+
1337+
#[test]
1338+
fn test_mut_borrow_field_correct_type() {
1339+
let code = vec![Bytecode::MutBorrowLoc(0), Bytecode::MutBorrowField(FieldHandleIndex(0))];
1340+
let mut module = make_module_with_local(code, SignatureToken::Struct(StructHandleIndex(0)));
1341+
add_simple_struct(&mut module);
1342+
let fun_context = get_fun_context(&module);
1343+
let result = type_safety::verify(&module, &fun_context, &mut DummyMeter);
1344+
assert!(result.is_ok());
1345+
}
1346+
1347+
#[test]
1348+
fn test_mut_borrow_field_wrong_type() {
1349+
let code = vec![Bytecode::LdTrue, Bytecode::MutBorrowField(FieldHandleIndex(0))];
1350+
let mut module = make_module_with_local(code, SignatureToken::Struct(StructHandleIndex(0)));
1351+
add_simple_struct(&mut module);
1352+
let fun_context = get_fun_context(&module);
1353+
let result = type_safety::verify(&module, &fun_context, &mut DummyMeter);
1354+
assert_eq!(
1355+
result.unwrap_err().major_status(),
1356+
StatusCode::BORROWFIELD_TYPE_MISMATCH_ERROR
1357+
);
1358+
1359+
let code = vec![Bytecode::ImmBorrowLoc(0), Bytecode::MutBorrowField(FieldHandleIndex(0))];
1360+
let mut module = make_module_with_local(code, SignatureToken::Struct(StructHandleIndex(0)));
1361+
add_simple_struct(&mut module);
1362+
let fun_context = get_fun_context(&module);
1363+
let result = type_safety::verify(&module, &fun_context, &mut DummyMeter);
1364+
assert_eq!(
1365+
result.unwrap_err().major_status(),
1366+
StatusCode::BORROWFIELD_TYPE_MISMATCH_ERROR
1367+
);
1368+
1369+
}
1370+
1371+
#[test]
1372+
fn test_mut_borrow_field_mismatched_types() {
1373+
let code = vec![Bytecode::MutBorrowLoc(0), Bytecode::MutBorrowField(FieldHandleIndex(0))];
1374+
let mut module = make_module_with_local(code, SignatureToken::U64);
1375+
add_simple_struct(&mut module);
1376+
let fun_context = get_fun_context(&module);
1377+
let result = type_safety::verify(&module, &fun_context, &mut DummyMeter);
1378+
assert_eq!(
1379+
result.unwrap_err().major_status(),
1380+
StatusCode::BORROWFIELD_TYPE_MISMATCH_ERROR
1381+
);
1382+
}
1383+
1384+
#[test]
1385+
fn test_mut_borrow_field_bad_field() {
1386+
let code = vec![Bytecode::MutBorrowLoc(0), Bytecode::MutBorrowField(FieldHandleIndex(0))];
1387+
let mut module = make_module_with_local(code, SignatureToken::Struct(StructHandleIndex(0)));
1388+
add_native_struct(&mut module);
1389+
let fun_context = get_fun_context(&module);
1390+
let result = type_safety::verify(&module, &fun_context, &mut DummyMeter);
1391+
assert_eq!(
1392+
result.unwrap_err().major_status(),
1393+
StatusCode::BORROWFIELD_BAD_FIELD_ERROR
1394+
);
1395+
}
1396+
1397+
#[test]
1398+
#[should_panic]
1399+
fn test_mut_borrow_field_no_arg() {
1400+
let code = vec![Bytecode::MutBorrowField(FieldHandleIndex(0))];
1401+
let mut module = make_module_with_local(code, SignatureToken::Struct(StructHandleIndex(0)));
1402+
add_simple_struct(&mut module);
1403+
let fun_context = get_fun_context(&module);
1404+
let _result = type_safety::verify(&module, &fun_context, &mut DummyMeter);
1405+
}

0 commit comments

Comments
 (0)