// 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. [JavaPackage="org.chromium.mojo.bindings.test.mojom.test_structs"] module mojo.test; import "mojo/public/interfaces/bindings/tests/rect.mojom"; struct NamedRegion { string? name; array<Rect>? rects; }; struct RectPair { Rect? first; Rect? second; }; struct EmptyStruct { }; [Native] struct UnmappedNativeStruct; // Used to verify that struct fields which don't specify a default are // initialized to: false for bool, 0 for numbers, and null for strings, // handles, and structs. The "?" nullable suffix shouldn't have any // impact on initial field values. struct NoDefaultFieldValues { bool f0; int8 f1; uint8 f2; int16 f3; uint16 f4; int32 f5; uint32 f6; int64 f7; uint64 f8; float f9; double f10; string f11; string? f12; handle<message_pipe> f13; handle<data_pipe_consumer> f14; handle<data_pipe_producer> f15; handle<message_pipe>? f16; handle<data_pipe_consumer>? f17; handle<data_pipe_producer>? f18; handle f19; handle? f20; handle<shared_buffer> f21; handle<shared_buffer>? f22; array<string> f23; array<string?> f24; array<string>? f25; array<string?>? f26; EmptyStruct f27; EmptyStruct? f28; }; // Used to verify that struct fields with an explicit default value // are initialized correctly. The "?" nullable suffix shouldn't have any // impact on initial field values. struct DefaultFieldValues { const string kFoo = "foo"; bool f0 = true; int8 f1 = 100; uint8 f2 = 100; int16 f3 = 100; uint16 f4 = 100; int32 f5 = 100; uint32 f6 = 100; int64 f7 = 100; uint64 f8 = 100; float f9 = 100; float f10 = 100.0; double f11 = 100; double f12 = 100.0; string f13 = kFoo; string? f14 = kFoo; Rect f15 = default; Rect? f16 = default; }; // Used to verify that the code generated for enum and const values defined // within a struct is correct. Assuming that a constant's value can be a literal // or another constant and that enum values can either be an integer constant or // another value from the same enum type. struct ScopedConstants { const int32 TEN = 10; const int32 ALSO_TEN = TEN; enum EType { E0, E1, E2 = 10, E3 = E2, E4, }; EType f0 = E0; // 0 EType f1 = E1; // 1 EType f2 = E2; // 10 EType f3 = E3; // 10 EType f4 = E4; // 11 int32 f5 = TEN; int32 f6 = ALSO_TEN; }; // Used to verify that all possible Map key field types can be encoded and // decoded successfully. struct MapKeyTypes { // TODO(yzshen): WTF::HashMap doesn't support bool as key. // map<bool, bool> f0; map<int8, int8> f1; map<uint8, uint8> f2; map<int16, int16> f3; map<uint16, uint16> f4; map<int32, int32> f5; map<uint32, uint32> f6; map<int64, int64> f7; map<uint64, uint64> f8; map<float, float> f9; map<double, double> f10; map<string, string> f11; // TODO(crbug.com/628104): JS doesn't support struct as key. map<Rect, Rect> // f12; }; // Used to verify that various map value types can be encoded and decoded // successfully. struct MapValueTypes { map<string, array<string>> f0; map<string, array<string>?> f1; map<string, array<string?>> f2; map<string, array<string, 2>> f3; map<string, array<array<string, 2>?>> f4; map<string, array<array<string, 2>, 1>> f5; map<string, Rect?> f6; map<string, map<string, string>> f7; map<string, array<map<string, string>>> f8; map<string, handle> f9; map<string, array<handle>> f10; map<string, map<string, handle>> f11; }; // Used to verify that various array types can be encoded and decoded // successfully. struct ArrayValueTypes { array<int8> f0; array<int16> f1; array<int32> f2; array<int64> f3; array<float> f4; array<double> f5; array<SomeInterface> f6; array<SomeInterface&> f7; }; // Used to verify that various float and double values can be encoded and // decoded correctly. struct FloatNumberValues { const double V0 = double.INFINITY; const double V1 = double.NEGATIVE_INFINITY; const double V2 = double.NAN; const float V3 = float.INFINITY; const float V4 = float.NEGATIVE_INFINITY; const float V5 = float.NAN; const float V6 = 0; const double V7 = 1234567890.123; const double V8 = 1.2E+20; const double V9 = -1.2E+20; double f0 = V0; double f1 = V1; double f2 = V2; float f3 = V3; float f4 = V4; float f5 = V5; float f6 = V6; double f7 = V7; double f8 = V8; double f9 = V9; }; // Used to verify that various signed integer values can be encoded and // decoded correctly. struct IntegerNumberValues { const int8 V0 = -128; // Minimum const int8 V1 = -1; // -1 const int8 V2 = 0; // 0 const int8 V3 = 42; // An arbitrary valid value. const int8 V4 = 127; // Maximum const int16 V5 = -32768; // ... const int16 V6 = -1; const int16 V7 = 0; const int16 V8 = 12345; const int16 V9 = 32767; const int32 V10 = -2147483648; const int32 V11 = -1; const int32 V12 = 0; const int32 V13 = 1234567890; const int32 V14 = 2147483647; // The limits for JavaScript integers are +/- (2^53 - 1). const int64 V15 = -9007199254740991; // Number.MIN_SAFE_INTEGER const int64 V16 = -1; const int64 V17 = 0; const int64 V18 = 1234567890123456; const int64 V19 = 9007199254740991; // Number.MAX_SAFE_INTEGER int8 f0 = V0; int8 f1 = V1; int8 f2 = V2; int8 f3 = V3; int8 f4 = V4; int16 f5 = V5; int16 f6 = V6; int16 f7 = V7; int16 f8 = V8; int16 f9 = V9; int32 f10 = V10; int32 f11 = V11; int32 f12 = V12; int32 f13 = V13; int32 f14 = V14; int64 f15 = V15; int64 f16 = V16; int64 f17 = V17; int64 f18 = V18; int64 f19 = V19; }; // Used to verify that various unsigned integer values can be encoded and // decoded correctly. struct UnsignedNumberValues { const uint8 V0 = 0; // Minimum = 0. const uint8 V1 = 42; // An arbitrary valid value. const uint8 V2 = 0xFF; // Maximum const uint16 V3 = 0; // ... const uint16 V4 = 12345; const uint16 V5 = 0xFFFF; const uint32 V6 = 0; const uint32 V7 = 1234567890; const uint32 V8 = 0xFFFFFFFF; // The limits for JavaScript integers are +/- (2^53 - 1). const uint64 V9 = 0; const uint64 V10 = 1234567890123456; const uint64 V11 = 9007199254740991; // Number.MAX_SAFE_INTEGER uint8 f0 = V0; uint8 f1 = V1; uint8 f2 = V2; uint16 f3 = V3; uint16 f4 = V4; uint16 f5 = V5; uint32 f6 = V6; uint32 f7 = V7; uint32 f8 = V8; uint64 f9 = V9; uint64 f10 = V10; uint64 f11 = V11; }; // Used to verify that various (packed) boolean array values can be encoded // and decoded correctly. struct BitArrayValues { array<bool, 1> f0; array<bool, 7> f1; array<bool, 9> f2; array<bool> f3; array<array<bool>> f4; array<array<bool>?> f5; array<array<bool, 2>?> f6; }; // Used to verify that different versions can be decoded correctly. struct MultiVersionStruct { [MinVersion=0] int32 f_int32; [MinVersion=1] Rect? f_rect; [MinVersion=3] string? f_string; [MinVersion=5] array<int8>? f_array; [MinVersion=7] handle<message_pipe>? f_message_pipe; [MinVersion=7] bool f_bool; [MinVersion=9] int16 f_int16; }; struct MultiVersionStructV0 { [MinVersion=0] int32 f_int32; }; struct MultiVersionStructV1 { [MinVersion=0] int32 f_int32; [MinVersion=1] Rect? f_rect; }; struct MultiVersionStructV3 { [MinVersion=0] int32 f_int32; [MinVersion=1] Rect? f_rect; [MinVersion=3] string? f_string; }; struct MultiVersionStructV5 { [MinVersion=0] int32 f_int32; [MinVersion=1] Rect? f_rect; [MinVersion=3] string? f_string; [MinVersion=5] array<int8>? f_array; }; struct MultiVersionStructV7 { [MinVersion=0] int32 f_int32; [MinVersion=1] Rect? f_rect; [MinVersion=3] string? f_string; [MinVersion=5] array<int8>? f_array; [MinVersion=7] handle<message_pipe>? f_message_pipe; [MinVersion=7] bool f_bool; }; // A struct where the fields are not sorted by their ordinals. struct ReorderedStruct { [MinVersion=2] int32 a@3 = 3; [MinVersion=4] int32 b@6 = 6; [MinVersion=1] int32 c@1 = 1; }; // Used to verify that interfaces that are struct members can be defined in the // same file. interface SomeInterface { SomeMethod(RectPair pair) => (RectPair other_pair); }; struct ContainsInterface { SomeInterface some_interface; }; // Verify that a field can be called |other|. struct ContainsOther { int32 other; }; // Used to verify that structs can contain interface requests. struct ContainsInterfaceRequest { SomeInterface& request; }; // Used to verify that boolean fields are correctly serialized/deserialized. struct SingleBoolStruct { bool value; }; // Used to verify that structs containing typemapped types can be hashed (if the // typemapped type itself is hashable). struct ContainsHashable { TypemappedRect rect; }; // Used to test that nested structs can be hashed. The nested struct mustn't be // nullable. struct SimpleNestedStruct { ContainsOther nested; };