quickSelfTest/RunUnitTests.st
author sr
Tue, 10 Oct 2017 16:27:57 +0200
changeset 402 3caf6bff52dc
parent 400 9bc1e8189279
child 403 1e88f9fae94d
permissions -rw-r--r--
#BUGFIX by sr class: RunUnitTests class comment/format in: #excludedUnitTestClassNamesForExpecco #runWithCompiledUnitTestClasses:
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
349
ed255c6cf368 #DOCUMENTATION by sr
sr
parents: 348
diff changeset
     1
"{ Encoding: utf8 }"
329
6a3fe7cea4e1 *** empty log message ***
sr
parents:
diff changeset
     2
349
ed255c6cf368 #DOCUMENTATION by sr
sr
parents: 348
diff changeset
     3
"{ Package: 'stx:goodies/builder/quickSelfTest' }"
329
6a3fe7cea4e1 *** empty log message ***
sr
parents:
diff changeset
     4
6a3fe7cea4e1 *** empty log message ***
sr
parents:
diff changeset
     5
"{ NameSpace: Smalltalk }"
6a3fe7cea4e1 *** empty log message ***
sr
parents:
diff changeset
     6
6a3fe7cea4e1 *** empty log message ***
sr
parents:
diff changeset
     7
Object subclass:#RunUnitTests
6a3fe7cea4e1 *** empty log message ***
sr
parents:
diff changeset
     8
	instanceVariableNames:''
6a3fe7cea4e1 *** empty log message ***
sr
parents:
diff changeset
     9
	classVariableNames:''
6a3fe7cea4e1 *** empty log message ***
sr
parents:
diff changeset
    10
	poolDictionaries:''
6a3fe7cea4e1 *** empty log message ***
sr
parents:
diff changeset
    11
	category:'tests-Regression'
6a3fe7cea4e1 *** empty log message ***
sr
parents:
diff changeset
    12
!
6a3fe7cea4e1 *** empty log message ***
sr
parents:
diff changeset
    13
6a3fe7cea4e1 *** empty log message ***
sr
parents:
diff changeset
    14
!RunUnitTests class methodsFor:'documentation'!
6a3fe7cea4e1 *** empty log message ***
sr
parents:
diff changeset
    15
6a3fe7cea4e1 *** empty log message ***
sr
parents:
diff changeset
    16
documentation
6a3fe7cea4e1 *** empty log message ***
sr
parents:
diff changeset
    17
"
6a3fe7cea4e1 *** empty log message ***
sr
parents:
diff changeset
    18
    documentation to be added.
6a3fe7cea4e1 *** empty log message ***
sr
parents:
diff changeset
    19
6a3fe7cea4e1 *** empty log message ***
sr
parents:
diff changeset
    20
    [author:]
336
8dcc6a1f364b *** empty log message ***
sr
parents: 335
diff changeset
    21
	sr
329
6a3fe7cea4e1 *** empty log message ***
sr
parents:
diff changeset
    22
6a3fe7cea4e1 *** empty log message ***
sr
parents:
diff changeset
    23
    [instance variables:]
6a3fe7cea4e1 *** empty log message ***
sr
parents:
diff changeset
    24
6a3fe7cea4e1 *** empty log message ***
sr
parents:
diff changeset
    25
    [class variables:]
6a3fe7cea4e1 *** empty log message ***
sr
parents:
diff changeset
    26
6a3fe7cea4e1 *** empty log message ***
sr
parents:
diff changeset
    27
    [see also:]
6a3fe7cea4e1 *** empty log message ***
sr
parents:
diff changeset
    28
6a3fe7cea4e1 *** empty log message ***
sr
parents:
diff changeset
    29
"
6a3fe7cea4e1 *** empty log message ***
sr
parents:
diff changeset
    30
! !
6a3fe7cea4e1 *** empty log message ***
sr
parents:
diff changeset
    31
6a3fe7cea4e1 *** empty log message ***
sr
parents:
diff changeset
    32
!RunUnitTests class methodsFor:'actions'!
6a3fe7cea4e1 *** empty log message ***
sr
parents:
diff changeset
    33
6a3fe7cea4e1 *** empty log message ***
sr
parents:
diff changeset
    34
run
400
9bc1e8189279 #BUGFIX by sr
sr
parents: 399
diff changeset
    35
    self runWithCompiledUnitTestClasses:false.
