

#![cfg(test)]
#![allow(unused_imports)]

use {
    assert_matches::assert_matches,
    fidl::{AsHandleRef, Error, Handle, HandleDisposition, HandleInfo, HandleOp, ObjectType, Rights},
    fidl::encoding::{Context, Decode, Decoder, Encoder, WireFormatVersion},
    fidl_test_conformance as test_conformance,
    fuchsia_zircon_status::Status,
    fuchsia_zircon_types as zx_types,
    gidl_util::{
        HandleDef, HandleSubtype, copy_handle, create_handles, decode_value,
        get_handle_koid, get_info_handle_valid, repeat, select_handle_infos,
        select_raw_handle_infos, to_zx_handle_t, to_zx_handle_disposition_t,
    },
};

const _V2_CONTEXT: Context = Context { wire_format_version: WireFormatVersion::V2 };


#[test]
fn test_golden_bool_struct_v2_encode() {
    let value = test_conformance::GoldenBoolStruct { v: true };
    let mut bytes = Vec::new();
    let mut handle_dispositions = Vec::new();
    bytes.resize(65536, 0xcd); // fill with junk data
    Encoder::encode_with_context::<test_conformance::GoldenBoolStruct>(
        _V2_CONTEXT, &mut bytes, &mut handle_dispositions, & value).unwrap();
    assert_eq!(bytes, &[
0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
]);
    assert_eq!(handle_dispositions, &[]);
}

#[test]
fn test_golden_int_struct_v2_encode() {
    let value = test_conformance::GoldenIntStruct { v: 1i16 };
    let mut bytes = Vec::new();
    let mut handle_dispositions = Vec::new();
    bytes.resize(65536, 0xcd); // fill with junk data
    Encoder::encode_with_context::<test_conformance::GoldenIntStruct>(
        _V2_CONTEXT, &mut bytes, &mut handle_dispositions, & value).unwrap();
    assert_eq!(bytes, &[
0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
]);
    assert_eq!(handle_dispositions, &[]);
}

#[test]
fn test_golden_uint_struct_v2_encode() {
    let value = test_conformance::GoldenUintStruct { v: 1u16 };
    let mut bytes = Vec::new();
    let mut handle_dispositions = Vec::new();
    bytes.resize(65536, 0xcd); // fill with junk data
    Encoder::encode_with_context::<test_conformance::GoldenUintStruct>(
        _V2_CONTEXT, &mut bytes, &mut handle_dispositions, & value).unwrap();
    assert_eq!(bytes, &[
0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
]);
    assert_eq!(handle_dispositions, &[]);
}

#[test]
fn test_golden_float_struct_v2_encode() {
    let value = test_conformance::GoldenFloatStruct { v: 0f32 };
    let mut bytes = Vec::new();
    let mut handle_dispositions = Vec::new();
    bytes.resize(65536, 0xcd); // fill with junk data
    Encoder::encode_with_context::<test_conformance::GoldenFloatStruct>(
        _V2_CONTEXT, &mut bytes, &mut handle_dispositions, & value).unwrap();
    assert_eq!(bytes, &[
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
]);
    assert_eq!(handle_dispositions, &[]);
}

#[test]
fn test_golden_double_struct_v2_encode() {
    let value = test_conformance::GoldenDoubleStruct { v: 0f64 };
    let mut bytes = Vec::new();
    let mut handle_dispositions = Vec::new();
    bytes.resize(65536, 0xcd); // fill with junk data
    Encoder::encode_with_context::<test_conformance::GoldenDoubleStruct>(
        _V2_CONTEXT, &mut bytes, &mut handle_dispositions, & value).unwrap();
    assert_eq!(bytes, &[
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
]);
    assert_eq!(handle_dispositions, &[]);
}

#[test]
fn test_golden_string_struct_v2_encode() {
    let value = test_conformance::GoldenStringStruct { v: String::from("abcd") };
    let mut bytes = Vec::new();
    let mut handle_dispositions = Vec::new();
    bytes.resize(65536, 0xcd); // fill with junk data
    Encoder::encode_with_context::<test_conformance::GoldenStringStruct>(
        _V2_CONTEXT, &mut bytes, &mut handle_dispositions, & value).unwrap();
    assert_eq!(bytes, &[
0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0x61,0x62,0x63,0x64,0x00,0x00,0x00,0x00,
]);
    assert_eq!(handle_dispositions, &[]);
}

