// 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;

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

type StrictBits = strict bits : uint8 {
    B = 2;
    D = 4;
    E = 8;
};

/// The members should be kept in sync with those in [`StrictBits`], as we have
/// tests parameterized on both bits types.
type FlexibleBits = flexible bits : uint8 {
    B = 2;
    D = 4;
    E = 8;
};

type Int64Struct = struct {
    x int64;
};

type HasOptionalFieldStruct = struct {
    x box<Int64Struct>;
};

type Has2OptionalFieldStruct = struct {
    x box<Int64Struct>;
    y box<Int64Struct>;
};

type Empty = struct {};

type XUnionContainingEmptyStruct = flexible union {
    1: empty Empty;
};

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

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

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

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

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

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

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

type SampleXUnionInStruct = struct {
    xu SampleXUnion;
};

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

type OptionalXUnionInStruct = struct {
    before string;
    xu SampleXUnion:optional;
    after string;
};

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

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

type StrictEnum = strict enum {
    MEMBER_A = 23;
    MEMBER_B = 34;
    MEMBER_C = 45;
};

type FlexibleEnum = flexible enum {
    MEMBER_A = 23;
    MEMBER_B = 34;
    MEMBER_C = 45;
    @unknown
    MEMBER_CUSTOM_UNKNOWN = 89;
};

type EmptyFlexibleEnum = flexible enum {};

type VariousDefaults = struct {
    @allow_deprecated_struct_defaults
    int64_with_default int64 = 5;
    @allow_deprecated_struct_defaults
    string_with_default string = "stuff";
    @allow_deprecated_struct_defaults
    strict_enum_with_default StrictEnum = StrictEnum.MEMBER_B;
    @allow_deprecated_struct_defaults
    flexible_enum_with_default FlexibleEnum = FlexibleEnum.MEMBER_B;
    @allow_deprecated_struct_defaults
    bool_with_default bool = true;
};

protocol Echo {
    EchoString(struct {
        value string:optional;
    }) -> (struct {
        response string:optional;
    });
};
