[prev in list] [next in list] [prev in thread] [next in thread] 

List:       squeak-dev
Subject:    Re: [GOODIE] TestMaker 0.2 [CSOTD]
From:       "David T. Lewis" <lewis () mail ! msen ! com>
Date:       2001-12-30 6:39:24
[Download RAW message or body]

On Sat, Dec 29, 2001 at 06:28:47PM +0300, danielv@netvision.net.il wrote:
> Sorry I was rude.
Just joking, it's OK! 

> Didn't understand default class and method name code. What would be a
> good example to use?

For example, if you do a printIt on the following expression:
	"(Array with: '5@6' with: 'Set new') evalStrings first class == Point"

The TestMaker will deduce that you want to test the method #evalStrings
in class Array. Based on this, it will prompt to ask if you want to create
the method #testEvalStrings and put it in class ArrayTestCase.

It does this by using a Scanner to parse the expression into a tree of
Smalltalk tokens, then flattening the tree into a list of tokens. It looks
for the first element in the list which is a class name (#Array in this
example). It then takes the remainder of the list and looks for the longest
combination of tokens which can be combined to form a selector in class
Array (#evalStrings in this example).

As another example,
	"((Dictionary new at: #foo put: #bar; yourself) at: #foo) == #bar"
results in test method #testAtPut and class DictionaryTestCase, while the
expression "Dictionary new at: #foo" results in test method #testAt in
class DictionaryTestCast.

There are lots of expressions for which this will not work, but perhaps
it is at least a start. At least it was a CSOTD ;)

Meanwhile I found a bug in the code which caused it to fail for expressions
like "(Array new: 3) size == 3" which contain integer tokens. A fix is
attached.

Dave


["TestMaker-0-2-changes2-dtl.1.cs" (text/plain)]

'From Squeak3.1alpha of 27 September 2001 [latest update: #4347] on 30 December 2001 \
at 1:29:26 am'!"Change Set:		TestMaker-0-2-changes2-dtlDate:			29 December \
2001Author:			David T. LewisMore changes since TestMaker-0-2-newChanges-dtlFixes a \
bug in handling expressions like '(Array new: 3) size == 3'."!!TestMaker methodsFor: \
'private' stamp: 'dtl 12/30/2001 01:06'!defaultClassAndMethodNamesFrom: aString	| \
tokens firstClass remainingTokens likelySelectorName sel ws rs c cls |	tokens :=  \
self addTreeLeaves: (Scanner new scanTokens: aString) to: OrderedCollection \
new.	firstClass := tokens detect: [:t | Smalltalk hasClassNamed: t] ifNone: [^Array \
with: '' with: ''].	remainingTokens := ((ReadStream on: tokens) upTo: firstClass; \
yourself) upToEnd.	likelySelectorName := self likelySelectorFor: (Smalltalk at: \
firstClass) fromTokenList: remainingTokens.	sel := likelySelectorName isNil		ifTrue: \
['testMethodName']		ifFalse: ['test', likelySelectorName first asUpperc!  ase \
asString, likelySelectorName allButFirst].	ws := WriteStream on: String new.	rs := \
ReadStream on: sel.	[rs atEnd] whileFalse:		[c := rs next.		(c == $:)			ifTrue: [rs \
atEnd ifFalse: [ws nextPut: (rs next asUppercase)]]			ifFalse: [ws nextPut: c]].	cls \
:= firstClass, 'TestCase'.	sel := self uniqueSelector: ws contents forClassNamed: \
cls.	^Array with: cls with: sel! !!TestMaker methodsFor: 'private' stamp: 'dtl \
12/29/2001 18:14'!likelySelectorFor: aClass fromTokenList: tokens	"TestMaker new \
likelySelectorFor: Dictionary fromTokenList: #(#one #at: foo #put: #bar #two)"	| \
selectors list rs ws everyOtherToken tokList ns candidateName |	selectors := aClass \
selectors.	list := tokens.	[list isEmpty]		whileFalse:			[rs := ReadStream on: \
list.			ws := WriteStream on: Array new.			[rs atEnd]				whileFalse:					[ws nextPut: \
rs next.					rs atEnd ifFalse: [rs next]].			everyOtherToken := ws \
contents.			tokList := everyOtherToken.			[tokList isEmpty]		!  whileFalse:					[ns \
:= WriteStream on: String new.					tokList do:  [:e | ns nextPutAll: e \
asString].					candidateName := ns contents asSymbol.					(selectors includes: \
candidateName)						ifTrue: [^candidateName].					tokList := tokList \
allButLast].			list := list allButFirst].	^nil! !



[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic