net-plugin: modularize constants (consts.rs) and sockets (sockets.rs); remove legacy commented socket code; fix unused imports mir: move instruction unit tests to tests/mir_instruction_unit.rs (file lean-up); no semantic changes runner/pyvm: ensure using pre-strip; misc docs updates Build: cargo build ok; legacy cfg warnings remain as before
156 lines
4.5 KiB
Rust
156 lines
4.5 KiB
Rust
use nyash_rust::mir::{
|
|
BinaryOp, ConstValue, Effect, EffectMask, MirInstruction, ValueId,
|
|
};
|
|
|
|
#[test]
|
|
fn test_const_instruction() {
|
|
let dst = ValueId::new(0);
|
|
let inst = MirInstruction::Const {
|
|
dst,
|
|
value: ConstValue::Integer(42),
|
|
};
|
|
assert_eq!(inst.dst_value(), Some(dst));
|
|
assert!(inst.used_values().is_empty());
|
|
assert!(inst.effects().is_pure());
|
|
}
|
|
|
|
#[test]
|
|
fn test_binop_instruction() {
|
|
let dst = ValueId::new(0);
|
|
let lhs = ValueId::new(1);
|
|
let rhs = ValueId::new(2);
|
|
let inst = MirInstruction::BinOp {
|
|
dst,
|
|
op: BinaryOp::Add,
|
|
lhs,
|
|
rhs,
|
|
};
|
|
assert_eq!(inst.dst_value(), Some(dst));
|
|
assert_eq!(inst.used_values(), vec![lhs, rhs]);
|
|
assert!(inst.effects().is_pure());
|
|
}
|
|
|
|
#[test]
|
|
fn test_call_instruction() {
|
|
let dst = ValueId::new(0);
|
|
let func = ValueId::new(1);
|
|
let arg1 = ValueId::new(2);
|
|
let arg2 = ValueId::new(3);
|
|
let inst = MirInstruction::Call {
|
|
dst: Some(dst),
|
|
func,
|
|
args: vec![arg1, arg2],
|
|
effects: EffectMask::IO,
|
|
};
|
|
assert_eq!(inst.dst_value(), Some(dst));
|
|
assert_eq!(inst.used_values(), vec![func, arg1, arg2]);
|
|
assert_eq!(inst.effects(), EffectMask::IO);
|
|
}
|
|
|
|
#[test]
|
|
fn test_ref_new_instruction() {
|
|
let dst = ValueId::new(0);
|
|
let box_val = ValueId::new(1);
|
|
let inst = MirInstruction::RefNew { dst, box_val };
|
|
assert_eq!(inst.dst_value(), Some(dst));
|
|
assert_eq!(inst.used_values(), vec![box_val]);
|
|
assert!(inst.effects().is_pure());
|
|
}
|
|
|
|
#[test]
|
|
fn test_ref_get_instruction() {
|
|
let dst = ValueId::new(0);
|
|
let reference = ValueId::new(1);
|
|
let field = "name".to_string();
|
|
let inst = MirInstruction::RefGet {
|
|
dst,
|
|
reference,
|
|
field,
|
|
};
|
|
assert_eq!(inst.dst_value(), Some(dst));
|
|
assert_eq!(inst.used_values(), vec![reference]);
|
|
assert!(!inst.effects().is_pure());
|
|
assert!(inst.effects().contains(Effect::ReadHeap));
|
|
}
|
|
|
|
#[test]
|
|
fn test_ref_set_instruction() {
|
|
let reference = ValueId::new(0);
|
|
let field = "value".to_string();
|
|
let value = ValueId::new(1);
|
|
let inst = MirInstruction::RefSet {
|
|
reference,
|
|
field,
|
|
value,
|
|
};
|
|
assert_eq!(inst.dst_value(), None);
|
|
assert_eq!(inst.used_values(), vec![reference, value]);
|
|
assert!(!inst.effects().is_pure());
|
|
assert!(inst.effects().contains(Effect::WriteHeap));
|
|
}
|
|
|
|
#[test]
|
|
fn test_weak_new_instruction() {
|
|
let dst = ValueId::new(0);
|
|
let box_val = ValueId::new(1);
|
|
let inst = MirInstruction::WeakNew { dst, box_val };
|
|
assert_eq!(inst.dst_value(), Some(dst));
|
|
assert_eq!(inst.used_values(), vec![box_val]);
|
|
assert!(inst.effects().is_pure());
|
|
}
|
|
|
|
#[test]
|
|
fn test_weak_load_instruction() {
|
|
let dst = ValueId::new(0);
|
|
let weak_ref = ValueId::new(1);
|
|
let inst = MirInstruction::WeakLoad { dst, weak_ref };
|
|
assert_eq!(inst.dst_value(), Some(dst));
|
|
assert_eq!(inst.used_values(), vec![weak_ref]);
|
|
assert!(!inst.effects().is_pure());
|
|
assert!(inst.effects().contains(Effect::ReadHeap));
|
|
}
|
|
|
|
#[test]
|
|
fn test_barrier_instructions() {
|
|
let ptr = ValueId::new(0);
|
|
let read_barrier = MirInstruction::BarrierRead { ptr };
|
|
assert_eq!(read_barrier.dst_value(), None);
|
|
assert_eq!(read_barrier.used_values(), vec![ptr]);
|
|
assert!(read_barrier.effects().contains(Effect::Barrier));
|
|
assert!(read_barrier.effects().contains(Effect::ReadHeap));
|
|
|
|
let write_barrier = MirInstruction::BarrierWrite { ptr };
|
|
assert_eq!(write_barrier.dst_value(), None);
|
|
assert_eq!(write_barrier.used_values(), vec![ptr]);
|
|
assert!(write_barrier.effects().contains(Effect::Barrier));
|
|
assert!(write_barrier.effects().contains(Effect::WriteHeap));
|
|
}
|
|
|
|
#[test]
|
|
fn test_extern_call_instruction() {
|
|
let dst = ValueId::new(0);
|
|
let arg1 = ValueId::new(1);
|
|
let arg2 = ValueId::new(2);
|
|
let inst = MirInstruction::ExternCall {
|
|
dst: Some(dst),
|
|
iface_name: "env.console".to_string(),
|
|
method_name: "log".to_string(),
|
|
args: vec![arg1, arg2],
|
|
effects: EffectMask::IO,
|
|
};
|
|
assert_eq!(inst.dst_value(), Some(dst));
|
|
assert_eq!(inst.used_values(), vec![arg1, arg2]);
|
|
assert_eq!(inst.effects(), EffectMask::IO);
|
|
|
|
let void_inst = MirInstruction::ExternCall {
|
|
dst: None,
|
|
iface_name: "env.canvas".to_string(),
|
|
method_name: "fillRect".to_string(),
|
|
args: vec![arg1],
|
|
effects: EffectMask::IO,
|
|
};
|
|
assert_eq!(void_inst.dst_value(), None);
|
|
assert_eq!(void_inst.used_values(), vec![arg1]);
|
|
}
|
|
|