398
84b58f2602d9 #BUGFIX by sr
sr
parents: 349
diff changeset
    36
!
84b58f2602d9 #BUGFIX by sr
sr
parents: 349
diff changeset
    37
84b58f2602d9 #BUGFIX by sr
sr
parents: 349
diff changeset
    38
runWithCompiledUnitTestClasses:useCompiledUnitTestClasses
84b58f2602d9 #BUGFIX by sr
sr
parents: 349
diff changeset
    39
    |doRunSpecificUnitTests unitTestSuiteName excludedUnitTestClassNames corruptedUnitTestClassNames
84b58f2602d9 #BUGFIX by sr
sr
parents: 349
diff changeset
    40
     cmdArgs
84b58f2602d9 #BUGFIX by sr
sr
parents: 349
diff changeset
    41
     unitTestSuite
84b58f2602d9 #BUGFIX by sr
sr
parents: 349
diff changeset
    42
     eachClassName eachClass
84b58f2602d9 #BUGFIX by sr
sr
parents: 349
diff changeset
    43
     result index settingsFilePathName|
84b58f2602d9 #BUGFIX by sr
sr
parents: 349
diff changeset
    44
84b58f2602d9 #BUGFIX by sr
sr
parents: 349
diff changeset
    45
    doRunSpecificUnitTests := false.
84b58f2602d9 #BUGFIX by sr
sr
parents: 349
diff changeset
    46
    unitTestSuiteName := 'All Unit Tests'.
84b58f2602d9 #BUGFIX by sr
sr
parents: 349
diff changeset
    47
    excludedUnitTestClassNames := self excludedUnitTestClassNamesForAll.
84b58f2602d9 #BUGFIX by sr
sr
parents: 349
diff changeset
    48
    corruptedUnitTestClassNames := self corruptedUnitTestClassNames.
84b58f2602d9 #BUGFIX by sr
sr
parents: 349
diff changeset
    49
84b58f2602d9 #BUGFIX by sr
sr
parents: 349
diff changeset
    50
    cmdArgs := Smalltalk commandLineArguments.
84b58f2602d9 #BUGFIX by sr
sr
parents: 349
diff changeset
    51
    index := cmdArgs indexOf:'--settingsFile'.
84b58f2602d9 #BUGFIX by sr
sr
parents: 349
diff changeset
    52
    index > 0 ifTrue:[
84b58f2602d9 #BUGFIX by sr
sr
parents: 349
diff changeset
    53
        settingsFilePathName := cmdArgs at:index + 1.
84b58f2602d9 #BUGFIX by sr
sr
parents: 349
diff changeset
    54
        self logInfo:'load settings file: ', settingsFilePathName printString.
84b58f2602d9 #BUGFIX by sr
sr
parents: 349
diff changeset
    55
        settingsFilePathName asFilename fileIn.
84b58f2602d9 #BUGFIX by sr
sr
parents: 349
diff changeset
    56
        self logInfo:'ParserFlags makeCommand: ', ParserFlags makeCommand printString.
84b58f2602d9 #BUGFIX by sr
sr
parents: 349
diff changeset
    57
    ].
84b58f2602d9 #BUGFIX by sr
sr
parents: 349
diff changeset
    58
84b58f2602d9 #BUGFIX by sr
sr
parents: 349
diff changeset
    59
    (cmdArgs includes:'--runOnlyExpeccoUnitTests') ifTrue:[
84b58f2602d9 #BUGFIX by sr
sr
parents: 349
diff changeset
    60
        self logInfo:'configured to run expecco unit tests only'.
84b58f2602d9 #BUGFIX by sr
sr
parents: 349
diff changeset
    61
        doRunSpecificUnitTests := true.
84b58f2602d9 #BUGFIX by sr
sr
parents: 349
diff changeset
    62
        unitTestSuiteName := 'expecco Unit Tests'.
84b58f2602d9 #BUGFIX by sr
sr
parents: 349
diff changeset
    63
        excludedUnitTestClassNames := self excludedUnitTestClassNamesForExpecco.
84b58f2602d9 #BUGFIX by sr
sr
parents: 349
diff changeset
    64
    ].
84b58f2602d9 #BUGFIX by sr
sr
parents: 349
diff changeset
    65
