test_xpathhelper.pas 82 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163
  1. {$INCLUDE sdo_global.inc}
  2. unit test_xpathhelper;
  3. interface
  4. uses SysUtils
  5. {$IFDEF FPC}
  6. ,fpcunit, testutils, testregistry
  7. {$ENDIF}
  8. {$IFNDEF FPC}
  9. ,TestFrameWork
  10. {$ENDIF}
  11. , test_suite_utils, sdo, sdo_types, sdo_xpath_helper;
  12. type
  13. TXPathScanner_Test = class(TWstBaseTest)
  14. published
  15. procedure simple();
  16. procedure simple_number();
  17. procedure composed_1();
  18. end;
  19. TXPathParser_Test = class(TWstBaseTest)
  20. published
  21. procedure parse_1();
  22. procedure parse_2();
  23. procedure parse_3();
  24. procedure parse_4();
  25. procedure parse_5();
  26. procedure parse_6();
  27. procedure parse_7();
  28. procedure parse_8();
  29. procedure parse_9();
  30. procedure parse_10();
  31. end;
  32. TXPathProcessor_Test = class(TWstBaseTest)
  33. published
  34. procedure Execute_simple_object();
  35. procedure Execute_simple_value_type();
  36. procedure Execute_nested_object();
  37. procedure Execute_equal();
  38. procedure Execute_equal_bool();
  39. procedure Execute_equal_byte();
  40. procedure Execute_equal_date();
  41. procedure Execute_equal_integer();
  42. procedure Execute_equal_string();
  43. {$IFDEF HAS_SDO_BYTES}
  44. procedure Execute_equal_bytes();
  45. {$ENDIF HAS_SDO_BYTES}
  46. {$IFDEF HAS_SDO_CHAR}
  47. procedure Execute_equal_char();
  48. {$ENDIF HAS_SDO_CHAR}
  49. {$IFDEF HAS_SDO_CURRENCY}
  50. procedure Execute_equal_currency();
  51. {$ENDIF HAS_SDO_CURRENCY}
  52. {$IFDEF HAS_SDO_DOUBLE}
  53. procedure Execute_equal_double();
  54. {$ENDIF HAS_SDO_DOUBLE}
  55. {$IFDEF HAS_SDO_FLOAT}
  56. procedure Execute_equal_float();
  57. {$ENDIF HAS_SDO_FLOAT}
  58. {$IFDEF HAS_SDO_LONG}
  59. procedure Execute_equal_long();
  60. {$ENDIF HAS_SDO_LONG}
  61. {$IFDEF HAS_SDO_SHORT}
  62. procedure Execute_equal_short();
  63. {$ENDIF HAS_SDO_SHORT}
  64. end;
  65. TXPathUtilsFunc_Test = class(TWstBaseTest)
  66. published
  67. procedure getXpath_func();
  68. end;
  69. implementation
  70. uses
  71. sdo_datafactory, sdo_date_utils;
  72. const
  73. s_uri = 'urn-test';
  74. s_type_object_A = 'objectA';
  75. s_type_object_B = 'objectB';
  76. s_type_object_C = 'objectC';
  77. s_type_object_D = 'objectD';
  78. s_bool_prop = 'bool_prop'; s_bool_propList = 'bool_prop_list';
  79. s_integer_prop = 'integer_prop'; s_integer_propList = 'integer_prop_list';
  80. s_string_prop = 'string_prop'; s_string_propList = 'string_prop_list';
  81. s_object_prop = 'object_prop'; s_object_propList = 'object_prop_list';
  82. s_object_ref_prop = 'object_ref_prop';
  83. { TXPathProcessor_Test }
  84. procedure TXPathProcessor_Test.Execute_equal();
  85. function CreateFactory() : ISDODataFactory;
  86. var
  87. locObj : ISDOType;
  88. locRes : ISDODataFactory;
  89. begin
  90. locRes := TSDODataFactory.Create() as ISDODataFactory;
  91. locRes.AddType(s_uri,s_type_object_A,[]);
  92. locRes.AddType(s_uri,s_type_object_B,[]);
  93. locRes.AddType(s_uri,s_type_object_C,[]);
  94. locRes.AddType(s_uri,s_type_object_D,[]);
  95. locObj := locRes.getType(s_uri,s_type_object_A);
  96. locRes.addProperty(locObj,s_bool_prop,sdo_namespace,SDOTypeDefaultTypeNames[BooleanType], []);
  97. locRes.addProperty(locObj,s_bool_propList,sdo_namespace,SDOTypeDefaultTypeNames[BooleanType],[pfIsMany]);
  98. locRes.addProperty(locObj,s_integer_prop,sdo_namespace,SDOTypeDefaultTypeNames[IntegerType], []);
  99. locRes.addProperty(locObj,s_integer_propList,sdo_namespace,SDOTypeDefaultTypeNames[IntegerType],[pfIsMany]);
  100. locRes.addProperty(locObj,s_string_prop,sdo_namespace,SDOTypeDefaultTypeNames[StringType], []);
  101. locRes.addProperty(locObj,s_string_propList,sdo_namespace,SDOTypeDefaultTypeNames[StringType],[pfIsMany]);
  102. locRes.addProperty(locObj,'p_ab',s_uri,s_type_object_B,[pfIsContainment]);
  103. locRes.addProperty(locObj,'p_ab_list',s_uri,s_type_object_B,[pfIsMany,pfIsContainment]);
  104. locRes.addProperty(locObj,'p_ac',s_uri,s_type_object_C,[pfIsContainment]);
  105. locObj := locRes.getType(s_uri,s_type_object_B);
  106. locRes.addProperty(locObj,s_bool_prop,sdo_namespace,SDOTypeDefaultTypeNames[BooleanType], []);
  107. locRes.addProperty(locObj,s_bool_propList,sdo_namespace,SDOTypeDefaultTypeNames[BooleanType],[pfIsMany]);
  108. locRes.addProperty(locObj,s_integer_prop,sdo_namespace,SDOTypeDefaultTypeNames[IntegerType], []);
  109. locRes.addProperty(locObj,s_integer_propList,sdo_namespace,SDOTypeDefaultTypeNames[IntegerType],[pfIsMany]);
  110. locRes.addProperty(locObj,s_string_prop,sdo_namespace,SDOTypeDefaultTypeNames[StringType], []);
  111. locRes.addProperty(locObj,s_string_propList,sdo_namespace,SDOTypeDefaultTypeNames[StringType],[pfIsMany]);
  112. locRes.addProperty(locObj,'p_bc',s_uri,s_type_object_C,[pfIsContainment]);
  113. locRes.addProperty(locObj,'p_bc_list',s_uri,s_type_object_C,[pfIsMany,pfIsContainment]);
  114. locObj := locRes.getType(s_uri,s_type_object_C);
  115. locRes.addProperty(locObj,'p_cd',s_uri,s_type_object_D,[pfIsContainment]);
  116. Result := locRes;
  117. end;
  118. procedure fill_p_ab_list(const AList : ISDODataObjectList; const ACount : Integer; const AFac : ISDODataFactory);
  119. var
  120. tmp : ISDODataObject;
  121. k : Integer;
  122. begin
  123. for k := 0 to Pred(ACount) do begin
  124. tmp := AFac.createNew(s_uri, s_type_object_B);
  125. tmp.setBoolean(s_bool_prop, ( k mod 3 ) = 0 );
  126. tmp.setString(s_string_prop, Format('string %d',[k]));
  127. tmp.setInteger(s_integer_prop, k);
  128. AList.append(tmp);
  129. end;
  130. end;
  131. var
  132. locFac : ISDODataFactory;
  133. locExp : TXPathExpression;
  134. locX : TXPathProcessor;
  135. locRootObject : ISDODataObject;
  136. tmpListAB : ISDODataObjectList;
  137. i : TSDOInteger;
  138. begin
  139. locFac := CreateFactory();
  140. locRootObject := locFac.createNew(s_uri,s_type_object_A);
  141. tmpListAB := locRootObject.getList('p_ab_list');
  142. fill_p_ab_list(tmpListAB,100,locFac);
  143. locX := nil;
  144. locExp := TXPathExpression.Create();
  145. try
  146. locX := TXPathProcessor.Create();
  147. locX.Context.SetObject(locRootObject,nil);
  148. i := 12;
  149. locExp.SetRoot(ParseXPath(Format('p_ab_list[%s=%d]',[s_integer_prop,i])));
  150. locX.Execute(locExp);
  151. CheckEquals(Ord(xckObject), Ord(locX.Context.ContentKind));
  152. CheckEquals(PtrUInt(tmpListAB.getDataObject(i)), PtrUInt(locX.Context.ObjectItem));
  153. CheckEquals(PtrUInt(locRootObject.getProperty('p_ab_list')), PtrUInt(locX.Context.CurrentProperty));
  154. CheckEquals(i, tmpListAB.getCursor().GetPosition());
  155. i := 10;
  156. locX.Context.SetObject(locRootObject,nil);
  157. locExp.SetRoot(ParseXPath(Format('p_ab_list[%s=%d]',[s_integer_prop,i])));
  158. locX.Execute(locExp);
  159. CheckEquals(Ord(xckObject), Ord(locX.Context.ContentKind));
  160. CheckEquals(PtrUInt(tmpListAB.getDataObject(i)), PtrUInt(locX.Context.ObjectItem));
  161. CheckEquals(PtrUInt(locRootObject.getProperty('p_ab_list')), PtrUInt(locX.Context.CurrentProperty));
  162. CheckEquals(i, tmpListAB.getCursor().GetPosition());
  163. i := 0;
  164. locX.Context.SetObject(locRootObject,nil);
  165. locExp.SetRoot(ParseXPath(Format('p_ab_list[%s=%d]',[s_integer_prop,i])));
  166. locX.Execute(locExp);
  167. CheckEquals(Ord(xckObject), Ord(locX.Context.ContentKind));
  168. CheckEquals(PtrUInt(tmpListAB.getDataObject(i)), PtrUInt(locX.Context.ObjectItem));
  169. CheckEquals(PtrUInt(locRootObject.getProperty('p_ab_list')), PtrUInt(locX.Context.CurrentProperty));
  170. CheckEquals(i, tmpListAB.getCursor().GetPosition());
  171. i := -123;
  172. locX.Context.SetObject(locRootObject,nil);
  173. locExp.SetRoot(ParseXPath(Format('p_ab_list[%s=%d]',[s_integer_prop,i])));
  174. locX.Execute(locExp);
  175. CheckEquals(Ord(xckNull), Ord(locX.Context.ContentKind));
  176. finally
  177. FreeAndNil(locX);
  178. FreeAndNil(locExp);
  179. end;
  180. end;
  181. procedure TXPathProcessor_Test.Execute_equal_bool();
  182. const
  183. SIMPLE_PROP_A = 'simpleProperty_A';
  184. LIST_PROP_A = 'listProperty_A';
  185. SIMPLE_PROP_B = 'simpleProperty_B';
  186. PROP_TYPE = BooleanType;
  187. function CreateFactory() : ISDODataFactory;
  188. var
  189. locObj : ISDOType;
  190. locRes : ISDODataFactory;
  191. begin
  192. locRes := TSDODataFactory.Create() as ISDODataFactory;
  193. locRes.AddType(s_uri,s_type_object_A,[]);
  194. locRes.AddType(s_uri,s_type_object_B,[]);
  195. locObj := locRes.getType(s_uri,s_type_object_A);
  196. locRes.addProperty(locObj,SIMPLE_PROP_A,sdo_namespace,SDOTypeDefaultTypeNames[PROP_TYPE], []);
  197. locRes.addProperty(locObj,LIST_PROP_A,sdo_namespace,SDOTypeDefaultTypeNames[PROP_TYPE],[pfIsMany]);
  198. locRes.addProperty(locObj,'p_ab_list',s_uri,s_type_object_B,[pfIsMany,pfIsContainment]);
  199. locObj := locRes.getType(s_uri,s_type_object_B);
  200. locRes.addProperty(locObj,SIMPLE_PROP_B,sdo_namespace,SDOTypeDefaultTypeNames[PROP_TYPE], []);
  201. Result := locRes;
  202. end;
  203. procedure fill_p_ab_list(const AList : ISDODataObjectList; const AFac : ISDODataFactory);
  204. var
  205. tmp : ISDODataObject;
  206. begin
  207. tmp := AFac.createNew(s_uri, s_type_object_B);
  208. tmp.setBoolean(SIMPLE_PROP_B,True);
  209. AList.append(tmp);
  210. tmp := AFac.createNew(s_uri, s_type_object_B);
  211. tmp.setBoolean(SIMPLE_PROP_B,False);
  212. AList.append(tmp);
  213. end;
  214. var
  215. locFac : ISDODataFactory;
  216. locExp : TXPathExpression;
  217. locX : TXPathProcessor;
  218. locRootObject : ISDODataObject;
  219. tmpListAB : ISDODataObjectList;
  220. i : Integer;
  221. begin
  222. locFac := CreateFactory();
  223. locRootObject := locFac.createNew(s_uri,s_type_object_A);
  224. tmpListAB := locRootObject.getList('p_ab_list');
  225. fill_p_ab_list(tmpListAB,locFac);
  226. locX := nil;
  227. locExp := TXPathExpression.Create();
  228. try
  229. locX := TXPathProcessor.Create();
  230. locX.Context.SetObject(locRootObject,nil);
  231. i := 1;
  232. locExp.SetRoot(ParseXPath(Format('p_ab_list[%s=false]',[SIMPLE_PROP_B])));
  233. locX.Execute(locExp);
  234. CheckEquals(Ord(xckObject), Ord(locX.Context.ContentKind));
  235. CheckEquals(PtrUInt(tmpListAB.getDataObject(i)), PtrUInt(locX.Context.ObjectItem));
  236. CheckEquals(PtrUInt(locRootObject.getProperty('p_ab_list')), PtrUInt(locX.Context.CurrentProperty));
  237. CheckEquals(i, tmpListAB.getCursor().GetPosition());
  238. i := 0;
  239. locX.Context.SetObject(locRootObject,nil);
  240. locExp.SetRoot(ParseXPath(Format('p_ab_list[%s=true]',[SIMPLE_PROP_B])));
  241. locX.Execute(locExp);
  242. CheckEquals(Ord(xckObject), Ord(locX.Context.ContentKind));
  243. CheckEquals(PtrUInt(tmpListAB.getDataObject(i)), PtrUInt(locX.Context.ObjectItem));
  244. CheckEquals(PtrUInt(locRootObject.getProperty('p_ab_list')), PtrUInt(locX.Context.CurrentProperty));
  245. CheckEquals(i, tmpListAB.getCursor().GetPosition());
  246. finally
  247. FreeAndNil(locX);
  248. FreeAndNil(locExp);
  249. end;
  250. end;
  251. procedure TXPathProcessor_Test.Execute_equal_byte();
  252. const
  253. SIMPLE_PROP_A = 'simpleProperty_A';
  254. LIST_PROP_A = 'listProperty_A';
  255. SIMPLE_PROP_B = 'simpleProperty_B';
  256. PROP_TYPE = ByteType;
  257. function CreateFactory() : ISDODataFactory;
  258. var
  259. locObj : ISDOType;
  260. locRes : ISDODataFactory;
  261. begin
  262. locRes := TSDODataFactory.Create() as ISDODataFactory;
  263. locRes.AddType(s_uri,s_type_object_A,[]);
  264. locRes.AddType(s_uri,s_type_object_B,[]);
  265. locObj := locRes.getType(s_uri,s_type_object_A);
  266. locRes.addProperty(locObj,SIMPLE_PROP_A,sdo_namespace,SDOTypeDefaultTypeNames[PROP_TYPE], []);
  267. locRes.addProperty(locObj,LIST_PROP_A,sdo_namespace,SDOTypeDefaultTypeNames[PROP_TYPE],[pfIsMany]);
  268. locRes.addProperty(locObj,'p_ab_list',s_uri,s_type_object_B,[pfIsMany,pfIsContainment]);
  269. locObj := locRes.getType(s_uri,s_type_object_B);
  270. locRes.addProperty(locObj,SIMPLE_PROP_B,sdo_namespace,SDOTypeDefaultTypeNames[PROP_TYPE], []);
  271. Result := locRes;
  272. end;
  273. procedure fill_p_ab_list(const AList : ISDODataObjectList; const ACount : Byte; const AFac : ISDODataFactory);
  274. var
  275. tmp : ISDODataObject;
  276. k : Byte;
  277. begin
  278. for k := 0 to Pred(ACount) do begin
  279. tmp := AFac.createNew(s_uri, s_type_object_B);
  280. tmp.setByte(SIMPLE_PROP_B,k);
  281. AList.append(tmp);
  282. end;
  283. end;
  284. var
  285. locFac : ISDODataFactory;
  286. locExp : TXPathExpression;
  287. locX : TXPathProcessor;
  288. locRootObject : ISDODataObject;
  289. tmpListAB : ISDODataObjectList;
  290. i : Byte;
  291. begin
  292. locFac := CreateFactory();
  293. locRootObject := locFac.createNew(s_uri,s_type_object_A);
  294. tmpListAB := locRootObject.getList('p_ab_list');
  295. fill_p_ab_list(tmpListAB,100,locFac);
  296. locX := nil;
  297. locExp := TXPathExpression.Create();
  298. try
  299. locX := TXPathProcessor.Create();
  300. locX.Context.SetObject(locRootObject,nil);
  301. i := 12;
  302. locExp.SetRoot(ParseXPath(Format('p_ab_list[%s=%d]',[SIMPLE_PROP_B,i])));
  303. locX.Execute(locExp);
  304. CheckEquals(Ord(xckObject), Ord(locX.Context.ContentKind));
  305. CheckEquals(PtrUInt(tmpListAB.getDataObject(i)), PtrUInt(locX.Context.ObjectItem));
  306. CheckEquals(PtrUInt(locRootObject.getProperty('p_ab_list')), PtrUInt(locX.Context.CurrentProperty));
  307. CheckEquals(i, tmpListAB.getCursor().GetPosition());
  308. i := 10;
  309. locX.Context.SetObject(locRootObject,nil);
  310. locExp.SetRoot(ParseXPath(Format('p_ab_list[%s=%d]',[SIMPLE_PROP_B,i])));
  311. locX.Execute(locExp);
  312. CheckEquals(Ord(xckObject), Ord(locX.Context.ContentKind));
  313. CheckEquals(PtrUInt(tmpListAB.getDataObject(i)), PtrUInt(locX.Context.ObjectItem));
  314. CheckEquals(PtrUInt(locRootObject.getProperty('p_ab_list')), PtrUInt(locX.Context.CurrentProperty));
  315. CheckEquals(i, tmpListAB.getCursor().GetPosition());
  316. i := 0;
  317. locX.Context.SetObject(locRootObject,nil);
  318. locExp.SetRoot(ParseXPath(Format('p_ab_list[%s=%d]',[SIMPLE_PROP_B,i])));
  319. locX.Execute(locExp);
  320. CheckEquals(Ord(xckObject), Ord(locX.Context.ContentKind));
  321. CheckEquals(PtrUInt(tmpListAB.getDataObject(i)), PtrUInt(locX.Context.ObjectItem));
  322. CheckEquals(PtrUInt(locRootObject.getProperty('p_ab_list')), PtrUInt(locX.Context.CurrentProperty));
  323. CheckEquals(i, tmpListAB.getCursor().GetPosition());
  324. i := 200;
  325. locX.Context.SetObject(locRootObject,nil);
  326. locExp.SetRoot(ParseXPath(Format('p_ab_list[%s=%d]',[SIMPLE_PROP_B,i])));
  327. locX.Execute(locExp);
  328. CheckEquals(Ord(xckNull), Ord(locX.Context.ContentKind));
  329. finally
  330. FreeAndNil(locX);
  331. FreeAndNil(locExp);
  332. end;
  333. end;
  334. procedure TXPathProcessor_Test.Execute_equal_date();
  335. const
  336. SIMPLE_PROP_A = 'simpleProperty_A';
  337. LIST_PROP_A = 'listProperty_A';
  338. SIMPLE_PROP_B = 'simpleProperty_B';
  339. PROP_TYPE = DateTimeType;
  340. function CreateFactory() : ISDODataFactory;
  341. var
  342. locObj : ISDOType;
  343. locRes : ISDODataFactory;
  344. begin
  345. locRes := TSDODataFactory.Create() as ISDODataFactory;
  346. locRes.AddType(s_uri,s_type_object_A,[]);
  347. locRes.AddType(s_uri,s_type_object_B,[]);
  348. locObj := locRes.getType(s_uri,s_type_object_A);
  349. locRes.addProperty(locObj,SIMPLE_PROP_A,sdo_namespace,SDOTypeDefaultTypeNames[PROP_TYPE], []);
  350. locRes.addProperty(locObj,LIST_PROP_A,sdo_namespace,SDOTypeDefaultTypeNames[PROP_TYPE],[pfIsMany]);
  351. locRes.addProperty(locObj,'p_ab_list',s_uri,s_type_object_B,[pfIsMany,pfIsContainment]);
  352. locObj := locRes.getType(s_uri,s_type_object_B);
  353. locRes.addProperty(locObj,SIMPLE_PROP_B,sdo_namespace,SDOTypeDefaultTypeNames[PROP_TYPE], []);
  354. Result := locRes;
  355. end;
  356. function ComputeDate(const AIntValue : TSDOInteger) : TSDODateTime;
  357. begin
  358. Result.Date := 39000.0 + ( AIntValue * 100 ) + ( AIntValue * 10 ) + AIntValue;
  359. Result.HourOffset := ( AIntValue mod 12 );
  360. Result.MinuteOffset := ( AIntValue mod 60 );
  361. Result := xsd_StrToDate(xsd_DateTimeToStr(Result,xdkDateTime),xdkDateTime);
  362. end;
  363. procedure fill_p_ab_list(const AList : ISDODataObjectList; const ACount : Byte; const AFac : ISDODataFactory);
  364. var
  365. tmp : ISDODataObject;
  366. k : TSDOInteger;
  367. begin
  368. for k := 0 to Pred(ACount) do begin
  369. tmp := AFac.createNew(s_uri, s_type_object_B);
  370. tmp.setDate(SIMPLE_PROP_B,ComputeDate(k));
  371. AList.append(tmp);
  372. end;
  373. end;
  374. var
  375. locFac : ISDODataFactory;
  376. locExp : TXPathExpression;
  377. locX : TXPathProcessor;
  378. locRootObject : ISDODataObject;
  379. tmpListAB : ISDODataObjectList;
  380. i : TSDOInteger;
  381. begin
  382. locFac := CreateFactory();
  383. locRootObject := locFac.createNew(s_uri,s_type_object_A);
  384. tmpListAB := locRootObject.getList('p_ab_list');
  385. fill_p_ab_list(tmpListAB,100,locFac);
  386. locX := nil;
  387. locExp := TXPathExpression.Create();
  388. try
  389. locX := TXPathProcessor.Create();
  390. locX.Context.SetObject(locRootObject,nil);
  391. i := 12;
  392. locExp.SetRoot(ParseXPath(Format('p_ab_list[%s="%s"]',[SIMPLE_PROP_B,xsd_DateTimeToStr(ComputeDate(i),xdkDateTime)])));
  393. locX.Execute(locExp);
  394. CheckEquals(Ord(xckObject), Ord(locX.Context.ContentKind));
  395. CheckEquals(PtrUInt(tmpListAB.getDataObject(i)), PtrUInt(locX.Context.ObjectItem));
  396. CheckEquals(PtrUInt(locRootObject.getProperty('p_ab_list')), PtrUInt(locX.Context.CurrentProperty));
  397. CheckEquals(i, tmpListAB.getCursor().GetPosition());
  398. i := 10;
  399. locX.Context.SetObject(locRootObject,nil);
  400. locExp.SetRoot(ParseXPath(Format('p_ab_list[%s="%s"]',[SIMPLE_PROP_B,xsd_DateTimeToStr(ComputeDate(i),xdkDateTime)])));
  401. locX.Execute(locExp);
  402. CheckEquals(Ord(xckObject), Ord(locX.Context.ContentKind));
  403. CheckEquals(PtrUInt(tmpListAB.getDataObject(i)), PtrUInt(locX.Context.ObjectItem));
  404. CheckEquals(PtrUInt(locRootObject.getProperty('p_ab_list')), PtrUInt(locX.Context.CurrentProperty));
  405. CheckEquals(i, tmpListAB.getCursor().GetPosition());
  406. i := 56;
  407. locX.Context.SetObject(locRootObject,nil);
  408. locExp.SetRoot(ParseXPath(Format('p_ab_list[%s="%s"]',[SIMPLE_PROP_B,xsd_DateTimeToStr(ComputeDate(i),xdkDateTime)])));
  409. locX.Execute(locExp);
  410. CheckEquals(Ord(xckObject), Ord(locX.Context.ContentKind));
  411. CheckEquals(PtrUInt(tmpListAB.getDataObject(i)), PtrUInt(locX.Context.ObjectItem));
  412. CheckEquals(PtrUInt(locRootObject.getProperty('p_ab_list')), PtrUInt(locX.Context.CurrentProperty));
  413. CheckEquals(i, tmpListAB.getCursor().GetPosition());
  414. i := -200;
  415. locX.Context.SetObject(locRootObject,nil);
  416. locExp.SetRoot(ParseXPath(Format('p_ab_list[%s="%s"]',[SIMPLE_PROP_B,xsd_DateTimeToStr(ComputeDate(i),xdkDateTime)])));
  417. locX.Execute(locExp);
  418. CheckEquals(Ord(xckNull), Ord(locX.Context.ContentKind));
  419. finally
  420. FreeAndNil(locX);
  421. FreeAndNil(locExp);
  422. end;
  423. end;
  424. procedure TXPathProcessor_Test.Execute_equal_integer();
  425. const
  426. SIMPLE_PROP_A = 'simpleProperty_A';
  427. LIST_PROP_A = 'listProperty_A';
  428. SIMPLE_PROP_B = 'simpleProperty_B';
  429. PROP_TYPE = IntegerType;
  430. function CreateFactory() : ISDODataFactory;
  431. var
  432. locObj : ISDOType;
  433. locRes : ISDODataFactory;
  434. begin
  435. locRes := TSDODataFactory.Create() as ISDODataFactory;
  436. locRes.AddType(s_uri,s_type_object_A,[]);
  437. locRes.AddType(s_uri,s_type_object_B,[]);
  438. locObj := locRes.getType(s_uri,s_type_object_A);
  439. locRes.addProperty(locObj,SIMPLE_PROP_A,sdo_namespace,SDOTypeDefaultTypeNames[PROP_TYPE], []);
  440. locRes.addProperty(locObj,LIST_PROP_A,sdo_namespace,SDOTypeDefaultTypeNames[PROP_TYPE],[pfIsMany]);
  441. locRes.addProperty(locObj,'p_ab_list',s_uri,s_type_object_B,[pfIsMany,pfIsContainment]);
  442. locObj := locRes.getType(s_uri,s_type_object_B);
  443. locRes.addProperty(locObj,SIMPLE_PROP_B,sdo_namespace,SDOTypeDefaultTypeNames[PROP_TYPE], []);
  444. Result := locRes;
  445. end;
  446. procedure fill_p_ab_list(const AList : ISDODataObjectList; const ACount : Byte; const AFac : ISDODataFactory);
  447. var
  448. tmp : ISDODataObject;
  449. k : TSDOInteger;
  450. begin
  451. for k := 0 to Pred(ACount) do begin
  452. tmp := AFac.createNew(s_uri, s_type_object_B);
  453. tmp.setInteger(SIMPLE_PROP_B,k);
  454. AList.append(tmp);
  455. end;
  456. end;
  457. var
  458. locFac : ISDODataFactory;
  459. locExp : TXPathExpression;
  460. locX : TXPathProcessor;
  461. locRootObject : ISDODataObject;
  462. tmpListAB : ISDODataObjectList;
  463. i : TSDOInteger;
  464. begin
  465. locFac := CreateFactory();
  466. locRootObject := locFac.createNew(s_uri,s_type_object_A);
  467. tmpListAB := locRootObject.getList('p_ab_list');
  468. fill_p_ab_list(tmpListAB,100,locFac);
  469. locX := nil;
  470. locExp := TXPathExpression.Create();
  471. try
  472. locX := TXPathProcessor.Create();
  473. locX.Context.SetObject(locRootObject,nil);
  474. i := 12;
  475. locExp.SetRoot(ParseXPath(Format('p_ab_list[%s=%d]',[SIMPLE_PROP_B,i])));
  476. locX.Execute(locExp);
  477. CheckEquals(Ord(xckObject), Ord(locX.Context.ContentKind));
  478. CheckEquals(PtrUInt(tmpListAB.getDataObject(i)), PtrUInt(locX.Context.ObjectItem));
  479. CheckEquals(PtrUInt(locRootObject.getProperty('p_ab_list')), PtrUInt(locX.Context.CurrentProperty));
  480. CheckEquals(i, tmpListAB.getCursor().GetPosition());
  481. i := 10;
  482. locX.Context.SetObject(locRootObject,nil);
  483. locExp.SetRoot(ParseXPath(Format('p_ab_list[%s=%d]',[SIMPLE_PROP_B,i])));
  484. locX.Execute(locExp);
  485. CheckEquals(Ord(xckObject), Ord(locX.Context.ContentKind));
  486. CheckEquals(PtrUInt(tmpListAB.getDataObject(i)), PtrUInt(locX.Context.ObjectItem));
  487. CheckEquals(PtrUInt(locRootObject.getProperty('p_ab_list')), PtrUInt(locX.Context.CurrentProperty));
  488. CheckEquals(i, tmpListAB.getCursor().GetPosition());
  489. i := 0;
  490. locX.Context.SetObject(locRootObject,nil);
  491. locExp.SetRoot(ParseXPath(Format('p_ab_list[%s=%d]',[SIMPLE_PROP_B,i])));
  492. locX.Execute(locExp);
  493. CheckEquals(Ord(xckObject), Ord(locX.Context.ContentKind));
  494. CheckEquals(PtrUInt(tmpListAB.getDataObject(i)), PtrUInt(locX.Context.ObjectItem));
  495. CheckEquals(PtrUInt(locRootObject.getProperty('p_ab_list')), PtrUInt(locX.Context.CurrentProperty));
  496. CheckEquals(i, tmpListAB.getCursor().GetPosition());
  497. i := -200;
  498. locX.Context.SetObject(locRootObject,nil);
  499. locExp.SetRoot(ParseXPath(Format('p_ab_list[%s=%d]',[SIMPLE_PROP_B,i])));
  500. locX.Execute(locExp);
  501. CheckEquals(Ord(xckNull), Ord(locX.Context.ContentKind));
  502. finally
  503. FreeAndNil(locX);
  504. FreeAndNil(locExp);
  505. end;
  506. end;
  507. procedure TXPathProcessor_Test.Execute_equal_string();
  508. const
  509. SIMPLE_PROP_A = 'simpleProperty_A';
  510. LIST_PROP_A = 'listProperty_A';
  511. SIMPLE_PROP_B = 'simpleProperty_B';
  512. PROP_TYPE = StringType;
  513. function CreateFactory() : ISDODataFactory;
  514. var
  515. locObj : ISDOType;
  516. locRes : ISDODataFactory;
  517. begin
  518. locRes := TSDODataFactory.Create() as ISDODataFactory;
  519. locRes.AddType(s_uri,s_type_object_A,[]);
  520. locRes.AddType(s_uri,s_type_object_B,[]);
  521. locObj := locRes.getType(s_uri,s_type_object_A);
  522. locRes.addProperty(locObj,SIMPLE_PROP_A,sdo_namespace,SDOTypeDefaultTypeNames[PROP_TYPE], []);
  523. locRes.addProperty(locObj,LIST_PROP_A,sdo_namespace,SDOTypeDefaultTypeNames[PROP_TYPE],[pfIsMany]);
  524. locRes.addProperty(locObj,'p_ab_list',s_uri,s_type_object_B,[pfIsMany,pfIsContainment]);
  525. locObj := locRes.getType(s_uri,s_type_object_B);
  526. locRes.addProperty(locObj,SIMPLE_PROP_B,sdo_namespace,SDOTypeDefaultTypeNames[PROP_TYPE], []);
  527. Result := locRes;
  528. end;
  529. procedure fill_p_ab_list(const AList : ISDODataObjectList; const ACount : Byte; const AFac : ISDODataFactory);
  530. var
  531. tmp : ISDODataObject;
  532. k : TSDOInteger;
  533. begin
  534. for k := 0 to Pred(ACount) do begin
  535. tmp := AFac.createNew(s_uri, s_type_object_B);
  536. tmp.setString(SIMPLE_PROP_B,Format('a sample string #%d',[k]));
  537. AList.append(tmp);
  538. end;
  539. end;
  540. var
  541. locFac : ISDODataFactory;
  542. locExp : TXPathExpression;
  543. locX : TXPathProcessor;
  544. locRootObject : ISDODataObject;
  545. tmpListAB : ISDODataObjectList;
  546. i : TSDOInteger;
  547. begin
  548. locFac := CreateFactory();
  549. locRootObject := locFac.createNew(s_uri,s_type_object_A);
  550. tmpListAB := locRootObject.getList('p_ab_list');
  551. fill_p_ab_list(tmpListAB,100,locFac);
  552. locX := nil;
  553. locExp := TXPathExpression.Create();
  554. try
  555. locX := TXPathProcessor.Create();
  556. locX.Context.SetObject(locRootObject,nil);
  557. i := 12;
  558. locExp.SetRoot(ParseXPath(Format('p_ab_list[%s="%s"]',[SIMPLE_PROP_B,Format('a sample string #%d',[i])])));
  559. locX.Execute(locExp);
  560. CheckEquals(Ord(xckObject), Ord(locX.Context.ContentKind));
  561. CheckEquals(PtrUInt(tmpListAB.getDataObject(i)), PtrUInt(locX.Context.ObjectItem));
  562. CheckEquals(PtrUInt(locRootObject.getProperty('p_ab_list')), PtrUInt(locX.Context.CurrentProperty));
  563. CheckEquals(i, tmpListAB.getCursor().GetPosition());
  564. i := 10;
  565. locX.Context.SetObject(locRootObject,nil);
  566. locExp.SetRoot(ParseXPath(Format('p_ab_list[%s="%s"]',[SIMPLE_PROP_B,Format('a sample string #%d',[i])])));
  567. locX.Execute(locExp);
  568. CheckEquals(Ord(xckObject), Ord(locX.Context.ContentKind));
  569. CheckEquals(PtrUInt(tmpListAB.getDataObject(i)), PtrUInt(locX.Context.ObjectItem));
  570. CheckEquals(PtrUInt(locRootObject.getProperty('p_ab_list')), PtrUInt(locX.Context.CurrentProperty));
  571. CheckEquals(i, tmpListAB.getCursor().GetPosition());
  572. i := 0;
  573. locX.Context.SetObject(locRootObject,nil);
  574. locExp.SetRoot(ParseXPath(Format('p_ab_list[%s="%s"]',[SIMPLE_PROP_B,Format('a sample string #%d',[i])])));
  575. locX.Execute(locExp);
  576. CheckEquals(Ord(xckObject), Ord(locX.Context.ContentKind));
  577. CheckEquals(PtrUInt(tmpListAB.getDataObject(i)), PtrUInt(locX.Context.ObjectItem));
  578. CheckEquals(PtrUInt(locRootObject.getProperty('p_ab_list')), PtrUInt(locX.Context.CurrentProperty));
  579. CheckEquals(i, tmpListAB.getCursor().GetPosition());
  580. i := -200;
  581. locX.Context.SetObject(locRootObject,nil);
  582. locExp.SetRoot(ParseXPath(Format('p_ab_list[%s="%s"]',[SIMPLE_PROP_B,Format('a sample string #%d',[i])])));
  583. locX.Execute(locExp);
  584. CheckEquals(Ord(xckNull), Ord(locX.Context.ContentKind));
  585. finally
  586. FreeAndNil(locX);
  587. FreeAndNil(locExp);
  588. end;
  589. end;
  590. {$IFDEF HAS_SDO_BYTES}
  591. procedure TXPathProcessor_Test.Execute_equal_bytes();
  592. const
  593. SIMPLE_PROP_A = 'simpleProperty_A';
  594. LIST_PROP_A = 'listProperty_A';
  595. SIMPLE_PROP_B = 'simpleProperty_B';
  596. PROP_TYPE = BytesType;
  597. function CreateFactory() : ISDODataFactory;
  598. var
  599. locObj : ISDOType;
  600. locRes : ISDODataFactory;
  601. begin
  602. locRes := TSDODataFactory.Create() as ISDODataFactory;
  603. locRes.AddType(s_uri,s_type_object_A,[]);
  604. locRes.AddType(s_uri,s_type_object_B,[]);
  605. locObj := locRes.getType(s_uri,s_type_object_A);
  606. locRes.addProperty(locObj,SIMPLE_PROP_A,sdo_namespace,SDOTypeDefaultTypeNames[PROP_TYPE], []);
  607. locRes.addProperty(locObj,LIST_PROP_A,sdo_namespace,SDOTypeDefaultTypeNames[PROP_TYPE],[pfIsMany]);
  608. locRes.addProperty(locObj,'p_ab_list',s_uri,s_type_object_B,[pfIsMany,pfIsContainment]);
  609. locObj := locRes.getType(s_uri,s_type_object_B);
  610. locRes.addProperty(locObj,SIMPLE_PROP_B,sdo_namespace,SDOTypeDefaultTypeNames[PROP_TYPE], []);
  611. Result := locRes;
  612. end;
  613. function ComputeValue(const AInput : Byte) : TSDOBytes;
  614. var
  615. k : Integer;
  616. begin
  617. SetLength(Result,AInput);
  618. if ( AInput > 0 ) then begin
  619. for k := 1 to AInput do
  620. Result[k-1] := k;
  621. end;
  622. end;
  623. procedure fill_p_ab_list(const AList : ISDODataObjectList; const ACount : Byte; const AFac : ISDODataFactory);
  624. var
  625. tmp : ISDODataObject;
  626. k : Byte;
  627. begin
  628. for k := 0 to Pred(ACount) do begin
  629. tmp := AFac.createNew(s_uri, s_type_object_B);
  630. tmp.setBytes(SIMPLE_PROP_B,ComputeValue(k));
  631. AList.append(tmp);
  632. end;
  633. end;
  634. var
  635. locFac : ISDODataFactory;
  636. locExp : TXPathExpression;
  637. locX : TXPathProcessor;
  638. locRootObject : ISDODataObject;
  639. tmpListAB : ISDODataObjectList;
  640. i : Byte;
  641. begin
  642. locFac := CreateFactory();
  643. locRootObject := locFac.createNew(s_uri,s_type_object_A);
  644. tmpListAB := locRootObject.getList('p_ab_list');
  645. fill_p_ab_list(tmpListAB,200,locFac);
  646. locX := nil;
  647. locExp := TXPathExpression.Create();
  648. try
  649. locX := TXPathProcessor.Create();
  650. locX.Context.SetObject(locRootObject,nil);
  651. i := 12;
  652. locExp.SetRoot(ParseXPath(Format('p_ab_list[%s="%s"]',[SIMPLE_PROP_B,BytesToString(ComputeValue(i))])));
  653. locX.Execute(locExp);
  654. CheckEquals(Ord(xckObject), Ord(locX.Context.ContentKind));
  655. CheckEquals(PtrUInt(tmpListAB.getDataObject(i)), PtrUInt(locX.Context.ObjectItem));
  656. CheckEquals(PtrUInt(locRootObject.getProperty('p_ab_list')), PtrUInt(locX.Context.CurrentProperty));
  657. CheckEquals(i, tmpListAB.getCursor().GetPosition());
  658. i := 10;
  659. locX.Context.SetObject(locRootObject,nil);
  660. locExp.SetRoot(ParseXPath(Format('p_ab_list[%s="%s"]',[SIMPLE_PROP_B,BytesToString(ComputeValue(i))])));
  661. locX.Execute(locExp);
  662. CheckEquals(Ord(xckObject), Ord(locX.Context.ContentKind));
  663. CheckEquals(PtrUInt(tmpListAB.getDataObject(i)), PtrUInt(locX.Context.ObjectItem));
  664. CheckEquals(PtrUInt(locRootObject.getProperty('p_ab_list')), PtrUInt(locX.Context.CurrentProperty));
  665. CheckEquals(i, tmpListAB.getCursor().GetPosition());
  666. i := 150;
  667. locX.Context.SetObject(locRootObject,nil);
  668. locExp.SetRoot(ParseXPath(Format('p_ab_list[%s="%s"]',[SIMPLE_PROP_B,BytesToString(ComputeValue(i))])));
  669. locX.Execute(locExp);
  670. CheckEquals(Ord(xckObject), Ord(locX.Context.ContentKind));
  671. CheckEquals(PtrUInt(tmpListAB.getDataObject(i)), PtrUInt(locX.Context.ObjectItem));
  672. CheckEquals(PtrUInt(locRootObject.getProperty('p_ab_list')), PtrUInt(locX.Context.CurrentProperty));
  673. CheckEquals(i, tmpListAB.getCursor().GetPosition());
  674. i := 0;
  675. locX.Context.SetObject(locRootObject,nil);
  676. locExp.SetRoot(ParseXPath(Format('p_ab_list[%s="%s"]',[SIMPLE_PROP_B,BytesToString(ComputeValue(i))])));
  677. locX.Execute(locExp);
  678. CheckEquals(Ord(xckObject), Ord(locX.Context.ContentKind));
  679. CheckEquals(PtrUInt(tmpListAB.getDataObject(i)), PtrUInt(locX.Context.ObjectItem));
  680. CheckEquals(PtrUInt(locRootObject.getProperty('p_ab_list')), PtrUInt(locX.Context.CurrentProperty));
  681. CheckEquals(i, tmpListAB.getCursor().GetPosition());
  682. locX.Context.SetObject(locRootObject,nil);
  683. locExp.SetRoot(ParseXPath(Format('p_ab_list[%s="%s"]',[SIMPLE_PROP_B,'!'])));
  684. locX.Execute(locExp);
  685. CheckEquals(Ord(xckNull), Ord(locX.Context.ContentKind));
  686. finally
  687. FreeAndNil(locX);
  688. FreeAndNil(locExp);
  689. end;
  690. end;
  691. {$ENDIF HAS_SDO_BYTES}
  692. {$IFDEF HAS_SDO_CHAR}
  693. procedure TXPathProcessor_Test.Execute_equal_char();
  694. const
  695. SIMPLE_PROP_A = 'simpleProperty_A';
  696. LIST_PROP_A = 'listProperty_A';
  697. SIMPLE_PROP_B = 'simpleProperty_B';
  698. PROP_TYPE = CharacterType;
  699. var
  700. CHAR_LIST : array[0..( (26{a-z} + (26{A-Z}) + (10{0-9})) - 1 )] of TSDOChar;
  701. procedure PrepareCharList();
  702. var
  703. k : Integer;
  704. begin
  705. for k := Ord('a') to Ord('z') do
  706. CHAR_LIST[k - Ord('a')] := TSDOChar(k);
  707. for k := Ord('A') to Ord('Z') do
  708. CHAR_LIST[26 + k - Ord('A')] := TSDOChar(k);
  709. for k := Ord('0') to Ord('9') do
  710. CHAR_LIST[26 + 26 + k - Ord('0')] := TSDOChar(k);
  711. end;
  712. function CreateFactory() : ISDODataFactory;
  713. var
  714. locObj : ISDOType;
  715. locRes : ISDODataFactory;
  716. begin
  717. locRes := TSDODataFactory.Create() as ISDODataFactory;
  718. locRes.AddType(s_uri,s_type_object_A,[]);
  719. locRes.AddType(s_uri,s_type_object_B,[]);
  720. locObj := locRes.getType(s_uri,s_type_object_A);
  721. locRes.addProperty(locObj,SIMPLE_PROP_A,sdo_namespace,SDOTypeDefaultTypeNames[PROP_TYPE], []);
  722. locRes.addProperty(locObj,LIST_PROP_A,sdo_namespace,SDOTypeDefaultTypeNames[PROP_TYPE],[pfIsMany]);
  723. locRes.addProperty(locObj,'p_ab_list',s_uri,s_type_object_B,[pfIsMany,pfIsContainment]);
  724. locObj := locRes.getType(s_uri,s_type_object_B);
  725. locRes.addProperty(locObj,SIMPLE_PROP_B,sdo_namespace,SDOTypeDefaultTypeNames[PROP_TYPE], []);
  726. Result := locRes;
  727. end;
  728. function ComputeValue(const AInput : Byte) : TSDOChar;
  729. begin
  730. Result := CHAR_LIST[AInput];
  731. end;
  732. procedure fill_p_ab_list(const AList : ISDODataObjectList; const ACount : Byte; const AFac : ISDODataFactory);
  733. var
  734. tmp : ISDODataObject;
  735. k : Byte;
  736. begin
  737. for k := 0 to Pred(ACount) do begin
  738. tmp := AFac.createNew(s_uri, s_type_object_B);
  739. tmp.setCharacter(SIMPLE_PROP_B,ComputeValue(k));
  740. AList.append(tmp);
  741. end;
  742. end;
  743. var
  744. locFac : ISDODataFactory;
  745. locExp : TXPathExpression;
  746. locX : TXPathProcessor;
  747. locRootObject : ISDODataObject;
  748. tmpListAB : ISDODataObjectList;
  749. i : Byte;
  750. begin
  751. PrepareCharList();
  752. locFac := CreateFactory();
  753. locRootObject := locFac.createNew(s_uri,s_type_object_A);
  754. tmpListAB := locRootObject.getList('p_ab_list');
  755. fill_p_ab_list(tmpListAB,High(CHAR_LIST),locFac);
  756. locX := nil;
  757. locExp := TXPathExpression.Create();
  758. try
  759. locX := TXPathProcessor.Create();
  760. locX.Context.SetObject(locRootObject,nil);
  761. i := 12;
  762. locExp.SetRoot(ParseXPath(Format('p_ab_list[%s="%s"]',[SIMPLE_PROP_B,ComputeValue(i)])));
  763. locX.Execute(locExp);
  764. CheckEquals(Ord(xckObject), Ord(locX.Context.ContentKind));
  765. CheckEquals(PtrUInt(tmpListAB.getDataObject(i)), PtrUInt(locX.Context.ObjectItem));
  766. CheckEquals(PtrUInt(locRootObject.getProperty('p_ab_list')), PtrUInt(locX.Context.CurrentProperty));
  767. CheckEquals(i, tmpListAB.getCursor().GetPosition());
  768. i := 10;
  769. locX.Context.SetObject(locRootObject,nil);
  770. locExp.SetRoot(ParseXPath(Format('p_ab_list[%s="%s"]',[SIMPLE_PROP_B,ComputeValue(i)])));
  771. locX.Execute(locExp);
  772. CheckEquals(Ord(xckObject), Ord(locX.Context.ContentKind));
  773. CheckEquals(PtrUInt(tmpListAB.getDataObject(i)), PtrUInt(locX.Context.ObjectItem));
  774. CheckEquals(PtrUInt(locRootObject.getProperty('p_ab_list')), PtrUInt(locX.Context.CurrentProperty));
  775. CheckEquals(i, tmpListAB.getCursor().GetPosition());
  776. i := 0;
  777. locX.Context.SetObject(locRootObject,nil);
  778. locExp.SetRoot(ParseXPath(Format('p_ab_list[%s="%s"]',[SIMPLE_PROP_B,ComputeValue(i)])));
  779. locX.Execute(locExp);
  780. CheckEquals(Ord(xckObject), Ord(locX.Context.ContentKind));
  781. CheckEquals(PtrUInt(tmpListAB.getDataObject(i)), PtrUInt(locX.Context.ObjectItem));
  782. CheckEquals(PtrUInt(locRootObject.getProperty('p_ab_list')), PtrUInt(locX.Context.CurrentProperty));
  783. CheckEquals(i, tmpListAB.getCursor().GetPosition());
  784. locX.Context.SetObject(locRootObject,nil);
  785. locExp.SetRoot(ParseXPath(Format('p_ab_list[%s="%s"]',[SIMPLE_PROP_B,'!'])));
  786. locX.Execute(locExp);
  787. CheckEquals(Ord(xckNull), Ord(locX.Context.ContentKind));
  788. finally
  789. FreeAndNil(locX);
  790. FreeAndNil(locExp);
  791. end;
  792. end;
  793. {$ENDIF HAS_SDO_CHAR}
  794. {$IFDEF HAS_SDO_CURRENCY}
  795. procedure TXPathProcessor_Test.Execute_equal_currency();
  796. const
  797. SIMPLE_PROP_A = 'simpleProperty_A';
  798. LIST_PROP_A = 'listProperty_A';
  799. SIMPLE_PROP_B = 'simpleProperty_B';
  800. PROP_TYPE = CurrencyType;
  801. function CreateFactory() : ISDODataFactory;
  802. var
  803. locObj : ISDOType;
  804. locRes : ISDODataFactory;
  805. begin
  806. locRes := TSDODataFactory.Create() as ISDODataFactory;
  807. locRes.AddType(s_uri,s_type_object_A,[]);
  808. locRes.AddType(s_uri,s_type_object_B,[]);
  809. locObj := locRes.getType(s_uri,s_type_object_A);
  810. locRes.addProperty(locObj,SIMPLE_PROP_A,sdo_namespace,SDOTypeDefaultTypeNames[PROP_TYPE], []);
  811. locRes.addProperty(locObj,LIST_PROP_A,sdo_namespace,SDOTypeDefaultTypeNames[PROP_TYPE],[pfIsMany]);
  812. locRes.addProperty(locObj,'p_ab_list',s_uri,s_type_object_B,[pfIsMany,pfIsContainment]);
  813. locObj := locRes.getType(s_uri,s_type_object_B);
  814. locRes.addProperty(locObj,SIMPLE_PROP_B,sdo_namespace,SDOTypeDefaultTypeNames[PROP_TYPE], []);
  815. Result := locRes;
  816. end;
  817. function ComputeValue(const AInput : Integer) : TSDOCurrency;
  818. begin
  819. Result := AInput * 10000000;
  820. if ( ( AInput mod 2) = 0 ) then
  821. Result := -Result;
  822. end;
  823. procedure fill_p_ab_list(const AList : ISDODataObjectList; const ACount : Byte; const AFac : ISDODataFactory);
  824. var
  825. tmp : ISDODataObject;
  826. k : Byte;
  827. begin
  828. for k := 0 to Pred(ACount) do begin
  829. tmp := AFac.createNew(s_uri, s_type_object_B);
  830. tmp.setCurrency(SIMPLE_PROP_B,ComputeValue(k));
  831. AList.append(tmp);
  832. end;
  833. end;
  834. var
  835. locFac : ISDODataFactory;
  836. locExp : TXPathExpression;
  837. locX : TXPathProcessor;
  838. locRootObject : ISDODataObject;
  839. tmpListAB : ISDODataObjectList;
  840. v : TSDOCurrency;
  841. j : Integer;
  842. begin
  843. locFac := CreateFactory();
  844. locRootObject := locFac.createNew(s_uri,s_type_object_A);
  845. tmpListAB := locRootObject.getList('p_ab_list');
  846. fill_p_ab_list(tmpListAB,100,locFac);
  847. locX := nil;
  848. locExp := TXPathExpression.Create();
  849. try
  850. locX := TXPathProcessor.Create();
  851. locX.Context.SetObject(locRootObject,nil);
  852. j := 12; v := j;
  853. locExp.SetRoot(ParseXPath(Format('p_ab_list[%s=%s]',[SIMPLE_PROP_B,TSDOConvertHelper.CurrencyToString(ComputeValue(j))])));
  854. locX.Execute(locExp);
  855. CheckEquals(Ord(xckObject), Ord(locX.Context.ContentKind));
  856. CheckEquals(PtrUInt(tmpListAB.getDataObject(j)), PtrUInt(locX.Context.ObjectItem));
  857. CheckEquals(PtrUInt(locRootObject.getProperty('p_ab_list')), PtrUInt(locX.Context.CurrentProperty));
  858. CheckEquals(v, tmpListAB.getCursor().GetPosition());
  859. j := 10; v := j;
  860. locX.Context.SetObject(locRootObject,nil);
  861. locExp.SetRoot(ParseXPath(Format('p_ab_list[%s=%s]',[SIMPLE_PROP_B,TSDOConvertHelper.CurrencyToString(ComputeValue(j))])));
  862. locX.Execute(locExp);
  863. CheckEquals(Ord(xckObject), Ord(locX.Context.ContentKind));
  864. CheckEquals(PtrUInt(tmpListAB.getDataObject(j)), PtrUInt(locX.Context.ObjectItem));
  865. CheckEquals(PtrUInt(locRootObject.getProperty('p_ab_list')), PtrUInt(locX.Context.CurrentProperty));
  866. CheckEquals(v, tmpListAB.getCursor().GetPosition());
  867. j := 0; v := j;
  868. locX.Context.SetObject(locRootObject,nil);
  869. locExp.SetRoot(ParseXPath(Format('p_ab_list[%s=%s]',[SIMPLE_PROP_B,TSDOConvertHelper.CurrencyToString(ComputeValue(j))])));
  870. locX.Execute(locExp);
  871. CheckEquals(Ord(xckObject), Ord(locX.Context.ContentKind));
  872. CheckEquals(PtrUInt(tmpListAB.getDataObject(j)), PtrUInt(locX.Context.ObjectItem));
  873. CheckEquals(PtrUInt(locRootObject.getProperty('p_ab_list')), PtrUInt(locX.Context.CurrentProperty));
  874. CheckEquals(v, tmpListAB.getCursor().GetPosition());
  875. j := 200;
  876. locX.Context.SetObject(locRootObject,nil);
  877. locExp.SetRoot(ParseXPath(Format('p_ab_list[%s=%s]',[SIMPLE_PROP_B,TSDOConvertHelper.CurrencyToString(ComputeValue(j))])));
  878. locX.Execute(locExp);
  879. CheckEquals(Ord(xckNull), Ord(locX.Context.ContentKind));
  880. finally
  881. FreeAndNil(locX);
  882. FreeAndNil(locExp);
  883. end;
  884. end;
  885. {$ENDIF HAS_SDO_CURRENCY}
  886. {$IFDEF HAS_SDO_DOUBLE}
  887. procedure TXPathProcessor_Test.Execute_equal_double();
  888. const
  889. SIMPLE_PROP_A = 'simpleProperty_A';
  890. LIST_PROP_A = 'listProperty_A';
  891. SIMPLE_PROP_B = 'simpleProperty_B';
  892. PROP_TYPE = DoubleType;
  893. function CreateFactory() : ISDODataFactory;
  894. var
  895. locObj : ISDOType;
  896. locRes : ISDODataFactory;
  897. begin
  898. locRes := TSDODataFactory.Create() as ISDODataFactory;
  899. locRes.AddType(s_uri,s_type_object_A,[]);
  900. locRes.AddType(s_uri,s_type_object_B,[]);
  901. locObj := locRes.getType(s_uri,s_type_object_A);
  902. locRes.addProperty(locObj,SIMPLE_PROP_A,sdo_namespace,SDOTypeDefaultTypeNames[PROP_TYPE], []);
  903. locRes.addProperty(locObj,LIST_PROP_A,sdo_namespace,SDOTypeDefaultTypeNames[PROP_TYPE],[pfIsMany]);
  904. locRes.addProperty(locObj,'p_ab_list',s_uri,s_type_object_B,[pfIsMany,pfIsContainment]);
  905. locObj := locRes.getType(s_uri,s_type_object_B);
  906. locRes.addProperty(locObj,SIMPLE_PROP_B,sdo_namespace,SDOTypeDefaultTypeNames[PROP_TYPE], []);
  907. Result := locRes;
  908. end;
  909. function ComputeValue(const AInput : Integer) : TSDODouble;
  910. begin
  911. Result := AInput * 10000000;
  912. if ( ( AInput mod 2) = 0 ) then
  913. Result := -Result;
  914. end;
  915. procedure fill_p_ab_list(const AList : ISDODataObjectList; const ACount : Byte; const AFac : ISDODataFactory);
  916. var
  917. tmp : ISDODataObject;
  918. k : Byte;
  919. begin
  920. for k := 0 to Pred(ACount) do begin
  921. tmp := AFac.createNew(s_uri, s_type_object_B);
  922. tmp.setDouble(SIMPLE_PROP_B,ComputeValue(k));
  923. AList.append(tmp);
  924. end;
  925. end;
  926. var
  927. locFac : ISDODataFactory;
  928. locExp : TXPathExpression;
  929. locX : TXPathProcessor;
  930. locRootObject : ISDODataObject;
  931. tmpListAB : ISDODataObjectList;
  932. v : TSDODouble;
  933. j : Integer;
  934. begin
  935. locFac := CreateFactory();
  936. locRootObject := locFac.createNew(s_uri,s_type_object_A);
  937. tmpListAB := locRootObject.getList('p_ab_list');
  938. fill_p_ab_list(tmpListAB,100,locFac);
  939. locX := nil;
  940. locExp := TXPathExpression.Create();
  941. try
  942. locX := TXPathProcessor.Create();
  943. locX.Context.SetObject(locRootObject,nil);
  944. j := 12; v := j;
  945. locExp.SetRoot(ParseXPath(Format('p_ab_list[%s=%s]',[SIMPLE_PROP_B,TSDOConvertHelper.FloatToString(ComputeValue(j))])));
  946. locX.Execute(locExp);
  947. CheckEquals(Ord(xckObject), Ord(locX.Context.ContentKind));
  948. CheckEquals(PtrUInt(tmpListAB.getDataObject(j)), PtrUInt(locX.Context.ObjectItem));
  949. CheckEquals(PtrUInt(locRootObject.getProperty('p_ab_list')), PtrUInt(locX.Context.CurrentProperty));
  950. CheckEquals(v, tmpListAB.getCursor().GetPosition());
  951. j := 10; v := j;
  952. locX.Context.SetObject(locRootObject,nil);
  953. locExp.SetRoot(ParseXPath(Format('p_ab_list[%s=%s]',[SIMPLE_PROP_B,TSDOConvertHelper.FloatToString(ComputeValue(j))])));
  954. locX.Execute(locExp);
  955. CheckEquals(Ord(xckObject), Ord(locX.Context.ContentKind));
  956. CheckEquals(PtrUInt(tmpListAB.getDataObject(j)), PtrUInt(locX.Context.ObjectItem));
  957. CheckEquals(PtrUInt(locRootObject.getProperty('p_ab_list')), PtrUInt(locX.Context.CurrentProperty));
  958. CheckEquals(v, tmpListAB.getCursor().GetPosition());
  959. j := 0; v := j;
  960. locX.Context.SetObject(locRootObject,nil);
  961. locExp.SetRoot(ParseXPath(Format('p_ab_list[%s=%s]',[SIMPLE_PROP_B,TSDOConvertHelper.FloatToString(ComputeValue(j))])));
  962. locX.Execute(locExp);
  963. CheckEquals(Ord(xckObject), Ord(locX.Context.ContentKind));
  964. CheckEquals(PtrUInt(tmpListAB.getDataObject(j)), PtrUInt(locX.Context.ObjectItem));
  965. CheckEquals(PtrUInt(locRootObject.getProperty('p_ab_list')), PtrUInt(locX.Context.CurrentProperty));
  966. CheckEquals(v, tmpListAB.getCursor().GetPosition());
  967. j := 200;
  968. locX.Context.SetObject(locRootObject,nil);
  969. locExp.SetRoot(ParseXPath(Format('p_ab_list[%s=%s]',[SIMPLE_PROP_B,TSDOConvertHelper.FloatToString(ComputeValue(j))])));
  970. locX.Execute(locExp);
  971. CheckEquals(Ord(xckNull), Ord(locX.Context.ContentKind));
  972. finally
  973. FreeAndNil(locX);
  974. FreeAndNil(locExp);
  975. end;
  976. end;
  977. {$ENDIF HAS_SDO_DOUBLE}
  978. {$IFDEF HAS_SDO_FLOAT}
  979. procedure TXPathProcessor_Test.Execute_equal_float();
  980. const
  981. SIMPLE_PROP_A = 'simpleProperty_A';
  982. LIST_PROP_A = 'listProperty_A';
  983. SIMPLE_PROP_B = 'simpleProperty_B';
  984. PROP_TYPE = FloatType;
  985. function CreateFactory() : ISDODataFactory;
  986. var
  987. locObj : ISDOType;
  988. locRes : ISDODataFactory;
  989. begin
  990. locRes := TSDODataFactory.Create() as ISDODataFactory;
  991. locRes.AddType(s_uri,s_type_object_A,[]);
  992. locRes.AddType(s_uri,s_type_object_B,[]);
  993. locObj := locRes.getType(s_uri,s_type_object_A);
  994. locRes.addProperty(locObj,SIMPLE_PROP_A,sdo_namespace,SDOTypeDefaultTypeNames[PROP_TYPE], []);
  995. locRes.addProperty(locObj,LIST_PROP_A,sdo_namespace,SDOTypeDefaultTypeNames[PROP_TYPE],[pfIsMany]);
  996. locRes.addProperty(locObj,'p_ab_list',s_uri,s_type_object_B,[pfIsMany,pfIsContainment]);
  997. locObj := locRes.getType(s_uri,s_type_object_B);
  998. locRes.addProperty(locObj,SIMPLE_PROP_B,sdo_namespace,SDOTypeDefaultTypeNames[PROP_TYPE], []);
  999. Result := locRes;
  1000. end;
  1001. function ComputeValue(const AInput : Integer) : TSDOFloat;
  1002. begin
  1003. Result := AInput * 10000000;
  1004. if ( ( AInput mod 2) = 0 ) then
  1005. Result := -Result;
  1006. end;
  1007. procedure fill_p_ab_list(const AList : ISDODataObjectList; const ACount : Byte; const AFac : ISDODataFactory);
  1008. var
  1009. tmp : ISDODataObject;
  1010. k : Byte;
  1011. begin
  1012. for k := 0 to Pred(ACount) do begin
  1013. tmp := AFac.createNew(s_uri, s_type_object_B);
  1014. tmp.setFloat(SIMPLE_PROP_B,ComputeValue(k));
  1015. AList.append(tmp);
  1016. end;
  1017. end;
  1018. var
  1019. locFac : ISDODataFactory;
  1020. locExp : TXPathExpression;
  1021. locX : TXPathProcessor;
  1022. locRootObject : ISDODataObject;
  1023. tmpListAB : ISDODataObjectList;
  1024. v : TSDOFloat;
  1025. j : Integer;
  1026. begin
  1027. locFac := CreateFactory();
  1028. locRootObject := locFac.createNew(s_uri,s_type_object_A);
  1029. tmpListAB := locRootObject.getList('p_ab_list');
  1030. fill_p_ab_list(tmpListAB,100,locFac);
  1031. locX := nil;
  1032. locExp := TXPathExpression.Create();
  1033. try
  1034. locX := TXPathProcessor.Create();
  1035. locX.Context.SetObject(locRootObject,nil);
  1036. j := 12; v := j;
  1037. locExp.SetRoot(ParseXPath(Format('p_ab_list[%s=%s]',[SIMPLE_PROP_B,TSDOConvertHelper.FloatToString(ComputeValue(j))])));
  1038. locX.Execute(locExp);
  1039. CheckEquals(Ord(xckObject), Ord(locX.Context.ContentKind));
  1040. CheckEquals(PtrUInt(tmpListAB.getDataObject(j)), PtrUInt(locX.Context.ObjectItem));
  1041. CheckEquals(PtrUInt(locRootObject.getProperty('p_ab_list')), PtrUInt(locX.Context.CurrentProperty));
  1042. CheckEquals(v, tmpListAB.getCursor().GetPosition());
  1043. j := 10; v := j;
  1044. locX.Context.SetObject(locRootObject,nil);
  1045. locExp.SetRoot(ParseXPath(Format('p_ab_list[%s=%s]',[SIMPLE_PROP_B,TSDOConvertHelper.FloatToString(ComputeValue(j))])));
  1046. locX.Execute(locExp);
  1047. CheckEquals(Ord(xckObject), Ord(locX.Context.ContentKind));
  1048. CheckEquals(PtrUInt(tmpListAB.getDataObject(j)), PtrUInt(locX.Context.ObjectItem));
  1049. CheckEquals(PtrUInt(locRootObject.getProperty('p_ab_list')), PtrUInt(locX.Context.CurrentProperty));
  1050. CheckEquals(v, tmpListAB.getCursor().GetPosition());
  1051. j := 0; v := j;
  1052. locX.Context.SetObject(locRootObject,nil);
  1053. locExp.SetRoot(ParseXPath(Format('p_ab_list[%s=%s]',[SIMPLE_PROP_B,TSDOConvertHelper.FloatToString(ComputeValue(j))])));
  1054. locX.Execute(locExp);
  1055. CheckEquals(Ord(xckObject), Ord(locX.Context.ContentKind));
  1056. CheckEquals(PtrUInt(tmpListAB.getDataObject(j)), PtrUInt(locX.Context.ObjectItem));
  1057. CheckEquals(PtrUInt(locRootObject.getProperty('p_ab_list')), PtrUInt(locX.Context.CurrentProperty));
  1058. CheckEquals(v, tmpListAB.getCursor().GetPosition());
  1059. j := 200;
  1060. locX.Context.SetObject(locRootObject,nil);
  1061. locExp.SetRoot(ParseXPath(Format('p_ab_list[%s=%s]',[SIMPLE_PROP_B,TSDOConvertHelper.FloatToString(ComputeValue(j))])));
  1062. locX.Execute(locExp);
  1063. CheckEquals(Ord(xckNull), Ord(locX.Context.ContentKind));
  1064. finally
  1065. FreeAndNil(locX);
  1066. FreeAndNil(locExp);
  1067. end;
  1068. end;
  1069. {$ENDIF HAS_SDO_FLOAT}
  1070. {$IFDEF HAS_SDO_LONG}
  1071. procedure TXPathProcessor_Test.Execute_equal_long();
  1072. const
  1073. SIMPLE_PROP_A = 'simpleProperty_A';
  1074. LIST_PROP_A = 'listProperty_A';
  1075. SIMPLE_PROP_B = 'simpleProperty_B';
  1076. PROP_TYPE = LongType;
  1077. function CreateFactory() : ISDODataFactory;
  1078. var
  1079. locObj : ISDOType;
  1080. locRes : ISDODataFactory;
  1081. begin
  1082. locRes := TSDODataFactory.Create() as ISDODataFactory;
  1083. locRes.AddType(s_uri,s_type_object_A,[]);
  1084. locRes.AddType(s_uri,s_type_object_B,[]);
  1085. locObj := locRes.getType(s_uri,s_type_object_A);
  1086. locRes.addProperty(locObj,SIMPLE_PROP_A,sdo_namespace,SDOTypeDefaultTypeNames[PROP_TYPE], []);
  1087. locRes.addProperty(locObj,LIST_PROP_A,sdo_namespace,SDOTypeDefaultTypeNames[PROP_TYPE],[pfIsMany]);
  1088. locRes.addProperty(locObj,'p_ab_list',s_uri,s_type_object_B,[pfIsMany,pfIsContainment]);
  1089. locObj := locRes.getType(s_uri,s_type_object_B);
  1090. locRes.addProperty(locObj,SIMPLE_PROP_B,sdo_namespace,SDOTypeDefaultTypeNames[PROP_TYPE], []);
  1091. Result := locRes;
  1092. end;
  1093. function ComputeValue(const AInput : TSDOLong) : TSDOLong;
  1094. begin
  1095. Result := AInput * 10000000;
  1096. if ( ( AInput mod 2) = 0 ) then
  1097. Result := -Result;
  1098. end;
  1099. procedure fill_p_ab_list(const AList : ISDODataObjectList; const ACount : Byte; const AFac : ISDODataFactory);
  1100. var
  1101. tmp : ISDODataObject;
  1102. k : Byte;
  1103. begin
  1104. for k := 0 to Pred(ACount) do begin
  1105. tmp := AFac.createNew(s_uri, s_type_object_B);
  1106. tmp.setLong(SIMPLE_PROP_B,ComputeValue(k));
  1107. AList.append(tmp);
  1108. end;
  1109. end;
  1110. var
  1111. locFac : ISDODataFactory;
  1112. locExp : TXPathExpression;
  1113. locX : TXPathProcessor;
  1114. locRootObject : ISDODataObject;
  1115. tmpListAB : ISDODataObjectList;
  1116. i : TSDOLong;
  1117. begin
  1118. locFac := CreateFactory();
  1119. locRootObject := locFac.createNew(s_uri,s_type_object_A);
  1120. tmpListAB := locRootObject.getList('p_ab_list');
  1121. fill_p_ab_list(tmpListAB,100,locFac);
  1122. locX := nil;
  1123. locExp := TXPathExpression.Create();
  1124. try
  1125. locX := TXPathProcessor.Create();
  1126. locX.Context.SetObject(locRootObject,nil);
  1127. i := 12;
  1128. locExp.SetRoot(ParseXPath(Format('p_ab_list[%s=%d]',[SIMPLE_PROP_B,ComputeValue(i)])));
  1129. locX.Execute(locExp);
  1130. CheckEquals(Ord(xckObject), Ord(locX.Context.ContentKind));
  1131. CheckEquals(PtrUInt(tmpListAB.getDataObject(i)), PtrUInt(locX.Context.ObjectItem));
  1132. CheckEquals(PtrUInt(locRootObject.getProperty('p_ab_list')), PtrUInt(locX.Context.CurrentProperty));
  1133. CheckEquals(i, tmpListAB.getCursor().GetPosition());
  1134. i := 10;
  1135. locX.Context.SetObject(locRootObject,nil);
  1136. locExp.SetRoot(ParseXPath(Format('p_ab_list[%s=%d]',[SIMPLE_PROP_B,ComputeValue(i)])));
  1137. locX.Execute(locExp);
  1138. CheckEquals(Ord(xckObject), Ord(locX.Context.ContentKind));
  1139. CheckEquals(PtrUInt(tmpListAB.getDataObject(i)), PtrUInt(locX.Context.ObjectItem));
  1140. CheckEquals(PtrUInt(locRootObject.getProperty('p_ab_list')), PtrUInt(locX.Context.CurrentProperty));
  1141. CheckEquals(i, tmpListAB.getCursor().GetPosition());
  1142. i := 0;
  1143. locX.Context.SetObject(locRootObject,nil);
  1144. locExp.SetRoot(ParseXPath(Format('p_ab_list[%s=%d]',[SIMPLE_PROP_B,ComputeValue(i)])));
  1145. locX.Execute(locExp);
  1146. CheckEquals(Ord(xckObject), Ord(locX.Context.ContentKind));
  1147. CheckEquals(PtrUInt(tmpListAB.getDataObject(i)), PtrUInt(locX.Context.ObjectItem));
  1148. CheckEquals(PtrUInt(locRootObject.getProperty('p_ab_list')), PtrUInt(locX.Context.CurrentProperty));
  1149. CheckEquals(i, tmpListAB.getCursor().GetPosition());
  1150. i := 200;
  1151. locX.Context.SetObject(locRootObject,nil);
  1152. locExp.SetRoot(ParseXPath(Format('p_ab_list[%s=%d]',[SIMPLE_PROP_B,ComputeValue(i)])));
  1153. locX.Execute(locExp);
  1154. CheckEquals(Ord(xckNull), Ord(locX.Context.ContentKind));
  1155. finally
  1156. FreeAndNil(locX);
  1157. FreeAndNil(locExp);
  1158. end;
  1159. end;
  1160. {$ENDIF HAS_SDO_LONG}
  1161. {$IFDEF HAS_SDO_SHORT}
  1162. procedure TXPathProcessor_Test.Execute_equal_short();
  1163. const
  1164. SIMPLE_PROP_A = 'simpleProperty_A';
  1165. LIST_PROP_A = 'listProperty_A';
  1166. SIMPLE_PROP_B = 'simpleProperty_B';
  1167. PROP_TYPE = ShortType;
  1168. function CreateFactory() : ISDODataFactory;
  1169. var
  1170. locObj : ISDOType;
  1171. locRes : ISDODataFactory;
  1172. begin
  1173. locRes := TSDODataFactory.Create() as ISDODataFactory;
  1174. locRes.AddType(s_uri,s_type_object_A,[]);
  1175. locRes.AddType(s_uri,s_type_object_B,[]);
  1176. locObj := locRes.getType(s_uri,s_type_object_A);
  1177. locRes.addProperty(locObj,SIMPLE_PROP_A,sdo_namespace,SDOTypeDefaultTypeNames[PROP_TYPE], []);
  1178. locRes.addProperty(locObj,LIST_PROP_A,sdo_namespace,SDOTypeDefaultTypeNames[PROP_TYPE],[pfIsMany]);
  1179. locRes.addProperty(locObj,'p_ab_list',s_uri,s_type_object_B,[pfIsMany,pfIsContainment]);
  1180. locObj := locRes.getType(s_uri,s_type_object_B);
  1181. locRes.addProperty(locObj,SIMPLE_PROP_B,sdo_namespace,SDOTypeDefaultTypeNames[PROP_TYPE], []);
  1182. Result := locRes;
  1183. end;
  1184. function ComputeValue(const AInput : TSDOShort) : TSDOShort;
  1185. begin
  1186. Result := AInput * 100 + AInput;
  1187. if ( ( AInput mod 2) = 0 ) then
  1188. Result := -Result;
  1189. end;
  1190. procedure fill_p_ab_list(const AList : ISDODataObjectList; const ACount : Byte; const AFac : ISDODataFactory);
  1191. var
  1192. tmp : ISDODataObject;
  1193. k : Byte;
  1194. begin
  1195. for k := 0 to Pred(ACount) do begin
  1196. tmp := AFac.createNew(s_uri, s_type_object_B);
  1197. tmp.setShort(SIMPLE_PROP_B,ComputeValue(k));
  1198. AList.append(tmp);
  1199. end;
  1200. end;
  1201. var
  1202. locFac : ISDODataFactory;
  1203. locExp : TXPathExpression;
  1204. locX : TXPathProcessor;
  1205. locRootObject : ISDODataObject;
  1206. tmpListAB : ISDODataObjectList;
  1207. i : TSDOShort;
  1208. begin
  1209. locFac := CreateFactory();
  1210. locRootObject := locFac.createNew(s_uri,s_type_object_A);
  1211. tmpListAB := locRootObject.getList('p_ab_list');
  1212. fill_p_ab_list(tmpListAB,100,locFac);
  1213. locX := nil;
  1214. locExp := TXPathExpression.Create();
  1215. try
  1216. locX := TXPathProcessor.Create();
  1217. locX.Context.SetObject(locRootObject,nil);
  1218. i := 12;
  1219. locExp.SetRoot(ParseXPath(Format('p_ab_list[%s=%d]',[SIMPLE_PROP_B,ComputeValue(i)])));
  1220. locX.Execute(locExp);
  1221. CheckEquals(Ord(xckObject), Ord(locX.Context.ContentKind));
  1222. CheckEquals(PtrUInt(tmpListAB.getDataObject(i)), PtrUInt(locX.Context.ObjectItem));
  1223. CheckEquals(PtrUInt(locRootObject.getProperty('p_ab_list')), PtrUInt(locX.Context.CurrentProperty));
  1224. CheckEquals(i, tmpListAB.getCursor().GetPosition());
  1225. i := 10;
  1226. locX.Context.SetObject(locRootObject,nil);
  1227. locExp.SetRoot(ParseXPath(Format('p_ab_list[%s=%d]',[SIMPLE_PROP_B,ComputeValue(i)])));
  1228. locX.Execute(locExp);
  1229. CheckEquals(Ord(xckObject), Ord(locX.Context.ContentKind));
  1230. CheckEquals(PtrUInt(tmpListAB.getDataObject(i)), PtrUInt(locX.Context.ObjectItem));
  1231. CheckEquals(PtrUInt(locRootObject.getProperty('p_ab_list')), PtrUInt(locX.Context.CurrentProperty));
  1232. CheckEquals(i, tmpListAB.getCursor().GetPosition());
  1233. i := 0;
  1234. locX.Context.SetObject(locRootObject,nil);
  1235. locExp.SetRoot(ParseXPath(Format('p_ab_list[%s=%d]',[SIMPLE_PROP_B,ComputeValue(i)])));
  1236. locX.Execute(locExp);
  1237. CheckEquals(Ord(xckObject), Ord(locX.Context.ContentKind));
  1238. CheckEquals(PtrUInt(tmpListAB.getDataObject(i)), PtrUInt(locX.Context.ObjectItem));
  1239. CheckEquals(PtrUInt(locRootObject.getProperty('p_ab_list')), PtrUInt(locX.Context.CurrentProperty));
  1240. CheckEquals(i, tmpListAB.getCursor().GetPosition());
  1241. i := 200;
  1242. locX.Context.SetObject(locRootObject,nil);
  1243. locExp.SetRoot(ParseXPath(Format('p_ab_list[%s=%d]',[SIMPLE_PROP_B,ComputeValue(i)])));
  1244. locX.Execute(locExp);
  1245. CheckEquals(Ord(xckNull), Ord(locX.Context.ContentKind));
  1246. finally
  1247. FreeAndNil(locX);
  1248. FreeAndNil(locExp);
  1249. end;
  1250. end;
  1251. {$ENDIF HAS_SDO_SHORT}
  1252. procedure TXPathProcessor_Test.Execute_nested_object;
  1253. function CreateFactory() : ISDODataFactory;
  1254. var
  1255. locObj : ISDOType;
  1256. locRes : ISDODataFactory;
  1257. begin
  1258. locRes := TSDODataFactory.Create() as ISDODataFactory;
  1259. locRes.AddType(s_uri,s_type_object_A,[]);
  1260. locRes.AddType(s_uri,s_type_object_B,[]);
  1261. locRes.AddType(s_uri,s_type_object_C,[]);
  1262. locRes.AddType(s_uri,s_type_object_D,[]);
  1263. locObj := locRes.getType(s_uri,s_type_object_A);
  1264. locRes.addProperty(locObj,s_bool_prop,sdo_namespace,SDOTypeDefaultTypeNames[BooleanType], []);
  1265. locRes.addProperty(locObj,s_bool_propList,sdo_namespace,SDOTypeDefaultTypeNames[BooleanType],[pfIsMany]);
  1266. locRes.addProperty(locObj,s_integer_prop,sdo_namespace,SDOTypeDefaultTypeNames[IntegerType], []);
  1267. locRes.addProperty(locObj,s_integer_propList,sdo_namespace,SDOTypeDefaultTypeNames[IntegerType],[pfIsMany]);
  1268. locRes.addProperty(locObj,s_string_prop,sdo_namespace,SDOTypeDefaultTypeNames[StringType], []);
  1269. locRes.addProperty(locObj,s_string_propList,sdo_namespace,SDOTypeDefaultTypeNames[StringType],[pfIsMany]);
  1270. locRes.addProperty(locObj,'p_ab',s_uri,s_type_object_B,[pfIsContainment]);
  1271. locRes.addProperty(locObj,'p_ab_list',s_uri,s_type_object_B,[pfIsMany,pfIsContainment]);
  1272. locRes.addProperty(locObj,'p_ac',s_uri,s_type_object_C,[pfIsContainment]);
  1273. locObj := locRes.getType(s_uri,s_type_object_B);
  1274. locRes.addProperty(locObj,s_bool_prop,sdo_namespace,SDOTypeDefaultTypeNames[BooleanType], []);
  1275. locRes.addProperty(locObj,s_bool_propList,sdo_namespace,SDOTypeDefaultTypeNames[BooleanType],[pfIsMany]);
  1276. locRes.addProperty(locObj,s_integer_prop,sdo_namespace,SDOTypeDefaultTypeNames[IntegerType], []);
  1277. locRes.addProperty(locObj,s_integer_propList,sdo_namespace,SDOTypeDefaultTypeNames[IntegerType],[pfIsMany]);
  1278. locRes.addProperty(locObj,s_string_prop,sdo_namespace,SDOTypeDefaultTypeNames[StringType], []);
  1279. locRes.addProperty(locObj,s_string_propList,sdo_namespace,SDOTypeDefaultTypeNames[StringType],[pfIsMany]);
  1280. locRes.addProperty(locObj,'p_bc',s_uri,s_type_object_C,[pfIsContainment]);
  1281. locRes.addProperty(locObj,'p_bc_list',s_uri,s_type_object_C,[pfIsMany,pfIsContainment]);
  1282. locObj := locRes.getType(s_uri,s_type_object_C);
  1283. locRes.addProperty(locObj,'p_cd',s_uri,s_type_object_D,[pfIsContainment]);
  1284. Result := locRes;
  1285. end;
  1286. var
  1287. locFac : ISDODataFactory;
  1288. locExp : TXPathExpression;
  1289. locX : TXPathProcessor;
  1290. locRootObject, tmpAB, tmpAC, tmpAB_BC, tmpAB_BC_CD : ISDODataObject;
  1291. begin
  1292. locFac := CreateFactory();
  1293. locRootObject := locFac.createNew(s_uri,s_type_object_A);
  1294. tmpAC := locRootObject.createDataObject('p_ac');
  1295. tmpAB := locRootObject.createDataObject('p_ab');
  1296. tmpAB_BC := tmpAB.createDataObject('p_bc');
  1297. tmpAB_BC_CD := tmpAB_BC.createDataObject('p_cd');
  1298. locX := nil;
  1299. locExp := TXPathExpression.Create();
  1300. try
  1301. locX := TXPathProcessor.Create();
  1302. locX.Context.SetObject(locRootObject,nil);
  1303. locExp.SetRoot(ParseXPath('p_ab/p_bc/p_cd'));
  1304. locX.Execute(locExp);
  1305. CheckEquals(Ord(xckObject), Ord(locX.Context.ContentKind));
  1306. CheckEquals(PtrUInt(tmpAB_BC_CD), PtrUInt(locX.Context.ObjectItem));
  1307. CheckEquals(PtrUInt(tmpAB_BC.getProperty('p_cd')), PtrUInt(locX.Context.CurrentProperty));
  1308. finally
  1309. FreeAndNil(locX);
  1310. FreeAndNil(locExp);
  1311. end;
  1312. locX := nil;
  1313. locExp := TXPathExpression.Create();
  1314. try
  1315. locX := TXPathProcessor.Create();
  1316. locX.Context.SetObject(locRootObject,nil);
  1317. locExp.SetRoot(ParseXPath('p_ab/p_bc'));
  1318. locX.Execute(locExp);
  1319. CheckEquals(Ord(xckObject), Ord(locX.Context.ContentKind));
  1320. CheckEquals(PtrUInt(tmpAB_BC), PtrUInt(locX.Context.ObjectItem));
  1321. CheckEquals(PtrUInt(tmpAB.getProperty('p_bc')), PtrUInt(locX.Context.CurrentProperty));
  1322. finally
  1323. FreeAndNil(locX);
  1324. FreeAndNil(locExp);
  1325. end;
  1326. locRootObject := nil;
  1327. tmpAC := nil;
  1328. tmpAB := nil;
  1329. tmpAB_BC := nil;
  1330. tmpAB_BC_CD := nil;
  1331. locRootObject := locFac.createNew(s_uri,s_type_object_A);
  1332. tmpAC := nil;
  1333. tmpAB := locRootObject.createDataObject('p_ab');
  1334. tmpAB_BC := tmpAB.createDataObject('p_bc');
  1335. tmpAB_BC_CD := nil;
  1336. locX := nil;
  1337. locExp := TXPathExpression.Create();
  1338. try
  1339. locX := TXPathProcessor.Create();
  1340. locX.Context.SetObject(locRootObject,nil);
  1341. locExp.SetRoot(ParseXPath('p_ac'));
  1342. locX.Execute(locExp);
  1343. CheckEquals(Ord(xckNull), Ord(locX.Context.ContentKind));
  1344. CheckEquals(PtrUInt(locRootObject.getProperty('p_ac')), PtrUInt(locX.Context.CurrentProperty));
  1345. locX.Context.SetObject(locRootObject,nil);
  1346. locExp.SetRoot(ParseXPath('p_ab/p_bc'));
  1347. locX.Execute(locExp);
  1348. CheckEquals(Ord(xckObject), Ord(locX.Context.ContentKind));
  1349. CheckEquals(PtrUInt(tmpAB_BC), PtrUInt(locX.Context.ObjectItem));
  1350. CheckEquals(PtrUInt(tmpAB.getProperty('p_bc')), PtrUInt(locX.Context.CurrentProperty));
  1351. locX.Context.SetObject(locRootObject,nil);
  1352. locExp.SetRoot(ParseXPath('p_ab/p_bc/p_cd'));
  1353. locX.Execute(locExp);
  1354. CheckEquals(Ord(xckNull), Ord(locX.Context.ContentKind));
  1355. CheckEquals(PtrUInt(tmpAB_BC.getProperty('p_cd')), PtrUInt(locX.Context.CurrentProperty));
  1356. finally
  1357. FreeAndNil(locX);
  1358. FreeAndNil(locExp);
  1359. end;
  1360. end;
  1361. procedure TXPathProcessor_Test.Execute_simple_object();
  1362. function CreateFactory() : ISDODataFactory;
  1363. var
  1364. locObj : ISDOType;
  1365. locRes : ISDODataFactory;
  1366. begin
  1367. locRes := TSDODataFactory.Create() as ISDODataFactory;
  1368. locRes.AddType(s_uri,s_type_object_A,[]);
  1369. locRes.AddType(s_uri,s_type_object_B,[]);
  1370. locObj := locRes.getType(s_uri,s_type_object_A);
  1371. locRes.addProperty(locObj,s_bool_prop,sdo_namespace,SDOTypeDefaultTypeNames[BooleanType], []);
  1372. locRes.addProperty(locObj,s_bool_propList,sdo_namespace,SDOTypeDefaultTypeNames[BooleanType],[pfIsMany]);
  1373. locRes.addProperty(locObj,s_integer_prop,sdo_namespace,SDOTypeDefaultTypeNames[IntegerType], []);
  1374. locRes.addProperty(locObj,s_integer_propList,sdo_namespace,SDOTypeDefaultTypeNames[IntegerType],[pfIsMany]);
  1375. locRes.addProperty(locObj,s_string_prop,sdo_namespace,SDOTypeDefaultTypeNames[StringType], []);
  1376. locRes.addProperty(locObj,s_string_propList,sdo_namespace,SDOTypeDefaultTypeNames[StringType],[pfIsMany]);
  1377. locRes.addProperty(locObj,s_object_prop,s_uri,s_type_object_B,[pfIsContainment]);
  1378. locRes.addProperty(locObj,s_object_propList,s_uri,s_type_object_B,[pfIsMany,pfIsContainment]);
  1379. Result := locRes;
  1380. end;
  1381. var
  1382. locFac : ISDODataFactory;
  1383. locExp : TXPathExpression;
  1384. locX : TXPathProcessor;
  1385. locRootObject : ISDODataObject;
  1386. begin
  1387. locFac := CreateFactory();
  1388. locRootObject := locFac.createNew(s_uri,s_type_object_A);
  1389. locRootObject.setBoolean(s_bool_prop,False);
  1390. locRootObject.setInteger(s_integer_prop,1210);
  1391. locRootObject.setString(s_string_prop,'sdo-wst-azerty');
  1392. locRootObject.createDataObject(s_object_prop);
  1393. locX := nil;
  1394. locExp := TXPathExpression.Create();
  1395. try
  1396. locX := TXPathProcessor.Create();
  1397. locX.Context.SetObject(locRootObject,nil);
  1398. locExp.SetRoot(ParseXPath(s_object_prop));
  1399. locX.Execute(locExp);
  1400. CheckEquals(Ord(xckObject), Ord(locX.Context.ContentKind));
  1401. CheckEquals(PtrUInt(locRootObject.getDataObject(s_object_prop)), PtrUInt(locX.Context.ObjectItem));
  1402. CheckEquals(PtrUInt(locRootObject.getProperty(s_object_prop)), PtrUInt(locX.Context.CurrentProperty));
  1403. finally
  1404. FreeAndNil(locX);
  1405. FreeAndNil(locExp);
  1406. end;
  1407. end;
  1408. procedure TXPathProcessor_Test.Execute_simple_value_type;
  1409. const SIMPLE_TYPE_PROPS : array[0..2] of string = ( s_bool_prop, s_integer_prop, s_string_prop);
  1410. function CreateFactory() : ISDODataFactory;
  1411. var
  1412. locObj : ISDOType;
  1413. locRes : ISDODataFactory;
  1414. begin
  1415. locRes := TSDODataFactory.Create() as ISDODataFactory;
  1416. locRes.AddType(s_uri,s_type_object_A,[]);
  1417. locObj := locRes.getType(s_uri,s_type_object_A);
  1418. locRes.addProperty(locObj,s_bool_prop,sdo_namespace,SDOTypeDefaultTypeNames[BooleanType], []);
  1419. locRes.addProperty(locObj,s_bool_propList,sdo_namespace,SDOTypeDefaultTypeNames[BooleanType],[pfIsMany]);
  1420. locRes.addProperty(locObj,s_integer_prop,sdo_namespace,SDOTypeDefaultTypeNames[IntegerType], []);
  1421. locRes.addProperty(locObj,s_integer_propList,sdo_namespace,SDOTypeDefaultTypeNames[IntegerType],[pfIsMany]);
  1422. locRes.addProperty(locObj,s_string_prop,sdo_namespace,SDOTypeDefaultTypeNames[StringType], []);
  1423. locRes.addProperty(locObj,s_string_propList,sdo_namespace,SDOTypeDefaultTypeNames[StringType],[pfIsMany]);
  1424. Result := locRes;
  1425. end;
  1426. var
  1427. locFac : ISDODataFactory;
  1428. locExp : TXPathExpression;
  1429. locX : TXPathProcessor;
  1430. locRootObject : ISDODataObject;
  1431. i : PtrInt;
  1432. propName : string;
  1433. begin
  1434. locFac := CreateFactory();
  1435. locRootObject := locFac.createNew(s_uri,s_type_object_A);
  1436. for i := Low(SIMPLE_TYPE_PROPS) to High(SIMPLE_TYPE_PROPS) do begin
  1437. propName := SIMPLE_TYPE_PROPS[i];
  1438. locX := nil;
  1439. locExp := TXPathExpression.Create();
  1440. try
  1441. locX := TXPathProcessor.Create();
  1442. locX.Context.SetObject(locRootObject,nil);
  1443. locExp.SetRoot(ParseXPath(propName));
  1444. locX.Execute(locExp);
  1445. CheckEquals(Ord(xckValue), Ord(locX.Context.ContentKind));
  1446. CheckEquals(PtrUInt(locRootObject), PtrUInt(locX.Context.ObjectItem));
  1447. CheckEquals(PtrUInt(locRootObject.getProperty(propName)), PtrUInt(locX.Context.CurrentProperty));
  1448. finally
  1449. FreeAndNil(locX);
  1450. FreeAndNil(locExp);
  1451. end;
  1452. end;
  1453. end;
  1454. { TXPathScanner_Test }
  1455. procedure TXPathScanner_Test.composed_1();
  1456. var
  1457. locObj : TXPathScanner;
  1458. begin
  1459. locObj := TXPathScanner.Create('object/@prop_a/prop_b[2]/prop_c[prop_d="azerty"]');
  1460. try
  1461. CheckEquals(Ord(xtkSymbol), Ord(locObj.NextToken()));
  1462. CheckEquals(Ord(xtkSymbol), Ord(locObj.Token));
  1463. CheckEquals('object',locObj.TokenString);
  1464. CheckEquals(Ord(xtkSlash), Ord(locObj.NextToken()));
  1465. CheckEquals(Ord(xtkSlash), Ord(locObj.Token));
  1466. CheckEquals('/',locObj.TokenString);
  1467. CheckEquals(Ord(xtkAt), Ord(locObj.NextToken()));
  1468. CheckEquals(Ord(xtkAt), Ord(locObj.Token));
  1469. CheckEquals('@',locObj.TokenString);
  1470. CheckEquals(Ord(xtkSymbol), Ord(locObj.NextToken()));
  1471. CheckEquals(Ord(xtkSymbol), Ord(locObj.Token));
  1472. CheckEquals('prop_a',locObj.TokenString);
  1473. CheckEquals(Ord(xtkSlash), Ord(locObj.NextToken()));
  1474. CheckEquals(Ord(xtkSlash), Ord(locObj.Token));
  1475. CheckEquals('/',locObj.TokenString);
  1476. CheckEquals(Ord(xtkSymbol), Ord(locObj.NextToken()));
  1477. CheckEquals(Ord(xtkSymbol), Ord(locObj.Token));
  1478. CheckEquals('prop_b',locObj.TokenString);
  1479. CheckEquals(Ord(xtkSquaredBraceLeft), Ord(locObj.NextToken()));
  1480. CheckEquals(Ord(xtkSquaredBraceLeft), Ord(locObj.Token));
  1481. CheckEquals('[',locObj.TokenString);
  1482. CheckEquals(Ord(xtkNumber), Ord(locObj.NextToken()));
  1483. CheckEquals(Ord(xtkNumber), Ord(locObj.Token));
  1484. CheckEquals(2,locObj.TokenInt);
  1485. CheckEquals(Ord(xtkSquaredBraceRigth), Ord(locObj.NextToken()));
  1486. CheckEquals(Ord(xtkSquaredBraceRigth), Ord(locObj.Token));
  1487. CheckEquals(']',locObj.TokenString);
  1488. CheckEquals(Ord(xtkSlash), Ord(locObj.NextToken()));
  1489. CheckEquals(Ord(xtkSlash), Ord(locObj.Token));
  1490. CheckEquals('/',locObj.TokenString);
  1491. CheckEquals(Ord(xtkSymbol), Ord(locObj.NextToken()));
  1492. CheckEquals(Ord(xtkSymbol), Ord(locObj.Token));
  1493. CheckEquals('prop_c',locObj.TokenString);
  1494. CheckEquals(Ord(xtkSquaredBraceLeft), Ord(locObj.NextToken()));
  1495. CheckEquals(Ord(xtkSquaredBraceLeft), Ord(locObj.Token));
  1496. CheckEquals('[',locObj.TokenString);
  1497. CheckEquals(Ord(xtkSymbol), Ord(locObj.NextToken()));
  1498. CheckEquals(Ord(xtkSymbol), Ord(locObj.Token));
  1499. CheckEquals('prop_d',locObj.TokenString);
  1500. CheckEquals(Ord(xtkEqual), Ord(locObj.NextToken()));
  1501. CheckEquals(Ord(xtkEqual), Ord(locObj.Token));
  1502. CheckEquals('=',locObj.TokenString);
  1503. CheckEquals(Ord(xtkString), Ord(locObj.NextToken()));
  1504. CheckEquals(Ord(xtkString), Ord(locObj.Token));
  1505. CheckEquals('azerty',locObj.TokenString);
  1506. CheckEquals(Ord(xtkSquaredBraceRigth), Ord(locObj.NextToken()));
  1507. CheckEquals(Ord(xtkSquaredBraceRigth), Ord(locObj.Token));
  1508. CheckEquals(']',locObj.TokenString);
  1509. finally
  1510. FreeAndNil(locObj);
  1511. end;
  1512. end;
  1513. procedure TXPathScanner_Test.simple();
  1514. var
  1515. locObj : TXPathScanner;
  1516. begin
  1517. locObj := TXPathScanner.Create('');
  1518. try
  1519. CheckEquals(Ord(xtkEof), Ord(locObj.NextToken()));
  1520. finally
  1521. FreeAndNil(locObj);
  1522. end;
  1523. locObj := TXPathScanner.Create('null');
  1524. try
  1525. CheckEquals(Ord(xtkNull), Ord(locObj.NextToken()));
  1526. CheckEquals(Ord(xtkNull), Ord(locObj.Token));
  1527. CheckEquals('null', locObj.TokenString);
  1528. CheckEquals(Ord(xtkEof), Ord(locObj.NextToken()));
  1529. finally
  1530. FreeAndNil(locObj);
  1531. end;
  1532. locObj := TXPathScanner.Create('true');
  1533. try
  1534. CheckEquals(Ord(xtkTrue), Ord(locObj.NextToken()));
  1535. CheckEquals(Ord(xtkTrue), Ord(locObj.Token));
  1536. CheckEquals('true', locObj.TokenString);
  1537. CheckEquals(Ord(xtkEof), Ord(locObj.NextToken()));
  1538. finally
  1539. FreeAndNil(locObj);
  1540. end;
  1541. locObj := TXPathScanner.Create('false');
  1542. try
  1543. CheckEquals(Ord(xtkFalse), Ord(locObj.NextToken()));
  1544. CheckEquals(Ord(xtkFalse), Ord(locObj.Token));
  1545. CheckEquals('false', locObj.TokenString);
  1546. CheckEquals(Ord(xtkEof), Ord(locObj.NextToken()));
  1547. finally
  1548. FreeAndNil(locObj);
  1549. end;
  1550. locObj := TXPathScanner.Create('sampleProperty_123');
  1551. try
  1552. CheckEquals(Ord(xtkSymbol), Ord(locObj.NextToken()));
  1553. CheckEquals(Ord(xtkSymbol), Ord(locObj.Token));
  1554. CheckEquals('sampleProperty_123', locObj.TokenString);
  1555. CheckEquals(Ord(xtkEof), Ord(locObj.NextToken()));
  1556. finally
  1557. FreeAndNil(locObj);
  1558. end;
  1559. locObj := TXPathScanner.Create('.');
  1560. try
  1561. CheckEquals(Ord(xtkPeriod), Ord(locObj.NextToken()));
  1562. CheckEquals(Ord(xtkPeriod), Ord(locObj.Token));
  1563. CheckEquals('.', locObj.TokenString);
  1564. CheckEquals(Ord(xtkEof), Ord(locObj.NextToken()));
  1565. finally
  1566. FreeAndNil(locObj);
  1567. end;
  1568. locObj := TXPathScanner.Create('..');
  1569. try
  1570. CheckEquals(Ord(xtkDoublePeriod), Ord(locObj.NextToken()));
  1571. CheckEquals(Ord(xtkDoublePeriod), Ord(locObj.Token));
  1572. CheckEquals('..', locObj.TokenString);
  1573. CheckEquals(Ord(xtkEof), Ord(locObj.NextToken()));
  1574. finally
  1575. FreeAndNil(locObj);
  1576. end;
  1577. locObj := TXPathScanner.Create('/');
  1578. try
  1579. CheckEquals(Ord(xtkSlash), Ord(locObj.NextToken()));
  1580. CheckEquals(Ord(xtkSlash), Ord(locObj.Token));
  1581. CheckEquals('/', locObj.TokenString);
  1582. CheckEquals(Ord(xtkEof), Ord(locObj.NextToken()));
  1583. finally
  1584. FreeAndNil(locObj);
  1585. end;
  1586. locObj := TXPathScanner.Create('[');
  1587. try
  1588. CheckEquals(Ord(xtkSquaredBraceLeft), Ord(locObj.NextToken()));
  1589. CheckEquals(Ord(xtkSquaredBraceLeft), Ord(locObj.Token));
  1590. CheckEquals('[', locObj.TokenString);
  1591. CheckEquals(Ord(xtkEof), Ord(locObj.NextToken()));
  1592. finally
  1593. FreeAndNil(locObj);
  1594. end;
  1595. locObj := TXPathScanner.Create(']');
  1596. try
  1597. CheckEquals(Ord(xtkSquaredBraceRigth), Ord(locObj.NextToken()));
  1598. CheckEquals(Ord(xtkSquaredBraceRigth), Ord(locObj.Token));
  1599. CheckEquals(']', locObj.TokenString);
  1600. CheckEquals(Ord(xtkEof), Ord(locObj.NextToken()));
  1601. finally
  1602. FreeAndNil(locObj);
  1603. end;
  1604. locObj := TXPathScanner.Create('@');
  1605. try
  1606. CheckEquals(Ord(xtkAt), Ord(locObj.NextToken()));
  1607. CheckEquals(Ord(xtkAt), Ord(locObj.Token));
  1608. CheckEquals('@', locObj.TokenString);
  1609. CheckEquals(Ord(xtkEof), Ord(locObj.NextToken()));
  1610. finally
  1611. FreeAndNil(locObj);
  1612. end;
  1613. end;
  1614. procedure TXPathScanner_Test.simple_number();
  1615. var
  1616. locObj : TXPathScanner;
  1617. begin
  1618. locObj := TXPathScanner.Create('0');
  1619. try
  1620. CheckEquals(Ord(xtkNumber), Ord(locObj.NextToken()));
  1621. CheckEquals(Ord(xtkNumber), Ord(locObj.Token));
  1622. CheckEquals('0', locObj.TokenString);
  1623. CheckEquals(0, locObj.TokenInt);
  1624. CheckEquals(0.0, locObj.TokenNumber,0.01);
  1625. CheckEquals(Ord(xtkEof), Ord(locObj.NextToken()));
  1626. finally
  1627. FreeAndNil(locObj);
  1628. end;
  1629. locObj := TXPathScanner.Create('-0');
  1630. try
  1631. CheckEquals(Ord(xtkNumber), Ord(locObj.NextToken()));
  1632. CheckEquals(Ord(xtkNumber), Ord(locObj.Token));
  1633. CheckEquals('-0', locObj.TokenString);
  1634. CheckEquals(0, locObj.TokenInt);
  1635. CheckEquals(0.0, locObj.TokenNumber,0.01);
  1636. CheckEquals(Ord(xtkEof), Ord(locObj.NextToken()));
  1637. finally
  1638. FreeAndNil(locObj);
  1639. end;
  1640. locObj := TXPathScanner.Create('.0');
  1641. try
  1642. CheckEquals(Ord(xtkNumber), Ord(locObj.NextToken()));
  1643. CheckEquals(Ord(xtkNumber), Ord(locObj.Token));
  1644. CheckEquals('0.0', locObj.TokenString);
  1645. CheckEquals(0.0, locObj.TokenNumber,0.01);
  1646. CheckEquals(Ord(xtkEof), Ord(locObj.NextToken()));
  1647. finally
  1648. FreeAndNil(locObj);
  1649. end;
  1650. locObj := TXPathScanner.Create('123');
  1651. try
  1652. CheckEquals(Ord(xtkNumber), Ord(locObj.NextToken()));
  1653. CheckEquals(Ord(xtkNumber), Ord(locObj.Token));
  1654. CheckEquals('123', locObj.TokenString);
  1655. CheckEquals(123, locObj.TokenInt);
  1656. CheckEquals(123.0, locObj.TokenNumber,0.01);
  1657. CheckEquals(Ord(xtkEof), Ord(locObj.NextToken()));
  1658. finally
  1659. FreeAndNil(locObj);
  1660. end;
  1661. locObj := TXPathScanner.Create('1');
  1662. try
  1663. CheckEquals(Ord(xtkNumber), Ord(locObj.NextToken()));
  1664. CheckEquals(Ord(xtkNumber), Ord(locObj.Token));
  1665. CheckEquals('1', locObj.TokenString);
  1666. CheckEquals(1, locObj.TokenInt);
  1667. CheckEquals(1.0, locObj.TokenNumber,0.01);
  1668. CheckEquals(Ord(xtkEof), Ord(locObj.NextToken()));
  1669. finally
  1670. FreeAndNil(locObj);
  1671. end;
  1672. locObj := TXPathScanner.Create('-123');
  1673. try
  1674. CheckEquals(Ord(xtkNumber), Ord(locObj.NextToken()));
  1675. CheckEquals(Ord(xtkNumber), Ord(locObj.Token));
  1676. CheckEquals('-123', locObj.TokenString);
  1677. CheckEquals(-123, locObj.TokenInt);
  1678. CheckEquals(-123.0, locObj.TokenNumber,0.01);
  1679. CheckEquals(Ord(xtkEof), Ord(locObj.NextToken()));
  1680. finally
  1681. FreeAndNil(locObj);
  1682. end;
  1683. locObj := TXPathScanner.Create('-1');
  1684. try
  1685. CheckEquals(Ord(xtkNumber), Ord(locObj.NextToken()));
  1686. CheckEquals(Ord(xtkNumber), Ord(locObj.Token));
  1687. CheckEquals('-1', locObj.TokenString);
  1688. CheckEquals(-1, locObj.TokenInt);
  1689. CheckEquals(-1.0, locObj.TokenNumber,0.01);
  1690. CheckEquals(Ord(xtkEof), Ord(locObj.NextToken()));
  1691. finally
  1692. FreeAndNil(locObj);
  1693. end;
  1694. end;
  1695. { TXPathParser_Test }
  1696. procedure TXPathParser_Test.parse_1();
  1697. var
  1698. locObj : TXPathParser;
  1699. locRootNode, locNode : TXPathNode;
  1700. begin
  1701. locRootNode := nil;
  1702. locObj := TXPathParser.Create('object');
  1703. try
  1704. locRootNode := locObj.Parse();
  1705. CheckNotNull(locRootNode, 'root');
  1706. locNode := locRootNode;
  1707. CheckIs(locNode, TXPathContextStepNode);
  1708. CheckEquals(Ord(xcsProperty), Ord(TXPathContextStepNode(locNode).Switch));
  1709. CheckEquals('object', TXPathContextStepNode(locNode).PropertyName);
  1710. CheckNull(locNode.Next);
  1711. finally
  1712. FreeAndNil(locRootNode);
  1713. FreeAndNil(locObj);
  1714. end;
  1715. end;
  1716. procedure TXPathParser_Test.parse_10();
  1717. var
  1718. locObj : TXPathParser;
  1719. locRootNode, locNode, tmpNode : TXPathNode;
  1720. begin
  1721. locRootNode := nil;
  1722. //locObj := TXPathParser.Create('object/prop_a/prop_b[2]/prop_c[prop_d="azerty"]');
  1723. locObj := TXPathParser.Create('prop_b[2]/prop_c[prop_d="azerty"]');
  1724. try
  1725. locRootNode := locObj.Parse();
  1726. CheckNotNull(locRootNode, 'root');
  1727. locNode := locRootNode;
  1728. CheckNotNull(locNode);
  1729. CheckIs(locNode, TXPathContextStepNode);
  1730. CheckEquals(Ord(xcsProperty), Ord(TXPathContextStepNode(locNode).Switch));
  1731. CheckEquals('prop_b', TXPathContextStepNode(locNode).PropertyName);
  1732. locNode := locNode.Next;
  1733. CheckNotNull(locNode);
  1734. CheckIs(locNode, TXPathMoveInstructionStepNode);
  1735. tmpNode := TXPathMoveInstructionStepNode(locNode).Distance;
  1736. CheckIs(tmpNode,TXPathNumberConstantNode);
  1737. CheckEquals(2, TXPathNumberConstantNode(tmpNode).Value, 0.01);
  1738. locNode := locNode.Next;
  1739. CheckNotNull(locNode);
  1740. CheckIs(locNode, TXPathContextStepNode);
  1741. CheckEquals(Ord(xcsProperty), Ord(TXPathContextStepNode(locNode).Switch));
  1742. CheckEquals('prop_c', TXPathContextStepNode(locNode).PropertyName);
  1743. locNode := locNode.Next;
  1744. CheckNotNull(locNode);
  1745. CheckIs(locNode, TXPathLocateInstructionStepNode);
  1746. locNode := TXPathLocateInstructionStepNode(locNode).Condition;
  1747. tmpNode := TXPathEqualNode(locNode).Left;
  1748. CheckIs(tmpNode, TXPathValueSymbolNode);
  1749. CheckEquals('prop_d', TXPathValueSymbolNode(tmpNode).Symbol);
  1750. tmpNode := TXPathEqualNode(locNode).Right;
  1751. CheckIs(tmpNode, TXPathStringConstantNode);
  1752. CheckEquals('azerty', TXPathStringConstantNode(tmpNode).Value);
  1753. finally
  1754. FreeAndNil(locRootNode);
  1755. FreeAndNil(locObj);
  1756. end;
  1757. end;
  1758. procedure TXPathParser_Test.parse_2();
  1759. var
  1760. locObj : TXPathParser;
  1761. locRootNode, locNode : TXPathNode;
  1762. begin
  1763. locRootNode := nil;
  1764. locObj := TXPathParser.Create('/object');
  1765. try
  1766. locRootNode := locObj.Parse();
  1767. CheckNotNull(locRootNode, 'root');
  1768. locNode := locRootNode;
  1769. CheckIs(locNode, TXPathContextStepNode);
  1770. CheckEquals(Ord(xcsRoot), Ord(TXPathContextStepNode(locNode).Switch));
  1771. CheckEquals('', TXPathContextStepNode(locNode).PropertyName);
  1772. CheckNotNull(locNode.Next);
  1773. locNode := locNode.Next;
  1774. CheckEquals(Ord(xcsProperty), Ord(TXPathContextStepNode(locNode).Switch));
  1775. CheckEquals('object', TXPathContextStepNode(locNode).PropertyName);
  1776. CheckNull(locNode.Next);
  1777. finally
  1778. FreeAndNil(locRootNode);
  1779. FreeAndNil(locObj);
  1780. end;
  1781. end;
  1782. procedure TXPathParser_Test.parse_3();
  1783. var
  1784. locObj : TXPathParser;
  1785. locRootNode, locNode : TXPathNode;
  1786. begin
  1787. locRootNode := nil;
  1788. locObj := TXPathParser.Create('object/prop_a');
  1789. try
  1790. locRootNode := locObj.Parse();
  1791. CheckNotNull(locRootNode, 'root');
  1792. locNode := locRootNode;
  1793. CheckIs(locNode, TXPathContextStepNode);
  1794. CheckEquals(Ord(xcsProperty), Ord(TXPathContextStepNode(locNode).Switch));
  1795. CheckEquals('object', TXPathContextStepNode(locNode).PropertyName);
  1796. locNode := locNode.Next;
  1797. CheckNotNull(locNode);
  1798. CheckIs(locNode, TXPathContextStepNode);
  1799. CheckEquals(Ord(xcsProperty), Ord(TXPathContextStepNode(locNode).Switch));
  1800. CheckEquals('prop_a', TXPathContextStepNode(locNode).PropertyName);
  1801. CheckNull(locNode.Next);
  1802. finally
  1803. FreeAndNil(locRootNode);
  1804. FreeAndNil(locObj);
  1805. end;
  1806. end;
  1807. procedure TXPathParser_Test.parse_4();
  1808. var
  1809. locObj : TXPathParser;
  1810. locRootNode, locNode : TXPathNode;
  1811. begin
  1812. locRootNode := nil;
  1813. locObj := TXPathParser.Create('/');
  1814. try
  1815. locRootNode := locObj.Parse();
  1816. CheckNotNull(locRootNode, 'root');
  1817. locNode := locRootNode;
  1818. CheckIs(locNode, TXPathContextStepNode);
  1819. CheckEquals(Ord(xcsRoot), Ord(TXPathContextStepNode(locNode).Switch));
  1820. CheckEquals('', TXPathContextStepNode(locNode).PropertyName);
  1821. CheckNull(locNode.Next);
  1822. finally
  1823. FreeAndNil(locRootNode);
  1824. FreeAndNil(locObj);
  1825. end;
  1826. end;
  1827. procedure TXPathParser_Test.parse_5();
  1828. var
  1829. locObj : TXPathParser;
  1830. locRootNode, locNode : TXPathNode;
  1831. begin
  1832. locRootNode := nil;
  1833. locObj := TXPathParser.Create('object/prop_a/');
  1834. try
  1835. locRootNode := locObj.Parse();
  1836. CheckNotNull(locRootNode, 'root');
  1837. locNode := locRootNode;
  1838. CheckIs(locNode, TXPathContextStepNode);
  1839. CheckEquals(Ord(xcsProperty), Ord(TXPathContextStepNode(locNode).Switch));
  1840. CheckEquals('object', TXPathContextStepNode(locNode).PropertyName);
  1841. locNode := locNode.Next;
  1842. CheckNotNull(locNode);
  1843. CheckIs(locNode, TXPathContextStepNode);
  1844. CheckEquals(Ord(xcsProperty), Ord(TXPathContextStepNode(locNode).Switch));
  1845. CheckEquals('prop_a', TXPathContextStepNode(locNode).PropertyName);
  1846. CheckNull(locNode.Next);
  1847. finally
  1848. FreeAndNil(locRootNode);
  1849. FreeAndNil(locObj);
  1850. end;
  1851. end;
  1852. procedure TXPathParser_Test.parse_6();
  1853. var
  1854. locObj : TXPathParser;
  1855. locRootNode, locNode, tmpNode : TXPathNode;
  1856. begin
  1857. locRootNode := nil;
  1858. locObj := TXPathParser.Create('object/prop_a/prop_b[2]');
  1859. try
  1860. locRootNode := locObj.Parse();
  1861. CheckNotNull(locRootNode, 'root');
  1862. locNode := locRootNode;
  1863. CheckIs(locNode, TXPathContextStepNode);
  1864. CheckEquals(Ord(xcsProperty), Ord(TXPathContextStepNode(locNode).Switch));
  1865. CheckEquals('object', TXPathContextStepNode(locNode).PropertyName);
  1866. locNode := locNode.Next;
  1867. CheckNotNull(locNode);
  1868. CheckIs(locNode, TXPathContextStepNode);
  1869. CheckEquals(Ord(xcsProperty), Ord(TXPathContextStepNode(locNode).Switch));
  1870. CheckEquals('prop_a', TXPathContextStepNode(locNode).PropertyName);
  1871. locNode := locNode.Next;
  1872. CheckNotNull(locNode);
  1873. CheckIs(locNode, TXPathContextStepNode);
  1874. CheckEquals(Ord(xcsProperty), Ord(TXPathContextStepNode(locNode).Switch));
  1875. CheckEquals('prop_b', TXPathContextStepNode(locNode).PropertyName);
  1876. locNode := locNode.Next;
  1877. CheckNotNull(locNode);
  1878. CheckIs(locNode, TXPathMoveInstructionStepNode);
  1879. tmpNode := TXPathMoveInstructionStepNode(locNode).Distance;
  1880. CheckIs(tmpNode,TXPathNumberConstantNode);
  1881. CheckEquals(2, TXPathNumberConstantNode(tmpNode).Value, 0.01);
  1882. CheckNull(locNode.Next);
  1883. finally
  1884. FreeAndNil(locRootNode);
  1885. FreeAndNil(locObj);
  1886. end;
  1887. end;
  1888. procedure TXPathParser_Test.parse_7();
  1889. var
  1890. locObj : TXPathParser;
  1891. locRootNode, locNode : TXPathNode;
  1892. begin
  1893. locRootNode := nil;
  1894. locObj := TXPathParser.Create('@object');
  1895. try
  1896. locRootNode := locObj.Parse();
  1897. CheckNotNull(locRootNode, 'root');
  1898. locNode := locRootNode;
  1899. CheckIs(locNode, TXPathContextStepNode);
  1900. CheckEquals(Ord(xcsProperty), Ord(TXPathContextStepNode(locNode).Switch));
  1901. CheckEquals('object', TXPathContextStepNode(locNode).PropertyName);
  1902. CheckNull(locNode.Next);
  1903. finally
  1904. FreeAndNil(locRootNode);
  1905. FreeAndNil(locObj);
  1906. end;
  1907. end;
  1908. procedure TXPathParser_Test.parse_8();
  1909. var
  1910. locObj : TXPathParser;
  1911. locRootNode, locNode : TXPathNode;
  1912. begin
  1913. locRootNode := nil;
  1914. locObj := TXPathParser.Create('/@object');
  1915. try
  1916. locRootNode := locObj.Parse();
  1917. CheckNotNull(locRootNode, 'root');
  1918. locNode := locRootNode;
  1919. CheckIs(locNode, TXPathContextStepNode);
  1920. CheckEquals(Ord(xcsRoot), Ord(TXPathContextStepNode(locNode).Switch));
  1921. CheckEquals('', TXPathContextStepNode(locNode).PropertyName);
  1922. CheckNotNull(locNode.Next);
  1923. locNode := locNode.Next;
  1924. CheckEquals(Ord(xcsProperty), Ord(TXPathContextStepNode(locNode).Switch));
  1925. CheckEquals('object', TXPathContextStepNode(locNode).PropertyName);
  1926. CheckNull(locNode.Next);
  1927. finally
  1928. FreeAndNil(locRootNode);
  1929. FreeAndNil(locObj);
  1930. end;
  1931. end;
  1932. procedure TXPathParser_Test.parse_9();
  1933. var
  1934. locObj : TXPathParser;
  1935. locRootNode, locNode : TXPathNode;
  1936. begin
  1937. locRootNode := nil;
  1938. locObj := TXPathParser.Create('object/@prop_a');
  1939. try
  1940. locRootNode := locObj.Parse();
  1941. CheckNotNull(locRootNode, 'root');
  1942. locNode := locRootNode;
  1943. CheckIs(locNode, TXPathContextStepNode);
  1944. CheckEquals(Ord(xcsProperty), Ord(TXPathContextStepNode(locNode).Switch));
  1945. CheckEquals('object', TXPathContextStepNode(locNode).PropertyName);
  1946. locNode := locNode.Next;
  1947. CheckNotNull(locNode);
  1948. CheckIs(locNode, TXPathContextStepNode);
  1949. CheckEquals(Ord(xcsProperty), Ord(TXPathContextStepNode(locNode).Switch));
  1950. CheckEquals('prop_a', TXPathContextStepNode(locNode).PropertyName);
  1951. CheckNull(locNode.Next);
  1952. finally
  1953. FreeAndNil(locRootNode);
  1954. FreeAndNil(locObj);
  1955. end;
  1956. end;
  1957. { TXPathUtilsFunc_Test }
  1958. procedure TXPathUtilsFunc_Test.getXpath_func();
  1959. var
  1960. locFactory : ISDODataFactory;
  1961. procedure Add_Objects(const AUri : string);
  1962. var
  1963. locObj : ISDOType;
  1964. begin
  1965. locFactory.AddType(AUri,s_type_object_C,[]);
  1966. locObj := locFactory.getType(AUri,s_type_object_C);
  1967. locFactory.AddType(AUri,s_type_object_B,[]);
  1968. locObj := locFactory.getType(AUri,s_type_object_B);
  1969. locFactory.addProperty(locObj,'p_bc',s_uri,s_type_object_C,[pfIsContainment]);
  1970. locFactory.addProperty(locObj,'p_bc_multi',s_uri,s_type_object_C,[pfIsContainment,pfIsMany]);
  1971. locFactory.AddType(AUri,s_type_object_A,[]);
  1972. locObj := locFactory.getType(AUri,s_type_object_A);
  1973. locFactory.addProperty(locObj,'p_ab',s_uri,s_type_object_B,[pfIsContainment]);
  1974. locFactory.addProperty(locObj,'p_ac',s_uri,s_type_object_C,[pfIsContainment]);
  1975. end;
  1976. var
  1977. a , b, c0, c1, c2 : ISDODataObject;
  1978. begin
  1979. locFactory := TSDODataFactory.Create() as ISDODataFactory;
  1980. Add_Objects(s_uri);
  1981. a := locFactory.createNew(s_uri,s_type_object_A);
  1982. b := a.createDataObject('p_ab');
  1983. b.createDataObject('p_bc');
  1984. a.createDataObject('p_ac');
  1985. c0 := b.createDataObject('p_bc_multi');
  1986. b.getList('p_bc_multi').append(c0);
  1987. c1 := b.createDataObject('p_bc_multi');
  1988. b.getList('p_bc_multi').append(c1);
  1989. c2 := b.createDataObject('p_bc_multi');
  1990. b.getList('p_bc_multi').append(c2);
  1991. CheckEquals('', getXpath(nil));
  1992. CheckEquals('',getXpath(a));
  1993. CheckEquals('p_ab',getXpath(a.getDataObject('p_ab')));
  1994. CheckEquals('p_ac',getXpath(a.getDataObject('p_ac')));
  1995. CheckEquals('p_ab/p_bc',getXpath(a.getDataObject('p_ab').getDataObject('p_bc')));
  1996. CheckEquals('p_ab/p_bc_multi[1]',getXpath(c1));
  1997. CheckEquals('p_ab/p_bc_multi[0]',getXpath(c0));
  1998. CheckEquals('p_ab/p_bc_multi[2]',getXpath(c2));
  1999. end;
  2000. initialization
  2001. RegisterTest('Helpers',TXPathScanner_Test.Suite);
  2002. RegisterTest('Helpers',TXPathParser_Test.Suite);
  2003. RegisterTest('Helpers',TXPathProcessor_Test.Suite);
  2004. RegisterTest('Helpers',TXPathUtilsFunc_Test.Suite);
  2005. end.