#[test]
fn test_golden_nullable_string_struct_non_null_v2_encode() {
    let value = test_conformance::GoldenNullableStringStruct { v: Some(String::from("abcd")) };
    let mut bytes = Vec::new();
    let mut handle_dispositions = Vec::new();
    bytes.resize(65536, 0xcd); // fill with junk data
    Encoder::encode_with_context::<test_conformance::GoldenNullableStringStruct>(
        _V2_CONTEXT, &mut bytes, &mut handle_dispositions, & value).unwrap();
    assert_eq!(bytes, &[
0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0x61,0x62,0x63,0x64,0x00,0x00,0x00,0x00,
]);
    assert_eq!(handle_dispositions, &[]);
}

#[test]
fn test_golden_nullable_string_struct_null_v2_encode() {
    let value = test_conformance::GoldenNullableStringStruct { v: None };
    let mut bytes = Vec::new();
    let mut handle_dispositions = Vec::new();
    bytes.resize(65536, 0xcd); // fill with junk data
    Encoder::encode_with_context::<test_conformance::GoldenNullableStringStruct>(
        _V2_CONTEXT, &mut bytes, &mut handle_dispositions, & value).unwrap();
    assert_eq!(bytes, &[
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
]);
    assert_eq!(handle_dispositions, &[]);
}

#[test]
fn test_golden_enum_struct_v2_encode() {
    let value = test_conformance::GoldenEnumStruct { v: test_conformance::GoldenEnum::from_primitive(1u16).unwrap() };
    let mut bytes = Vec::new();
    let mut handle_dispositions = Vec::new();
    bytes.resize(65536, 0xcd); // fill with junk data
    Encoder::encode_with_context::<test_conformance::GoldenEnumStruct>(
        _V2_CONTEXT, &mut bytes, &mut handle_dispositions, & value).unwrap();
    assert_eq!(bytes, &[
0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
]);
    assert_eq!(handle_dispositions, &[]);
}

#[test]
fn test_golden_bits_struct_v2_encode() {
    let value = test_conformance::GoldenBitsStruct { v: test_conformance::GoldenBits::from_bits_retain(1u16) };
    let mut bytes = Vec::new();
    let mut handle_dispositions = Vec::new();
    bytes.resize(65536, 0xcd); // fill with junk data
    Encoder::encode_with_context::<test_conformance::GoldenBitsStruct>(
        _V2_CONTEXT, &mut bytes, &mut handle_dispositions, & value).unwrap();
    assert_eq!(bytes, &[
0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
]);
    assert_eq!(handle_dispositions, &[]);
}

#[test]
fn test_golden_table_struct_v2_encode() {
    let value = test_conformance::GoldenTableStruct { v: test_conformance::GoldenTable { v: Some(1i16), ..Default::default() } };
    let mut bytes = Vec::new();
    let mut handle_dispositions = Vec::new();
    bytes.resize(65536, 0xcd); // fill with junk data
    Encoder::encode_with_context::<test_conformance::GoldenTableStruct>(
        _V2_CONTEXT, &mut bytes, &mut handle_dispositions, & value).unwrap();
    assert_eq!(bytes, &[
0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0x01,0x00,0x00,0x00,0x00,0x00,0x01,0x00,
]);
    assert_eq!(handle_dispositions, &[]);
}

#[test]
fn test_golden_union_struct_v2_encode() {
    let value = test_conformance::GoldenUnionStruct { v: test_conformance::GoldenUnion::V(1i16) };
    let mut bytes = Vec::new();
    let mut handle_dispositions = Vec::new();
    bytes.resize(65536, 0xcd); // fill with junk data
    Encoder::encode_with_context::<test_conformance::GoldenUnionStruct>(
        _V2_CONTEXT, &mut bytes, &mut handle_dispositions, & value).unwrap();
    assert_eq!(bytes, &[
0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x01,0x00,0x00,0x00,0x00,0x00,0x01,0x00,
]);
    assert_eq!(handle_dispositions, &[]);
}

#[test]
fn test_golden_nullable_union_struct_non_null_v2_encode() {
    let value = test_conformance::GoldenNullableUnionStruct { v: Some(Box::new(test_conformance::GoldenUnion::V(1i16))) };
    let mut bytes = Vec::new();
    let mut handle_dispositions = Vec::new();
    bytes.resize(65536, 0xcd); // fill with junk data
    Encoder::encode_with_context::<test_conformance::GoldenNullableUnionStruct>(
        _V2_CONTEXT, &mut bytes, &mut handle_dispositions, & value).unwrap();
    assert_eq!(bytes, &[
0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x01,0x00,0x00,0x00,0x00,0x00,0x01,0x00,
]);
    assert_eq!(handle_dispositions, &[]);
}