84b58f2602d9 #BUGFIX by sr
sr
parents: 349
diff changeset
    66
    doRunSpecificUnitTests ifFalse:[
84b58f2602d9 #BUGFIX by sr
sr
parents: 349
diff changeset
    67
        self logInfo:'configured to run all available unit tests'.
84b58f2602d9 #BUGFIX by sr
sr
parents: 349
diff changeset
    68
    ].
84b58f2602d9 #BUGFIX by sr
sr
parents: 349
diff changeset
    69
84b58f2602d9 #BUGFIX by sr
sr
parents: 349
diff changeset
    70
    self logInfo:'collecting unit test classes to run'.
84b58f2602d9 #BUGFIX by sr
sr
parents: 349
diff changeset
    71
    unitTestSuite := TestSuite named:unitTestSuiteName.
84b58f2602d9 #BUGFIX by sr
sr
parents: 349
diff changeset
    72
399
98d1fb9a0b33 #BUGFIX by sr
sr
parents: 398
diff changeset
    73
self logInfo:'1 ', (Smalltalk at: #'stx_goodies_regression') printString.
98d1fb9a0b33 #BUGFIX by sr
sr
parents: 398
diff changeset
    74
self logInfo:'2 ', (Smalltalk at: #'stx_goodies_regression') classNamesAndAttributes printString.
398
84b58f2602d9 #BUGFIX by sr
sr
parents: 349
diff changeset
    75
84b58f2602d9 #BUGFIX by sr
sr
parents: 349
diff changeset
    76
    (Smalltalk at: #'stx_goodies_regression') classNamesAndAttributes do:[:eachClassNameAndAttributes |
84b58f2602d9 #BUGFIX by sr
sr
parents: 349
diff changeset
    77
        eachClassNameAndAttributes isSymbol ifTrue:[
84b58f2602d9 #BUGFIX by sr
sr
parents: 349
diff changeset
    78
            eachClassName := eachClassNameAndAttributes.
84b58f2602d9 #BUGFIX by sr
sr
parents: 349
diff changeset
    79
        ] ifFalse:[
84b58f2602d9 #BUGFIX by sr
sr
parents: 349
diff changeset
    80
            eachClassName := eachClassNameAndAttributes
84b58f2602d9 #BUGFIX by sr
sr
parents: 349
diff changeset
    81
                firstIfEmpty:nil.
84b58f2602d9 #BUGFIX by sr
sr
parents: 349
diff changeset
    82
        ].
84b58f2602d9 #BUGFIX by sr
sr
parents: 349
diff changeset
    83
84b58f2602d9 #BUGFIX by sr
sr
parents: 349
diff changeset
    84
        (excludedUnitTestClassNames includes:eachClassName) ifFalse:[
84b58f2602d9 #BUGFIX by sr
sr
parents: 349
diff changeset
    85
            (corruptedUnitTestClassNames includes:eachClassName) ifTrue:[
84b58f2602d9 #BUGFIX by sr
sr
parents: 349
diff changeset
    86
                self
84b58f2602d9 #BUGFIX by sr
sr
parents: 349
diff changeset
    87
                    logWarning:('corrupted unit test class detected, please fix #%1'
84b58f2602d9 #BUGFIX by sr
sr
parents: 349
diff changeset
    88
                        bindWith:eachClassName).
84b58f2602d9 #BUGFIX by sr
sr
parents: 349
diff changeset
    89
            ] ifFalse:[
84b58f2602d9 #BUGFIX by sr
sr
parents: 349
diff changeset
    90
                eachClassName notNil ifTrue:[
402
3caf6bff52dc #BUGFIX by sr
sr
parents: 400
diff changeset
    91
"/ check if loaded 
398
84b58f2602d9 #BUGFIX by sr
sr
parents: 349
diff changeset
    92
                                eachClass := Smalltalk
84b58f2602d9 #BUGFIX by sr
sr
parents: 349
diff changeset
    93
                                        fileInClass:eachClassName
84b58f2602d9 #BUGFIX by sr
sr
parents: 349
diff changeset
    94
                                        package:'stx:goodies/regression'.
84b58f2602d9 #BUGFIX by sr
sr
parents: 349
diff changeset
    95
84b58f2602d9 #BUGFIX by sr
sr
parents: 349
diff changeset
    96
                                eachClass notNil ifTrue:[
84b58f2602d9 #BUGFIX by sr
sr
parents: 349
diff changeset
    97
                                eachClass isTestCaseLike ifTrue:[
84b58f2602d9 #BUGFIX by sr
sr
parents: 349
diff changeset
    98
                                        unitTestSuite addTest:eachClass suite.
84b58f2602d9 #BUGFIX by sr
sr
parents: 349
diff changeset
    99
                                ].
84b58f2602d9 #BUGFIX by sr
sr
parents: 349
diff changeset
   100
                    ].
84b58f2602d9 #BUGFIX by sr
sr
parents: 349
diff changeset
   101
                ].
84b58f2602d9 #BUGFIX by sr
sr
parents: 349
diff changeset
   102
            ].
84b58f2602d9 #BUGFIX by sr
sr
parents: 349
diff changeset
   103
        ].
84b58f2602d9 #BUGFIX by sr
sr
parents: 349
diff changeset
   104
    ].
84b58f2602d9 #BUGFIX by sr
sr
parents: 349
diff changeset
   105
84b58f2602d9 #BUGFIX by sr
sr
parents: 349
diff changeset
   106
    self
84b58f2602d9 #BUGFIX by sr
sr
parents: 349
diff changeset
   107
        logInfo:('%1 unit test classes collected'
84b58f2602d9 #BUGFIX by sr
sr
parents: 349
diff changeset
   108
            bindWith:unitTestSuite tests size).
84b58f2602d9 #BUGFIX by sr
sr
parents: 349
diff changeset
   109
84b58f2602d9 #BUGFIX by sr
sr
parents: 349
diff changeset
   110
    self logInfo:'starting unit tests'.
84b58f2602d9 #BUGFIX by sr
sr
parents: 349
diff changeset
   111
    result := unitTestSuite
84b58f2602d9 #BUGFIX by sr
sr
parents: 349
diff changeset
   112
        run:TestResultStX new
84b58f2602d9 #BUGFIX by sr
sr
parents: 349
diff changeset
   113
        beforeEachDo:[:test | self logInfo:'performing unit test ', test printString]
84b58f2602d9 #BUGFIX by sr
sr
parents: 349
diff changeset
   114
        afterEachDo:[:test| ]
84b58f2602d9 #BUGFIX by sr
sr
parents: 349
diff changeset
   115
        debug:(cmdArgs includes:'--debug').
84b58f2602d9 #BUGFIX by sr
sr
parents: 349
diff changeset
   116
84b58f2602d9 #BUGFIX by sr
sr
parents: 349
diff changeset
   117
    self logInfo:'generating report'.
84b58f2602d9 #BUGFIX by sr
sr
parents: 349
diff changeset
   118
    TestResultReporter
84b58f2602d9 #BUGFIX by sr
sr
parents: 349
diff changeset
   119
        report:result
84b58f2602d9 #BUGFIX by sr
sr
parents: 349
diff changeset
   120
        format:#xml_jUnit
84b58f2602d9 #BUGFIX by sr
sr
parents: 349
diff changeset
   121
        as:'testresult.xml'.
84b58f2602d9 #BUGFIX by sr
sr
parents: 349
diff changeset
   122
84b58f2602d9 #BUGFIX by sr
sr
parents: 349
diff changeset
   123
    self logInfo:'summary:'.
84b58f2602d9 #BUGFIX by sr
sr
parents: 349
diff changeset
   124
    self logInfo:('%1 tests' bindWith:result runCount).
84b58f2602d9 #BUGFIX by sr
sr
parents: 349
diff changeset
   125
    self logInfo:('%1 passed' bindWith:result passedCount).
84b58f2602d9 #BUGFIX by sr
sr
parents: 349
diff changeset
   126
    self logInfo:('%1 failed' bindWith:result failureCount).
84b58f2602d9 #BUGFIX by sr
sr
parents: 349
diff changeset
   127
    self logInfo:('%1 errors' bindWith:result errorCount).
329
6a3fe7cea4e1 *** empty log message ***
sr
parents:
diff changeset
   128
! !
6a3fe7cea4e1 *** empty log message ***
sr
parents:
diff changeset
   129
6a3fe7cea4e1 *** empty log message ***
sr
parents:
diff changeset
   130
!RunUnitTests class methodsFor:'constants'!
6a3fe7cea4e1 *** empty log message ***
sr
parents:
diff changeset
   131
6a3fe7cea4e1 *** empty log message ***
sr
parents:
diff changeset
   132
corruptedUnitTestClassNames
6a3fe7cea4e1 *** empty log message ***
sr
parents:
diff changeset
   133
    ^ #(
336
8dcc6a1f364b *** empty log message ***
sr
parents: 335
diff changeset
   134
	#'RegressionTests::ExternalInterfaceTests'
8dcc6a1f364b *** empty log message ***
sr
parents: 335
diff changeset
   135
	#'RegressionTests::HTTPServerTests'
8dcc6a1f364b *** empty log message ***
sr
parents: 335
diff changeset
   136
	#'RegressionTests::DebuggerTest'
345
e59d3b6f2391 *** empty log message ***
sr
parents: 344
diff changeset
   137
	#'RegressionTests::ContextTest2'
329
6a3fe7cea4e1 *** empty log message ***
sr
parents:
diff changeset
   138
    )
6a3fe7cea4e1 *** empty log message ***
sr
parents:
diff changeset
   139
!
6a3fe7cea4e1 *** empty log message ***
sr
parents:
diff changeset
   140
6a3fe7cea4e1 *** empty log message ***
sr
parents:
diff changeset
   141
excludedUnitTestClassNamesForAll
6a3fe7cea4e1 *** empty log message ***
sr
parents:
diff changeset
   142
    ^ #()
6a3fe7cea4e1 *** empty log message ***
sr
parents:
diff changeset
   143
!
6a3fe7cea4e1 *** empty log message ***
sr
parents:
diff changeset
   144
336
8dcc6a1f364b *** empty log message ***
sr
parents: 335
diff changeset
   145
excludedUnitTestClassNamesForExpecco
329
6a3fe7cea4e1 *** empty log message ***
sr
parents:
diff changeset
   146
    ^ self excludedUnitTestClassNamesForAll
402
3caf6bff52dc #BUGFIX by sr
sr
parents: 400
diff changeset
   147
        , #(
3caf6bff52dc #BUGFIX by sr
sr
parents: 400
diff changeset
   148
            #'RegressionTests::BreakpointTests'
3caf6bff52dc #BUGFIX by sr
sr
parents: 400
diff changeset
   149
            #'RegressionTests::SunitXMLOutputTest'
3caf6bff52dc #BUGFIX by sr
sr
parents: 400
diff changeset
   150
            #'RegressionTests::CompilerTests2'
3caf6bff52dc #BUGFIX by sr
sr
parents: 400
diff changeset
   151
            #'RegressionTests::BehaviorLookupObjectTests'
3caf6bff52dc #BUGFIX by sr
sr
parents: 400
diff changeset
   152
            #'RegressionTests::ChangeSetTests'
3caf6bff52dc #BUGFIX by sr
sr
parents: 400
diff changeset
   153
            #'RegressionTests::MakefileTests'
3caf6bff52dc #BUGFIX by sr
sr
parents: 400
diff changeset
   154
            #'RegressionTests::MetaphoneStringComparatorTest'
3caf6bff52dc #BUGFIX by sr
sr
parents: 400
diff changeset
   155
            #'RegressionTests::STCCompilerTests'
3caf6bff52dc #BUGFIX by sr
sr
parents: 400
diff changeset
   156
            #'RegressionTests::VMCrashTests'
3caf6bff52dc #BUGFIX by sr
sr
parents: 400
diff changeset
   157
            #'RegressionTests::SnapshotRestartTests'
3caf6bff52dc #BUGFIX by sr
sr
parents: 400
diff changeset
   158
            #'RegressionTests::GraphicDrawingTest'
3caf6bff52dc #BUGFIX by sr
sr
parents: 400
diff changeset
   159
            #'RegressionTests::OS_OLE_Tests'
3caf6bff52dc #BUGFIX by sr
sr
parents: 400
diff changeset
   160
            #'RegressionTests::ExternalInterfaceTests'
3caf6bff52dc #BUGFIX by sr
sr
parents: 400
diff changeset
   161
            #'RegressionTests::HTTPServerTests'
3caf6bff52dc #BUGFIX by sr
sr
parents: 400
diff changeset
   162
            #'RegressionTests::DebuggerTest'
3caf6bff52dc #BUGFIX by sr
sr
parents: 400
diff changeset
   163
            #'RegressionTests::ContextTest2'
3caf6bff52dc #BUGFIX by sr
sr
parents: 400
diff changeset
   164
        )
329
6a3fe7cea4e1 *** empty log message ***
sr
parents:
diff changeset
   165
! !
6a3fe7cea4e1 *** empty log message ***
sr
parents:
diff changeset
   166
6a3fe7cea4e1 *** empty log message ***
sr
parents:
diff changeset
   167
!RunUnitTests class methodsFor:'logging'!
6a3fe7cea4e1 *** empty log message ***
sr
parents:
diff changeset
   168
6a3fe7cea4e1 *** empty log message ***
sr
parents:
diff changeset
   169
log:aString
6a3fe7cea4e1 *** empty log message ***
sr
parents:
diff changeset
   170
    type:aType
6a3fe7cea4e1 *** empty log message ***
sr
parents:
diff changeset
   171
336
8dcc6a1f364b *** empty log message ***
sr
parents: 335
diff changeset
   172
    Stdout
8dcc6a1f364b *** empty log message ***
sr
parents: 335
diff changeset
   173
	showCR:('%1 [%2] : %3'
8dcc6a1f364b *** empty log message ***
sr
parents: 335
diff changeset
   174
	    bindWith:Timestamp now printString
8dcc6a1f364b *** empty log message ***
sr
parents: 335
diff changeset
   175
	    with:(aType printString asLowercase paddedTo:'warning' size)
8dcc6a1f364b *** empty log message ***
sr
parents: 335
diff changeset
   176
	    with:aString).
