RegressionTests__NumberTest.st
author Claus Gittinger <cg@exept.de>
Fri, 30 Aug 2019 02:26:21 +0200
changeset 2392 17e6138f5686
parent 2338 164c3d4cba01
child 2394 168fb84c7806
permissions -rw-r--r--
#QUALITY by exept class: RegressionTests::NumberTest added: #testPrintf_Integer #testPrintf_Misc changed: #testPrintf_Float

"{ Encoding: utf8 }"

"{ Package: 'stx:goodies/regression' }"

"{ NameSpace: RegressionTests }"

TestCase subclass:#NumberTest
	instanceVariableNames:'a b'
	classVariableNames:''
	poolDictionaries:''
	category:'tests-Regression-Numbers'
!


!NumberTest methodsFor:'accessing'!

a
    ^ a
!

a:something
    a := something.
!

b
    ^ b
!

b:something
    b := something.
! !

!NumberTest methodsFor:'initialize / release'!

tearDown
    Class withoutUpdatingChangesDo:[
        self class removeSelector:#testEQ
    ].
! !

!NumberTest methodsFor:'tests-concrete bugs'!

test_eqNumberBug
    "reported 09-09-2004;
     stc generated wrong code for some inlined = - compare (shame)."

    self 
        skipIf:ExternalAddress pointerSize = 8 
        description:'Compile does not work under 64bit'.

    false "(Helper
        isStcCompiledMethod:#test_eqNumberBug
        in:self
    )" ifTrue:[
        self 
            skipIf:true
            description:'#compile is not available in stand alone apps'.
    ].            

    Class withoutUpdatingChangesDo:[
        self class
            compile:
'testEQ
    a = b ifTrue:[^ false].
    ^ true.
'
            classified:'temporary'.
    ].

    self assert: (
       (self
           a:0;
           b:0) testEQ ) == false.

    self assert: (
       (self
           a:0;
           b:0.0) testEQ ) == false.

    self assert: (
       (self
           a:0.0;
           b:0) testEQ ) == false.

    self assert: (
       (self
           a:0.0;
           b:0.0) testEQ ) == false.

    Class withoutUpdatingChangesDo:[
        Compiler stcCompileMethod:(self class compiledMethodAt:#testEQ).
    ].

    self assert: (
       (self
           a:0;
           b:0) testEQ ) == false.

    self assert: (
       (self
           a:0;
           b:0.0) testEQ ) == false.

    self assert: (
       (self
           a:0.0;
           b:0) testEQ ) == false.

    self assert: (
       (self
           a:0.0;
           b:0.0) testEQ ) == false.

    Class withoutUpdatingChangesDo:[
        self class removeSelector:#testEQ
    ].

    "
     self new test_eqNumberBug
    "

    "Modified (format): / 06-05-2019 / 14:12:55 / Claus Gittinger"
    "Modified: / 21-05-2019 / 16:20:50 / Stefan Reise"
! !

!NumberTest methodsFor:'tests-conversion-rounding'!

test_conversion
    "reported as Bug 388
     Current implementation neither truncate nor round to nearest Floating point
     value, it just accumulate round off errors."


    self assert: 16r1FFFFFFFFFFFF0801 asDouble ~= 16r1FFFFFFFFFFFF0800 asDouble.
    "this test is on 65 bits"

    self assert: 16r1FFFFFFFFFFFF0802 asDouble ~= 16r1FFFFFFFFFFFF0800 asDouble.
    "this test is on 64 bits"

    self assert: 16r1FFFFFFFFFFF1F800 asDouble = 16r1FFFFFFFFFFF20000 asDouble.
    "nearest even is upper"
    self assert: 16r1FFFFFFFFFFFF0800 asDouble = 16r1FFFFFFFFFFFF0000 asDouble.
    "nearest even is lower"

    "Created: / 24-10-2006 / 15:31:20 / cg"
! !

!NumberTest methodsFor:'tests-printing'!

testPrintf_FixedPoint
    "/ FixedPoint
    
    self assert:( (PrintfScanf printf:'%.4f' argument:FixedPoint pi) = '3.1416' ).
    self assert:( (PrintfScanf printf:'%.8f' argument:FixedPoint pi)  = '3.14159265' ).
    self assert:( (PrintfScanf printf:'%f' argument:FixedPoint pi)    = '3.141593' ).

    "/ too small
    self assert:( (FixedPoint pi printfPrintString:'%4Lf') = '3.141593' ).
    self assert:( (FixedPoint pi printfPrintString:'%5Lf') = '3.141593' ).
    self assert:( (FixedPoint pi printfPrintString:'%6Lf') = '3.141593' ).
    self assert:( (FixedPoint pi printfPrintString:'%7Lf') = '3.141593' ).
    "/ fit
    self assert:( (FixedPoint pi printfPrintString:'%8Lf') = '3.141593' ).
    self assert:( (FixedPoint pi printfPrintString:'%4.2Lf') = '3.14' ).
    "/ left filled
    self assert:( (FixedPoint pi printfPrintString:'%9Lf') = ' 3.141593' ).
    "/ right filled
    self assert:( (FixedPoint pi printfPrintString:'%-9Lf') = '3.141593 ' ).

    "Created: / 10-10-2017 / 12:36:21 / cg"
    "Modified: / 10-10-2017 / 16:29:20 / cg"
!

testPrintf_Float
    "/ Float
    
    self assert:( (PrintfScanf printf:'%.0f' argument:Float pi)  = '3' ).
    self assert:( (PrintfScanf printf:'%#.0f' argument:Float pi) = '3.0' ).  "/ hash forces print of '.0'
    self assert:( (PrintfScanf printf:'%.1f' argument:Float pi)  = '3.1' ).
    self assert:( (PrintfScanf printf:'%#.1f' argument:Float pi) = '3.1' ).
    self assert:( (PrintfScanf printf:'%.2f' argument:Float pi)  = '3.14' ).
    self assert:( (PrintfScanf printf:'%.3f' argument:Float pi)  = '3.142' ).
    self assert:( (PrintfScanf printf:'%.4f' argument:Float pi)  = '3.1416' ).
    self assert:( (PrintfScanf printf:'%.8f' argument:Float pi)  = '3.14159265' ).
    self assert:( (PrintfScanf printf:'%f' argument:Float pi)    = '3.141593' ).
    self assert:( (PrintfScanf printf:'%4f' argument:Float pi)   = '3.141593' ).

    "/ too small
    self assert:( (Float pi printfPrintString:'%4f') = '3.141593' ).
    self assert:( (Float pi printfPrintString:'%5f') = '3.141593' ).
    self assert:( (Float pi printfPrintString:'%6f') = '3.141593' ).
    self assert:( (Float pi printfPrintString:'%7f') = '3.141593' ).
    "/ fit
    self assert:( (Float pi printfPrintString:'%8f')   = '3.141593' ).
    self assert:( (Float pi printfPrintString:'%4.2f') = '3.14' ).
    "/ left filled
    self assert:( (Float pi printfPrintString:'%9f')   = ' 3.141593' ).
    self assert:( (Float pi printfPrintString:'%8.4f') = '  3.1416' ).

    "/ right filled
    self assert:( (Float pi printfPrintString:'%-9f') = '3.141593 ' ).

false ifTrue:[
    #(
        '%.3f'       1.0      '1.0'  
    ) inGroupsOf:3 do:[:fmt :val :expected|
        |printfGenerated stxGenerated|

        printfGenerated := val printfPrintString:fmt.
        stxGenerated := PrintfScanf printf:fmt argument:val.
        self assert:(stxGenerated = printfGenerated).
        self assert:(printfGenerated = expected).
    ].
].

    self assert:( (1.0 printfPrintString:'%4f') = '1.000000' ).
    self assert:( (1.0 printfPrintString:'%5f') = '1.000000' ).
    self assert:( (1.0 printfPrintString:'%6f') = '1.000000' ).
    self assert:( (1.0 printfPrintString:'%7f') = '1.000000' ).

    self assert:( (1.0 printfPrintString:'%.0f') = '1' ).
    self assert:( (1.0 printfPrintString:'%#.0f') = '1.' ).
    self assert:( (1.0 printfPrintString:'%#.0g') = '1.' ).
    self assert:( (1.0 printfPrintString:'%#.1f') = '1.0' ).
    self assert:( (1.0 printfPrintString:'%#.1g') = '1.' ).
    self assert:( (1.0 printfPrintString:'%.1f') = '1.0' ).
    self assert:( (1.0 printfPrintString:'%.2f') = '1.00' ).
    self assert:( (1.0 printfPrintString:'%.3f') = '1.000' ).
    self assert:( (1.0 printfPrintString:'%.4f') = '1.0000' ).
    self assert:( (1.0 printfPrintString:'%.5f') = '1.00000' ).
    self assert:( (1.0 printfPrintString:'%.6f') = '1.000000' ).
    self assert:( (1.0 printfPrintString:'%.7f') = '1.0000000' ).

    self assert:( (PrintfScanf printf:'%.0f' argument:1.0)  = '1' ).