#[test]
fn test_golden_nullable_union_struct_null_v2_encode() {
    let value = test_conformance::GoldenNullableUnionStruct { v: None };
    let mut bytes = Vec::new();
    let mut handle_dispositions = Vec::new();
    bytes.resize(65536, 0xcd); // fill with junk data
    Encoder::encode_with_context::<test_conformance::GoldenNullableUnionStruct>(
        _V2_CONTEXT, &mut bytes, &mut handle_dispositions, & value).unwrap();
    assert_eq!(bytes, &[
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
]);
    assert_eq!(handle_dispositions, &[]);
}

#[test]
fn test_golden_byte_array_struct_v2_encode() {
    let value = test_conformance::GoldenByteArrayStruct { v: [1u8, 2u8, 3u8, 4u8] };
    let mut bytes = Vec::new();
    let mut handle_dispositions = Vec::new();
    bytes.resize(65536, 0xcd); // fill with junk data
    Encoder::encode_with_context::<test_conformance::GoldenByteArrayStruct>(
        _V2_CONTEXT, &mut bytes, &mut handle_dispositions, & value).unwrap();
    assert_eq!(bytes, &[
0x01,0x02,0x03,0x04,0x00,0x00,0x00,0x00,
]);
    assert_eq!(handle_dispositions, &[]);
}

#[test]
fn test_golden_struct_array_struct_v2_encode() {
    let value = test_conformance::GoldenStructArrayStruct { v: [test_conformance::GoldenIntStruct { v: 1i16 }, test_conformance::GoldenIntStruct { v: 2i16 }] };
    let mut bytes = Vec::new();
    let mut handle_dispositions = Vec::new();
    bytes.resize(65536, 0xcd); // fill with junk data
    Encoder::encode_with_context::<test_conformance::GoldenStructArrayStruct>(
        _V2_CONTEXT, &mut bytes, &mut handle_dispositions, & value).unwrap();
    assert_eq!(bytes, &[
0x01,0x00,0x02,0x00,0x00,0x00,0x00,0x00,
]);
    assert_eq!(handle_dispositions, &[]);
}

#[test]
fn test_golden_byte_vector_struct_v2_encode() {
    let value = test_conformance::GoldenByteVectorStruct { v: vec![1u8, 2u8, 3u8, 4u8, 1u8, 2u8, 3u8, 4u8, 1u8, 2u8, 3u8, 4u8] };
    let mut bytes = Vec::new();
    let mut handle_dispositions = Vec::new();
    bytes.resize(65536, 0xcd); // fill with junk data
    Encoder::encode_with_context::<test_conformance::GoldenByteVectorStruct>(
        _V2_CONTEXT, &mut bytes, &mut handle_dispositions, & value).unwrap();
    assert_eq!(bytes, &[
0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0x01,0x02,0x03,0x04,0x01,0x02,0x03,0x04,
0x01,0x02,0x03,0x04,0x00,0x00,0x00,0x00,
]);
    assert_eq!(handle_dispositions, &[]);
}

#[test]
fn test_golden_byte_nullable_vector_struct_non_null_v2_encode() {
    let value = test_conformance::GoldenNullableByteVectorStruct { v: Some(vec![1u8, 2u8, 3u8, 4u8]) };
    let mut bytes = Vec::new();
    let mut handle_dispositions = Vec::new();
    bytes.resize(65536, 0xcd); // fill with junk data
    Encoder::encode_with_context::<test_conformance::GoldenNullableByteVectorStruct>(
        _V2_CONTEXT, &mut bytes, &mut handle_dispositions, & value).unwrap();
    assert_eq!(bytes, &[
0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0x01,0x02,0x03,0x04,0x00,0x00,0x00,0x00,
]);
    assert_eq!(handle_dispositions, &[]);
}

#[test]
fn test_golden_nullable_byte_vector_struct_null_v2_encode() {
    let value = test_conformance::GoldenNullableByteVectorStruct { v: None };
    let mut bytes = Vec::new();
    let mut handle_dispositions = Vec::new();
    bytes.resize(65536, 0xcd); // fill with junk data
    Encoder::encode_with_context::<test_conformance::GoldenNullableByteVectorStruct>(
        _V2_CONTEXT, &mut bytes, &mut handle_dispositions, & value).unwrap();
    assert_eq!(bytes, &[
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
]);
    assert_eq!(handle_dispositions, &[]);
}

#[test]
fn test_golden_struct_vector_struct_v2_encode() {
    let value = test_conformance::GoldenStructVectorStruct { v: vec![test_conformance::GoldenIntStruct { v: 1i16 }, test_conformance::GoldenIntStruct { v: 2i16 }] };
    let mut bytes = Vec::new();
    let mut handle_dispositions = Vec::new();
    bytes.resize(65536, 0xcd); // fill with junk data
    Encoder::encode_with_context::<test_conformance::GoldenStructVectorStruct>(
        _V2_CONTEXT, &mut bytes, &mut handle_dispositions, & value).unwrap();
    assert_eq!(bytes, &[
0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0x01,0x00,0x02,0x00,0x00,0x00,0x00,0x00,
]);
    assert_eq!(handle_dispositions, &[]);
}

#[test]
fn test_golden_nullable_struct_non_null_v2_encode() {
    let value = test_conformance::GoldenNullableStruct { v: Some(Box::new(test_conformance::GoldenBoolStruct { v: true })) };
    let mut bytes = Vec::new();
    let mut handle_dispositions = Vec::new();
    bytes.resize(65536, 0xcd); // fill with junk data
    Encoder::encode_with_context::<test_conformance::GoldenNullableStruct>(
        _V2_CONTEXT, &mut bytes, &mut handle_dispositions, & value).unwrap();
    assert_eq!(bytes, &[
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
]);
    assert_eq!(handle_dispositions, &[]);
}

#[test]
fn test_golden_nullable_struct_null_v2_encode() {
    let value = test_conformance::GoldenNullableStruct { v: None };
    let mut bytes = Vec::new();
    let mut handle_dispositions = Vec::new();
    bytes.resize(65536, 0xcd); // fill with junk data
    Encoder::encode_with_context::<test_conformance::GoldenNullableStruct>(
        _V2_CONTEXT, &mut bytes, &mut handle_dispositions, & value).unwrap();
    assert_eq!(bytes, &[
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
]);
    assert_eq!(handle_dispositions, &[]);
}

#[test]
fn test_golden_handle_basic_rights_struct_v2_encode() {
    let handle_defs = create_handles(&[
// #0
HandleDef{
	subtype: HandleSubtype::Channel,
	rights: Rights::from_bits(61454).unwrap(),
},
]);
    let mut value = test_conformance::GoldenHandleBasicRightsStruct { v: copy_handle(&handle_defs[0]) };
    let mut bytes = Vec::new();
    let mut handle_dispositions = Vec::new();
    bytes.resize(65536, 0xcd); // fill with junk data
    Encoder::encode_with_context::<test_conformance::GoldenHandleBasicRightsStruct>(
        _V2_CONTEXT, &mut bytes, &mut handle_dispositions, &mut  value).unwrap();
    assert_eq!(bytes, &[
0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,
]);
    assert_eq!(
        handle_dispositions.iter().map(to_zx_handle_disposition_t).collect::<Vec<_>>(),
        &[
zx_types::zx_handle_disposition_t {
   operation: zx_types::ZX_HANDLE_OP_MOVE,
   handle: handle_defs[0].handle,
   type_: 5,
   rights: 49155,
   result: zx_types::ZX_OK,
},]
    );
}

#[test]
fn test_golden_nullable_handle_struct_non_null_v2_encode() {
    let handle_defs = create_handles(&[
// #0
HandleDef{
	subtype: HandleSubtype::Event,
	rights: Rights::from_bits(2147483648).unwrap(),
},
]);
    let mut value = test_conformance::GoldenNullableHandleStruct { v: Some(copy_handle(&handle_defs[0])) };
    let mut bytes = Vec::new();
    let mut handle_dispositions = Vec::new();
    bytes.resize(65536, 0xcd); // fill with junk data
    Encoder::encode_with_context::<test_conformance::GoldenNullableHandleStruct>(
        _V2_CONTEXT, &mut bytes, &mut handle_dispositions, &mut  value).unwrap();
    assert_eq!(bytes, &[
0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,
]);
    assert_eq!(
        handle_dispositions.iter().map(to_zx_handle_t).collect::<Vec<_>>(),
        &[handle_defs[0].handle,
]
    );
}

#[test]
fn test_golden_nullable_handle_struct_null_v2_encode() {
    let mut value = test_conformance::GoldenNullableHandleStruct { v: None };
    let mut bytes = Vec::new();
    let mut handle_dispositions = Vec::new();
    bytes.resize(65536, 0xcd); // fill with junk data
    Encoder::encode_with_context::<test_conformance::GoldenNullableHandleStruct>(
        _V2_CONTEXT, &mut bytes, &mut handle_dispositions, &mut  value).unwrap();
    assert_eq!(bytes, &[
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
]);
    assert_eq!(handle_dispositions, &[]);
}