329
6a3fe7cea4e1 *** empty log message ***
sr
parents:
diff changeset
   177
!
6a3fe7cea4e1 *** empty log message ***
sr
parents:
diff changeset
   178
6a3fe7cea4e1 *** empty log message ***
sr
parents:
diff changeset
   179
logInfo:aString
6a3fe7cea4e1 *** empty log message ***
sr
parents:
diff changeset
   180
    self
336
8dcc6a1f364b *** empty log message ***
sr
parents: 335
diff changeset
   181
	log:aString
8dcc6a1f364b *** empty log message ***
sr
parents: 335
diff changeset
   182
	type:'INFO'
329
6a3fe7cea4e1 *** empty log message ***
sr
parents:
diff changeset
   183
!
6a3fe7cea4e1 *** empty log message ***
sr
parents:
diff changeset
   184
6a3fe7cea4e1 *** empty log message ***
sr
parents:
diff changeset
   185
logWarning:aString
6a3fe7cea4e1 *** empty log message ***
sr
parents:
diff changeset
   186
    self
336
8dcc6a1f364b *** empty log message ***
sr
parents: 335
diff changeset
   187
	log:aString
8dcc6a1f364b *** empty log message ***
sr
parents: 335
diff changeset
   188
	type:'WARNING'
329
6a3fe7cea4e1 *** empty log message ***
sr
parents:
diff changeset
   189