false ifTrue:[
    self assert:( (PrintfScanf printf:'%#.0f' argument:1.0) = '3.0' ).  "/ hash forces print of '.0'
].
    self assert:( (PrintfScanf printf:'%.1f' argument:1.0)  = '1.0' ).
    self assert:( (PrintfScanf printf:'%#.1f' argument:1.0) = '1.0' ).
    self assert:( (PrintfScanf printf:'%.2f' argument:1.0)  = '1.0' ).
    self assert:( (PrintfScanf printf:'%.3f' argument:1.0)  = '1.0' ).
    self assert:( (PrintfScanf printf:'%.4f' argument:1.0)  = '1.0' ).
    self assert:( (PrintfScanf printf:'%.8f' argument:1.0)  = '1.0' ).
    self assert:( (PrintfScanf printf:'%f' argument:1.0)    = '1.0' ).
    self assert:( (PrintfScanf printf:'%4f' argument:1.0)   = ' 1.0' ).

    "Created: / 10-10-2017 / 12:34:51 / cg"
    "Modified: / 10-10-2017 / 16:32:01 / cg"
!

testPrintf_Fraction
    "/ Fraction
    
    self assert:( (PrintfScanf printf:'%.4f' argument:Fraction pi) = '3.1416' ).
    self assert:( (PrintfScanf printf:'%.8f' argument:Fraction pi)  = '3.14159265' ).
    self assert:( (PrintfScanf printf:'%f' argument:Fraction pi)    = '3.141593' ).

    "/ too small
    self assert:( (Fraction pi printfPrintString:'%4Lf') = '3.141593' ).
    self assert:( (Fraction pi printfPrintString:'%5Lf') = '3.141593' ).
    self assert:( (Fraction pi printfPrintString:'%6Lf') = '3.141593' ).
    self assert:( (Fraction pi printfPrintString:'%7Lf') = '3.141593' ).
    "/ fit
    self assert:( (Fraction pi printfPrintString:'%8Lf') = '3.141593' ).
    self assert:( (Fraction pi printfPrintString:'%4.2Lf') = '3.14' ).
    "/ left filled
    self assert:( (Fraction pi printfPrintString:'%9Lf') = ' 3.141593' ).
    "/ right filled
    self assert:( (Fraction pi printfPrintString:'%-9Lf') = '3.141593 ' ).

    "Created: / 10-10-2017 / 12:37:25 / cg"
    "Modified: / 10-10-2017 / 16:29:27 / cg"
