(*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements. See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership. The ASF licenses this file
 * to you 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
 *
 *   http://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.
 *)

unit TestSerializer.Data;

interface

uses
  Thrift.Collections,
  DebugProtoTest;


type
  Fixtures = class
  public
    class function CreateOneOfEach : IOneOfEach;
    class function CreateNesting : INesting;
    class function CreateHolyMoley : IHolyMoley;
    class function CreateCompactProtoTestStruct : ICompactProtoTestStruct;

  // These byte arrays are serialized versions of the above structs.
  // They were serialized in binary protocol using thrift 0.6.x and are used to
  // test backwards compatibility with respect to the standard scheme.
  (*
          all data copied from JAVA version,
          to be used later

  public static final byte[] persistentBytesOneOfEach = new byte[] {
    $02, $00, $01, $01, $02, $00, $02, $00, $03, $00,
    $03, $D6, $06, $00, $04, $69, $78, $08, $00, $05,
    $01, $00, $00, $00, $0A, $00, $06, $00, $00, $00,
    $01, $65, $A0, $BC, $00, $04, $00, $07, $40, $09,
    $21, $FB, $54, $44, $2D, $18, $0B, $00, $08, $00,
    $00, $00, $0D, $4A, $53, $4F, $4E, $20, $54, $48,
    $49, $53, $21, $20, $22, $01, $0B, $00, $09, $00,
    $00, $00, $2E, $D3, $80, $E2, $85, $AE, $CE, $9D,
    $20, $D0, $9D, $CE, $BF, $E2, $85, $BF, $D0, $BE,
    $C9, $A1, $D0, $B3, $D0, $B0, $CF, $81, $E2, $84,
    $8E, $20, $CE, $91, $74, $74, $CE, $B1, $E2, $85,
    $BD, $CE, $BA, $EF, $BF, $BD, $E2, $80, $BC, $02,
    $00, $0A, $00, $0B, $00, $0B, $00, $00, $00, $06,
    $62, $61, $73, $65, $36, $34, $0F, $00, $0C, $03,
    $00, $00, $00, $03, $01, $02, $03, $0F, $00, $0D,
    $06, $00, $00, $00, $03, $00, $01, $00, $02, $00,
    $03, $0F, $00, $0E, $0A, $00, $00, $00, $03, $00,
    $00, $00, $00, $00, $00, $00, $01, $00, $00, $00,
    $00, $00, $00, $00, $02, $00, $00, $00, $00, $00,
    $00, $00, $03, $00 };


  public static final byte[] persistentBytesNesting = new byte[] {
    $0C, $00, $01, $08, $00, $01, $00, $00, $7A, $69,
    $0B, $00, $02, $00, $00, $00, $13, $49, $20, $61,
    $6D, $20, $61, $20, $62, $6F, $6E, $6B, $2E, $2E,
    $2E, $20, $78, $6F, $72, $21, $00, $0C, $00, $02,
    $02, $00, $01, $01, $02, $00, $02, $00, $03, $00,
    $03, $D6, $06, $00, $04, $69, $78, $08, $00, $05,
    $01, $00, $00, $00, $0A, $00, $06, $00, $00, $00,
    $01, $65, $A0, $BC, $00, $04, $00, $07, $40, $09,
    $21, $FB, $54, $44, $2D, $18, $0B, $00, $08, $00,
    $00, $00, $0D, $4A, $53, $4F, $4E, $20, $54, $48,
    $49, $53, $21, $20, $22, $01, $0B, $00, $09, $00,
    $00, $00, $2E, $D3, $80, $E2, $85, $AE, $CE, $9D,
    $20, $D0, $9D, $CE, $BF, $E2, $85, $BF, $D0, $BE,
    $C9, $A1, $D0, $B3, $D0, $B0, $CF, $81, $E2, $84,
    $8E, $20, $CE, $91, $74, $74, $CE, $B1, $E2, $85,
    $BD, $CE, $BA, $EF, $BF, $BD, $E2, $80, $BC, $02,
    $00, $0A, $00, $0B, $00, $0B, $00, $00, $00, $06,
    $62, $61, $73, $65, $36, $34, $0F, $00, $0C, $03,
    $00, $00, $00, $03, $01, $02, $03, $0F, $00, $0D,
    $06, $00, $00, $00, $03, $00, $01, $00, $02, $00,
    $03, $0F, $00, $0E, $0A, $00, $00, $00, $03, $00,
    $00, $00, $00, $00, $00, $00, $01, $00, $00, $00,
    $00, $00, $00, $00, $02, $00, $00, $00, $00, $00,
    $00, $00, $03, $00, $00 };

  public static final byte[] persistentBytesHolyMoley = new byte[] {
    $0F, $00, $01, $0C, $00, $00, $00, $02, $02, $00,
    $01, $01, $02, $00, $02, $00, $03, $00, $03, $23,
    $06, $00, $04, $69, $78, $08, $00, $05, $01, $00,
    $00, $00, $0A, $00, $06, $00, $00, $00, $01, $65,
    $A0, $BC, $00, $04, $00, $07, $40, $09, $21, $FB,
    $54, $44, $2D, $18, $0B, $00, $08, $00, $00, $00,
    $0D, $4A, $53, $4F, $4E, $20, $54, $48, $49, $53,
    $21, $20, $22, $01, $0B, $00, $09, $00, $00, $00,
    $2E, $D3, $80, $E2, $85, $AE, $CE, $9D, $20, $D0,
    $9D, $CE, $BF, $E2, $85, $BF, $D0, $BE, $C9, $A1,
    $D0, $B3, $D0, $B0, $CF, $81, $E2, $84, $8E, $20,
    $CE, $91, $74, $74, $CE, $B1, $E2, $85, $BD, $CE,
    $BA, $EF, $BF, $BD, $E2, $80, $BC, $02, $00, $0A,
    $00, $0B, $00, $0B, $00, $00, $00, $06, $62, $61,
    $73, $65, $36, $34, $0F, $00, $0C, $03, $00, $00,
    $00, $03, $01, $02, $03, $0F, $00, $0D, $06, $00,
    $00, $00, $03, $00, $01, $00, $02, $00, $03, $0F,
    $00, $0E, $0A, $00, $00, $00, $03, $00, $00, $00,
    $00, $00, $00, $00, $01, $00, $00, $00, $00, $00,
    $00, $00, $02, $00, $00, $00, $00, $00, $00, $00,
    $03, $00, $02, $00, $01, $01, $02, $00, $02, $00,
    $03, $00, $03, $D6, $06, $00, $04, $69, $78, $08,
    $00, $05, $01, $00, $00, $00, $0A, $00, $06, $00,
    $00, $00, $01, $65, $A0, $BC, $00, $04, $00, $07,
    $40, $09, $21, $FB, $54, $44, $2D, $18, $0B, $00,
    $08, $00, $00, $00, $0D, $4A, $53, $4F, $4E, $20,
    $54, $48, $49, $53, $21, $20, $22, $01, $0B, $00,
    $09, $00, $00, $00, $2E, $D3, $80, $E2, $85, $AE,
    $CE, $9D, $20, $D0, $9D, $CE, $BF, $E2, $85, $BF,
    $D0, $BE, $C9, $A1, $D0, $B3, $D0, $B0, $CF, $81,
    $E2, $84, $8E, $20, $CE, $91, $74, $74, $CE, $B1,
    $E2, $85, $BD, $CE, $BA, $EF, $BF, $BD, $E2, $80,
    $BC, $02, $00, $0A, $00, $0B, $00, $0B, $00, $00,
    $00, $06, $62, $61, $73, $65, $36, $34, $0F, $00,
    $0C, $03, $00, $00, $00, $03, $01, $02, $03, $0F,
    $00, $0D, $06, $00, $00, $00, $03, $00, $01, $00,
    $02, $00, $03, $0F, $00, $0E, $0A, $00, $00, $00,
    $03, $00, $00, $00, $00, $00, $00, $00, $01, $00,
    $00, $00, $00, $00, $00, $00, $02, $00, $00, $00,
    $00, $00, $00, $00, $03, $00, $0E, $00, $02, $0F,
    $00, $00, $00, $03, $0B, $00, $00, $00, $00, $0B,
    $00, $00, $00, $03, $00, $00, $00, $0F, $74, $68,
    $65, $6E, $20, $61, $20, $6F, $6E, $65, $2C, $20,
    $74, $77, $6F, $00, $00, $00, $06, $74, $68, $72,
    $65, $65, $21, $00, $00, $00, $06, $46, $4F, $55,
    $52, $21, $21, $0B, $00, $00, $00, $02, $00, $00,
    $00, $09, $61, $6E, $64, $20, $61, $20, $6F, $6E,
    $65, $00, $00, $00, $09, $61, $6E, $64, $20, $61,
    $20, $74, $77, $6F, $0D, $00, $03, $0B, $0F, $00,
    $00, $00, $03, $00, $00, $00, $03, $74, $77, $6F,
    $0C, $00, $00, $00, $02, $08, $00, $01, $00, $00,
    $00, $01, $0B, $00, $02, $00, $00, $00, $05, $57,
    $61, $69, $74, $2E, $00, $08, $00, $01, $00, $00,
    $00, $02, $0B, $00, $02, $00, $00, $00, $05, $57,
    $68, $61, $74, $3F, $00, $00, $00, $00, $05, $74,
    $68, $72, $65, $65, $0C, $00, $00, $00, $00, $00,
    $00, $00, $04, $7A, $65, $72, $6F, $0C, $00, $00,
    $00, $00, $00 };


*)

  private
    const
      kUnicodeBytes : packed array[0..43] of Byte
                    = ( $d3, $80, $e2, $85, $ae, $ce, $9d, $20, $d0, $9d,
                        $ce, $bf, $e2, $85, $bf, $d0, $be, $c9, $a1, $d0,
                        $b3, $d0, $b0, $cf, $81, $e2, $84, $8e, $20, $ce,
                        $91, $74, $74, $ce, $b1, $e2, $85, $bd, $ce, $ba,
                        $83, $e2, $80, $bc);

  end;