#[test]
fn test_golden_handle_basic_rights_struct_re_encode_v2_encode() {
    let handle_defs = create_handles(&[
// #0
HandleDef{
	subtype: HandleSubtype::Event,
	rights: Rights::from_bits(49155).unwrap(),
},
]);
    let mut value = decode_value::<test_conformance::GoldenHandleBasicRightsStruct>(_V2_CONTEXT, &[
0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,
], &mut select_handle_infos(&handle_defs, &[
0,]));
    let mut bytes = Vec::new();
    let mut handle_dispositions = Vec::new();
    bytes.resize(65536, 0xcd); // fill with junk data
    Encoder::encode_with_context::<test_conformance::GoldenHandleBasicRightsStruct>(
        _V2_CONTEXT, &mut bytes, &mut handle_dispositions, &mut  value).unwrap();
    assert_eq!(bytes, &[
0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,
]);
    assert_eq!(
        handle_dispositions.iter().map(to_zx_handle_disposition_t).collect::<Vec<_>>(),
        &[
zx_types::zx_handle_disposition_t {
   operation: zx_types::ZX_HANDLE_OP_MOVE,
   handle: handle_defs[0].handle,
   type_: 5,
   rights: 49155,
   result: zx_types::ZX_OK,
},]
    );
}



#[test]
fn test_golden_bool_struct_v2_decode() {
    let bytes = &[
0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
];
    let mut handle_infos = Vec::new();
    let mut value = fidl::new_empty!(test_conformance::GoldenBoolStruct);
    Decoder::decode_with_context::<test_conformance::GoldenBoolStruct>(_V2_CONTEXT, bytes, &mut handle_infos, &mut value).unwrap();
    assert_eq!(value, test_conformance::GoldenBoolStruct { v: true });

}

#[test]
fn test_golden_int_struct_v2_decode() {
    let bytes = &[
0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
];
    let mut handle_infos = Vec::new();
    let mut value = fidl::new_empty!(test_conformance::GoldenIntStruct);
    Decoder::decode_with_context::<test_conformance::GoldenIntStruct>(_V2_CONTEXT, bytes, &mut handle_infos, &mut value).unwrap();
    assert_eq!(value, test_conformance::GoldenIntStruct { v: 1i16 });

}

#[test]
fn test_golden_uint_struct_v2_decode() {
    let bytes = &[
0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
];
    let mut handle_infos = Vec::new();
    let mut value = fidl::new_empty!(test_conformance::GoldenUintStruct);
    Decoder::decode_with_context::<test_conformance::GoldenUintStruct>(_V2_CONTEXT, bytes, &mut handle_infos, &mut value).unwrap();
    assert_eq!(value, test_conformance::GoldenUintStruct { v: 1u16 });

}

#[test]
fn test_golden_float_struct_v2_decode() {
    let bytes = &[
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
];
    let mut handle_infos = Vec::new();
    let mut value = fidl::new_empty!(test_conformance::GoldenFloatStruct);
    Decoder::decode_with_context::<test_conformance::GoldenFloatStruct>(_V2_CONTEXT, bytes, &mut handle_infos, &mut value).unwrap();
    assert_eq!(value, test_conformance::GoldenFloatStruct { v: 0f32 });

}

#[test]
fn test_golden_double_struct_v2_decode() {
    let bytes = &[
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
];
    let mut handle_infos = Vec::new();
    let mut value = fidl::new_empty!(test_conformance::GoldenDoubleStruct);
    Decoder::decode_with_context::<test_conformance::GoldenDoubleStruct>(_V2_CONTEXT, bytes, &mut handle_infos, &mut value).unwrap();
    assert_eq!(value, test_conformance::GoldenDoubleStruct { v: 0f64 });

}

#[test]
fn test_golden_string_struct_v2_decode() {
    let bytes = &[
0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0x61,0x62,0x63,0x64,0x00,0x00,0x00,0x00,
];
    let mut handle_infos = Vec::new();
    let mut value = fidl::new_empty!(test_conformance::GoldenStringStruct);
    Decoder::decode_with_context::<test_conformance::GoldenStringStruct>(_V2_CONTEXT, bytes, &mut handle_infos, &mut value).unwrap();
    assert_eq!(value, test_conformance::GoldenStringStruct { v: String::from("abcd") });

}

#[test]
fn test_golden_nullable_string_struct_non_null_v2_decode() {
    let bytes = &[
0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0x61,0x62,0x63,0x64,0x00,0x00,0x00,0x00,
];
    let mut handle_infos = Vec::new();
    let mut value = fidl::new_empty!(test_conformance::GoldenNullableStringStruct);
    Decoder::decode_with_context::<test_conformance::GoldenNullableStringStruct>(_V2_CONTEXT, bytes, &mut handle_infos, &mut value).unwrap();
    assert_eq!(value, test_conformance::GoldenNullableStringStruct { v: Some(String::from("abcd")) });

}

