"{ 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)."
(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
"
! !
!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:'%.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' ).
"/ 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 ' ).
"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_LargeFloat
"/ LongFloat
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' ).
"/ LongFloat
"/ 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' ).
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"
!
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_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$'
! !