Hi guys. I found a problem while working with FuelPreview where we store objects of the graph in a Set. While doing a collect, there was an error because an implementation of #= was assuming that the argument was of a certain shape. Of course, that should answer false instead. So I wrote this test to see all existing wrong implementations:

testAllClassesImplementSafeEqualsMethod
"This tests that all classes in the system that implements #= do it in a way that they don't throw error when passing as an argument something different from expected. The correct behavior is that #= answers false."
��� | wrongClasses |
��� wrongClasses := IdentityDictionary� new.
��� �((SystemNavigation default allImplementorsOf: #=)
��� ��� ��� collect: [:each | each methodClass])
��� ��� ��� do: [:each |
��� ��� ��� ��� | instance |
��� ��� ��� ��� "Some classes like CompiledMethod override basicNew to throw an error.
��� ��� ��� ��� In any case, the comparison will be false, so no problem"
��� ��� ��� ��� [instance := each basicNew] on: Error do: [].
��� ��� ��� ��� [instance = Object new]
��� ��� ��� ��� ��� on: Error
��� ��� ��� ��� ��� do: [: err | wrongClasses at: each put: err ]].
��� self assert: wrongClasses isEmpty


The result is: {Magnitude. WideCharacterSet. KMKeymap. MCMockDefinition. ScaledDecimal. MCSnapshot}

So, my I think we should change #= in those classes by adding:

��� self == aKeymap
��� ��� ifTrue: [ ^ true ].
��� self class = aKeymap class
��� ��� ifFalse: [ ^ false ].

at the beginning of the #=

what do you think?� if agree, I open an issue.


--
Mariano
http://marianopeck.wordpress.com