!

testPrintf_Integer
    "/ Integers

    "/ verify that our printf generates the same string as the system-printf.
    "/ Checks of printfPrintString: are here to make sure, that the system's printf is doing it right...)
    self assert:( (20 printfPrintString:'%d') = '20' ).
    self assert:( (20 printfPrintString:'% d') = ' 20' ).
    self assert:( (-20 printfPrintString:'% d') = '-20' ).
    self assert:( (20 printfPrintString:'%#d') = '20' ).
    self assert:( (20 printfPrintString:'%#5d') = '   20' ).
    self assert:( (20 printfPrintString:'% -#5d') = ' 20  ' ).
    self assert:( (20 printfPrintString:'%- #5d') = ' 20  ' ).
    self assert:( (20 printfPrintString:'%-# 5d') = ' 20  ' ).
    self assert:( (20 printfPrintString:'%-#5d') = '20   ' ).
    self assert:( (20 printfPrintString:'%-#05d') = '20   ' ).   "/ NOTICE
    self assert:( (20 printfPrintString:'%-0#5d') = '20   ' ).   "/ NOTICE
    self assert:( (20 printfPrintString:'%0-#5d') = '20   ' ).   "/ NOTICE
    self assert:( (20 printfPrintString:'%0#-5d') = '20   ' ).   "/ NOTICE
    self assert:( (20 printfPrintString:'%#05d') = '00020' ).
    self assert:( (20 printfPrintString:'%# 5d') = '   20' ).
    self assert:( (20 printfPrintString:'%+ 5d') = '  +20' ).
    self assert:( (20 printfPrintString:'%- 5d') = ' 20  ' ).     
    self assert:( (-20 printfPrintString:'%- 5d') = '-20  ' ).     

    #(
        '%d'         20      '20'  
        '%d'        -20      '-20'  
        '%D'         20      '20'  
        '%D'        -20      '-20'  
        '%ld'        20      '20'  
        '%ld'       -20      '-20'  
        '%lld'       20      '20'  
        '%lld'      -20      '-20'  
        '%hd'        20      '20'  
        '%hd'       -20      '-20'  
        '%hhd'       20      '20'  
        '%hhd'      -20      '-20'  
        '%lhd'       20      '20'  
        '%hld'      -20      '-20'  
        '% d'        20      ' 20'  
        '% d'       -20      '-20'  
        '%#d'        20      '20'  
        '%#d'       -20      '-20'  
        '%5d'        20      '   20'  
        '%5d'       -20      '  -20'  
        '%-5d'       20      '20   '  
        '%-5d'      -20      '-20  '  
        '%05d'       20      '00020'  
        '%05d'      -20      '-0020'  
        '%-05d'      20      '20   '  
        '%-05d'     -20      '-20  '  
        '% 5d'       20      '   20'  
        '% 5d'      -20      '  -20'  
        '%- 5d'      20      ' 20  '  
        '%- 5d'     -20      '-20  '  
        '%.0d'       20      '20'  
        '%.0d'      -20      '-20'  
        '%.0d'        0      ''  
        '%x'         20      '14'  
        '%x'        255      'ff'  
        '%X'        255      'FF'  
        '%#x'       255      '0xff'  
        '%#X'       255      '0XFF'   "/ printf also uppercases the 'x'
        '%x'          0      '0'  
        '%#x'         0      '0'  
        '%#x'        20      '0x14'  
        '%5x'        20      '   14'  
        '%-5x'       20      '14   '  
        '%#5x'       20      ' 0x14'  
        '%-#5x'      20      '0x14 '  
        '%#-5x'      20      '0x14 '  
        '%#-5X'      20      '0X14 '  
     "/   '%x'   -20      '-14'  
        '%o'         20      '24'  
        '%o'          0      '0'  
        '%#o'        20      '024'  
        '%#o'         0      '0'  
        '%5o'        20      '   24'  
        '%-5o'       20      '24   '  
        '%#5o'       20      '  024'  
        '%-#5o'      20      '024  '  
        '%#-5o'      20      '024  '  
        '%-#05o'     20      '024  '  
        '%#05o'      20      '00024'  

        '%2d'      1234      '1234'  
     "/   '%2.2d'    1234      '1234'  
        '%2x'        10      ' a'  
        '%2X'        10      ' A'  
        '%02x'       10      '0a'  
        '%02X'       10      '0A'  
     "/   '%o'   -20      '-24'  
        '%#5d'       20      '   20'
        '%-#5d'     -20      '-20  '
        '%-#5d'     -20      '-20  '
        '%-#05d'    -20      '-20  '
        '%#05d'     -20      '-0020'
        '%-#5d'      20      '20   '
        '%-#5d'      20      '20   '
        '%-#05d'     20      '20   '
        '%-#05x'     20      '0x14 '
        '%#05x'      20      '0x014'
    ) inGroupsOf:3 do:[:fmt :val :expected|
        |printfGenerated stxGenerated|

        printfGenerated := val printfPrintString:fmt.
        stxGenerated := PrintfScanf printf:fmt argument:val.
        self assert:(stxGenerated = printfGenerated).
        self assert:(printfGenerated = expected).
    ].

    "/ hex

    self assert:( (PrintfScanf printf:'%x' argument:-20) = '-14' ).
    self assert:( (PrintfScanf printf:'%#x' argument:-20) = '-0x14' ).
    self assert:( (PrintfScanf printf:'%#7x' argument:-20) = '  -0x14' ).
    self assert:( (PrintfScanf printf:'%-#7x' argument:-20) = '-0x14  ' ).
    self assert:( (PrintfScanf printf:'%-#07x' argument:-20) = '-0x14  ' ).
    self assert:( (PrintfScanf printf:'%#07x' argument:-20) = '-0x0014' ).

    "/ octal

    self assert:( (PrintfScanf printf:'%o' argument:-20) = '-24' ).
    self assert:( (PrintfScanf printf:'%#o' argument:-20) = '-024' ).
    self assert:( (PrintfScanf printf:'%#5o' argument:-20) = ' -024' ).
    self assert:( (PrintfScanf printf:'%-#5o' argument:-20) = '-024 ' ).
    self assert:( (PrintfScanf printf:'%-#05o' argument:-20) = '-024 ' ).
    self assert:( (PrintfScanf printf:'%#05o' argument:-20) = '-0024' ).
!

testPrintf_LargeFloat
    "/ LargeFloat- unfinished

    self 
        skipIf:(Smalltalk isSmalltalkDevelopmentSystem not)
        description:'work in progress'.

    self 
        skipIf:(Smalltalk at:#LargeFloat) isNil  
        description:'LargeFloat is not loaded'.

    self assert:( (PrintfScanf printf:'%.4f' argument:LargeFloat pi)  = '3.1416' ).
    self assert:( (PrintfScanf printf:'%.8f' argument:LargeFloat pi)  = '3.14159265' ).
    self assert:( (PrintfScanf printf:'%f' argument:LargeFloat pi)  = '3.141593' ).

    "/ too small
    self assert:( (LargeFloat pi printfPrintString:'%4Lf') = '3.141593' ).
    self assert:( (LargeFloat pi printfPrintString:'%5Lf') = '3.141593' ).
    self assert:( (LargeFloat pi printfPrintString:'%6Lf') = '3.141593' ).
    self assert:( (LargeFloat pi printfPrintString:'%7Lf') = '3.141593' ).
    "/ fit
    self assert:( (LargeFloat pi printfPrintString:'%8Lf') = '3.141593' ).
    self assert:( (LargeFloat pi printfPrintString:'%4.2Lf') = '3.14' ).
    self assert:( (LargeFloat pi printfPrintString:'%4.3Lf') = '3.142' ).
    self assert:( (LargeFloat pi printfPrintString:'%4.4Lf') = '3.1416' ).
    self assert:( (LargeFloat pi printfPrintString:'%4.5Lf') = '3.14159' ).
    self assert:( (LargeFloat pi printfPrintString:'%4.6Lf') = '3.141593' ).
    
    "/ exact (to 130 digits)  value is:
    "/ 3.1415926535 8979323846 2643383279 5028841971 6939937510 5820974944 5923078164 0628620899 8628034825 3421170679 8214808651 3282306647 
    "/ ((LargeFloat fromString:'3.141592653589793238462643383279') printfPrintString:'%4.20Lf')
    self assert:( (LargeFloat pi printfPrintString:'%4.20Lf') = '3.14159265358979323846' ).
    "/ left filled                                              
    self assert:( (LargeFloat pi printfPrintString:'%9Lf') = ' 3.141593' ).
    "/ right filled
    self assert:( (LargeFloat pi printfPrintString:'%-9Lf') = '3.141593 ' ).

    "Created: / 10-10-2017 / 16:25:25 / cg"
    "Modified: / 05-06-2019 / 20:15:13 / Claus Gittinger"
    "Modified (comment): / 22-07-2019 / 19:40:10 / Claus Gittinger"
!

testPrintf_LongFloat
    "/ LongFloat
    
    self assert:( (PrintfScanf printf:'%.4f' argument:LongFloat pi)  = '3.1416' ).
    self assert:( (PrintfScanf printf:'%.8f' argument:LongFloat pi)  = '3.14159265' ).
    self assert:( (PrintfScanf printf:'%f' argument:LongFloat pi)  = '3.14159265' ).

    "/ LongFloat

    "/ too small
    self assert:( (LongFloat pi printfPrintString:'%4Lf') = '3.141593' ).
    self assert:( (LongFloat pi printfPrintString:'%5Lf') = '3.141593' ).
    self assert:( (LongFloat pi printfPrintString:'%6Lf') = '3.141593' ).
    self assert:( (LongFloat pi printfPrintString:'%7Lf') = '3.141593' ).
    "/ fit
    self assert:( (LongFloat pi printfPrintString:'%8Lf') = '3.141593' ).
    self assert:( (LongFloat pi printfPrintString:'%4.2Lf') = '3.14' ).
    "/ left filled
    self assert:( (LongFloat pi printfPrintString:'%9Lf') = ' 3.141593' ).
    "/ right filled
    self assert:( (LongFloat pi printfPrintString:'%-9Lf') = '3.141593 ' ).

    "Created: / 10-10-2017 / 12:35:40 / cg"
    "Modified: / 10-10-2017 / 16:29:56 / cg"
!

testPrintf_Misc

    "/ verify that our printf generates the same string as the system-printf.
    "/ Checks of printfPrintString: are here to make sure, that the system's printf is doing it right...)
    self assert:( (20 printfPrintString:'%%%d') = '%20' ).
    self assert:( (20 printfPrintString:'%d%%') = '20%' ).
    self assert:( (20 printfPrintString:'%d%') = '20' ).

    #(
        '%r'       1234      'r'  
        '%3r'      1234      '  r'  
        '%-3r'      1234     'r  '  
        '%#r'      1234      'r'  
      "/  '%v'       1234      'v'  
        '%Id'      1234      'Id'  
        '%%%d'         20      '%20'  
        '%d%%'         20      '20%'  
        '%d%'          20      '20'  
        '%%a%%'        20      '%a%'  
    ) inGroupsOf:3 do:[:fmt :val :expected|
        |printfGenerated stxGenerated|

        printfGenerated := val printfPrintString:fmt.
        stxGenerated := PrintfScanf printf:fmt argument:val.
        self assert:(stxGenerated = printfGenerated).
        self assert:(printfGenerated = expected).
    ].
