Feat: lots of things, preparing for live gig

This commit is contained in:
2026-02-15 11:23:11 +01:00
parent cfaadd9d33
commit 160546d64d
59 changed files with 1414 additions and 96 deletions

View File

@@ -29,14 +29,14 @@ fn when_with_arithmetic() {
#[test]
fn when_with_every() {
// iter=0, every 2 should be true
// iter=0, every 2 executes quotation
let ctx = ctx_with(|c| c.iter = 0);
let f = run_ctx("{ 100 } 2 every ?", &ctx);
let f = run_ctx("{ 100 } 2 every", &ctx);
assert_eq!(stack_int(&f), 100);
// iter=1, every 2 should be false
// iter=1, every 2 skips quotation
let ctx = ctx_with(|c| c.iter = 1);
let f = run_ctx("50 { 100 } 2 every ?", &ctx);
let f = run_ctx("50 { 100 } 2 every", &ctx);
assert_eq!(stack_int(&f), 50); // quotation not executed
}
@@ -104,13 +104,12 @@ fn unexpected_close_error() {
#[test]
fn every_with_quotation_integration() {
// Simulating: { 2 distort } 2 every ?
// On even iterations, distort is applied
// { 2 distort } 2 every — on even iterations, distort is applied
for iter in 0..4 {
let ctx = ctx_with(|c| c.iter = iter);
let f = forth();
let outputs = f
.evaluate(r#""kick" s { 2 distort } 2 every ? ."#, &ctx)
.evaluate(r#""kick" s { 2 distort } 2 every ."#, &ctx)
.unwrap();
if iter % 2 == 0 {
assert!(
@@ -128,6 +127,18 @@ fn every_with_quotation_integration() {
}
}
// bjork with sound
#[test]
fn bjork_with_sound() {
let ctx = ctx_with(|c| c.runs = 2); // position 2 is a hit for (3,8)
let f = forth();
let outputs = f
.evaluate(r#""kick" s { 2 distort } 3 8 bjork ."#, &ctx)
.unwrap();
assert!(outputs[0].contains("distort/2"));
}
// Unless (!?) tests
#[test]
@@ -142,28 +153,15 @@ fn unless_true_skips() {
assert_eq!(stack_int(&f), 99);
}
#[test]
fn unless_with_every() {
// iter=0, every 2 is true, so unless skips
let ctx = ctx_with(|c| c.iter = 0);
let f = run_ctx("50 { 100 } 2 every !?", &ctx);
assert_eq!(stack_int(&f), 50);
// iter=1, every 2 is false, so unless executes
let ctx = ctx_with(|c| c.iter = 1);
let f = run_ctx("{ 100 } 2 every !?", &ctx);
assert_eq!(stack_int(&f), 100);
}
#[test]
fn when_and_unless_complementary() {
// Using both ? and !? for if-else like behavior
// Using iter mod + ?/!? for if-else behavior (every no longer pushes bool)
for iter in 0..4 {
let ctx = ctx_with(|c| c.iter = iter);
let f = forth();
let outputs = f
.evaluate(
r#""kick" s { 2 distort } 2 every ? { 4 distort } 2 every !? ."#,
r#""kick" s { 2 distort } iter 2 mod 0 = ? { 4 distort } iter 2 mod 0 = !? ."#,
&ctx,
)
.unwrap();