blob: d9af20569e368d4e0cd1f86b2e9648b8b57a7bf3 [file] [log] [blame]
# 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