Skip to content

Commit

Permalink
Reintroduce scanner tests.
Browse files Browse the repository at this point in the history
  • Loading branch information
elinorbgr committed Feb 26, 2018
1 parent 28cb120 commit 99d1cb8
Show file tree
Hide file tree
Showing 6 changed files with 1,255 additions and 4 deletions.
97 changes: 97 additions & 0 deletions tests/scanner.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
extern crate difference;
extern crate wayland_scanner;


use difference::{Changeset, Difference};
use std::io::Cursor;
use std::str::from_utf8;
use wayland_scanner::Side;

const PROTOCOL: &'static str = include_str!("./scanner_assets/protocol.xml");

const C_INTERFACES_TARGET: &'static str = include_str!("./scanner_assets/c_interfaces.rs");

const CLIENT_C_CODE_TARGET: &'static str = include_str!("./scanner_assets/client_c_code.rs");

const SERVER_C_CODE_TARGET: &'static str = include_str!("./scanner_assets/server_c_code.rs");

fn print_diff(diffs: &[Difference]) {
println!("");
for d in diffs {
match *d {
Difference::Same(ref x) => for l in x.lines() {
println!(" {}", l);
},
Difference::Add(ref x) => for l in x.lines() {
println!("\x1b[92m + {}\x1b[0m", l);
},
Difference::Rem(ref x) => for l in x.lines() {
println!("\x1b[91m - {}\x1b[0m", l);
},
}
}
}

fn only_newlines_err(diffs: &[Difference]) -> bool {
for d in diffs {
match *d {
Difference::Add(_) | Difference::Rem(_) => return false,
_ => {}
}
}
return true;
}

#[test]
fn c_interfaces_generation() {
let mut out = Vec::new();
wayland_scanner::generate_c_interfaces_streams(Cursor::new(PROTOCOL.as_bytes()), &mut out);
let changeset = Changeset::new(
C_INTERFACES_TARGET,
from_utf8(&out).expect("Output of scanner was not UTF8."),
"\n",
);
if changeset.distance != 0 && !only_newlines_err(&changeset.diffs) {
print_diff(&changeset.diffs);
panic!(
"Scanner output does not match expected output: d = {}",
changeset.distance
);
}
}

#[test]
fn client_c_code_generation() {
let mut out = Vec::new();
wayland_scanner::generate_c_code_streams(Cursor::new(PROTOCOL.as_bytes()), &mut out, Side::Client);
let changeset = Changeset::new(
CLIENT_C_CODE_TARGET,
from_utf8(&out).expect("Output of scanner was not UTF8."),
"\n",
);
if changeset.distance != 0 && !only_newlines_err(&changeset.diffs) {
print_diff(&changeset.diffs);
panic!(
"Scanner output does not match expected output: d = {}",
changeset.distance
);
}
}

#[test]
fn server_c_code_generation() {
let mut out = Vec::new();
wayland_scanner::generate_c_code_streams(Cursor::new(PROTOCOL.as_bytes()), &mut out, Side::Server);
let changeset = Changeset::new(
SERVER_C_CODE_TARGET,
from_utf8(&out).expect("Output of scanner was not UTF8."),
"\n",
);
if changeset.distance != 0 && !only_newlines_err(&changeset.diffs) {
print_diff(&changeset.diffs);
panic!(
"Scanner output does not match expected output: d = {}",
changeset.distance
);
}
}
108 changes: 108 additions & 0 deletions tests/scanner_assets/c_interfaces.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
//
// This file was auto-generated, do not edit directly
//

/*
This is an example copyright.
It contains several lines.
AS WELL AS ALL CAPS TEXT.
*/

use std::os::raw::{c_char, c_void};
use wayland_sys::common::*;

const NULLPTR: *const c_void = 0 as *const c_void;

static mut types_null: [*const wl_interface; 5] = [
NULLPTR as *const wl_interface,
NULLPTR as *const wl_interface,
NULLPTR as *const wl_interface,
NULLPTR as *const wl_interface,
NULLPTR as *const wl_interface,
];

// wl_foo
static mut wl_foo_requests_create_bar_types: [*const wl_interface; 1] = [
unsafe { &wl_bar_interface as *const wl_interface },
];

pub static mut wl_foo_requests: [wl_message; 2] = [
wl_message { name: b"foo_it\0" as *const u8 as *const c_char, signature: b"iusfh\0" as *const u8 as *const c_char, types: unsafe { &types_null as *const _ } },
wl_message { name: b"create_bar\0" as *const u8 as *const c_char, signature: b"n\0" as *const u8 as *const c_char, types: unsafe { &wl_foo_requests_create_bar_types as *const _ } },
];

pub static mut wl_foo_events: [wl_message; 1] = [
wl_message { name: b"cake\0" as *const u8 as *const c_char, signature: b"2uu\0" as *const u8 as *const c_char, types: unsafe { &types_null as *const _ } },
];

pub static mut wl_foo_interface: wl_interface = wl_interface {
name: b"wl_foo\0" as *const u8 as *const c_char,
version: 3,
request_count: 2,
requests: unsafe { &wl_foo_requests as *const _ },
event_count: 1,
events: unsafe { &wl_foo_events as *const _ },
};

// wl_bar
static mut wl_bar_requests_bar_delivery_types: [*const wl_interface; 3] = [
NULLPTR as *const wl_interface,
unsafe { &wl_foo_interface as *const wl_interface },
NULLPTR as *const wl_interface,
];

pub static mut wl_bar_requests: [wl_message; 2] = [
wl_message { name: b"bar_delivery\0" as *const u8 as *const c_char, signature: b"2uoa\0" as *const u8 as *const c_char, types: unsafe { &wl_bar_requests_bar_delivery_types as *const _ } },
wl_message { name: b"release\0" as *const u8 as *const c_char, signature: b"\0" as *const u8 as *const c_char, types: unsafe { &types_null as *const _ } },
];

pub static mut wl_bar_interface: wl_interface = wl_interface {
name: b"wl_bar\0" as *const u8 as *const c_char,
version: 1,
request_count: 2,
requests: unsafe { &wl_bar_requests as *const _ },
event_count: 0,
events: NULLPTR as *const wl_message,
};

// wl_display
pub static mut wl_display_interface: wl_interface = wl_interface {
name: b"wl_display\0" as *const u8 as *const c_char,
version: 1,
request_count: 0,
requests: NULLPTR as *const wl_message,
event_count: 0,
events: NULLPTR as *const wl_message,
};

// wl_registry

pub static mut wl_registry_requests: [wl_message; 1] = [
wl_message { name: b"bind\0" as *const u8 as *const c_char, signature: b"usun\0" as *const u8 as *const c_char, types: unsafe { &types_null as *const _ } },
];

pub static mut wl_registry_interface: wl_interface = wl_interface {
name: b"wl_registry\0" as *const u8 as *const c_char,
version: 1,
request_count: 1,
requests: unsafe { &wl_registry_requests as *const _ },
event_count: 0,
events: NULLPTR as *const wl_message,
};

// wl_callback

pub static mut wl_callback_events: [wl_message; 1] = [
wl_message { name: b"done\0" as *const u8 as *const c_char, signature: b"u\0" as *const u8 as *const c_char, types: unsafe { &types_null as *const _ } },
];

pub static mut wl_callback_interface: wl_interface = wl_interface {
name: b"wl_callback\0" as *const u8 as *const c_char,
version: 1,
request_count: 0,
requests: NULLPTR as *const wl_message,
event_count: 1,
events: unsafe { &wl_callback_events as *const _ },
};


Loading

0 comments on commit 99d1cb8

Please sign in to comment.