123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513 |
- unit utSchemaPascalTypes;
- {$mode ObjFPC}{$H+}
- interface
- uses
- Classes, SysUtils, fpcunit, testregistry, fpjson, fpjson.schema.types, fpjson.schema.pascaltypes, fpjson.schema.schema;
- Type
- { TTestSchemaPascalType }
- TTestSchemaPascalType = class(TTestCase)
- private
- FSchema: TJSONSchema;
- FSchemaData: TSchemaData;
- FType : TPascalTypeData;
- function DefineProperty(aName: string; aType: TSchemaSimpleType; aFormat: String='') : TJSONSchema;
- Public
- Procedure SetUp; override;
- Procedure TearDown; override;
- procedure DoAddProperties;
- procedure AssertEquals(const Msg: string; aExpected, aActual: TPascalType); overload;
- function AssertPascalTypeData(const Msg: string; aType: TPascalTypeData; aPascaltype: TPascalType; const aSchemaName, aPascalName: String) : TPascalTypeData;
- procedure AssertProperty(Msg: String; aType: TPascalTypeData; aIndex: Integer; const aSchemaName, aPascalName, aPascalTypeName: String; aPascalType: TPascalType; aTypeData: TPascalTypeData);
- Property Schema : TJSONSchema Read FSchema;
- Property Data : TSchemaData Read FSchemaData;
- Published
- Procedure TestHookup;
- Procedure TestTypeMap;
- procedure TestCreatePascalType;
- Procedure TestAddType;
- Procedure TestAddTypeAlias;
- Procedure TestStandardTypes;
- Procedure TestAddPropertiesInteger;
- procedure TestAddPropertiesInt64;
- procedure TestAddPropertiesString;
- procedure TestAddPropertiesStringDate;
- procedure TestAddPropertiesStringDateTime;
- procedure TestAddPropertiesStringTime;
- procedure TestAddPropertiesStringNoEnum;
- procedure TestAddPropertiesStringEnum;
- procedure TestAddPropertiesNumber;
- procedure TestAddPropertiesBoolean;
- procedure TestAddPropertiesAny;
- procedure TestAddPropertiesEmptyObject;
- procedure TestAddPropertiesNone;
- procedure TestAddPropertiesNull;
- procedure TestAddPropertiesMulti;
- procedure TestAddPropertiesArray;
- procedure TestAddPropertiesArrayDelphi;
- procedure TestAddPropertiesArrayMultiValue;
- procedure TestAddPropertiesObject;
- procedure TestAddPropertiesObjectExisting;
- end;
- implementation
- uses TypInfo;
- { TTestSchemaPascalType }
- procedure TTestSchemaPascalType.SetUp;
- begin
- inherited SetUp;
- FSchemaData:=TSchemaData.Create;
- Fschema:=TJSONSchema.Create;
- end;
- procedure TTestSchemaPascalType.TearDown;
- begin
- FreeAndNil(FSchema);
- FreeAndNil(FSchemaData);
- inherited TearDown;
- end;
- procedure TTestSchemaPascalType.AssertEquals(const Msg : string; aExpected, aActual : TPascalType);
- begin
- AssertEquals(Msg,GetEnumName(Typeinfo(TPascalType),Ord(aExpected)),
- GetEnumName(Typeinfo(TPascalType),Ord(aActual)));
- end;
- function TTestSchemaPascalType.AssertPascalTypeData(const Msg: string; aType: TPascalTypeData; aPascaltype: TPascalType;
- const aSchemaName, aPascalName: String): TPascalTypeData;
- begin
- AssertNotNull(Msg+': have type',aType);
- AssertEquals(Msg+' Schema name',aSchemaName,aType.SchemaName);
- AssertEquals(Msg+' Pascal name',aPascalName,aType.PascalName);
- AssertEquals(Msg+' Pascal type',aPascalType,aType.PascalType);
- Result:=aType;
- end;
- procedure TTestSchemaPascalType.TestHookup;
- begin
- AssertNotNull('Have schema',Data);
- AssertEquals('No types',0,Data.TypeCount);
- end;
- procedure TTestSchemaPascalType.TestTypeMap;
- begin
- Data.AddAliasToTypeMap(ptInteger,'a','a','b',Nil);
- AssertEquals('Correct existing map','b',Data.TypeMap['a']);
- AssertEquals('Correct nonexisting map','c',Data.TypeMap['c']);
- end;
- procedure TTestSchemaPascalType.TestCreatePascalType;
- var
- aType : TPascalTypeData;
- S : TJSONSchema;
- begin
- S:=TJSONSchema.Create;
- aType:=Data.CreatePascalType(0,ptSchemaStruct,'a','Ta',S);
- try
- AssertPascalTypeData('basic',aType,ptSchemaStruct,'a','Ta');
- AssertSame('Schema',S,aType.Schema);
- AssertEquals('Not added to types',0,Data.TypeCount);
- finally
- aType.Free;
- S.Free;
- end;
- end;
- procedure TTestSchemaPascalType.TestAddType;
- var
- aType : TPascalTypeData;
- begin
- aType:=Data.CreatePascalType(0,ptSchemaStruct,'a','Ta',Nil);
- Data.AddType('a',aType);
- AssertEquals('Not added to types',1,Data.TypeCount);
- AssertSame('Can find',aType,Data.FindSchemaTypeData('a'));
- AssertEquals('Can index',0,Data.IndexOfSchemaType('a'));
- end;
- procedure TTestSchemaPascalType.TestAddTypeAlias;
- begin
- Data.AddAliasToTypeMap(ptInteger,'int','int','integer',Nil);
- AssertNotNull('Can find',Data.FindSchemaTypeData('int'));
- AssertEquals('Cannot index',-1,Data.IndexOfSchemaType('int'));
- AssertEquals('Not added to types',0,Data.Typecount);
- end;
- procedure TTestSchemaPascalType.TestStandardTypes;
- begin
- Data.DefineStandardPascalTypes;
- AssertPascalTypeData('integer',Data.FindSchemaTypeData('integer'),ptInteger,'integer','integer');
- AssertPascalTypeData('int64',Data.FindSchemaTypeData('integer','int64'),ptInt64,'integer','int64');
- AssertPascalTypeData('string',Data.FindSchemaTypeData('string'),ptString,'string','string');
- AssertPascalTypeData('date-time',Data.FindSchemaTypeData('string--date-time'),ptDateTime,'string','TDateTime');
- AssertPascalTypeData('date',Data.FindSchemaTypeData('string--date'),ptDateTime,'string','TDateTime');
- AssertPascalTypeData('time',Data.FindSchemaTypeData('string--time'),ptDateTime,'string','TDateTime');
- AssertPascalTypeData('boolean',Data.FindSchemaTypeData('boolean'),ptBoolean,'boolean','boolean');
- AssertPascalTypeData('number',Data.FindSchemaTypeData('number'),ptFloat64,'number','double');
- end;
- procedure TTestSchemaPascalType.AssertProperty(Msg : String; aType : TPascalTypeData; aIndex : Integer; const aSchemaName,aPascalName,aPascalTypeName : String; aPascalType : TPascalType; aTypeData : TPascalTypeData);
- var
- lProp : TPascalPropertyData;
- begin
- AssertNotNull(Msg+': have type',aType);
- AssertTrue(Msg+': have properties',aType.PropertyCount>0);
- AssertTrue(Msg+': have valid index',aIndex<aType.PropertyCount);
- lProp:=aType.Properties[aIndex];
- AssertNotNull(Msg+': have property',lProp);
- AssertEquals(Msg+': schema name',aSchemaName,lProp.SchemaName);
- AssertEquals(Msg+': pascal name',aPascalName,lProp.PascalName);
- AssertEquals(Msg+': Pascal type name',aPascalTypeName,lProp.PascalTypeName);
- AssertEquals(Msg+': Pascal type',aPascalType,lProp.PropertyType);
- AssertSame(Msg+': Type data',aTypeData,lProp.TypeData);
- end;
- function TTestSchemaPascalType.DefineProperty(aName: string; aType: TSchemaSimpleType; aFormat: String): TJSONSchema;
- begin
- Data.DefineStandardPascalTypes;
- Result:=TJSONSchema.Create;
- Result.Name:=aName;
- Result.Validations.Types:=[aType];
- if aFormat<>'' then
- Result.Validations.Format:=aFormat;
- Schema.Properties.Add(Result);
- end;
- procedure TTestSchemaPascalType.TestAddPropertiesInteger;
- var
- aType : TPascalTypeData;
- begin
- DefineProperty('b',sstInteger,'');
- aType:=Data.CreatePascalType(0,ptSchemaStruct,'a','Ta',Schema);
- Data.AddType('a',aType);
- Data.AddPropertiesToType(aType);
- AssertPascalTypeData('Ta',Data.FindSchemaTypeData('a'),ptSchemaStruct,'a','Ta');
- AssertProperty('Integer',aType,0,'b','b','integer',ptInteger,Data.FindSchemaTypeData('integer'));
- end;
- procedure TTestSchemaPascalType.TestAddPropertiesInt64;
- var
- aType : TPascalTypeData;
- begin
- DefineProperty('b',sstInteger,'int64');
- aType:=Data.CreatePascalType(0,ptSchemaStruct,'a','Ta',Schema);
- Data.AddType('a',aType);
- Data.AddPropertiesToType(aType);
- AssertPascalTypeData('Ta',Data.FindSchemaTypeData('a'),ptSchemaStruct,'a','Ta');
- AssertProperty('Int64',aType,0,'b','b','int64',ptInt64,Data.FindSchemaTypeData('integer','int64'));
- end;
- procedure TTestSchemaPascalType.TestAddPropertiesString;
- var
- aType : TPascalTypeData;
- begin
- DefineProperty('b',sstString,'');
- aType:=Data.CreatePascalType(0,ptSchemaStruct,'a','Ta',Schema);
- Data.AddType('a',aType);
- Data.AddPropertiesToType(aType);
- AssertPascalTypeData('Ta',Data.FindSchemaTypeData('a'),ptSchemaStruct,'a','Ta');
- AssertProperty('String',aType,0,'b','b','string',ptString,Data.FindSchemaTypeData('string'));
- end;
- procedure TTestSchemaPascalType.TestAddPropertiesStringDate;
- var
- aType : TPascalTypeData;
- begin
- DefineProperty('b',sstString,'date');
- aType:=Data.CreatePascalType(0,ptSchemaStruct,'a','Ta',Schema);
- Data.AddType('a',aType);
- Data.AddPropertiesToType(aType);
- AssertPascalTypeData('Ta',Data.FindSchemaTypeData('a'),ptSchemaStruct,'a','Ta');
- AssertProperty('Date',aType,0,'b','b','TDateTime',ptDateTime,Data.FindSchemaTypeData('string','date'));
- end;
- procedure TTestSchemaPascalType.TestAddPropertiesStringDateTime;
- var
- aType : TPascalTypeData;
- begin
- DefineProperty('b',sstString,'date-time');
- aType:=Data.CreatePascalType(0,ptSchemaStruct,'a','Ta',Schema);
- Data.AddType('a',aType);
- Data.AddPropertiesToType(aType);
- AssertPascalTypeData('Ta',Data.FindSchemaTypeData('a'),ptSchemaStruct,'a','Ta');
- AssertProperty('Date',aType,0,'b','b','TDateTime',ptDateTime,Data.FindSchemaTypeData('string','date-time'));
- end;
- procedure TTestSchemaPascalType.TestAddPropertiesStringTime;
- var
- aType : TPascalTypeData;
- begin
- DefineProperty('b',sstString,'time');
- aType:=Data.CreatePascalType(0,ptSchemaStruct,'a','Ta',Schema);
- Data.AddType('a',aType);
- Data.AddPropertiesToType(aType);
- AssertPascalTypeData('Ta',Data.FindSchemaTypeData('a'),ptSchemaStruct,'a','Ta');
- AssertProperty('Date',aType,0,'b','b','TDateTime',ptDateTime,Data.FindSchemaTypeData('string','time'));
- end;
- procedure TTestSchemaPascalType.TestAddPropertiesStringNoEnum;
- var
- lProp : TJSONSchema;
- aType : TPascalTypeData;
- begin
- lprop:=DefineProperty('b',sstString,'');
- lProp.Validations.Enum:=TJSONArray.Create(['de','fg','hi']);
- aType:=Data.CreatePascalType(0,ptSchemaStruct,'a','Ta',Schema);
- Data.AddType('a',aType);
- Data.AddPropertiesToType(aType);
- AssertPascalTypeData('Ta',Data.FindSchemaTypeData('a'),ptSchemaStruct,'a','Ta');
- AssertProperty('Enum',aType,0,'b','b','string',ptString,Data.FindSchemaTypeData('string'));
- end;
- procedure TTestSchemaPascalType.TestAddPropertiesStringEnum;
- var
- lProp : TJSONSchema;
- aType : TPascalTypeData;
- begin
- Data.UseEnums:=True;
- lprop:=DefineProperty('b',sstString,'');
- lProp.Validations.Enum:=TJSONArray.Create(['de','fg','hi']);
- aType:=Data.CreatePascalType(0,ptSchemaStruct,'a','Ta',Schema);
- Data.AddType('a',aType);
- Data.AddPropertiesToType(aType);
- AssertPascalTypeData('Ta',Data.FindSchemaTypeData('a'),ptSchemaStruct,'a','Ta');
- AssertProperty('Enum',aType,0,'b','b','Ta_b',ptEnum,Data.FindSchemaTypeData('(a_b)'));
- AssertSame('Schema in property def',lProp,aType.Properties[0].Schema);
- AssertSame('Schema in property type def',lProp,Data.FindSchemaTypeData('(a_b)').Schema);
- AssertEquals('Have 2 public types',2,Data.TypeCount);
- end;
- procedure TTestSchemaPascalType.TestAddPropertiesNumber;
- var
- aType : TPascalTypeData;
- begin
- DefineProperty('b',sstNumber,'');
- aType:=Data.CreatePascalType(0,ptSchemaStruct,'a','Ta',Schema);
- Data.AddType('a',aType);
- Data.AddPropertiesToType(aType);
- AssertPascalTypeData('Ta',Data.FindSchemaTypeData('a'),ptSchemaStruct,'a','Ta');
- AssertProperty('Number',aType,0,'b','b','double',ptFloat64,Data.FindSchemaTypeData('number'));
- end;
- procedure TTestSchemaPascalType.TestAddPropertiesBoolean;
- var
- aType : TPascalTypeData;
- begin
- DefineProperty('b',sstBoolean,'');
- aType:=Data.CreatePascalType(0,ptSchemaStruct,'a','Ta',Schema);
- Data.AddType('a',aType);
- Data.AddPropertiesToType(aType);
- AssertPascalTypeData('Ta',Data.FindSchemaTypeData('a'),ptSchemaStruct,'a','Ta');
- AssertProperty('Boolean',aType,0,'b','b','boolean',ptBoolean,Data.FindSchemaTypeData('boolean'));
- end;
- procedure TTestSchemaPascalType.TestAddPropertiesAny;
- var
- aType : TPascalTypeData;
- begin
- DefineProperty('b',sstAny,'');
- aType:=Data.CreatePascalType(0,ptSchemaStruct,'a','Ta',Schema);
- Data.AddType('a',aType);
- Data.AddPropertiesToType(aType);
- AssertProperty('any',aType,0,'b','b','string',ptJSON,Data.FindSchemaTypeData('any'));
- end;
- procedure TTestSchemaPascalType.TestAddPropertiesEmptyObject;
- var
- aType : TPascalTypeData;
- begin
- DefineProperty('b',sstObject,'');
- aType:=Data.CreatePascalType(0,ptSchemaStruct,'a','Ta',Schema);
- Data.AddType('a',aType);
- Data.AddPropertiesToType(aType);
- AssertProperty('any',aType,0,'b','b','string',ptJSON,Data.FindSchemaTypeData('JSON'));
- end;
- procedure TTestSchemaPascalType.DoAddProperties;
- begin
- Data.AddPropertiesToType(FType);
- end;
- procedure TTestSchemaPascalType.TestAddPropertiesNone;
- var
- aType : TPascalTypeData;
- begin
- DefineProperty('b',sstNone,'');
- aType:=Data.CreatePascalType(0,ptSchemaStruct,'a','Ta',Schema);
- Data.AddType('a',aType);
- FType:=aType;
- AssertException('type none not allowed', ESchemaData, @DoAddProperties);
- end;
- procedure TTestSchemaPascalType.TestAddPropertiesNull;
- var
- aType : TPascalTypeData;
- begin
- DefineProperty('b',sstNull,'');
- aType:=Data.CreatePascalType(0,ptSchemaStruct,'a','Ta',Schema);
- Data.AddType('a',aType);
- FType:=aType;
- AssertException('type null not allowed', ESchemaData, @DoAddProperties);
- end;
- procedure TTestSchemaPascalType.TestAddPropertiesMulti;
- var
- lProp : TJSONSchema;
- aType : TPascalTypeData;
- begin
- lProp:=DefineProperty('b',sstString,'');
- lProp.Validations.Types:=[sstString,sstNumber];
- aType:=Data.CreatePascalType(0,ptSchemaStruct,'a','Ta',Schema);
- Data.AddType('a',aType);
- FType:=aType;
- AssertException('multiple types not allowed', ESchemaData, @DoAddProperties);
- end;
- procedure TTestSchemaPascalType.TestAddPropertiesArray;
- var
- lProp,lElement : TJSONSchema;
- aType : TPascalTypeData;
- begin
- lProp:=DefineProperty('b',sstArray,'');
- lElement:=TJSONSchema.Create;
- lElement.Validations.Types:=[sstString];
- lProp.Items.Add(lElement);
- aType:=Data.CreatePascalType(0,ptSchemaStruct,'a','Ta',Schema);
- Data.AddType('a',aType);
- Data.AddPropertiesToType(aType);
- AssertProperty('array',aType,0,'b','b','TStringDynArray',ptArray,Data.FindSchemaTypeData('[string]'));
- AssertSame('Schema in property def',lProp,aType.Properties[0].Schema);
- // AssertSame('Schema in property type def',lProp,Data.FindSchemaTypeData('[string]').Schema);
- AssertEquals('Have 2 public types',1,Data.TypeCount);
- end;
- procedure TTestSchemaPascalType.TestAddPropertiesArrayDelphi;
- var
- lProp,lElement : TJSONSchema;
- aType : TPascalTypeData;
- begin
- Data.DelphiTypes:=True;
- lProp:=DefineProperty('b',sstArray,'');
- lElement:=TJSONSchema.Create;
- lElement.Validations.Types:=[sstString];
- lProp.Items.Add(lElement);
- aType:=Data.CreatePascalType(0,ptSchemaStruct,'a','Ta',Schema);
- Data.AddType('a',aType);
- Data.AddPropertiesToType(aType);
- AssertProperty('array',aType,0,'b','b','TStringDynArray',ptArray,Data.FindSchemaTypeData('[string]'));
- AssertEquals('Have 2 public types',1,Data.TypeCount);
- end;
- procedure TTestSchemaPascalType.TestAddPropertiesArrayMultiValue;
- var
- lProp,lElement : TJSONSchema;
- aType : TPascalTypeData;
- begin
- lProp:=DefineProperty('b',sstArray,'');
- lElement:=TJSONSchema.Create;
- lElement.Validations.Types:=[sstString];
- lProp.Items.Add(lElement);
- lElement:=TJSONSchema.Create;
- lElement.Validations.Types:=[sstInteger];
- lProp.Items.Add(lElement);
- aType:=Data.CreatePascalType(0,ptSchemaStruct,'a','Ta',Schema);
- Data.AddType('a',aType);
- FType:=aType;
- AssertException('multiple value types in array not allowed', ESchemaData, @DoAddProperties);
- end;
- procedure TTestSchemaPascalType.TestAddPropertiesObject;
- var
- lProp,lElement : TJSONSchema;
- aType,aType2 : TPascalTypeData;
- begin
- lProp:=DefineProperty('b',sstObject,'');
- lElement:=TJSONSchema.Create;
- lElement.Name:='c';
- lElement.Validations.Types:=[sstString];
- lProp.Properties.Add(lElement);
- lElement:=TJSONSchema.Create;
- lElement.Name:='d';
- lElement.Validations.Types:=[sstInteger];
- lProp.Properties.Add(lElement);
- aType:=Data.CreatePascalType(0,ptSchemaStruct,'a','Ta',Schema);
- Data.AddType('a',aType);
- Data.AddPropertiesToType(aType);
- AssertProperty('array',aType,0,'b','b','Ta_b',ptAnonStruct,Data.FindSchemaTypeData('{a_b}'));
- AssertSame('Schema in property def',lProp,aType.Properties[0].Schema);
- AssertSame('Schema in property type def',lProp,Data.FindSchemaTypeData('{a_b}').Schema);
- aType2:=Data.FindSchemaTypeData('{a_b}');
- AssertProperty('sub prop 1',aType2,0,'c','c','string',ptString,Data.FindSchemaTypeData('string'));
- AssertProperty('sub prop 2',aType2,1,'d','d','integer',ptInteger,Data.FindSchemaTypeData('integer'));
- AssertEquals('Have 2 public types',2,Data.TypeCount);
- Data.CheckDependencies;
- AssertEquals('type depends on created subtype',1,aType.DependencyCount);
- AssertSame('type depends on created subtype',aType2,aType.Dependency[0]);
- end;
- procedure TTestSchemaPascalType.TestAddPropertiesObjectExisting;
- var
- lProp : TJSONSchema;
- aType1,aType2 : TPascalTypeData;
- begin
- aType1:=Data.CreatePascalType(0,ptSchemaStruct,'a','Ta',Schema);
- Data.AddType('a',aType1);
- aType2:=Data.CreatePascalType(1,ptSchemaStruct,'b','Tb',Nil);
- Data.AddType('b',aType2);
- lProp:=DefineProperty('c',sstObject,'');
- lProp.Ref:='b';
- Data.AddPropertiesToType(aType1);
- AssertProperty('prop 1',aType1,0,'c','c','Tb',ptSchemaStruct,aType2);
- end;
- initialization
- RegisterTest(TTestSchemaPascalType);
- end.
|