!

testPrintf_QDouble
    "/ QDouble

    self 
        skipIf:(OperatingSystem isUNIXlike and:[ExternalAddress pointerSize = 4])
        description:'Fails under Linux32'.

    self assert:( (PrintfScanf printf:'%.4f' argument:QDouble pi)  = '3.1416' ).
    self assert:( (PrintfScanf printf:'%.8f' argument:QDouble pi)  = '3.14159265' ).
    self assert:( (PrintfScanf printf:'%f' argument:QDouble pi)    = '3.14159265358979323846' ).
    "/ QuadDouble

    "/ too small
    self assert:( (QDouble pi printfPrintString:'%4Lf') = '3.14159265358979323846' ).
    self assert:( (QDouble pi printfPrintString:'%5Lf') = '3.14159265358979323846' ).
    self assert:( (QDouble pi printfPrintString:'%6Lf') = '3.14159265358979323846' ).
    self assert:( (QDouble pi printfPrintString:'%7Lf') = '3.14159265358979323846' ).
    self assert:( (QDouble pi printfPrintString:'%18Lf') = '3.14159265358979323846' ).
    self assert:( (QDouble pi printfPrintString:'%19Lf') = '3.14159265358979323846' ).
    self assert:( (QDouble pi printfPrintString:'%20Lf') = '3.14159265358979323846' ).
    self assert:( (QDouble pi printfPrintString:'%21Lf') = '3.14159265358979323846' ).
    "/ fit
    self assert:( (QDouble pi printfPrintString:'%22Lf') = '3.14159265358979323846' ).
    self assert:( (QDouble pi printfPrintString:'%4.2Lf') = '3.14' ).
    "/ left filled
    self assert:( (QDouble pi printfPrintString:'%23Lf') = ' 3.14159265358979323846' ).
    self assert:( (QDouble pi printfPrintString:'%30Lf') = '        3.14159265358979323846' ).
    "/ right filled
    self assert:( (QDouble pi printfPrintString:'%-30Lf') = '3.14159265358979323846        ' ).

    "Created: / 10-10-2017 / 12:24:22 / cg"
    "Modified: / 10-10-2017 / 16:28:51 / cg"
