RegressionTests__NumberTest.st
author mawalch
Tue, 22 Aug 2017 17:55:04 +0200
changeset 1681 689d71ff5f53
parent 1628 27b3c920623a
child 1710 9ad2831a971b
permissions -rw-r--r--
New RegressionTests class ImageTests

"{ 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:'running'!

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)."

    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
    "
! !

!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
    "/ Float
    
    self assert:( (PrintfScanf printf:'%4f' argument:ShortFloat pi) = '3.14159' ).
    self assert:( (PrintfScanf printf:'%4f' argument:Float pi)      = '3.141593' ).
    self assert:( (PrintfScanf printf:'%4f' argument:LongFloat pi)  = '3.14159265' ).
    self assert:( (PrintfScanf printf:'%4f' argument:QDouble pi)    = '3.14159265358979323846' ).
    self assert:( (PrintfScanf printf:'%4f' argument:Fraction pi)   = '3.141593' ).
    self assert:( (PrintfScanf printf:'%4f' argument:FixedPoint 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' ).
    "/ right filled
    self assert:( (Float pi printfPrintString:'%-9f') = '3.141593 ' ).

    "/ 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' ).
    "/ right filled
    self assert:( (ShortFloat pi printfPrintString:'%-9f') = '3.141593 ' ).

    "/ 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 ' ).

    "/ 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: / 03-07-2017 / 15:01:50 / 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).

        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$'
! !