WIP commit:
* Fix up project structures * combine vars and funcs table * make a place for old code that may be useful to reference * singleton pattern for sym table Commentary: When this change is finally finished I promise to use feature branches from here on out
This commit is contained in:
parent
b680e3ca9a
commit
ca4c557d95
32 changed files with 1092 additions and 616 deletions
|
|
@ -3,10 +3,10 @@ mod lex_tests {
|
|||
|
||||
#[test]
|
||||
fn test_lex_basic_pair() {
|
||||
let document: &str = "(hello 'world')";
|
||||
match lex(document) {
|
||||
let document = String::from("(hello 'world')");
|
||||
match lex(&document) {
|
||||
Ok(tree) => {
|
||||
assert_eq!(tree, document);
|
||||
assert_eq!(tree.to_string(), document);
|
||||
}
|
||||
Err(s) => {
|
||||
print!("{}\n", s);
|
||||
|
|
@ -17,10 +17,10 @@ mod lex_tests {
|
|||
|
||||
#[test]
|
||||
fn test_lex_basic_list() {
|
||||
let document: &str = "(hello 'world' 1 2 3)";
|
||||
match lex(document) {
|
||||
let document = String::from("(hello 'world' 1 2 3)");
|
||||
match lex(&document) {
|
||||
Ok(tree) => {
|
||||
assert_eq!(tree, document);
|
||||
assert_eq!(tree.to_string(), document);
|
||||
}
|
||||
Err(s) => {
|
||||
print!("{}\n", s);
|
||||
|
|
@ -31,10 +31,10 @@ mod lex_tests {
|
|||
|
||||
#[test]
|
||||
fn test_lex_complex_list() {
|
||||
let document: &str = "(hello 'world' (1 2 (1 2 3)) 1 2 3)";
|
||||
match lex(document) {
|
||||
let document = String::from("(hello 'world' (1 2 (1 2 3)) 1 2 3)");
|
||||
match lex(&document) {
|
||||
Ok(tree) => {
|
||||
assert_eq!(tree, document);
|
||||
assert_eq!(tree.to_string(), document);
|
||||
}
|
||||
Err(s) => {
|
||||
print!("{}\n", s);
|
||||
|
|
@ -45,11 +45,11 @@ mod lex_tests {
|
|||
|
||||
#[test]
|
||||
fn test_bad_symbol() {
|
||||
let document: &str = "(as;dd)";
|
||||
let document = String::from("(as;dd)");
|
||||
let output: &str = "Problem lexing document: \"Unparsable token: as;dd\"";
|
||||
match lex(document) {
|
||||
match lex(&document) {
|
||||
Ok(tree) => {
|
||||
print!("Bad token yielded: {}\n", tree);
|
||||
print!("Bad token yielded: {}\n", tree.to_string());
|
||||
assert!(false);
|
||||
}
|
||||
Err(s) => {
|
||||
|
|
@ -60,10 +60,10 @@ mod lex_tests {
|
|||
|
||||
#[test]
|
||||
fn test_list_delim_in_str() {
|
||||
let document: &str = "('(')";
|
||||
match lex(document) {
|
||||
let document = String::from("('(')");
|
||||
match lex(&document) {
|
||||
Ok(tree) => {
|
||||
assert_eq!(tree, document);
|
||||
assert_eq!(tree.to_string(), document);
|
||||
}
|
||||
Err(s) => {
|
||||
print!("{}\n", s);
|
||||
|
|
@ -74,10 +74,10 @@ mod lex_tests {
|
|||
|
||||
#[test]
|
||||
fn test_empty_string() {
|
||||
let document: &str = "('')";
|
||||
match lex(document) {
|
||||
let document = String::from("('')");
|
||||
match lex(&document) {
|
||||
Ok(tree) => {
|
||||
assert_eq!(tree, document);
|
||||
assert_eq!(tree.to_string(), document);
|
||||
}
|
||||
Err(s) => {
|
||||
print!("{}\n", s);
|
||||
|
|
@ -88,11 +88,11 @@ mod lex_tests {
|
|||
|
||||
#[test]
|
||||
fn test_unmatched_list_delim_flat() {
|
||||
let document: &str = "(one two";
|
||||
let document = String::from("(one two");
|
||||
let output: &str = "Problem lexing document: \"Unmatched list delimiter in input\"";
|
||||
match lex(document) {
|
||||
match lex(&document) {
|
||||
Ok(tree) => {
|
||||
print!("Bad token yielded: {}\n", tree);
|
||||
print!("Bad token yielded: {}\n", tree.to_string());
|
||||
assert!(false);
|
||||
}
|
||||
Err(s) => {
|
||||
|
|
@ -103,9 +103,9 @@ mod lex_tests {
|
|||
|
||||
#[test]
|
||||
fn test_unmatched_list_delim_complex() {
|
||||
let document: &str = "(one two (three)";
|
||||
let document = String::from("(one two (three)");
|
||||
let output: &str = "Problem lexing document: \"Unmatched list delimiter in input\"";
|
||||
match lex(document) {
|
||||
match lex(&document) {
|
||||
Ok(tree) => {
|
||||
print!("Bad token yielded: {}\n", tree);
|
||||
assert!(false);
|
||||
|
|
@ -118,11 +118,11 @@ mod lex_tests {
|
|||
|
||||
#[test]
|
||||
fn test_comment() {
|
||||
let document: &str = "#!/bin/relish\n(one two)";
|
||||
let document = String::from("#!/bin/relish\n(one two)");
|
||||
let output: &str = "(one two)";
|
||||
match lex(document) {
|
||||
match lex(&document) {
|
||||
Ok(tree) => {
|
||||
assert_eq!(tree, output);
|
||||
assert_eq!(tree.to_string(), output);
|
||||
}
|
||||
Err(s) => {
|
||||
print!("{}\n", s);
|
||||
|
|
@ -133,11 +133,11 @@ mod lex_tests {
|
|||
|
||||
#[test]
|
||||
fn test_postline_comment() {
|
||||
let document: &str = "#!/bin/relish\n((one two)# another doc comment\n(three four))";
|
||||
let document = String::from("#!/bin/relish\n((one two)# another doc comment\n(three four))");
|
||||
let output: &str = "((one two) (three four))";
|
||||
match lex(document) {
|
||||
match lex(&document) {
|
||||
Ok(tree) => {
|
||||
assert_eq!(tree, output.to_string());
|
||||
assert_eq!(tree.to_string(), output.to_string());
|
||||
}
|
||||
Err(s) => {
|
||||
print!("{}\n", s);
|
||||
|
|
@ -148,11 +148,11 @@ mod lex_tests {
|
|||
|
||||
#[test]
|
||||
fn test_inline_comment() {
|
||||
let document: &str = "#!/bin/relish\n((one two)\n# another doc comment\nthree)";
|
||||
let document = String::from("#!/bin/relish\n((one two)\n# another doc comment\nthree)");
|
||||
let output: &str = "((one two) three)";
|
||||
match lex(document) {
|
||||
match lex(&document) {
|
||||
Ok(tree) => {
|
||||
assert_eq!(tree, output);
|
||||
assert_eq!(tree.to_string(), output.to_string());
|
||||
}
|
||||
Err(s) => {
|
||||
print!("{}\n", s);
|
||||
|
|
@ -163,9 +163,9 @@ mod lex_tests {
|
|||
|
||||
#[test]
|
||||
fn test_bad_token_list() {
|
||||
let document: &str = "(one t(wo)";
|
||||
let document = String::from("(one t(wo)");
|
||||
let output: &str = "Problem lexing document: \"list started in middle of another token\"";
|
||||
match lex(document) {
|
||||
match lex(&document) {
|
||||
Ok(tree) => {
|
||||
print!("Bad token yielded: {}\n", tree);
|
||||
assert!(false);
|
||||
|
|
|
|||
|
|
@ -1,166 +0,0 @@
|
|||
mod append_lib_tests {
|
||||
use relish::ast::{ast_to_string, eval, lex, Ctr, FTable, VTable};
|
||||
use relish::stdlib::get_stdlib;
|
||||
use std::cell::RefCell;
|
||||
use std::rc::Rc;
|
||||
|
||||
#[test]
|
||||
fn test_append_to_empty_list() {
|
||||
let document = "(append () 1 2 3)";
|
||||
let result = "(1 2 3)";
|
||||
let vt = Rc::new(RefCell::new(VTable::new()));
|
||||
let ft: Rc<RefCell<FTable>>;
|
||||
match get_stdlib(vt.clone()) {
|
||||
Ok(f) => ft = f,
|
||||
Err(s) => {
|
||||
ft = Rc::new(RefCell::new(FTable::new()));
|
||||
println!("Couldnt get stdlib: {}!", s);
|
||||
assert!(false)
|
||||
}
|
||||
}
|
||||
|
||||
match lex(document.to_string()) {
|
||||
Err(s) => {
|
||||
println!("Couldnt lex {}: {}\n", document, s);
|
||||
assert!(false);
|
||||
}
|
||||
|
||||
Ok(tree) => match eval(tree, vt.clone(), ft.clone(), false) {
|
||||
Err(s) => {
|
||||
println!("Couldnt eval {}: {}\n", document, s);
|
||||
assert!(false);
|
||||
}
|
||||
|
||||
Ok(ctr) => match ctr {
|
||||
Ctr::Symbol(_) => assert!(false),
|
||||
Ctr::String(_) => assert!(false),
|
||||
Ctr::Integer(_) => assert!(false),
|
||||
Ctr::Float(_) => assert!(false),
|
||||
Ctr::Bool(_) => assert!(false),
|
||||
Ctr::Seg(s) => assert_eq!(ast_to_string(s), result),
|
||||
Ctr::None => assert!(false),
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_append_to_full_list() {
|
||||
let document = "(append (1 2) 3)";
|
||||
let result = "(1 2 3)";
|
||||
let vt = Rc::new(RefCell::new(VTable::new()));
|
||||
let ft: Rc<RefCell<FTable>>;
|
||||
match get_stdlib(vt.clone()) {
|
||||
Ok(f) => ft = f,
|
||||
Err(s) => {
|
||||
ft = Rc::new(RefCell::new(FTable::new()));
|
||||
println!("Couldnt get stdlib: {}!", s);
|
||||
assert!(false)
|
||||
}
|
||||
}
|
||||
|
||||
match lex(document.to_string()) {
|
||||
Err(s) => {
|
||||
println!("Couldnt lex {}: {}\n", document, s);
|
||||
assert!(false);
|
||||
}
|
||||
|
||||
Ok(tree) => match eval(tree, vt.clone(), ft.clone(), false) {
|
||||
Err(s) => {
|
||||
println!("Couldnt eval {}: {}\n", document, s);
|
||||
assert!(false);
|
||||
}
|
||||
|
||||
Ok(ctr) => match ctr {
|
||||
Ctr::Symbol(_) => assert!(false),
|
||||
Ctr::String(_) => assert!(false),
|
||||
Ctr::Integer(_) => assert!(false),
|
||||
Ctr::Float(_) => assert!(false),
|
||||
Ctr::Bool(_) => assert!(false),
|
||||
Ctr::Seg(s) => assert_eq!(ast_to_string(s), result),
|
||||
Ctr::None => assert!(false),
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_mono_append() {
|
||||
let document = "(append)";
|
||||
let result = "()";
|
||||
let vt = Rc::new(RefCell::new(VTable::new()));
|
||||
let ft: Rc<RefCell<FTable>>;
|
||||
match get_stdlib(vt.clone()) {
|
||||
Ok(f) => ft = f,
|
||||
Err(s) => {
|
||||
ft = Rc::new(RefCell::new(FTable::new()));
|
||||
println!("Couldnt get stdlib: {}!", s);
|
||||
assert!(false)
|
||||
}
|
||||
}
|
||||
|
||||
match lex(document.to_string()) {
|
||||
Err(s) => {
|
||||
println!("Couldnt lex {}: {}\n", document, s);
|
||||
assert!(false);
|
||||
}
|
||||
|
||||
Ok(tree) => match eval(tree, vt.clone(), ft.clone(), false) {
|
||||
Err(s) => {
|
||||
println!("Couldnt eval {}: {}\n", document, s);
|
||||
assert!(false);
|
||||
}
|
||||
|
||||
Ok(ctr) => match ctr {
|
||||
Ctr::Symbol(_) => assert!(false),
|
||||
Ctr::String(_) => assert!(false),
|
||||
Ctr::Integer(_) => assert!(false),
|
||||
Ctr::Float(_) => assert!(false),
|
||||
Ctr::Bool(_) => assert!(false),
|
||||
Ctr::Seg(s) => assert_eq!(ast_to_string(s), result),
|
||||
Ctr::None => assert!(false),
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_append_no_list() {
|
||||
let document = "(append 'test' 1 2 3)";
|
||||
let result = "('test' 1 2 3)";
|
||||
let vt = Rc::new(RefCell::new(VTable::new()));
|
||||
let ft: Rc<RefCell<FTable>>;
|
||||
match get_stdlib(vt.clone()) {
|
||||
Ok(f) => ft = f,
|
||||
Err(s) => {
|
||||
ft = Rc::new(RefCell::new(FTable::new()));
|
||||
println!("Couldnt get stdlib: {}!", s);
|
||||
assert!(false)
|
||||
}
|
||||
}
|
||||
|
||||
match lex(document.to_string()) {
|
||||
Err(s) => {
|
||||
println!("Couldnt lex {}: {}\n", document, s);
|
||||
assert!(false);
|
||||
}
|
||||
|
||||
Ok(tree) => match eval(tree, vt.clone(), ft.clone(), false) {
|
||||
Err(s) => {
|
||||
println!("Couldnt eval {}: {}\n", document, s);
|
||||
assert!(false);
|
||||
}
|
||||
|
||||
Ok(ctr) => match ctr {
|
||||
Ctr::Symbol(_) => assert!(false),
|
||||
Ctr::String(_) => assert!(false),
|
||||
Ctr::Integer(_) => assert!(false),
|
||||
Ctr::Float(_) => assert!(false),
|
||||
Ctr::Bool(_) => assert!(false),
|
||||
Ctr::Seg(s) => assert_eq!(ast_to_string(s), result),
|
||||
Ctr::None => assert!(false),
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,126 +0,0 @@
|
|||
mod str_lib_tests {
|
||||
use relish::ast::{eval, lex, Ctr, FTable, VTable};
|
||||
use relish::stdlib::get_stdlib;
|
||||
use std::cell::RefCell;
|
||||
use std::rc::Rc;
|
||||
|
||||
#[test]
|
||||
fn test_simple_concat() {
|
||||
let document = "(concat 'test')";
|
||||
let result = "test";
|
||||
let vt = Rc::new(RefCell::new(VTable::new()));
|
||||
let ft: Rc<RefCell<FTable>>;
|
||||
match get_stdlib(vt.clone()) {
|
||||
Ok(f) => ft = f,
|
||||
Err(s) => {
|
||||
ft = Rc::new(RefCell::new(FTable::new()));
|
||||
println!("Couldnt get stdlib: {}!", s);
|
||||
assert!(false)
|
||||
}
|
||||
}
|
||||
|
||||
match lex(document.to_string()) {
|
||||
Err(s) => {
|
||||
println!("Couldnt lex {}: {}\n", document, s);
|
||||
assert!(false);
|
||||
}
|
||||
|
||||
Ok(tree) => match eval(tree, vt.clone(), ft.clone(), false) {
|
||||
Err(s) => {
|
||||
println!("Couldnt eval {}: {}\n", document, s);
|
||||
assert!(false);
|
||||
}
|
||||
|
||||
Ok(ctr) => match ctr {
|
||||
Ctr::Symbol(_) => assert!(false),
|
||||
Ctr::String(s) => assert_eq!(s, result),
|
||||
Ctr::Integer(_) => assert!(false),
|
||||
Ctr::Float(_) => assert!(false),
|
||||
Ctr::Bool(_) => assert!(false),
|
||||
Ctr::Seg(_) => assert!(false),
|
||||
Ctr::None => assert!(false),
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_poly_concat() {
|
||||
let document = "(concat 'test' 1 2 3)";
|
||||
let result = "test123";
|
||||
let vt = Rc::new(RefCell::new(VTable::new()));
|
||||
let ft: Rc<RefCell<FTable>>;
|
||||
match get_stdlib(vt.clone()) {
|
||||
Ok(f) => ft = f,
|
||||
Err(s) => {
|
||||
ft = Rc::new(RefCell::new(FTable::new()));
|
||||
println!("Couldnt get stdlib: {}!", s);
|
||||
assert!(false)
|
||||
}
|
||||
}
|
||||
|
||||
match lex(document.to_string()) {
|
||||
Err(s) => {
|
||||
println!("Couldnt lex {}: {}\n", document, s);
|
||||
assert!(false);
|
||||
}
|
||||
|
||||
Ok(tree) => match eval(tree, vt.clone(), ft.clone(), false) {
|
||||
Err(s) => {
|
||||
println!("Couldnt eval {}: {}\n", document, s);
|
||||
assert!(false);
|
||||
}
|
||||
|
||||
Ok(ctr) => match ctr {
|
||||
Ctr::Symbol(_) => assert!(false),
|
||||
Ctr::String(s) => assert_eq!(s, result),
|
||||
Ctr::Integer(_) => assert!(false),
|
||||
Ctr::Float(_) => assert!(false),
|
||||
Ctr::Bool(_) => assert!(false),
|
||||
Ctr::Seg(_) => assert!(false),
|
||||
Ctr::None => assert!(false),
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_empty_concat() {
|
||||
let document = "(concat)";
|
||||
let result = "";
|
||||
let vt = Rc::new(RefCell::new(VTable::new()));
|
||||
let ft: Rc<RefCell<FTable>>;
|
||||
match get_stdlib(vt.clone()) {
|
||||
Ok(f) => ft = f,
|
||||
Err(s) => {
|
||||
ft = Rc::new(RefCell::new(FTable::new()));
|
||||
println!("Couldnt get stdlib: {}!", s);
|
||||
assert!(false)
|
||||
}
|
||||
}
|
||||
|
||||
match lex(document.to_string()) {
|
||||
Err(s) => {
|
||||
println!("Couldnt lex {}: {}\n", document, s);
|
||||
assert!(false);
|
||||
}
|
||||
|
||||
Ok(tree) => match eval(tree, vt.clone(), ft.clone(), false) {
|
||||
Err(s) => {
|
||||
println!("Couldnt eval {}: {}\n", document, s);
|
||||
assert!(false);
|
||||
}
|
||||
|
||||
Ok(ctr) => match ctr {
|
||||
Ctr::Symbol(_) => assert!(false),
|
||||
Ctr::String(s) => assert_eq!(s, result),
|
||||
Ctr::Integer(_) => assert!(false),
|
||||
Ctr::Float(_) => assert!(false),
|
||||
Ctr::Bool(_) => assert!(false),
|
||||
Ctr::Seg(_) => assert!(false),
|
||||
Ctr::None => assert!(false),
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue