use super::*; use super::error::get_line_and_column; use super::position::get_line_and_column; #[test] fn test_hello_world() { let parsed = parse("(hello #ffcc00 'c' ' ' '\\\\' '\\n' 'not_a_char 0xf_f 0b01_01 18_446_744_073_709_551_615 9223372036854775807 9223372036854775808 -42\n\t -4.0 \"world\") ; comment").unwrap(); assert_eq!( parsed, list(&[ atom_s("hello"), atom_u(0xffcc00), atom_c('c'), atom_c(' '), atom_c('\\'), atom_c('\n'), atom_s("'not_a_char"), atom_u(255), atom_u(0b0101), atom_u(18_446_744_073_709_551_615), atom_u(9223372036854775807), atom_u(9223372036854775808), atom_i(-42), atom_f(-4.0), atom_qs("world") ])); } #[test] fn test_escaping() { assert_eq!( parse(r#"("\"\\q\t\n\r " "1234" 1234)"#).unwrap(), list(&[atom_qs("\"\\q\t\n\r "), atom_qs("1234"), atom_u(1234)])); } #[test] fn test_pp() { let s = "(hello world (what is (up) (4 6.4 you \"123\\\\ \\\"\")))"; let sexp = parse(s).unwrap(); assert_eq!(s, sexp.to_string()); assert_eq!(s, format!("{}", sexp)); } #[test] fn test_tight_parens() { let s = "(hello(world))"; let sexp = parse(s).unwrap(); assert_eq!(sexp, Sexp::List(vec![Sexp::Atom(Atom::S("hello".into()), Default::default()), Sexp::List(vec![Sexp::Atom(Atom::S("world".into()), Default::default())], Default::default())], Default::default())); let s = "(this (has)tight(parens))"; let s2 = "( this ( has ) tight ( parens ) )"; assert_eq!(parse(s).unwrap(), parse(s2).unwrap()); } #[test] fn test_space_in_atom() { let sexp = list(&[atom_qs("hello world")]); let sexp_as_string = sexp.to_string(); assert_eq!("(\"hello world\")", sexp_as_string); assert_eq!(sexp, parse(&sexp_as_string).unwrap()); } #[test] fn show_an_error() { assert_eq!(format!("{:?}", parse("(aaaa").unwrap_err()), "1:4: unexpected eof"); } #[test] fn line_and_col_test() { let s = "0123456789\n0123456789\n\n6"; assert_eq!(get_line_and_column(s, 4), SourcePosition { line: 1, column: 4, index: 4, file: 0 }); assert_eq!(get_line_and_column(s, 10), SourcePosition { line: 2, column: 0, index: 10, file: 0 }); assert_eq!(get_line_and_column(s, 11), SourcePosition { line: 2, column: 0, index: 11, file: 0 }); assert_eq!(get_line_and_column(s, 15), SourcePosition { line: 2, column: 4, index: 15, file: 0 }); assert_eq!(get_line_and_column(s, 21), SourcePosition { line: 3, column: 0, index: 21, file: 0 }); assert_eq!(get_line_and_column(s, 22), SourcePosition { line: 4, column: 0, index: 22, file: 0 }); assert_eq!(get_line_and_column(s, 23), SourcePosition { line: 4, column: 0, index: 23, file: 0 }); assert_eq!(get_line_and_column(s, 500), SourcePosition { line: 4, column: 0, index: 500, file: 0 }); } #[test] fn sexp_size() { // I just want to see when this changes, in the diff. use std::mem; assert_eq!(mem::size_of::(), mem::size_of::() * 6); } #[test] fn test_peek() { assert_eq!(('a', 1), peek("ahoj", 0).unwrap()); assert_eq!(('j', 4), peek("ahoj", 3).unwrap()); assert!(peek("ahoj", 4).is_err()); } #[test] fn test_peekn() { assert_eq!(Some(('a', 1)), peekn("ahoj", 1, 0)); assert_eq!(Some(('h', 2)), peekn("ahoj", 2, 0)); assert_eq!(Some(('j', 4)), peekn("ahoj", 4, 0)); assert_eq!(Some(('o', 3)), peekn("ahoj", 1, 2)); assert_eq!(None, peekn("ahoj", 3, 2)); }