[squeak-dev] The Trunk: KernelTests-nice.96.mcz

commits at source.squeak.org commits at source.squeak.org
Fri Sep 25 22:51:40 UTC 2009


Nicolas Cellier uploaded a new version of KernelTests to project The Trunk:
http://source.squeak.org/trunk/KernelTests-nice.96.mcz

==================== Summary ====================

Name: KernelTests-nice.96
Author: nice
Time: 25 September 2009, 10:51:15 am
UUID: b5940d3a-85f7-3f46-9fd1-5c1a4fb86206
Ancestors: KernelTests-ar.95

Tests for nan comparison from http://bugs.squeak.org/view.php?id=6719

=============== Diff against KernelTests-ar.95 ===============

Item was added:
+ ----- Method: FloatTest>>testNaNCompare (in category 'NaN behavior') -----
+ testNaNCompare
+ 	"IEEE 754 states that NaN cannot be ordered.
+ 	As a consequence, every arithmetic comparison involving a NaN SHOULD return false.
+ 	Except the is different test (~=).
+ 	This test does verify this rule"
+ 	
+ 	| compareSelectors theNaN anotherNaN comparand brokenMethods warningMessage |
+ 	compareSelectors := #(#< #<= #> #>= #=).
+ 	theNaN := Float nan.
+ 	anotherNaN := Float infinity - Float infinity.
+ 	comparand := {1. 2.3. Float infinity. 2/3. 1.25s2. 2 raisedTo: 50}.
+ 	comparand := comparand , (comparand collect: [:e | e negated]).
+ 	comparand := comparand , {theNaN. anotherNaN}.
+ 
+ "do a first pass to collect all broken methods"
+ 	brokenMethods := Set new.
+ 	comparand do: [:comp |
+ 		compareSelectors do: [:op |
+ 			(theNaN perform: op with: comp) ifTrue: [brokenMethods add: (theNaN class lookupSelector: op)].
+ 			(comp perform: op with: theNaN) ifTrue: [brokenMethods add: (comp class lookupSelector: op)]].
+ 		(theNaN ~= comp) ifFalse: [brokenMethods add: (theNaN class lookupSelector: #~=)].
+ 		(comp ~= theNaN) ifFalse: [brokenMethods add: (comp class lookupSelector: #~=)]].
+ 	
+ "build a warning message to tell about all broken methods at once"
+ 	warningMessage := String streamContents: [:s |
+ 			s nextPutAll: 'According to IEEE 754 comparing with a NaN should always return false, except ~= that should return true.'; cr.
+ 			s nextPutAll: 'All these methods failed to do so. They are either broken or call a broken one'.
+ 			brokenMethods do: [:e | s cr; print: e methodClass; nextPutAll: '>>'; print: e selector]].
+ 		
+ "Redo the tests so as to eventually open a debugger on one of the failures"
+ 	brokenMethods := Set new.
+ 	comparand do: [:comp2 |
+ 		compareSelectors do: [:op2 |
+ 			self deny: (theNaN perform: op2 with: comp2) description: warningMessage.
+ 			self deny: (comp2 perform: op2 with: theNaN) description: warningMessage].
+ 		self assert: (theNaN ~= comp2) description: warningMessage.
+ 		self assert: (comp2 ~= theNaN) description: warningMessage].!




More information about the Squeak-dev mailing list