implementation


class function Fixtures.CreateOneOfEach : IOneOfEach;
var db : Double;
    us : Utf8String;
begin
  result := TOneOfEachImpl.Create;
  result.setIm_true( TRUE);
  result.setIm_false( FALSE);
  result.setA_bite( ShortInt($D6));
  result.setInteger16( 27000);
  result.setInteger32( 1 shl 24);
  result.setInteger64( Int64(6000) * Int64(1000) * Int64(1000));
  db := Pi;
  result.setDouble_precision( db);
  result.setSome_characters( 'JSON THIS! \"\1');

  // ??
  SetLength( us, Length(kUnicodeBytes));
  Move( kUnicodeBytes[0], us[1], Length(kUnicodeBytes));
  // ??
  SetString( us, PChar(@kUnicodeBytes[0]), Length(kUnicodeBytes));
  // !!
  result.setZomg_unicode( UnicodeString( us));

  {$IF cDebugProtoTest_Option_AnsiStr_Binary}
  result.SetBase64('base64');
  {$ELSE}
  not yet impl
  {$IFEND}

  // byte, i16, and i64 lists are populated by default constructor
end;


class function Fixtures.CreateNesting : INesting;
var bonk : IBonk;
begin
  bonk := TBonkImpl.Create;
  bonk.Type_   := 31337;
  bonk.Message := 'I am a bonk... xor!';

  result := TNestingImpl.Create;
  result.My_bonk := bonk;
  result.My_ooe := CreateOneOfEach;
