1
0
dust/dust-lang/tests/variables.rs

59 lines
1.5 KiB
Rust
Raw Normal View History

2024-03-07 04:21:07 +00:00
use dust_lang::{
2024-03-25 04:16:55 +00:00
abstract_tree::{Block, Expression, Statement, Type, WithPos},
2024-03-17 04:49:01 +00:00
error::{Error, TypeConflict, ValidationError},
2024-03-25 04:16:55 +00:00
identifier::Identifier,
2024-03-07 04:21:07 +00:00
*,
};
2024-03-06 23:15:25 +00:00
#[test]
fn set_and_get_variable() {
2024-03-08 17:24:11 +00:00
assert_eq!(
2024-03-24 19:35:19 +00:00
interpret("test", "foobar = true; foobar"),
2024-03-08 17:24:11 +00:00
Ok(Some(Value::boolean(true)))
);
2024-03-06 23:15:25 +00:00
}
2024-03-07 04:21:07 +00:00
#[test]
fn set_variable_with_type() {
assert_eq!(
2024-03-24 19:35:19 +00:00
interpret("test", "foobar: bool = true; foobar"),
2024-03-08 17:24:11 +00:00
Ok(Some(Value::boolean(true)))
2024-03-07 04:21:07 +00:00
);
}
#[test]
fn set_variable_with_type_error() {
assert_eq!(
2024-03-24 19:35:19 +00:00
interpret("test", "foobar: str = true")
2024-03-24 13:10:49 +00:00
.unwrap_err()
.errors(),
&vec![Error::Validation {
2024-03-17 11:31:45 +00:00
error: ValidationError::TypeCheck {
conflict: TypeConflict {
actual: Type::Boolean,
expected: Type::String
},
2024-03-17 17:36:31 +00:00
actual_position: (14, 18).into(),
2024-03-20 15:43:47 +00:00
expected_position: (8, 11).into()
2024-03-17 11:31:45 +00:00
},
2024-03-17 12:30:46 +00:00
position: (0, 18).into()
2024-03-24 13:10:49 +00:00
}]
2024-03-07 04:21:07 +00:00
);
}
2024-03-09 00:05:17 +00:00
#[test]
fn function_variable() {
assert_eq!(
interpret("test", "foobar = fn (x: int) int { x }; foobar"),
2024-03-09 00:05:17 +00:00
Ok(Some(Value::function(
2024-03-24 13:10:49 +00:00
Vec::with_capacity(0),
vec![(Identifier::new("x"), Type::Integer.with_position((16, 19)))],
Type::Integer.with_position((21, 24)),
2024-03-17 11:31:45 +00:00
Block::new(vec![Statement::Expression(Expression::Identifier(
Identifier::new("x").with_position((27, 28))
2024-03-25 04:16:55 +00:00
))])
.with_position((25, 30))
2024-03-09 00:05:17 +00:00
)))
);
}