namespace aos.testing;

enum BaseType : byte {
    None,
    UType,
    Bool,
    Byte,
    UByte,
    Short,
    UShort,
    Int,
    UInt,
    Long,
    ULong,
    Float,
    Double,
    String,
    Vector,
    Obj,     // Used for tables & structs.
    Union,
    Array
}

table Location {
  name:string (id: 0);
  type:string (id: 1);
  frequency:int (id: 2);
  max_size:int (id: 3);
}

table Map {
  match:Location (id: 0);
  rename:Location (id: 1);
}

table Application {
  name:string (id: 0);
  priority:int (id: 1);
  maps:[Map] (id: 2);
  long_thingy:uint64 (id: 3);
}

table VectorOfStrings {
  str:[string] (id: 0);
}

table VectorOfVectorOfString {
  v:[VectorOfStrings] (id: 0);
}

struct FooStructNested {
  foo_byte:byte;
}

struct FooStruct {
  foo_byte:byte;
  nested_struct:FooStructNested;
}

struct StructEnum {
  foo_enum:BaseType;
}

table Configuration {
  locations:[Location] (id: 0);
  maps:[Map] (id: 1);
  apps:[Application] (id: 2);
  imports:[string] (id: 3);

  // 8 bit: byte ubyte bool
  // 16 bit: short ushort
  // 32 bit: int uint float
  // 64 bit: long ulong double

  // Simple values.
  foo_byte:byte (id: 4);
  foo_ubyte:ubyte (id: 5);
  foo_bool:bool (id: 6);

  foo_short:short (id: 7);
  foo_ushort:ushort (id: 8);

  foo_int:int (id: 9);
  foo_uint:uint (id: 10);

  foo_long:long (id: 11);
  foo_ulong:ulong (id: 12);

  foo_float:float (id: 13);
  foo_double:double (id: 14);

  foo_string:string (id: 15);

  foo_enum:BaseType (id: 16);
  foo_enum_default:BaseType = None (id: 17);

  // Test vectors now.
  vector_foo_byte:[byte] (id: 18);
  vector_foo_ubyte:[ubyte] (id: 19);
  vector_foo_bool:[bool] (id: 20);

  vector_foo_short:[short] (id: 21);
  vector_foo_ushort:[ushort] (id: 22);

  vector_foo_int:[int] (id: 23);
  vector_foo_uint:[uint] (id: 24);

  vector_foo_long:[long] (id: 25);
  vector_foo_ulong:[ulong] (id: 26);

  vector_foo_float:[float] (id: 27);
  vector_foo_double:[double] (id: 28);

  vector_foo_string:[string] (id: 29);

  vector_foo_enum:[BaseType] (id: 30);

  // And a simple nested application.
  single_application:Application (id: 31);

  // And nest this object to get some crazy coverage.
  nested_config:Configuration (id: 32);

  vov:VectorOfVectorOfString (id: 33);

  foo_struct:FooStruct (id: 34);
  vector_foo_struct:[FooStruct] (id: 35);
  foo_struct_enum:StructEnum (id: 36);
}

root_type Configuration;
