(golden: &Path, generated: &mut W)
| 507 | /// for checking this condition. |
| 508 | #[allow(clippy::write_with_newline)] |
| 509 | async fn regenerate<W: Write>(golden: &Path, generated: &mut W) -> io::Result<()> { |
| 510 | let tests = read_sources(golden)?; |
| 511 | |
| 512 | let mut first = true; |
| 513 | for test in tests { |
| 514 | if !first { |
| 515 | write!(generated, "\n")?; |
| 516 | } |
| 517 | write!(generated, "# Test: {}\n", test.name)?; |
| 518 | first = false; |
| 519 | let labels = labels_for(&test); |
| 520 | |
| 521 | let console = Rc::from(RefCell::from(String::new())); |
| 522 | let mut upcalls_by_name: HashMap<SymbolKey, Rc<dyn Callable>> = HashMap::default(); |
| 523 | callables::register_all(&mut upcalls_by_name, console.clone()); |
| 524 | let mut compiler = Compiler::new(&upcalls_by_name, &[]).expect("Cannot fail"); |
| 525 | let mut image = Image::default(); |
| 526 | let mut vm = Vm::new_with_limits( |
| 527 | upcalls_by_name.clone(), |
| 528 | Limits { max_call_stack: 4096, max_heap_entries: U24::from(128) }, |
| 529 | ); |
| 530 | |
| 531 | for source in test.sources { |
| 532 | write!(generated, "\n{}\n\n", labels.source)?; |
| 533 | write!(generated, "```basic\n")?; |
| 534 | if !source.is_empty() { |
| 535 | write!(generated, "{}\n", source)?; |
| 536 | } |
| 537 | write!(generated, "```\n")?; |
| 538 | |
| 539 | if let Err(e) = compiler.compile_more(&mut image, &mut source.as_bytes()) { |
| 540 | write!(generated, "\n{}\n\n", labels.compiler_errors)?; |
| 541 | write!(generated, "```plain\n")?; |
| 542 | write!(generated, "{}\n", e)?; |
| 543 | write!(generated, "```\n")?; |
| 544 | continue; |
| 545 | } |
| 546 | |
| 547 | write!(generated, "\n{}\n\n", labels.disassembly)?; |
| 548 | write!(generated, "```asm\n")?; |
| 549 | for line in image.disasm() { |
| 550 | write!(generated, "{}\n", line)?; |
| 551 | } |
| 552 | write!(generated, "```\n")?; |
| 553 | |
| 554 | console.borrow_mut().clear(); |
| 555 | match run_image(&mut vm, &image).await { |
| 556 | Ok(0) => (), |
| 557 | Ok(i) => { |
| 558 | write!(generated, "\n{}\n\n", labels.exit_code)?; |
| 559 | write!(generated, "```plain\n")?; |
| 560 | write!(generated, "{}\n", i)?; |
| 561 | write!(generated, "```\n")?; |
| 562 | } |
| 563 | Err(e) => { |
| 564 | write!(generated, "\n{}\n\n", labels.runtime_errors)?; |
| 565 | write!(generated, "```plain\n")?; |
| 566 | write!(generated, "{}\n", e)?; |
no test coverage detected