Home | History | Annotate | Download | only in tests
      1 // Copyright 2013 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 [JavaPackage="org.chromium.mojo.bindings.test.mojom.test_structs"]
      6 module mojo.test;
      7 
      8 import "mojo/public/interfaces/bindings/tests/rect.mojom";
      9 
     10 struct NamedRegion {
     11   string? name;
     12   array<Rect>? rects;
     13 };
     14 
     15 struct RectPair {
     16   Rect? first;
     17   Rect? second;
     18 };
     19 
     20 struct EmptyStruct {
     21 };
     22 
     23 [Native]
     24 struct UnmappedNativeStruct;
     25 
     26 // Used to verify that struct fields which don't specify a default are
     27 // initialized to: false for bool, 0 for numbers, and null for strings,
     28 // handles, and structs. The "?" nullable suffix shouldn't have any
     29 // impact on initial field values.
     30 
     31 struct NoDefaultFieldValues {
     32   bool f0;
     33   int8 f1;
     34   uint8 f2;
     35   int16 f3;
     36   uint16 f4;
     37   int32 f5;
     38   uint32 f6;
     39   int64 f7;
     40   uint64 f8;
     41   float f9;
     42   double f10;
     43   string f11;
     44   string? f12;
     45   handle<message_pipe> f13;
     46   handle<data_pipe_consumer> f14;
     47   handle<data_pipe_producer> f15;
     48   handle<message_pipe>? f16;
     49   handle<data_pipe_consumer>? f17;
     50   handle<data_pipe_producer>? f18;
     51   handle f19;
     52   handle? f20;
     53   handle<shared_buffer> f21;
     54   handle<shared_buffer>? f22;
     55   array<string> f23;
     56   array<string?> f24;
     57   array<string>? f25;
     58   array<string?>? f26;
     59   EmptyStruct f27;
     60   EmptyStruct? f28;
     61 };
     62 
     63 // Used to verify that struct fields with an explicit default value
     64 // are initialized correctly. The "?" nullable suffix shouldn't have any
     65 // impact on initial field values.
     66 
     67 struct DefaultFieldValues {
     68   const string kFoo = "foo";
     69   bool f0 = true;
     70   int8 f1 = 100;
     71   uint8 f2 = 100;
     72   int16 f3 = 100;
     73   uint16 f4 = 100;
     74   int32 f5 = 100;
     75   uint32 f6 = 100;
     76   int64 f7 = 100;
     77   uint64 f8 = 100;
     78   float f9 = 100;
     79   float f10 = 100.0;
     80   double f11 = 100;
     81   double f12 = 100.0;
     82   string f13 = kFoo;
     83   string? f14 = kFoo;
     84   Rect f15 = default;
     85   Rect? f16 = default;
     86 };
     87 
     88 // Used to verify that the code generated for enum and const values defined
     89 // within a struct is correct. Assuming that a constant's value can be a literal
     90 // or another constant and that enum values can either be an integer constant or
     91 // another value from the same enum type.
     92 
     93 struct ScopedConstants {
     94   const int32 TEN = 10;
     95   const int32 ALSO_TEN = TEN;
     96   enum EType {
     97     E0,
     98     E1,
     99     E2 = 10,
    100     E3 = E2,
    101     E4,
    102   };
    103   EType f0 = E0; // 0
    104   EType f1 = E1; // 1
    105   EType f2 = E2; // 10
    106   EType f3 = E3; // 10
    107   EType f4 = E4; // 11
    108   int32 f5 = TEN;
    109   int32 f6 = ALSO_TEN;
    110 };
    111 
    112 // Used to verify that all possible Map key field types can be encoded and
    113 // decoded successfully.
    114 
    115 struct MapKeyTypes {
    116   // TODO(yzshen): WTF::HashMap doesn't support bool as key.
    117   // map<bool, bool> f0;
    118   map<int8, int8> f1;
    119   map<uint8, uint8> f2;
    120   map<int16, int16> f3;
    121   map<uint16, uint16> f4;
    122   map<int32, int32> f5;
    123   map<uint32, uint32> f6;
    124   map<int64, int64> f7;
    125   map<uint64, uint64> f8;
    126   map<float, float> f9;
    127   map<double, double> f10;
    128   map<string, string> f11;
    129   // TODO(crbug.com/628104): JS doesn't support struct as key.  map<Rect, Rect>
    130   // f12;
    131 };
    132 
    133 // Used to verify that various map value types can be encoded and decoded
    134 // successfully.
    135 
    136 struct MapValueTypes {
    137   map<string, array<string>> f0;
    138   map<string, array<string>?> f1;
    139   map<string, array<string?>> f2;
    140   map<string, array<string, 2>> f3;
    141   map<string, array<array<string, 2>?>> f4;
    142   map<string, array<array<string, 2>, 1>> f5;
    143   map<string, Rect?> f6;
    144   map<string, map<string, string>> f7;
    145   map<string, array<map<string, string>>> f8;
    146   map<string, handle> f9;
    147   map<string, array<handle>> f10;
    148   map<string, map<string, handle>> f11;
    149 };
    150 
    151 // Used to verify that various array types can be encoded and decoded
    152 // successfully.
    153 
    154 struct ArrayValueTypes {
    155   array<int8> f0;
    156   array<int16> f1;
    157   array<int32> f2;
    158   array<int64> f3;
    159   array<float> f4;
    160   array<double> f5;
    161   array<SomeInterface> f6;
    162   array<SomeInterface&> f7;
    163 };
    164 
    165 // Used to verify that various float and double values can be encoded and
    166 // decoded correctly.
    167 
    168 struct FloatNumberValues {
    169   const double V0 = double.INFINITY;
    170   const double V1 = double.NEGATIVE_INFINITY;
    171   const double V2 = double.NAN;
    172   const float V3 = float.INFINITY;
    173   const float V4 = float.NEGATIVE_INFINITY;
    174   const float V5 = float.NAN;
    175   const float V6 = 0;
    176   const double V7 = 1234567890.123;
    177   const double V8 = 1.2E+20;
    178   const double V9 = -1.2E+20;
    179 
    180   double f0 = V0;
    181   double f1 = V1;
    182   double f2 = V2;
    183   float f3 = V3;
    184   float f4 = V4;
    185   float f5 = V5;
    186   float f6 = V6;
    187   double f7 = V7;
    188   double f8 = V8;
    189   double f9 = V9;
    190 };
    191 
    192 // Used to verify that various signed integer values can be encoded and
    193 // decoded correctly.
    194 
    195 struct IntegerNumberValues {
    196   const int8 V0 = -128; // Minimum
    197   const int8 V1 = -1;   // -1
    198   const int8 V2 = 0;    // 0
    199   const int8 V3 = 42;   // An arbitrary valid value.
    200   const int8 V4 = 127;  // Maximum
    201 
    202   const int16 V5 = -32768; // ...
    203   const int16 V6 = -1;
    204   const int16 V7 = 0;
    205   const int16 V8 = 12345;
    206   const int16 V9 = 32767;
    207 
    208   const int32 V10 = -2147483648;
    209   const int32 V11 = -1;
    210   const int32 V12 = 0;
    211   const int32 V13 = 1234567890;
    212   const int32 V14 = 2147483647;
    213 
    214   // The limits for JavaScript integers are +/- (2^53 - 1).
    215   const int64 V15 = -9007199254740991; // Number.MIN_SAFE_INTEGER
    216   const int64 V16 = -1;
    217   const int64 V17 = 0;
    218   const int64 V18 = 1234567890123456;
    219   const int64 V19 = 9007199254740991; // Number.MAX_SAFE_INTEGER
    220 
    221   int8 f0 = V0;
    222   int8 f1 = V1;
    223   int8 f2 = V2;
    224   int8 f3 = V3;
    225   int8 f4 = V4;
    226 
    227   int16 f5 = V5;
    228   int16 f6 = V6;
    229   int16 f7 = V7;
    230   int16 f8 = V8;
    231   int16 f9 = V9;
    232 
    233   int32 f10 = V10;
    234   int32 f11 = V11;
    235   int32 f12 = V12;
    236   int32 f13 = V13;
    237   int32 f14 = V14;
    238 
    239   int64 f15 = V15;
    240   int64 f16 = V16;
    241   int64 f17 = V17;
    242   int64 f18 = V18;
    243   int64 f19 = V19;
    244 };
    245 
    246 // Used to verify that various unsigned integer values can be encoded and
    247 // decoded correctly.
    248 
    249 struct UnsignedNumberValues {
    250   const uint8 V0 = 0;    // Minimum = 0.
    251   const uint8 V1 = 42;   // An arbitrary valid value.
    252   const uint8 V2 = 0xFF; // Maximum
    253 
    254   const uint16 V3 = 0; // ...
    255   const uint16 V4 = 12345;
    256   const uint16 V5 = 0xFFFF;
    257 
    258   const uint32 V6 = 0;
    259   const uint32 V7 = 1234567890;
    260   const uint32 V8 = 0xFFFFFFFF;
    261 
    262   // The limits for JavaScript integers are +/- (2^53 - 1).
    263   const uint64 V9 = 0;
    264   const uint64 V10 = 1234567890123456;
    265   const uint64 V11 = 9007199254740991; // Number.MAX_SAFE_INTEGER
    266 
    267   uint8 f0 = V0;
    268   uint8 f1 = V1;
    269   uint8 f2 = V2;
    270 
    271   uint16 f3 = V3;
    272   uint16 f4 = V4;
    273   uint16 f5 = V5;
    274 
    275   uint32 f6 = V6;
    276   uint32 f7  = V7;
    277   uint32 f8 = V8;
    278 
    279   uint64 f9 = V9;
    280   uint64 f10 = V10;
    281   uint64 f11 = V11;
    282 };
    283 
    284 // Used to verify that various (packed) boolean array values can be encoded
    285 // and decoded correctly.
    286 
    287 struct BitArrayValues {
    288   array<bool, 1> f0;
    289   array<bool, 7> f1;
    290   array<bool, 9> f2;
    291   array<bool> f3;
    292   array<array<bool>> f4;
    293   array<array<bool>?> f5;
    294   array<array<bool, 2>?> f6;
    295 };
    296 
    297 // Used to verify that different versions can be decoded correctly.
    298 
    299 struct MultiVersionStruct {
    300   [MinVersion=0]
    301   int32 f_int32;
    302   [MinVersion=1]
    303   Rect? f_rect;
    304   [MinVersion=3]
    305   string? f_string;
    306   [MinVersion=5]
    307   array<int8>? f_array;
    308   [MinVersion=7]
    309   handle<message_pipe>? f_message_pipe;
    310   [MinVersion=7]
    311   bool f_bool;
    312   [MinVersion=9]
    313   int16 f_int16;
    314 };
    315 
    316 struct MultiVersionStructV0 {
    317   [MinVersion=0]
    318   int32 f_int32;
    319 };
    320 
    321 struct MultiVersionStructV1 {
    322   [MinVersion=0]
    323   int32 f_int32;
    324   [MinVersion=1]
    325   Rect? f_rect;
    326 };
    327 
    328 struct MultiVersionStructV3 {
    329   [MinVersion=0]
    330   int32 f_int32;
    331   [MinVersion=1]
    332   Rect? f_rect;
    333   [MinVersion=3]
    334   string? f_string;
    335 };
    336 
    337 struct MultiVersionStructV5 {
    338   [MinVersion=0]
    339   int32 f_int32;
    340   [MinVersion=1]
    341   Rect? f_rect;
    342   [MinVersion=3]
    343   string? f_string;
    344   [MinVersion=5]
    345   array<int8>? f_array;
    346 };
    347 
    348 struct MultiVersionStructV7 {
    349   [MinVersion=0]
    350   int32 f_int32;
    351   [MinVersion=1]
    352   Rect? f_rect;
    353   [MinVersion=3]
    354   string? f_string;
    355   [MinVersion=5]
    356   array<int8>? f_array;
    357   [MinVersion=7]
    358   handle<message_pipe>? f_message_pipe;
    359   [MinVersion=7]
    360   bool f_bool;
    361 };
    362 
    363 // A struct where the fields are not sorted by their ordinals.
    364 struct ReorderedStruct {
    365   [MinVersion=2]
    366   int32 a@3 = 3;
    367   [MinVersion=4]
    368   int32 b@6 = 6;
    369   [MinVersion=1]
    370   int32 c@1 = 1;
    371 };
    372 
    373 // Used to verify that interfaces that are struct members can be defined in the
    374 // same file.
    375 
    376 interface SomeInterface {
    377   SomeMethod(RectPair pair) => (RectPair other_pair);
    378 };
    379 
    380 struct ContainsInterface {
    381   SomeInterface some_interface;
    382 };
    383 
    384 // Verify that a field can be called |other|.
    385 
    386 struct ContainsOther {
    387   int32 other;
    388 };
    389 
    390 // Used to verify that structs can contain interface requests.
    391 
    392 struct ContainsInterfaceRequest {
    393   SomeInterface& request;
    394 };
    395 
    396 // Used to verify that boolean fields are correctly serialized/deserialized.
    397 
    398 struct SingleBoolStruct {
    399   bool value;
    400 };
    401 
    402 // Used to verify that structs containing typemapped types can be hashed (if the
    403 // typemapped type itself is hashable).
    404 
    405 struct ContainsHashable {
    406   TypemappedRect rect;
    407 };
    408 
    409 // Used to test that nested structs can be hashed. The nested struct mustn't be
    410 // nullable.
    411 
    412 struct SimpleNestedStruct {
    413   ContainsOther nested;
    414 };
    415