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