!

testPrintf_ShortFloat
    self assert:( (PrintfScanf printf:'%.4f' argument:ShortFloat pi) = '3.1416' ).
    self assert:( (PrintfScanf printf:'%f' argument:ShortFloat pi) = '3.14159' ).

    "/ ShortFloat

    "/ too small
    self assert:( (ShortFloat pi printfPrintString:'%4f') = '3.141593' ).
    self assert:( (ShortFloat pi printfPrintString:'%5f') = '3.141593' ).
    self assert:( (ShortFloat pi printfPrintString:'%6f') = '3.141593' ).
    self assert:( (ShortFloat pi printfPrintString:'%7f') = '3.141593' ).
    "/ fit
    self assert:( (ShortFloat pi printfPrintString:'%8f') = '3.141593' ).
    self assert:( (ShortFloat pi printfPrintString:'%4.2f') = '3.14' ).

    "/ left filled
    self assert:( (ShortFloat pi printfPrintString:'%9f') = ' 3.141593' ).
    self assert:( (ShortFloat pi printfPrintString:'%8.4f') = '  3.1416' ).

    "/ right filled
    self assert:( (ShortFloat pi printfPrintString:'%-9f') = '3.141593 ' ).
    self assert:( (ShortFloat pi printfPrintString:'%-8.4f') = '3.1416  ' ).

    "Created: / 10-10-2017 / 12:35:12 / cg"
    "Modified: / 10-10-2017 / 16:32:31 / cg"
