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