| // Copyright 2019 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| library fidl.llcpp.types.test; |
| |
| struct CopyableStruct { |
| int32 x; |
| }; |
| |
| resource struct MoveOnlyStruct { |
| handle? h; |
| }; |
| |
| /// Verifies that user code can manipulate these union payloads. |
| resource union TestUnion { |
| 1: int32 primitive; |
| 2: CopyableStruct copyable; |
| 3: MoveOnlyStruct move_only; |
| }; |
| |
| flexible resource union TestXUnion { |
| 1: int32 primitive; |
| 2: CopyableStruct copyable; |
| 3: handle h; |
| }; |
| |
| union TestStrictXUnion { |
| 1: int32 primitive; |
| 2: CopyableStruct copyable; |
| }; |
| |
| struct TestStrictXUnionInStruct { |
| TestStrictXUnion xu; |
| }; |
| |
| flexible union TestNonResourceXUnion { |
| 1: int32 primitive; |
| }; |
| |
| /// Verifies that user code can manipulate these bits. |
| /// |
| /// We use a uint8 since most bitwise operations will cast their operands to |
| /// int, and therefore special casting is required to properly compile. |
| strict bits StrictBits : uint8 { |
| B = 2; |
| D = 4; |
| E = 8; |
| }; |
| |
| /// The members should be kept in sync with those in [`StrictBits`], as we have |
| /// tests parameterized on both bits types. |
| flexible bits FlexibleBits : uint8 { |
| B = 2; |
| D = 4; |
| E = 8; |
| }; |
| |
| /// Verifies that user code can build and access tables. |
| table SampleTable { |
| 1: uint8 x; |
| 2: uint8 y; |
| 3: vector<CopyableStruct> vector_of_struct; |
| }; |
| |
| /// Verifies that an empty table compiles. |
| table SampleEmptyTable { |
| }; |
| |
| protocol TestInterface { |
| TestMethod(TestUnion u) -> (TestUnion u); |
| }; |
| |
| /// Verifies that method argument types don't conflict with user-defined types. |
| struct FooRequest { |
| int32 bar; |
| }; |
| |
| struct FooResponse { |
| int32 bar; |
| }; |
| |
| protocol Baz { |
| Foo(FooRequest req) -> (FooResponse res); |
| }; |
| |
| table TableWithSubTables { |
| 1: SampleTable t; |
| 2: vector<SampleTable> vt; |
| 3: array<SampleTable>:3 at; |
| }; |
| |
| strict enum StrictEnum : uint32 { |
| B = 2; |
| D = 4; |
| E = 8; |
| }; |
| |
| flexible enum FlexibleEnum : uint32 { |
| B = 2; |
| D = 4; |
| E = 8; |
| [Unknown] CUSTOM = 56; |
| }; |
| |
| struct EmptyStruct { |
| }; |
| |
| table TestTable { |
| 1: uint8 x; |
| }; |
| |
| resource table TestResourceTable { |
| 1: uint8 x; |
| }; |
| |
| /// Certain traits are only implemented for top level (i.e. request/response struct) |
| /// types, since LLCPP only calls encode/decode on those top level types. |
| /// Types used in tests that exercise these codepaths (e.g. involving HasFlexibleEnvelope) |
| /// should be put in a request/response struct instead of a regular struct in order |
| /// to reflect the actual paths exercised within a protocol. |
| /// |
| /// For example, to test a union MyUnion, instead of: |
| /// - declaring wrapper struct `struct MyUnionStruct { MyUnion xu };` |
| /// - writing encode/decode tests in C++ using MyUnionStruct |
| /// do: |
| /// - add method `MyUnion() -> (MyUnion result);` |
| /// - write tests in C++ using MsgWrapper::MyUnionResponse |
| protocol MsgWrapper { |
| TestXUnion() -> (TestXUnion result); |
| TestNonResourceXUnion() -> (TestNonResourceXUnion result); |
| TestTable() -> (TestTable result); |
| TestResourceTable() -> (TestResourceTable result); |
| }; |