Add assertion errors; Write tests
This commit is contained in:
parent
ef57a42eb6
commit
109091cf80
11
src/error.rs
11
src/error.rs
@ -14,6 +14,15 @@ pub type Result<T> = std::result::Result<T, Error>;
|
|||||||
#[derive(Debug, Clone, PartialEq)]
|
#[derive(Debug, Clone, PartialEq)]
|
||||||
#[non_exhaustive]
|
#[non_exhaustive]
|
||||||
pub enum Error {
|
pub enum Error {
|
||||||
|
/// The 'assert' macro did not resolve successfully.
|
||||||
|
AssertEqualFailed {
|
||||||
|
expected: Value,
|
||||||
|
actual: Value,
|
||||||
|
},
|
||||||
|
|
||||||
|
/// The 'assert' macro did not resolve successfully.
|
||||||
|
AssertFailed,
|
||||||
|
|
||||||
/// A row was inserted to a table with the wrong amount of values.
|
/// A row was inserted to a table with the wrong amount of values.
|
||||||
WrongColumnAmount {
|
WrongColumnAmount {
|
||||||
expected: usize,
|
expected: usize,
|
||||||
@ -454,6 +463,8 @@ impl fmt::Display for Error {
|
|||||||
use Error::*;
|
use Error::*;
|
||||||
|
|
||||||
match self {
|
match self {
|
||||||
|
AssertEqualFailed {expected, actual } => write!(f, "Equality assertion failed. {expected} does not equal {actual}."),
|
||||||
|
AssertFailed => write!(f, "Assertion failed. A false value was passed to \"assert\"."),
|
||||||
ExpectedOperatorArgumentAmount { expected, actual } => write!(
|
ExpectedOperatorArgumentAmount { expected, actual } => write!(
|
||||||
f,
|
f,
|
||||||
"An operator expected {} arguments, but got {}.",
|
"An operator expected {} arguments, but got {}.",
|
||||||
|
@ -66,7 +66,7 @@ impl Macro for BarGraph {
|
|||||||
height = Some(float);
|
height = Some(float);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Value::Integer(integer) => {}
|
Value::Integer(_integer) => {}
|
||||||
Value::String(string) => name = Some(string),
|
Value::String(string) => name = Some(string),
|
||||||
Value::Boolean(_)
|
Value::Boolean(_)
|
||||||
| Value::List(_)
|
| Value::List(_)
|
||||||
|
@ -1,5 +1,55 @@
|
|||||||
use crate::{Error, Macro, MacroInfo, Result, Value, ValueType};
|
use crate::{Error, Macro, MacroInfo, Result, Value, ValueType};
|
||||||
|
|
||||||
|
|
||||||
|
pub struct Assert;
|
||||||
|
|
||||||
|
impl Macro for Assert {
|
||||||
|
fn info(&self) -> MacroInfo<'static> {
|
||||||
|
MacroInfo {
|
||||||
|
identifier: "assert",
|
||||||
|
description: "Panic if a boolean is false.",
|
||||||
|
group: "test",
|
||||||
|
inputs: vec![],
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn run(&self, argument: &Value) -> Result<Value> {
|
||||||
|
let boolean = argument.as_boolean()?;
|
||||||
|
|
||||||
|
if boolean {
|
||||||
|
Ok(Value::Empty)
|
||||||
|
} else {
|
||||||
|
Err(Error::AssertFailed)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct AssertEqual;
|
||||||
|
|
||||||
|
impl Macro for AssertEqual {
|
||||||
|
fn info(&self) -> MacroInfo<'static> {
|
||||||
|
MacroInfo {
|
||||||
|
identifier: "assert_equal",
|
||||||
|
description: "Panic if two values do not match.",
|
||||||
|
group: "test",
|
||||||
|
inputs: vec![],
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn run(&self, argument: &Value) -> Result<Value> {
|
||||||
|
let arguments = argument.as_fixed_len_list(2)?;
|
||||||
|
|
||||||
|
if arguments[0] == arguments[1] {
|
||||||
|
Ok(Value::Empty)
|
||||||
|
|
||||||
|
} else {
|
||||||
|
Err(Error::AssertEqualFailed { expected: arguments[0].clone(), actual: arguments[1].clone() })
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub struct If;
|
pub struct If;
|
||||||
|
|
||||||
impl Macro for If {
|
impl Macro for If {
|
||||||
|
@ -34,7 +34,6 @@ pub mod network;
|
|||||||
pub mod package_management;
|
pub mod package_management;
|
||||||
pub mod random;
|
pub mod random;
|
||||||
pub mod system;
|
pub mod system;
|
||||||
pub mod test;
|
|
||||||
pub mod time;
|
pub mod time;
|
||||||
|
|
||||||
/// Master list of all macros.
|
/// Master list of all macros.
|
||||||
@ -94,8 +93,8 @@ pub const MACRO_LIST: [&'static dyn Macro; 56] = [
|
|||||||
&random::RandomInteger,
|
&random::RandomInteger,
|
||||||
&random::RandomString,
|
&random::RandomString,
|
||||||
&system::CpuSpeed,
|
&system::CpuSpeed,
|
||||||
&test::Assert,
|
&logic::Assert,
|
||||||
&test::AssertEqual,
|
&logic::AssertEqual,
|
||||||
&time::Local,
|
&time::Local,
|
||||||
&time::Now,
|
&time::Now,
|
||||||
];
|
];
|
||||||
|
@ -1,42 +0,0 @@
|
|||||||
use crate::{Macro, MacroInfo, Result, Value};
|
|
||||||
|
|
||||||
pub struct Assert;
|
|
||||||
|
|
||||||
impl Macro for Assert {
|
|
||||||
fn info(&self) -> MacroInfo<'static> {
|
|
||||||
MacroInfo {
|
|
||||||
identifier: "assert",
|
|
||||||
description: "Panic if a boolean is false.",
|
|
||||||
group: "test",
|
|
||||||
inputs: vec![],
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn run(&self, argument: &Value) -> Result<Value> {
|
|
||||||
let boolean = argument.as_boolean()?;
|
|
||||||
|
|
||||||
assert!(boolean);
|
|
||||||
|
|
||||||
Ok(Value::Empty)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub struct AssertEqual;
|
|
||||||
|
|
||||||
impl Macro for AssertEqual {
|
|
||||||
fn info(&self) -> MacroInfo<'static> {
|
|
||||||
MacroInfo {
|
|
||||||
identifier: "assert_equal",
|
|
||||||
description: "Panic if two values do not match.",
|
|
||||||
group: "test",
|
|
||||||
inputs: vec![],
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn run(&self, argument: &Value) -> Result<Value> {
|
|
||||||
let arguments = argument.as_fixed_len_list(2)?;
|
|
||||||
assert_eq!(arguments[0], arguments[1]);
|
|
||||||
|
|
||||||
Ok(Value::Empty)
|
|
||||||
}
|
|
||||||
}
|
|
28
tests/logic.rs
Normal file
28
tests/logic.rs
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
use whale_lib::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn assert() {
|
||||||
|
eval("assert(true)").unwrap();
|
||||||
|
eval("assert(false)").unwrap_err();
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn assert_equal() {
|
||||||
|
eval("assert_eq(true, true)").unwrap();
|
||||||
|
eval("assert_eq(true, false)").unwrap_err();
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn r#if() {
|
||||||
|
eval("if(true, assert(true))").unwrap();
|
||||||
|
|
||||||
|
let value = eval("if(true, 1)").unwrap();
|
||||||
|
|
||||||
|
assert!(value.is_empty());
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn r#if_else() {
|
||||||
|
eval("if(true, assert(true), assert(false))").unwrap();
|
||||||
|
eval("if(false, assert(false), assert(true))").unwrap();
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user