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
}

enum NonConsecutive : int {
  Zero = 0,
  Big = 10000000,
}

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);

  foo_enum_nonconsecutive:NonConsecutive (id: 37);
  foo_enum_nonconsecutive_default:NonConsecutive = Big (id: 38);
}

root_type Configuration;
