// Copyright 2018 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 fidl.test.misc;

bits Uint32Bits : uint32 {
    ONE = 0x1;
    TWO = 0x2;
};

bits SampleBits {
    B = 2;
    D = 4;
    E = 8;
};

struct Int64Struct {
    int64 x;
};

struct HasOptionalFieldStruct {
    Int64Struct? x;
};

struct Has2OptionalFieldStruct {
    Int64Struct? x;
    Int64Struct? y;
};

struct Empty {
};

flexible union XUnionContainingEmptyStruct {
    1: Empty empty;
};

struct EmptyStructSandwich {
    string before;
    Empty e;
    string after;
};

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

table SimpleTable {
    1: int64 x;
    2: reserved;
    3: reserved;
    4: reserved;
    5: int64 y;
};

// A variant of SimpleTable that has just the first few fields.
// Think of this as an older variant of that type!
table OlderSimpleTable {
    1: int64 x;
    2: reserved;
};

// A variant of SimpleTable that has some additional new fields.
// Think of this as an newer variant of that type!
table NewerSimpleTable {
    1: int64 x;
    2: reserved;
    3: reserved;
    4: reserved;
    5: int64 y;
    6: int64 z;
    7: reserved;
};

table ComplexTable {
    1: SimpleTable simple;
    2: SampleXUnion u;
    3: vector<string> strings;
};

flexible union SampleXUnion {
    1: int32 i;
    2: SimpleUnion su;
    3: SimpleTable st;
};

struct SampleXUnionInStruct {
    SampleXUnion xu;
};

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

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

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

table PrimitiveArrayInTable {
    1: string before;
    2: array<int32>:9 arr;
    3: string after;
};

enum SampleEnum {
    MEMBER_A = 23;
    MEMBER_B = 34;
    MEMBER_C = 45;
};

struct VariousDefaults {
    int64 int64_with_default = 5;
    string string_with_default = "stuff";
    SampleEnum enum_with_default = SampleEnum.MEMBER_B;
    bool bool_with_default = true;
};

protocol Echo {
    EchoString(string? value) -> (string? response);
};

protocol NameCollision {
};

protocol ReturnsCollision {
    NameCollision() -> (NameCollision collision);
};
