tests/MessageTracerTests.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Mon, 28 Aug 2017 16:16:00 +0100
branchjv
changeset 4259 4f1299274d32
permissions -rw-r--r--
Added (some) tests for `MessageTracer`

"{ Package: 'stx:libbasic3/tests' }"

"{ NameSpace: Smalltalk }"

TestCase subclass:#MessageTracerTests
	instanceVariableNames:'methods'
	classVariableNames:''
	poolDictionaries:''
	category:'System-Debugging-Support-Tests'
!


!MessageTracerTests methodsFor:'change & update'!

update: aspect with: param from: sender
    aspect == #methodTrap ifTrue:[
        methods add: (param changeClass >> param changeSelector)
    ].

    "Created: / 28-08-2017 / 17:45:42 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!MessageTracerTests methodsFor:'private'!

add: x to: y
    ^ x + y

    "Created: / 28-08-2017 / 15:59:53 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!MessageTracerTests methodsFor:'running'!

setUp
    Smalltalk addDependent: self.
    methods := Set new.

    "Created: / 28-08-2017 / 17:41:53 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

tearDown
    Smalltalk removeDependent: self.
    methods do:[:method | MessageTracer unwrapMethod: method ]

    "Created: / 28-08-2017 / 16:01:28 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 28-08-2017 / 17:42:40 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!MessageTracerTests methodsFor:'tests - mocking'!

test_mock_01a
    
    self assert: (self add: 1 to: 1) == 2.
    MessageTracer mock: #add:to: in: self class do: [ 0 ].
    self assert: (self add: 1 to: 1) == 0.

    "Created: / 28-08-2017 / 16:02:54 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_mock_01b
    
    self assert: (self add: 1 to: 1) == 2.
    MessageTracer mock: #add:to: in: self class do: [ :r :x :y | r ].
    self assert: (self add: 1 to: 1) == self.

    "Created: / 28-08-2017 / 16:04:06 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_mock_01c
    
    self assert: (self add: 1 to: 1) == 2.
    MessageTracer mock: #add:to: in: self class do: [ :r :x :y | x - y ].
    self assert: (self add: 1 to: 2) == -1.

    "Created: / 28-08-2017 / 16:04:24 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_mock_01d
    
    self assert: (self add: 1 to: 1) == 2.
    MessageTracer mock: #add:to: in: self class do: [ :r :x :y :m | (m valueWithReceiver: r arguments: { x . y }) + 10 ].
    self assert: (self add: 1 to: 3) == 14.

    "Created: / 28-08-2017 / 16:05:59 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_mock_02a
    | blocker value |
    
    self assert: (self add: 1 to: 1) == 2.

    MessageTracer mock: #add:to: in: self class do:[ 0 ].
    blocker := Semaphore new: 0.
    [ 
        value := self add: 10 to: -5.
        blocker signal.
    ] fork.
    blocker wait.
    self assert: value == 0.

    "Created: / 28-08-2017 / 16:08:08 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_mock_02b
    | blocker1 blocker2 value |
    
    self assert: (self add: 1 to: 1) == 2.

    MessageTracer mock: #add:to: in: self class do:[ 0 ].
    blocker1 := Semaphore new: 0.
    [ 
        blocker2 := Semaphore new: 0.
        [
            value := self add: 10 to: -5.
            blocker2 signal.
        ] fork.
        blocker2 wait.
        blocker1 signal.
    ] fork.
    blocker1 wait.
    self assert: value == 0.

    "Created: / 28-08-2017 / 16:10:30 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

test_mock_03a
    | blocker1 blocker2 threads |
    

    threads := Set new.    

    MessageTracer mock: #newProcess in: Block do:[:r :m |
        | p |

        p := m valueWithReceiver: r arguments: #().
        threads add: p.
        p
    ].
    ObjectMemory flushCaches.
    blocker1 := Semaphore new: 0.
    [ 
        blocker2 := Semaphore new: 0.
        [
            blocker2 signal.
        ] fork.
        blocker2 wait.
        blocker1 signal.
    ] fork.
    blocker1 wait.
    self assert: threads size == 2.

    "Created: / 28-08-2017 / 16:24:35 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!MessageTracerTests class methodsFor:'documentation'!

version_HG

    ^ '$Changeset: <not expanded> $'
! !