! !
349
ed255c6cf368 #DOCUMENTATION by sr
sr
parents: 348
diff changeset
   190
ed255c6cf368 #DOCUMENTATION by sr
sr
parents: 348
diff changeset
   191
!RunUnitTests class methodsFor:'documentation'!
ed255c6cf368 #DOCUMENTATION by sr
sr
parents: 348
diff changeset
   192
399
98d1fb9a0b33 #BUGFIX by sr
sr
parents: 398
diff changeset
   193
version
98d1fb9a0b33 #BUGFIX by sr
sr
parents: 398
diff changeset
   194
    ^ '$Header$'
98d1fb9a0b33 #BUGFIX by sr
sr
parents: 398
diff changeset
   195
!
98d1fb9a0b33 #BUGFIX by sr
sr
parents: 398
diff changeset
   196
349
ed255c6cf368 #DOCUMENTATION by sr
sr
parents: 348
diff changeset
   197
version_CVS
ed255c6cf368 #DOCUMENTATION by sr
sr
parents: 348
diff changeset
   198
    ^ '$Header$'
ed255c6cf368 #DOCUMENTATION by sr
sr
parents: 348
diff changeset
   199
! !
ed255c6cf368 #DOCUMENTATION by sr
sr
parents: 348
diff changeset
   200