use crate::parser::{Ast, Localised, Token, parse, tokenize}; #[test] fn test_tokenize() { let input = "(+ (* 1:u8 2) 2)"; let expected = vec![ Localised::dummy_location(Token::LeftParen), Localised::dummy_location(Token::Symbol("+".to_string())), Localised::dummy_location(Token::LeftParen), Localised::dummy_location(Token::Symbol("*".to_string())), Localised::dummy_location(Token::Symbol("1:u8".to_string())), Localised::dummy_location(Token::Symbol("2".to_string())), Localised::dummy_location(Token::RightParen), Localised::dummy_location(Token::Symbol("2".to_string())), Localised::dummy_location(Token::RightParen), ]; assert_eq!(tokenize(input), expected); } #[test] #[should_panic] fn test_unexpected_pclose() { let input = "())"; let tokens = tokenize(input); let _ast = parse(tokens).unwrap(); } #[test] #[should_panic] fn test_unexpected_eof() { let input = "(1 2 3 4"; let tokens = tokenize(input); let _ast = parse(tokens).unwrap(); } #[test] fn test_parse() { let src = " (module Shader Logical GLSL450) (import :std GLSL.std.450) (bind (frag-coord:*v4f32i) (BuiltIn FragCoord)) (bind (out-color:*v4f32o) (Location 0)) (dec frag-coord:*v4f32i Input) (dec out-color:*v4f32o Output) (entry main Fragment OriginUpperLeft (:frag-coord :out-color)) (fun (main) (store-ptr (out-color) (v4f32i (/ (.xy (load-ptr frag-coord)) (v2f32 1920.0 1080.0)) 1.0 1.0))) "; let ast = parse(tokenize(src)).unwrap(); println!("{:?}", ast); let test_ast: Ast = Ast::Root(vec![ Ast::List(Localised::dummy_location(vec![ Ast::Symbol(Localised::dummy_location("module".to_string())), Ast::Symbol(Localised::dummy_location("Shader".to_string())), Ast::Symbol(Localised::dummy_location("Logical".to_string())), Ast::Symbol(Localised::dummy_location("GLSL450".to_string())), ])), Ast::List(Localised::dummy_location(vec![ Ast::Symbol(Localised::dummy_location("import".to_string())), Ast::Symbol(Localised::dummy_location(":std".to_string())), Ast::Symbol(Localised::dummy_location("GLSL.std.450".to_string())), ])), Ast::List(Localised::dummy_location(vec![ Ast::Symbol(Localised::dummy_location("bind".to_string())), Ast::List(Localised::dummy_location(vec![Ast::Symbol( Localised::dummy_location("frag-coord:*v4f32i".to_string()), )])), Ast::List(Localised::dummy_location(vec![ Ast::Symbol(Localised::dummy_location("Builtin".to_string())), Ast::Symbol(Localised::dummy_location("FragCoord".to_string())), ])), ])), Ast::List(Localised::dummy_location(vec![ Ast::Symbol(Localised::dummy_location("bind".to_string())), Ast::List(Localised::dummy_location(vec![Ast::Symbol( Localised::dummy_location("out-color:*v4f32o".to_string()), )])), Ast::List(Localised::dummy_location(vec![ Ast::Symbol(Localised::dummy_location("Location".to_string())), Ast::Symbol(Localised::dummy_location("0".to_string())), ])), ])), Ast::List(Localised::dummy_location(vec![ Ast::Symbol(Localised::dummy_location("dec".to_string())), Ast::Symbol(Localised::dummy_location("frag-coord:*v4f32i".to_string())), Ast::Symbol(Localised::dummy_location("Input".to_string())), ])), Ast::List(Localised::dummy_location(vec![ Ast::Symbol(Localised::dummy_location("dec".to_string())), Ast::Symbol(Localised::dummy_location("out-color:*v4f32o".to_string())), Ast::Symbol(Localised::dummy_location("Output".to_string())), ])), Ast::List(Localised::dummy_location(vec![ Ast::Symbol(Localised::dummy_location("entry".to_string())), Ast::Symbol(Localised::dummy_location("main".to_string())), Ast::Symbol(Localised::dummy_location("Fragment".to_string())), Ast::Symbol(Localised::dummy_location("OriginUpperLeft".to_string())), Ast::List(Localised::dummy_location(vec![ Ast::Symbol(Localised::dummy_location(":frag-coord".to_string())), Ast::Symbol(Localised::dummy_location(":out-color".to_string())), ])), ])), Ast::List(Localised::dummy_location(vec![ Ast::Symbol(Localised::dummy_location("fun".to_string())), Ast::List(Localised::dummy_location(vec![Ast::Symbol( Localised::dummy_location("main".to_string()), )])), Ast::List(Localised::dummy_location(vec![ Ast::Symbol(Localised::dummy_location("store-ptr".to_string())), Ast::List(Localised::dummy_location(vec![Ast::Symbol( Localised::dummy_location("out-color".to_string()), )])), Ast::List(Localised::dummy_location(vec![ Ast::Symbol(Localised::dummy_location("v4f23i".to_string())), Ast::List(Localised::dummy_location(vec![ Ast::Symbol(Localised::dummy_location("/".to_string())), Ast::List(Localised::dummy_location(vec![ Ast::Symbol(Localised::dummy_location(".xy".to_string())), Ast::List(Localised::dummy_location(vec![ Ast::Symbol(Localised::dummy_location("load-ptr".to_string())), Ast::Symbol(Localised::dummy_location("frag-coord".to_string())), ])), ])), Ast::List(Localised::dummy_location(vec![ Ast::Symbol(Localised::dummy_location("v2f32".to_string())), Ast::Symbol(Localised::dummy_location("1920.0".to_string())), Ast::Symbol(Localised::dummy_location("1080.0".to_string())), ])), ])), Ast::Symbol(Localised::dummy_location("1.0".to_string())), Ast::Symbol(Localised::dummy_location("1.0".to_string())), ])), ])), ])), ]); assert_eq!(ast, test_ast); }