#[test]
fn test_golden_nullable_string_struct_null_v2_decode() {
    let bytes = &[
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
];
    let mut handle_infos = Vec::new();
    let mut value = fidl::new_empty!(test_conformance::GoldenNullableStringStruct);
    Decoder::decode_with_context::<test_conformance::GoldenNullableStringStruct>(_V2_CONTEXT, bytes, &mut handle_infos, &mut value).unwrap();
    assert_eq!(value, test_conformance::GoldenNullableStringStruct { v: None });

}

#[test]
fn test_golden_enum_struct_v2_decode() {
    let bytes = &[
0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
];
    let mut handle_infos = Vec::new();
    let mut value = fidl::new_empty!(test_conformance::GoldenEnumStruct);
    Decoder::decode_with_context::<test_conformance::GoldenEnumStruct>(_V2_CONTEXT, bytes, &mut handle_infos, &mut value).unwrap();
    assert_eq!(value, test_conformance::GoldenEnumStruct { v: test_conformance::GoldenEnum::from_primitive(1u16).unwrap() });

}

#[test]
fn test_golden_bits_struct_v2_decode() {
    let bytes = &[
0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
];
    let mut handle_infos = Vec::new();
    let mut value = fidl::new_empty!(test_conformance::GoldenBitsStruct);
    Decoder::decode_with_context::<test_conformance::GoldenBitsStruct>(_V2_CONTEXT, bytes, &mut handle_infos, &mut value).unwrap();
    assert_eq!(value, test_conformance::GoldenBitsStruct { v: test_conformance::GoldenBits::from_bits_retain(1u16) });

}

#[test]
fn test_golden_table_struct_v2_decode() {
    let bytes = &[
0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0x01,0x00,0x00,0x00,0x00,0x00,0x01,0x00,
];
    let mut handle_infos = Vec::new();
    let mut value = fidl::new_empty!(test_conformance::GoldenTableStruct);
    Decoder::decode_with_context::<test_conformance::GoldenTableStruct>(_V2_CONTEXT, bytes, &mut handle_infos, &mut value).unwrap();
    assert_eq!(value, test_conformance::GoldenTableStruct { v: test_conformance::GoldenTable { v: Some(1i16), ..Default::default() } });

}

#[test]
fn test_golden_union_struct_v2_decode() {
    let bytes = &[
0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x01,0x00,0x00,0x00,0x00,0x00,0x01,0x00,
];
    let mut handle_infos = Vec::new();
    let mut value = fidl::new_empty!(test_conformance::GoldenUnionStruct);
    Decoder::decode_with_context::<test_conformance::GoldenUnionStruct>(_V2_CONTEXT, bytes, &mut handle_infos, &mut value).unwrap();
    assert_eq!(value, test_conformance::GoldenUnionStruct { v: test_conformance::GoldenUnion::V(1i16) });

}

#[test]
fn test_golden_nullable_union_struct_non_null_v2_decode() {
    let bytes = &[
0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x01,0x00,0x00,0x00,0x00,0x00,0x01,0x00,
];
    let mut handle_infos = Vec::new();
    let mut value = fidl::new_empty!(test_conformance::GoldenNullableUnionStruct);
    Decoder::decode_with_context::<test_conformance::GoldenNullableUnionStruct>(_V2_CONTEXT, bytes, &mut handle_infos, &mut value).unwrap();
    assert_eq!(value, test_conformance::GoldenNullableUnionStruct { v: Some(Box::new(test_conformance::GoldenUnion::V(1i16))) });

}

#[test]
fn test_golden_nullable_union_struct_null_v2_decode() {
    let bytes = &[
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
];
    let mut handle_infos = Vec::new();
    let mut value = fidl::new_empty!(test_conformance::GoldenNullableUnionStruct);
    Decoder::decode_with_context::<test_conformance::GoldenNullableUnionStruct>(_V2_CONTEXT, bytes, &mut handle_infos, &mut value).unwrap();
    assert_eq!(value, test_conformance::GoldenNullableUnionStruct { v: None });

}

#[test]
fn test_golden_byte_array_struct_v2_decode() {
    let bytes = &[
0x01,0x02,0x03,0x04,0x00,0x00,0x00,0x00,
];
    let mut handle_infos = Vec::new();
    let mut value = fidl::new_empty!(test_conformance::GoldenByteArrayStruct);
    Decoder::decode_with_context::<test_conformance::GoldenByteArrayStruct>(_V2_CONTEXT, bytes, &mut handle_infos, &mut value).unwrap();
    assert_eq!(value, test_conformance::GoldenByteArrayStruct { v: [1u8, 2u8, 3u8, 4u8] });

}

