

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

use {
    assert_matches::assert_matches,
    fidl::{AsHandleRef, Handle, HandleDisposition, HandleInfo, HandleOp, ObjectType, Rights},
    fidl::encoding::{Context, Decode, Decoder, Encoder, WireFormatVersion},
    fidl_codec::{Value, Error},
    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,
    },
};

fn ns() -> &'static fidl_codec::library::Namespace {
    static FIDL_JSON: &str = include_str!(env!("CONFORMANCE_JSON_PATH"));
    static NS: std::sync::OnceLock<fidl_codec::library::Namespace> = std::sync::OnceLock::new();
    NS.get_or_init(|| {
        let mut ns = fidl_codec::library::Namespace::new();
        ns.load(FIDL_JSON).unwrap();
        ns
    })
}


#[test]
fn test_golden_bool_struct_v2_encode() {
    let (bytes, handle_dispositions) = fidl_codec::encode(ns(), "test.conformance/GoldenBoolStruct", false, Value::Object(vec![("v".to_owned(), Value::Bool(true))])).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 (bytes, handle_dispositions) = fidl_codec::encode(ns(), "test.conformance/GoldenIntStruct", false, Value::Object(vec![("v".to_owned(), Value::I16(1i16))])).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 (bytes, handle_dispositions) = fidl_codec::encode(ns(), "test.conformance/GoldenUintStruct", false, Value::Object(vec![("v".to_owned(), Value::U16(1u16))])).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 (bytes, handle_dispositions) = fidl_codec::encode(ns(), "test.conformance/GoldenFloatStruct", false, Value::Object(vec![("v".to_owned(), Value::F32(0f32))])).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 (bytes, handle_dispositions) = fidl_codec::encode(ns(), "test.conformance/GoldenDoubleStruct", false, Value::Object(vec![("v".to_owned(), Value::F64(0f64))])).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 (bytes, handle_dispositions) = fidl_codec::encode(ns(), "test.conformance/GoldenStringStruct", false, Value::Object(vec![("v".to_owned(), Value::String(String::from("abcd")))])).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 (bytes, handle_dispositions) = fidl_codec::encode(ns(), "test.conformance/GoldenNullableStringStruct", false, Value::Object(vec![("v".to_owned(), Value::String(String::from("abcd")))])).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 (bytes, handle_dispositions) = fidl_codec::encode(ns(), "test.conformance/GoldenNullableStringStruct", false, Value::Object(vec![("v".to_owned(), Value::Null)])).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 (bytes, handle_dispositions) = fidl_codec::encode(ns(), "test.conformance/GoldenEnumStruct", false, Value::Object(vec![("v".to_owned(), Value::Enum("test.conformance/GoldenEnum".to_owned(), Box::new(Value::U16(1u16))))])).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 (bytes, handle_dispositions) = fidl_codec::encode(ns(), "test.conformance/GoldenBitsStruct", false, Value::Object(vec![("v".to_owned(), Value::Bits("test.conformance/GoldenBits".to_owned(), Box::new(Value::U16(1u16))))])).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 (bytes, handle_dispositions) = fidl_codec::encode(ns(), "test.conformance/GoldenTableStruct", false, Value::Object(vec![("v".to_owned(), Value::Object(vec![("v".to_owned(), Value::I16(1i16))]))])).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 (bytes, handle_dispositions) = fidl_codec::encode(ns(), "test.conformance/GoldenUnionStruct", false, Value::Object(vec![("v".to_owned(), Value::Union("test.conformance/GoldenUnion".to_owned(), "v".to_owned(), Box::new(Value::I16(1i16))))])).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 (bytes, handle_dispositions) = fidl_codec::encode(ns(), "test.conformance/GoldenNullableUnionStruct", false, Value::Object(vec![("v".to_owned(), Value::Union("test.conformance/GoldenUnion".to_owned(), "v".to_owned(), Box::new(Value::I16(1i16))))])).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 (bytes, handle_dispositions) = fidl_codec::encode(ns(), "test.conformance/GoldenNullableUnionStruct", false, Value::Object(vec![("v".to_owned(), Value::Null)])).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 (bytes, handle_dispositions) = fidl_codec::encode(ns(), "test.conformance/GoldenByteArrayStruct", false, Value::Object(vec![("v".to_owned(), Value::List(vec![Value::U8(1u8), Value::U8(2u8), Value::U8(3u8), Value::U8(4u8)]))])).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 (bytes, handle_dispositions) = fidl_codec::encode(ns(), "test.conformance/GoldenStructArrayStruct", false, Value::Object(vec![("v".to_owned(), Value::List(vec![Value::Object(vec![("v".to_owned(), Value::I16(1i16))]), Value::Object(vec![("v".to_owned(), Value::I16(2i16))])]))])).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 (bytes, handle_dispositions) = fidl_codec::encode(ns(), "test.conformance/GoldenByteVectorStruct", false, Value::Object(vec![("v".to_owned(), Value::List(vec![Value::U8(1u8), Value::U8(2u8), Value::U8(3u8), Value::U8(4u8), Value::U8(1u8), Value::U8(2u8), Value::U8(3u8), Value::U8(4u8), Value::U8(1u8), Value::U8(2u8), Value::U8(3u8), Value::U8(4u8)]))])).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 (bytes, handle_dispositions) = fidl_codec::encode(ns(), "test.conformance/GoldenNullableByteVectorStruct", false, Value::Object(vec![("v".to_owned(), Value::List(vec![Value::U8(1u8), Value::U8(2u8), Value::U8(3u8), Value::U8(4u8)]))])).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 (bytes, handle_dispositions) = fidl_codec::encode(ns(), "test.conformance/GoldenNullableByteVectorStruct", false, Value::Object(vec![("v".to_owned(), Value::Null)])).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 (bytes, handle_dispositions) = fidl_codec::encode(ns(), "test.conformance/GoldenStructVectorStruct", false, Value::Object(vec![("v".to_owned(), Value::List(vec![Value::Object(vec![("v".to_owned(), Value::I16(1i16))]), Value::Object(vec![("v".to_owned(), Value::I16(2i16))])]))])).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 (bytes, handle_dispositions) = fidl_codec::encode(ns(), "test.conformance/GoldenNullableStruct", false, Value::Object(vec![("v".to_owned(), Value::Object(vec![("v".to_owned(), Value::Bool(true))]))])).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 (bytes, handle_dispositions) = fidl_codec::encode(ns(), "test.conformance/GoldenNullableStruct", false, Value::Object(vec![("v".to_owned(), Value::Null)])).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 (bytes, handle_dispositions) = fidl_codec::encode(ns(), "test.conformance/GoldenHandleBasicRightsStruct", false, Value::Object(vec![("v".to_owned(), Value::Handle(copy_handle(&handle_defs[0]), fidl::ObjectType::EVENT))])).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 (bytes, handle_dispositions) = fidl_codec::encode(ns(), "test.conformance/GoldenNullableHandleStruct", false, Value::Object(vec![("v".to_owned(), Value::Handle(copy_handle(&handle_defs[0]), fidl::ObjectType::NONE))])).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 (bytes, handle_dispositions) = fidl_codec::encode(ns(), "test.conformance/GoldenNullableHandleStruct", false, Value::Object(vec![("v".to_owned(), Value::Null)])).unwrap();
    assert_eq!(bytes, &[
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
]);
    assert_eq!(handle_dispositions, &[]);
}



