# 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.

[$default byte_order: "LittleEndian"]
[(cpp) namespace: "emboss::test"]

enum Product:
  VERSION_1 = 0
  VERSION_2 = 10
  VERSION_X = 23


enum MessageId:
  AXIS   = 0
  CONFIG = 1


struct MultiVersion(product: Product):
  0 [+1]     MessageId                                   message_id
  if message_id == MessageId.AXIS:
    1 [+12]  Axes(product == Product.VERSION_X ? 3 : 2)  axes

  if message_id == MessageId.CONFIG:
    1 [+4]   Config                                      config

  if product == Product.VERSION_X && message_id == MessageId.CONFIG:
    1 [+8]   ConfigVX()                                  config_vx


struct Axes(axes: UInt:4):
  0 [+axes*4]  Axis(AxisType.GENERIC)[]  values
  if axes > 0:
    0 [+4]     Axis(AxisType.X_AXIS)     x

  if axes > 1:
    4 [+4]     Axis(AxisType.Y_AXIS)     y

  if axes > 2:
    8 [+4]     Axis(AxisType.Z_AXIS)     z

  let axis_count_plus_one = axes+1


struct AxisPair(axis_type_a_parameter: AxisType, axis_type_b_parameter: AxisType):
  0 [+4]  Axis(axis_type_a)  axis_a
  4 [+4]  Axis(axis_type_b)  axis_b
  let axis_type_a = axis_type_a_parameter
  let axis_type_b = axis_type_b_parameter


struct AxesEnvelope:
  0 [+1]             UInt:8            axis_count
  1 [+axis_count*4]  Axes(axis_count)  axes


enum AxisType:
  GENERIC = -1
  X_AXIS  = 1
  Y_AXIS  = 2
  Z_AXIS  = 3


struct Axis(axis_type_parameter: AxisType):
  0 [+4]    UInt:32  value
  if axis_type == AxisType.X_AXIS:
    0 [+4]  UInt:32  x

  if axis_type == AxisType.Y_AXIS:
    0 [+4]  UInt:32  y

  if axis_type == AxisType.Z_AXIS:
    0 [+4]  UInt:32  z

  let axis_type = axis_type_parameter


bits Config():
  31 [+1]  Flag  power


struct ConfigVX:
  0  [+4]  bits:
    31 [+1]       Flag  power

  4  [+4]         UInt  gain


struct StructWithUnusedParameter(x: UInt:8):
  0 [+1]  UInt  y

# StructContainingStructWithUnusedParameter is used to ensure that a struct is
# not Ok() if it does not have its parameters, even if it does not directly use
# those parameters.


struct StructContainingStructWithUnusedParameter:
  0 [+1]  StructWithUnusedParameter(x)  swup
  1 [+1]  UInt                          x

struct BiasedValue(bias: UInt:8):
  0 [+1]  UInt  raw_value
  let value = raw_value+bias

struct VirtualFirstFieldWithParam(param: UInt:8):
  # Regression test: virtual fields did not have `public:` annotations, causing
  # them to pick up the `private:` annotation from the parameter accessor when
  # they were first in the struct.
  let value = x
  0 [+1]  UInt  x

struct ConstVirtualFirstFieldWithParam(param: UInt:8):
  # Regression test: see VirtualFirstFieldWithParam
  let value = 10
  0 [+1]  UInt  x

struct SizedArrayOfBiasedValues:
  0 [+1]   UInt                 element_count (ec)
  1 [+1]   UInt                 bias
  2 [+ec]  BiasedValue(bias)[]  values
