// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

module mojo.test;

import "mojo/public/interfaces/bindings/tests/sample_import.mojom";

enum AnEnum {
  FIRST, SECOND
};

[Extensible]
enum AnExtensibleEnum {
  FIRST, SECOND, THIRD
};

union PodUnion {
  int8   f_int8;
  int8   f_int8_other;
  uint8  f_uint8;
  int16  f_int16;
  uint16 f_uint16;
  int32  f_int32;
  uint32 f_uint32;
  int64  f_int64;
  uint64 f_uint64;
  float  f_float;
  double f_double;
  bool   f_bool;
  AnEnum f_enum;
  AnExtensibleEnum f_extensible_enum;
};

union ObjectUnion {
  int8   f_int8;
  string f_string;
  DummyStruct f_dummy;
  DummyStruct? f_nullable;
  array<int8> f_array_int8;
  map<string, int8> f_map_int8;
  PodUnion f_pod_union;
  // Test that Clone() is defined after SmallStruct is declared.
  array<SmallStruct> f_small_structs;
};

union HandleUnion {
  handle f_handle;
  handle<message_pipe> f_message_pipe;
  handle<data_pipe_consumer> f_data_pipe_consumer;
  handle<data_pipe_producer> f_data_pipe_producer;
  handle<shared_buffer> f_shared_buffer;
  SmallCache f_small_cache;
  SmallCache& f_small_cache_request;
};

struct WrapperStruct {
  ObjectUnion? object_union;
  PodUnion? pod_union;
  HandleUnion? handle_union;
};

struct DummyStruct {
  int8 f_int8;
};

struct SmallStruct {
  DummyStruct? dummy_struct;
  PodUnion? pod_union;
  array<PodUnion>? pod_union_array;
  array<PodUnion?>? nullable_pod_union_array;
  array<DummyStruct>? s_array;
  map<string, PodUnion>? pod_union_map;
  map<string, PodUnion?>? nullable_pod_union_map;
};

struct SmallStructNonNullableUnion {
  PodUnion pod_union;
};

struct SmallObjStruct {
  ObjectUnion obj_union;
  int8 f_int8;
};

interface SmallCache {
  SetIntValue(int64 int_value);
  GetIntValue() => (int64 int_value);
};

interface UnionInterface {
  Echo(PodUnion in_val) => (PodUnion out_val);
};

struct TryNonNullStruct {
  DummyStruct? nullable;
  DummyStruct non_nullable;
};

union OldUnion {
  int8 f_int8;
};

union NewUnion {
  int8 f_int8;
  int16 f_int16;
};

struct ImportedUnionStruct {
  imported.PointOrShape point_or_shape;
};

union ImportedUnionUnion {
  imported.PointOrShape point_or_shape;
};