#[test]
fn test_golden_bool_struct_v2_decode() {
    let bytes = &[
0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
];
    let handle_infos = Vec::new();
    let confirm_value = Value::Object(vec![("v".to_owned(), Value::Bool(true))]);
    let value = fidl_codec::decode(ns(), "test.conformance/GoldenBoolStruct", bytes, handle_infos).unwrap();
    assert_eq!(value, confirm_value);
}

#[test]
fn test_golden_int_struct_v2_decode() {
    let bytes = &[
0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
];
    let handle_infos = Vec::new();
    let confirm_value = Value::Object(vec![("v".to_owned(), Value::I16(1i16))]);
    let value = fidl_codec::decode(ns(), "test.conformance/GoldenIntStruct", bytes, handle_infos).unwrap();
    assert_eq!(value, confirm_value);
}

#[test]
fn test_golden_uint_struct_v2_decode() {
    let bytes = &[
0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
];
    let handle_infos = Vec::new();
    let confirm_value = Value::Object(vec![("v".to_owned(), Value::U16(1u16))]);
    let value = fidl_codec::decode(ns(), "test.conformance/GoldenUintStruct", bytes, handle_infos).unwrap();
    assert_eq!(value, confirm_value);
}

#[test]
fn test_golden_float_struct_v2_decode() {
    let bytes = &[
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
];
    let handle_infos = Vec::new();
    let confirm_value = Value::Object(vec![("v".to_owned(), Value::F32(0f32))]);
    let value = fidl_codec::decode(ns(), "test.conformance/GoldenFloatStruct", bytes, handle_infos).unwrap();
    assert_eq!(value, confirm_value);
}