end;


class function Fixtures.CreateHolyMoley : IHolyMoley;
var big : IThriftList<IOneOfEach>;
    stage1 : IThriftList<String>;
    stage2 : IThriftList<IBonk>;
    b      : IBonk;
begin
  result := THolyMoleyImpl.Create;

  big := TThriftListImpl<IOneOfEach>.Create;
  big.add( CreateOneOfEach);
  big.add( CreateNesting.my_ooe);
  result.Big := big;
  result.Big[0].setA_bite( $22);
  result.Big[0].setA_bite( $23);

  result.Contain := THashSetImpl< IThriftList<string>>.Create;
  stage1 := TThriftListImpl<String>.Create;
  stage1.add( 'and a one');
  stage1.add( 'and a two');
  result.Contain.add( stage1);

  stage1 := TThriftListImpl<String>.Create;
  stage1.add( 'then a one, two');
  stage1.add( 'three!');
  stage1.add( 'FOUR!!');
  result.Contain.add( stage1);

  stage1 := TThriftListImpl<String>.Create;
  result.Contain.add( stage1);

  stage2 := TThriftListImpl<IBonk>.Create;
  result.Bonks := TThriftDictionaryImpl< String, IThriftList< IBonk>>.Create;
  // one empty
  result.Bonks.Add( 'zero', stage2);

  // one with two
  stage2 := TThriftListImpl<IBonk>.Create;
  b := TBonkImpl.Create;
  b.type_ := 1;
  b.message := 'Wait.';
  stage2.Add( b);
  b := TBonkImpl.Create;
  b.type_ := 2;
  b.message := 'What?';
  stage2.Add( b);
  result.Bonks.Add( 'two', stage2);

  // one with three
  stage2 := TThriftListImpl<IBonk>.Create;
  b := TBonkImpl.Create;
  b.type_ := 3;
  b.message := 'quoth';
  stage2.Add( b);
  b := TBonkImpl.Create;
  b.type_ := 4;
  b.message := 'the raven';
  stage2.Add( b);
  b := TBonkImpl.Create;
  b.type_ := 5;
  b.message := 'nevermore';
  stage2.Add( b);
  result.bonks.Add( 'three', stage2);
