CustomNamespaceTests.st
author Jakub Nesveda <jakubnesveda@seznam.cz>
Tue, 28 Oct 2014 09:39:46 +0100
changeset 711 605ab7fc9cd1
parent 706 ee83e8c20350
child 717 63e0da20b676
permissions -rw-r--r--
return whole source code when selected interval is empty retrieve selector from method when none selector is specified

"{ Package: 'jn:refactoring_custom' }"

CustomCodeGeneratorOrRefactoringTestCase subclass:#CustomNamespaceTests
	instanceVariableNames:'refactoryChangeManager'
	classVariableNames:''
	poolDictionaries:''
	category:'Interface-Refactoring-Custom-Tests'
!


!CustomNamespaceTests methodsFor:'accessing'!

generatorOrRefactoring
    ^ nil

    "Modified: / 31-05-2014 / 22:48:25 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
! !

!CustomNamespaceTests methodsFor:'initialization & release'!

setUp

    super setUp.
    refactoryChangeManager := RefactoryChangeManager instance.

    "Created: / 16-04-2014 / 21:39:50 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
    "Modified: / 31-05-2014 / 22:45:57 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
! !

!CustomNamespaceTests methodsFor:'private'!

lastUndoChange

    refactoryChangeManager undoableOperations isEmpty ifTrue: [ 
        ^ nil 
    ] ifFalse: [
        ^ refactoryChangeManager undoChange
    ].

    "Created: / 16-04-2014 / 21:40:37 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
    "Modified: / 31-05-2014 / 19:53:08 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
! !

!CustomNamespaceTests methodsFor:'tests'!