#[test]
fn test_golden_double_struct_v2_decode() {
    let bytes = &[
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
];
    let handle_infos = Vec::new();
    let confirm_value = Value::Object(vec![("v".to_owned(), Value::F64(0f64))]);
    let value = fidl_codec::decode(ns(), "test.conformance/GoldenDoubleStruct", bytes, handle_infos).unwrap();
    assert_eq!(value, confirm_value);
}

#[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 handle_infos = Vec::new();
    let confirm_value = Value::Object(vec![("v".to_owned(), Value::String(String::from("abcd")))]);
    let value = fidl_codec::decode(ns(), "test.conformance/GoldenStringStruct", bytes, handle_infos).unwrap();
    assert_eq!(value, confirm_value);
}

#[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 handle_infos = Vec::new();
    let confirm_value = Value::Object(vec![("v".to_owned(), Value::String(String::from("abcd")))]);
    let value = fidl_codec::decode(ns(), "test.conformance/GoldenNullableStringStruct", bytes, handle_infos).unwrap();
    assert_eq!(value, confirm_value);
}

#[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 handle_infos = Vec::new();
    let confirm_value = Value::Object(vec![("v".to_owned(), Value::Null)]);
    let value = fidl_codec::decode(ns(), "test.conformance/GoldenNullableStringStruct", bytes, handle_infos).unwrap();
    assert_eq!(value, confirm_value);
}

#[test]
fn test_golden_enum_struct_v2_decode() {
    let bytes = &[
0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
];
    let handle_infos = Vec::new();
    let confirm_value = Value::Object(vec![("v".to_owned(), Value::Enum("test.conformance/GoldenEnum".to_owned(), Box::new(Value::U16(1u16))))]);
    let value = fidl_codec::decode(ns(), "test.conformance/GoldenEnumStruct", bytes, handle_infos).unwrap();
    assert_eq!(value, confirm_value);
}

#[test]
fn test_golden_bits_struct_v2_decode() {
    let bytes = &[
0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
];
    let handle_infos = Vec::new();
    let confirm_value = Value::Object(vec![("v".to_owned(), Value::Bits("test.conformance/GoldenBits".to_owned(), Box::new(Value::U16(1u16))))]);
    let value = fidl_codec::decode(ns(), "test.conformance/GoldenBitsStruct", bytes, handle_infos).unwrap();
    assert_eq!(value, confirm_value);
}

