Pull out codegen tests into a separate module
This commit is contained in:
@@ -303,370 +303,3 @@ impl<W: Write> Emit<W> for Expression {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn null_emit() {
|
||||
let null = Expression::Null;
|
||||
let mut res = String::new();
|
||||
null.emit(&mut res).unwrap();
|
||||
assert_eq!(res, "null")
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn undefined_emit() {
|
||||
let undefined = Expression::Undefined;
|
||||
let mut res = String::new();
|
||||
undefined.emit(&mut res).unwrap();
|
||||
assert_eq!(res, "undefined")
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn true_emit() {
|
||||
let true_ = Expression::Bool(true);
|
||||
let mut res = String::new();
|
||||
true_.emit(&mut res).unwrap();
|
||||
assert_eq!(res, "true")
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn false_emit() {
|
||||
let false_ = Expression::Bool(false);
|
||||
let mut res = String::new();
|
||||
false_.emit(&mut res).unwrap();
|
||||
assert_eq!(res, "false")
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn number_emit() {
|
||||
let one = Expression::Number(1.0);
|
||||
let mut res = String::new();
|
||||
one.emit(&mut res).unwrap();
|
||||
assert_eq!(res, "1")
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn negative_number_emit() {
|
||||
let maybe_one = Expression::Number(-1.5);
|
||||
let mut res = String::new();
|
||||
maybe_one.emit(&mut res).unwrap();
|
||||
assert_eq!(res, "-1.5")
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn string_emit() {
|
||||
let string = Expression::String("test".to_owned());
|
||||
let mut res = String::new();
|
||||
string.emit(&mut res).unwrap();
|
||||
assert_eq!(res, "\"test\"")
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn reference_emit() {
|
||||
let string = Expression::Reference("x".to_owned());
|
||||
let mut res = String::new();
|
||||
string.emit(&mut res).unwrap();
|
||||
assert_eq!(res, "x")
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn empty_array_emit() {
|
||||
let array = Expression::Array(Vec::new());
|
||||
let mut res = String::new();
|
||||
array.emit(&mut res).unwrap();
|
||||
assert_eq!(res, "[]")
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn one_elem_array_emit() {
|
||||
let array = Expression::Array(vec![Expression::Null]);
|
||||
let mut res = String::new();
|
||||
array.emit(&mut res).unwrap();
|
||||
assert_eq!(res, "[null]")
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn two_elems_array_emit() {
|
||||
let array = Expression::Array(vec![Expression::Null, Expression::Undefined]);
|
||||
let mut res = String::new();
|
||||
array.emit(&mut res).unwrap();
|
||||
assert_eq!(res, "[null, undefined]")
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn empty_object_emit() {
|
||||
let object = Expression::Object(Vec::new());
|
||||
let mut res = String::new();
|
||||
object.emit(&mut res).unwrap();
|
||||
assert_eq!(res, "{}")
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn one_elem_object_emit() {
|
||||
let object = Expression::Object(vec![("x".to_owned(), Expression::Null)]);
|
||||
let mut res = String::new();
|
||||
object.emit(&mut res).unwrap();
|
||||
assert_eq!(res, "{\"x\": null}")
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn two_elems_object_emit() {
|
||||
let object = Expression::Object(vec![
|
||||
("x".to_owned(), Expression::Null),
|
||||
("y as z".to_owned(), Expression::Undefined),
|
||||
]);
|
||||
let mut res = String::new();
|
||||
object.emit(&mut res).unwrap();
|
||||
assert_eq!(res, "{\"x\": null, \"y as z\": undefined}")
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn unary_plus_emit() {
|
||||
let unary = Expression::Unary("+".to_owned(), Box::new(Expression::Null));
|
||||
let mut res = String::new();
|
||||
unary.emit(&mut res).unwrap();
|
||||
assert_eq!(res, "(+ null)")
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn unary_plus_plus_emit() {
|
||||
let unary = Expression::Unary("++".to_owned(), Box::new(Expression::Null));
|
||||
let mut res = String::new();
|
||||
unary.emit(&mut res).unwrap();
|
||||
assert_eq!(res, "(null ++)")
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn binary_plus_emit() {
|
||||
let binary = Expression::Binary(
|
||||
"+".to_owned(),
|
||||
Box::new(Expression::Null),
|
||||
Box::new(Expression::Undefined),
|
||||
);
|
||||
let mut res = String::new();
|
||||
binary.emit(&mut res).unwrap();
|
||||
assert_eq!(res, "(null + undefined)")
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn ternary_emit() {
|
||||
let ternary = Expression::Ternary(
|
||||
Box::new(Expression::Bool(true)),
|
||||
Box::new(Expression::Null),
|
||||
Box::new(Expression::Undefined),
|
||||
);
|
||||
let mut res = String::new();
|
||||
ternary.emit(&mut res).unwrap();
|
||||
assert_eq!(res, "(true ? null : undefined)")
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn empty_lambda_emit() {
|
||||
let lambda = Expression::Lambda {
|
||||
args: Vec::new(),
|
||||
body: Vec::new(),
|
||||
is_async: false,
|
||||
};
|
||||
let mut res = String::new();
|
||||
lambda.emit(&mut res).unwrap();
|
||||
assert_eq!(res, "() => {}")
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn empty_async_lambda_emit() {
|
||||
let lambda = Expression::Lambda {
|
||||
args: Vec::new(),
|
||||
body: Vec::new(),
|
||||
is_async: true,
|
||||
};
|
||||
let mut res = String::new();
|
||||
lambda.emit(&mut res).unwrap();
|
||||
assert_eq!(res, "async () => {}")
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn id_lambda_emit() {
|
||||
let lambda = Expression::Lambda {
|
||||
args: vec!["x".to_owned()],
|
||||
body: vec![Statement::Expression(Expression::Reference("x".to_owned()))],
|
||||
is_async: false,
|
||||
};
|
||||
let mut res = String::new();
|
||||
lambda.emit(&mut res).unwrap();
|
||||
assert_eq!(res, "(x) => {x}")
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn return_emit() {
|
||||
let ret = Statement::Return(Expression::Null);
|
||||
let mut res = String::new();
|
||||
ret.emit(&mut res).unwrap();
|
||||
assert_eq!(res, "return null")
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn let_declaration_emit() {
|
||||
let decl = Statement::Declaration {
|
||||
is_const: false,
|
||||
is_exported: false,
|
||||
name: "x".to_owned(),
|
||||
initial: None,
|
||||
};
|
||||
let mut res = String::new();
|
||||
decl.emit(&mut res).unwrap();
|
||||
assert_eq!(res, "let x")
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn export_declaration_emit() {
|
||||
let decl = Statement::Declaration {
|
||||
is_const: false,
|
||||
is_exported: true,
|
||||
name: "x".to_owned(),
|
||||
initial: None,
|
||||
};
|
||||
let mut res = String::new();
|
||||
decl.emit(&mut res).unwrap();
|
||||
assert_eq!(res, "export let x")
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn const_declaration_emit() {
|
||||
let decl = Statement::Declaration {
|
||||
is_const: true,
|
||||
is_exported: false,
|
||||
name: "x".to_owned(),
|
||||
initial: Some(Expression::Null),
|
||||
};
|
||||
let mut res = String::new();
|
||||
decl.emit(&mut res).unwrap();
|
||||
assert_eq!(res, "const x = null")
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn throw_emit() {
|
||||
let throw = Statement::Throw(Expression::Null);
|
||||
let mut res = String::new();
|
||||
throw.emit(&mut res).unwrap();
|
||||
assert_eq!(res, "throw null")
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn empty_try_emit() {
|
||||
let try_ = Statement::Try {
|
||||
body: Vec::new(),
|
||||
catch_: None,
|
||||
finally: None,
|
||||
};
|
||||
let mut res = String::new();
|
||||
try_.emit(&mut res).unwrap();
|
||||
assert_eq!(res, "try {}")
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn try_emit() {
|
||||
let try_ = Statement::Try {
|
||||
body: vec![Statement::Expression(Expression::Null)],
|
||||
catch_: Some((
|
||||
"e".to_owned(),
|
||||
vec![Statement::Expression(Expression::Undefined)],
|
||||
)),
|
||||
finally: Some(vec![Statement::Expression(Expression::Null)]),
|
||||
};
|
||||
let mut res = String::new();
|
||||
try_.emit(&mut res).unwrap();
|
||||
assert_eq!(res, "try {null} catch (e) {undefined} finally {null}")
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn empty_for_emit() {
|
||||
let for_ = Statement::For {
|
||||
init: None,
|
||||
condition: None,
|
||||
update: None,
|
||||
body: Vec::new(),
|
||||
};
|
||||
let mut res = String::new();
|
||||
for_.emit(&mut res).unwrap();
|
||||
assert_eq!(res, "for (; ; ) {}")
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn for_emit() {
|
||||
let for_ = Statement::For {
|
||||
init: Some(Expression::Null),
|
||||
condition: Some(Expression::Bool(true)),
|
||||
update: Some(Expression::Null),
|
||||
body: vec![Statement::Expression(Expression::Null)],
|
||||
};
|
||||
let mut res = String::new();
|
||||
for_.emit(&mut res).unwrap();
|
||||
assert_eq!(res, "for (null; true; null) {null}")
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn empty_while_emit() {
|
||||
let while_ = Statement::While {
|
||||
condition: Expression::Bool(true),
|
||||
body: Vec::new(),
|
||||
};
|
||||
let mut res = String::new();
|
||||
while_.emit(&mut res).unwrap();
|
||||
assert_eq!(res, "while (true) {}")
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn while_emit() {
|
||||
let while_ = Statement::While {
|
||||
condition: Expression::Bool(true),
|
||||
body: vec![Statement::Expression(Expression::Null)],
|
||||
};
|
||||
let mut res = String::new();
|
||||
while_.emit(&mut res).unwrap();
|
||||
assert_eq!(res, "while (true) {null}")
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn empty_if_emit() {
|
||||
let if_ = Statement::If {
|
||||
condition: Expression::Bool(true),
|
||||
then_: Vec::new(),
|
||||
else_: None,
|
||||
};
|
||||
let mut res = String::new();
|
||||
if_.emit(&mut res).unwrap();
|
||||
assert_eq!(res, "if (true) {}")
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn if_emit() {
|
||||
let if_ = Statement::If {
|
||||
condition: Expression::Bool(true),
|
||||
then_: vec![Statement::Expression(Expression::Null)],
|
||||
else_: Some(vec![Statement::Expression(Expression::Undefined)]),
|
||||
};
|
||||
let mut res = String::new();
|
||||
if_.emit(&mut res).unwrap();
|
||||
assert_eq!(res, "if (true) {null} else {undefined}")
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn empty_import_emit() {
|
||||
let import = Statement::Import {
|
||||
names: Vec::new(),
|
||||
from: "x".to_owned(),
|
||||
};
|
||||
let mut res = String::new();
|
||||
import.emit(&mut res).unwrap();
|
||||
assert_eq!(res, "import {} from x;")
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn import_emit() {
|
||||
let import = Statement::Import {
|
||||
names: vec!["x".to_owned(), "y".to_owned()],
|
||||
from: "z".to_owned(),
|
||||
};
|
||||
let mut res = String::new();
|
||||
import.emit(&mut res).unwrap();
|
||||
assert_eq!(res, "import {x, y} from z;")
|
||||
}
|
||||
|
||||
@@ -0,0 +1,368 @@
|
||||
use crate::codegen::{Emit, Expression, Statement};
|
||||
|
||||
#[test]
|
||||
fn null_emit() {
|
||||
let null = Expression::Null;
|
||||
let mut res = String::new();
|
||||
null.emit(&mut res).unwrap();
|
||||
assert_eq!(res, "null")
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn undefined_emit() {
|
||||
let undefined = Expression::Undefined;
|
||||
let mut res = String::new();
|
||||
undefined.emit(&mut res).unwrap();
|
||||
assert_eq!(res, "undefined")
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn true_emit() {
|
||||
let true_ = Expression::Bool(true);
|
||||
let mut res = String::new();
|
||||
true_.emit(&mut res).unwrap();
|
||||
assert_eq!(res, "true")
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn false_emit() {
|
||||
let false_ = Expression::Bool(false);
|
||||
let mut res = String::new();
|
||||
false_.emit(&mut res).unwrap();
|
||||
assert_eq!(res, "false")
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn number_emit() {
|
||||
let one = Expression::Number(1.0);
|
||||
let mut res = String::new();
|
||||
one.emit(&mut res).unwrap();
|
||||
assert_eq!(res, "1")
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn negative_number_emit() {
|
||||
let maybe_one = Expression::Number(-1.5);
|
||||
let mut res = String::new();
|
||||
maybe_one.emit(&mut res).unwrap();
|
||||
assert_eq!(res, "-1.5")
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn string_emit() {
|
||||
let string = Expression::String("test".to_owned());
|
||||
let mut res = String::new();
|
||||
string.emit(&mut res).unwrap();
|
||||
assert_eq!(res, "\"test\"")
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn reference_emit() {
|
||||
let string = Expression::Reference("x".to_owned());
|
||||
let mut res = String::new();
|
||||
string.emit(&mut res).unwrap();
|
||||
assert_eq!(res, "x")
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn empty_array_emit() {
|
||||
let array = Expression::Array(Vec::new());
|
||||
let mut res = String::new();
|
||||
array.emit(&mut res).unwrap();
|
||||
assert_eq!(res, "[]")
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn one_elem_array_emit() {
|
||||
let array = Expression::Array(vec![Expression::Null]);
|
||||
let mut res = String::new();
|
||||
array.emit(&mut res).unwrap();
|
||||
assert_eq!(res, "[null]")
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn two_elems_array_emit() {
|
||||
let array = Expression::Array(vec![Expression::Null, Expression::Undefined]);
|
||||
let mut res = String::new();
|
||||
array.emit(&mut res).unwrap();
|
||||
assert_eq!(res, "[null, undefined]")
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn empty_object_emit() {
|
||||
let object = Expression::Object(Vec::new());
|
||||
let mut res = String::new();
|
||||
object.emit(&mut res).unwrap();
|
||||
assert_eq!(res, "{}")
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn one_elem_object_emit() {
|
||||
let object = Expression::Object(vec![("x".to_owned(), Expression::Null)]);
|
||||
let mut res = String::new();
|
||||
object.emit(&mut res).unwrap();
|
||||
assert_eq!(res, "{\"x\": null}")
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn two_elems_object_emit() {
|
||||
let object = Expression::Object(vec![
|
||||
("x".to_owned(), Expression::Null),
|
||||
("y as z".to_owned(), Expression::Undefined),
|
||||
]);
|
||||
let mut res = String::new();
|
||||
object.emit(&mut res).unwrap();
|
||||
assert_eq!(res, "{\"x\": null, \"y as z\": undefined}")
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn unary_plus_emit() {
|
||||
let unary = Expression::Unary("+".to_owned(), Box::new(Expression::Null));
|
||||
let mut res = String::new();
|
||||
unary.emit(&mut res).unwrap();
|
||||
assert_eq!(res, "(+ null)")
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn unary_plus_plus_emit() {
|
||||
let unary = Expression::Unary("++".to_owned(), Box::new(Expression::Null));
|
||||
let mut res = String::new();
|
||||
unary.emit(&mut res).unwrap();
|
||||
assert_eq!(res, "(null ++)")
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn binary_plus_emit() {
|
||||
let binary = Expression::Binary(
|
||||
"+".to_owned(),
|
||||
Box::new(Expression::Null),
|
||||
Box::new(Expression::Undefined),
|
||||
);
|
||||
let mut res = String::new();
|
||||
binary.emit(&mut res).unwrap();
|
||||
assert_eq!(res, "(null + undefined)")
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn ternary_emit() {
|
||||
let ternary = Expression::Ternary(
|
||||
Box::new(Expression::Bool(true)),
|
||||
Box::new(Expression::Null),
|
||||
Box::new(Expression::Undefined),
|
||||
);
|
||||
let mut res = String::new();
|
||||
ternary.emit(&mut res).unwrap();
|
||||
assert_eq!(res, "(true ? null : undefined)")
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn empty_lambda_emit() {
|
||||
let lambda = Expression::Lambda {
|
||||
args: Vec::new(),
|
||||
body: Vec::new(),
|
||||
is_async: false,
|
||||
};
|
||||
let mut res = String::new();
|
||||
lambda.emit(&mut res).unwrap();
|
||||
assert_eq!(res, "() => {}")
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn empty_async_lambda_emit() {
|
||||
let lambda = Expression::Lambda {
|
||||
args: Vec::new(),
|
||||
body: Vec::new(),
|
||||
is_async: true,
|
||||
};
|
||||
let mut res = String::new();
|
||||
lambda.emit(&mut res).unwrap();
|
||||
assert_eq!(res, "async () => {}")
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn id_lambda_emit() {
|
||||
let lambda = Expression::Lambda {
|
||||
args: vec!["x".to_owned()],
|
||||
body: vec![Statement::Expression(Expression::Reference("x".to_owned()))],
|
||||
is_async: false,
|
||||
};
|
||||
let mut res = String::new();
|
||||
lambda.emit(&mut res).unwrap();
|
||||
assert_eq!(res, "(x) => {x}")
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn return_emit() {
|
||||
let ret = Statement::Return(Expression::Null);
|
||||
let mut res = String::new();
|
||||
ret.emit(&mut res).unwrap();
|
||||
assert_eq!(res, "return null")
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn let_declaration_emit() {
|
||||
let decl = Statement::Declaration {
|
||||
is_const: false,
|
||||
is_exported: false,
|
||||
name: "x".to_owned(),
|
||||
initial: None,
|
||||
};
|
||||
let mut res = String::new();
|
||||
decl.emit(&mut res).unwrap();
|
||||
assert_eq!(res, "let x")
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn export_declaration_emit() {
|
||||
let decl = Statement::Declaration {
|
||||
is_const: false,
|
||||
is_exported: true,
|
||||
name: "x".to_owned(),
|
||||
initial: None,
|
||||
};
|
||||
let mut res = String::new();
|
||||
decl.emit(&mut res).unwrap();
|
||||
assert_eq!(res, "export let x")
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn const_declaration_emit() {
|
||||
let decl = Statement::Declaration {
|
||||
is_const: true,
|
||||
is_exported: false,
|
||||
name: "x".to_owned(),
|
||||
initial: Some(Expression::Null),
|
||||
};
|
||||
let mut res = String::new();
|
||||
decl.emit(&mut res).unwrap();
|
||||
assert_eq!(res, "const x = null")
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn throw_emit() {
|
||||
let throw = Statement::Throw(Expression::Null);
|
||||
let mut res = String::new();
|
||||
throw.emit(&mut res).unwrap();
|
||||
assert_eq!(res, "throw null")
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn empty_try_emit() {
|
||||
let try_ = Statement::Try {
|
||||
body: Vec::new(),
|
||||
catch_: None,
|
||||
finally: None,
|
||||
};
|
||||
let mut res = String::new();
|
||||
try_.emit(&mut res).unwrap();
|
||||
assert_eq!(res, "try {}")
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn try_emit() {
|
||||
let try_ = Statement::Try {
|
||||
body: vec![Statement::Expression(Expression::Null)],
|
||||
catch_: Some((
|
||||
"e".to_owned(),
|
||||
vec![Statement::Expression(Expression::Undefined)],
|
||||
)),
|
||||
finally: Some(vec![Statement::Expression(Expression::Null)]),
|
||||
};
|
||||
let mut res = String::new();
|
||||
try_.emit(&mut res).unwrap();
|
||||
assert_eq!(res, "try {null} catch (e) {undefined} finally {null}")
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn empty_for_emit() {
|
||||
let for_ = Statement::For {
|
||||
init: None,
|
||||
condition: None,
|
||||
update: None,
|
||||
body: Vec::new(),
|
||||
};
|
||||
let mut res = String::new();
|
||||
for_.emit(&mut res).unwrap();
|
||||
assert_eq!(res, "for (; ; ) {}")
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn for_emit() {
|
||||
let for_ = Statement::For {
|
||||
init: Some(Expression::Null),
|
||||
condition: Some(Expression::Bool(true)),
|
||||
update: Some(Expression::Null),
|
||||
body: vec![Statement::Expression(Expression::Null)],
|
||||
};
|
||||
let mut res = String::new();
|
||||
for_.emit(&mut res).unwrap();
|
||||
assert_eq!(res, "for (null; true; null) {null}")
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn empty_while_emit() {
|
||||
let while_ = Statement::While {
|
||||
condition: Expression::Bool(true),
|
||||
body: Vec::new(),
|
||||
};
|
||||
let mut res = String::new();
|
||||
while_.emit(&mut res).unwrap();
|
||||
assert_eq!(res, "while (true) {}")
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn while_emit() {
|
||||
let while_ = Statement::While {
|
||||
condition: Expression::Bool(true),
|
||||
body: vec![Statement::Expression(Expression::Null)],
|
||||
};
|
||||
let mut res = String::new();
|
||||
while_.emit(&mut res).unwrap();
|
||||
assert_eq!(res, "while (true) {null}")
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn empty_if_emit() {
|
||||
let if_ = Statement::If {
|
||||
condition: Expression::Bool(true),
|
||||
then_: Vec::new(),
|
||||
else_: None,
|
||||
};
|
||||
let mut res = String::new();
|
||||
if_.emit(&mut res).unwrap();
|
||||
assert_eq!(res, "if (true) {}")
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn if_emit() {
|
||||
let if_ = Statement::If {
|
||||
condition: Expression::Bool(true),
|
||||
then_: vec![Statement::Expression(Expression::Null)],
|
||||
else_: Some(vec![Statement::Expression(Expression::Undefined)]),
|
||||
};
|
||||
let mut res = String::new();
|
||||
if_.emit(&mut res).unwrap();
|
||||
assert_eq!(res, "if (true) {null} else {undefined}")
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn empty_import_emit() {
|
||||
let import = Statement::Import {
|
||||
names: Vec::new(),
|
||||
from: "x".to_owned(),
|
||||
};
|
||||
let mut res = String::new();
|
||||
import.emit(&mut res).unwrap();
|
||||
assert_eq!(res, "import {} from x;")
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn import_emit() {
|
||||
let import = Statement::Import {
|
||||
names: vec!["x".to_owned(), "y".to_owned()],
|
||||
from: "z".to_owned(),
|
||||
};
|
||||
let mut res = String::new();
|
||||
import.emit(&mut res).unwrap();
|
||||
assert_eq!(res, "import {x, y} from z;")
|
||||
}
|
||||
@@ -1 +1,4 @@
|
||||
pub mod codegen;
|
||||
|
||||
#[cfg(test)]
|
||||
mod codegen_tests;
|
||||
|
||||
Reference in New Issue
Block a user