[squeak-dev] The Inbox: SUnitTools-jr.5.mcz
christoph.thiede at student.hpi.uni-potsdam.de
christoph.thiede at student.hpi.uni-potsdam.de
Sun Jan 16 20:30:03 UTC 2022
Hi Jakob,
please find the attached changeset, which revises the changes, allows the user to edit the new test case definition before creating it, and uses the 'KernelTests-Objects' pattern for test category derivation which is known from most Trunk packages. No further heuristics for related class search are included. I also revised the logic for subclass templates in the Kernel package a bit. If you like it, I can merge it into the Trunk. :-)
(At a later point in time, we might want to create a hook in the ToolSet for creating a new subclass and also make use of it in Parser>>#defineClass:. But for now, I think the change is fine.)
=============== Diff ===============
BasicClassOrganizer>>categoryForTestCases {*SUnitTools-accessing} · jr 3/5/2020 22:07
+ categoryForTestCases
+ ^ self categories
+ detect: [:each | each beginsWith: 'test']
+ ifNone: [Categorizer allCategory]
Browser>>newClassContents {accessing} · ct 1/16/2022 20:57 (changed)
newClassContents
- | theClassName |
- ^ (theClassName := self selectedClassName)
- ifNil:
- [Class template: self selectedSystemCategory]
- ifNotNil:
- [Class templateForSubclassOf: theClassName asString category: self selectedSystemCategory]
+
+ ^ self selectedClass
+ ifNil: [Class template: self selectedSystemCategory]
+ ifNotNil: [:theClass | theClass templateForSubclassInCategory: self selectedSystemCategory]
Class class>>template: {instance creation} · ct 1/16/2022 21:19 (changed)
- template: aSystemCategoryName
+ template: systemCategoryName
"Answer an expression that can be edited and evaluated in order to define a new class."
- ^ self templateForSubclassOf: Object name category: aSystemCategoryName
+ ^ Object templateForSubclassInCategory: systemCategoryName
Class class>>templateForSubclassOf:category: {instance creation} · ct 1/16/2022 20:58 (changed)
templateForSubclassOf: priorClassName category: systemCategoryName
"Answer an expression that can be edited and evaluated in order to define a new class, given that the class previously looked at was as given"
+ self deprecated: 'ct: Use Class >> #templateForSubclassInCategory:'.
^priorClassName asString, ' subclass: #NameOfSubclass
instanceVariableNames: ''''
classVariableNames: ''''
poolDictionaries: ''''
category: ''' , systemCategoryName asString , ''''
Class>>templateForSubclassInCategory: {subclass creation} · ct 1/16/2022 21:19
+ templateForSubclassInCategory: categoryName
+ "Answer an expression that can be edited and evaluated in order to define a new class."
+
+ ^ self
+ templateForSubclassNamed: #NameOfSubclass
+ category: categoryName
Class>>templateForSubclassNamed:category: {subclass creation} · ct 1/16/2022 21:19
+ templateForSubclassNamed: subclassName category: categoryName
+ "Answer an expression that can be edited and evaluated in order to define a new class."
+
+ ^ '<1p> subclass: <2p>
+ instanceVariableNames: ''''
+ classVariableNames: ''''
+ poolDictionaries: ''''
+ category: <3p>' expandMacrosWithArguments:
+ {self. subclassName asSymbol. categoryName}
CodeHolder>>testBrowseClassNamed:possibleMessageNamed: {*SUnitTools-running} · ct 1/16/2022 21:15 (changed)
testBrowseClassNamed: aClassName possibleMessageNamed: aMessageName
| cls selector |
- (self class environment hasClassNamed: aClassName) ifFalse: ["no dice" ^ self].
+ (self class environment hasClassNamed: aClassName)
+ ifFalse: [^ false].
cls := self class environment classNamed: aClassName.
(aMessageName notNil and: [cls includesLocalSelector: (selector := aMessageName asSymbol)])
ifTrue: [ToolSet browse: cls selector: selector]
- ifFalse: [ToolSet browseClass: cls].
+ ifFalse: [ToolSet browseClass: cls category:
+ cls organization categoryForTestCases].
+
+ ^ true
CodeHolder>>testFindTest {*SUnitTools-running} · ct 1/16/2022 21:21 (changed)
testFindTest
| cls destClassName destMessage |
cls := self selectedClass ifNil: [^ self].
destClassName := cls name asString, 'Test'.
destMessage := self selectedMessageName ifNotNil: [:name | self testSelectorFrom: name].
- self testBrowseClassNamed: destClassName possibleMessageNamed: destMessage
+
+ (self testBrowseClassNamed: destClassName possibleMessageNamed: destMessage)
+ ifTrue: [^ self].
+ (Project uiManager
+ chooseFromLabeledValues: (OrderedDictionary new
+ at: 'Create test case' translated put: [self testMakeTestCaseClassFor: destClassName];
+ at: 'Cancel' translated put: [];
+ yourself)
+ title: ('There is no test for {1}' translated
+ format: {self selectedMessageName ifNil: [cls]})) value.
CodeHolder>>testMakeTestCaseClassFor: {*SUnitTools-running} · ct 1/16/2022 21:21
+ testMakeTestCaseClassFor: className
+
+ | category template |
+ self selectedClassOrMetaClass ifNil: [^ self].
+ self okToChange ifFalse: [^ self].
+
+ category := (self selectedClass category findTokens: $-) in: [:testedCategoryTokens |
+ ({testedCategoryTokens first , 'Tests'} , testedCategoryTokens allButFirst)
+ joinSeparatedBy: $-].
+ template := TestCase
+ templateForSubclassNamed: className
+ category: category.
+ (Browser fullOnCategory: category)
+ editSelection: #newClass;
+ contentsChanged;
+ changed: #editString with: template.
Best,
Christoph
---
Sent from Squeak Inbox Talk
On 2022-01-10T18:24:35+01:00, jakres+squeak at gmail.com wrote:
> Since there are so many different combinations you can probably make this
> arbitrarily complex. Then 7/8 of the feature are the guessing of the
> category. The question is whether it is worth it.
>
> You could search all registered packages that start with the same stem for
> subclasses of TestCase. That may introduce some unwanted dependency between
> trunk packages, so you may want to stick to categories rather than packages
> instead. You may program for the known patterns, so add your *Tests-*
> pattern to the list. Which one comes next? If there is no existing test
> category with the stem, which of the conventions do you choose?
>
> Per KISS I would stick to just one convention, which can also be the one
> you mentioned rather than the one I implemented. Changing the category of
> the class afterwards should be easy enough.
>
> <christoph.thiede at student.hpi.uni-potsdam.de> schrieb am Mo., 10. Jan.
> 2022, 18:02:
>
> > Hi Jakob,
> >
> > while reviewing this patch, I noticed that the category heuristic does not
> > work in all situations. For example, it classifies a newly created
> > WideSymbolTest under Collections-Tests rather than CollectionTests-Text. Do
> > you have an idea how to improve the heuristic (e.g., search for other test
> > classes in the same package, ...)? :)
> >
> > Best,
> > Christoph
> >
> > ---
> > *Sent from **Squeak Inbox Talk
> > <https://github.com/hpi-swa-lab/squeak-inbox-talk>*
> >
> > On 2020-03-07T14:08:02+00:00, christoph.thiede at student.hpi.uni-potsdam.de
> > wrote:
> >
> > > Ah, ok :-)
> > >
> > > <http://www.hpi.de/>
> > > ________________________________
> > > Von: Squeak-dev <squeak-dev-bounces at lists.squeakfoundation.org> im
> > Auftrag von Jakob Reschke <forums.jakob at resfarm.de>
> > > Gesendet: Samstag, 7. März 2020 14:57:12
> > > An: The general-purpose Squeak developers list
> > > Betreff: Re: [squeak-dev] The Inbox: SUnitTools-jr.5.mcz
> > >
> > >
> > >
> > > Thiede, Christoph <Christoph.Thiede at student.hpi.uni-potsdam.de
> > <mailto:Christoph.Thiede at student.hpi.uni-potsdam.de>> schrieb am Sa.,
> > 7. März 2020, 14:31:
> > >
> > > What is the reason to use ClassBuilder instead of
> > #subclass:instanceVariableNames:classVariableNames:poolDictionaries:category:?
> > >
> > > The ability to specify the target environment.
> > > -------------- next part --------------
> > > An HTML attachment was scrubbed...
> > > URL: <
> > http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20200307/0bf3af36/attachment.html
> > >
> > >
> > >
> >
> -------------- next part --------------
> An HTML attachment was scrubbed...
> URL: <http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20220110/790ecbf5/attachment.html>
>
>
["makeTestCaseClass.2.cs"]
["makeTestCaseClass-1-ask.png"]
["makeTestCaseClass-2-define.png"]
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20220116/56417e72/attachment-0001.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: makeTestCaseClass.2.cs
Type: application/octet-stream
Size: 3956 bytes
Desc: not available
URL: <http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20220116/56417e72/attachment-0003.obj>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: makeTestCaseClass-2-define.png
Type: application/octet-stream
Size: 55497 bytes
Desc: not available
URL: <http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20220116/56417e72/attachment-0004.obj>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: makeTestCaseClass-1-ask.png
Type: application/octet-stream
Size: 7457 bytes
Desc: not available
URL: <http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20220116/56417e72/attachment-0005.obj>
More information about the Squeak-dev
mailing list
|