1*99e0aae7SDavid Rees# Copyright 2019 Google LLC 2*99e0aae7SDavid Rees# 3*99e0aae7SDavid Rees# Licensed under the Apache License, Version 2.0 (the "License"); 4*99e0aae7SDavid Rees# you may not use this file except in compliance with the License. 5*99e0aae7SDavid Rees# You may obtain a copy of the License at 6*99e0aae7SDavid Rees# 7*99e0aae7SDavid Rees# https://www.apache.org/licenses/LICENSE-2.0 8*99e0aae7SDavid Rees# 9*99e0aae7SDavid Rees# Unless required by applicable law or agreed to in writing, software 10*99e0aae7SDavid Rees# distributed under the License is distributed on an "AS IS" BASIS, 11*99e0aae7SDavid Rees# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*99e0aae7SDavid Rees# See the License for the specific language governing permissions and 13*99e0aae7SDavid Rees# limitations under the License. 14*99e0aae7SDavid Rees 15*99e0aae7SDavid Rees-- Tests for virtual fields: 16*99e0aae7SDavid Rees-- 17*99e0aae7SDavid Rees-- * `let` constructs 18*99e0aae7SDavid Rees-- * TODO(bolms@): `transform` annotations 19*99e0aae7SDavid Rees-- * TODO(bolms@): `read` and `write` annotations 20*99e0aae7SDavid Rees 21*99e0aae7SDavid Rees[$default byte_order: "LittleEndian"] 22*99e0aae7SDavid Rees[(cpp) namespace: "emboss::test"] 23*99e0aae7SDavid Rees 24*99e0aae7SDavid Rees 25*99e0aae7SDavid Reesstruct StructureWithConstants: 26*99e0aae7SDavid Rees let ten = 10 27*99e0aae7SDavid Rees let twenty = 20 28*99e0aae7SDavid Rees let four_billion = 4_000_000_000 29*99e0aae7SDavid Rees let ten_billion = 10_000_000_000 30*99e0aae7SDavid Rees let minus_ten_billion = -10_000_000_000 31*99e0aae7SDavid Rees 0 [+4] UInt value 32*99e0aae7SDavid Rees let alias_of_value = value 33*99e0aae7SDavid Rees let alias_of_alias_of_value = alias_of_value 34*99e0aae7SDavid Rees let alias_of_ten = ten 35*99e0aae7SDavid Rees let alias_of_alias_of_ten = alias_of_ten 36*99e0aae7SDavid Rees 37*99e0aae7SDavid Rees 38*99e0aae7SDavid Reesstruct StructureWithComputedValues: 39*99e0aae7SDavid Rees 0 [+4] UInt value 40*99e0aae7SDavid Rees let doubled = value * 2 41*99e0aae7SDavid Rees let plus_ten = value + 10 42*99e0aae7SDavid Rees let signed_doubled = value2 * 2 43*99e0aae7SDavid Rees let signed_plus_ten = value2 + 10 44*99e0aae7SDavid Rees let product = value * value2 45*99e0aae7SDavid Rees 4 [+4] Int value2 46*99e0aae7SDavid Rees 47*99e0aae7SDavid Rees 48*99e0aae7SDavid Reesstruct StructureWithConditionalValue: 49*99e0aae7SDavid Rees 0 [+4] UInt x 50*99e0aae7SDavid Rees if x < 0x8000_0000: 51*99e0aae7SDavid Rees let two_x = x * 2 52*99e0aae7SDavid Rees let x_plus_one = x + 1 53*99e0aae7SDavid Rees 54*99e0aae7SDavid Rees 55*99e0aae7SDavid Reesstruct StructureWithValueInCondition: 56*99e0aae7SDavid Rees let two_x = x * 2 57*99e0aae7SDavid Rees 0 [+4] UInt x 58*99e0aae7SDavid Rees if two_x < 100: 59*99e0aae7SDavid Rees 4 [+4] UInt if_two_x_lt_100 60*99e0aae7SDavid Rees 61*99e0aae7SDavid Rees 62*99e0aae7SDavid Reesstruct StructureWithValuesInLocation: 63*99e0aae7SDavid Rees let two_x = x * 2 64*99e0aae7SDavid Rees 0 [+4] UInt x 65*99e0aae7SDavid Rees two_x [+4] UInt offset_two_x 66*99e0aae7SDavid Rees 4 [+two_x] UInt:32 size_two_x 67*99e0aae7SDavid Rees 68*99e0aae7SDavid Rees 69*99e0aae7SDavid Reesstruct StructureWithBoolValue: 70*99e0aae7SDavid Rees let x_is_ten = x == 10 71*99e0aae7SDavid Rees 0 [+4] UInt x 72*99e0aae7SDavid Rees 73*99e0aae7SDavid Rees 74*99e0aae7SDavid Reesstruct StructureWithEnumValue: 75*99e0aae7SDavid Rees enum Category: 76*99e0aae7SDavid Rees SMALL = 1 77*99e0aae7SDavid Rees LARGE = 2 78*99e0aae7SDavid Rees let x_size = x < 100 ? Category.SMALL : Category.LARGE 79*99e0aae7SDavid Rees 0 [+4] UInt x 80*99e0aae7SDavid Rees 81*99e0aae7SDavid Rees 82*99e0aae7SDavid Reesstruct StructureWithBitsWithValue: 83*99e0aae7SDavid Rees 0 [+4] BitsWithValue b 84*99e0aae7SDavid Rees let alias_of_b_sum = b.sum 85*99e0aae7SDavid Rees let alias_of_b_a = b.a 86*99e0aae7SDavid Rees 87*99e0aae7SDavid Rees 88*99e0aae7SDavid Reesbits BitsWithValue: 89*99e0aae7SDavid Rees 0 [+16] UInt a 90*99e0aae7SDavid Rees 16 [+16] UInt b 91*99e0aae7SDavid Rees let sum = a + b 92*99e0aae7SDavid Rees 93*99e0aae7SDavid Rees 94*99e0aae7SDavid Reesstruct StructureUsingForeignConstants: 95*99e0aae7SDavid Rees StructureWithConstants.ten [+4] UInt x 96*99e0aae7SDavid Rees let one_hundred = StructureWithConstants.twenty * 5 97*99e0aae7SDavid Rees 98*99e0aae7SDavid Rees 99*99e0aae7SDavid Reesstruct SubfieldOfAlias: 100*99e0aae7SDavid Rees 0 [+4] struct header: 101*99e0aae7SDavid Rees 0 [+2] UInt size 102*99e0aae7SDavid Rees 2 [+2] UInt message_id 103*99e0aae7SDavid Rees let h = header 104*99e0aae7SDavid Rees let size = h.size 105*99e0aae7SDavid Rees 106*99e0aae7SDavid Rees 107*99e0aae7SDavid Reesstruct RestrictedAlias: 108*99e0aae7SDavid Rees 0 [+4] BitsWithValue a_b 109*99e0aae7SDavid Rees 4 [+1] UInt alias_switch 110*99e0aae7SDavid Rees if alias_switch > 10: 111*99e0aae7SDavid Rees let a_b_alias = a_b 112*99e0aae7SDavid Rees 113*99e0aae7SDavid Rees 114*99e0aae7SDavid Reesstruct HasField: 115*99e0aae7SDavid Rees 0 [+1] UInt z 116*99e0aae7SDavid Rees if $present(x.y): 117*99e0aae7SDavid Rees let y = x.y 118*99e0aae7SDavid Rees if z > 10: 119*99e0aae7SDavid Rees 1 [+2] struct x: 120*99e0aae7SDavid Rees 0 [+1] UInt v 121*99e0aae7SDavid Rees if v > 10: 122*99e0aae7SDavid Rees 1 [+1] UInt y 123*99e0aae7SDavid Rees if $present(x): 124*99e0aae7SDavid Rees let x_has_y = $present(x.y) 125*99e0aae7SDavid Rees 126*99e0aae7SDavid Rees 127*99e0aae7SDavid Reesstruct VirtualUnconditionallyUsesConditional: 128*99e0aae7SDavid Rees 0 [+1] UInt x 129*99e0aae7SDavid Rees if x == 0: 130*99e0aae7SDavid Rees 1 [+1] UInt xc 131*99e0aae7SDavid Rees 132*99e0aae7SDavid Rees let x_nor_xc = x == 0 && xc == 0 133*99e0aae7SDavid Rees 134*99e0aae7SDavid Rees 135*99e0aae7SDavid Reesstruct UsesSize: 136*99e0aae7SDavid Rees 0 [+1] bits r: 137*99e0aae7SDavid Rees 0 [+8] UInt q 138*99e0aae7SDavid Rees let q_plus_bit_size = q + $size_in_bits 139*99e0aae7SDavid Rees let r_q_plus_byte_size = r.q + $size_in_bytes 140*99e0aae7SDavid Rees 141*99e0aae7SDavid Rees 142*99e0aae7SDavid Reesstruct UsesExternalSize: 143*99e0aae7SDavid Rees 0 [+4] StructureWithConstants x 144*99e0aae7SDavid Rees x.$size_in_bytes [+StructureWithConstants.$size_in_bytes] StructureWithConstants y 145*99e0aae7SDavid Rees 146*99e0aae7SDavid Rees 147*99e0aae7SDavid Reesstruct ImplicitWriteBack: 148*99e0aae7SDavid Rees 0 [+1] UInt x 149*99e0aae7SDavid Rees let x_plus_ten = x + 10 150*99e0aae7SDavid Rees let ten_plus_x = 10 + x 151*99e0aae7SDavid Rees let x_minus_ten = x - 10 152*99e0aae7SDavid Rees let ten_minus_x = 10 - x 153*99e0aae7SDavid Rees let ten_minus_x_plus_ten = (10 - x) + 10 154