| # Copyright 2019 Google LLC | |
| # | |
| # Licensed under the Apache License, Version 2.0 (the "License"); | |
| # you may not use this file except in compliance with the License. | |
| # You may obtain a copy of the License at | |
| # | |
| # https://www.apache.org/licenses/LICENSE-2.0 | |
| # | |
| # Unless required by applicable law or agreed to in writing, software | |
| # distributed under the License is distributed on an "AS IS" BASIS, | |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| # See the License for the specific language governing permissions and | |
| # limitations under the License. | |
| -- Tests for virtual fields: | |
| -- | |
| -- * `let` constructs | |
| -- * TODO(bolms@): `transform` annotations | |
| -- * TODO(bolms@): `read` and `write` annotations | |
| [$default byte_order: "LittleEndian"] | |
| [(cpp) namespace: "emboss::test"] | |
| struct StructureWithConstants: | |
| let ten = 10 | |
| let twenty = 20 | |
| let four_billion = 4_000_000_000 | |
| let ten_billion = 10_000_000_000 | |
| let minus_ten_billion = -10_000_000_000 | |
| 0 [+4] UInt value | |
| let alias_of_value = value | |
| let alias_of_alias_of_value = alias_of_value | |
| let alias_of_ten = ten | |
| let alias_of_alias_of_ten = alias_of_ten | |
| struct StructureWithComputedValues: | |
| 0 [+4] UInt value | |
| let doubled = value * 2 | |
| let plus_ten = value + 10 | |
| let signed_doubled = value2 * 2 | |
| let signed_plus_ten = value2 + 10 | |
| let product = value * value2 | |
| 4 [+4] Int value2 | |
| struct StructureWithConditionalValue: | |
| 0 [+4] UInt x | |
| if x < 0x8000_0000: | |
| let two_x = x * 2 | |
| let x_plus_one = x + 1 | |
| struct StructureWithValueInCondition: | |
| let two_x = x * 2 | |
| 0 [+4] UInt x | |
| if two_x < 100: | |
| 4 [+4] UInt if_two_x_lt_100 | |
| struct StructureWithValuesInLocation: | |
| let two_x = x * 2 | |
| 0 [+4] UInt x | |
| two_x [+4] UInt offset_two_x | |
| 4 [+two_x] UInt:32 size_two_x | |
| struct StructureWithBoolValue: | |
| let x_is_ten = x == 10 | |
| 0 [+4] UInt x | |
| struct StructureWithEnumValue: | |
| enum Category: | |
| SMALL = 1 | |
| LARGE = 2 | |
| let x_size = x < 100 ? Category.SMALL : Category.LARGE | |
| 0 [+4] UInt x | |
| struct StructureWithBitsWithValue: | |
| 0 [+4] BitsWithValue b | |
| let alias_of_b_sum = b.sum | |
| let alias_of_b_a = b.a | |
| bits BitsWithValue: | |
| 0 [+16] UInt a | |
| 16 [+16] UInt b | |
| let sum = a + b | |
| struct StructureUsingForeignConstants: | |
| StructureWithConstants.ten [+4] UInt x | |
| let one_hundred = StructureWithConstants.twenty * 5 | |
| struct SubfieldOfAlias: | |
| 0 [+4] struct header: | |
| 0 [+2] UInt size | |
| 2 [+2] UInt message_id | |
| let h = header | |
| let size = h.size | |
| struct RestrictedAlias: | |
| 0 [+4] BitsWithValue a_b | |
| 4 [+1] UInt alias_switch | |
| if alias_switch > 10: | |
| let a_b_alias = a_b | |
| struct HasField: | |
| 0 [+1] UInt z | |
| if $present(x.y): | |
| let y = x.y | |
| if z > 10: | |
| 1 [+2] struct x: | |
| 0 [+1] UInt v | |
| if v > 10: | |
| 1 [+1] UInt y | |
| if $present(x): | |
| let x_has_y = $present(x.y) | |
| struct VirtualUnconditionallyUsesConditional: | |
| 0 [+1] UInt x | |
| if x == 0: | |
| 1 [+1] UInt xc | |
| let x_nor_xc = x == 0 && xc == 0 | |
| struct UsesSize: | |
| 0 [+1] bits r: | |
| 0 [+8] UInt q | |
| let q_plus_bit_size = q + $size_in_bits | |
| let r_q_plus_byte_size = r.q + $size_in_bytes | |
| struct UsesExternalSize: | |
| 0 [+4] StructureWithConstants x | |
| x.$size_in_bytes [+StructureWithConstants.$size_in_bytes] StructureWithConstants y | |
| struct ImplicitWriteBack: | |
| 0 [+1] UInt x | |
| let x_plus_ten = x + 10 | |
| let ten_plus_x = 10 + x | |
| let x_minus_ten = x - 10 | |
| let ten_minus_x = 10 - x | |
| let ten_minus_x_plus_ten = (10 - x) + 10 |