blob: 7134bca1b5d51ca9c654d3bd5141d196e1a6f9b9 [file] [log] [blame]
// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#![deny(warnings)]
#[cfg(test)]
mod test {
use wayland_scanner_lib::{ArgKind, AstResult, Parser, Protocol};
fn parse_str(s: &str) -> AstResult<Protocol> {
Protocol::from_parse_tree(Parser::from_str(s).read_document().unwrap())
}
#[test]
fn test_empty_protocol() {
const PROTOCOL: &'static str = r#"
<?xml version="1.0" encoding="UTF-8"?>
<protocol name="test_protocol">
</protocol>
"#;
let protocol = parse_str(PROTOCOL).unwrap();
assert_eq!(protocol.name, "test_protocol");
assert!(!protocol.copyright.is_some());
assert!(!protocol.description.is_some());
assert!(protocol.interfaces.is_empty());
}
#[test]
fn parser_integration_test() {
const PROTOCOL: &'static str = r#"
<?xml version="1.0" encoding="UTF-8"?>
<protocol name="my_protocol">
<copyright>This is a copyright</copyright>
<description summary="protocol summary">This describes my protocol</description>
<interface name="my_interface" version="3">
<description summary="interface summary">This describes my interface</description>
<request name="request_with_all_arg_types" since="2">
<description summary="request_with_all_arg_types summary">This describes request_with_all_arg_types</description>
<arg name="int_arg" type="int"/>
<arg name="uint_arg" type="uint"/>
<arg name="fixed_arg" type="fixed"/>
<arg name="object_arg" type="object"/>
<arg name="new_id_arg" type="new_id" interface="my_interface"/>
<arg name="string_arg" type="string"/>
<arg name="array_arg" type="array"/>
<arg name="fd_arg" type="fd"/>
</request>
<event name="event_with_all_arg_types" since="1024">
<description summary="event_with_all_arg_types summary">This describes event_with_all_arg_types</description>
<arg name="int_arg" type="int"/>
<arg name="uint_arg" type="uint"/>
<arg name="fixed_arg" type="fixed"/>
<arg name="object_arg" type="object"/>
<arg name="new_id_arg" type="new_id" interface="my_interface"/>
<arg name="string_arg" type="string"/>
<arg name="array_arg" type="array"/>
<arg name="fd_arg" type="fd"/>
</event>
</interface>
</protocol>
"#;
let protocol = parse_str(PROTOCOL).unwrap();
assert_eq!(protocol.name, "my_protocol");
let copyright = protocol.copyright.expect("Missing protocol copyright");
assert_eq!(copyright, "This is a copyright");
let description = protocol.description.expect("Missing protocol description");
assert_eq!(description.summary, "protocol summary");
assert_eq!(description.description, "This describes my protocol");
let mut interfaces = protocol.interfaces;
assert_eq!(1, interfaces.len());
let interface = interfaces.remove(0);
assert_eq!(interface.name, "my_interface");
assert_eq!(interface.version, 3);
let description = interface
.description
.expect("Missing interface description");
assert_eq!(description.summary, "interface summary");
assert_eq!(description.description, "This describes my interface");
let mut requests = interface.requests;
assert_eq!(1, requests.len());
let request = requests.remove(0);
assert_eq!(request.name, "request_with_all_arg_types");
assert_eq!(request.since, 2);
assert_eq!(request.request_type, None);
let description = request.description.expect("Missing request description");
assert_eq!(description.summary, "request_with_all_arg_types summary");
assert_eq!(
description.description,
"This describes request_with_all_arg_types"
);
let mut args = request.args;
assert_eq!(8, args.len());
let arg = args.remove(0);
assert_eq!(arg.name, "int_arg");
assert_eq!(arg.kind, ArgKind::Int);
let arg = args.remove(0);
assert_eq!(arg.name, "uint_arg");
assert_eq!(arg.kind, ArgKind::Uint);
let arg = args.remove(0);
assert_eq!(arg.name, "fixed_arg");
assert_eq!(arg.kind, ArgKind::Fixed);
let arg = args.remove(0);
assert_eq!(arg.name, "object_arg");
assert_eq!(arg.kind, ArgKind::Object);
let arg = args.remove(0);
assert_eq!(arg.name, "new_id_arg");
assert_eq!(arg.kind, ArgKind::NewId);
let arg = args.remove(0);
assert_eq!(arg.name, "string_arg");
assert_eq!(arg.kind, ArgKind::String);
let arg = args.remove(0);
assert_eq!(arg.name, "array_arg");
assert_eq!(arg.kind, ArgKind::Array);
let arg = args.remove(0);
assert_eq!(arg.name, "fd_arg");
assert_eq!(arg.kind, ArgKind::Fd);
let mut events = interface.events;
assert_eq!(1, events.len());
let event = events.remove(0);
assert_eq!(event.name, "event_with_all_arg_types");
assert_eq!(event.since, 1024);
let description = event.description.expect("Missing event description");
assert_eq!(description.summary, "event_with_all_arg_types summary");
assert_eq!(
description.description,
"This describes event_with_all_arg_types"
);
let mut args = event.args;
assert_eq!(8, args.len());
let arg = args.remove(0);
assert_eq!(arg.name, "int_arg");
assert_eq!(arg.kind, ArgKind::Int);
let arg = args.remove(0);
assert_eq!(arg.name, "uint_arg");
assert_eq!(arg.kind, ArgKind::Uint);
let arg = args.remove(0);
assert_eq!(arg.name, "fixed_arg");
assert_eq!(arg.kind, ArgKind::Fixed);
let arg = args.remove(0);
assert_eq!(arg.name, "object_arg");
assert_eq!(arg.kind, ArgKind::Object);
let arg = args.remove(0);
assert_eq!(arg.name, "new_id_arg");
assert_eq!(arg.kind, ArgKind::NewId);
let arg = args.remove(0);
assert_eq!(arg.name, "string_arg");
assert_eq!(arg.kind, ArgKind::String);
let arg = args.remove(0);
assert_eq!(arg.name, "array_arg");
assert_eq!(arg.kind, ArgKind::Array);
let arg = args.remove(0);
assert_eq!(arg.name, "fd_arg");
assert_eq!(arg.kind, ArgKind::Fd);
}
}