test_xsdparser.pas 50 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314
  1. {$INCLUDE sdo_global.inc}
  2. unit test_xsdparser;
  3. interface
  4. uses
  5. Classes, SysUtils,
  6. {$IFDEF FPC}
  7. fpcunit, testutils, testregistry, DOM, XmlRead, sdo_fpc_xml,
  8. {$ELSE}
  9. TestFrameWork, xmldom, sdo_win_xml,
  10. {$ENDIF}
  11. sdo, sdo_types, sdo_xsdparser;
  12. type
  13. { TTest_CustomXsdParser }
  14. TTest_CustomXsdParser = class(TTestCase)
  15. protected
  16. function LoadEmptySchema(var AFactory : ISDODataFactory) : ISDODataObject;virtual;abstract;
  17. function LoadSimpleType_Enum_Schema(var AFactory : ISDODataFactory) : ISDODataObject;virtual;abstract;
  18. function LoadSimpleType_Enum_Embedded_Schema(var AFactory : ISDODataFactory) : ISDODataObject;virtual;abstract;
  19. function LoadSimpleType_AliasToNativeType_Schema(var AFactory : ISDODataFactory) : ISDODataObject;virtual;abstract;
  20. function LoadComplexType_Class_Schema(var AFactory : ISDODataFactory) : ISDODataObject;virtual;abstract;
  21. function LoadComplexType_Class_default_values(var AFactory : ISDODataFactory) : ISDODataObject;virtual;abstract;
  22. function LoadComplexType_Class_properties_extended_metadata(var AFactory : ISDODataFactory) : ISDODataObject;virtual;abstract;
  23. function LoadComplexType_Class_properties_extended_metadata2(var AFactory : ISDODataFactory) : ISDODataObject;virtual;abstract;
  24. function LoadComplexType_Class_Embedded_Schema(var AFactory : ISDODataFactory) : ISDODataObject;virtual;abstract;
  25. function LoadComplexType_Class_Extend_Simple_Schema(var AFactory : ISDODataFactory) : ISDODataObject;virtual;abstract;
  26. function LoadComplexType_Class_OpenType(var AFactory : ISDODataFactory) : ISDODataObject;virtual;abstract;
  27. function LoadComplexType_Class_FalseArray(var AFactory : ISDODataFactory) : ISDODataObject;virtual;abstract;
  28. function LoadComplexType_ArraySequence_Schema(var AFactory : ISDODataFactory) : ISDODataObject;virtual;abstract;
  29. function LoadComplexType_ArraySequence_ItemName_Schema(var AFactory : ISDODataFactory) : ISDODataObject;virtual;abstract;
  30. function LoadComplexType_ArraySequence_Embedded_Schema(var AFactory : ISDODataFactory) : ISDODataObject;virtual;abstract;
  31. //function LoadComplexType_Array_soaparray() : ISDODataObject;virtual;abstract;
  32. function load_class_property_composed_name(var AFactory : ISDODataFactory) : ISDODataObject;virtual;abstract;
  33. function load_schema_import(var AFactory : ISDODataFactory) : ISDODataObject;virtual;abstract;
  34. published
  35. procedure EmptySchema();
  36. procedure SimpleType_Enum();
  37. procedure SimpleType_Enum_Embedded();
  38. procedure SimpleType_AliasToNativeType();
  39. procedure ComplexType_Class();
  40. procedure ComplexType_Class_default_values();
  41. procedure ComplexType_Class_properties_extended_metadata();
  42. procedure ComplexType_Class_properties_extended_metadata2();
  43. procedure ComplexType_Class_Embedded();
  44. procedure ComplexType_Class_Extend_Simple_Schema();
  45. procedure ComplexType_Class_open_type_any();
  46. procedure ComplexType_Class_open_extension_type_any();
  47. procedure ComplexType_Class_open_extension_type_anyAttribute();
  48. procedure ComplexType_Class_sequence_open_type_anyAttribute();
  49. procedure ComplexType_Class_all_open_type_anyAttribute();
  50. procedure ComplexType_Class_FalseArray();
  51. procedure ComplexType_ArraySequence();
  52. procedure ComplexType_ArraySequence_ItemName_Schema();
  53. procedure ComplexType_ArraySequence_Embedded();
  54. //procedure ComplexType_Array_soaparray();
  55. procedure class_property_composed_name();
  56. procedure schema_import();
  57. end;
  58. { TTest_XsdParser }
  59. TTest_XsdParser = class(TTest_CustomXsdParser)
  60. private
  61. function ParseDoc(var AFactory : ISDODataFactory; const ADoc : string) : ISDODataObject;
  62. protected
  63. function LoadEmptySchema(var AFactory : ISDODataFactory) : ISDODataObject;override;
  64. function LoadSimpleType_Enum_Schema(var AFactory : ISDODataFactory) : ISDODataObject;override;
  65. function LoadSimpleType_Enum_Embedded_Schema(var AFactory : ISDODataFactory) : ISDODataObject;override;
  66. function LoadSimpleType_AliasToNativeType_Schema(var AFactory : ISDODataFactory) : ISDODataObject;override;
  67. function LoadComplexType_Class_Schema(var AFactory : ISDODataFactory) : ISDODataObject;override;
  68. function LoadComplexType_Class_default_values(var AFactory : ISDODataFactory) : ISDODataObject;override;
  69. function LoadComplexType_Class_properties_extended_metadata(var AFactory : ISDODataFactory) : ISDODataObject;override;
  70. function LoadComplexType_Class_properties_extended_metadata2(var AFactory : ISDODataFactory) : ISDODataObject;override;
  71. function LoadComplexType_Class_Embedded_Schema(var AFactory : ISDODataFactory) : ISDODataObject;override;
  72. function LoadComplexType_Class_Extend_Simple_Schema(var AFactory : ISDODataFactory) : ISDODataObject;override;
  73. function LoadComplexType_Class_OpenType(var AFactory : ISDODataFactory) : ISDODataObject;override;
  74. function LoadComplexType_Class_FalseArray(var AFactory : ISDODataFactory) : ISDODataObject;override;
  75. function LoadComplexType_ArraySequence_Schema(var AFactory : ISDODataFactory) : ISDODataObject;override;
  76. function LoadComplexType_ArraySequence_ItemName_Schema(var AFactory : ISDODataFactory) : ISDODataObject; override;
  77. function LoadComplexType_ArraySequence_Embedded_Schema(var AFactory : ISDODataFactory) : ISDODataObject; override;
  78. //function LoadComplexType_Array_soaparray() : ISDODataObject;override;
  79. function load_class_property_composed_name(var AFactory : ISDODataFactory) : ISDODataObject;override;
  80. function load_schema_import(var AFactory : ISDODataFactory) : ISDODataObject;override;
  81. end;
  82. implementation
  83. uses
  84. xsd_consts, sdo_xsdintf, test_suite_utils, sdo_datafactory, sdo_locators, sdo_imp_utils;
  85. const
  86. x_complexType_SampleArrayIntFieldType = 'TArrayIntFieldType';
  87. x_complexType_SampleArrayItemType = 'TArrayItemType';
  88. x_complexType_SampleCollectionComplexType = 'TComplexType';
  89. x_complexType_SampleCollectionCollectionComplexType = 'TCollectionComplexType';
  90. x_complexType_SampleCollectionItemType = 'TCollectionItemType';
  91. x_complexType_SampleDerivedType = 'TClassSampleDerivedType';
  92. x_complexType_SampleClassType = 'TClassSampleType';
  93. x_complexType_SampleClassTypeA = 'TClassSampleTypeA';
  94. x_complexType_SampleClassTypeAll = 'TClassSampleTypeAll';
  95. x_complexType_SampleClass = 'TClassSample';
  96. x_complexType_SampleRecordType = 'TRecordSampleType';
  97. x_complexType_SampleRecordTypeAll = 'TRecordSampleTypeAll';
  98. x_complexType_SampleRecord = 'TRecordSample';
  99. x_complexType_array_sequence = 'complex_array_sequence';
  100. x_complexType_array_sequence_embedded = 'complex_array_sequence_embedded';
  101. x_complexType_array_sequence_collection = 'complex_array_sequence_collection';
  102. x_complexType_array_soaparray = 'complex_array_soaparray';
  103. x_complexType_class = 'complex_class';
  104. x_complexType_class_default = 'complex_class_default';
  105. x_complexType_class_properties_extended_metadata = 'class_properties_extended_metadata';
  106. x_complexType_extend_simple = 'complex_class_extend_simple';
  107. x_complexType_class_embedded = 'complex_class_embedded';
  108. x_empty = 'empty';
  109. x_enumSample = 'EnumSample';
  110. x_enumSampleType = 'EnumSampleType';
  111. x_enumSampleLIST_COUNT = 7;
  112. x_enumSampleLIST : array[0..( x_enumSampleLIST_COUNT - 1 )] of string = ( 'esOne', 'esTwo', 'esThree', 'begin', 'finally', 'True', 'False' );
  113. x_simpleTypeAliasString = 'AliasString';
  114. x_simpleTypeAliasInt = 'AliasInt';
  115. x_simpleTypeAliasWideString = 'AliasWideString';
  116. x_simpleType = 'simpletype';
  117. x_simpleTypeEmbedded = 'simpletype_embedded';
  118. x_simpletypeNativeAlias = 'simpletypeNativeAlias';
  119. x_targetNamespace = 'urn:wst-test';
  120. x_byteField = 'byteField';
  121. x_charField = 'charField';
  122. x_classField = 'classField';
  123. x_enumField = 'enumField';
  124. x_field = 'field';
  125. x_floatField = 'floatField';
  126. x_intField = 'intField';
  127. x_longField = 'longField';
  128. x_strField = 'strField';
  129. x_intAtt = 'intAtt';
  130. x_strAtt = 'strAtt';
  131. x_Item = 'Item';
  132. function LoadXmlFile(const AFileName : string) : TXMLDocument;
  133. begin
  134. Result := nil;
  135. ReadXMLFile(Result,AFileName);
  136. end;
  137. { TTest_CustomXsdParser }
  138. procedure TTest_CustomXsdParser.EmptySchema();
  139. var
  140. fact :ISDODataFactory;
  141. tr : ISDODataObject;
  142. mdl : ISDODataObject;
  143. begin
  144. tr := LoadEmptySchema(fact);
  145. mdl := FindModule(tr,x_targetNamespace);
  146. CheckNotNull(mdl);
  147. CheckEquals(x_empty,mdl.getString(s_Name));
  148. CheckEquals(x_targetNamespace,mdl.getString(s_NameSpace));
  149. CheckEquals(0,mdl.getList(s_Type).size());
  150. end;
  151. procedure TTest_CustomXsdParser.SimpleType_Enum();
  152. var
  153. fact :ISDODataFactory;
  154. tr : ISDODataObject;
  155. mdl : ISDODataObject;
  156. elt : ISDODataObject;
  157. i : Integer;
  158. begin
  159. tr := LoadSimpleType_Enum_Schema(fact);
  160. mdl := FindModule(tr,x_targetNamespace);
  161. CheckNotNull(mdl);
  162. CheckEquals(x_simpleType,mdl.getString(s_Name));
  163. CheckEquals(x_targetNamespace,mdl.getString(s_NameSpace));
  164. CheckEquals(1,mdl.getList(s_Type).size());
  165. elt := Find(tr,x_enumSampleType);
  166. CheckNotNull(elt,x_enumSampleType);
  167. CheckEquals(ELEMENT_KIND_TYPE,elt.getByte(s_ElementKind),s_ElementKind);
  168. CheckEquals(x_enumSampleType,elt.getString(s_Name));
  169. Check(elt.getList(s_EnumValue).size() > 0,'Should have enums');
  170. CheckEquals(x_enumSampleLIST_COUNT,elt.getList(s_EnumValue).size());
  171. for i := 0 to Pred(x_enumSampleLIST_COUNT) do
  172. CheckEquals(x_enumSampleLIST[i],elt.getList(s_EnumValue).getString(i));
  173. elt := Find(tr,x_enumSample);
  174. CheckNotNull(elt,x_enumSample);
  175. CheckEquals(x_enumSample,elt.getString(s_Name));
  176. CheckEquals(ELEMENT_KIND_VARIABLE,elt.getByte(s_ElementKind),s_ElementKind);
  177. CheckNotNull(elt.getDataObject(s_DataType));
  178. CheckEquals(x_enumSampleType, elt.getDataObject(s_DataType).getString(s_Name));
  179. end;
  180. procedure TTest_CustomXsdParser.SimpleType_Enum_Embedded();
  181. var
  182. fact :ISDODataFactory;
  183. tr : ISDODataObject;
  184. mdl : ISDODataObject;
  185. elt : ISDODataObject;
  186. i : Integer;
  187. begin
  188. tr := LoadSimpleType_Enum_Embedded_Schema(fact);
  189. mdl := FindModule(tr,x_targetNamespace);
  190. CheckNotNull(mdl);
  191. CheckEquals(x_simpleTypeEmbedded,mdl.getString(s_Name));
  192. CheckEquals(x_targetNamespace,mdl.getString(s_NameSpace));
  193. CheckEquals(1,mdl.getList(s_Type).size());
  194. elt := Find(tr,x_enumSampleType);
  195. CheckNotNull(elt,x_enumSampleType);
  196. CheckEquals(x_enumSampleType,elt.getString(s_Name));
  197. CheckEquals(ELEMENT_KIND_TYPE,elt.getByte(s_ElementKind),s_ElementKind);
  198. Check(elt.getList(s_EnumValue).size() > 0,'Should have enums');
  199. CheckEquals(x_enumSampleLIST_COUNT,elt.getList(s_EnumValue).size());
  200. for i := 0 to Pred(x_enumSampleLIST_COUNT) do
  201. CheckEquals(x_enumSampleLIST[i],elt.getList(s_EnumValue).getString(i));
  202. end;
  203. procedure TTest_CustomXsdParser.SimpleType_AliasToNativeType();
  204. var
  205. fact :ISDODataFactory;
  206. tr : ISDODataObject;
  207. mdl : ISDODataObject;
  208. elt : ISDODataObject;
  209. begin
  210. tr := LoadSimpleType_AliasToNativeType_Schema(fact);
  211. mdl := FindModule(tr,x_targetNamespace);
  212. CheckNotNull(mdl);
  213. CheckEquals(x_simpletypeNativeAlias,mdl.getString(s_Name));
  214. CheckEquals(x_targetNamespace,mdl.getString(s_NameSpace));
  215. CheckEquals(2,mdl.getList(s_Variable).size());
  216. elt := Find(tr,x_simpleTypeAliasString);
  217. CheckNotNull(elt,x_simpleTypeAliasString);
  218. CheckEquals(x_simpleTypeAliasString,elt.getString(s_Name));
  219. CheckEquals(ELEMENT_KIND_VARIABLE,elt.getByte(s_ElementKind),s_ElementKind);
  220. CheckNotNull(elt.getDataObject(s_DataType));
  221. CheckEquals('string',elt.getDataObject(s_DataType).getString(s_Name));
  222. elt := Find(tr,x_simpleTypeAliasInt);
  223. CheckNotNull(elt,x_simpleTypeAliasInt);
  224. CheckEquals(x_simpleTypeAliasInt,elt.getString(s_Name));
  225. CheckEquals(ELEMENT_KIND_VARIABLE,elt.getByte(s_ElementKind),s_ElementKind);
  226. CheckNotNull(elt.getDataObject(s_DataType));
  227. CheckEquals('int',elt.getDataObject(s_DataType).getString(s_Name));
  228. end;
  229. type
  230. TPropertyType = ( ptField, ptAttribute );
  231. const
  232. PropertyType_Att : array[TPropertyType] of Boolean = ( False, True );
  233. procedure TTest_CustomXsdParser.ComplexType_Class();
  234. var
  235. tr : ISDODataObject;
  236. clsType : ISDODataObject;
  237. procedure CheckProperty(const AName,ATypeName : string; const AFieldType : TPropertyType);
  238. var
  239. prp : ISDODataObject;
  240. begin
  241. prp := clsType.getDataObject(Format('%s[%s = %s]',[s_Property,s_Name,QuotedStr(AName)]));
  242. CheckNotNull(prp);
  243. CheckEquals(AName,prp.getString(s_Name));
  244. CheckNotNull(prp.getDataObject(s_DataType));
  245. CheckEquals(ATypeName,prp.getDataObject(s_DataType).getString(s_Name));
  246. CheckEquals(PropertyType_Att[AFieldType],prp.getBoolean(s_IsAttribute),Format('%s.%s, %s',[clsType.getString(s_Name),AName,s_IsAttribute]));
  247. end;
  248. var
  249. fact :ISDODataFactory;
  250. mdl : ISDODataObject;
  251. elt : ISDODataObject;
  252. prpLs : ISDODataObjectList;
  253. begin
  254. tr := LoadComplexType_Class_Schema(fact);
  255. mdl := FindModule(tr,x_targetNamespace);
  256. CheckNotNull(mdl);
  257. CheckEquals(x_complexType_class,mdl.getString(s_Name));
  258. CheckEquals(x_targetNamespace,mdl.getString(s_NameSpace));
  259. CheckEquals(3,mdl.getList(s_Type).size());
  260. CheckEquals(1,mdl.getList(s_Variable).size());
  261. elt := Find(tr,x_complexType_SampleClassType);
  262. CheckNotNull(elt,x_complexType_SampleClassType);
  263. CheckEquals(x_complexType_SampleClassType,elt.getString(s_Name));
  264. CheckEquals(ELEMENT_KIND_TYPE,elt.getByte(s_ElementKind),s_ElementKind);
  265. clsType := elt;
  266. prpLs := clsType.getList(s_Property);
  267. CheckEquals(8,prpLs.size());
  268. CheckProperty(x_intField,'int',ptField);
  269. CheckProperty(x_strField,'string',ptField);
  270. CheckProperty(x_floatField,'float',ptField);
  271. CheckProperty(x_byteField,'byte',ptField);
  272. CheckProperty(x_charField,'char',ptField);
  273. CheckProperty(x_longField,'long',ptField);
  274. CheckProperty(x_strAtt,'string',ptAttribute);
  275. CheckProperty(x_intAtt,'int',ptAttribute);
  276. elt := Find(tr,x_complexType_SampleClass);
  277. CheckNotNull(elt,x_complexType_SampleClass);
  278. CheckEquals(x_complexType_SampleClass,elt.getString(s_Name));
  279. CheckEquals(ELEMENT_KIND_VARIABLE,elt.getByte(s_ElementKind),s_ElementKind);
  280. CheckNotNull(elt.getDataObject(s_DataType));
  281. CheckEquals(x_complexType_SampleClassType, elt.getDataObject(s_DataType).getString(s_Name));
  282. elt := Find(tr,x_complexType_SampleClassTypeAll);
  283. CheckNotNull(elt,x_complexType_SampleClassTypeAll);
  284. CheckEquals(x_complexType_SampleClassTypeAll,elt.getString(s_Name));
  285. CheckEquals(ELEMENT_KIND_TYPE,elt.getByte(s_ElementKind),s_ElementKind);
  286. clsType := elt;
  287. prpLs := clsType.getList(s_Property);
  288. CheckEquals(8,prpLs.size());
  289. CheckProperty(x_intField,'int',ptField);
  290. CheckProperty(x_strField,'string',ptField);
  291. CheckProperty(x_floatField,'float',ptField);
  292. CheckProperty(x_byteField,'byte',ptField);
  293. CheckProperty(x_charField,'char',ptField);
  294. CheckProperty(x_longField,'long',ptField);
  295. CheckProperty(x_strAtt,'string',ptAttribute);
  296. CheckProperty(x_intAtt,'int',ptAttribute);
  297. elt := Find(tr,x_complexType_SampleDerivedType);
  298. CheckNotNull(elt,x_complexType_SampleDerivedType);
  299. CheckEquals(x_complexType_SampleDerivedType,elt.getString(s_Name));
  300. CheckEquals(ELEMENT_KIND_TYPE,elt.getByte(s_ElementKind),s_ElementKind);
  301. clsType := elt;
  302. CheckNotNull(clsType.getDataObject(s_BaseType));
  303. CheckEquals(x_complexType_SampleClassType,clsType.getDataObject(s_BaseType).getString(s_Name));
  304. prpLs := clsType.getList(s_Property);
  305. CheckEquals(4,prpLs.size());
  306. CheckProperty(x_intField + 'Ex','int',ptField);
  307. CheckProperty(x_strField + 'Ex','string',ptField);
  308. CheckProperty(x_strAtt + 'Ex','string',ptAttribute);
  309. CheckProperty(x_intAtt + 'Ex','int',ptAttribute);
  310. end;
  311. procedure TTest_CustomXsdParser.ComplexType_Class_Embedded();
  312. var
  313. tr : ISDODataObject;
  314. nestedClassName, nestedEnumName : string;
  315. procedure CheckProperty(
  316. const AName,ATypeName : string;
  317. const AFieldType : TPropertyType;
  318. const AClsType : ISDODataObject
  319. );
  320. var
  321. prp : ISDODataObject;
  322. begin
  323. prp := AClsType.getDataObject(Format('%s[%s = %s]',[s_Property,s_Name,QuotedStr(AName)]));
  324. CheckNotNull(prp);
  325. CheckEquals(AName,prp.getString(s_Name));
  326. CheckNotNull(prp.getDataObject(s_DataType));
  327. CheckEquals(ATypeName,prp.getDataObject(s_DataType).getString(s_Name));
  328. CheckEquals(PropertyType_Att[AFieldType],prp.getBoolean(s_IsAttribute),Format('%s.%s, %s',[AClsType.getString(s_Name),AName,s_IsAttribute]));
  329. end;
  330. procedure CheckEmbeddedClassType();
  331. var
  332. e : ISDODataObject;
  333. prpLst : ISDODataObjectList;
  334. nestedClsType : ISDODataObject;
  335. begin
  336. nestedClassName := Format('%s_%s_Type',[x_complexType_SampleClassType,x_classField]);
  337. e := Find(tr,nestedClassName);
  338. CheckNotNull(e,nestedClassName);
  339. CheckEquals(nestedClassName,e.getString(s_Name));
  340. CheckEquals(ELEMENT_KIND_TYPE,e.getByte(s_ElementKind),s_ElementKind);
  341. nestedClsType := e;
  342. prpLst := nestedClsType.getList(s_Property);
  343. CheckEquals(4,prpLst.size(),nestedClassName + ' properties count.');
  344. CheckProperty(x_intField + 'E','int',ptField,nestedClsType);
  345. CheckProperty(x_strField + 'E','string',ptField,nestedClsType);
  346. CheckProperty(x_strAtt + 'E','string',ptAttribute,nestedClsType);
  347. CheckProperty(x_intAtt + 'E','int',ptAttribute,nestedClsType);
  348. end;
  349. procedure CheckEmbeddedEnum();
  350. var
  351. e : ISDODataObject;
  352. enumType : ISDODataObject;
  353. k : Integer;
  354. begin
  355. nestedEnumName := Format('%s_%s_Type',[x_complexType_SampleClassType,x_enumField]);
  356. e := Find(tr,nestedEnumName);
  357. CheckNotNull(e,nestedEnumName);
  358. CheckEquals(nestedEnumName,e.getString(s_Name));
  359. CheckEquals(ELEMENT_KIND_TYPE,e.getByte(s_ElementKind),s_ElementKind);
  360. enumType := e;
  361. CheckEquals(x_enumSampleLIST_COUNT,enumType.getList(s_EnumValue).size());
  362. for k := 0 to Pred(x_enumSampleLIST_COUNT) do
  363. CheckEquals(x_enumSampleLIST[k],enumType.getList(s_EnumValue).getString(k));
  364. end;
  365. var
  366. fact :ISDODataFactory;
  367. mdl : ISDODataObject;
  368. clsType : ISDODataObject;
  369. elt : ISDODataObject;
  370. prpLs : ISDODataObjectList;
  371. begin
  372. tr := LoadComplexType_Class_Embedded_Schema(fact);
  373. mdl := FindModule(tr,x_targetNamespace);
  374. CheckNotNull(mdl);
  375. CheckEquals(x_complexType_class_embedded,mdl.getString(s_Name));
  376. CheckEquals(x_targetNamespace,mdl.getString(s_NameSpace));
  377. CheckEquals(3,mdl.getList(s_Type).size());
  378. CheckEmbeddedClassType();
  379. CheckEmbeddedEnum();
  380. elt := Find(tr,x_complexType_SampleClassType);
  381. CheckNotNull(elt,x_complexType_SampleClassType);
  382. CheckEquals(x_complexType_SampleClassType,elt.getString(s_Name));
  383. //CheckIs(elt,TPasClassType);
  384. clsType := elt;
  385. prpLs := clsType.getList(s_Property);
  386. CheckEquals(9,prpLs.size());
  387. CheckProperty(x_intField,'int',ptField,clsType);
  388. CheckProperty(x_strField,'string',ptField,clsType);
  389. CheckProperty(x_floatField,'float',ptField,clsType);
  390. CheckProperty(x_byteField,'byte',ptField,clsType);
  391. CheckProperty(x_longField,'long',ptField,clsType);
  392. CheckProperty(x_strAtt,'string',ptAttribute,clsType);
  393. CheckProperty(x_intAtt,'int',ptAttribute,clsType);
  394. CheckProperty(x_classField,nestedClassName,ptField,clsType);
  395. CheckProperty(x_enumField,nestedEnumName,ptField,clsType);
  396. end;
  397. procedure TTest_CustomXsdParser.ComplexType_Class_Extend_Simple_Schema();
  398. var
  399. tr : ISDODataObject;
  400. clsType : ISDODataObject;
  401. procedure CheckProperty(const AName,ATypeName : string; const AFieldType : TPropertyType);
  402. var
  403. prp : ISDODataObject;
  404. begin
  405. prp := clsType.getDataObject(Format('%s[%s = %s]',[s_Property,s_Name,QuotedStr(AName)]));
  406. CheckNotNull(prp);
  407. CheckEquals(AName,prp.getString(s_Name));
  408. CheckNotNull(prp.getDataObject(s_DataType));
  409. CheckEquals(ATypeName,prp.getDataObject(s_DataType).getString(s_Name));
  410. CheckEquals(PropertyType_Att[AFieldType],prp.getBoolean(s_IsAttribute),Format('%s.%s, %s',[clsType.getString(s_Name),AName,s_IsAttribute]));
  411. end;
  412. var
  413. fact :ISDODataFactory;
  414. mdl : ISDODataObject;
  415. elt : ISDODataObject;
  416. prpLs : ISDODataObjectList;
  417. begin
  418. tr := LoadComplexType_Class_Extend_Simple_Schema(fact);
  419. mdl := FindModule(tr,x_targetNamespace);
  420. CheckNotNull(mdl);
  421. CheckEquals(x_complexType_extend_simple,mdl.getString(s_Name));
  422. CheckEquals(x_targetNamespace,mdl.getString(s_NameSpace));
  423. CheckEquals(2,mdl.getList(s_Type).size());
  424. elt := Find(tr,x_complexType_SampleClassType);
  425. CheckNotNull(elt,x_complexType_SampleClassType);
  426. CheckEquals(x_complexType_SampleClassType,elt.getString(s_Name));
  427. CheckEquals(ELEMENT_KIND_TYPE,elt.getByte(s_ElementKind),s_ElementKind);
  428. clsType := elt;
  429. CheckNotNull(clsType.getDataObject(s_BaseType),'AncestorType is null');
  430. Check(Find(tr,XSD_NAME_SPACE,'string') = clsType.getDataObject(s_BaseType));
  431. prpLs := clsType.getList(s_Property);
  432. CheckEquals(1,prpLs.size());
  433. CheckProperty(x_intField,'int',ptAttribute);
  434. elt := Find(tr,x_complexType_SampleClassTypeA);
  435. CheckNotNull(elt,x_complexType_SampleClassTypeA);
  436. CheckEquals(x_complexType_SampleClassTypeA,elt.getString(s_Name));
  437. CheckEquals(ELEMENT_KIND_TYPE,elt.getByte(s_ElementKind),s_ElementKind);
  438. clsType := elt;
  439. CheckNotNull(clsType.getDataObject(s_BaseType),'AncestorType is null');
  440. Check(Find(tr,XSD_NAME_SPACE,'base64Binary') = clsType.getDataObject(s_BaseType));
  441. prpLs := clsType.getList(s_Property);
  442. CheckEquals(1,prpLs.size());
  443. CheckProperty(x_floatField,'float',ptAttribute);
  444. end;
  445. procedure TTest_CustomXsdParser.ComplexType_Class_open_type_any();
  446. var
  447. fact :ISDODataFactory;
  448. tr : ISDODataObject;
  449. clsType : ISDODataObject;
  450. mdl : ISDODataObject;
  451. elt : ISDODataObject;
  452. strBuffer : string;
  453. ls : TStringList;
  454. begin
  455. tr := LoadComplexType_Class_OpenType(fact);
  456. mdl := FindModule(tr,x_targetNamespace);
  457. CheckNotNull(mdl);
  458. elt := Find(tr,'TClass_1');
  459. CheckNotNull(elt,'TClass_1');
  460. CheckEquals(ELEMENT_KIND_TYPE,elt.getByte(s_ElementKind),s_ElementKind);
  461. clsType := elt;
  462. strBuffer := FindTag(clsType,Format('%s#%s',[s_xs,s_any]));
  463. Check(Length(strBuffer) > 0, s_any);
  464. ls := TStringList.Create();
  465. try
  466. ls.Delimiter := ';';
  467. ls.DelimitedText := strBuffer;
  468. CheckEquals('lax',ls.Values[s_processContents]);
  469. CheckEquals('0',ls.Values[s_minOccurs]);
  470. CheckEquals(s_unbounded,ls.Values[s_maxOccurs]);
  471. finally
  472. ls.Free();
  473. end;
  474. end;
  475. procedure TTest_CustomXsdParser.ComplexType_Class_open_extension_type_any();
  476. var
  477. fact :ISDODataFactory;
  478. tr : ISDODataObject;
  479. clsType : ISDODataObject;
  480. mdl : ISDODataObject;
  481. elt : ISDODataObject;
  482. strBuffer : string;
  483. ls : TStringList;
  484. begin
  485. tr := LoadComplexType_Class_OpenType(fact);
  486. mdl := FindModule(tr,x_targetNamespace);
  487. CheckNotNull(mdl);
  488. elt := Find(tr,'TClassSampleDerivedType');
  489. CheckNotNull(elt,'TClassSampleDerivedType');
  490. CheckEquals(ELEMENT_KIND_TYPE,elt.getByte(s_ElementKind),s_ElementKind);
  491. clsType := elt;
  492. strBuffer := FindTag(clsType,Format('%s#%s',[s_xs,s_any]));
  493. Check(Length(strBuffer) > 0, s_any);
  494. ls := TStringList.Create();
  495. try
  496. ls.Delimiter := ';';
  497. ls.DelimitedText := strBuffer;
  498. CheckEquals('skip',ls.Values[s_processContents]);
  499. CheckEquals(s_unbounded,ls.Values[s_maxOccurs]);
  500. finally
  501. ls.Free();
  502. end;
  503. end;
  504. procedure TTest_CustomXsdParser.ComplexType_Class_open_extension_type_anyAttribute();
  505. var
  506. fact :ISDODataFactory;
  507. tr : ISDODataObject;
  508. clsType : ISDODataObject;
  509. mdl : ISDODataObject;
  510. elt : ISDODataObject;
  511. strBuffer : string;
  512. ls : TStringList;
  513. begin
  514. tr := LoadComplexType_Class_OpenType(fact);
  515. mdl := FindModule(tr,x_targetNamespace);
  516. CheckNotNull(mdl);
  517. elt := Find(tr,'TClassSampleDerivedType');
  518. CheckNotNull(elt,'TClassSampleDerivedType');
  519. CheckEquals(ELEMENT_KIND_TYPE,elt.getByte(s_ElementKind),s_ElementKind);
  520. clsType := elt;
  521. strBuffer := FindTag(clsType,Format('%s#%s',[s_xs,s_anyAttribute]));
  522. Check(Length(strBuffer) > 0, s_anyAttribute);
  523. ls := TStringList.Create();
  524. try
  525. ls.Delimiter := ';';
  526. ls.DelimitedText := strBuffer;
  527. CheckEquals('lax',ls.Values[s_processContents]);
  528. finally
  529. ls.Free();
  530. end;
  531. end;
  532. procedure TTest_CustomXsdParser.ComplexType_Class_sequence_open_type_anyAttribute();
  533. var
  534. fact :ISDODataFactory;
  535. tr : ISDODataObject;
  536. clsType : ISDODataObject;
  537. mdl : ISDODataObject;
  538. elt : ISDODataObject;
  539. strBuffer : string;
  540. ls : TStringList;
  541. begin
  542. tr := LoadComplexType_Class_OpenType(fact);
  543. mdl := FindModule(tr,x_targetNamespace);
  544. CheckNotNull(mdl);
  545. elt := Find(tr,'TClass_1');
  546. CheckNotNull(elt,'TClass_1');
  547. CheckEquals(ELEMENT_KIND_TYPE,elt.getByte(s_ElementKind),s_ElementKind);
  548. clsType := elt;
  549. strBuffer := FindTag(clsType,Format('%s#%s',[s_xs,s_anyAttribute]));
  550. Check(Length(strBuffer) > 0, s_anyAttribute);
  551. ls := TStringList.Create();
  552. try
  553. ls.Delimiter := ';';
  554. ls.DelimitedText := strBuffer;
  555. CheckEquals('strict',ls.Values[s_processContents]);
  556. finally
  557. ls.Free();
  558. end;
  559. end;
  560. procedure TTest_CustomXsdParser.ComplexType_Class_all_open_type_anyAttribute();
  561. var
  562. fact :ISDODataFactory;
  563. tr : ISDODataObject;
  564. clsType : ISDODataObject;
  565. mdl : ISDODataObject;
  566. elt : ISDODataObject;
  567. strBuffer : string;
  568. ls : TStringList;
  569. begin
  570. tr := LoadComplexType_Class_OpenType(fact);
  571. mdl := FindModule(tr,x_targetNamespace);
  572. CheckNotNull(mdl);
  573. elt := Find(tr,'TClassSampleTypeAll');
  574. CheckNotNull(elt,'TClassSampleTypeAll');
  575. CheckEquals(ELEMENT_KIND_TYPE,elt.getByte(s_ElementKind),s_ElementKind);
  576. clsType := elt;
  577. strBuffer := FindTag(clsType,Format('%s#%s',[s_xs,s_anyAttribute]));
  578. Check(Length(strBuffer) > 0, s_anyAttribute);
  579. ls := TStringList.Create();
  580. try
  581. ls.Delimiter := ';';
  582. ls.DelimitedText := strBuffer;
  583. CheckEquals('skip',ls.Values[s_processContents]);
  584. finally
  585. ls.Free();
  586. end;
  587. end;
  588. procedure TTest_CustomXsdParser.ComplexType_Class_FalseArray();
  589. var
  590. tr : ISDODataObject;
  591. clsType : ISDODataObject;
  592. procedure CheckProperty(const AName,ATypeName : string; const AFieldType : TPropertyType);
  593. var
  594. prp : ISDODataObject;
  595. begin
  596. prp := clsType.getDataObject(Format('%s[%s = %s]',[s_Property,s_Name,QuotedStr(AName)]));
  597. CheckNotNull(prp);
  598. CheckEquals(AName,prp.getString(s_Name));
  599. CheckNotNull(prp.getDataObject(s_DataType));
  600. CheckEquals(ATypeName,prp.getDataObject(s_DataType).getString(s_Name));
  601. CheckEquals(PropertyType_Att[AFieldType],prp.getBoolean(s_IsAttribute),Format('%s.%s, %s',[clsType.getString(s_Name),AName,s_IsAttribute]));
  602. end;
  603. var
  604. fact :ISDODataFactory;
  605. mdl : ISDODataObject;
  606. elt : ISDODataObject;
  607. prpLs : ISDODataObjectList;
  608. prp : ISDODataObject;
  609. begin
  610. tr := LoadComplexType_Class_FalseArray(fact);
  611. mdl := FindModule(tr,x_targetNamespace);
  612. CheckNotNull(mdl);
  613. CheckEquals('complex_class_false_array',mdl.getString(s_Name));
  614. CheckEquals(x_targetNamespace,mdl.getString(s_NameSpace));
  615. CheckEquals(2,mdl.getList(s_Type).size());
  616. elt := Find(tr,x_complexType_SampleClassType);
  617. CheckNotNull(elt,x_complexType_SampleClassType);
  618. CheckEquals(x_complexType_SampleClassType,elt.getString(s_Name));
  619. CheckEquals(ELEMENT_KIND_TYPE,elt.getByte(s_ElementKind),s_ElementKind);
  620. clsType := elt;
  621. prpLs := clsType.getList(s_Property);
  622. CheckEquals(2,prpLs.size());
  623. CheckProperty(x_intField,'int',ptField);
  624. CheckProperty(x_strField,'string',ptField);
  625. elt := Find(tr,x_complexType_SampleDerivedType);
  626. CheckNotNull(elt,x_complexType_SampleDerivedType);
  627. CheckEquals(x_complexType_SampleDerivedType,elt.getString(s_Name));
  628. CheckEquals(ELEMENT_KIND_TYPE,elt.getByte(s_ElementKind),s_ElementKind);
  629. clsType := elt;
  630. CheckNotNull(clsType.getDataObject(s_BaseType));
  631. CheckEquals(x_complexType_SampleClassType,clsType.getDataObject(s_BaseType).getString(s_Name));
  632. prpLs := clsType.getList(s_Property);
  633. CheckEquals(1,prpLs.size());
  634. prp := prpLs.getDataObject(0);
  635. Check(prp.getInteger(s_PropertyMaxOccurs) > 1);
  636. CheckEquals(x_intField + 'Ex', prp.getString(s_Name));
  637. end;
  638. procedure TTest_CustomXsdParser.ComplexType_ArraySequence();
  639. var
  640. tr : ISDODataObject;
  641. clsType : ISDODataObject;
  642. procedure CheckProperty(
  643. const AName,
  644. ATypeName : string;
  645. const AFieldType : TPropertyType;
  646. const AIsMulti : Boolean = False
  647. );
  648. var
  649. prp : ISDODataObject;
  650. begin
  651. prp := clsType.getDataObject(Format('%s[%s = %s]',[s_Property,s_Name,QuotedStr(AName)]));
  652. CheckNotNull(prp);
  653. CheckEquals(AName,prp.getString(s_Name));
  654. CheckNotNull(prp.getDataObject(s_DataType));
  655. CheckEquals(ATypeName,prp.getDataObject(s_DataType).getString(s_Name));
  656. CheckEquals(PropertyType_Att[AFieldType],prp.getBoolean(s_IsAttribute),Format('%s.%s, %s',[clsType.getString(s_Name),AName,s_IsAttribute]));
  657. if AIsMulti then
  658. Check(prp.getInteger(s_PropertyMaxOccurs) > 1)
  659. else
  660. CheckEquals(1, prp.getInteger(s_PropertyMaxOccurs)) ;
  661. end;
  662. var
  663. fact :ISDODataFactory;
  664. mdl : ISDODataObject;
  665. elt : ISDODataObject;
  666. prpLs : ISDODataObjectList;
  667. nestedClassName : string;
  668. begin
  669. tr := LoadComplexType_ArraySequence_Schema(fact);
  670. mdl := FindModule(tr,x_targetNamespace);
  671. CheckNotNull(mdl);
  672. CheckEquals(x_complexType_array_sequence,mdl.getString(s_Name));
  673. CheckEquals(x_targetNamespace,mdl.getString(s_NameSpace));
  674. CheckEquals(3,mdl.getList(s_Type).size());
  675. elt := Find(tr,x_complexType_SampleArrayIntFieldType);
  676. CheckNotNull(elt,x_complexType_SampleArrayIntFieldType);
  677. CheckEquals(x_complexType_SampleArrayIntFieldType,elt.getString(s_Name));
  678. CheckEquals(ELEMENT_KIND_TYPE,elt.getByte(s_ElementKind),s_ElementKind);
  679. clsType := elt;
  680. CheckEquals(1,clsType.getList(s_Property).size());
  681. CheckProperty(x_intField,'int',ptField,True);
  682. nestedClassName := Format('%s_%s_Type',[x_complexType_SampleArrayItemType,x_Item]);
  683. elt := Find(tr,nestedClassName);
  684. CheckNotNull(elt,nestedClassName);
  685. CheckEquals(nestedClassName,elt.getString(s_Name),'Item Name');
  686. CheckEquals(ELEMENT_KIND_TYPE,elt.getByte(s_ElementKind),s_ElementKind);
  687. clsType := elt;
  688. prpLs := clsType.getList(s_Property);
  689. CheckEquals(8,prpLs.size());
  690. CheckProperty(x_intField,'int',ptField);
  691. CheckProperty(x_strField,'string',ptField);
  692. CheckProperty(x_floatField,'float',ptField);
  693. CheckProperty(x_byteField,'byte',ptField);
  694. CheckProperty(x_charField,'char',ptField);
  695. CheckProperty(x_longField,'long',ptField);
  696. CheckProperty(x_strAtt,'string',ptAttribute);
  697. CheckProperty(x_intAtt,'int',ptAttribute);
  698. elt := Find(tr,x_complexType_SampleArrayItemType);
  699. CheckNotNull(elt,x_complexType_SampleArrayItemType);
  700. CheckEquals(x_complexType_SampleArrayItemType,elt.getString(s_Name), 'Array name');
  701. CheckEquals(ELEMENT_KIND_TYPE,elt.getByte(s_ElementKind),s_ElementKind);
  702. clsType := elt;
  703. CheckProperty(x_Item,nestedClassName,ptField,True);
  704. end;
  705. procedure TTest_CustomXsdParser.ComplexType_ArraySequence_ItemName_Schema();
  706. var
  707. clsType : ISDODataObject;
  708. procedure CheckProperty(
  709. const AName,
  710. ATypeName : string;
  711. const AFieldType : TPropertyType;
  712. const AIsMulti : Boolean = False
  713. );
  714. var
  715. prp : ISDODataObject;
  716. begin
  717. prp := clsType.getDataObject(Format('%s[%s = %s]',[s_Property,s_Name,QuotedStr(AName)]));
  718. CheckNotNull(prp);
  719. CheckEquals(AName,prp.getString(s_Name));
  720. CheckNotNull(prp.getDataObject(s_DataType));
  721. CheckEquals(ATypeName,prp.getDataObject(s_DataType).getString(s_Name));
  722. CheckEquals(PropertyType_Att[AFieldType],prp.getBoolean(s_IsAttribute),Format('%s.%s, %s',[clsType.getString(s_Name),AName,s_IsAttribute]));
  723. if AIsMulti then
  724. Check(prp.getInteger(s_PropertyMaxOccurs) > 1)
  725. else
  726. CheckEquals(1, prp.getInteger(s_PropertyMaxOccurs)) ;
  727. end;
  728. var
  729. fact :ISDODataFactory;
  730. tr : ISDODataObject;
  731. mdl : ISDODataObject;
  732. elt : ISDODataObject;
  733. begin
  734. tr := LoadComplexType_ArraySequence_ItemName_Schema(fact);
  735. mdl := FindModule(tr,x_targetNamespace);
  736. CheckNotNull(mdl);
  737. CheckEquals('array_sequence_item_name',mdl.getString(s_Name));
  738. CheckEquals(x_targetNamespace,mdl.getString(s_NameSpace));
  739. CheckEquals(2,mdl.getList(s_Type).size());
  740. elt := Find(tr,'ArrayOfEmailAddress');
  741. CheckNotNull(elt,'ArrayOfEmailAddress');
  742. CheckEquals('ArrayOfEmailAddress',elt.getString(s_Name));
  743. CheckEquals(ELEMENT_KIND_TYPE,elt.getByte(s_ElementKind),s_ElementKind);
  744. clsType := elt;
  745. CheckProperty('EmailAddress','EmailAddress',ptField,True);
  746. end;
  747. procedure TTest_CustomXsdParser.ComplexType_ArraySequence_Embedded();
  748. var
  749. tr : ISDODataObject;
  750. clsType : ISDODataObject;
  751. procedure CheckProperty(
  752. const AName,
  753. ATypeName : string;
  754. const AFieldType : TPropertyType;
  755. const AIsMulti : Boolean = False
  756. );
  757. var
  758. prp : ISDODataObject;
  759. begin
  760. prp := clsType.getDataObject(Format('%s[%s = %s]',[s_Property,s_Name,QuotedStr(AName)]));
  761. CheckNotNull(prp);
  762. CheckEquals(AName,prp.getString(s_Name));
  763. CheckNotNull(prp.getDataObject(s_DataType));
  764. CheckEquals(ATypeName,prp.getDataObject(s_DataType).getString(s_Name));
  765. CheckEquals(PropertyType_Att[AFieldType],prp.getBoolean(s_IsAttribute),Format('%s.%s, %s',[clsType.getString(s_Name),AName,s_IsAttribute]));
  766. if AIsMulti then
  767. Check(prp.getInteger(s_PropertyMaxOccurs) > 1)
  768. else
  769. CheckEquals(1, prp.getInteger(s_PropertyMaxOccurs)) ;
  770. end;
  771. var
  772. fact :ISDODataFactory;
  773. mdl : ISDODataObject;
  774. elt : ISDODataObject;
  775. nestedClassName : string;
  776. begin
  777. tr := LoadComplexType_ArraySequence_Schema(fact);
  778. mdl := FindModule(tr,x_targetNamespace);
  779. CheckNotNull(mdl);
  780. CheckEquals(x_complexType_array_sequence,mdl.getString(s_Name));
  781. CheckEquals(x_targetNamespace,mdl.getString(s_NameSpace));
  782. CheckEquals(3,mdl.getList(s_Type).size());
  783. elt := Find(tr,x_complexType_SampleArrayIntFieldType);
  784. CheckNotNull(elt,x_complexType_SampleArrayIntFieldType);
  785. CheckEquals(x_complexType_SampleArrayIntFieldType,elt.getString(s_Name));
  786. CheckEquals(ELEMENT_KIND_TYPE,elt.getByte(s_ElementKind),s_ElementKind);
  787. clsType := elt;
  788. CheckProperty(x_intField,'int',ptField,True);
  789. nestedClassName := Format('%s_%s_Type',[x_complexType_SampleArrayItemType,x_Item]);
  790. elt := Find(tr,nestedClassName);
  791. CheckNotNull(elt,nestedClassName);
  792. CheckEquals(nestedClassName,elt.getString(s_Name),'Item Name');
  793. CheckEquals(ELEMENT_KIND_TYPE,elt.getByte(s_ElementKind),s_ElementKind);
  794. clsType := elt;
  795. CheckEquals(8,clsType.getList(s_Property).size());
  796. CheckProperty(x_intField,'int',ptField);
  797. CheckProperty(x_strField,'string',ptField);
  798. CheckProperty(x_floatField,'float',ptField);
  799. CheckProperty(x_byteField,'byte',ptField);
  800. CheckProperty(x_charField,'char',ptField);
  801. CheckProperty(x_longField,'long',ptField);
  802. CheckProperty(x_strAtt,'string',ptAttribute);
  803. CheckProperty(x_intAtt,'int',ptAttribute);
  804. elt := Find(tr,x_complexType_SampleArrayItemType);
  805. CheckNotNull(elt,x_complexType_SampleArrayItemType);
  806. CheckEquals(x_complexType_SampleArrayItemType,elt.getString(s_Name), 'Array name');
  807. CheckEquals(ELEMENT_KIND_TYPE,elt.getByte(s_ElementKind),s_ElementKind);
  808. clsType := elt;
  809. CheckProperty(x_Item,nestedClassName,ptField,True);
  810. end;
  811. {procedure TTest_CustomXsdParser.ComplexType_Array_soaparray();
  812. var
  813. tr : ISDODataObject;
  814. mdl : TPasModule;
  815. ls : TList;
  816. elt : TPasElement;
  817. arrayType : TPasArrayType;
  818. begin
  819. tr := LoadComplexType_Array_soaparray();
  820. try
  821. mdl := FindModule(tr,x_targetNamespace);
  822. CheckNotNull(mdl);
  823. CheckEquals(x_complexType_array_soaparray,mdl.getString(s_Name));
  824. CheckEquals(x_targetNamespace,mdl.getString(s_NameSpace));
  825. ls := mdl.InterfaceSection.Declarations;
  826. CheckEquals(1,ls.Count);
  827. elt := tr.FindElement(x_complexType_SampleArrayIntFieldType);
  828. CheckNotNull(elt,x_complexType_SampleArrayIntFieldType);
  829. CheckEquals(x_complexType_SampleArrayIntFieldType,elt.Name);
  830. CheckEquals(x_complexType_SampleArrayIntFieldType,tr.GetExternalName(elt));
  831. CheckIs(elt,TPasArrayType);
  832. arrayType := elt as TPasArrayType;
  833. CheckNotNull(arrayType.ElType);
  834. CheckEquals('int',tr.GetExternalName(arrayType.ElType));
  835. CheckEquals('item',tr.GetArrayItemName(arrayType));
  836. CheckEquals('item',tr.GetArrayItemExternalName(arrayType));
  837. CheckNull(tr.FindElementNS('Array','http://schemas.xmlsoap.org/wsdl/'));
  838. finally
  839. tr.Free();
  840. end;
  841. end;
  842. procedure TTest_CustomXsdParser.class_widestring_property();
  843. const s_class_name = 'TSampleClass';
  844. var
  845. clsType : TPasClassType;
  846. tr : ISDODataObject;
  847. procedure CheckProperty(const AName,ATypeName,ADeclaredTypeName : string; const AFieldType : TPropertyType);
  848. var
  849. prp : TPasProperty;
  850. begin
  851. prp := FindMember(clsType,AName) as TPasProperty;
  852. CheckNotNull(prp);
  853. CheckEquals(AName,prp.Name);
  854. CheckEquals(AName,tr.GetExternalName(prp));
  855. CheckNotNull(prp.VarType);
  856. CheckEquals(ATypeName,prp.VarType.Name,'TypeName');
  857. CheckEquals(ADeclaredTypeName,tr.GetExternalName(prp.VarType),'DeclaredTypeName');
  858. CheckEquals(PropertyType_Att[AFieldType],tr.IsAttributeProperty(prp));
  859. end;
  860. var
  861. mdl : TPasModule;
  862. elt : TPasElement;
  863. begin
  864. tr := load_class_widestring_property();
  865. try
  866. mdl := tr.FindModule('class_widestring_property');
  867. CheckNotNull(mdl,'class_widestring_property');
  868. elt := tr.FindElement(s_class_name);
  869. CheckNotNull(elt,s_class_name);
  870. CheckEquals(s_class_name,elt.Name);
  871. CheckEquals(s_class_name,tr.GetExternalName(elt));
  872. CheckIs(elt,TPasClassType);
  873. clsType := elt as TPasClassType;
  874. CheckProperty('elementProp','WideString','string',ptField);
  875. CheckProperty('elementAtt','WideString','string',ptAttribute);
  876. finally
  877. tr.Free();
  878. end;
  879. end;}
  880. procedure TTest_CustomXsdParser.ComplexType_Class_default_values();
  881. var
  882. tr : ISDODataObject;
  883. clsType : ISDODataObject;
  884. procedure CheckProperty(
  885. const AName,
  886. ATypeName : string;
  887. const AFieldType : TPropertyType;
  888. const ADefault : string
  889. );
  890. var
  891. prp : ISDODataObject;
  892. begin
  893. prp := clsType.getDataObject(Format('%s[%s = %s]',[s_Property,s_Name,QuotedStr(AName)]));
  894. CheckNotNull(prp);
  895. CheckEquals(AName,prp.getString(s_Name));
  896. CheckNotNull(prp.getDataObject(s_DataType));
  897. CheckEquals(ATypeName,prp.getDataObject(s_DataType).getString(s_Name));
  898. CheckEquals(PropertyType_Att[AFieldType],prp.getBoolean(s_IsAttribute),Format('%s.%s, %s',[clsType.getString(s_Name),AName,s_IsAttribute]));
  899. CheckEquals(ADefault,prp.getString(s_DefaultValue),Format('%s.%s, default',[clsType.getString(s_Name),AName]));
  900. end;
  901. var
  902. fact :ISDODataFactory;
  903. mdl : ISDODataObject;
  904. elt : ISDODataObject;
  905. prpLs : ISDODataObjectList;
  906. begin
  907. tr := LoadComplexType_Class_default_values(fact);
  908. mdl := FindModule(tr,x_targetNamespace);
  909. CheckNotNull(mdl);
  910. CheckEquals(x_complexType_class_default,mdl.getString(s_Name));
  911. CheckEquals(x_targetNamespace,mdl.getString(s_NameSpace));
  912. CheckEquals(1,mdl.getList(s_Type).size());
  913. elt := Find(tr,x_complexType_SampleClassType);
  914. CheckNotNull(elt,x_complexType_SampleClassType);
  915. CheckEquals(x_complexType_SampleClassType,elt.getString(s_Name));
  916. CheckEquals(ELEMENT_KIND_TYPE,elt.getByte(s_ElementKind),s_ElementKind);
  917. clsType := elt;
  918. prpLs := clsType.getList(s_Property);
  919. CheckEquals(8,prpLs.size());
  920. CheckProperty(x_intField,'int',ptField,'1210');
  921. CheckProperty(x_strField,'string',ptField,'azerty');
  922. CheckProperty(x_floatField,'float',ptField,'1234');
  923. CheckProperty(x_byteField,'byte',ptField,'23');
  924. CheckProperty(x_charField,'char',ptField,'i');
  925. CheckProperty(x_longField,'long',ptField,'567');
  926. CheckProperty(x_strAtt,'string',ptAttribute,'attribute azerty');
  927. CheckProperty(x_intAtt,'int',ptAttribute,'789');
  928. end;
  929. procedure TTest_CustomXsdParser.ComplexType_Class_properties_extended_metadata();
  930. var
  931. tr : ISDODataObject;
  932. clsType : ISDODataObject;
  933. procedure CheckProperty(
  934. const AName,
  935. ATypeName : string;
  936. const AFieldType : TPropertyType;
  937. const ADefault : string;
  938. const AExtMetaDataNameSpace,
  939. AExtMetaDataLocalName,
  940. AExtMetaDataValue : string
  941. );
  942. var
  943. prp : ISDODataObject;
  944. locExtMeta : string;
  945. begin
  946. prp := clsType.getDataObject(Format('%s[%s = %s]',[s_Property,s_Name,QuotedStr(AName)]));
  947. CheckNotNull(prp);
  948. CheckEquals(AName,prp.getString(s_Name));
  949. CheckNotNull(prp.getDataObject(s_DataType));
  950. CheckEquals(ATypeName,prp.getDataObject(s_DataType).getString(s_Name));
  951. CheckEquals(PropertyType_Att[AFieldType],prp.getBoolean(s_IsAttribute),Format('%s.%s, %s',[clsType.getString(s_Name),AName,s_IsAttribute]));
  952. CheckEquals(ADefault,prp.getString(s_DefaultValue),Format('%s.%s, default',[clsType.getString(s_Name),AName]));
  953. locExtMeta := Format('%s#%s',[AExtMetaDataNameSpace,AExtMetaDataLocalName]);
  954. if not IsStrEmpty(locExtMeta) then
  955. CheckEquals(AExtMetaDataValue, FindTag(prp,locExtMeta), 'extended metadata');
  956. end;
  957. var
  958. fact :ISDODataFactory;
  959. mdl : ISDODataObject;
  960. elt : ISDODataObject;
  961. prpLs : ISDODataObjectList;
  962. begin
  963. tr := LoadComplexType_Class_properties_extended_metadata(fact);
  964. mdl := FindModule(tr,x_targetNamespace);
  965. CheckNotNull(mdl);
  966. CheckEquals(x_complexType_class_properties_extended_metadata,mdl.getString(s_Name));
  967. CheckEquals(x_targetNamespace,mdl.getString(s_NameSpace));
  968. CheckEquals(1,mdl.getList(s_Type).size());
  969. elt := Find(tr,x_complexType_SampleClassType);
  970. CheckNotNull(elt,x_complexType_SampleClassType);
  971. CheckEquals(x_complexType_SampleClassType,elt.getString(s_Name));
  972. CheckEquals(ELEMENT_KIND_TYPE,elt.getByte(s_ElementKind),s_ElementKind);
  973. clsType := elt;
  974. prpLs := clsType.getList(s_Property);
  975. CheckEquals(5,prpLs.size());
  976. CheckProperty(x_intField,'int',ptField,'', 'uri-4','a','1210');
  977. CheckProperty(x_intField,'int',ptField,'', 'uri-4','b','uri-5#xx');
  978. CheckProperty(x_strField,'string',ptField,'azerty', 'uri-4','a', 'http://www.w3.org/2001/XMLSchema#int');
  979. CheckProperty(x_strAtt,'string',ptAttribute,'attribute azerty', 'uri-4','a', 'optional');
  980. CheckProperty(x_intAtt,'int',ptAttribute,'', '', '', '');
  981. end;
  982. procedure TTest_CustomXsdParser.ComplexType_Class_properties_extended_metadata2();
  983. const s_ProjectType = 'ProjectType';
  984. var
  985. fact :ISDODataFactory;
  986. tr : ISDODataObject;
  987. clsType : ISDODataObject;
  988. mdl : ISDODataObject;
  989. elt : ISDODataObject;
  990. p : ISDODataObject;
  991. begin
  992. tr := LoadComplexType_Class_properties_extended_metadata2(fact);
  993. mdl := FindModule(tr,'uri:sample');
  994. CheckNotNull(mdl);
  995. elt := Find(tr,s_ProjectType);
  996. CheckNotNull(elt,s_ProjectType);
  997. CheckEquals(ELEMENT_KIND_TYPE,elt.getByte(s_ElementKind),s_ElementKind);
  998. clsType := elt;
  999. p := clsType.getDataObject(Format('%s[%s = %s]',[s_Property,s_Name,QuotedStr('ProjectLeader')]));
  1000. CheckNotNull(p,'Property non found : "ProjectLeader"');
  1001. CheckEquals('uri:sample#Person', FindTag(p,'commonj.sdo#propertyType'), 'extended metadata');
  1002. p := clsType.getDataObject(Format('%s[%s = %s]',[s_Property,s_Name,QuotedStr('ProjectLeaderArray')]));
  1003. CheckNotNull(p,'Property non found : "ProjectLeaderArray"');
  1004. CheckEquals('uri:sample#Person', FindTag(p,'commonj.sdo#propertyType'), 'extended metadata');
  1005. end;
  1006. procedure TTest_CustomXsdParser.class_property_composed_name();
  1007. const s_class_name = 'TSampleClass';
  1008. var
  1009. clsType : ISDODataObject;
  1010. tr : ISDODataObject;
  1011. procedure CheckProperty(
  1012. const AName,
  1013. ATypeName : string;
  1014. const AFieldType : TPropertyType
  1015. );
  1016. var
  1017. prp : ISDODataObject;
  1018. begin
  1019. prp := clsType.getDataObject(Format('%s[%s = %s]',[s_Property,s_Name,QuotedStr(AName)]));
  1020. CheckNotNull(prp);
  1021. CheckEquals(AName,prp.getString(s_Name));
  1022. CheckNotNull(prp.getDataObject(s_DataType));
  1023. CheckEquals(ATypeName,prp.getDataObject(s_DataType).getString(s_Name));
  1024. CheckEquals(PropertyType_Att[AFieldType],prp.getBoolean(s_IsAttribute),Format('%s.%s, %s',[clsType.getString(s_Name),AName,s_IsAttribute]));
  1025. end;
  1026. var
  1027. fact :ISDODataFactory;
  1028. mdl : ISDODataObject;
  1029. elt : ISDODataObject;
  1030. begin
  1031. tr := load_class_property_composed_name(fact);
  1032. mdl := FindModule(tr,'urn_sample');
  1033. CheckNotNull(mdl,'urn_sample');
  1034. elt := Find(tr,s_class_name);
  1035. CheckNotNull(elt,s_class_name);
  1036. CheckEquals(ELEMENT_KIND_TYPE,elt.getByte(s_ElementKind),s_ElementKind);
  1037. clsType := elt;
  1038. CheckProperty('one-prop','string',ptField);
  1039. CheckProperty('one-two-prop','string',ptAttribute);
  1040. end;
  1041. procedure TTest_CustomXsdParser.schema_import();
  1042. const
  1043. s_base_namespace = 'urn:base-library';
  1044. s_base_type = 'SampleBase_Type';
  1045. s_second_namespace = 'urn:second-library';
  1046. s_second_type = 'Second_Type';
  1047. var
  1048. fact :ISDODataFactory;
  1049. tr : ISDODataObject;
  1050. mdl : ISDODataObject;
  1051. elt, prpElt : ISDODataObject;
  1052. baseType, scdClass : ISDODataObject;
  1053. begin
  1054. tr := load_schema_import(fact);
  1055. mdl := FindModule(tr,s_base_namespace);
  1056. CheckNotNull(mdl,s_base_namespace);
  1057. CheckEquals(1,mdl.getList(s_Type).size());
  1058. elt := Find(tr,s_base_namespace,s_base_type);
  1059. CheckNotNull(elt,s_base_type);
  1060. CheckEquals(ELEMENT_KIND_TYPE,elt.getByte(s_ElementKind),s_ElementKind);
  1061. baseType := elt;
  1062. mdl := FindModule(tr,s_second_namespace);
  1063. CheckNotNull(mdl,s_second_namespace);
  1064. CheckEquals(1,mdl.getList(s_Type).size());
  1065. elt := Find(tr,s_second_namespace,s_second_type);
  1066. CheckNotNull(elt,s_second_type);
  1067. CheckEquals(ELEMENT_KIND_TYPE,elt.getByte(s_ElementKind),s_ElementKind);
  1068. scdClass := elt;
  1069. prpElt := scdClass.getDataObject(Format('%s[%s = %s]',[s_Property,s_Name,QuotedStr('SampleProperty')]));
  1070. CheckNotNull(prpElt);
  1071. Check(baseType = prpElt.getDataObject(s_DataType));
  1072. end;
  1073. { TTest_XsdParser }
  1074. function TTest_XsdParser.ParseDoc(var AFactory : ISDODataFactory; const ADoc: string): ISDODataObject;
  1075. var
  1076. locDoc : TXMLDocument;
  1077. prs : IXsdParser;
  1078. prsCtx : IParserContext;
  1079. fileName : string;
  1080. begin
  1081. if (AFactory = nil) then begin
  1082. AFactory := TSDODataFactory.Create();
  1083. AddTypeTree(AFactory);
  1084. end;
  1085. fileName := sdoExpandLocalFileName(XsdTestFilesPath + ADoc + '.xsd');
  1086. locDoc := LoadXmlFile(fileName);
  1087. try
  1088. Result := AFactory.CreateNew(s_XsdParserNS,s_TypeTreeType);
  1089. prs := TXsdParser.Create(locDoc,Result,ADoc);
  1090. prsCtx := prs as IParserContext;
  1091. prsCtx.SetDocumentLocator(TFileDocumentLocator.Create(ExtractFilePath(fileName)));
  1092. prs.ParseTypes();
  1093. finally
  1094. ReleaseDomNode(locDoc);
  1095. end;
  1096. end;
  1097. function TTest_XsdParser.LoadEmptySchema(var AFactory : ISDODataFactory): ISDODataObject;
  1098. begin
  1099. Result := ParseDoc(AFactory, x_empty);
  1100. end;
  1101. function TTest_XsdParser.LoadSimpleType_Enum_Schema(var AFactory : ISDODataFactory): ISDODataObject;
  1102. begin
  1103. Result := ParseDoc(AFactory, x_simpleType);
  1104. end;
  1105. function TTest_XsdParser.LoadSimpleType_Enum_Embedded_Schema(var AFactory : ISDODataFactory): ISDODataObject;
  1106. begin
  1107. Result := ParseDoc(AFactory, x_simpleTypeEmbedded);
  1108. end;
  1109. function TTest_XsdParser.LoadSimpleType_AliasToNativeType_Schema(var AFactory : ISDODataFactory) : ISDODataObject;
  1110. begin
  1111. Result := ParseDoc(AFactory, x_simpletypeNativeAlias);
  1112. end;
  1113. function TTest_XsdParser.LoadComplexType_Class_Schema(var AFactory : ISDODataFactory): ISDODataObject;
  1114. begin
  1115. Result := ParseDoc(AFactory, x_complexType_class);
  1116. end;
  1117. function TTest_XsdParser.LoadComplexType_Class_Embedded_Schema(var AFactory : ISDODataFactory): ISDODataObject;
  1118. begin
  1119. Result := ParseDoc(AFactory, x_complexType_class_embedded);
  1120. end;
  1121. function TTest_XsdParser.LoadComplexType_Class_Extend_Simple_Schema(var AFactory : ISDODataFactory) : ISDODataObject;
  1122. begin
  1123. Result := ParseDoc(AFactory, x_complexType_extend_simple);
  1124. end;
  1125. function TTest_XsdParser.LoadComplexType_Class_OpenType(var AFactory : ISDODataFactory): ISDODataObject;
  1126. begin
  1127. Result := ParseDoc(AFactory, 'complex_class_open_type');
  1128. end;
  1129. function TTest_XsdParser.LoadComplexType_ArraySequence_Schema(var AFactory : ISDODataFactory): ISDODataObject;
  1130. begin
  1131. Result := ParseDoc(AFactory, x_complexType_array_sequence);
  1132. end;
  1133. function TTest_XsdParser.LoadComplexType_ArraySequence_Embedded_Schema(var AFactory : ISDODataFactory): ISDODataObject;
  1134. begin
  1135. Result := ParseDoc(AFactory, x_complexType_array_sequence_embedded);
  1136. end;
  1137. {function TTest_XsdParser.LoadComplexType_Array_soaparray() : ISDODataObject;
  1138. begin
  1139. Result := ParseDoc(x_complexType_array_soaparray);
  1140. end; }
  1141. function TTest_XsdParser.LoadComplexType_Class_default_values(var AFactory : ISDODataFactory) : ISDODataObject;
  1142. begin
  1143. Result := ParseDoc(AFactory,x_complexType_class_default);
  1144. end;
  1145. function TTest_XsdParser.LoadComplexType_Class_properties_extended_metadata(var AFactory : ISDODataFactory): ISDODataObject;
  1146. begin
  1147. Result := ParseDoc(AFactory, x_complexType_class_properties_extended_metadata);
  1148. end;
  1149. function TTest_XsdParser.LoadComplexType_Class_properties_extended_metadata2(var AFactory : ISDODataFactory): ISDODataObject;
  1150. begin
  1151. Result := ParseDoc(AFactory, x_complexType_class_properties_extended_metadata + '_2');
  1152. end;
  1153. function TTest_XsdParser.load_class_property_composed_name(var AFactory : ISDODataFactory) : ISDODataObject;
  1154. begin
  1155. Result := ParseDoc(AFactory, 'class_property_composed_name');
  1156. end;
  1157. function TTest_XsdParser.load_schema_import(var AFactory : ISDODataFactory): ISDODataObject;
  1158. begin
  1159. Result := ParseDoc(AFactory, 'import_second_library');
  1160. end;
  1161. function TTest_XsdParser.LoadComplexType_ArraySequence_ItemName_Schema(var AFactory : ISDODataFactory) : ISDODataObject;
  1162. begin
  1163. Result := ParseDoc(AFactory, 'array_sequence_item_name');
  1164. end;
  1165. function TTest_XsdParser.LoadComplexType_Class_FalseArray(var AFactory : ISDODataFactory) : ISDODataObject;
  1166. begin
  1167. Result := ParseDoc(AFactory, 'complex_class_false_array');
  1168. end;
  1169. initialization
  1170. RegisterTest('XSD parser',TTest_XsdParser.Suite);
  1171. end.