tests/RGMethodDefinitionTest.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Mon, 31 Aug 2015 14:01:56 +0100
changeset 3 ed5aae792d24
parent 2 e439b82dda7d
permissions -rw-r--r--
More Smalltalk/X API methods. Better RGClassDefinition creation. RGClassDefinition>>newClass now creates a metaclass.

"{ Package: 'stx:goodies/ring/tests' }"

"{ NameSpace: Smalltalk }"

TestCase subclass:#RGMethodDefinitionTest
	instanceVariableNames:''
	classVariableNames:''
	poolDictionaries:''
	category:'Ring-Core-Kernel-Tests'
!

RGMethodDefinitionTest comment:'SUnit tests for method definitions'
!

!RGMethodDefinitionTest methodsFor:'* As yet uncategorized *'!

foo	^ 'second version'
! !

!RGMethodDefinitionTest methodsFor:'testing'!

testAsActive
    | newMethod |

    RGMethodDefinitionTest compile: 'foo        ^ ''first version'''.
    newMethod := (RGMethodDefinitionTest >> #foo) asActiveRingDefinition.
    self assert: newMethod isActive.    
    self assert: newMethod sourceCode = newMethod compiledMethod sourceCode.

    RGMethodDefinitionTest compile: 'foo        ^ ''second version'''.
    self assert: newMethod sourceCode = newMethod compiledMethod sourceCode.
    
    newMethod := (Class >> #asRingDefinition) asActiveRingDefinition.
    newMethod fromActiveToPassive.
    self assert: newMethod isPassive.
    self assert: newMethod sourceCode = (Class >> #asRingDefinition) sourceCode.
    newMethod sourceCode: 'asRingDefinition   ^true'.
    self assert: newMethod sourceCode ~= (Class >> #asRingDefinition) sourceCode.
    
    newMethod := (Class >> #asRingDefinition) asActiveRingDefinition.
    newMethod fromActiveToHistorical.
    self assert: newMethod isHistorical.
    self assert: newMethod sourceCode notNil.

    "Modified: / 29-08-2015 / 08:20:23 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

testAsHistorical
    | firstVersion secondVersion |

    RGMethodDefinitionTest compile: 'foo	^ ''first version'''.
    firstVersion := (RGMethodDefinitionTest >> #foo) asHistoricalRingDefinition.
    self assert: firstVersion isHistorical.
    self assert: firstVersion sourceCode = firstVersion compiledMethod sourceCode.
    self assert: firstVersion stamp = firstVersion compiledMethod timeStamp.

    RGMethodDefinitionTest compile: 'foo	^ ''second version'''.
    secondVersion := (RGMethodDefinitionTest >> #foo) asHistoricalRingDefinition.
    self assert: secondVersion isHistorical.
    self assert: secondVersion sourceCode = secondVersion compiledMethod sourceCode.
    self assert: secondVersion stamp = secondVersion compiledMethod timeStamp.

    self deny: firstVersion sourcePointer = secondVersion sourcePointer.
    self deny: firstVersion sourceCode = secondVersion sourceCode.
!

testAsMethodDefinition
    | newMethod |

    newMethod:= (OrderedCollection >> #size) asRingDefinition.
    
    self assert: (newMethod isRingObject).
    self assert: newMethod parent isNil.
    self assert: (newMethod isMethod).  
    self assert: (newMethod selector == #size).  
    self assert: (newMethod protocol notNil).
    self assert: (newMethod stamp notNil).
!

testAsMethodDefinition2
    "self debug: #testAsMethodDefinition2"
    
    | newMethod |
    newMethod := (Object >> #printOn:) asRingDefinition.
    self assert:  newMethod category = #'printing & storing'.

    "Modified: / 29-08-2015 / 10:26:44 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

testAsPassive
    | newMethod |

    RGMethodDefinitionTest compile: 'foo	^ ''first version'''.
    newMethod := (RGMethodDefinitionTest >> #foo) asPassiveRingDefinition.
    self assert: newMethod isPassive.
    self assert: newMethod sourceCode = newMethod compiledMethod sourceCode.

    RGMethodDefinitionTest compile: 'foo	^ ''second version'''.
    self assert: newMethod sourceCode = 'foo	^ ''first version'''.		
    self assert: newMethod compiledMethod sourceCode = 'foo	^ ''second version'''.
!

testClassNameSelectorIsMetaSide
    "self debug: #testClassNameSelectorIsMetaSide"
    
    | rg |
    rg := RGMethodDefinition className: 'Point' selector: #x  isMetaSide: false. 	
    self assert: (rg parentName = 'Point').
    self assert: (rg parent isKindOf:RGClassDefinition).
    self assert: (rg selector = #x).
    self assert: (rg isMetaSide not).
!

testCreatingMethodsWithoutFactory
    | newMethod newClass |

    newMethod := RGMethodDefinition realClass: OrderedCollection selector: 'size'.
    self assert: (newMethod isMethod).  
    self assert: (newMethod selector == #size).  
    self assert: (newMethod protocol notNil).
    self assert: (newMethod sourceCode notEmpty).
    self assert: (newMethod stamp notNil).
    
    newClass := RGClassDefinition named: #OrderedCollection.
    newMethod := RGMethodDefinition class: newClass selector: 'size'.
    self assert: (newMethod isMethod).  
    self assert: (newMethod selector == #size).  
    self assert: (newMethod protocol isNil).
    self assert: (newMethod sourceCode isNil).
    self assert: (newMethod stamp isNil).
    
    newMethod := RGMethodDefinition realClass: OrderedCollection theMetaClass selector: #newFrom:.
    self assert: (newMethod isMethod).  
    self assert: (newMethod selector == #newFrom:).  
    self assert: (newMethod protocol notNil).
    self assert: (newMethod sourceCode notEmpty).
    self assert: (newMethod stamp notNil).

    "Modified: / 29-08-2015 / 10:26:02 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

testCreatingMethodsWithoutFactory2
    | newMethod |

    newMethod := RGMethodDefinition realClass: OrderedCollection.
    self assert: (newMethod selector isNil).
    newMethod source: 'foo: a bar: b ^ a + b'.
    self assert: (newMethod isMethod).

    "Created: / 29-08-2015 / 11:58:53 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

testDifferentObjectButSameMethodInSet
    "self debug: #testDifferentObjectButSameMethodInSet"

    | s rgmethod rgmethod2 |
    s := Set new.
    rgmethod := (OrderedCollection >> #size) asRingDefinition.
    s add: rgmethod. 
    rgmethod2 := (OrderedCollection >> #size) asRingDefinition.
    s add: rgmethod2.
    
    self assert: (s size = 1).
    self assert: (s includes: rgmethod).
    self assert: (s includes: rgmethod2).

    "Modified (format): / 28-08-2015 / 12:18:30 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

testExistingMethodWithClass
    | newMethod newClass |
    
    newClass:=RGClassDefinition named: #OrderedCollection.
    newMethod:= (RGMethodDefinition named: #add:)
                     parent: newClass;
                    protocol: 'adding';
                    sourceCode: 'add: newObject
                                    ^self addLast: newObject'.
                                    
    self assert: (newMethod isMethod).
    self assert: (newMethod selector == #add:).
    self assert: (newMethod isMetaSide not).
    
    self assert: (newMethod parent = newClass).
    self assert: (newMethod parentName == newClass name).
    
    self assert: (newMethod parent parent == Smalltalk globals).
    self assert: (newMethod realClass = OrderedCollection).
    self assert: (newMethod compiledMethod = (OrderedCollection compiledMethodAt: #add:)).
!

testExistingMethodWithPointer
    | newMethod |
    
    newMethod:= (OrderedCollection >> #size) asActiveRingDefinition.
                                    
    self assert: (newMethod parent isNil).
    self assert: (newMethod parentName == #OrderedCollection).
    self assert: (newMethod sourceCode notNil).
    self assert: (newMethod protocol notNil).
    self assert: (newMethod stamp notNil).
    self assert: (newMethod isExtension not)

    "Modified (format): / 28-08-2015 / 12:18:40 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

testExistingMethodWithoutClass
    "its parent class is not assigned only its name"
    | newMethod |
    
    newMethod:= (RGMethodDefinition named: #add:)
                    parentName: #OrderedCollection;
                    selector: #add:; 
                    isMetaSide: false;
                    protocol: 'adding'; 
                    sourceCode: 'add: newObject
                                    ^self addLast: newObject'.
    
    self assert: (newMethod isMethod).
    self assert: (newMethod selector == #add:).
    self assert: (newMethod isMetaSide not).
    self assert: (newMethod protocol = #adding).
    self assert: (newMethod fullName = 'OrderedCollection>>add:').
    self assert: (newMethod sourceCode = 'add: newObject
                                    ^self addLast: newObject').
    self assert: (newMethod hasStamp not).
    self assert: (newMethod parent isNil).
    self assert: (newMethod parentName == #OrderedCollection).
    
    self assert: (newMethod environment == Smalltalk globals).
    self assert: (newMethod realClass = OrderedCollection).
    self assert: (newMethod compiledMethod = (OrderedCollection compiledMethodAt: #add:))
!

testExtensionMethod
    | newMethod newClass newPackage newPackageExt |

    newMethod:= (RGMethodDefinition named: #+)
                    isExtension: true.
    self assert: (newMethod protocol isNil).
    self assert: (newMethod isExtension).

    newMethod:= (Class >> #asRingDefinition) asRingDefinition.    
    self assert: (newMethod isMethod).  
    self assert: (newMethod protocol = '*Ring-Core-Kernel').
    self assert: (newMethod isExtension).
    
    newPackage := RGPackage named: #Package.
    newPackageExt := RGPackage named:  #PackageExtensions.
    newClass := RGClassDefinition named: #Class.
    newMethod := (RGMethodDefinition named: #foo) parent: newClass.
    newPackage addClass: newClass.
    newMethod package: newPackageExt.
    self assert: (newMethod isExtension).

    "Modified: / 29-08-2015 / 10:18:46 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

testMethodEquality

    | newMethod newClass |
    self assert: (OrderedCollection >> #size) asRingDefinition = (OrderedCollection >> #size) asRingDefinition.
    
    newMethod := ((OrderedCollection >> #size) asRingDefinition)
                    sourceCode: 'size
                        ^0'.
    self assert: ((OrderedCollection >> #size) asRingDefinition = newMethod).
    
    newClass:= RGClassDefinition named: #OrderedCollection.
    newMethod:= (RGMethodDefinition named: #size) parent: newClass.
    self assert: ((OrderedCollection >> #size) asRingDefinition = newMethod).
    
    newMethod:= (RGMethodDefinition named: #size) parent: (SortedCollection asRingDefinition).
    self deny: ((OrderedCollection >> #size) asRingDefinition = newMethod).

    "Modified (format): / 28-08-2015 / 12:19:07 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

testNonExistingMethodWithClass
    "method does not exist in OrderedCollection"
    | newMethod newClass |
    
    newClass:= RGClassDefinition named: #OrderedCollection.
    newClass withMetaclass.
    
    newMethod:= (RGMethodDefinition named: #foo) parent: newClass theMetaClass.
    newMethod sourceCode: 'foo
                                    ^true'.
                                    
    self assert: (newMethod isMethod).
    self assert: (newMethod selector == #foo).
    self assert: (newMethod isMetaSide).
    self assert: (newMethod protocol = nil).
    
    self assert: (newMethod parent = newClass theMetaClass).
    self assert: (newMethod parentName = newClass theMetaClass name).
    
    self assert: (newMethod environment == Smalltalk globals).
    self assert: (newMethod realClass = OrderedCollection class).
    self assert: (newMethod compiledMethod isNil).
!

testSameMethodInSet
    "self debug: #testSameMethodInSet"

    | s rgmethod |
    s := Set new.
    rgmethod := (OrderedCollection >> #size) asRingDefinition.
    s add: rgmethod. 
    self assert: (s includes: rgmethod).
    
    s add: rgmethod. 
    self assert: (s size = 1).
    self assert: (s includes: rgmethod).

    "Modified (format): / 28-08-2015 / 12:19:16 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

testSorting

    | rgMethod1 rgMethod2 |
    rgMethod1 := RGMethodDefinition realClass: RGInstanceVariableDefinition selector: #isInstanceVariable.
    rgMethod2 := RGMethodDefinition realClass: RGElementDefinition selector: #isMetaSide.
    self assert: rgMethod2 <= rgMethod1.
    
    rgMethod1 := RGMethodDefinition realClass: RGElementDefinition selector: #parentName.
    self assert: rgMethod2 <= rgMethod1. 
    
! !