# 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