test_all_class_var_names
    | class actualClassVars expectedClassVars |

    class := model createClass
        name: #MockClassForTestCase;
        classVariableNames: #('ClassVar1' 'ClassVar2');
        yourself.

    expectedClassVars := (Object allClassVarNames, (Array with: #ClassVar1 with: #ClassVar2)).
    actualClassVars := class theNonMetaclass allClassVarNames.

    self assert: expectedClassVars = actualClassVars

    "Created: / 20-06-2014 / 22:35:27 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
    "Modified: / 09-10-2014 / 10:47:56 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
!

test_chaining_api_create_class_and_method_with_default_class
    | class |

    self skipIf: true description: 'will be maybe fixed in future'. 

    model
        name: #MockClassForTestCase;
        createClass;

        protocol: 'a protocol';
        source: '`@selector
            self shouldImplement';
        replace: '`@selector' with: 'aSelector';
        createMethod;

        replace: '`@selector' with: 'aSelector2';
        createMethod.

    model execute.

    class := Smalltalk classNamed: 'MockClassForTestCase'.   

    self assert: (class includesSelector: #aSelector).
    self assert: (class includesSelector: #aSelector2).

    self assert: (class sourceCodeAt: #aSelector) = 'aSelector
    self shouldImplement'.

    self assert: (class sourceCodeAt: #aSelector2) = 'aSelector2
    self shouldImplement'.

    "Created: / 30-08-2014 / 23:09:42 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
    "Modified: / 09-10-2014 / 22:26:01 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
!

test_chaining_api_create_class_and_method_within_given_package
    | class package method1 method2 |

    self skipIf: true description: 'will be maybe fixed in future'. 

    package := self class package.
    self assert: package size > 3.

    class := model
        package: package;  
        className: 'MockClassForTestCase';
        createClass.

    model
        class: class;  
        protocol: 'a protocol';
        source: '`@selector
            self shouldImplement';
        replace: '`@selector' with: 'aSelector';
        createMethod;

        replace: '`@selector' with: 'aSelector2';
        createMethod.

    self assert: (class includesSelector: #aSelector) not.
    self assert: (class includesSelector: #aSelector2) not.

    model execute.

    class := Smalltalk classNamed: 'MockClassForTestCase'.   

    self assert: (class includesSelector: #aSelector).
    self assert: (class includesSelector: #aSelector2).

    self assert: (class sourceCodeAt: #aSelector) = 'aSelector
    self shouldImplement'.

    self assert: (class sourceCodeAt: #aSelector2) = 'aSelector2
    self shouldImplement'.

    self assert: class package equals: package.

    method1 := class compiledMethodAt: #aSelector.

    self assert: method1 package equals: package.

    method2 := class compiledMethodAt: #aSelector2.

    self assert: method2 package equals: package.

    "Created: / 30-08-2014 / 22:21:31 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
    "Modified: / 09-10-2014 / 22:26:10 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
!

test_chaining_api_create_class_and_method_without_given_package
    | class package method1 method2 |

    self skipIf: true description: 'will be maybe fixed in future'. 

    package := self class package.
    self assert: package size > 3.

    class := model
        className: 'MockClassForTestCase';
        createClass.

    model
        class: class;  
        protocol: 'a protocol';
        source: '`@selector
            self shouldImplement';
        replace: '`@selector' with: 'aSelector';
        createMethod;

        replace: '`@selector' with: 'aSelector2';
        createMethod.

    self assert: (class includesSelector: #aSelector) not.
    self assert: (class includesSelector: #aSelector2) not.

    model execute.

    class := Smalltalk classNamed: 'MockClassForTestCase'.   

    self assert: (class includesSelector: #aSelector).
    self assert: (class includesSelector: #aSelector2).

    self assert: (class sourceCodeAt: #aSelector) = 'aSelector
    self shouldImplement'.

    self assert: (class sourceCodeAt: #aSelector2) = 'aSelector2
    self shouldImplement'.

    self deny: class package = package.

    method1 := class compiledMethodAt: #aSelector.

    self deny: method1 package = package.

    method2 := class compiledMethodAt: #aSelector2.

    self deny: method2 package = package.

    "Created: / 30-08-2014 / 23:01:59 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
    "Modified: / 09-10-2014 / 22:26:18 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
!

test_chaining_api_create_method
    | class |

    self skipIf: true description: 'will be maybe fixed in future'. 

    class := self class.

    model
        class: class;
        protocol: 'a protocol';
        source: '`@selector
    self shouldImplement';
        replace: '`@selector' with: 'aSelector';
        createMethod;

        replace: '`@selector' with: 'aSelector2';
        createMethod.

    self assert: (class includesSelector: #aSelector) not.
    self assert: (class includesSelector: #aSelector2) not.

    model execute.

    self assert: (class includesSelector: #aSelector).
    self assert: (class includesSelector: #aSelector2).

    self assert: (class sourceCodeAt: #aSelector) = 'aSelector
    self shouldImplement'.

    self assert: (class sourceCodeAt: #aSelector2) = 'aSelector2
    self shouldImplement'.

    "Created: / 27-04-2014 / 17:48:30 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
    "Modified: / 26-08-2014 / 23:39:02 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 09-10-2014 / 22:26:25 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
!

test_chaining_api_create_method_with_class
    | class className method |

    self skipIf: true description: 'will be maybe fixed in future'. 

    className := 'TestClassNameForTestCase'.

    class := model
        className: className;
        classVariableNames: 'ClassVar1 ClassVar2';
        instanceVariableNames: 'instVar1 instVar2';
        poolDictionaryNames: 'dictName';
        superclassName: 'TestCase';
        category: 'Some-Category';
        createClass.

    model 
        class: class;
        protocol: 'a protocol';
        source: '`@selector
    self shouldImplement';
        replace: '`@selector' with: 'aSelector';
        createMethod.

    self assertClassNotExists: className.
    [ 
    model execute.

    class := Smalltalk classNamed: className.

    self assert: class new className = className.
    self assert: class superclass new className = 'TestCase'.
    self assert: class instanceVariableString = 'instVar1 instVar2'.
    self assert: class classVariableString = 'ClassVar1 ClassVar2'.
    self assert: class poolDictionaries = 'dictName'.
    self assert: class category = 'Some-Category'.

    self assert: (class includesSelector: #aSelector).
    self assert: (class sourceCodeAt: #aSelector) = 'aSelector
    self shouldImplement'.
    method := class compiledMethodAt: #aSelector.  
    self assert: (method category) = 'a protocol'.
    ] ensure:[
        class notNil ifTrue:[ 
            class removeFromSystem.
        ].
    ]

    "Created: / 04-05-2014 / 13:00:38 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
    "Modified: / 26-08-2014 / 23:56:26 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 09-10-2014 / 22:27:27 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
!

test_chaining_api_create_method_within_given_package
    | class package method1 method2 |

    self skipIf: true description: 'will be maybe fixed in future'. 

    package := self class package.
    self assert: package size > 3.

    class := self class.

    model
        package: package;  
        class: class;
        protocol: 'a protocol';
        source: '`@selector
            self shouldImplement';
        replace: '`@selector' with: 'aSelector';
        createMethod;

        replace: '`@selector' with: 'aSelector2';
        createMethod.

    self assert: (class includesSelector: #aSelector) not.
    self assert: (class includesSelector: #aSelector2) not.

    model execute.

    self assert: (class includesSelector: #aSelector).
    self assert: (class includesSelector: #aSelector2).

    self assert: (class sourceCodeAt: #aSelector) = 'aSelector
    self shouldImplement'.

    self assert: (class sourceCodeAt: #aSelector2) = 'aSelector2
    self shouldImplement'.

    method1 := class compiledMethodAt: #aSelector.

    self assert: method1 package equals: package.

    method2 := class compiledMethodAt: #aSelector2.

    self assert: method2 package equals: package.

    "Created: / 30-08-2014 / 21:40:15 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
    "Modified: / 09-10-2014 / 22:27:33 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
!

test_chaining_api_create_method_without_given_package
    | class package method1 method2 |

    self skipIf: true description: 'will be maybe fixed in future'. 

    package := self class package.
    self assert: package size > 3.

    class := self class.

    model
        class: class;
        protocol: 'a protocol';
        source: '`@selector
            self shouldImplement';
        replace: '`@selector' with: 'aSelector';
        createMethod;

        replace: '`@selector' with: 'aSelector2';
        createMethod.

    self assert: (class includesSelector: #aSelector) not.
    self assert: (class includesSelector: #aSelector2) not.

    model execute.

    self assert: (class includesSelector: #aSelector).
    self assert: (class includesSelector: #aSelector2).

    self assert: (class sourceCodeAt: #aSelector) = 'aSelector
    self shouldImplement'.

    self assert: (class sourceCodeAt: #aSelector2) = 'aSelector2
    self shouldImplement'.

    method1 := class compiledMethodAt: #aSelector.

    self deny: method1 package = package.

    method2 := class compiledMethodAt: #aSelector2.

    self deny: method2 package = package.

    "Created: / 30-08-2014 / 21:42:19 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
    "Modified: / 09-10-2014 / 22:27:41 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
!

test_changes_empty_as_default
    self assert:model changes size = 0.

    "Created: / 22-07-2014 / 22:52:23 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
    "Modified: / 09-10-2014 / 10:54:16 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
!

test_class_and_class_method_generated_as_one_undo_change
    | className class lastUndoChange |

    lastUndoChange := self lastUndoChange.

    className := #MockClassForTestingOneUndoChange.

    self assertClassNotExists: className.

    model := CustomNamespace new.
    model changeManager: refactoryChangeManager.

    class := model createClass
        name: className;
        compile;
        yourself.  

    self assertClassNotExists: className.

    model createMethod
        class: class theMetaclass;
        protocol: 'a protocol';
        source: 'aSelector
        ^ nil';
        compile.

    self assertClassNotExists: className.
    self assert: lastUndoChange = (self lastUndoChange).

    model execute.

    self assertClassExists: className.
    self assert: (lastUndoChange = (self lastUndoChange)) not.
    self assert: ((Smalltalk classNamed: className) class includesSelector: #aSelector).
    self assert: ((Smalltalk classNamed: className) includesSelector: #aSelector) not.

    refactoryChangeManager undoOperation.

    self assertClassNotExists: className.
    self assert: lastUndoChange = (self lastUndoChange).

    "Created: / 17-04-2014 / 23:54:22 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
    "Modified: / 09-10-2014 / 23:02:01 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
!

test_class_and_instance_method_generated_as_one_undo_change
    | className class lastUndoChange |

    lastUndoChange := self lastUndoChange.

    className := #MockClassForTestingOneUndoChange.

    self assertClassNotExists: className.

    model := CustomNamespace new.
    model changeManager: refactoryChangeManager.  

    class := model createClass
        name: className;
        compile;
        yourself.  

    self assertClassNotExists: className.

    model createMethod
        class: class;
        protocol: 'a protocol';
        source: 'aSelector
        ^ nil';
        compile.

    self assertClassNotExists: className.
    self assert: lastUndoChange = (self lastUndoChange).

    model execute.

    self assertClassExists: className.
    self assert: (lastUndoChange = (self lastUndoChange)) not.
    self assert: ((Smalltalk classNamed: className) includesSelector: #aSelector).

    refactoryChangeManager undoOperation.

    self assertClassNotExists: className.
    self assert: lastUndoChange = (self lastUndoChange).

    "Created: / 17-04-2014 / 23:54:05 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
    "Modified: / 09-10-2014 / 23:04:06 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
!

test_comment_in_method_generated
    | class generatedSource expectedSource |

    class := self class.

    model createMethod
        class: self class;
        protocol: 'a protocol';
        source: 'aSelector
            "a comment"
            ^ nil';
        compile.

    self assert: (class includesSelector: #aSelector) not.

    model execute.

    generatedSource := (class sourceCodeAt: #aSelector).
    expectedSource := 'aSelector
    "a comment"

    ^ nil'.

    self assert: (class includesSelector: #aSelector).
    self assert: (generatedSource includesSubString: '"a comment"').
    self assertSource: expectedSource sameAs: generatedSource

    "Created: / 27-04-2014 / 15:57:17 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
    "Modified: / 26-08-2014 / 23:42:06 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 09-10-2014 / 23:06:38 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
!

test_create_class_immediate
    | mockClass |

    mockClass := model createClassImmediate: 'MockClassForTestCase'.

    self assert: mockClass new className = 'MockClassForTestCase'.
    self assert: mockClass superclass new className = 'Object'.
    self assert: mockClass instanceVariableString = ''.
    self assert: mockClass classVariableString = ''.
    self assert: mockClass poolDictionaries = ''.
    self assert: mockClass category = ''.

    "Created: / 15-06-2014 / 17:27:41 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
    "Modified: / 27-07-2014 / 12:42:53 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
!

test_create_class_immediate_with_category
    | mockClass |

    mockClass := model createClassImmediate: 'MockClassForTestCase' category: 'Some-Category01'.

    self assert: mockClass new className = 'MockClassForTestCase'.
    self assert: mockClass superclass new className = 'Object'.
    self assert: mockClass instanceVariableString = ''.
    self assert: mockClass classVariableString = ''.
    self assert: mockClass poolDictionaries = ''.
    self assert: mockClass category = 'Some-Category01'.

    "Modified: / 19-10-2014 / 20:56:27 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
!

test_create_class_immediate_with_given_super_class_name
    | mockClass |

    mockClass := model createClassImmediate: 'MockClassForTestCase' superClassName: 'Object'.

    self assert: mockClass new className = 'MockClassForTestCase'.
    self assert: mockClass superclass new className = 'Object'.
    self assert: mockClass instanceVariableString = ''.
    self assert: mockClass classVariableString = ''.
    self assert: mockClass poolDictionaries = ''.
    self assert: mockClass category = ''.

    "Created: / 27-07-2014 / 12:42:35 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
!

test_create_class_immediate_with_instance_and_class_variables
    | mockClass |

    mockClass := model
        createClassImmediate: 'MockClassForTestCase' 
        superClassName: 'Object'
        instanceVariableNames: 'instVar'
        classVariableNames: 'ClassVar'.

    self assert: mockClass new className = 'MockClassForTestCase'.
    self assert: mockClass superclass new className = 'Object'.
    self assert: mockClass instanceVariableString = 'instVar'.
    self assert: mockClass classVariableString = 'ClassVar'.
    self assert: mockClass poolDictionaries = ''.
    self assert: mockClass category = ''.

    "Created: / 23-08-2014 / 22:24:02 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
!

test_create_class_immediate_with_instance_variables
    | mockClass |

    mockClass := model
        createClassImmediate: 'MockClassForTestCase' 
        instanceVariableNames: 'instVar'.

    self assert: mockClass new className = 'MockClassForTestCase'.
    self assert: mockClass superclass new className = 'Object'.
    self assert: mockClass instanceVariableString = 'instVar'.
    self assert: mockClass classVariableString = ''.
    self assert: mockClass poolDictionaries = ''.
    self assert: mockClass category = ''.

    "Created: / 23-08-2014 / 22:26:24 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
!

test_create_class_immediate_with_super_class_name_instance_variable_names_class_variable_names_pool_dictionaries_category    
    | mockClass |

    mockClass := model
        createClassImmediate: 'MockClassForTestCase' 
        superClassName: 'Object'
        instanceVariableNames: 'instVar'
        classVariableNames: 'ClassVar'
        poolDictionaries: 'pollDict01'
        category: 'Some-Category01'.

    self assert: mockClass new className = 'MockClassForTestCase'.
    self assert: mockClass superclass new className = 'Object'.
    self assert: mockClass instanceVariableString = 'instVar'.
    self assert: mockClass classVariableString = 'ClassVar'.
    self assert: mockClass poolDictionaries = 'pollDict01'.
    self assert: mockClass category = 'Some-Category01'.

    "Modified (comment): / 19-10-2014 / 20:53:28 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
!

test_create_class_within_given_package
    | class package |

    package := self class package.
    self assert: package size > 3.

    model createClass
        name: #MockClassForTestCase;
        package: package;
        compile.

    model execute.

    class := Smalltalk classNamed: 'MockClassForTestCase'.

    self assert: class new className = 'MockClassForTestCase'.
    self assert: class superclass new className = 'Object'.
    self assert: class instanceVariableString = ''.
    self assert: class classVariableString = ''.
    self assert: class poolDictionaries = ''.
    self assert: class category = '** As yet undefined **'.
    self assert: class package = package.

    "Created: / 30-08-2014 / 20:35:35 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
    "Modified (format): / 09-10-2014 / 23:23:06 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
!

test_create_class_without_given_package
    | class package |

    package := self class package.
    self assert: package size > 3.

    model createClass
        name: #MockClassForTestCase;
        compile.

    model execute.

    class := Smalltalk classNamed: 'MockClassForTestCase'.

    self assert: class new className = 'MockClassForTestCase'.
    self assert: class superclass new className = 'Object'.
    self assert: class instanceVariableString = ''.
    self assert: class classVariableString = ''.
    self assert: class poolDictionaries = ''.
    self assert: class category = '** As yet undefined **'.
    self assert: (class package = package) not.

    "Created: / 30-08-2014 / 20:57:22 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
    "Modified: / 10-10-2014 / 00:02:18 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
!

test_create_method_immediate
    | mockClass expectedSource actualSource |

    expectedSource := 'instanceMethod:aParam
    ^ self'.

    mockClass := model createClassImmediate: 'MockClassForTestCase' superClassName: 'Object'.
    model createMethodImmediate: mockClass protocol: 'a protocol' source: expectedSource.

    actualSource := (mockClass sourceCodeAt: #instanceMethod:).

    self assertSource: expectedSource sameAs: actualSource.
    self assert: (mockClass compiledMethodAt: #instanceMethod:) category = 'a protocol'

    "Created: / 15-06-2014 / 17:28:36 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
    "Modified: / 24-06-2014 / 21:59:23 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
!

test_create_method_immediate_protocol_source_package
    | expectedSource actualSource mockClass |

    expectedSource := 'instanceMethod:aParam
    ^ self'.

    mockClass := model createClassImmediate: 'MockClassForTestCase' superClassName: 'Object'.
    model createMethodImmediate: mockClass 
        protocol: 'a protocol' 
        source: expectedSource 
        package: #some_package01.

    actualSource := (mockClass sourceCodeAt: #instanceMethod:).

    self assertSource: expectedSource sameAs: actualSource.
    self assert: (mockClass compiledMethodAt: #instanceMethod:) category = 'a protocol'.    
    self assert: (mockClass compiledMethodAt: #instanceMethod:) package = #some_package01.

    "Modified: / 17-10-2014 / 10:02:42 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
!

test_create_method_immediate_with_preset_protocol
    | mockClass expectedSource actualSource |

    expectedSource := 'instanceMethod:aParam
    ^ self'.

    mockClass := model createClassImmediate: 'MockClassForTestCase' superClassName: 'Object'.
    model createMethodImmediate: mockClass source: expectedSource.

    actualSource := (mockClass sourceCodeAt: #instanceMethod:).

    self assertSource: expectedSource sameAs: actualSource.
    self assert: (mockClass compiledMethodAt: #instanceMethod:) category = 'protocol'

    "Created: / 23-08-2014 / 21:48:51 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
!

test_create_method_within_given_package
    | mockClass package method |

    package := self class package.
    self assert: package size > 3.

    mockClass := model createClassImmediate: 'MockClassForTestCase' superClassName: 'Object'.
    model createMethod
        class: mockClass;
        protocol: 'a protocol';
        package: package;
        source: 'selector ^ 123';
        compile.

    model execute.

    method := (mockClass compiledMethodAt: #selector).

    self assert: method package = package

    "Created: / 30-08-2014 / 18:45:35 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
    "Modified: / 10-10-2014 / 00:02:52 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
!

test_create_method_without_given_package
    | mockClass package method |

    package := self class package.
    self assert: package size > 3.

    mockClass := model createClassImmediate: 'MockClassForTestCase' superClassName: 'Object'.
    model createMethod
        class: mockClass;
        protocol: 'a protocol';
        source: 'selector ^ 123';
        compile.

    model execute.

    method := (mockClass compiledMethodAt: #selector).

    self assert: (method package = package) not

    "Created: / 30-08-2014 / 18:46:52 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
    "Modified: / 10-10-2014 / 15:33:44 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
!

test_empty_class_definition_string
    | expectedDefinition actualDefinition |

    expectedDefinition := 'Object subclass: #''Unknown Class''
        instanceVariableNames: ''''
        classVariableNames: ''''
        poolDictionaries: ''''
        category: ''** As yet undefined **'''.

    actualDefinition := model createClass definitionString.                                     

    self assertSource: expectedDefinition sameAs: actualDefinition.

    "Created: / 10-10-2014 / 15:41:45 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
!

test_empty_class_in_changes

    model createClass compile.
    self assert:(model changes changesSize) = 1.

    "Created: / 22-07-2014 / 22:22:04 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
    "Modified: / 10-10-2014 / 15:48:35 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
!

test_method_source_builded
    | method expectedSource actualSource |

    method := model createMethod
        source: '`@methodName
    ^ `variableName';
        replace: '`@methodName' with: #selector;
        replace: '`variableName' with: 'aName';
        yourself.

    expectedSource := 'selector
    ^ aName'.

    actualSource := method newSource.

    self assertSource: expectedSource sameAs: actualSource

    "Created: / 18-05-2014 / 17:14:13 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
    "Modified: / 26-08-2014 / 23:40:11 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 10-10-2014 / 15:56:56 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
!

test_method_source_builded_with_comment
    | method buildedSource expectedSource |

    method := model createMethod
        source: '`@methodName

    `"comment

    ^ `variableName';
        replace: '`@methodName' with: #selector;
        replace: '`variableName' with: 'aName';
        replace: '`"comment' with: '"a comment"';
        yourself.

    buildedSource := method newSource.
    expectedSource := 'selector
    "a comment"

    ^ aName'.

    self assertSource: expectedSource sameAs: buildedSource

    "Created: / 19-05-2014 / 18:57:25 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
    "Modified: / 26-08-2014 / 23:55:12 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 10-10-2014 / 15:56:32 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
!

test_method_source_with_original_formatting
    | method originalSource actualSource expectedSource |

    originalSource := 'methodName

    `variableName do: [ each | each call ].'.

    expectedSource := 'methodName

    collection do: [ each | each call ].'.

    model formatter: CustomNoneSourceCodeFormatter new.
    method := model createMethod
        source: originalSource;
        replace: '`variableName' with: 'collection';
        yourself.

    actualSource := method newSource.

    self assertSource: expectedSource sameAs: actualSource.

    "Created: / 22-07-2014 / 23:04:43 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
    "Modified: / 10-10-2014 / 15:57:21 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
!

test_nil_changes_not_in_change_collector

    self should: [ 
        model createMethod compile.
    ] raise: Error.

    self assert: model changes changesSize = 0.

    "Created: / 22-07-2014 / 22:16:37 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
    "Modified: / 10-10-2014 / 16:00:56 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
!

test_one_method_for_multiple_classes
    | classCollection classNames |

    self skipIf: true description: 'will be maybe fixed in future'. 

    classCollection := OrderedCollection new.
    classNames := Array with: 'DummyClassForTestCase1' with: 'DummyClassForTestCase2'.

    classNames do: [ :className |
        classCollection add: (model className: className; createClass).
    ].

    model
        classes: classCollection;
        protocol: 'a protocol';
        source: '`@selector
    self shouldImplement';
        replace: '`@selector' with: 'aSelector';
        createMethod.

    model execute.

    classNames do: [ :className |
        | class method |

        class := Smalltalk classNamed: className.
        self assert: (class includesSelector: #aSelector).
        self assert: (class sourceCodeAt: #aSelector) = 'aSelector
    self shouldImplement'.
        method := class compiledMethodAt: #aSelector.  
        self assert: (method category) = 'a protocol'.
    ].

    "Created: / 02-05-2014 / 23:31:07 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
    "Modified: / 26-08-2014 / 23:41:47 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 10-10-2014 / 16:02:55 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
!

test_undo_changes_for_multiple_executes
    "Note: Methods createClassImmediate and createMethodImmediate have execute call inside"
    
    |mockSuperClassName mockClassName mockSuperClass|

    mockSuperClassName := 'MockSuperClassForTestCase'.
    mockClassName := 'MockClassForTestCase'.
    mockSuperClass := model createClassImmediate:mockSuperClassName
            superClassName:'Object'.
    model createClassImmediate:mockClassName
        superClassName:mockSuperClassName.
    
    "/ Instance method
    
    model 
        createMethodImmediate:mockSuperClass
        protocol:'instance-protocol'
        source:'instanceMethod: aParam
    self shouldImplement'.
    
    "/ Class method
    
    model 
        createMethodImmediate:mockSuperClass class
        protocol:'class-protocol'
        source:'classMethod: aParam
    self shouldImplement'.
    self assertClassExists:mockSuperClassName.
    self assertClassExists:mockClassName.
    model undoChanges.
    self assertClassNotExists:mockSuperClassName.
    self assertClassNotExists:mockClassName.

    "Created: / 15-06-2014 / 16:21:52 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
    "Modified: / 19-10-2014 / 14:57:07 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
! !

!CustomNamespaceTests class methodsFor:'documentation'!

version_HG

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