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

[DartPackage="_mojo_for_test_only",
 JavaPackage="org.chromium.mojo.bindings.test.mojom.mojo"]
module mojo.test;

struct StructA {
  uint64 i;
};

struct StructB {
  StructA struct_a;
};

struct StructC {
  array<uint8> data;
};

struct StructD {
  array<handle<message_pipe>> message_pipes;
};

struct StructE {
  StructD struct_d;
  handle<data_pipe_consumer> data_pipe_consumer;
};

struct StructF {
  array<uint8, 3> fixed_size_array;
};

struct StructG {
  int32 i;
  [MinVersion=1] StructA? struct_a;
  [MinVersion=3] string? str;
  [MinVersion=3] bool b;
};

struct StructH {
  bool a;
  uint8 b;
  UnionA? c;
  array<UnionA>? d;
  map<uint8, UnionA>? e;
};

union UnionA {
  uint16 a;
  uint32 b;
  StructA? c;
  array<uint8>? d;
  map<string, uint8>? e;
  UnionB? f;
  StructA g;
  array<uint8> h;
  map<string, uint8> i;
  UnionB j;
};

union UnionB {
  uint16 a;
  uint32 b;
  uint64 c;
  uint32 d;
};

interface InterfaceA {};

// This interface is used for testing bounds-checking in the mojom
// binding code. If you add a method please update the files
// ./data/validation/boundscheck_*. If you add a response please update
// ./data/validation/resp_boundscheck_*.
[ServiceName="this.is.the.service.name.for.BoundsCheckTestInterface"]
interface BoundsCheckTestInterface {
  Method0(uint8 param0) => (uint8 param0);
  Method1(uint8 param0);
};

interface ConformanceTestInterface {
  Method0(float param0);
  Method1(StructA param0);
  Method2(StructB param0, StructA param1);
  Method3(array<bool> param0);
  Method4(StructC param0, array<uint8> param1);
  Method5(StructE param0, handle<data_pipe_producer> param1);
  Method6(array<array<uint8>> param0);
  Method7(StructF param0, array<array<uint8, 3>?, 2> param1);
  Method8(array<array<string>?> param0);
  Method9(array<array<handle?>>? param0);
  Method10(map<string, uint8> param0);
  Method11(StructG param0);
  Method12(float param0) => (float param0);
  Method13(InterfaceA? param0, uint32 param1, InterfaceA? param2);
  Method14(UnionA param0);
  Method15(StructH param0);
};

struct BasicStruct {
  int32 a;
};

interface IntegrationTestInterface {
  Method0(BasicStruct param0) => (array<uint8> param0);
};

// An enum generates a enum-value validation function, so we want to test it.
// E.g., valid enum values for this enum should be:  -3, 0, 1, 10
enum BasicEnum {
  A,
  B,
  C = A,
  D = -3,
  E = 0xA,
};

// The enum validation function should be generated within the scope of this
// struct.
struct StructWithEnum {
  enum EnumWithin {
    A,
    B,
    C,
    D,
  };
};
