Ben,

I tried to avoid #isString and #isSymbol and I thought it was clear that 
#assert:equals: used #= but I agree that I could be more explicit. Here is the 
changed version of the unit test (.2 of slice):

testConcatenationIsSymbol
        "Concatenating 2 symbols results in another symbol"
        self assert: (#foo , #bar) isSymbol.
        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') isSymbol.
        self assert: (#foo , 'bar') == #foobar.
        "String receiver gives String result"
        self assert: ('foo' , #bar) isString.
        self assert: ('foo' , #bar) = 'foobar'.
        "Strings and Symbols still compare content-wise"
        self assert: ('foo' , #bar) = #foobar.
        "But Strings and Symbols are not identical"
        self deny: ('foo' , #bar) == #foobar.


> On 6 Mar 2017, at 15:18, Ben Coman <b...@openinworld.com> wrote:
> 
> 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