* harbour/contrib/hbct/screen2.c
! fixed possible vary bad bug (memory buffer overflow) in SCREENSTR()
* harbour/source/rtl/hbffind.c
! fixed possible GPF in some *nixes
* harbour/source/vm/classes.c
! do not execute the same destructor inherited from different parent
classes more then once
* harbour/source/rtl/transfrm.c
! fixed bug with '9' used as stop condition of function pattern
this character cannot be stripped, f.e.:
? transform( "abc", "@_99*" )
! fixed bug with '*' or '$' used with @), f.e.:
? transform( -12345, "@) $999999" )
! fixed replacing '.' with ',' when @E is used without picture part, f.e.:
? transform( 123.45, "@E" )
! fixed ',' conversions
? transform( 12.34,"@E ab,cd.ef9,9.99,.--" )
! fixed bug with picture starting with ".", f.e.:
? transform( 0.3456, ".999" )
! fixed "@(" and "@)" conversions, f.e.:
? transform( -12345, "@) 1999*999" )
! fixed late oveflow detection in "@(" and "@)", f.e.:
? transtest( -12345, "@( 6798^999" )
! fixed "@E" conversion for dates to keep user delimiters set in
_SET_DATEFORMAT, f.e.:
set( _SET_DATEFORMAT, "mm:dd:yyyy" ); ? transform( date(), "@E" )
set( _SET_DATEFORMAT, "yyyy<mm>dd" ); ? transform( date(), "@E" )
Please note that Harbour is not strictly Clipper compatible here
because it respects _SET_DATEFORMAT set by user.
! fixed 64bit integer conversion by eliminating conversion to
'double' f.e.:
? transform( 1234567890123456789, "99999999999999999999" )
? transform( -1234567890123456789, "99999999999999999999" )
! some other fixes, see regression test transtst.prg
% speed improvement in numeric conversions
+ harbour/tests/transtst.prg
+ added regression test for transform function
* harbour/utils/hbtest/rt_trans.prg
* disabled transform() tests for "@E" and result smaller then 5 bytes
CA-Cl*pper do not check result size and always exchanges
bytes 1-2 with bytes 4-5 for @E conversion. It's buffer overflow
bug and I do not want to replicate it inside our transform
implementation. It also causes that the results for for strings
smaller then 5 bytes behaves randomly.
In fact precise tests can show that it's not random behavior
but CA-Cl*pper uses static buffer for result and when current one
is smaller then 5 bytes then first two bytes are replaced with
4-5 bytes from previous result which was length enough, f.e.:
? transform( "0123456789", "" )
? transform( "AB", "@E" )
? transform( "ab", "@E" )
Replicating exact CA-Cl*pper behavior it's trivial (it will be enough
to use static buffer two and not check the size of current result) but
IMHO it's bug.
* harbour/source/rtl/round.c
* added strictly Clipper compatible code covered by HB_C52_STRICT
and comment about possible difference in Harbour.
* harbour/include/hbgtinfo.ch
* harbour/source/rtl/hbgtcore.c
* harbour/source/rtl/gtxwc/gtxwc.c
* harbour/source/rtl/gtsln/gtsln.c
* harbour/source/rtl/gttrm/gttrm.c
* harbour/source/rtl/gtwvt/gtwvt.c
+ added HB_GTI_ISUNICODE - it returns logical value with information
about Unicode mode in active GT driver - it's necessary for proper
CP initialization in some GTDs which can work in both mode depending
on client side settings
* harbour/source/rtl/gttrm/gttrm.c
* improved UTF-8 detection
* added automatic PuTTY detection
* improved PuTTY and some xterm key handling
* added some missing RXVT keys
308 lines
12 KiB
Plaintext
308 lines
12 KiB
Plaintext
/*
|
|
* $Id$
|
|
*/
|
|
|
|
/*
|
|
* Harbour Project source code:
|
|
* test code for TRANSFORM() function
|
|
*
|
|
* Copyright 2008 Przemyslaw Czerpak <druzus / at / priv.onet.pl>
|
|
* www - http://www.harbour-project.org
|
|
*
|
|
*/
|
|
|
|
|
|
static s_stop := .f.
|
|
|
|
proc main()
|
|
test()
|
|
return
|
|
|
|
function transtest( xVal, cPict, cExpect )
|
|
local cResult := transform( xVal, cPict )
|
|
if !cResult == cExpect
|
|
s_stop := .t.
|
|
endif
|
|
return iif( cResult == cExpect, "[OK] ", "[ERROR] ["+cExpect+"] => ") + ;
|
|
"[" + cResult + "]"
|
|
|
|
proc stop()
|
|
if s_stop
|
|
? repl("*",50)
|
|
inkey(0)
|
|
s_stop := .f.
|
|
endif
|
|
return
|
|
|
|
proc test()
|
|
local dt
|
|
? transtest( "abcd", "@9!*", "ABCD" )
|
|
? transtest( "abcd", "@_9!*", "ABCD" )
|
|
? transtest( "abcd", "@_9"+chr(9)+"9!9", "aBc" )
|
|
? transtest( "abcd", "@!!!", "ABCD" )
|
|
? transtest( "abcd", "@9", "abcd" )
|
|
?
|
|
? transtest( 134.24, "99,999.99", " 134.24" )
|
|
? transtest( 134.24, "@E 99,999.99", " 134,24" )
|
|
? transtest( -134.24,"@E 99,999.99", " -134,24" )
|
|
? transtest( 134.24, "@E99,999.99", " 134,24" )
|
|
? transtest( -134.24, "@E99,999.99", " -134,24" )
|
|
?
|
|
? transtest(-7, "@X 9999", " 7 DB")
|
|
? transtest(stod("19920509"), "@E", "09/05/92")
|
|
? transtest(val("3.10"),"@X", "3.10")
|
|
? transtest(0.80,".9999", ".8000" )
|
|
? transtest(-0.80, ".9999", ".****" )
|
|
? transtest(12345.123, "@X99", " 12345.123")
|
|
? transtest(-12345.123, "@X99", " 12345.123 DB" )
|
|
? transtest( 123456.78, "@E", " 123456,78")
|
|
? transtest(0,"@C 9.99", "0.00")
|
|
stop()
|
|
#ifdef __HARBOUR__
|
|
dt:=stod("19871231")
|
|
set date format to "MM:DD:YYYY"
|
|
? transtest( dt, "@E", "31:12:1987" )
|
|
set date format to "DD:MM:YYYY"
|
|
? transtest( dt, "@E", "31:12:1987")
|
|
set date format to "YYYY:MM:DD"
|
|
? transtest( dt, "@E", "31:12:1987")
|
|
set date format to "YYYY:DD:MM"
|
|
? transtest( dt, "@E", "31:12:1987")
|
|
set date format to "YY:MM:DD"
|
|
? transtest( dt, "@E", "31:12:87")
|
|
set date format to "MM:DD:YY"
|
|
? transtest( dt, "@E", "31:12:87")
|
|
set date format to "DD:MM:YY"
|
|
? transtest( dt, "@E", "31:12:87")
|
|
set date format to "<YY:DD.MM>"
|
|
? transtest( dt, "@E", "<31:12.87>")
|
|
set date format to "|YY|MM|DD|"
|
|
? transtest( dt, "@E", "|31|12|87|")
|
|
set date format to "MM<DD>YY"
|
|
? transtest( dt, "@E", "31<12>87")
|
|
stop()
|
|
#endif
|
|
|
|
? transtest( -5, "@(Z $###,##9.99", "( 5.00)" )
|
|
? transtest( -10, "@)Z $###,##9.99", "$ (10.00)" )
|
|
? transtest( -20, "@Z $###,##9.99", "$ -20.00" )
|
|
? transtest(100,"9999.", " 100.")
|
|
? transtest(1.1,"@B!99.99", "1.1 ")
|
|
? transtest(12.345,"@R 99/99", " /12")
|
|
? transtest( "1234567890", "@9", "1234567890")
|
|
? transtest( 1234567890, "@9", " 1234567890")
|
|
? transtest( 1234, "9 999", "1 234" )
|
|
? transtest( 123.123456, "999.99.99.99", "123.12.45. " )
|
|
? transtest( 123.123456, "$$$.$$.$$.$$", "123.12.45. " )
|
|
? transtest( 123.123456, "***.**.**.**", "123.12.45. " )
|
|
? transtest( 99999, "9.999", "*.***" )
|
|
? transtest( 99, "*.***", "*.***" )
|
|
? transtest( 12345, "9999.", "****." )
|
|
stop()
|
|
? transtest(-12345.00, "@(", "( 12345.00)")
|
|
? transtest(-12345.00, "@)", " (12345.00)")
|
|
? transtest(-123456789.00, "@(", "(123456789.00)")
|
|
? transtest(-123456789.00, "@)", "(123456789.00)")
|
|
? transtest(-1234567890, "@(", "( 1234567890)")
|
|
? transtest(-1234567890, "@)", " (1234567890)")
|
|
? transtest(-12345, "@( [999999]", "( 12345])")
|
|
? transtest(-12345, "@) [999999]", "[(12345])")
|
|
? transtest(-12345, "@( $999999", "( 12345)")
|
|
? transtest(-12345, "@) $999999", "$(12345)")
|
|
? transtest(-12345, "@( #999999", "( 12345)")
|
|
? transtest(-12345, "@) #999999", " (12345)")
|
|
? transtest(-12345, "@( $99999", "(12345)")
|
|
? transtest(-12345, "@) $99999", "(12345)")
|
|
? transtest(-12345, "@( #99999", "(12345)")
|
|
? transtest(-12345, "@) #99999", "(12345)")
|
|
? transtest(-12345, "@( 6798^999", "(7*8^***)")
|
|
? transtest(-12345, "@( 9798^9999", "(718^2345)")
|
|
stop()
|
|
?
|
|
tofix()
|
|
return
|
|
|
|
proc tofix()
|
|
? transtest( 134.24, "@E99,999.99", " 134,24" )
|
|
? transtest( -134.24, "@E99,999.99", " -134,24" )
|
|
? transtest(0.80,".9999", ".8000")
|
|
? transtest(-0.80,".9999", ".****")
|
|
? transtest(12345.123, "@X99", " 12345.123")
|
|
? transtest(-12345.123, "@X99", " 12345.123 DB")
|
|
? transtest( 123456.78, "@E", " 123456,78")
|
|
? transtest(0,"@C 9.99", "0.00")
|
|
? transtest(1.1,"@B!99.99", "1.1 ")
|
|
? transtest(-12345, "@) [999999]", "[(12345])")
|
|
? transtest(-12345, "@) $999999", "$(12345)")
|
|
? transtest(-12345, "@) *999999", "*(12345)")
|
|
? transtest(-12345, "@) #999999", " (12345)")
|
|
? transtest(-12345, "@) *9$9*999]", "*($12345])")
|
|
? transtest(-12345, "@) *999*999]", "* (12345])")
|
|
? transtest(-12345, "@) 0999*999]", "0 (12345])")
|
|
? transtest(-12345, "@) 1999*999]", "1 (12345])")
|
|
? transtest(-12345, "@) *[99*999]", "([ 12345])")
|
|
? transtest(-12345, "@) *****999]", "(**12345])")
|
|
? transtest(-12345, "@) *1***999]", "(1*12345])")
|
|
? transtest(-12345, "@) * 999999]", "* (12345])")
|
|
? transtest( -5, "@(Z $###,##9.99", "( 5.00)" )
|
|
? transtest( -10, "@)Z $###,##9.99", "$ (10.00)" )
|
|
? transtest( -5, "@(Z $999,999.99", "( 5.00)" )
|
|
? transtest( -10, "@)Z $999,999.99", "$ (10.00)" )
|
|
? transtest( -5, "@(Z 999,999.99", "( 5.00)" )
|
|
? transtest( -10, "@)Z 999,999.99", " (10.00)" )
|
|
? transtest( -20, "@Z $###,##9.99", "$ -20.00" )
|
|
? transtest(0.1,".9", ".1")
|
|
? transtest(0.0,".9", ".0")
|
|
? transtest(1,".9", ".*")
|
|
? transtest(.456,".9", ".5")
|
|
? transtest(123,"99.-", "**.-")
|
|
stop()
|
|
? transtest(-123.45,"999,999.99", " -123.45")
|
|
? transtest(-123456.78,"999,999,999.99", " -123,456.78")
|
|
? transtest(-123456.78,"$$$,$$$,$$$.$$", "$$ -123,456.78")
|
|
? transtest(-123456.78,"***,***,***.**", "***-123,456.78")
|
|
? transtest(123456.78,"@E 888,$$$,$$$.$$", "888.123.456,78")
|
|
? transtest(123456.78,"@E 888x,$$$,$$$.$$", "888xx123.456,78")
|
|
? transtest(123456.78,"@E 888x,,$$$,$$$.$$", "888xxx123.456,78")
|
|
? transtest(123456.78,"@E 8,88x,,$$$,$$$.$$", "8.88xxx123.456,78")
|
|
? transtest(123456.78,"@E 8,88x,,$$$,,$$$.$$", "8.88xxx123..456,78")
|
|
? transtest(123456.78,"@E 8,88x,,$$$,,$$$.$$77,7", "8.88xxx123..456,7877,7")
|
|
? transtest(123456,"@E 8,88x,,$$$,,$$$77,7", "8.88xxx123..45677,7")
|
|
? transtest(123456,"@E -,999,999", " -123.456")
|
|
? transtest(12345,"@E -,999,999", " - 12.345")
|
|
? transtest(12345,"@E -,|999,999", " -| 12.345")
|
|
? transtest(12345,"@E ^-,|999,999", "^^-| 12.345")
|
|
? transtest(12345,"@E 1-,|999,999", "11-| 12.345")
|
|
? transtest(12345,"@E |--,|999,999", "|---| 12.345")
|
|
stop()
|
|
? transtest(12.34,"@E 99'99", " '12")
|
|
? transtest(12.34,"99,99,11", " 12,11")
|
|
? transtest(12.34,"@E 99,99,11", " 12,11")
|
|
? transtest(12.34,"@E 99,", "12,")
|
|
? transtest(12.34,"@E 9,9", "1.2")
|
|
? transtest(12.34,"@E ab,cd.ef9,9.99,.--", "abbcd,ef***,* ,.--")
|
|
? transtest(12.34,"@E ab,cd,ef9,9.99,.--", "abbcddef1.2,34,.--")
|
|
? transtest(12.34,"@E ,ab,cd,ef9,9.99,.--", ",abbcddef1.2,34,.--")
|
|
? transtest(12.34,"@E ,,,,99,.99,.--", ",,,,12.,34,.--")
|
|
? transtest(124.4,"@E ,,,,9,9.99,.--", ",,,,***,**,.--")
|
|
? transtest( 1.2,"@E ,,,,*,*.**,.--", ",,,,**1,20,.--")
|
|
? transtest(12.34,"@E ,,,,*,*.**,.--", ",,,,1.2,34,.--")
|
|
? transtest(12.34,"@E ,,,,*,*.**,.--,--", ",,,,1.2,34,.--,--")
|
|
? transtest(12.34,"@E ,,,,*,*,.,**", ",,,,1.2.,,34")
|
|
? transtest(12.34,",,,,*,*,.,**", ",,,,1,2,..34")
|
|
? transtest(12.34,",,,,*,*,.,*|,*", ",,,,1,2,..3||4")
|
|
? transtest(12.34,",,,,*,*,.,*,*", ",,,,1,2,..3,4")
|
|
? transtest(123.345678912,"@E 999.99.99,99.99.", "123,34,67.89, .")
|
|
#ifdef __HARBOUR__
|
|
? transtest( 1234567890123456789, "99999999999999999999", " 1234567890123456789" )
|
|
? transtest( -1234567890123456789, "99999999999999999999", "-1234567890123456789" )
|
|
#else
|
|
? transtest( 1234567890123456789, "99999999999999999999", " 1234567890123457000" )
|
|
? transtest( -1234567890123456789, "99999999999999999999", "-1234567890123457000" )
|
|
#endif
|
|
stop()
|
|
set(_SET_DATEFORMAT,"YYYY/MM/DD")
|
|
? transtest(12345678,"@D", "1234/56/78")
|
|
set(_SET_DATEFORMAT,"YYYY.MM.DD")
|
|
? transtest(1234.56789,"@D", "1234.56.9 ")
|
|
set(_SET_DATEFORMAT,"YYYY.MM:DD")
|
|
? transtest(1234.56789,"@D", "1234.56:79")
|
|
? transtest(123.345678912,"@D ", " 123.34:57")
|
|
set(_SET_DATEFORMAT,"MM-DD-YYYY")
|
|
? transtest(.t.,"@RE <|,yY#lL,|>", "99-99-9999T")
|
|
? transtest(.f.,"@RE <|,yY#lL,|>", "99-99-9999F")
|
|
? transtest(.t.,"@RD <|,yY#lL,|>", "99-99-9999T")
|
|
? transtest(.f.,"@RD <|,yY#lL,|>", "99-99-9999F")
|
|
? transtest(.f.,"@DE <|,yY#lL,|>", "9")
|
|
? transtest("abcdefghij","@S15! <XXXXXXXX>", "<BCDEFGHI>")
|
|
? transtest("abcdefghij","@S0! <XXXXXXXX>", "<BCDEFGHI>")
|
|
? transtest("abcdefghij","@S5! <XXXXXXXX>", "<BCDE")
|
|
stop()
|
|
set fixed on
|
|
? transtest( 1234, , " 1234" )
|
|
? transtest( 1234, "" , " 1234" )
|
|
? transtest( 1234, "@" , " 1234" )
|
|
? transtest( 1234, "@!", " 1234" )
|
|
? transtest( -1234, , " -1234" )
|
|
? transtest( -1234, "@" , " -1234" )
|
|
#ifdef HB_C52_STRICT
|
|
? transtest( round(123,0), , " 123.00" )
|
|
? transtest( round(123,0), "@!", " 123.00" )
|
|
? transtest( round(123.0,0), , " 123.00" )
|
|
? transtest( round(123.0,0),"@!", " 123.00" )
|
|
#endif
|
|
stop()
|
|
? transtest( 1234.567, , " 1234.57" )
|
|
? transtest( 1234.567, "", " 1234.57" )
|
|
? transtest( 1234.567, "@" , " 1234.57" )
|
|
? transtest( 1234.567, "@!", " 1234.57" )
|
|
? transtest( -1234.567, , " -1234.57" )
|
|
? transtest( -1234.567, "@", " -1234.57" )
|
|
? transtest( val("-1.0"), , "-1.00" )
|
|
? transtest( val("-1.0"), "@", "-1.00" )
|
|
? transtest( val("-123"), , " -123" )
|
|
? transtest( val("-123"), "@", " -123" )
|
|
? transtest( 0, , " 0" )
|
|
? transtest( 0.0, , " 0.00" )
|
|
? transtest( val("1"), , " 1" )
|
|
? transtest( val("12"), , " 12" )
|
|
? transtest( val("123"), , " 123" )
|
|
? transtest( val("1234"), , " 1234" )
|
|
stop()
|
|
set decimal to 3
|
|
? transtest( 0.0, , " 0.000" )
|
|
? transtest( val("1"), , " 1" )
|
|
? transtest( val("12"), , " 12" )
|
|
? transtest( val("123"), , " 123" )
|
|
? transtest( val("1234"), , " 1234" )
|
|
set decimal to 4
|
|
? transtest( 0.0, , " 0.0000" )
|
|
? transtest( val("1"), , " 1" )
|
|
? transtest( val("12"), , " 12" )
|
|
? transtest( val("123"), , " 123" )
|
|
? transtest( val("1234"), , " 1234" )
|
|
set fixed off
|
|
stop()
|
|
? transtest( -1234, , " -1234" )
|
|
? transtest( -1234, "@B", "-1234 " )
|
|
? transtest( -1234, "@(", "( 1234)" )
|
|
? transtest( -1234, "@)", " (1234)" )
|
|
? transtest( -1234, "@B)", "(1234) " )
|
|
? transtest( -1234, "@B(", "(1234) " )
|
|
? transtest( "( 12)", "@B(", "( 12)" )
|
|
? transtest( "( 12)", "@B)", "( 12)" )
|
|
? transtest( " 12", "@B(", "12 " )
|
|
? transtest( " 12", "@B)", "12 " )
|
|
#ifdef __HARBOUR__
|
|
? transtest( 1234, "@L", "0000001234" )
|
|
? transtest( 1234, "@0", "0000001234" )
|
|
? transtest( 1234, "@L(", "0000001234" )
|
|
? transtest( 1234, "@0)", "0000001234" )
|
|
? transtest( -1234, "@L(", "(000001234)" )
|
|
? transtest( -1234, "@0)", "(000001234)" )
|
|
/* please test it with FoxPro and xbase++ to check if they give the same result */
|
|
? transtest( -1234, "@L", "-000001234" )
|
|
? transtest( -1234, "@0", "-000001234" )
|
|
#endif
|
|
/* FlagShip extensions */
|
|
? transtest( -1234, "@Z", " -1234" )
|
|
? transtest( 1234, "@Z", " 1234" )
|
|
? transtest( -1234, "@F", " -1234" )
|
|
? transtest( 1234, "@F", " 1234" )
|
|
? transtest( -1234, "@T", " -1234" )
|
|
? transtest( 1234, "@T", " 1234" )
|
|
|
|
? transtest( 123456789.12, "@,39 999,999,999.99", "123,456,789.12" )
|
|
? transtest( 123456789.12, "@,39 999,999,999.99", "123,456,789.12" )
|
|
? transtest( 123.456, "@R 9 9 9.9", "1 2 3.5" )
|
|
stop()
|
|
return
|
|
|
|
#ifndef __HARBOUR__
|
|
func stod(s)
|
|
local cDf:=set(_SET_DATEFORMAT,"YYYY/MM/DD"), dt
|
|
dt:=ctod(stuff(stuff(s,7,0,"/"),5,0,"/"))
|
|
set(_SET_DATEFORMAT,cDf)
|
|
return dt
|
|
#endif
|