1 {$INCLUDE sdo_global.inc}
2 unit test_convert_helper;
3 
4 interface
5 uses
6   SysUtils, Classes
7 {$IFDEF FPC}
8   ,fpcunit, testutils, testregistry
9 {$ENDIF}
10 {$IFNDEF FPC}
11   ,TestFrameWork
12 {$ENDIF}
13   , test_suite_utils, sdo, sdo_types;
14 
15 type
16 
17   TSDOConvertHelper_Test = class(TWstBaseTest)
18   protected
getObjectnull19     class function getObject() : TSDOConvertHelperClass;
20   published
21     procedure BoolToByte();
22     procedure BoolToInteger();
23     procedure BoolToLong();
24     procedure BoolToShort();
25     procedure BoolToString();
26 
27     procedure ByteToBool();
28     procedure ByteToChar();
29     procedure ByteToString();
30 
31     procedure BytesToString();
32 
33     procedure CharToBool();
34     procedure CharToByte();
35     procedure CharToInteger();
36     procedure CharToLong();
37     procedure CharToShort();
38 
39     procedure IntegerToBool();
40     procedure IntegerToChar();
41     procedure IntegerToString();
42 
43     procedure LongToBool();
44     procedure LongToChar();
45     procedure LongToString();
46 
47     procedure ShortToBool();
48     procedure ShortToChar();
49     procedure ShortToString();
50 
51     procedure StringToBool();
52     procedure StringToByte();
53     procedure StringToBytes();
54     procedure StringToDate();
55     procedure StringToInteger();
56     procedure StringToLong();
57     procedure StringToShort();
58 
59     procedure FloatToString();
60     procedure FloatToBool();
61 
62     procedure DateToString();
63   end;
64 
65 implementation
66 
67 { TSDOConvertHelper_Test }
68 
69 procedure TSDOConvertHelper_Test.BoolToByte();
70 var
71   locObj : TSDOConvertHelperClass;
72 begin
73   locObj := getObject();
74   CheckEquals(1, locObj.BoolToByte(True), 'true');
75   CheckEquals(0, locObj.BoolToByte(False), 'false');
76 end;
77 
78 procedure TSDOConvertHelper_Test.BoolToInteger();
79 var
80   locObj : TSDOConvertHelperClass;
81 begin
82   locObj := getObject();
83   CheckEquals(1, locObj.BoolToInteger(True), 'true');
84   CheckEquals(0, locObj.BoolToInteger(False), 'false');
85 end;
86 
87 procedure TSDOConvertHelper_Test.BoolToLong();
88 var
89   locObj : TSDOConvertHelperClass;
90 begin
91   locObj := getObject();
92   CheckEquals(1, locObj.BoolToLong(True), 'true');
93   CheckEquals(0, locObj.BoolToLong(False), 'false');
94 end;
95 
96 procedure TSDOConvertHelper_Test.BoolToShort();
97 var
98   locObj : TSDOConvertHelperClass;
99 begin
100   locObj := getObject();
101   CheckEquals(1, locObj.BoolToShort(True), 'true');
102   CheckEquals(0, locObj.BoolToShort(False), 'false');
103 end;
104 
105 procedure TSDOConvertHelper_Test.BoolToString();
106 var
107   locObj : TSDOConvertHelperClass;
108 begin
109   locObj := getObject();
110   CheckEquals('1', locObj.BoolToString(True), 'true');
111   CheckEquals('0', locObj.BoolToString(False), 'false');
112 end;
113 
114 procedure TSDOConvertHelper_Test.ByteToBool();
115 var
116   locObj : TSDOConvertHelperClass;
117 begin
118   locObj := getObject();
119   CheckEquals(True, locObj.ByteToBool(123));
120   CheckEquals(False, locObj.ByteToBool(0));
121   CheckEquals(True, locObj.ByteToBool(1));
122   CheckEquals(True, locObj.ByteToBool(2));
123   CheckEquals(True, locObj.ByteToBool(34));
124 end;
125 
126 procedure TSDOConvertHelper_Test.ByteToChar();
127 var
128   locObj : TSDOConvertHelperClass;
129 begin
130   locObj := getObject();
131   CheckEquals(TSDOChar(#123), locObj.ByteToChar(123));
132   CheckEquals(TSDOChar(#0), locObj.ByteToChar(0));
133   CheckEquals(TSDOChar(#1), locObj.ByteToChar(1));
134   CheckEquals(TSDOChar(#56), locObj.ByteToChar(56));
135 end;
136 
137 procedure TSDOConvertHelper_Test.ByteToString();
138 var
139   locObj : TSDOConvertHelperClass;
140 begin
141   locObj := getObject();
142   CheckEquals('123', locObj.ByteToString(123));
143   CheckEquals('0', locObj.ByteToString(0));
144   CheckEquals('1', locObj.ByteToString(1));
145   CheckEquals('56', locObj.ByteToString(56));
146 end;
147 
148 procedure TSDOConvertHelper_Test.DateToString();
149 const
150   sDATE_1 = '1976-10-12T23:34:56Z';
151   sDATE_2 = '0987-06-12T20:34:56Z';
152 var
153   d : TSDODate;
154   locObj : TSDOConvertHelperClass;
155 begin
156   locObj := getObject();
157   //'-'? yyyy '-' mm '-' dd 'T' hh ':' mm ':' ss ('.' s+)? (zzzzzz)?
158   FillChar(d,SizeOf(d),#0);
159   d.Date := EncodeDate(1976,10,12) + EncodeTime(23,34,56,0);
160   CheckEquals(sDATE_1, locObj.DateToString(d));
161 
162   FillChar(d,SizeOf(d),#0);
163   d.Date := EncodeDate(987,06,12) - EncodeTime(20,34,56,0);
164   CheckEquals(sDATE_2, locObj.DateToString(d));
165 
166   FillChar(d,SizeOf(d),#0);
167   d.Date := EncodeDate(2002,10,10) + EncodeTime(12,0,0,0);
168   d.HourOffset := 5;
169   CheckEquals('2002-10-10T07:00:00Z', locObj.DateToString(d));
170 end;
171 
172 procedure TSDOConvertHelper_Test.FloatToBool();
173 var
174   locObj : TSDOConvertHelperClass;
175 begin
176   locObj := getObject();
177   CheckEquals(True, locObj.FloatToBool(1));
178   CheckEquals(False, locObj.FloatToBool(0));
179 
180   CheckEquals(True, locObj.FloatToBool(123));
181   CheckEquals(True, locObj.FloatToBool(-43));
182   CheckEquals(True, locObj.FloatToBool(123456789));
183 end;
184 
185 procedure TSDOConvertHelper_Test.FloatToString;
186 begin
187 
188 end;
189 
TSDOConvertHelper_Test.getObjectnull190 class function TSDOConvertHelper_Test.getObject() : TSDOConvertHelperClass;
191 begin
192   Result := TSDOConvertHelper;
193 end;
194 
195 procedure TSDOConvertHelper_Test.CharToBool();
196 var
197   locObj : TSDOConvertHelperClass;
198 begin
199   locObj := getObject();
200   CheckEquals(True, locObj.CharToBool('8'));
201   CheckEquals(False, locObj.CharToBool(#0));
202   CheckEquals(True, locObj.CharToBool(#1));
203   CheckEquals(True, locObj.CharToBool('T'));
204 end;
205 
206 procedure TSDOConvertHelper_Test.CharToByte();
207 var
208   locObj : TSDOConvertHelperClass;
209 begin
210   locObj := getObject();
211   CheckEquals(Ord(TSDOChar('8')), locObj.CharToByte('8'));
212   CheckEquals(0, locObj.CharToByte(#0));
213   CheckEquals(1, locObj.CharToByte(#1));
214   CheckEquals(Ord(TSDOChar('T')), locObj.CharToByte('T'));
215 end;
216 
217 procedure TSDOConvertHelper_Test.CharToInteger();
218 var
219   locObj : TSDOConvertHelperClass;
220 begin
221   locObj := getObject();
222   CheckEquals(Ord(TSDOChar('8')), locObj.CharToInteger('8'));
223   CheckEquals(0, locObj.CharToInteger(#0));
224   CheckEquals(1, locObj.CharToInteger(#1));
225   CheckEquals(Ord(TSDOChar('T')), locObj.CharToInteger('T'));
226 end;
227 
228 procedure TSDOConvertHelper_Test.CharToLong();
229 var
230   locObj : TSDOConvertHelperClass;
231 begin
232   locObj := getObject();
233   CheckEquals(Ord(TSDOChar('8')), locObj.CharToLong('8'));
234   CheckEquals(0, locObj.CharToLong(#0));
235   CheckEquals(1, locObj.CharToLong(#1));
236   CheckEquals(Ord(TSDOChar('T')), locObj.CharToLong('T'));
237 end;
238 
239 procedure TSDOConvertHelper_Test.CharToShort();
240 var
241   locObj : TSDOConvertHelperClass;
242 begin
243   locObj := getObject();
244   CheckEquals(Ord(TSDOChar('8')), locObj.CharToShort('8'));
245   CheckEquals(0, locObj.CharToShort(#0));
246   CheckEquals(1, locObj.CharToShort(#1));
247   CheckEquals(Ord(TSDOChar('T')), locObj.CharToShort('T'));
248 end;
249 
250 procedure TSDOConvertHelper_Test.IntegerToBool();
251 var
252   locObj : TSDOConvertHelperClass;
253 begin
254   locObj := getObject();
255   CheckEquals(True, locObj.IntegerToBool(-789));
256   CheckEquals(False, locObj.IntegerToBool(0));
257   CheckEquals(True, locObj.IntegerToBool(1));
258   CheckEquals(True, locObj.IntegerToBool(-1));
259   CheckEquals(True, locObj.IntegerToBool(123));
260 end;
261 
262 procedure TSDOConvertHelper_Test.IntegerToChar();
263 var
264   locObj : TSDOConvertHelperClass;
265 begin
266   locObj := getObject();
267   CheckEquals(TSDOChar(0), locObj.IntegerToChar(0));
268   CheckEquals(TSDOChar(12), locObj.IntegerToChar(12));
269   CheckEquals(TSDOChar(123), locObj.IntegerToChar(123));
270   CheckEquals(TSDOChar(TSDOInteger(-52)), locObj.IntegerToChar(-52));
271   CheckEquals(TSDOChar(12345), locObj.IntegerToChar(12345));
272 end;
273 
274 procedure TSDOConvertHelper_Test.IntegerToString();
275 var
276   locObj : TSDOConvertHelperClass;
277 begin
278   locObj := getObject();
279   CheckEquals('-123456', locObj.IntegerToString(-123456));
280   CheckEquals('0', locObj.IntegerToString(0));
281   CheckEquals('1', locObj.IntegerToString(1));
282   CheckEquals('123456', locObj.IntegerToString(123456));
283 end;
284 
285 procedure TSDOConvertHelper_Test.LongToBool();
286 var
287   locObj : TSDOConvertHelperClass;
288 begin
289   locObj := getObject();
290   CheckEquals(True, locObj.LongToBool(-789));
291   CheckEquals(False, locObj.LongToBool(0));
292   CheckEquals(True, locObj.LongToBool(1));
293   CheckEquals(True, locObj.LongToBool(-1));
294   CheckEquals(True, locObj.LongToBool(123));
295 end;
296 
297 procedure TSDOConvertHelper_Test.LongToChar();
298 var
299   locObj : TSDOConvertHelperClass;
300 begin
301   locObj := getObject();
302   CheckEquals(TSDOChar(0), locObj.LongToChar(0));
303   CheckEquals(TSDOChar(12), locObj.LongToChar(12));
304   CheckEquals(TSDOChar(123), locObj.LongToChar(123));
305   CheckEquals(TSDOChar(TSDOLong(-52)), locObj.LongToChar(-52));
306   CheckEquals(TSDOChar(TSDOLong(123456)), locObj.LongToChar(123456));
307 end;
308 
309 procedure TSDOConvertHelper_Test.LongToString();
310 var
311   locObj : TSDOConvertHelperClass;
312 begin
313   locObj := getObject();
314   CheckEquals('-123456', locObj.LongToString(-123456));
315   CheckEquals('0', locObj.LongToString(0));
316   CheckEquals('1', locObj.LongToString(1));
317   CheckEquals('123456', locObj.LongToString(123456));
318 end;
319 
320 procedure TSDOConvertHelper_Test.ShortToBool();
321 var
322   locObj : TSDOConvertHelperClass;
323 begin
324   locObj := getObject();
325   CheckEquals(True, locObj.ShortToBool(-789));
326   CheckEquals(False, locObj.ShortToBool(0));
327   CheckEquals(True, locObj.ShortToBool(1));
328   CheckEquals(True, locObj.ShortToBool(-1));
329   CheckEquals(True, locObj.ShortToBool(123));
330 end;
331 
332 procedure TSDOConvertHelper_Test.ShortToChar();
333 var
334   locObj : TSDOConvertHelperClass;
335 begin
336   locObj := getObject();
337   CheckEquals(TSDOChar(0), locObj.ShortToChar(0));
338   CheckEquals(TSDOChar(12), locObj.ShortToChar(12));
339   CheckEquals(TSDOChar(123), locObj.ShortToChar(123));
340   CheckEquals(TSDOChar(TSDOShort(-52)), locObj.ShortToChar(-52));
341   CheckEquals(TSDOChar(TSDOShort(12345)), locObj.ShortToChar(12345));
342 end;
343 
344 procedure TSDOConvertHelper_Test.ShortToString();
345 var
346   locObj : TSDOConvertHelperClass;
347 begin
348   locObj := getObject();
349   CheckEquals('-1234', locObj.ShortToString(-1234));
350   CheckEquals('0', locObj.ShortToString(0));
351   CheckEquals('1', locObj.ShortToString(1));
352   CheckEquals('1234', locObj.ShortToString(1234));
353 end;
354 
355 procedure TSDOConvertHelper_Test.StringToBool();
356 var
357   locObj : TSDOConvertHelperClass;
358 
359   procedure check_invalid(const AString : TSDOString);
360   var
361     Ok : boolean;
362   begin
363     ok := False;
364     try
365       locObj.StringToBool(AString);
366     except
367       on e : ESDOInvalidConversionException do
368         ok := True;
369     end;
370     Check(ok,Format('This conversion should fail : "%s".',[AString]));
371   end;
372 
373 begin
374   locObj := getObject();
375   CheckEquals(False, locObj.StringToBool('0'));
376   CheckEquals(False, locObj.StringToBool('false'));
377   CheckEquals(False, locObj.StringToBool('FaLsE'));
378   CheckEquals(True, locObj.StringToBool('1'));
379   CheckEquals(True, locObj.StringToBool('True'));
380   check_invalid('');
381   check_invalid('xxxxx');
382   check_invalid('falsexxx');
383   check_invalid('truessss');
384 end;
385 
386 procedure TSDOConvertHelper_Test.StringToByte();
387 var
388   locObj : TSDOConvertHelperClass;
389 
390   procedure check_invalid(const AString : TSDOString);
391   var
392     Ok : boolean;
393   begin
394     ok := False;
395     try
396       locObj.StringToByte(AString);
397     except
398       on e : ESDOInvalidConversionException do
399         ok := True;
400     end;
401     Check(ok,Format('This conversion should fail : "%s".',[AString]));
402   end;
403 
404 begin
405   locObj := getObject();
406   CheckEquals(123, locObj.StringToByte('123'));
407   CheckEquals(0, locObj.StringToByte('0'));
408   CheckEquals(1, locObj.StringToByte('1'));
409   CheckEquals(45, locObj.StringToByte('45'));
410   check_invalid('');
411   check_invalid('xxxxx');
412   check_invalid('1235dd');
413   check_invalid('a2522');
414 end;
415 
416 procedure TSDOConvertHelper_Test.StringToDate();
417 var
418   locObj : TSDOConvertHelperClass;
419 
420   procedure check_invalid(const AString : TSDOString);
421   var
422     Ok : boolean;
423   begin
424     ok := False;
425     try
426       locObj.StringToDate(AString);
427     except
428       on e : ESDOInvalidConversionException do
429         ok := True;
430     end;
431     Check(ok,Format('This conversion should fail : "%s".',[AString]));
432   end;
433 
434 var
435   s : string;
436   d : TSDODate;
437   y,m,dy : Word;
438   hh,mn,ss, ssss : Word;
439 begin
440   locObj := getObject();
441   //'-'? yyyy '-' mm '-' dd 'T' hh ':' mm ':' ss ('.' s+)? (zzzzzz)?
442   s := '1976-10-12T23:34:56Z';
443   d := locObj.StringToDate(s);
444     DecodeDate(d.Date,y,m,dy);
445       CheckEquals(y,1976,'Year');
446       CheckEquals(m,10,'Month');
447       CheckEquals(dy,12,'Day');
448     DecodeTime(d.Date,hh,mn,ss,ssss);
449       CheckEquals(hh,23,'Hour');
450       CheckEquals(mn,34,'Minute');
451       CheckEquals(ss,56,'Second');
452     CheckEquals(0,d.HourOffset,'HourOffset');
453     CheckEquals(0,d.MinuteOffset,'MinuteOffset');
454 
455   s := '1976-10-12T23:34:56+12:34';
456   d := locObj.StringToDate(s);
457     DecodeDate(d.Date,y,m,dy);
458       CheckEquals(y,1976,'Year');
459       CheckEquals(m,10,'Month');
460       CheckEquals(dy,12,'Day');
461     DecodeTime(d.Date,hh,mn,ss,ssss);
462       CheckEquals(hh,23,'Hour');
463       CheckEquals(mn,34,'Minute');
464       CheckEquals(ss,56,'Second');
465     CheckEquals(12,d.HourOffset,'HourOffset');
466     CheckEquals(34,d.MinuteOffset,'MinuteOffset');
467 
468   check_invalid('azerty');
469   check_invalid('123');
470 end;
471 
472 procedure TSDOConvertHelper_Test.StringToInteger();
473 var
474   locObj : TSDOConvertHelperClass;
475 
476   procedure check_invalid(const AString : TSDOString);
477   var
478     Ok : boolean;
479   begin
480     ok := False;
481     try
482       locObj.StringToInteger(AString);
483     except
484       on e : ESDOInvalidConversionException do
485         ok := True;
486     end;
487     Check(ok,Format('This conversion should fail : "%s".',[AString]));
488   end;
489 
490 begin
491   locObj := getObject();
492   CheckEquals(-123456, locObj.StringToInteger('-123456'));
493   CheckEquals(0, locObj.StringToInteger('0'));
494   CheckEquals(1, locObj.StringToInteger('1'));
495   CheckEquals(123456, locObj.StringToInteger('123456'));
496   check_invalid('');
497   check_invalid('xxxxx');
498   check_invalid('1235dd');
499   check_invalid('a2522');
500 end;
501 
502 procedure TSDOConvertHelper_Test.StringToLong();
503 var
504   locObj : TSDOConvertHelperClass;
505 
506   procedure check_invalid(const AString : TSDOString);
507   var
508     Ok : boolean;
509   begin
510     ok := False;
511     try
512       locObj.StringToLong(AString);
513     except
514       on e : ESDOInvalidConversionException do
515         ok := True;
516     end;
517     Check(ok,Format('This conversion should fail : "%s".',[AString]));
518   end;
519 
520 begin
521   locObj := getObject();
522   CheckEquals(-123456, locObj.StringToLong('-123456'));
523   CheckEquals(0, locObj.StringToLong('0'));
524   CheckEquals(1, locObj.StringToLong('1'));
525   Check(Int64(High(LongWord)) + 10 = locObj.StringToLong(IntToStr(Int64(High(LongWord)) + 10)));
526   check_invalid('');
527   check_invalid('xxxxx');
528   check_invalid('1235dd');
529   check_invalid('a2522');
530 end;
531 
532 procedure TSDOConvertHelper_Test.StringToShort();
533 var
534   locObj : TSDOConvertHelperClass;
535 
536   procedure check_invalid(const AString : TSDOString);
537   var
538     Ok : boolean;
539   begin
540     ok := False;
541     try
542       locObj.StringToShort(AString);
543     except
544       on e : ESDOInvalidConversionException do
545         ok := True;
546     end;
547     Check(ok,Format('This conversion should fail : "%s".',[AString]));
548   end;
549 
550 begin
551   locObj := getObject();
552   CheckEquals(-1234, locObj.StringToShort('-1234'));
553   CheckEquals(0, locObj.StringToShort('0'));
554   CheckEquals(1, locObj.StringToShort('1'));
555   CheckEquals(1234, locObj.StringToShort('1234'));
556   check_invalid('');
557   check_invalid('xxxxx');
558   check_invalid('1235dd');
559   check_invalid('a2522');
560 end;
561 
562 procedure TSDOConvertHelper_Test.BytesToString();
563 const
564   LEN = 1000;
565 var
566   locObj : TSDOConvertHelperClass;
567   buff : TSDOBytes;
568   strBuff : TSDOString;
569   ansiStrBuff : AnsiString;
570   i : Integer;
571 begin
572   locObj := getObject();
573 
574   buff := nil;
575   strBuff := locObj.BytesToString(buff);
576   CheckEquals('', strBuff);
577 
578   SetLength(buff,LEN);
579   for i := 0 to Pred(LEN) do
580     buff[i] := ( i mod High(TSDOByte) );
581 
582   SetLength(ansiStrBuff,LEN * 2);
583   BinToHex(PAnsiChar(@buff[Low(buff)]),PAnsiChar(@ansiStrBuff[1]),LEN);
584   strBuff := ansiStrBuff;
585   CheckEquals(strBuff,locObj.BytesToString(buff));
586 end;
587 
588 procedure TSDOConvertHelper_Test.StringToBytes();
589 const
590   LEN = 1000;
591 var
592   locObj : TSDOConvertHelperClass;
593   buff, calcBuff : TSDOBytes;
594   strBuff : TSDOString;
595   ansiStrBuff : AnsiString;
596   i : Integer;
597 begin
598   locObj := getObject();
599   SetLength(buff,LEN);
600   for i := 0 to Pred(LEN) do
601     buff[i] := ( i mod High(TSDOByte) );
602   SetLength(ansiStrBuff,LEN * 2);
603   BinToHex(PAnsiChar(buff),PAnsiChar(ansiStrBuff),LEN);
604   strBuff := ansiStrBuff;
605 
606   CheckEquals(PtrUInt(nil), PtrUInt(locObj.StringToBytes('')));
607   calcBuff := locObj.StringToBytes(strBuff);
608   Check(CompareMem(Pointer(buff),Pointer(calcBuff),LEN));
609 end;
610 
611 initialization
612   RegisterTest('Helpers',TSDOConvertHelper_Test.Suite);
613 
614 end.
615