mod common;

use std::sync::Arc;

use miden_assembly::DefaultSourceManager;
use miden_debug::TRACE_PRINT_LN;

#[test]
fn trace_println_logs_byte_addressed_strings() {
    common::init_test_debug_logger();
    let source_manager = Arc::new(DefaultSourceManager::default());

    for offset in 0..4 {
        let base_elem = 278528 + offset;
        let second_elem = base_elem + 1;
        let byte_addr = base_elem * 4;

        let source = format!(
            r#"
begin
    # Store 'h' 'e' 'l' 'l' as little-endian bytes packed into felt at element address {base_elem}
    # (after memory reserved for the Rust stack).
    push.1819043176
    push.{base_elem}
    mem_store

    # Store the trailing 'o' byte in the next felt.
    push.111
    push.{second_elem}
    mem_store

    # TRACE_PRINT_LN expects [address, string_length] on the stack, so push the byte length first
    # and the byte address last.
    push.5
    push.{byte_addr}
    trace.{TRACE_PRINT_LN}

    # Drop the address and string length passed to the TRACE_PRINT_LN event.
    drop
    drop
end
"#,
        );

        common::execute_trace(&source, source_manager.clone());
        assert_println!("hello");
        common::clear_logs();
    }
}
