// Copyright 2013 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.sample"]
module sample;

import "sample_import.mojom";
import "sample_import2.mojom";

const uint8 kTwelve = 12;

struct Bar {
  enum Type {
    VERTICAL = 1,
    HORIZONTAL,
    BOTH,
    INVALID
  };
  uint8 alpha@0 = 0xff;
  uint8 beta@1;
  uint8 gamma@2;
  Type type@3 = sample.Bar.Type.VERTICAL;
};

struct Foo {
  const string kFooby = "Fooby";
  string name@8 = kFooby;
  int32 x@0;
  int32 y@1;
  bool a@2 = true;
  bool b@3;
  bool c@4;
  Bar? bar@5;
  array<Bar>? extra_bars@7;
  array<uint8>? data@6;
  handle<message_pipe>? source@9;
  array<handle<data_pipe_consumer>>? input_streams@10;
  array<handle<data_pipe_producer>>? output_streams@11;
  array<array<bool>>? array_of_array_of_bools@12;
  array<array<array<string>>>? multi_array_of_strings@13;
  array<bool>? array_of_bools@14;
};

struct DefaultsTest {
  int8 a0@0 = -12;
  uint8 a1@1 = sample.kTwelve;
  int16 a2@2 = 1234;
  uint16 a3@3 = 34567;
  int32 a4@4 = 123456;
  uint32 a5@5 = 3456789012;
  int64 a6@6 = -111111111111;
  uint64 a7@7 = 9999999999999999999;
  int32 a8@8 = 0x12345;
  int32 a9@9 = -0x12345;
  int32 a10@10 = +1234;
  bool a11@11 = true;
  bool a12@12 = false;
  float a13@13 = 123.25;
  double a14@14 = 1234567890.123;
  double a15@15 = 1E10;
  double a16@16 = -1.2E+20;
  double a17@17 = +1.23E-20;

  // TODO(vtl): Add tests for default vs null when those are implemented (for
  // structs, arrays, and strings).
  array<uint8> a18@18;
  string a19@19;

  Bar.Type a20@20 = BOTH;
  imported.Point a21@21;
  imported.Thing a22@22 = default;

  uint64 a23@23 = 0xFFFFFFFFFFFFFFFF;
  int64 a24@24 = 0x123456789;
  int64 a25@25 = -0x123456789;

  double a26@26 = double.INFINITY;
  double a27@27 = double.NEGATIVE_INFINITY;
  double a28@28 = double.NAN;
  float a29@29 = float.INFINITY;
  float a30@30 = float.NEGATIVE_INFINITY;
  float a31@31 = float.NAN;
};

struct StructWithHoleV1 {
  int32 v1 = 1;
  int64 v2 = 2;
};

struct StructWithHoleV2 {
  int32 v1 = 1;
  int64 v2 = 2;
  int32 v3 = 3;
};

interface Service {
  enum BazOptions {
    REGULAR = 0,
    EXTRA
  };
  const uint8 kFavoriteBaz = 1;
  Frobinate@0(Foo? foo@0, BazOptions baz@1, Port? port@2) => (int32 result@0);
  GetPort@1(Port& port @0);
};

// This interface is referenced above where it is defined. It also refers to
// itself from a method.
interface Port {
  PostMessage@0(string message_text@0, Port port@1);
};

struct NonNullableMapStruct {
  map<string, string> map_field;
};