! !

!NumberTest methodsFor:'tests-reading'!

testReadFrom
    self assert: 1.0e-14    = (Number readFrom: '1.0e-14').

    self assert: ('1' asNumber = 1).
    self assert: ('10' asNumber = 10).

    self assert: ('-1' asNumber = -1).
    self assert: ('-10' asNumber = -10).

    self assert: ('1e' asNumber = 1).
    self assert: ('1e1' asNumber = 10).
    self assert: ('1e10' asNumber = 10000000000).

    self assert: ('-1e' asNumber = -1).
    self assert: ('-1e1' asNumber = -10).
    self assert: ('-1e10' asNumber = -10000000000).

    self assert: ('1.0e' asNumber = 1.0).
    self assert: ('1.0e1' asNumber = 10.0).
    self assert: ('1.0e10' asNumber = 10000000000.0).

    self assert: ('-1.0e' asNumber = -1.0).
    self assert: ('-1.0e1' asNumber = -10.0).
    self assert: ('-1.0e10' asNumber = -10000000000.0).

    self assert: ('22.2' asNumber = 22.2).
    self assert: ('-22.2' asNumber = -22.2).

    Smalltalk isSmalltalkX ifTrue:[
        "/ st/x requires this:

        self assert: ((Number readSmalltalkSyntaxFrom:'10r22.2') = 22.2).
        self assert: ((Number readSmalltalkSyntaxFrom:'10r22.2s5') = 22.2).

        self assert: ((Number readSmalltalkSyntaxFrom:'10r-22.2') = -22.2).
        self assert: ((Number readSmalltalkSyntaxFrom:'10r-22.2s5') = -22.2).

        "/ test fails when stc code, byte code works
        (Helper 
            isStcCompiledMethod:#'testReadFrom'
            in:self) ifTrue:[ 
                self logSkipped:'2r1e26 is not valid in stc code -> debugger doesNotUnderstand: #e26'.
            ] ifFalse:[    
                self assert: 2r1e26     = (Number readSmalltalkSyntaxFrom: '2r1e26').
            ].

        self assert: ('-1q' asNumber = -1).
        self assert: ('-1q' asNumber class == LongFloat).

        self assert: ('-1q1' asNumber = -10).
        self assert: ('-1q10' asNumber = -10000000000).

    ] ifFalse:[
        "/ squeak allows this:
        self assert: 2r1e26     = (Number readFrom: '2r1e26').

        self assert: ('10r22.2' asNumber = 22.2).
        self assert: ('10r22.2s5' asNumber = 22.2).

        self assert: ('10r-22.2' asNumber = -22.2).
        self assert: ('10r-22.2s5' asNumber = -22.2).
    ].

    "Modified: / 20-06-2017 / 14:05:37 / cg"
! !

!NumberTest class methodsFor:'documentation'!

version
    ^ '$Header$'
!

version_CVS
    ^ '$Header$'
! !