1 {$INCLUDE sdo_global.inc}
2 unit test_utils;
3 
4 interface
5 uses SysUtils
6 {$IFDEF FPC}
7   ,fpcunit, testutils, testregistry
8 {$ENDIF}
9 {$IFNDEF FPC}
10   ,TestFrameWork
11 {$ENDIF}
12   , sdo_types, sdo_linked_list ;
13 
14 type
15 
16   TDoubleLinkedList_Test = class(TTestCase)
17   published
18     procedure test_Create();
19     procedure All_1();
20     procedure All_2();
21   end;
22 
23   TLinkedListIterator_Test = class(TTestCase)
24   published
25     procedure All_1();
26     procedure All_2();
27     procedure Bookmark;
28     procedure MoveTo();
29     procedure GetPosition();
30     procedure Eof();
31   end;
32 
33   TUtilsProc_Test = class(TTestCase)
34   published
35     procedure IsStrEmpty_test();
36     procedure GetNextToken_test();
37     procedure ExtractLocalName_test();
38     procedure IsValidName_test();
39     procedure CopySimpleList_integer_test();
40   end;
41 
42 implementation
43 uses
44   Contnrs, sdo_imp_utils, sdo, sdo_datafactory, sdo_dataobject,
45   Math, test_suite_utils;
46 
47 
48 const
49   SIZE_A : PtrInt = 1;
50   SIZE_B : PtrInt = 123;
51   VAL_A = 12;
52   VAL_B = -34;
53 
54 { TDoubleLinkedList_Test }
55 
56 procedure TDoubleLinkedList_Test.All_1();
57 var
58   ll : TDoubleLinkedList;
59   p0, p01 : PLinkedNode;
60   p0_val, p1_val : PPtrInt;
61 begin
62   ll := TDoubleLinkedList.Create(SizeOf(PtrInt));
63   try
64     CheckEquals(True,ll.IsEmpty(),'IsEmpty()');
65     CheckEquals(Integer(0),ll.GetLength(),'GetLength()');
66     p0 := ll.InsertFirst();
67     Check(Assigned(p0),'InsertFirst()');
68     Check(p0 = ll.GetFirst(),'GetFirst()');
69     Check(p0 = ll.GetLast(),'GetLast()');
70     Check(nil=p0^.Previous,'p0^.Previous = nil');
71     Check(nil=p0^.Next,'p0^.Next = nil');
72     CheckEquals(1,ll.GetLength(),'GetLength()');
73     CheckEquals(False,ll.IsEmpty(),'IsEmpty()');
74 
75     p0_val := PPtrInt(@(p0^.Data[0]));
76     CheckEquals(PtrInt(0),p0_val^);
77 
78     p0_val^ := VAL_A;
79     CheckEquals(PtrInt(VAL_A),p0_val^);
80 
81     p01 := ll.InsertFirst();
82     Check(Assigned(p01),'InsertFirst()');
83     Check(p01 = ll.GetFirst(),'GetFirst()');
84     Check(p0 = ll.GetLast());
85     Check(p01^.Previous=nil,'p1^.Previous=nil');
86     Check(p01^.Next=p0,'p1^.Next=p0');
87     Check(p01=p0^.Previous,'p1=p0^.Previous');
88     Check(p0^.Next=nil,'p0^.Next = nil');
89     Check(p0 <> p01,'p0 <> p1');
90     CheckEquals(2,ll.GetLength(),'GetLength()');
91     CheckEquals(PtrInt(VAL_A),p0_val^);
92     p1_val := PPtrInt(@(p01^.Data[0]));
93     CheckEquals(PtrInt(0),p1_val^);
94 
95 
96     ll.Remove(p01);
97     Check(ll.GetFirst() = p0);
98     Check(p0 = ll.GetFirst(),'GetFirst()');
99     Check(p0 = ll.GetLast(),'GetLast()');
100     Check(nil=p0^.Previous,'p0^.Previous = nil');
101     Check(nil=p0^.Next,'p0^.Next = nil');
102     CheckEquals(1,ll.GetLength(),'GetLength()');
103     CheckEquals(False,ll.IsEmpty(),'IsEmpty()');
104     ll.FreeBuffer(p01);
105 
106     p01 := ll.InsertBefore(p0);
107     Check(Assigned(p01),'InsertFirst()');
108     Check(p01 = ll.GetFirst(),'GetFirst()');
109     Check(p0 = ll.GetLast());
110     Check(p01^.Previous=nil,'p1^.Previous=nil');
111     Check(p01^.Next=p0,'p1^.Next=p0');
112     Check(p01=p0^.Previous,'p1=p0^.Previous');
113     Check(p0^.Next=nil,'p0^.Next = nil');
114     Check(p0 <> p01,'p0 <> p1');
115     CheckEquals(2,ll.GetLength(),'GetLength()');
116     CheckEquals(PtrInt(VAL_A),p0_val^);
117     p1_val := PPtrInt(@(p01^.Data[0]));
118     CheckEquals(PtrInt(0),p1_val^);
119 
120     ll.Delete(p0);
121     ll.Delete(p01);
122     CheckEquals(True,ll.IsEmpty(),'IsEmpty()');
123     CheckEquals(Integer(0),ll.GetLength(),'GetLength()');
124   finally
125     FreeAndNil(ll);
126   end;
127 end;
128 
129 procedure TDoubleLinkedList_Test.All_2();
130 var
131   ll : TDoubleLinkedList;
132   p0, p1, p2 : PLinkedNode;
133 begin
134   ll := TDoubleLinkedList.Create(SizeOf(PtrInt));
135   try
136     p1 := ll.InsertFirst();
137     p0 := ll.InsertBefore(p1);
138     p2 := ll.InsertAfter(p1);
139 
140     CheckEquals(False,ll.IsEmpty());
141     CheckEquals(3,ll.GetLength());
142     Check(p0 = ll.GetFirst());
143     Check(p2 = ll.GetLast());
144 
145     Check(p0^.Previous = nil);
146     Check(p0^.Next = p1);
147 
148     Check(p1^.Previous = p0);
149     Check(p1^.Next = p2);
150 
151     Check(p2^.Previous = p1);
152     Check(p2^.Next = nil);
153 
154     ll.Delete(p1);
155       CheckEquals(2,ll.GetLength());
156       Check(p0^.Previous = nil);
157       Check(p0^.Next = p2);
158       Check(p2^.Previous = p0);
159       Check(p2^.Next = nil);
160 
161       ll.Delete(p2);
162         CheckEquals(1,ll.GetLength());
163         Check(p0^.Previous = nil);
164         Check(p0^.Next = nil);
165 
166         ll.Delete(p0);
167         CheckEquals(True,ll.IsEmpty());
168         CheckEquals(0,ll.GetLength());
169   finally
170     FreeAndNil(ll);
171   end;
172 end;
173 
174 procedure TDoubleLinkedList_Test.test_Create();
175 var
176   ok : Boolean;
177   ll : TDoubleLinkedList;
178 begin
179   ok := False;
180   try
181     TDoubleLinkedList.Create(-1);
182   except
183     on e : EListException do begin
184       ok := True;
185     end;
186   end;
187   Check(ok,'Create(-1);');
188 
189   ll := TDoubleLinkedList.Create(SIZE_A);
190   try
191     CheckEquals(SIZE_A,ll.DataSize);
192   finally
193     FreeAndNil(ll);
194   end;
195   ll := TDoubleLinkedList.Create(SIZE_B);
196   try
197     CheckEquals(SIZE_B,ll.DataSize);
198   finally
199     FreeAndNil(ll);
200   end;
201 end;
202 
203 { TLinkedListIterator_Test }
204 
205 procedure TLinkedListIterator_Test.All_2();
206 var
207   ll : TDoubleLinkedList;
208   c : ILinkedListCursor;
209   p0, p1, p2 : PLinkedNode;
210 begin
211   ll := TDoubleLinkedList.Create(SIZE_A);
212   try
213     c := CreateIterator(ll);
214     CheckEquals(False,c.IsPosValid());
215     c.Reset();
216     CheckEquals(False,c.IsPosValid());
217     CheckEquals(False,c.MoveNext());
218     CheckEquals(False,c.IsPosValid());
219     CheckEquals(False,c.MovePrevious());
220     CheckEquals(False,c.IsPosValid());
221     CheckEquals(False,c.MoveFirst());
222     CheckEquals(False,c.IsPosValid());
223     CheckEquals(False,c.MoveLast());
224     CheckEquals(False,c.IsPosValid());
225     Check(nil = c.GetCurrent());
226 
227     ll.Clear();
228     p0 := ll.InsertFirst();
229       CheckEquals(False,c.IsPosValid());
230       c.Reset();
231       CheckEquals(True,c.MoveNext());
232         CheckEquals(True,c.IsPosValid());
233       CheckEquals(False,c.MoveNext());
234         CheckEquals(True,c.IsPosValid());
235       CheckEquals(False,c.MoveNext());
236         CheckEquals(True,c.IsPosValid());
237       CheckEquals(False,c.MovePrevious());
238         CheckEquals(True,c.IsPosValid());
239       CheckEquals(False,c.MovePrevious());
240         CheckEquals(True,c.IsPosValid());
241       Check(p0 = c.GetCurrent());
242 
243       CheckEquals(True,c.MoveFirst());
244       Check(p0 = c.GetCurrent());
245         CheckEquals(True,c.IsPosValid());
246       CheckEquals(True,c.MoveLast());
247       Check(p0 = c.GetCurrent());
248         CheckEquals(True,c.IsPosValid());
249 
250     ll.Clear();
251     p0 := ll.InsertFirst();
252     p1 := ll.InsertAfter(p0);
253       c.Reset();
254       CheckEquals(False,c.IsPosValid());
255       CheckEquals(True,c.MoveNext());
256         Check(p0 = c.GetCurrent());
257         CheckEquals(True,c.IsPosValid());
258       CheckEquals(True,c.MoveNext());
259         Check(p1 = c.GetCurrent());
260         CheckEquals(True,c.IsPosValid());
261       CheckEquals(False,c.MoveNext());
262         Check(p1 = c.GetCurrent());
263       CheckEquals(True,c.MovePrevious());
264         Check(p0 = c.GetCurrent());
265       CheckEquals(False,c.MovePrevious());
266         Check(p0 = c.GetCurrent());
267       Check(p0 = c.GetCurrent());
268 
269       CheckEquals(True,c.MoveFirst());
270       Check(p0 = c.GetCurrent());
271       CheckEquals(True,c.MoveLast());
272       Check(p1 = c.GetCurrent());
273 
274     ll.Clear();
275     CheckEquals(False,c.IsPosValid());
276     p0 := ll.InsertFirst();
277     p1 := ll.InsertAfter(p0);
278     p2 := ll.InsertAfter(p1);
279       c.Reset();
280       CheckEquals(True,c.MoveNext());
281       CheckEquals(False,c.MovePrevious());
282       Check(p0 = c.GetCurrent());
283 
284       CheckEquals(True,c.MoveNext());
285       Check(p1 = c.GetCurrent());
286       CheckEquals(True,c.MovePrevious());
287       Check(p0 = c.GetCurrent());
288       CheckEquals(True,c.MoveNext());
289       Check(p1 = c.GetCurrent());
290       CheckEquals(True,c.MoveNext());
291       Check(p2 = c.GetCurrent());
292       CheckEquals(False,c.MoveNext());
293       Check(p2 = c.GetCurrent());
294 
295       CheckEquals(True,c.MovePrevious()); // p2 > p1
296       CheckEquals(True,c.MovePrevious()); // p1 > p0
297       CheckEquals(False,c.MovePrevious()); // p0 = p0
298 
299       CheckEquals(True,c.MoveFirst());
300       Check(p0 = c.GetCurrent());
301       CheckEquals(True,c.MoveLast());
302       Check(p2 = c.GetCurrent());
303 
304     ll.Clear();
305     c.Reset();
306     CheckEquals(False,c.MoveNext());
307     CheckEquals(False,c.MovePrevious());
308     Check(nil = c.GetCurrent());
309   finally
310     ll.Free();
311   end;
312 end;
313 
314 procedure TLinkedListIterator_Test.All_1();
315 var
316   lls : TObjectList;
317   ll : TDoubleLinkedList;
318   c : ILinkedListCursor;
319   p0, p1, p2 : PLinkedNode;
320 begin
321   lls := TObjectList.Create(True);
322   try
323     ll := TDoubleLinkedList.Create(SIZE_A);
324     lls.Add(ll);
325     c := CreateIterator(ll);
326     CheckEquals(True,c.Bof());
327     CheckEquals(True,c.Eof());
328     CheckEquals(False,c.MoveFirst());
329     CheckEquals(False,c.MoveLast());
330     c.Reset();
331     CheckEquals(True,c.Bof());
332     CheckEquals(True,c.Eof());
333     CheckEquals(False,c.MoveFirst());
334     CheckEquals(False,c.MoveLast());
335 
336     ll := TDoubleLinkedList.Create(SIZE_A);
337     lls.Add(ll);
338     c := CreateIterator(ll);
339     p0 := ll.InsertFirst();
340       CheckEquals(False,c.Bof());
341       CheckEquals(False,c.Eof());
342       c.Reset();
343       CheckEquals(False,c.Bof());
344       CheckEquals(False,c.Eof());
345 
346       CheckEquals(True,c.MoveNext());
347       CheckEquals(True,c.Bof());
348       CheckEquals(False,c.Eof());
349 
350       CheckEquals(False,c.MoveNext());
351       CheckEquals(False,c.Bof());
352       CheckEquals(True,c.Eof());
353 
354     ll := TDoubleLinkedList.Create(SIZE_A);
355     lls.Add(ll);
356     c := CreateIterator(ll);
357     p0 := ll.InsertFirst();
358     p1 := ll.InsertAfter(p0);
359       CheckEquals(False,c.Bof());
360       CheckEquals(False,c.Eof());
361       c.Reset();
362       CheckEquals(False,c.Bof());
363       CheckEquals(False,c.Eof());
364 
365       CheckEquals(True,c.MoveNext());
366       CheckEquals(True,c.Bof());
367       CheckEquals(False,c.Eof());
368 
369       CheckEquals(True,c.MoveNext());
370       CheckEquals(False,c.Bof());
371       CheckEquals(False,c.Eof());
372 
373       CheckEquals(True,c.MoveFirst());
374       Check(c.GetCurrent() = ll.GetFirst());
375       CheckEquals(True,c.Bof());
376       CheckEquals(False,c.Eof());
377 
378       CheckEquals(True,c.MoveLast());
379       Check(c.GetCurrent() = ll.GetLast());
380       CheckEquals(False,c.Bof());
381       CheckEquals(True,c.Eof());
382 
383     ll := TDoubleLinkedList.Create(SIZE_A);
384     lls.Add(ll);
385     c := CreateIterator(ll);
386     CheckEquals(False,c.IsPosValid());
387     p0 := ll.InsertFirst();
388     p1 := ll.InsertAfter(p0);
389     p2 := ll.InsertAfter(p1);
390       CheckEquals(False,c.Bof());
391       CheckEquals(False,c.Eof());
392       c.Reset();
393       CheckEquals(False,c.Bof());
394       CheckEquals(False,c.Eof());
395 
396       CheckEquals(True,c.MoveNext());
397       CheckEquals(True,c.Bof());
398       CheckEquals(False,c.Eof());
399 
400       CheckEquals(True,c.MoveNext());
401       CheckEquals(False,c.Bof());
402       CheckEquals(False,c.Eof());
403 
404       CheckEquals(True,c.MoveNext());
405       CheckEquals(False,c.Bof());
406       CheckEquals(False,c.Eof());
407 
408       CheckEquals(True,c.MoveFirst());
409       Check(c.GetCurrent() = ll.GetFirst());
410       CheckEquals(True,c.Bof());
411       CheckEquals(False,c.Eof());
412 
413       CheckEquals(True,c.MoveLast());
414       Check(c.GetCurrent() = ll.GetLast());
415       CheckEquals(False,c.Bof());
416       CheckEquals(True,c.Eof());
417   finally
418     lls.Free();
419   end;
420 end;
421 
422 procedure TLinkedListIterator_Test.Bookmark();
423 var
424   ll : TDoubleLinkedList;
425   c : ILinkedListCursor;
426   bmk : TLinkedListBookmark;
427   oldPos : PtrInt;
428   p : PLinkedNode;
429 begin
430   ll := TDoubleLinkedList.Create(SizeOf(Integer));
431   try
432     c := CreateIterator(ll);
433     p := c.GetCurrent();
434     bmk := c.GetBookmark(); oldPos := c.GetPosition();
435     CheckEquals(True,c.GotoBookmark(bmk));
436     CheckEquals(True,c.GotoBookmark(bmk));
437     CheckEquals(PtrInt(p),PtrInt(c.GetCurrent()));
438     CheckEquals(oldPos,c.GetPosition());
439 
440     ll.Append();
441     ll.Append();
442     ll.Append();
443     ll.Append();
444     ll.Append();
445 
446     c.MoveFirst();
447     p := c.GetCurrent();
448     bmk := c.GetBookmark(); oldPos := c.GetPosition();
449     c.MoveNext();
450     c.MoveNext();
451     CheckEquals(True,c.GotoBookmark(bmk));
452     CheckEquals(PtrInt(p),PtrInt(c.GetCurrent()));
453     CheckEquals(oldPos,c.GetPosition());
454 
455     c.MoveFirst();
456     c.MoveNext();
457     c.MoveNext();
458     p := c.GetCurrent();
459     bmk := c.GetBookmark(); oldPos := c.GetPosition();
460     c.MoveLast();
461     CheckEquals(True,c.GotoBookmark(bmk));
462     CheckEquals(PtrInt(p),PtrInt(c.GetCurrent()));
463     CheckEquals(oldPos,c.GetPosition());
464 
465     c.MoveLast();
466     p := c.GetCurrent();
467     bmk := c.GetBookmark(); oldPos := c.GetPosition();
468     c.MoveFirst();
469     CheckEquals(True,c.GotoBookmark(bmk));
470     CheckEquals(PtrInt(p),PtrInt(c.GetCurrent()));
471     CheckEquals(oldPos,c.GetPosition());
472   finally
473     ll.Free();
474   end;
475 end;
476 
477 procedure TLinkedListIterator_Test.MoveTo();
478 var
479   ll : TDoubleLinkedList;
480   c : ILinkedListCursor;
481   i : PtrInt;
482 begin
483   ll := TDoubleLinkedList.Create(SizeOf(PtrInt));
484   try
485     c := CreateIterator(ll);
486     CheckEquals(False, c.MoveTo(0));
487     CheckEquals(False, c.MoveTo(-1));
488     CheckEquals(False, c.MoveTo(1));
489 
490     PPtrInt(@((ll.Append()^.Data[0])))^ := 0;
491     PPtrInt(@((ll.Append()^.Data[0])))^ := 1;
492     PPtrInt(@((ll.Append()^.Data[0])))^ := 2;
493     PPtrInt(@((ll.Append()^.Data[0])))^ := 3;
494 
495     c.MoveFirst();
496       CheckEquals(0,PPtrInt(@((c.GetCurrent()^.Data[0])))^);
497     for i := 0 to 3 do begin
498       CheckEquals(True, c.MoveTo(i));
499       CheckEquals(i,PPtrInt(@((c.GetCurrent()^.Data[0])))^);
500 
501       CheckEquals(True, c.MoveFirst());
502         CheckEquals(True, c.MoveTo(i));
503         CheckEquals(i,PPtrInt(@((c.GetCurrent()^.Data[0])))^);
504       CheckEquals(True, c.MoveLast());
505         CheckEquals(True, c.MoveTo(i));
506         CheckEquals(i,PPtrInt(@((c.GetCurrent()^.Data[0])))^);
507     end;
508 
509     CheckEquals(True, c.MoveTo(1));
510       CheckEquals(1,PPtrInt(@((c.GetCurrent()^.Data[0])))^);
511     c.MoveFirst();
512     CheckEquals(True, c.MoveTo(3));
513       CheckEquals(3,PPtrInt(@((c.GetCurrent()^.Data[0])))^);
514 
515     CheckEquals(True, c.MoveLast());
516     CheckEquals(True, c.MoveTo(2));
517       CheckEquals(2,PPtrInt(@((c.GetCurrent()^.Data[0])))^);
518 
519     CheckEquals(True, c.MoveTo(1));
520     CheckEquals(True, c.MoveTo(2));
521       CheckEquals(2,PPtrInt(@((c.GetCurrent()^.Data[0])))^);
522 
523   finally
524     ll.Free();
525   end;
526 end;
527 
528 procedure TLinkedListIterator_Test.GetPosition();
529 var
530   ll : TDoubleLinkedList;
531   c : ILinkedListCursor;
532   i : PtrInt;
533 begin
534   ll := TDoubleLinkedList.Create(SizeOf(PtrInt));
535   try
536     c := CreateIterator(ll);
537     CheckEquals(-1,c.GetPosition());
538     CheckEquals(False, c.MoveTo(0));
539       CheckEquals(-1,c.GetPosition());
540     CheckEquals(False, c.MoveTo(-1));
541       CheckEquals(-1,c.GetPosition());
542     CheckEquals(False, c.MoveTo(1));
543       CheckEquals(-1,c.GetPosition());
544 
545     PPtrInt(@((ll.Append()^.Data[0])))^ := 0;
546     PPtrInt(@((ll.Append()^.Data[0])))^ := 1;
547     PPtrInt(@((ll.Append()^.Data[0])))^ := 2;
548     PPtrInt(@((ll.Append()^.Data[0])))^ := 3;
549 
550     c.Reset();
551       CheckEquals(-1,c.GetPosition());
552     c.MoveFirst();
553       CheckEquals(0,c.GetPosition());
554     for i := 0 to 3 do begin
555       CheckEquals(True, c.MoveTo(i));
556       CheckEquals(i,c.GetPosition());
557     end;
558 
559     CheckEquals(True, c.MoveLast());
560       CheckEquals(Pred(ll.GetLength()),c.GetPosition());
561     c.MoveFirst();
562       CheckEquals(0,c.GetPosition());
563 
564   finally
565     ll.Free();
566   end;
567 end;
568 
569 procedure TLinkedListIterator_Test.Eof();
570 var
571   lls : TObjectList;
572   ll : TDoubleLinkedList;
573   c : ILinkedListCursor;
574   p0, p1, p2 : PLinkedNode;
575 begin
576   lls := TObjectList.Create(True);
577   try
578     ll := TDoubleLinkedList.Create(SIZE_A);
579     lls.Add(ll);
580     c := CreateIterator(ll);
581     CheckEquals(True,c.Eof());
582 
583     p0 := ll.InsertFirst();
584       c.Reset();
585       CheckEquals(False,c.Eof());
586       CheckEquals(True,c.MoveNext());
587       CheckEquals(False,c.Eof());
588       CheckEquals(False,c.MoveNext());
589       CheckEquals(True,c.Eof());
590 
591       c.Reset();
592       CheckEquals(False,c.Eof());
593       CheckEquals(True,c.MoveNext());
594       CheckEquals(False,c.Eof());
595       CheckEquals(False,c.MoveNext());
596       CheckEquals(True,c.Eof());
597 
598       c.Reset();
599       CheckEquals(False,c.Eof());
600       CheckEquals(True,c.MoveLast());
601       CheckEquals(True,c.Eof());
602 
603     ll := TDoubleLinkedList.Create(SIZE_A);
604     lls.Add(ll);
605     c := CreateIterator(ll);
606     p0 := ll.InsertFirst();
607     p1 := ll.InsertAfter(p0);
608       c.Reset();
609       CheckEquals(False,c.Eof());
610       c.Reset();
611       CheckEquals(False,c.Eof());
612       CheckEquals(True,c.MoveNext());
613       CheckEquals(False,c.Eof());
614       CheckEquals(True,c.MoveNext());
615       CheckEquals(False,c.Eof());
616       CheckEquals(False,c.MoveNext());
617       CheckEquals(True,c.Eof());
618 
619       c.Reset();
620       CheckEquals(False,c.Eof());
621       CheckEquals(True,c.MoveLast());
622       CheckEquals(True,c.Eof());
623   finally
624     lls.Free();
625   end;
626 end;
627 
628 { TUtilsProc_Test }
629 
630 procedure TUtilsProc_Test.CopySimpleList_integer_test();
631 
632   procedure check_list(const x, y : ISDODataObjectList);
633   var
634     cx, cy : ILinkedListCursor;
635   begin
636     CheckEquals(x.size(), y.size(), 'size');
637     if ( x.size() > 0 ) then begin
638       cx := x.getCursor();
639       cx.Reset();
640       cy := y.getCursor();
641       cy.Reset();
642       while cx.MoveNext() do begin
643         Check(cy.MoveNext(), 'MoveNext()');
644         CheckEquals(x.getInteger(), y.getInteger(), Format('Item #%d',[cx.GetPosition()]));
645       end;
646     end;
647   end;
648 
649 var
650   f : ISDODataFactory;
651   a, b : ISDODataObjectList;
652   t : ISDOType;
653   i, c : PtrInt;
654 begin
655   Randomize();
656   f := TSDODataFactory.Create();
657   t := f.getType(sdo_namespace,SDOTypeDefaultTypeNames[IntegerType]);
658   a := TSDODataObjectList.Create(t);
659   b := TSDODataObjectList.Create(t);
660 
661   CopySimpleList(a, b, t.getTypeEnum());
662     check_list(a, b);
663 
664   c := RandomRange(1,100);
665   for i := 0 to Pred(c) do
666     a.append(RandomRange(-1234, 56789));
667   CopySimpleList(a, b, t.getTypeEnum());
668     check_list(a, b);
669 end;
670 
671 procedure TUtilsProc_Test.ExtractLocalName_test();
672 begin
673   CheckEquals('',ExtractLocalName(''));
674   CheckEquals('a',ExtractLocalName('a'));
675   CheckEquals('azerty',ExtractLocalName('azerty'));
676   CheckEquals('azerty',ExtractLocalName('ns:azerty'));
677   CheckEquals('azerty',ExtractLocalName('n:azerty'));
678   CheckEquals('azerty',ExtractLocalName(':azerty'));
679   CheckEquals('',ExtractLocalName('azerty:'));
680 end;
681 
682 procedure TUtilsProc_Test.GetNextToken_test();
683 var
684   buffer, x : string;
685   sep : Char;
686 begin
687   sep := ';';
688   buffer := '';
689     x := GetNextToken(buffer,sep);
690     CheckEquals('', x);
691     CheckEquals('', buffer);
692 
693   sep := ';';
694   buffer := ';';
695     x := GetNextToken(buffer,sep);
696     CheckEquals('', x);
697     CheckEquals('', buffer);
698 
699   sep := ';';
700   buffer := ';;;';
701     x := GetNextToken(buffer,sep);
702     CheckEquals('', x);
703     CheckEquals('', buffer);
704 
705   sep := ';';
706   buffer := 'abc';
707     x := GetNextToken(buffer,sep);
708     CheckEquals('abc', x);
709     CheckEquals('', buffer);
710 
711   sep := ';';
712   buffer := 'ab;cd';
713     x := GetNextToken(buffer,sep);
714     CheckEquals('ab', x);
715     CheckEquals('cd', buffer);
716     x := GetNextToken(buffer,sep);
717     CheckEquals('cd', x);
718     CheckEquals('', buffer);
719 
720   sep := ';';
721   buffer := ';ab;cd';
722     x := GetNextToken(buffer,sep);
723     CheckEquals('ab', x);
724     CheckEquals('cd', buffer);
725     x := GetNextToken(buffer,sep);
726     CheckEquals('cd', x);
727     CheckEquals('', buffer);
728 
729   sep := ';';
730   buffer := ';ab;;cd';
731     x := GetNextToken(buffer,sep);
732     CheckEquals('ab', x);
733     CheckEquals(';cd', buffer);
734     x := GetNextToken(buffer,sep);
735     CheckEquals('cd', x);
736     CheckEquals('', buffer);
737 
738   sep := ';';
739   buffer := 'ab;cd;';
740     x := GetNextToken(buffer,sep);
741     CheckEquals('ab', x);
742     CheckEquals('cd;', buffer);
743     x := GetNextToken(buffer,sep);
744     CheckEquals('cd', x);
745     CheckEquals('', buffer);
746 
747   sep := ';';
748   buffer := 'ab;cd;de';
749     x := GetNextToken(buffer,sep);
750     CheckEquals('ab', x);
751     CheckEquals('cd;de', buffer);
752     x := GetNextToken(buffer,sep);
753     CheckEquals('cd', x);
754     CheckEquals('de', buffer);
755     x := GetNextToken(buffer,sep);
756     CheckEquals('de', x);
757     CheckEquals('', buffer);
758 
759 end;
760 
761 procedure TUtilsProc_Test.IsStrEmpty_test;
762 begin
763   CheckEquals(True,IsStrEmpty(''));
764   CheckEquals(True,IsStrEmpty('  '));
765 
766   CheckEquals(False,IsStrEmpty('a'));
767   CheckEquals(False,IsStrEmpty('  a'));
768   CheckEquals(False,IsStrEmpty('afghjk'));
769   CheckEquals(False,IsStrEmpty(' jhhfjjsd '));
770   CheckEquals(False,IsStrEmpty(':6789^;:,?'));
771 end;
772 
773 procedure TUtilsProc_Test.IsValidName_test();
774 begin
775   CheckEquals(True, IsValidName('_'));
776   CheckEquals(True, IsValidName('_a'));
777   CheckEquals(True, IsValidName('_1'));
778   CheckEquals(True, IsValidName('_azerty'));
779   CheckEquals(True, IsValidName('a'));
780   CheckEquals(True, IsValidName('azerty'));
781   CheckEquals(True, IsValidName('_a_z'));
782   CheckEquals(True, IsValidName('a1210'));
783 
784   CheckEquals(False, IsValidName(''));
785   CheckEquals(False, IsValidName('-'));
786   CheckEquals(False, IsValidName('-a'));
787   CheckEquals(False, IsValidName('4'));
788   CheckEquals(False, IsValidName('1s'));
789   CheckEquals(False, IsValidName('-4'));
790   CheckEquals(False, IsValidName('aad-ddd'));
791   CheckEquals(False, IsValidName('zz_-'));
792   CheckEquals(False, IsValidName('['));
793   CheckEquals(False, IsValidName(']'));
794   CheckEquals(False, IsValidName('az[]'));
795   CheckEquals(False, IsValidName('l[1]'));
796   CheckEquals(False, IsValidName('dd['));
797   CheckEquals(False, IsValidName('dd]'));
798 end;
799 
800 initialization
801   RegisterTest('utils',TDoubleLinkedList_Test.Suite);
802   RegisterTest('utils',TLinkedListIterator_Test.Suite);
803   RegisterTest('utils',TUtilsProc_Test.Suite);
804 
805 end.
806