2024-01-06 07:26:51 +00:00
|
|
|
use dust_lang::*;
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn empty() {
|
|
|
|
assert_eq!(interpret("x = 9"), Ok(Value::Option(None)));
|
|
|
|
assert_eq!(interpret("x = 1 + 1"), Ok(Value::Option(None)));
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn integer() {
|
|
|
|
assert_eq!(interpret("1"), Ok(Value::Integer(1)));
|
|
|
|
assert_eq!(interpret("123"), Ok(Value::Integer(123)));
|
|
|
|
assert_eq!(interpret("-666"), Ok(Value::Integer(-666)));
|
|
|
|
}
|
|
|
|
|
2024-01-30 04:57:13 +00:00
|
|
|
#[test]
|
|
|
|
fn integer_overflow() {
|
|
|
|
assert_eq!(
|
|
|
|
interpret("9223372036854775807 + 1"),
|
|
|
|
Ok(Value::Integer(i64::MIN))
|
|
|
|
);
|
|
|
|
assert_eq!(
|
|
|
|
interpret("-9223372036854775808 - 1"),
|
|
|
|
Ok(Value::Integer(i64::MAX))
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
2024-01-06 07:26:51 +00:00
|
|
|
#[test]
|
|
|
|
fn float() {
|
2024-01-30 04:57:13 +00:00
|
|
|
assert_eq!(
|
2024-01-31 17:10:32 +00:00
|
|
|
interpret("1.7976931348623157e308"),
|
2024-01-30 04:57:13 +00:00
|
|
|
Ok(Value::Float(f64::MAX))
|
|
|
|
);
|
|
|
|
assert_eq!(
|
2024-01-31 17:10:32 +00:00
|
|
|
interpret("-1.7976931348623157e308"),
|
2024-01-30 04:57:13 +00:00
|
|
|
Ok(Value::Float(f64::MIN))
|
|
|
|
);
|
2024-01-06 07:26:51 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn string() {
|
|
|
|
assert_eq!(interpret("\"one\""), Ok(Value::string("one".to_string())));
|
|
|
|
assert_eq!(interpret("'one'"), Ok(Value::string("one".to_string())));
|
|
|
|
assert_eq!(interpret("`one`"), Ok(Value::string("one".to_string())));
|
|
|
|
assert_eq!(interpret("`'one'`"), Ok(Value::string("'one'".to_string())));
|
|
|
|
assert_eq!(interpret("'`one`'"), Ok(Value::string("`one`".to_string())));
|
|
|
|
assert_eq!(
|
|
|
|
interpret("\"'one'\""),
|
|
|
|
Ok(Value::string("'one'".to_string()))
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn list() {
|
|
|
|
assert_eq!(
|
|
|
|
interpret("[1, 2, 'foobar']"),
|
|
|
|
Ok(Value::List(List::with_items(vec![
|
|
|
|
Value::Integer(1),
|
|
|
|
Value::Integer(2),
|
|
|
|
Value::string("foobar".to_string()),
|
|
|
|
])))
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
2024-01-29 22:36:21 +00:00
|
|
|
#[test]
|
|
|
|
fn empty_list() {
|
|
|
|
assert_eq!(interpret("[]"), Ok(Value::List(List::new())));
|
|
|
|
}
|
|
|
|
|
2024-01-06 07:26:51 +00:00
|
|
|
#[test]
|
|
|
|
fn map() {
|
2024-02-11 01:50:49 +00:00
|
|
|
let mut map = Map::new();
|
2024-01-06 07:26:51 +00:00
|
|
|
|
2024-02-11 01:50:49 +00:00
|
|
|
map.set("x".to_string(), Value::Integer(1));
|
|
|
|
map.set("foo".to_string(), Value::string("bar".to_string()));
|
2024-01-06 07:26:51 +00:00
|
|
|
|
|
|
|
assert_eq!(interpret("{ x = 1, foo = 'bar' }"), Ok(Value::Map(map)));
|
|
|
|
}
|
|
|
|
|
2024-01-29 22:36:21 +00:00
|
|
|
#[test]
|
|
|
|
fn empty_map() {
|
|
|
|
assert_eq!(interpret("{}"), Ok(Value::Map(Map::new())));
|
|
|
|
}
|
|
|
|
|
2024-01-06 07:26:51 +00:00
|
|
|
#[test]
|
|
|
|
fn map_types() {
|
2024-02-11 01:50:49 +00:00
|
|
|
let mut map = Map::new();
|
2024-01-06 07:26:51 +00:00
|
|
|
|
2024-02-11 01:50:49 +00:00
|
|
|
map.set("x".to_string(), Value::Integer(1));
|
|
|
|
map.set("foo".to_string(), Value::string("bar".to_string()));
|
2024-01-06 07:26:51 +00:00
|
|
|
|
|
|
|
assert_eq!(
|
|
|
|
interpret("{ x <int> = 1, foo <str> = 'bar' }"),
|
|
|
|
Ok(Value::Map(map))
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn map_type_errors() {
|
2024-02-01 00:35:27 +00:00
|
|
|
assert_eq!(
|
|
|
|
interpret("{ foo <bool> = 'bar' }"),
|
|
|
|
Err(Error::Validation(error::ValidationError::TypeCheck {
|
2024-01-06 07:26:51 +00:00
|
|
|
expected: Type::Boolean,
|
2024-02-01 00:35:27 +00:00
|
|
|
actual: Type::String,
|
|
|
|
position: SourcePosition {
|
|
|
|
start_byte: 0,
|
2024-02-01 02:21:42 +00:00
|
|
|
end_byte: 22,
|
|
|
|
start_row: 1,
|
2024-02-01 00:35:27 +00:00
|
|
|
start_column: 0,
|
2024-02-01 02:21:42 +00:00
|
|
|
end_row: 1,
|
|
|
|
end_column: 22
|
2024-02-01 00:35:27 +00:00
|
|
|
}
|
2024-01-06 07:26:51 +00:00
|
|
|
}))
|
2024-02-01 00:35:27 +00:00
|
|
|
);
|
2024-01-06 07:26:51 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn function() {
|
|
|
|
let result = interpret("() <int> { 1 }");
|
|
|
|
let value = result.unwrap();
|
|
|
|
let function = value.as_function().unwrap();
|
|
|
|
let function = if let Function::ContextDefined(function) = function {
|
|
|
|
function
|
|
|
|
} else {
|
|
|
|
panic!("Something is wrong with this test...");
|
|
|
|
};
|
|
|
|
|
|
|
|
assert_eq!(&Vec::<Identifier>::with_capacity(0), function.parameters());
|
|
|
|
assert_eq!(&Type::Integer, function.return_type());
|
|
|
|
|
|
|
|
let result = interpret("(x <bool>) <bool> { true }");
|
|
|
|
let value = result.unwrap();
|
|
|
|
let function = value.as_function().unwrap();
|
|
|
|
let function = if let Function::ContextDefined(function) = function {
|
|
|
|
function
|
|
|
|
} else {
|
|
|
|
panic!("Something is wrong with this test...");
|
|
|
|
};
|
|
|
|
|
|
|
|
assert_eq!(
|
|
|
|
&vec![Identifier::new("x".to_string())],
|
|
|
|
function.parameters()
|
|
|
|
);
|
|
|
|
assert_eq!(&Type::Boolean, function.return_type());
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn option() {
|
|
|
|
let result = interpret("x <option(int)> = some(1); x").unwrap();
|
|
|
|
|
|
|
|
assert_eq!(Value::Option(Some(Box::new(Value::Integer(1)))), result);
|
|
|
|
}
|
2024-01-25 01:11:34 +00:00
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn range() {
|
2024-01-29 22:36:21 +00:00
|
|
|
assert_eq!(interpret("0..100"), Ok(Value::range(0, 100)));
|
2024-01-25 01:11:34 +00:00
|
|
|
}
|