Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Migrating from SUnit to Phexample

Tags:

I'm trying out Pharo's Phexample and I like it, but it feels clumsy to have half my unit tests in SUnit and the other half in Phexample. Does Phexample have like an import feature for my existing tests?

like image 527
gulliver Avatar asked Nov 20 '09 11:11

gulliver


1 Answers

Concerning the expectation matchers, there is a series of rewrite rules on the class side of PhexMatcher. This screencast explains how to use RB's rewrite engine: Code Critics in OB (OB Screencast 3).

First use these rules

RBParseTreeRewriter new
    replace: 'self assert: [ `@expression ]' with: 'self assert: `@expression';
    replace: 'self deny: `@expression' with: 'self assert: `@expression not';
    yourself.

Then use these rules

RBParseTreeRewriter new
    replace: 'self assert: `@value = `@expected' with: '`@value should = `@expected';
    replace: 'self assert: `@value ~= `@expected' with: '`@value should not = `@expected';
    replace: 'self assert: `@value > `@expected' with: '`@value should > `@expected';
    replace: 'self assert: `@value < `@expected' with: '`@value should < `@expected';
    replace: 'self assert: `@value >= `@expected' with: '`@value should >= `@expected';
    replace: 'self assert: `@value <= `@expected' with: '`@value should <= `@expected';
    replace: 'self assert: (`@value isKindOf: `@type)' with: '`@value should beKindOf: `@type';
    replace: 'self assert: `@expression isNil' with: '`@expression should be isNil';
    replace: 'self assert: `@expression notNil' with: '`@expression should be notNil';
    replace: 'self assert: `@expression `test not' with: '`@expression should not be `test'
        when: [:node | node arguments first receiver selector matchesRegex: '(is|has|not).+|atEnd' ];
    replace: 'self assert: `@expression `test' with: '`@expression should be `test'
        when: [:node | node arguments first selector matchesRegex: '(is|has|not).+|atEnd' ];
    replace: 'self assert: (`@collection includes: `@element) not' with: '`@collection should not be includes: `@element';
    replace: 'self assert: (`@collection includes: `@element)' with: '`@collection should be includes: `@element';
    yourself.

Concerning the introduction of dependencies between test, you have to rewrite your tests by Hand. For JExample there is JUnit2JExample but alas there is not automagic migration for Smalltalk (yet).


PS: if you are using the latest Pharo image you must use OB and revert the OB-Refactory package to get scoped rewrite rules working. Just execute

SystemBrowser default: OBSystemBrowserAdaptor.
Gofer new
    wiresong: 'ob';
    addPackage: 'OB-Refactory';
    revert
like image 50
akuhn Avatar answered Oct 25 '22 04:10

akuhn