test_xsdhelper.pas 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808
  1. {$INCLUDE sdo_global.inc}
  2. unit test_xsdhelper;
  3. interface
  4. uses SysUtils
  5. {$IFDEF FPC}
  6. ,fpcunit, testutils, testregistry
  7. {$ENDIF}
  8. {$IFNDEF FPC}
  9. ,TestFrameWork
  10. {$ENDIF}
  11. , sdo, sdo_types, sdo_xsd_helper ;
  12. type
  13. TXsdHelper_Test = class(TTestCase)
  14. private
  15. function CreateSdoTypes() : ISDODataFactory;
  16. protected
  17. function ExpandFileName(const AFileName : string) : string;
  18. function GetFileName() : string;
  19. procedure CompareObjectType(
  20. AExpected : ISDODataObject;
  21. AValue : ISDOType;
  22. APasTree : ISDODataObject
  23. ); overload;
  24. procedure CompareObjectType(
  25. AExpected : ISDOType;
  26. AValue : ISDODataObject;
  27. APasTree : ISDODataFactory
  28. ); overload;
  29. procedure CompareModule(
  30. AExpected : ISDODataObject;
  31. AValue : ISDODataFactory;
  32. APasTree : ISDODataObject
  33. ); overload;
  34. procedure CompareModule(
  35. AExpected : string;
  36. AValue : ISDODataObject;
  37. APasTree : ISDODataFactory
  38. ); overload;
  39. procedure CompareSdoModule(
  40. AExpectedFactory : ISDODataFactory;
  41. AExpectedURI : string;
  42. AValueFactory : ISDODataFactory
  43. );
  44. procedure CompareSdoTypes(AExpected, AValue : ISDOType);
  45. published
  46. procedure LoadFromStream();
  47. procedure LoadFromFile();
  48. procedure LoadFromString();
  49. procedure GenerateString();
  50. procedure GenerateStream();
  51. procedure GenerateFile();
  52. procedure LoadFromStream_open_type();
  53. procedure LoadFromFile_open_type();
  54. procedure GenerateString_open_type();
  55. procedure GenerateStream_open_type();
  56. procedure parse_scoped_array();
  57. procedure TypeDerivation();
  58. procedure TypeDerivation2();
  59. end;
  60. implementation
  61. uses
  62. Classes,
  63. {$IFDEF DELPHI}
  64. xmldom, sdo_win_xml,
  65. {$ENDIF DELPHI}
  66. {$IFDEF FPC}
  67. DOM, sdo_fpc_xml, XMLRead,
  68. {$ENDIF}
  69. sdo_xsdintf,
  70. test_suite_utils, sdo_datafactory, sdo_xsdparser, sdo_type, xsd_consts,
  71. sdo_parserutils;
  72. const
  73. s_uri = 'company.xsd';
  74. s_EmployeeType = 'EmployeeType';
  75. s_DepartmentType = 'DepartmentType';
  76. s_CompanyType = 'CompanyType';
  77. s_company = 'company';
  78. { TXsdHelper_Test }
  79. procedure TXsdHelper_Test.CompareModule(
  80. AExpected: ISDODataObject;
  81. AValue: ISDODataFactory;
  82. APasTree: ISDODataObject
  83. );
  84. var
  85. i : Integer;
  86. typeList : ISDODataObjectList;
  87. e : ISDODataObject;
  88. t : ISDOType;
  89. begin
  90. typeList := AExpected.getList(s_type);
  91. for i := 0 to Pred(typeList.size()) do begin
  92. e := typeList.getDataObject(i);
  93. if e.getBoolean(s_IsComplex) then begin
  94. t := AValue.getTypes().find(AExpected.getString(sdo_xsdintf.s_NameSpace),e.getString(sdo_xsdintf.s_Name));
  95. CompareObjectType(e,t,APasTree);
  96. end;
  97. end;
  98. end;
  99. procedure TXsdHelper_Test.CompareObjectType(
  100. AExpected : ISDODataObject; //TPasClassType;
  101. AValue : ISDOType;
  102. APasTree : ISDODataObject
  103. );
  104. var
  105. pasLs : ISDODataObjectList;
  106. sls : ISDOPropertyList;
  107. pasp : ISDODataObject;
  108. sp : ISDOProperty;
  109. i, propCount : PtrInt;
  110. pt, newpt : ISDODataObject;
  111. alsCount, j : PtrInt;
  112. ok : Boolean;
  113. tmpBuffer, alLs : string;
  114. parent : ISDODataObject;
  115. begin
  116. if Assigned(AExpected) then begin
  117. Check(AValue <> nil, 'Should not be nil');
  118. CheckEquals(LowerCase(GetTypeNameSpace(AExpected)),LowerCase(AValue.getURI()),'URI');
  119. CheckEquals(LowerCase(AExpected.getString(s_Name)),LowerCase(AValue.getName()),'Name');
  120. parent := AExpected.getDataObject(s_BaseType);
  121. CompareObjectType(parent,AValue.getBaseType(),APasTree);
  122. if ( parent <> nil ) and
  123. ( not IsNativeType(parent) )
  124. then begin
  125. Check(AValue.getBaseType() <> nil, AExpected.getString(s_Name) + ', BaseType() Should not be nil');
  126. CheckEquals(LowerCase(AExpected.getString(s_Name)),LowerCase(AValue.getBaseType().getName()),AExpected.getString(s_Name) + ', Name');
  127. CheckEquals(LowerCase(AExpected.getString(s_NameSpace)),LowerCase(AValue.getBaseType().getURI()),AExpected.getString(s_Name) + ', NameSpace');
  128. end;
  129. pasLs := AExpected.getList(s_Property);
  130. sls := AValue.getProperties();
  131. propCount := 0;
  132. for i := 0 to Pred(pasLs.size()) do begin
  133. pasp := pasLs.getDataObject(i);
  134. Inc(propCount);
  135. pt := pasp.getDataObject(s_DataType);
  136. sp := sls.find(pasp.getString(s_Name));
  137. Check( ( sp <> nil ), Format('Property not found : %s',[pasp.getString(s_Name)]));
  138. CheckEquals(LowerCase(pasp.getString(s_Name)),LowerCase(sp.getName()),'Property');
  139. if pt.getBoolean(s_Unresolved) then begin
  140. newpt := Find(APasTree,pt.getString(s_NameSpace),pt.getString(s_Name));
  141. if (newpt <> nil) then
  142. pt := newpt;
  143. end;
  144. newpt := GetUltimeType(pt);
  145. if (newpt <> nil) then
  146. pt := newpt;
  147. CheckEquals(
  148. (pasp.getInteger(s_PropertyMaxOccurs) > 1),
  149. sp.isMany(),
  150. 'isMany()'
  151. );
  152. alLs := sp.getType().getName();
  153. ok := ( LowerCase(pt.getString(s_Name)) = LowerCase(sp.getType().getName()) );
  154. alsCount := sp.getType().getAliasCount();
  155. if ( not ok ) and ( alsCount > 0 ) then begin
  156. tmpBuffer := LowerCase(pt.getString(s_Name));
  157. alLs := alLs + ', ' + tmpBuffer;
  158. for j := 0 to Pred(alsCount) do begin
  159. if ( tmpBuffer = LowerCase(sp.getType().getAlias(j)) ) then begin
  160. ok := True;
  161. Break;
  162. end;
  163. end;
  164. end;
  165. CheckEquals(
  166. True,
  167. ok,
  168. Format('Property "%s" Type name ( Alias = "%s"; PT = "%s" )',[pasp.getString(s_Name),alLs,pt.getString(s_Name)])
  169. );
  170. end;
  171. CheckEquals(propCount,sls.getCount(),AExpected.getString(s_Name) + ', Properties count');
  172. end else begin
  173. Check(AValue = nil, '"nil" Expected.');
  174. end;
  175. end;
  176. procedure TXsdHelper_Test.CompareModule(
  177. AExpected: string;
  178. AValue: ISDODataObject;
  179. APasTree: ISDODataFactory
  180. );
  181. var
  182. i : Integer;
  183. typeList : ISDOTypeList;
  184. e : ISDOType;
  185. t : ISDODataObject;
  186. begin
  187. typeList := APasTree.getTypes();
  188. for i := 0 to Pred(typeList.getCount()) do begin
  189. e := typeList.getItem(i);
  190. if SameText(AExpected,e.getURI()) and e.isDataObjectType() then begin
  191. t := FindInModule(AValue,e.getName());
  192. CompareObjectType(e,t,APasTree);
  193. end;
  194. end;
  195. end;
  196. procedure TXsdHelper_Test.CompareObjectType(
  197. AExpected: ISDOType;
  198. AValue: ISDODataObject;
  199. APasTree: ISDODataFactory
  200. );
  201. var
  202. pasLs : ISDOPropertyList;
  203. sls : ISDODataObjectList;
  204. pasp : ISDOProperty;
  205. sp : ISDODataObject;
  206. i, propCount : PtrInt;
  207. pt, newpt : ISDOType;
  208. alsCount, j : PtrInt;
  209. ok : Boolean;
  210. tmpBuffer, alLs : string;
  211. parent : ISDOType;
  212. searchingType : ISDODataObject;
  213. searchingTypeProps : ISDODataObjectList;
  214. begin
  215. if Assigned(AExpected) then begin
  216. Check(AValue <> nil, 'Should not be nil');
  217. CheckEquals(LowerCase(AExpected.getURI()),LowerCase(GetTypeNameSpace(AValue)),'URI');
  218. CheckEquals(LowerCase(AExpected.getName()),LowerCase(AValue.getString(s_Name)),'Name');
  219. parent := AExpected.getBaseType();
  220. CompareObjectType(parent,AValue.getDataObject(s_BaseType),APasTree);
  221. pasLs := AExpected.getProperties();
  222. sls := AValue.getList(s_Property);
  223. propCount := 0;
  224. for i := 0 to Pred(pasLs.getCount()) do begin
  225. pasp := pasLs.getItem(i);
  226. Inc(propCount);
  227. pt := pasp.getType();
  228. sp := nil;
  229. searchingType := AValue;
  230. while (searchingType <> nil) do begin
  231. searchingTypeProps := searchingType.getList(s_Property);
  232. searchingTypeProps.getCursor().Reset();
  233. while searchingTypeProps.getCursor().MoveNext() do begin
  234. if SameText(pasp.getName(),searchingTypeProps.getDataObject().getString(s_Name)) then begin
  235. sp := searchingTypeProps.getDataObject();
  236. Break;
  237. end;
  238. end;
  239. if (sp <> nil) then
  240. Break;
  241. searchingType := searchingType.getDataObject(s_BaseType);
  242. end;
  243. Check( ( sp <> nil ), Format('Property not found : %s',[pasp.getName()]));
  244. CheckEquals(LowerCase(pasp.getName()),LowerCase(sp.getString(s_Name)),'Property');
  245. CheckEquals(
  246. pasp.isMany(),
  247. (sp.getInteger(s_PropertyMaxOccurs) > 1),
  248. 'isMany()'
  249. );
  250. alLs := sp.getType().getName();
  251. ok := ( LowerCase(pt.getName()) = LowerCase(sp.getDataObject(s_DataType).getString(s_Name)) );
  252. alsCount := pt.getAliasCount();
  253. if ( not ok ) and ( alsCount > 0 ) then begin
  254. tmpBuffer := LowerCase(sp.getDataObject(s_DataType).getString(s_Name));
  255. alLs := alLs + ', ' + tmpBuffer;
  256. for j := 0 to Pred(alsCount) do begin
  257. if ( tmpBuffer = LowerCase(pt.getAlias(j)) ) then begin
  258. ok := True;
  259. Break;
  260. end;
  261. end;
  262. end;
  263. CheckEquals(
  264. True,
  265. ok,
  266. Format('Property "%s" Type name ( Alias = "%s"; PT = "%s" )',[pasp.getName() ,alLs,pt.getName()])
  267. );
  268. end;
  269. i := 0;
  270. searchingType := AValue;
  271. while (searchingType <> nil) do begin
  272. i := i + searchingType.getList(s_Property).size();
  273. searchingType := searchingType.getDataObject(s_BaseType);
  274. end;
  275. CheckEquals(propCount,i,AExpected.getName() + ', Properties count');
  276. end else begin
  277. Check(AValue = nil, '"nil" Expected.');
  278. end;
  279. end;
  280. procedure TXsdHelper_Test.CompareSdoModule(
  281. AExpectedFactory: ISDODataFactory;
  282. AExpectedURI: string;
  283. AValueFactory: ISDODataFactory
  284. );
  285. var
  286. etl, vtl : ISDOTypeList;
  287. e, v : ISDOType;
  288. i : Integer;
  289. begin
  290. etl := AExpectedFactory.getTypes();
  291. vtl := AValueFactory.getTypes();
  292. for i := 0 to etl.getCount() - 1 do begin
  293. e := etl.getItem(i);
  294. if SameText(AExpectedURI,e.getURI()) then begin
  295. v := vtl.find(AExpectedURI,e.getName());
  296. Check((v <> nil),Format('type not found : "%s"',[e.getName()]));
  297. CompareSdoTypes(e,v);
  298. end;
  299. end;
  300. end;
  301. procedure TXsdHelper_Test.CompareSdoTypes(AExpected, AValue: ISDOType);
  302. begin
  303. if (AExpected= nil) then begin
  304. Check(AValue = nil, 'nil expected.');
  305. exit;
  306. end;
  307. Check(AValue <> nil);
  308. CheckEquals(AExpected.getURI(),AValue.getURI(),'URI');
  309. CheckEquals(AExpected.getName(),AValue.getName(),'Name');
  310. Check(AExpected.getFlags() = AValue.getFlags(),'getFlags()');
  311. if (AExpected.getBaseType() = nil) then begin
  312. Check(AValue.getBaseType() = nil,'BaseType')
  313. end else begin
  314. CompareSdoTypes(AExpected.getBaseType(),AValue.getBaseType());
  315. end;
  316. end;
  317. function TXsdHelper_Test.CreateSdoTypes() : ISDODataFactory;
  318. var
  319. locObj : ISDOType;
  320. begin
  321. Result := TSDODataFactory.Create() as ISDODataFactory;
  322. Result.AddType(s_uri,s_EmployeeType,[]);
  323. locObj := Result.getType(s_uri,s_EmployeeType);
  324. Result.addProperty(locObj,'name',sdo_namespace,'string',[]);
  325. Result.addProperty(locObj,'SN',sdo_namespace,'string',[]);
  326. Result.addProperty(locObj,'manager',sdo_namespace,'boolean',[]);
  327. Result.AddType(s_uri,s_DepartmentType,[]);
  328. locObj := Result.getType(s_uri,s_DepartmentType);
  329. Result.addProperty(locObj,'employees',s_uri,s_EmployeeType,[pfIsMany, pfIsContainment]);
  330. Result.addProperty(locObj,'name',sdo_namespace,'string',[]);
  331. Result.addProperty(locObj,'location',sdo_namespace,'string',[]);
  332. Result.addProperty(locObj,'number',sdo_namespace,'int',[]);
  333. Result.AddType(s_uri,s_CompanyType,[]);
  334. locObj := Result.getType(s_uri,s_CompanyType);
  335. Result.addProperty(locObj,'departments',s_uri,s_DepartmentType,[pfIsMany, pfIsContainment]);
  336. Result.addProperty(locObj,'name',sdo_namespace,'string',[]);
  337. Result.addProperty(locObj,'employeeOfTheMonth',sdo_namespace,'string',[]);
  338. (locObj as ISDOTypeEx).setAlias(s_company);
  339. end;
  340. function TXsdHelper_Test.ExpandFileName(const AFileName: string): string;
  341. begin
  342. Result := sdoExpandLocalFileName(TestFilesPath + AFileName);
  343. end;
  344. procedure TXsdHelper_Test.GenerateFile();
  345. var
  346. helper : IXSDHelper;
  347. fct : ISDODataFactory;
  348. xsdPrsr : IXsdParser;
  349. locTree : ISDODataObject;
  350. locDoc : TXMLDocument;
  351. locFileName : string;
  352. locPasFactory : ISDODataFactory;
  353. begin
  354. locFileName := sdoExpandLocalFileName('generatefile.xsd');
  355. fct := CreateSdoTypes() as ISDODataFactory;
  356. helper := TXSDHelper.Create(fct) as IXSDHelper;
  357. helper.Generate(fct.getTypes(),s_uri,locFileName);
  358. locTree := nil;
  359. ReadXMLFile(locDoc,locFileName);
  360. try
  361. locPasFactory := TSDODataFactory.Create();
  362. AddTypeTree(locPasFactory);
  363. locTree := locPasFactory.CreateNew(s_XsdParserNS,s_TypeTreeType);
  364. xsdPrsr := TXsdParser.Create(locDoc,locTree,'') as IXsdParser;
  365. xsdPrsr.ParseTypes();
  366. CompareModule(locTree.getDataObject(s_CurrentModule),fct,locTree);
  367. finally
  368. locTree := nil;
  369. ReleaseDomNode(locDoc);
  370. end;
  371. end;
  372. procedure TXsdHelper_Test.GenerateStream();
  373. var
  374. helper : IXSDHelper;
  375. fct : ISDODataFactory;
  376. xsdPrsr : IXsdParser;
  377. locTree : ISDODataObject;
  378. locDoc : TXMLDocument;
  379. locStream : TStringStream;
  380. locPasFactory : ISDODataFactory;
  381. begin
  382. fct := CreateSdoTypes() as ISDODataFactory;
  383. helper := TXSDHelper.Create(fct) as IXSDHelper;
  384. locStream := TStringStream.Create('');
  385. try
  386. helper.Generate(fct.getTypes(),locStream,s_uri);
  387. locStream.Position := 0;
  388. locTree := nil;
  389. ReadXMLFile(locDoc,locStream);
  390. try
  391. locPasFactory := TSDODataFactory.Create();
  392. AddTypeTree(locPasFactory);
  393. locTree := locPasFactory.CreateNew(s_XsdParserNS,s_TypeTreeType);
  394. xsdPrsr := TXsdParser.Create(locDoc,locTree,'') as IXsdParser;
  395. xsdPrsr.ParseTypes();
  396. CompareModule(locTree.getDataObject(s_CurrentModule),fct,locTree);
  397. finally
  398. locTree := nil;
  399. ReleaseDomNode(locDoc);
  400. end;
  401. finally
  402. locStream.Free();
  403. end;
  404. end;
  405. procedure TXsdHelper_Test.GenerateString();
  406. var
  407. helper : IXSDHelper;
  408. fct : ISDODataFactory;
  409. xsdPrsr : IXsdParser;
  410. locTree : ISDODataObject;
  411. locDoc : TXMLDocument;
  412. locStream : TStringStream;
  413. locBuffer : string;
  414. locPasFactory : ISDODataFactory;
  415. begin
  416. fct := CreateSdoTypes();
  417. helper := TXSDHelper.Create(fct) as IXSDHelper;
  418. locStream := nil;
  419. try
  420. locBuffer := helper.Generate(fct.getTypes(),s_uri);
  421. locStream := TStringStream.Create(locBuffer);
  422. locStream.Position := 0;
  423. locTree := nil;
  424. ReadXMLFile(locDoc,locStream);
  425. try
  426. locPasFactory := TSDODataFactory.Create();
  427. AddTypeTree(locPasFactory);
  428. locTree := locPasFactory.CreateNew(s_XsdParserNS,s_TypeTreeType);
  429. xsdPrsr := TXsdParser.Create(locDoc,locTree,'') as IXsdParser;
  430. xsdPrsr.ParseTypes();
  431. CompareModule(locTree.getDataObject(s_CurrentModule),fct,locTree);
  432. finally
  433. locTree := nil;
  434. ReleaseDomNode(locDoc);
  435. end;
  436. finally
  437. locStream.Free();
  438. end;
  439. end;
  440. function TXsdHelper_Test.GetFileName() : string;
  441. begin
  442. Result := ExpandFileName('sdo_company.xsd');
  443. end;
  444. procedure TXsdHelper_Test.LoadFromFile();
  445. var
  446. helper : IXSDHelper;
  447. fct : ISDODataFactory;
  448. xsdPrsr : IXsdParser;
  449. locTree : ISDODataObject;
  450. locDoc : TXMLDocument;
  451. locPasFactory : ISDODataFactory;
  452. begin
  453. fct := TSDODataFactory.Create() as ISDODataFactory;
  454. helper := TXSDHelper.Create(fct) as IXSDHelper;
  455. helper.LoadFromFile(GetFileName());
  456. locDoc := nil;
  457. locPasFactory := TSDODataFactory.Create();
  458. AddTypeTree(locPasFactory);
  459. locTree := locPasFactory.CreateNew(s_XsdParserNS,s_TypeTreeType);
  460. try
  461. ReadXMLFile(locDoc,GetFileName());
  462. xsdPrsr := TXsdParser.Create(locDoc,locTree,'') as IXsdParser;
  463. xsdPrsr.ParseTypes();
  464. CompareModule(locTree.getDataObject(s_CurrentModule),fct,locTree);
  465. finally
  466. locTree := nil;
  467. ReleaseDomNode(locDoc);
  468. end;
  469. end;
  470. procedure TXsdHelper_Test.LoadFromStream();
  471. var
  472. helper : IXSDHelper;
  473. fct : ISDODataFactory;
  474. xsdPrsr : IXsdParser;
  475. locTree : ISDODataObject;
  476. locDoc : TXMLDocument;
  477. locStream : TMemoryStream;
  478. locPasFactory : ISDODataFactory;
  479. begin
  480. fct := TSDODataFactory.Create() as ISDODataFactory;
  481. helper := TXSDHelper.Create(fct) as IXSDHelper;
  482. locStream := TMemoryStream.Create();
  483. try
  484. locStream.LoadFromFile(GetFileName());
  485. locStream.Position := 0;
  486. helper.LoadFromStream(locStream);
  487. locDoc := nil;
  488. locPasFactory := TSDODataFactory.Create();
  489. AddTypeTree(locPasFactory);
  490. locTree := locPasFactory.CreateNew(s_XsdParserNS,s_TypeTreeType);
  491. try
  492. ReadXMLFile(locDoc,GetFileName());
  493. xsdPrsr := TXsdParser.Create(locDoc,locTree,'') as IXsdParser;
  494. xsdPrsr.ParseTypes();
  495. CompareModule(locTree.getDataObject(s_CurrentModule),fct,locTree);
  496. finally
  497. locTree := nil;
  498. locPasFactory := nil;
  499. ReleaseDomNode(locDoc);
  500. end;
  501. finally
  502. locStream.Free();
  503. end;
  504. end;
  505. procedure TXsdHelper_Test.LoadFromString();
  506. var
  507. helper : IXSDHelper;
  508. fct : ISDODataFactory;
  509. xsdPrsr : IXsdParser;
  510. locTree : ISDODataObject;
  511. locDoc : TXMLDocument;
  512. locStream : TMemoryStream;
  513. locBuffer : TStringBufferType;
  514. locPasFactory : ISDODataFactory;
  515. begin
  516. fct := TSDODataFactory.Create() as ISDODataFactory;
  517. helper := TXSDHelper.Create(fct) as IXSDHelper;
  518. locStream := TMemoryStream.Create();
  519. try
  520. locStream.LoadFromFile(GetFileName());
  521. locStream.Position := 0;
  522. SetLength(locBuffer,locStream.Size);
  523. locStream.Read(locBuffer[1],locStream.Size);
  524. helper.LoadFromString(String(locBuffer));
  525. locDoc := nil;
  526. locPasFactory := TSDODataFactory.Create();
  527. AddTypeTree(locPasFactory);
  528. locTree := locPasFactory.CreateNew(s_XsdParserNS,s_TypeTreeType);
  529. try
  530. ReadXMLFile(locDoc,GetFileName());
  531. xsdPrsr := TXsdParser.Create(locDoc,locTree,'') as IXsdParser;
  532. xsdPrsr.ParseTypes();
  533. CompareModule(locTree.getDataObject(s_CurrentModule),fct,locTree);
  534. finally
  535. locTree := nil;
  536. ReleaseDomNode(locDoc);
  537. end;
  538. finally
  539. locStream.Free();
  540. end;
  541. end;
  542. procedure TXsdHelper_Test.LoadFromStream_open_type();
  543. const S_TEST_NS = 'urn:wst-test';
  544. var
  545. helper : IXSDHelper;
  546. fct : ISDODataFactory;
  547. locStream : TMemoryStream;
  548. typ : ISDOType;
  549. begin
  550. fct := TSDODataFactory.Create() as ISDODataFactory;
  551. helper := TXSDHelper.Create(fct) as IXSDHelper;
  552. locStream := TMemoryStream.Create();
  553. try
  554. locStream.LoadFromFile(ExpandFileName('complex_class_open_type.xsd'));
  555. locStream.Position := 0;
  556. helper.LoadFromStream(locStream);
  557. typ := fct.getType(S_TEST_NS,'TClass_1');
  558. CheckEquals(True,typ.isOpenType(),'TClass_1.IsOpenType()');
  559. typ := fct.getType(S_TEST_NS,'TClassSampleTypeAll');
  560. CheckEquals(True,typ.isOpenType(),'TClassSampleTypeAll.IsOpenType()');
  561. typ := fct.getType(S_TEST_NS,'TClass_2');
  562. CheckEquals(False,typ.isOpenType(),'TClass_2.IsOpenType()');
  563. typ := fct.getType(S_TEST_NS,'TClassSampleDerivedType');
  564. CheckEquals(True,typ.isOpenType(),'TClassSampleDerivedType.IsOpenType()');
  565. finally
  566. locStream.Free();
  567. end;
  568. end;
  569. procedure TXsdHelper_Test.LoadFromFile_open_type();
  570. const S_TEST_NS = 'urn:wst-test';
  571. var
  572. helper : IXSDHelper;
  573. fct : ISDODataFactory;
  574. typ : ISDOType;
  575. begin
  576. fct := TSDODataFactory.Create() as ISDODataFactory;
  577. helper := TXSDHelper.Create(fct) as IXSDHelper;
  578. helper.LoadFromFile(ExpandFileName('complex_class_open_type.xsd'));
  579. typ := fct.getType(S_TEST_NS,'TClass_1');
  580. CheckEquals(True,typ.isOpenType(),'TClass_1.IsOpenType()');
  581. typ := fct.getType(S_TEST_NS,'TClassSampleTypeAll');
  582. CheckEquals(True,typ.isOpenType(),'TClassSampleTypeAll.IsOpenType()');
  583. typ := fct.getType(S_TEST_NS,'TClass_2');
  584. CheckEquals(False,typ.isOpenType(),'TClass_2.IsOpenType()');
  585. typ := fct.getType(S_TEST_NS,'TClassSampleDerivedType');
  586. CheckEquals(True,typ.isOpenType(),'TClassSampleDerivedType.IsOpenType()');
  587. end;
  588. procedure TXsdHelper_Test.GenerateString_open_type();
  589. const S_TEST_NS = 'urn:open-type';
  590. var
  591. helper : IXSDHelper;
  592. fct, genFact : ISDODataFactory;
  593. typ : ISDOType;
  594. strBuffer : string;
  595. begin
  596. genFact := TSDODataFactory.Create() as ISDODataFactory;
  597. genFact.AddType(S_TEST_NS,'type_open',[tfIsOpen]);
  598. genFact.AddType(S_TEST_NS,'type_notopen',[]);
  599. helper := TXSDHelper.Create(genFact) as IXSDHelper;
  600. strBuffer := helper.Generate(genFact.getTypes(),S_TEST_NS);
  601. helper := nil;
  602. fct := TSDODataFactory.Create() as ISDODataFactory;
  603. helper := TXSDHelper.Create(fct) as IXSDHelper;
  604. helper.LoadFromString(strBuffer);
  605. typ := fct.getType(S_TEST_NS,'type_open');
  606. CheckEquals(True,typ.isOpenType(),'type_open.IsOpenType()');
  607. typ := fct.getType(S_TEST_NS,'type_notopen');
  608. CheckEquals(False,typ.isOpenType(),'type_notopen.IsOpenType()');
  609. end;
  610. procedure TXsdHelper_Test.GenerateStream_open_type;
  611. const S_TEST_NS = 'urn:open-type';
  612. var
  613. helper : IXSDHelper;
  614. fct, genFact : ISDODataFactory;
  615. typ : ISDOType;
  616. locStream : TStream;
  617. begin
  618. genFact := TSDODataFactory.Create() as ISDODataFactory;
  619. genFact.AddType(S_TEST_NS,'type_open',[tfIsOpen]);
  620. genFact.AddType(S_TEST_NS,'type_notopen',[]);
  621. helper := TXSDHelper.Create(genFact) as IXSDHelper;
  622. locStream := TMemoryStream.Create();
  623. try
  624. helper.Generate(genFact.getTypes(),locStream,S_TEST_NS);
  625. helper := nil;
  626. fct := TSDODataFactory.Create() as ISDODataFactory;
  627. helper := TXSDHelper.Create(fct) as IXSDHelper;
  628. locStream.Position := 0;
  629. helper.LoadFromStream(locStream);
  630. typ := fct.getType(S_TEST_NS,'type_open');
  631. CheckEquals(True,typ.isOpenType(),'type_open.IsOpenType()');
  632. typ := fct.getType(S_TEST_NS,'type_notopen');
  633. CheckEquals(False,typ.isOpenType(),'type_notopen.IsOpenType()');
  634. finally
  635. locStream.Free();
  636. end;
  637. end;
  638. procedure TXsdHelper_Test.parse_scoped_array();
  639. const
  640. s_xml_text =
  641. '<schema targetNamespace="company.xsd" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:tns="company.xsd">' + sLineBreak +
  642. ' <xsd:complexType name="Datarow">' + sLineBreak +
  643. ' <xsd:sequence>' + sLineBreak +
  644. ' <xsd:any processContents="lax" maxOccurs="unbounded"/>' + sLineBreak +
  645. ' </xsd:sequence>' + sLineBreak +
  646. ' <xsd:anyAttribute processContents="lax"/>' + sLineBreak +
  647. ' </xsd:complexType>' + sLineBreak +
  648. ' <xsd:complexType name="Dataset">' + sLineBreak +
  649. ' <xsd:sequence>' + sLineBreak +
  650. ' <xsd:element name="rows" type="tns:Datarow" minOccurs="0" maxOccurs="unbounded"/>' + sLineBreak +
  651. ' <xsd:any processContents="lax" maxOccurs="unbounded"/>' + sLineBreak +
  652. ' </xsd:sequence>' + sLineBreak +
  653. ' <xsd:anyAttribute processContents="lax"/>' + sLineBreak +
  654. ' </xsd:complexType>' + sLineBreak +
  655. '</schema>';
  656. var
  657. fact : ISDODataFactory;
  658. helper : IXSDHelper;
  659. tl : ISDOTypeList;
  660. typ : ISDOType;
  661. p : ISDOProperty;
  662. begin
  663. fact := TSDODataFactory.Create() as ISDODataFactory;
  664. helper := TXSDHelper.Create(fact);
  665. helper.LoadFromString(s_xml_text);
  666. tl := fact.getTypes();
  667. typ := tl.find(s_uri,'Datarow');
  668. Check(( typ <> nil ), '"Datarow" not found');
  669. CheckEquals(True, typ.isOpenType(), 'Datarow.isOpenType()');
  670. typ := tl.find(s_uri,'Dataset');
  671. Check(( typ <> nil ), '"Dataset" not found');
  672. CheckEquals(True, typ.isOpenType(), 'Dataset.isOpenType()');
  673. p := typ.getProperties().find('rows');
  674. Check(( p <> nil ), 'Property not found : "rows"');
  675. CheckEquals(True,p.isMany());
  676. Check(p.getType().equals(fact.getType(s_uri,'Datarow')));
  677. end;
  678. procedure TXsdHelper_Test.TypeDerivation();
  679. function CreateTypes(): ISDODataFactory;
  680. var
  681. f : ISDODataFactory;
  682. begin
  683. f := TSDODataFactory.Create();
  684. f.AddType(s_uri,'typeA',[]);
  685. f.AddType(s_uri,'typeAA',[]); f.setBaseType(s_uri,'typeAA',s_uri,'typeA');
  686. f.AddType(s_uri,'typeAB',[]); f.setBaseType(s_uri,'typeAB',s_uri,'typeA');
  687. f.AddType(s_uri,'typeABA',[]); f.setBaseType(s_uri,'typeABA',s_uri,'typeAB');
  688. f.addProperty(s_uri,'typeAA','xi',sdo_namespace,'Int',[pfIsAttribute]);
  689. f.addProperty(s_uri,'typeAA','xs',sdo_namespace,'String',[]);
  690. f.addProperty(s_uri,'typeAB','bi',sdo_namespace,'Int',[]);
  691. f.addProperty(s_uri,'typeAB','bs',sdo_namespace,'String',[pfIsAttribute]);
  692. f.addProperty(s_uri,'typeABA','bb',sdo_namespace,'Boolean',[pfIsAttribute]);
  693. f.addProperty(s_uri,'typeABA','bx',sdo_namespace,'Bytes',[]);
  694. Result := f;
  695. end;
  696. var
  697. helper : IXSDHelper;
  698. fct : ISDODataFactory;
  699. xsdPrsr : IXsdParser;
  700. locTree : ISDODataObject;
  701. locDoc : TXMLDocument;
  702. locFileName : string;
  703. locPasFactory : ISDODataFactory;
  704. begin
  705. locFileName := sdoExpandLocalFileName('typederivation.xsd');
  706. fct := CreateTypes();
  707. helper := TXSDHelper.Create(fct) as IXSDHelper;
  708. helper.Generate(fct.getTypes(),s_uri,locFileName);
  709. locTree := nil;
  710. ReadXMLFile(locDoc,locFileName);
  711. try
  712. locPasFactory := TSDODataFactory.Create();
  713. AddTypeTree(locPasFactory);
  714. locTree := locPasFactory.CreateNew(s_XsdParserNS,s_TypeTreeType);
  715. xsdPrsr := TXsdParser.Create(locDoc,locTree,'') as IXsdParser;
  716. xsdPrsr.ParseTypes();
  717. CompareModule(s_uri,FindModule(locTree,s_uri),fct);
  718. finally
  719. locTree := nil;
  720. ReleaseDomNode(locDoc);
  721. end;
  722. end;
  723. procedure TXsdHelper_Test.TypeDerivation2();
  724. function CreateTypes(): ISDODataFactory;
  725. var
  726. f : ISDODataFactory;
  727. begin
  728. f := TSDODataFactory.Create();
  729. f.AddType(s_uri,'typeA',[]);
  730. f.AddType(s_uri,'typeAA',[]); f.setBaseType(s_uri,'typeAA',s_uri,'typeA');
  731. f.AddType(s_uri,'typeAB',[]); f.setBaseType(s_uri,'typeAB',s_uri,'typeA');
  732. f.AddType(s_uri,'typeABA',[]); f.setBaseType(s_uri,'typeABA',s_uri,'typeAB');
  733. f.addProperty(s_uri,'typeAA','xi',sdo_namespace,'Int',[pfIsAttribute]);
  734. f.addProperty(s_uri,'typeAA','xs',sdo_namespace,'String',[]);
  735. f.addProperty(s_uri,'typeAB','bi',sdo_namespace,'Int',[]);
  736. f.addProperty(s_uri,'typeAB','bs',sdo_namespace,'String',[pfIsAttribute]);
  737. f.addProperty(s_uri,'typeABA','bb',sdo_namespace,'Boolean',[pfIsAttribute]);
  738. f.addProperty(s_uri,'typeABA','bx',sdo_namespace,'Bytes',[]);
  739. Result := f;
  740. end;
  741. var
  742. helper : IXSDHelper;
  743. fct, fctLoaded : ISDODataFactory;
  744. xsdPrsr : IXsdParser;
  745. locTree : ISDODataObject;
  746. locFileName : string;
  747. begin
  748. locFileName := sdoExpandLocalFileName('typederivation2.xsd');
  749. fct := CreateTypes();
  750. helper := TXSDHelper.Create(fct) as IXSDHelper;
  751. helper.Generate(fct.getTypes(),s_uri,locFileName);
  752. fctLoaded := TSDODataFactory.Create();
  753. helper := TXSDHelper.Create(fctLoaded) as IXSDHelper;
  754. helper.LoadFromFile(locFileName);
  755. CompareSdoModule(fct,s_uri,fctLoaded);
  756. end;
  757. initialization
  758. RegisterTest('Helpers',TXsdHelper_Test.Suite);
  759. end.