145 lines
2.8 KiB
Rust
145 lines
2.8 KiB
Rust
use super::harness::*;
|
|
use cagire::forth::Value;
|
|
|
|
fn int(n: i64) -> Value {
|
|
Value::Int(n, None)
|
|
}
|
|
|
|
#[test]
|
|
fn range_ascending() {
|
|
expect_stack("1 4 ..", &[int(1), int(2), int(3), int(4)]);
|
|
}
|
|
|
|
#[test]
|
|
fn range_descending() {
|
|
expect_stack("4 1 ..", &[int(4), int(3), int(2), int(1)]);
|
|
}
|
|
|
|
#[test]
|
|
fn range_single() {
|
|
expect_stack("3 3 ..", &[int(3)]);
|
|
}
|
|
|
|
#[test]
|
|
fn range_negative() {
|
|
expect_stack("-2 1 ..", &[int(-2), int(-1), int(0), int(1)]);
|
|
}
|
|
|
|
#[test]
|
|
fn range_underflow() {
|
|
expect_error("1 ..", "stack underflow");
|
|
expect_error("..", "stack underflow");
|
|
}
|
|
|
|
#[test]
|
|
fn gen_basic() {
|
|
expect_stack("( 42 ) 3 gen", &[int(42), int(42), int(42)]);
|
|
}
|
|
|
|
#[test]
|
|
fn gen_with_computation() {
|
|
// Each iteration: dup current value, add 1, result is new value
|
|
// 0 → dup(0,0) 1+(0,1) → pop 1, stack [0]
|
|
// 0 → dup(0,0) 1+(0,1) → pop 1, stack [0]
|
|
// So we get [0, 1, 1, 1] - the 0 stays, we collect three 1s
|
|
expect_stack("0 ( dup 1 + ) 3 gen", &[int(0), int(1), int(1), int(1)]);
|
|
}
|
|
|
|
#[test]
|
|
fn gen_chained() {
|
|
// Start with 1, each iteration: dup, multiply by 2
|
|
// 1 → dup(1,1) 2*(1,2) → pop 2, stack [1]
|
|
// 1 → dup(1,1) 2*(1,2) → pop 2, stack [1]
|
|
expect_stack("1 ( dup 2 * ) 3 gen", &[int(1), int(2), int(2), int(2)]);
|
|
}
|
|
|
|
#[test]
|
|
fn gen_zero() {
|
|
expect_stack("( 1 ) 0 gen", &[]);
|
|
}
|
|
|
|
#[test]
|
|
fn gen_underflow() {
|
|
expect_error("3 gen", "stack underflow");
|
|
}
|
|
|
|
#[test]
|
|
fn gen_not_a_number() {
|
|
expect_error("( 1 ) gen", "expected number");
|
|
}
|
|
|
|
#[test]
|
|
fn gen_negative() {
|
|
expect_error("( 1 ) -1 gen", "gen count must be >= 0");
|
|
}
|
|
|
|
#[test]
|
|
fn gen_empty_quot_error() {
|
|
expect_error("( ) 3 gen", "quotation must produce");
|
|
}
|
|
|
|
#[test]
|
|
fn geom_growing() {
|
|
expect_stack("1 2 4 geom..", &[int(1), int(2), int(4), int(8)]);
|
|
}
|
|
|
|
#[test]
|
|
fn geom_shrinking() {
|
|
expect_stack("8 0.5 4 geom..", &[int(8), int(4), int(2), int(1)]);
|
|
}
|
|
|
|
#[test]
|
|
fn geom_single() {
|
|
expect_stack("5 2 1 geom..", &[int(5)]);
|
|
}
|
|
|
|
#[test]
|
|
fn geom_zero_count() {
|
|
expect_stack("1 2 0 geom..", &[]);
|
|
}
|
|
|
|
#[test]
|
|
fn geom_underflow() {
|
|
expect_error("1 2 geom..", "stack underflow");
|
|
}
|
|
|
|
#[test]
|
|
fn step_range_ascending() {
|
|
expect_stack("0 1 0.25 .,", &[
|
|
int(0),
|
|
Value::Float(0.25, None),
|
|
Value::Float(0.5, None),
|
|
Value::Float(0.75, None),
|
|
int(1),
|
|
]);
|
|
}
|
|
|
|
#[test]
|
|
fn step_range_descending() {
|
|
expect_stack("1 0 -0.5 .,", &[
|
|
int(1),
|
|
Value::Float(0.5, None),
|
|
int(0),
|
|
]);
|
|
}
|
|
|
|
#[test]
|
|
fn step_range_integer_step() {
|
|
expect_stack("0 6 2 .,", &[int(0), int(2), int(4), int(6)]);
|
|
}
|
|
|
|
#[test]
|
|
fn step_range_single() {
|
|
expect_stack("5 5 1 .,", &[int(5)]);
|
|
}
|
|
|
|
#[test]
|
|
fn step_range_zero_step_error() {
|
|
expect_error("0 10 0 .,", "step cannot be zero");
|
|
}
|
|
|
|
#[test]
|
|
fn step_range_underflow() {
|
|
expect_error("0 1 .,", "stack underflow");
|
|
}
|