@@ -4,6 +4,7 @@ mod test {
44 use compiler_lib:: modules:: lexer:: lex;
55 use compiler_lib:: modules:: parser:: Parser ;
66 use compiler_lib:: modules:: vm:: VM ;
7+ use compiler_lib:: modules:: vm:: types:: { SchedulerStatus , VmErr } ;
78
89 #[ derive( serde:: Deserialize ) ]
910 struct Case {
@@ -15,6 +16,25 @@ mod test {
1516 input : Vec < String > ,
1617 #[ serde( default ) ]
1718 events : Vec < String > ,
19+ // Events pushed one-at-a-time after each PendingEvent yield (host-resume path).
20+ #[ serde( default ) ]
21+ interactive_events : Vec < String > ,
22+ }
23+
24+ // Resume on each PendingEvent by pushing the next interactive_events entry.
25+ fn drive ( vm : & mut VM , interactive : & [ String ] ) -> Result < ( ) , VmErr > {
26+ let mut idx = 0 ;
27+ loop {
28+ match vm. run ( ) {
29+ Ok ( _) => return Ok ( ( ) ) ,
30+ Err ( VmErr :: HostYield ( SchedulerStatus :: PendingEvent ) ) => {
31+ if idx >= interactive. len ( ) { return Ok ( ( ) ) ; }
32+ vm. push_event ( & interactive[ idx] ) . expect ( "push_event" ) ;
33+ idx += 1 ;
34+ }
35+ Err ( e) => return Err ( e) ,
36+ }
37+ }
1838 }
1939
2040 #[ test]
@@ -34,7 +54,7 @@ mod test {
3454 let mut vm = VM :: new ( & chunk) ;
3555 vm. input_buffer = case. input . clone ( ) ;
3656 for evt in & case. events { vm. push_event ( evt) . expect ( "push_event" ) ; }
37- let result = vm . run ( ) ;
57+ let result = drive ( & mut vm , & case . interactive_events ) ;
3858
3959 match result {
4060 Ok ( _obj) => { assert_eq ! ( vm. output, case. output, "output mismatch on: {:?}" , case. src) ; }
@@ -46,8 +66,7 @@ mod test {
4666 }
4767 }
4868
49- /* Reruns every vm.json case in strict_input mode (host-supplied buffer; reading past = RuntimeError).
50- Lex/parse errors are also asserted here. */
69+ /* Reruns every vm.json case in strict_input mode (host-supplied buffer; reading past = RuntimeError). Lex/parse errors are also asserted here. */
5170 #[ test]
5271 fn strict_cases ( ) {
5372 let cases: Vec < Case > = serde_json:: from_str ( include_str ! ( "cases/vm.json" ) ) . expect ( "invalid JSON" ) ;
@@ -89,10 +108,9 @@ mod test {
89108 vm. strict_input = true ;
90109 vm. input_buffer = case. input . clone ( ) ;
91110 for evt in & case. events { vm. push_event ( evt) . expect ( "push_event" ) ; }
92- let expects_input_error = case. input . is_empty ( )
93- && ( case. src . contains ( "input(" ) || case. src . contains ( "input (" ) ) ;
111+ let expects_input_error = case. input . is_empty ( ) && ( case. src . contains ( "input(" ) || case. src . contains ( "input (" ) ) ;
94112
95- match vm . run ( ) {
113+ match drive ( & mut vm , & case . interactive_events ) {
96114 Ok ( _) => {
97115 assert ! ( !expects_input_error, "expected input() to error under strict mode for: {:?}" , case. src) ;
98116 assert_eq ! ( vm. output, case. output, "output mismatch on: {:?}" , case. src) ;
0 commit comments