// Copyright 2019 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.

library conformance;

using zx;

table XUnionInTable {
    1: string before;
    2: SampleXUnion xu;
    3: string after;
};

struct TestXUnionInTable {
    XUnionInTable value;
};

union IpAddressConfig {
    1: array<uint32>:6 padding_size_24_align_4;
    2: bool dhcp;
};

struct InterfaceConfig {
    string name;
    IpAddressConfig ip_address_config;
};

struct TestAddEthernetDeviceRequest {
    string topological_path;
    InterfaceConfig config;
    // TODO(fxbug.dev/7947): Use 'EthernetDevice device;' instead.
    uint32 this_should_be_a_handle;
};

struct NodeAttributes {
    uint32 mode;
    uint64 id;
    uint64 content_size;
    uint64 storage_size;
    uint64 link_count;
    uint64 creation_time;
    uint64 modification_time;
};

struct FileGetAttrResponse {
    zx.status s;
    NodeAttributes attributes;
};

struct Int64Struct {
    int64 x;
};

union SimpleUnion {
    1: int32 i32;
    2: int64 i64;
    3: Int64Struct s;
    4: string str;
};

flexible union SampleXUnion {
    1: uint32 u;
    2: SimpleUnion su;
    3: SimpleTable st;
};

flexible resource union SampleResourceXUnion {
    1: uint32 u;
    2: SimpleUnion su;
    3: SimpleTable st;
};

union SampleStrictXUnion {
    1: uint32 u;
    2: SimpleUnion su;
    3: SimpleTable st;
};

struct TestInlineXUnionInStruct {
    string before;
    SampleXUnion xu;
    string after;
};

struct TestOptionalXUnionInStruct {
    string before;
    SampleXUnion? xu;
    string after;
};

struct TestStrictXUnionInStruct {
    SampleStrictXUnion xu;
};

struct TestFlexibleXUnionInStruct {
    SampleXUnion xu;
};

resource struct TestFlexibleResourceXUnionInStruct {
    SampleResourceXUnion xu;
};

// TODO(fxbug.dev/36441): Allow bindings to compile on host with handles.
[BindingsDenylist = "llcpp"]
resource struct FidlvizDemo {
    uint8 f1;
    int8 f2;
    uint16 f3;
    uint32 f4;
    uint64 f5;
    uint8 f6;
    uint8 f7;
    uint16 f8;
    float32 f9;
    float64 f10;
    bool f11;
    bool f12;
    string f13;
    string? f14;
    string f15;
    handle? f16;
    handle f17;
    array<uint8>:3 f18;
    vector<float64> f19;
    vector<uint8>? f20;
    vector<uint8> f21;
    FidlvizBits f22;
    FidlvizEnum f23;
    FidlvizStruct1 f24;
    FidlvizStruct2 f25;
    FidlvizStruct1? f26;
    FidlvizStruct2? f27;
    FidlvizTable f28;
    FidlvizTable f29;
    FidlvizUnion? f30;
    FidlvizUnion f31;
};

bits FidlvizBits : uint8 {
    A = 1;
    B = 2;
    C = 4;
};

enum FidlvizEnum : uint8 {
    A = 42;
};

struct FidlvizStruct1 {
};

struct FidlvizStruct2 {
    uint64 x;
};

table FidlvizTable {
    1: bool f1;
    2: reserved;
    3: bool f3;
};

union FidlvizUnion {
    1: reserved;
    2: reserved;
    3: reserved;
    4: reserved;
    5: reserved;
    6: reserved;
    7: string f7;
};