#[test]
fn test_golden_struct_array_struct_v2_decode() {
    let bytes = &[
0x01,0x00,0x02,0x00,0x00,0x00,0x00,0x00,
];
    let mut handle_infos = Vec::new();
    let mut value = fidl::new_empty!(test_conformance::GoldenStructArrayStruct);
    Decoder::decode_with_context::<test_conformance::GoldenStructArrayStruct>(_V2_CONTEXT, bytes, &mut handle_infos, &mut value).unwrap();
    assert_eq!(value, test_conformance::GoldenStructArrayStruct { v: [test_conformance::GoldenIntStruct { v: 1i16 }, test_conformance::GoldenIntStruct { v: 2i16 }] });

}

#[test]
fn test_golden_byte_vector_struct_v2_decode() {
    let bytes = &[
0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0x01,0x02,0x03,0x04,0x01,0x02,0x03,0x04,
0x01,0x02,0x03,0x04,0x00,0x00,0x00,0x00,
];
    let mut handle_infos = Vec::new();
    let mut value = fidl::new_empty!(test_conformance::GoldenByteVectorStruct);
    Decoder::decode_with_context::<test_conformance::GoldenByteVectorStruct>(_V2_CONTEXT, bytes, &mut handle_infos, &mut value).unwrap();
    assert_eq!(value, test_conformance::GoldenByteVectorStruct { v: vec![1u8, 2u8, 3u8, 4u8, 1u8, 2u8, 3u8, 4u8, 1u8, 2u8, 3u8, 4u8] });

}

#[test]
fn test_golden_byte_nullable_vector_struct_non_null_v2_decode() {
    let bytes = &[
0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0x01,0x02,0x03,0x04,0x00,0x00,0x00,0x00,
];
    let mut handle_infos = Vec::new();
    let mut value = fidl::new_empty!(test_conformance::GoldenNullableByteVectorStruct);
    Decoder::decode_with_context::<test_conformance::GoldenNullableByteVectorStruct>(_V2_CONTEXT, bytes, &mut handle_infos, &mut value).unwrap();
    assert_eq!(value, test_conformance::GoldenNullableByteVectorStruct { v: Some(vec![1u8, 2u8, 3u8, 4u8]) });

}

#[test]
fn test_golden_nullable_byte_vector_struct_null_v2_decode() {
    let bytes = &[
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
];
    let mut handle_infos = Vec::new();
    let mut value = fidl::new_empty!(test_conformance::GoldenNullableByteVectorStruct);
    Decoder::decode_with_context::<test_conformance::GoldenNullableByteVectorStruct>(_V2_CONTEXT, bytes, &mut handle_infos, &mut value).unwrap();
    assert_eq!(value, test_conformance::GoldenNullableByteVectorStruct { v: None });

}

#[test]
fn test_golden_struct_vector_struct_v2_decode() {
    let bytes = &[
0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0x01,0x00,0x02,0x00,0x00,0x00,0x00,0x00,
];
    let mut handle_infos = Vec::new();
    let mut value = fidl::new_empty!(test_conformance::GoldenStructVectorStruct);
    Decoder::decode_with_context::<test_conformance::GoldenStructVectorStruct>(_V2_CONTEXT, bytes, &mut handle_infos, &mut value).unwrap();
    assert_eq!(value, test_conformance::GoldenStructVectorStruct { v: vec![test_conformance::GoldenIntStruct { v: 1i16 }, test_conformance::GoldenIntStruct { v: 2i16 }] });

}

#[test]
fn test_golden_nullable_struct_non_null_v2_decode() {
    let bytes = &[
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
];
    let mut handle_infos = Vec::new();
    let mut value = fidl::new_empty!(test_conformance::GoldenNullableStruct);
    Decoder::decode_with_context::<test_conformance::GoldenNullableStruct>(_V2_CONTEXT, bytes, &mut handle_infos, &mut value).unwrap();
    assert_eq!(value, test_conformance::GoldenNullableStruct { v: Some(Box::new(test_conformance::GoldenBoolStruct { v: true })) });

}

#[test]
fn test_golden_nullable_struct_null_v2_decode() {
    let bytes = &[
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
];
    let mut handle_infos = Vec::new();
    let mut value = fidl::new_empty!(test_conformance::GoldenNullableStruct);
    Decoder::decode_with_context::<test_conformance::GoldenNullableStruct>(_V2_CONTEXT, bytes, &mut handle_infos, &mut value).unwrap();
    assert_eq!(value, test_conformance::GoldenNullableStruct { v: None });

}

