diff options
author | Christopher Chambers <chris.chambers@peanutcode.com> | 2014-12-31 16:25:15 -0600 |
---|---|---|
committer | Christopher Chambers <chris.chambers@peanutcode.com> | 2014-12-31 16:43:04 -0600 |
commit | fc0a9ab26a32344308d92407ec28ef43d155dc85 (patch) | |
tree | 192d0f36ccfa39ec0ba6c90bd624181bc66331d7 /tests/test_struct.rs | |
parent | 7fd76345505adde2eee8d63a92190f38d2a7c792 (diff) |
Adds Default impls for generated composites.
gen.rs
- Structs and unions now emit an implementation of the Default trait
using std::mem::zeroed to create a zeroed instance.
tests/support.rs
- AST comparisons are now done on the pretty-printed version of the
ASTs. Differences in AttrIds and some identifiers (generated with
gensym to ensure uniqueness) made it unreliable to compare the ASTs
directly. This way should work, even if it doesn't score many points
for style.
tests/*
- Updated to use Default::default() where appropriate.
- Eliminated a few warnings.
Diffstat (limited to 'tests/test_struct.rs')
-rw-r--r-- | tests/test_struct.rs | 66 |
1 files changed, 51 insertions, 15 deletions
diff --git a/tests/test_struct.rs b/tests/test_struct.rs index 2d30174c..c6f6836f 100644 --- a/tests/test_struct.rs +++ b/tests/test_struct.rs @@ -1,7 +1,9 @@ +use std::default::Default; + #[test] fn with_anon_struct() { mod ffi { bindgen!("headers/struct_with_anon_struct.h"); } - let mut x = ffi::Struct_foo { bar: ffi::Struct_Unnamed1 { a: 0, b: 0 } }; + let mut x: ffi::Struct_foo = Default::default(); x.bar.a = 1; x.bar.b = 2; @@ -13,10 +15,7 @@ fn with_anon_struct() { #[test] fn with_anon_struct_array() { mod ffi { bindgen!("headers/struct_with_anon_struct_array.h"); } - let mut x = ffi::Struct_foo { bar: [ - ffi::Struct_Unnamed1 { a: 0, b: 0 }, - ffi::Struct_Unnamed1 { a: 1, b: 1 } ] - }; + let mut x: ffi::Struct_foo = Default::default(); x.bar[1].a = 1; x.bar[1].b = 2; @@ -27,11 +26,13 @@ fn with_anon_struct_array() { #[test] fn with_anon_struct_pointer() { + #[allow(raw_pointer_deriving)] mod ffi { bindgen!("headers/struct_with_anon_struct_pointer.h"); } - let mut unnamed = box ffi::Struct_Unnamed1 { a: 0, b: 0 }; + let mut x: ffi::Struct_foo = Default::default(); + let mut unnamed: ffi::Struct_Unnamed1 = Default::default(); unsafe { - let mut x = ffi::Struct_foo { bar: ::std::mem::transmute(unnamed) }; + x.bar = &mut unnamed; (*x.bar).a = 1; (*x.bar).b = 2; @@ -46,7 +47,7 @@ fn with_anon_struct_pointer() { #[test] fn with_anon_union() { mod ffi { bindgen!("headers/struct_with_anon_union.h"); } - let mut x = ffi::Struct_foo { bar: ffi::Union_Unnamed1 { _bindgen_data_: [0] } }; + let mut x: ffi::Struct_foo = Default::default(); unsafe { *x.bar.a() = 0x12345678; @@ -58,7 +59,7 @@ fn with_anon_union() { #[test] fn with_anon_unnamed_struct() { mod ffi { bindgen!("headers/struct_with_anon_unnamed_struct.h"); } - let mut x = ffi::Struct_foo { _bindgen_data_1_: [0, 0] }; + let mut x: ffi::Struct_foo = Default::default(); unsafe { *x.a() = 0x12345678; @@ -71,7 +72,7 @@ fn with_anon_unnamed_struct() { #[test] fn with_anon_unnamed_union() { mod ffi { bindgen!("headers/struct_with_anon_unnamed_union.h"); } - let mut x = ffi::Struct_foo { _bindgen_data_1_: [0] }; + let mut x: ffi::Struct_foo = Default::default(); unsafe { *x.a() = 0x12345678; @@ -83,7 +84,7 @@ fn with_anon_unnamed_union() { #[test] fn with_nesting() { mod ffi { bindgen!("headers/struct_with_nesting.h"); } - let mut x = ffi::Struct_foo { a: 0, _bindgen_data_1_: [0] }; + let mut x: ffi::Struct_foo = Default::default(); unsafe { x.a = 0x12345678; @@ -111,12 +112,23 @@ fn containing_fwd_decl_struct() { } ), quote_item!(cx, + impl ::std::default::Default for Struct_a { + fn default() -> Struct_a { unsafe { ::std::mem::zeroed() } } + } + ), + quote_item!(cx, #[repr(C)] #[deriving(Copy)] pub struct Struct_b { pub val_b: ::libc::c_int, } - )); + ), + quote_item!(cx, + impl ::std::default::Default for Struct_b { + fn default() -> Struct_b { unsafe { ::std::mem::zeroed() } } + } + ) + ); } #[test] @@ -133,7 +145,13 @@ fn with_unnamed_bitfields() { pub unnamed_field2: ::libc::c_ushort, pub d: ::libc::c_ushort, } - )); + ), + quote_item!(cx, + impl ::std::default::Default for Struct_bitfield { + fn default() -> Struct_bitfield { unsafe { ::std::mem::zeroed() } } + } + ) + ); } #[test] @@ -143,6 +161,24 @@ fn with_fwd_decl_struct() { let a = ffi::Struct_a { b: 1 }; let c = ffi::Struct_c { d: 1 }; - a.b; - c.d; + assert_eq!(a.b, 1); + assert_eq!(c.d, 1); +} + +#[test] +fn default_impl() { + mod ffi { bindgen!("headers/struct_with_nesting.h"); } + + let mut x: ffi::Struct_foo = Default::default(); + + unsafe { + assert_eq!(x.a, 0); + assert_eq!(*x.b(), 0); + assert_eq!(*x.c1(), 0); + assert_eq!(*x.c2(), 0); + assert_eq!(*x.d1(), 0); + assert_eq!(*x.d2(), 0); + assert_eq!(*x.d3(), 0); + assert_eq!(*x.d4(), 0); + } } |