From b716365c962fba67c45f494fabdf380008bb17ab Mon Sep 17 00:00:00 2001 From: Sayan Nandan Date: Tue, 14 Jun 2022 20:07:33 -0700 Subject: [PATCH] Add full lex test for a create query --- server/src/blueql/lexer.rs | 13 ++++ server/src/blueql/tests.rs | 145 +++++++++++++++++++++++-------------- 2 files changed, 103 insertions(+), 55 deletions(-) diff --git a/server/src/blueql/lexer.rs b/server/src/blueql/lexer.rs index 92468652..e00d8605 100644 --- a/server/src/blueql/lexer.rs +++ b/server/src/blueql/lexer.rs @@ -62,12 +62,25 @@ impl From for Token { } } +#[cfg(test)] +impl From<&'static str> for Token { + fn from(sl: &'static str) -> Self { + Self::Identifier(sl.into()) + } +} + impl From for Token { fn from(num: u64) -> Self { Self::Number(num) } } +impl From for Token { + fn from(ty: Type) -> Self { + Self::Keyword(Keyword::Type(ty)) + } +} + #[derive(Debug, PartialEq, Clone, Copy)] #[repr(u8)] /// BlueQL keywords diff --git a/server/src/blueql/tests.rs b/server/src/blueql/tests.rs index 25dd9baa..521772ec 100644 --- a/server/src/blueql/tests.rs +++ b/server/src/blueql/tests.rs @@ -24,70 +24,105 @@ * */ -// lexer tests use super::{ ast::{Compiler, FieldConfig, Statement}, lexer::{Keyword, Lexer, Token, Type, TypeExpression}, }; -#[test] -fn lex_ident() { - let src = b"mytbl"; - assert_eq!( - Lexer::lex(src).unwrap(), - vec![Token::Identifier("mytbl".into())] - ) -} +mod lexer { + //! Lexer tests + use super::*; -#[test] -fn lex_keyword() { - let src = b"create"; - assert_eq!( - Lexer::lex(src).unwrap(), - vec![Token::Keyword(Keyword::Create)] - ) -} + #[test] + fn lex_ident() { + let src = b"mytbl"; + assert_eq!( + Lexer::lex(src).unwrap(), + vec![Token::Identifier("mytbl".into())] + ) + } -#[test] -fn lex_number() { - let src = b"123456"; - assert_eq!(Lexer::lex(src).unwrap(), vec![Token::Number(123456)]) -} + #[test] + fn lex_keyword() { + let src = b"create"; + assert_eq!( + Lexer::lex(src).unwrap(), + vec![Token::Keyword(Keyword::Create)] + ) + } -#[test] -fn lex_full() { - let src = b"create model tweet"; - assert_eq!( - Lexer::lex(src).unwrap(), - vec![ - Token::Keyword(Keyword::Create), - Token::Keyword(Keyword::Model), - Token::Identifier("tweet".into()) - ] - ); -} + #[test] + fn lex_number() { + let src = b"123456"; + assert_eq!(Lexer::lex(src).unwrap(), vec![Token::Number(123456)]) + } -// AST tests + #[test] + fn lex_full() { + let src = b"create model tweet"; + assert_eq!( + Lexer::lex(src).unwrap(), + vec![ + Token::Keyword(Keyword::Create), + Token::Keyword(Keyword::Model), + Token::Identifier("tweet".into()) + ] + ); + } -#[cfg(test)] -fn setup_src_stmt() -> (Vec, Statement) { - let src = - b"create model tweet(username: string, password: binary, posts: list)".to_vec(); - let stmt = Statement::CreateModel { - name: "tweet".into(), - model: FieldConfig { - types: vec![ - TypeExpression(vec![Type::String]), - TypeExpression(vec![Type::Binary]), - TypeExpression(vec![Type::List, Type::String]), - ], - names: vec!["username".into(), "password".into(), "posts".into()], - }, - }; - (src, stmt) + #[test] + fn lex_combined_tokens() { + let src = b"create model tweet(name: string, pic: binary, posts: list)"; + assert_eq!( + Lexer::lex(src).unwrap(), + vec![ + Keyword::Create.into(), + Keyword::Model.into(), + "tweet".into(), + Token::OpenParen, + Token::Identifier("name".into()), + Token::Colon, + Type::String.into(), + Token::Comma, + Token::Identifier("pic".into()), + Token::Colon, + Type::Binary.into(), + Token::Comma, + Token::Identifier("posts".into()), + Token::Colon, + Type::List.into(), + Token::OpenAngular, + Type::String.into(), + Token::CloseAngular, + Token::CloseParen + ] + ); + } } -#[test] -fn compile_full() { - let (src, stmt) = setup_src_stmt(); - assert_eq!(Compiler::compile(&src).unwrap(), stmt) + +mod ast { + //! AST tests + use super::*; + #[cfg(test)] + fn setup_src_stmt() -> (Vec, Statement) { + let src = + b"create model tweet(username: string, password: binary, posts: list)".to_vec(); + let stmt = Statement::CreateModel { + name: "tweet".into(), + model: FieldConfig { + types: vec![ + TypeExpression(vec![Type::String]), + TypeExpression(vec![Type::Binary]), + TypeExpression(vec![Type::List, Type::String]), + ], + names: vec!["username".into(), "password".into(), "posts".into()], + }, + }; + (src, stmt) + } + #[test] + fn compile_full() { + let (src, stmt) = setup_src_stmt(); + assert_eq!(Compiler::compile(&src).unwrap(), stmt) + } }