end;


class function Fixtures.CreateCompactProtoTestStruct : ICompactProtoTestStruct;
// superhuge compact proto test struct
begin
  result := TCompactProtoTestStructImpl.Create;
  result.A_byte := TConstants.COMPACT_TEST.A_byte;
  result.A_i16 := TConstants.COMPACT_TEST.A_i16;
  result.A_i32 := TConstants.COMPACT_TEST.A_i32;
  result.A_i64 := TConstants.COMPACT_TEST.A_i64;
  result.A_double := TConstants.COMPACT_TEST.A_double;
  result.A_string := TConstants.COMPACT_TEST.A_string;
  result.A_binary := TConstants.COMPACT_TEST.A_binary;
  result.True_field := TConstants.COMPACT_TEST.True_field;
  result.False_field := TConstants.COMPACT_TEST.False_field;
  result.Empty_struct_field := TConstants.COMPACT_TEST.Empty_struct_field;
  result.Byte_list := TConstants.COMPACT_TEST.Byte_list;
  result.I16_list := TConstants.COMPACT_TEST.I16_list;
  result.I32_list := TConstants.COMPACT_TEST.I32_list;
  result.I64_list := TConstants.COMPACT_TEST.I64_list;
  result.Double_list := TConstants.COMPACT_TEST.Double_list;
  result.String_list := TConstants.COMPACT_TEST.String_list;
  result.Binary_list := TConstants.COMPACT_TEST.Binary_list;
  result.Boolean_list := TConstants.COMPACT_TEST.Boolean_list;
  result.Struct_list := TConstants.COMPACT_TEST.Struct_list;
  result.Byte_set := TConstants.COMPACT_TEST.Byte_set;
  result.I16_set := TConstants.COMPACT_TEST.I16_set;
  result.I32_set := TConstants.COMPACT_TEST.I32_set;
  result.I64_set := TConstants.COMPACT_TEST.I64_set;
  result.Double_set := TConstants.COMPACT_TEST.Double_set;
  result.String_set := TConstants.COMPACT_TEST.String_set;
  result.String_set := TConstants.COMPACT_TEST.String_set;
  result.String_set := TConstants.COMPACT_TEST.String_set;
  result.Binary_set := TConstants.COMPACT_TEST.Binary_set;
  result.Boolean_set := TConstants.COMPACT_TEST.Boolean_set;
  result.Struct_set := TConstants.COMPACT_TEST.Struct_set;
  result.Byte_byte_map := TConstants.COMPACT_TEST.Byte_byte_map;
  result.I16_byte_map := TConstants.COMPACT_TEST.I16_byte_map;
  result.I32_byte_map := TConstants.COMPACT_TEST.I32_byte_map;
  result.I64_byte_map := TConstants.COMPACT_TEST.I64_byte_map;
  result.Double_byte_map := TConstants.COMPACT_TEST.Double_byte_map;
  result.String_byte_map := TConstants.COMPACT_TEST.String_byte_map;
  result.Binary_byte_map := TConstants.COMPACT_TEST.Binary_byte_map;
  result.Boolean_byte_map := TConstants.COMPACT_TEST.Boolean_byte_map;
  result.Byte_i16_map := TConstants.COMPACT_TEST.Byte_i16_map;
  result.Byte_i32_map := TConstants.COMPACT_TEST.Byte_i32_map;
  result.Byte_i64_map := TConstants.COMPACT_TEST.Byte_i64_map;
  result.Byte_double_map := TConstants.COMPACT_TEST.Byte_double_map;
  result.Byte_string_map := TConstants.COMPACT_TEST.Byte_string_map;
  result.Byte_binary_map := TConstants.COMPACT_TEST.Byte_binary_map;
  result.Byte_boolean_map := TConstants.COMPACT_TEST.Byte_boolean_map;
  result.List_byte_map := TConstants.COMPACT_TEST.List_byte_map;
  result.Set_byte_map := TConstants.COMPACT_TEST.Set_byte_map;
  result.Map_byte_map := TConstants.COMPACT_TEST.Map_byte_map;
  result.Byte_map_map := TConstants.COMPACT_TEST.Byte_map_map;
  result.Byte_set_map := TConstants.COMPACT_TEST.Byte_set_map;
  result.Byte_list_map := TConstants.COMPACT_TEST.Byte_list_map;

  {$IF cDebugProtoTest_Option_AnsiStr_Binary}
  result.A_binary := AnsiString( #0#1#2#3#4#5#6#7#8);
  {$ELSE}
  not yet impl
  {$IFEND}
end;


end.