#[test]
fn test_golden_handle_basic_rights_struct_v2_decode() {
    let bytes = &[
0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,
];
    let handle_defs = create_handles(&[
// #0
HandleDef{
	subtype: HandleSubtype::Event,
	rights: Rights::from_bits(53251).unwrap(),
},
]);
    let _handle_koids = handle_defs.iter().map(get_handle_koid).collect::<Vec<_>>();
    let mut handle_infos = select_handle_infos(&handle_defs, &[
0,]);
    let mut value = fidl::new_empty!(test_conformance::GoldenHandleBasicRightsStruct);
    Decoder::decode_with_context::<test_conformance::GoldenHandleBasicRightsStruct>(_V2_CONTEXT, bytes, &mut handle_infos, &mut value).unwrap();
    
match value.v.basic_info() {
	Ok(info) => {
		assert_eq!(info.koid.raw_koid(), _handle_koids[0]);
		assert_eq!(info.object_type, fidl::ObjectType::EVENT);
		assert_eq!(info.rights, Rights::from_bits(49155).unwrap());
	},
	Err(e) => panic!("handle basic_info failed: {}", e),
}


}

#[test]
fn test_golden_nullable_handle_struct_non_null_v2_decode() {
    let bytes = &[
0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,
];
    let handle_defs = create_handles(&[
// #0
HandleDef{
	subtype: HandleSubtype::Event,
	rights: Rights::from_bits(2147483648).unwrap(),
},
]);
    let _handle_koids = handle_defs.iter().map(get_handle_koid).collect::<Vec<_>>();
    let mut handle_infos = select_handle_infos(&handle_defs, &[
0,]);
    let mut value = fidl::new_empty!(test_conformance::GoldenNullableHandleStruct);
    Decoder::decode_with_context::<test_conformance::GoldenNullableHandleStruct>(_V2_CONTEXT, bytes, &mut handle_infos, &mut value).unwrap();
    assert_eq!(value.v.as_ref().unwrap().basic_info().unwrap().koid.raw_koid(), _handle_koids[0]);

}

#[test]
fn test_golden_nullable_handle_struct_null_v2_decode() {
    let bytes = &[
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
];
    let mut handle_infos = Vec::new();
    let mut value = fidl::new_empty!(test_conformance::GoldenNullableHandleStruct);
    Decoder::decode_with_context::<test_conformance::GoldenNullableHandleStruct>(_V2_CONTEXT, bytes, &mut handle_infos, &mut value).unwrap();
    assert_eq!(value, test_conformance::GoldenNullableHandleStruct { v: None });

}

#[test]
fn test_golden_table_unknown_dropped_v2_decode() {
    let bytes = &[
0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xff,0xff,0xff,0xff,0x01,0x00,0x01,0x00,
];
    let handle_defs = create_handles(&[
// #0
HandleDef{
	subtype: HandleSubtype::Event,
	rights: Rights::from_bits(2147483648).unwrap(),
},
]);
    let _handle_koids = handle_defs.iter().map(get_handle_koid).collect::<Vec<_>>();
    let mut handle_infos = select_handle_infos(&handle_defs, &[
0,]);
    let mut value = fidl::new_empty!(test_conformance::GoldenTableStruct);
    Decoder::decode_with_context::<test_conformance::GoldenTableStruct>(_V2_CONTEXT, bytes, &mut handle_infos, &mut value).unwrap();
    assert_eq!(value, test_conformance::GoldenTableStruct { v: test_conformance::GoldenTable { ..Default::default() } });

    let unused_handles = select_raw_handle_infos(&handle_defs, &[
0,]);
    assert_eq!(
        unused_handles.iter().map(get_info_handle_valid).collect::<Vec<_>>(),
        repeat(Err(Status::BAD_HANDLE), unused_handles.len()),
    );
}



#[test]
fn test_golden_string_with_max_size2_v2_encode_failure() {
    let value = test_conformance::GoldenStringWithMaxSize2 { s: String::from("abc") };
    let mut bytes = Vec::new();
    let mut handles = Vec::new();
    bytes.resize(65536, 0xcd); // fill with junk data
    match Encoder::encode_with_context::<test_conformance::GoldenStringWithMaxSize2>(
        _V2_CONTEXT, &mut bytes, &mut handles, &value
    ) {
        Err(err) => assert_matches!(err, Error::StringTooLong { .. }),
        Ok(_) => panic!("unexpected successful encoding"),
    }
}



#[test]
fn test_golden_string_struct_null_body_v2_decode_failure() {
    let bytes = &[
0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
];
    let mut handle_infos = Vec::new();
    let mut value = fidl::new_empty!(test_conformance::GoldenStringStruct);
    match Decoder::decode_with_context::<test_conformance::GoldenStringStruct>(_V2_CONTEXT, bytes, &mut handle_infos, &mut value) {
        Err(err) => assert_matches!(err, Error::UnexpectedNullRef { .. }),
        Ok(_) => panic!("unexpected successful decoding"),
    }
}