#[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 handle_infos = Vec::new();
    let confirm_value = Value::Object(vec![("v".to_owned(), Value::Object(vec![("v".to_owned(), Value::I16(1i16))]))]);
    let value = fidl_codec::decode(ns(), "test.conformance/GoldenTableStruct", bytes, handle_infos).unwrap();
    assert_eq!(value, confirm_value);
}

#[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 handle_infos = Vec::new();
    let confirm_value = Value::Object(vec![("v".to_owned(), Value::Union("test.conformance/GoldenUnion".to_owned(), "v".to_owned(), Box::new(Value::I16(1i16))))]);
    let value = fidl_codec::decode(ns(), "test.conformance/GoldenUnionStruct", bytes, handle_infos).unwrap();
    assert_eq!(value, confirm_value);
}

#[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 handle_infos = Vec::new();
    let confirm_value = Value::Object(vec![("v".to_owned(), Value::Union("test.conformance/GoldenUnion".to_owned(), "v".to_owned(), Box::new(Value::I16(1i16))))]);
    let value = fidl_codec::decode(ns(), "test.conformance/GoldenNullableUnionStruct", bytes, handle_infos).unwrap();
    assert_eq!(value, confirm_value);
}

#[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 handle_infos = Vec::new();
    let confirm_value = Value::Object(vec![("v".to_owned(), Value::Null)]);
    let value = fidl_codec::decode(ns(), "test.conformance/GoldenNullableUnionStruct", bytes, handle_infos).unwrap();
    assert_eq!(value, confirm_value);
}

#[test]
fn test_golden_byte_array_struct_v2_decode() {
    let bytes = &[
0x01,0x02,0x03,0x04,0x00,0x00,0x00,0x00,
];
    let handle_infos = Vec::new();
    let confirm_value = Value::Object(vec![("v".to_owned(), Value::List(vec![Value::U8(1u8), Value::U8(2u8), Value::U8(3u8), Value::U8(4u8)]))]);
    let value = fidl_codec::decode(ns(), "test.conformance/GoldenByteArrayStruct", bytes, handle_infos).unwrap();
    assert_eq!(value, confirm_value);
}

#[test]
fn test_golden_struct_array_struct_v2_decode() {
    let bytes = &[
0x01,0x00,0x02,0x00,0x00,0x00,0x00,0x00,
];
    let handle_infos = Vec::new();
    let confirm_value = Value::Object(vec![("v".to_owned(), Value::List(vec![Value::Object(vec![("v".to_owned(), Value::I16(1i16))]), Value::Object(vec![("v".to_owned(), Value::I16(2i16))])]))]);
    let value = fidl_codec::decode(ns(), "test.conformance/GoldenStructArrayStruct", bytes, handle_infos).unwrap();
    assert_eq!(value, confirm_value);
}

#[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 handle_infos = Vec::new();
    let confirm_value = Value::Object(vec![("v".to_owned(), Value::List(vec![Value::U8(1u8), Value::U8(2u8), Value::U8(3u8), Value::U8(4u8), Value::U8(1u8), Value::U8(2u8), Value::U8(3u8), Value::U8(4u8), Value::U8(1u8), Value::U8(2u8), Value::U8(3u8), Value::U8(4u8)]))]);
    let value = fidl_codec::decode(ns(), "test.conformance/GoldenByteVectorStruct", bytes, handle_infos).unwrap();
    assert_eq!(value, confirm_value);
}

#[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 handle_infos = Vec::new();
    let confirm_value = Value::Object(vec![("v".to_owned(), Value::List(vec![Value::U8(1u8), Value::U8(2u8), Value::U8(3u8), Value::U8(4u8)]))]);
    let value = fidl_codec::decode(ns(), "test.conformance/GoldenNullableByteVectorStruct", bytes, handle_infos).unwrap();
    assert_eq!(value, confirm_value);
}

