directive: does not type check; add test for parsing builtin directives
This commit is contained in:
		| @@ -3,6 +3,7 @@ use std::collections::BTreeMap; | ||||
| use snafu::{ResultExt, Snafu}; | ||||
|  | ||||
| /// The types and directives in a VijiN project. | ||||
| #[derive(Debug, PartialEq, Eq)] | ||||
| pub struct TypeSystem { | ||||
|     pub types: BTreeMap<String, Type>, | ||||
|     pub directives: BTreeMap<String, Directive>, | ||||
| @@ -11,6 +12,7 @@ pub struct TypeSystem { | ||||
| /// The definition of a standard directive. | ||||
| /// | ||||
| /// Note that this type is an input to the parser, not an output. | ||||
| #[derive(Debug, PartialEq, Eq)] | ||||
| pub struct Directive { | ||||
|     /// The provider's name for the directive. | ||||
|     name: String, | ||||
| @@ -37,6 +39,7 @@ pub struct Directive { | ||||
| } | ||||
|  | ||||
| /// Directive parameter. | ||||
| #[derive(Debug, PartialEq, Eq)] | ||||
| pub struct Param { | ||||
|     /// Name to which the compiler maps the argument. | ||||
|     name: String, | ||||
| @@ -49,7 +52,7 @@ pub struct Param { | ||||
| } | ||||
|  | ||||
| /// Types expected by directive arguments. | ||||
| #[derive(Clone)] | ||||
| #[derive(Debug, Clone, PartialEq, Eq)] | ||||
| pub enum Type { | ||||
|     /// Arbitrary text. | ||||
|     Text, | ||||
| @@ -264,4 +267,38 @@ impl TypeSystem { | ||||
| mod tests { | ||||
|     use super::*; | ||||
|     use rstest::rstest; | ||||
|  | ||||
|     #[rstest] | ||||
|     fn builtin() { | ||||
|         let mut s = TypeSystem { | ||||
|             types: BTreeMap::new(), | ||||
|             directives: BTreeMap::new(), | ||||
|         }; | ||||
|         s.parse(DIRECTIVE_PREDECLARED).unwrap(); | ||||
|         let expected = TypeSystem{ | ||||
|             types: BTreeMap::from([ | ||||
|                 ("text", Type::Text), | ||||
|                 ("speech", Type::Speech), | ||||
|                 ("character", Type::Character), | ||||
|                 ("duration", Type::Duration), | ||||
|                 ("scene", Type::Asset { tags: ["scene"] }), | ||||
|                 ("background", Type::Asset { tags: ["background"] }), | ||||
|                 ("stage position", Type::Enum(["close", "left third", "right third", "left", "center", "right", "far left", "mid left", "mid right", "far right", "far"])), | ||||
|             ].map(|(k, v)| (k.into(), v))), | ||||
|             directives: BTreeMap::from([ | ||||
|                 ("page", Directive { | ||||
|                     name: "page".into(), | ||||
|                     doc: "Start showing the current static speaker, text, &c.\nNormally not used directly; script speech lines call this directive implicitly.".into(), | ||||
|                     prefix: "page".into(), | ||||
|                     prefix_param: None, | ||||
|                     infix: None, | ||||
|                     infix_param: None, | ||||
|                     suffix: None, | ||||
|                     suffix_param: None, | ||||
|                     list_param: None, | ||||
|                 }), | ||||
|             ].map(|(k, v)| (k.into(), v))), | ||||
|         }; | ||||
|         assert_eq!(s, expected); | ||||
|     } | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user