On Mon, Mar 6, 2017 at 9:21 PM, Sven Van Caekenberghe <s...@stfx.eu> wrote:
>
>> On 6 Mar 2017, at 14:12, Ben Coman <b...@openinworld.com> wrote:
>>
>>
>>
>> On Mon, Mar 6, 2017 at 5:54 PM, Sven Van Caekenberghe <s...@stfx.eu> wrote:
>> Here is a concrete proposal:
>>
>> https://pharo.fogbugz.com/f/cases/19802/Make-sure-Symbol-concatenation-results-in-a-Symbol-not-a-String
>>
>> This gives the following assertions:
>>
>>         "Concatenating 2 symbols results in abother symbol"
>>         self assert: (#foo , #bar) == #foobar.
>>
>>         "Concatenating the empty symbol does not change a symbol"
>>         self assert: (#foo, emptySymbol) == #foo.
>>         self assert: (emptySymbol, #foo) == #foo.
>>
>>         "Strings and symbols can still be mixed, the receiver determines the 
>> result type"
>>         "Symbol receiver gives symbol result"
>>         self assert: (#foo , 'bar') == #foobar.
>>         "String receiver gives string result"
>>         self deny: ('foo' , #bar) == #foobar.
>>         self assert: ('foo' , #bar) equals: #foobar.
>>         self assert: ('foo' , #bar) equals: 'foobar'.
>>
>>
>> Those last two seem contradictory.
>
> No, Symbols and String can be used interchangeably in Pharo in lots of 
> contexts. Particularly when comparing them, it makes no difference, all the 
> following are/have always been true, independent of this change:
>
>  #foo = 'foo'
>  'foo' = #foo
>  #foo = #foo
>  'foo' = 'foo'

Ah-ha... gotchya.  always something more to learn.

So those last three lines a testing that it is a String?
This meaning is pretty well hidden in the implicit behaviour.
Why not just...
    self assert: (#foo , 'bar') isString
which seems to better "says what it means"

If such is poor form in general,
I'm curious to what degree such rules may be relaxed for unit tests.
Could it be considered something like premature optimisation
to make the test too generic??  If isString latter causes a problem later,
deal with it then.

====
On another slightly different point,
this might be one case where #assert:#equals is less clear than using "="

Its also easy to mis-think the following is contradictory
>>         self deny: ('foo' , #bar) == #foobar.
>>         self assert: ('foo' , #bar) equals: #foobar.

where the alternative here makes the distinction more clear...
    self deny: ('foo' , #bar) == #foobar.
    self assert: ('foo' , #bar) = #foobar.


cheers -ben

Reply via email to