#[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 handle_infos = Vec::new();
    let confirm_value = Value::Object(vec![("v".to_owned(), Value::Null)]);
    let value = fidl_codec::decode(ns(), "test.conformance/GoldenNullableByteVectorStruct", bytes, handle_infos).unwrap();
    assert_eq!(value, confirm_value);
}

#[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 handle_infos = Vec::new();
    let confirm_value = Value::Object(vec![("v".to_owned(), Value::List(vec![Value::Object(vec![("v".to_owned(), Value::I16(1i16))]), Value::Object(vec![("v".to_owned(), Value::I16(2i16))])]))]);
    let value = fidl_codec::decode(ns(), "test.conformance/GoldenStructVectorStruct", bytes, handle_infos).unwrap();
    assert_eq!(value, confirm_value);
}

#[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 handle_infos = Vec::new();
    let confirm_value = Value::Object(vec![("v".to_owned(), Value::Object(vec![("v".to_owned(), Value::Bool(true))]))]);
    let value = fidl_codec::decode(ns(), "test.conformance/GoldenNullableStruct", bytes, handle_infos).unwrap();
    assert_eq!(value, confirm_value);
}

#[test]
fn test_golden_nullable_struct_null_v2_decode() {
    let bytes = &[
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
];
    let handle_infos = Vec::new();
    let confirm_value = Value::Object(vec![("v".to_owned(), Value::Null)]);
    let value = fidl_codec::decode(ns(), "test.conformance/GoldenNullableStruct", bytes, handle_infos).unwrap();
    assert_eq!(value, confirm_value);
}

#[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 handle_infos = select_handle_infos(&handle_defs, &[
0,]);
    let confirm_value = Value::Object(vec![("v".to_owned(), Value::Handle(copy_handle(&handle_defs[0]), fidl::ObjectType::EVENT))]);
    let value = fidl_codec::decode(ns(), "test.conformance/GoldenHandleBasicRightsStruct", bytes, handle_infos).unwrap();
    assert_eq!(value, confirm_value);
}

#[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 handle_infos = select_handle_infos(&handle_defs, &[
0,]);
    let confirm_value = Value::Object(vec![("v".to_owned(), Value::Handle(copy_handle(&handle_defs[0]), fidl::ObjectType::NONE))]);
    let value = fidl_codec::decode(ns(), "test.conformance/GoldenNullableHandleStruct", bytes, handle_infos).unwrap();
    assert_eq!(value, confirm_value);
}

#[test]
fn test_golden_nullable_handle_struct_null_v2_decode() {
    let bytes = &[
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
];
    let handle_infos = Vec::new();
    let confirm_value = Value::Object(vec![("v".to_owned(), Value::Null)]);
    let value = fidl_codec::decode(ns(), "test.conformance/GoldenNullableHandleStruct", bytes, handle_infos).unwrap();
    assert_eq!(value, confirm_value);
}

#[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 handle_infos = select_handle_infos(&handle_defs, &[
0,]);
    let confirm_value = Value::Object(vec![("v".to_owned(), Value::Object(vec![]))]);
    let value = fidl_codec::decode(ns(), "test.conformance/GoldenTableStruct", bytes, handle_infos).unwrap();
    assert_eq!(value, confirm_value);
    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() {
    match fidl_codec::encode(ns(), "test.conformance/GoldenStringWithMaxSize2", false, Value::Object(vec![("s".to_owned(), Value::String(String::from("abc")))])) {
        // TODO: Assert the specific error once the enum variants are more specific
        Err(err) => assert_matches!(err, Error::EncodeError(_)|Error::RecursionLimitExceeded),
        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 handle_infos = Vec::new();
    match fidl_codec::decode(ns(), "test.conformance/GoldenStringStruct", bytes, handle_infos) {
        // TODO: Assert the specific error once the enum variants are more specific
        Err(err) => assert_matches!(err, Error::DecodeError(_)|Error::Utf8Error(_)|Error::RecursionLimitExceeded),
        Ok(_) => panic!("unexpected successful decoding"),
    }
}

