compiler/tests/extras/PPTokenizedSmalltalkGrammarTests.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Tue, 12 May 2015 01:24:03 +0100
changeset 459 4751c407bb40
parent 452 9f4558b3be66
child 464 f6d77fee9811
permissions -rw-r--r--
Merged with PetitCompiler-JanKurs.20150510144201, PetitCompiler-Tests-JanKurs.20150510144201, PetitCompiler-Extras-Tests-JanKurs.20150510144201, PetitCompiler-Benchmarks-JanKurs.20150510144201 Name: PetitCompiler-JanKurs.20150510144201 Author: JanKurs Time: 10-05-2015, 04:42:29.192 PM UUID: 58a4786b-1182-4904-8b44-a13d3918f244 Name: PetitCompiler-Tests-JanKurs.20150510144201 Author: JanKurs Time: 10-05-2015, 04:32:12.870 PM UUID: 2a8fd41a-331b-4dcf-a7a3-752a50ce86e7 Name: PetitCompiler-Extras-Tests-JanKurs.20150510144201 Author: JanKurs Time: 10-05-2015, 04:59:25.308 PM UUID: ef43bd1a-be60-4e88-b749-8b635622c969 Name: PetitCompiler-Benchmarks-JanKurs.20150510144201 Author: JanKurs Time: 10-05-2015, 05:04:54.561 PM UUID: d8e764fd-016b-46e2-9fc1-17c38c18f0e5

"{ Package: 'stx:goodies/petitparser/compiler/tests/extras' }"

"{ NameSpace: Smalltalk }"

PPCompositeParserTest subclass:#PPTokenizedSmalltalkGrammarTests
	instanceVariableNames:''
	classVariableNames:''
	poolDictionaries:''
	category:'PetitCompiler-Extras-Tests-Smalltalk'
!

!PPTokenizedSmalltalkGrammarTests class methodsFor:'accessing'!

resources
    ^ (OrderedCollection with: PPTokenizedSmalltalkGrammarResource)
        addAll: super resources;
        yourself
! !

!PPTokenizedSmalltalkGrammarTests methodsFor:'accessing'!

context
    ^ PPCContext new
!

parserClass
    ^ Smalltalk at: #PPTokenizedSmalltalkGrammar
!

parserInstanceFor: aSymbol
    ^ (Smalltalk at: #PPTokenizedSmalltalkGrammar) new startSymbol: aSymbol
!

testSmalltalkWhitespace
    | whitespaces |
    whitespaces :=	parser class methodDictionary keys select: [:e | e beginsWith: 'smalltalk_ws' ].
    self assert: whitespaces size = 1.
! !

!PPTokenizedSmalltalkGrammarTests methodsFor:'testing'!

testArray1
    self 
        parse: '{}'
        rule: #array
!

testArray2
    self 
        parse: '{self foo}'
        rule: #array
!

testArray3
    self 
        parse: '{self foo. self bar}'
        rule: #array
!

testArray4
    self 
        parse: '{self foo. self bar.}'
        rule: #array
!

testAssignment1
    self 
        parse: '1'
        rule: #expression
!

testAssignment2
    self 
        parse: 'a := 1'
        rule: #expression
!

testAssignment3
    self 
        parse: 'a := b := 1'
        rule: #expression
!

testAssignment4
    PPSmalltalkGrammar allowUnderscoreAssignment
        ifTrue: [ self parse: 'a _ 1' rule: #expression ]
        ifFalse: [ self fail: 'a _ 1' rule: #expression ]
!

testAssignment5
    PPSmalltalkGrammar allowUnderscoreAssignment
        ifTrue: [ self parse: 'a _ b _ 1' rule: #expression ]
        ifFalse: [ self fail: 'a _ b _ 1' rule: #expression ]
!

testAssignment6
    self 
        parse: 'a := (b := c)'
        rule: #expression
!

testComment1
    self 
        parse: '1"one"+2'
        rule: #expression
!

testComment2
    self 
        parse: '1 "one" +2'
        rule: #expression
!

testComment3
    self 
        parse: '1"one"+"two"2'
        rule: #expression
!

testComment4
    self 
        parse: '1"one""two"+2'
        rule: #expression
!

testComment5
    self 
        parse: '1"one"	"two"+2'
        rule: #expression
!

testCompleteness
    "This test asserts that all subclasses override all test methods."
    
    self class allSubclasses do: [ :subclass |
        self class testSelectors do: [ :selector |
            self 
                assert: (selector = #testCompleteness or: [ subclass selectors includes: selector ])
                description: subclass printString , ' does not test ' , selector printString ] ]
!

testMethod1
    self 
        parse: 'negated ^ 0 - self'
        rule: #method
!

testMethod2
    "Spaces at the beginning of the method."
    self 
        parse: '	  negated ^ 0 - self'
        rule: #method
!

testMethod3
    "Spaces at the end of the method."
    self 
        parse: '	negated ^ 0 - self  '
        rule: #method
!

testSequence1
    self 
        parse: '| a | 1 . 2'
        rule: #sequence
!

testStatements1
    self 
        parse: '1'
        rule: #sequence
!

testStatements2
    self 
        parse: '1 . 2'
        rule: #sequence
!

testStatements3
    self 
        parse: '1 . 2 . 3'
        rule: #sequence
!

testStatements4
    self 
        parse: '1 . 2 . 3 .'
        rule: #sequence
!

testStatements5
    self 
        parse: '1 . . 2'
        rule: #sequence
!

testStatements6
    self 
        parse: '1. 2'
        rule: #sequence
!

testStatements7
    self 
        parse: '. 1'
        rule: #sequence
!

testStatements8
    self 
        parse: '.1'
        rule: #sequence
!

testStatements9
    self 
        parse: ''
        rule: #statements
!

testTemporaries1
    self 
        parse: '| a |'
        rule: #sequence
!

testTemporaries2
    self 
        parse: '| a b |'
        rule: #sequence
!

testTemporaries3
    self 
        parse: '| a b c |'
        rule: #sequence
!

testVariable1
    self 
        parse: 'trueBinding'
        rule: #primary
!

testVariable2
    self 
        parse: 'falseBinding'
        rule: #primary
!

testVariable3
    self 
        parse: 'nilly'
        rule: #primary
!

testVariable4
    self 
        parse: 'selfish'
        rule: #primary
!

testVariable5
    self 
        parse: 'supernanny'
        rule: #primary
!

testVariable6
    PPSmalltalkGrammar allowUnderscoreAssignment ifFalse: [
        self 
            parse: 'super_nanny'
            rule: #primary ]
!

testVariable7
    PPSmalltalkGrammar allowUnderscoreAssignment ifFalse: [
        self 
            parse: '__gen_var_123__'
            rule: #primary ]
! !

!PPTokenizedSmalltalkGrammarTests methodsFor:'testing-blocks'!

testArgumentsBlock1
    self 
        parse: '[ :a | ]'
        rule: #block
!

testArgumentsBlock2
    self 
        parse: '[ :a :b | ]'
        rule: #block
!

testArgumentsBlock3
    self 
        parse: '[ :a :b :c | ]'
        rule: #block
!

testBlock1
    self 
        parse: '[]'
        rule: #block
!

testComplexBlock1
    self 
        parse: '[ :a | | b | c ]'
        rule: #block
!

testComplexBlock2
    self 
        parse: '[:a||b|c]'
        rule: #block
!

testSimpleBlock1
    self 
        parse: '[ ]'
        rule: #block
!

testSimpleBlock2
    self 
        parse: '[ nil ]'
        rule: #block
!

testSimpleBlock3
    self 
        parse: '[ :a ]'
        rule: #block
!

testStatementBlock1
    self 
        parse: '[ nil ]'
        rule: #block
!

testStatementBlock2
    self 
        parse: '[ | a | nil ]'
        rule: #block
!

testStatementBlock3
    self 
        parse: '[ | a b | nil ]'
        rule: #block
! !

!PPTokenizedSmalltalkGrammarTests methodsFor:'testing-literals'!

testArrayLiteral1
    self 
        parse: '#()'
        rule: #arrayLiteral
!

testArrayLiteral10
    self 
        parse: '#((1 2) #(1 2 3))'
        rule: #arrayLiteral
!

testArrayLiteral11
    self 
        parse: '#([1 2] #[1 2 3])'
        rule: #arrayLiteral
!

testArrayLiteral2
    self 
        parse: '#(1)'
        rule: #arrayLiteral
!

testArrayLiteral3
    self 
        parse: '#(1 2)'
        rule: #arrayLiteral
!

testArrayLiteral4
    self 
        parse: '#(true false nil)'
        rule: #arrayLiteral
!

testArrayLiteral5
    self 
        parse: '#($a)'
        rule: #arrayLiteral
!

testArrayLiteral6
    self 
        parse: '#(1.2)'
        rule: #arrayLiteral
!

testArrayLiteral7
    self 
        parse: '#(size #at: at:put: #''=='')'
        rule: #arrayLiteral
!

testArrayLiteral8
    self 
        parse: '#(''baz'')'
        rule: #arrayLiteral
!

testArrayLiteral9
    self 
        parse: '#((1) 2)'
        rule: #arrayLiteral
!

testByteLiteral1
    self 
        parse: '#[]'
        rule: #byteLiteral
!

testByteLiteral2
    self 
        parse: '#[0]'
        rule: #byteLiteral
!

testByteLiteral3
    self 
        parse: '#[255]'
        rule: #byteLiteral
!

testByteLiteral4
    self 
        parse: '#[ 1 2 ]'
        rule: #byteLiteral
!

testByteLiteral5
    self 
        parse: '#[ 2r1010 8r77 16rFF ]'
        rule: #byteLiteral
!

testCharLiteral1
    self 
        parse: '$a'
        rule: #charLiteral
!

testCharLiteral2
    self 
        parse: '$ '
        rule: #charLiteral
!

testCharLiteral3
    self 
        parse: '$$'
        rule: #charLiteral
!

testNumberLiteral1
    self 
        parse: '0'
        rule: #numberLiteral
!

testNumberLiteral10
    self 
        parse: '10r10'
        rule: #numberLiteral
!

testNumberLiteral11
    self 
        parse: '8r777'
        rule: #numberLiteral
!

testNumberLiteral12
    self 
        parse: '16rAF'
        rule: #numberLiteral
!

testNumberLiteral13
    self 
        parse: '16rCA.FE'
        rule: #numberLiteral
!

testNumberLiteral14
    self 
        parse: '3r-22.2'
        rule: #numberLiteral
!

testNumberLiteral15
    self 
        parse: '0.50s2'
        rule: #numberLiteral
!

testNumberLiteral2
    self 
        parse: '0.1'
        rule: #numberLiteral
!

testNumberLiteral3
    self 
        parse: '123'
        rule: #numberLiteral
!

testNumberLiteral4
    self 
        parse: '123.456'
        rule: #numberLiteral
!

testNumberLiteral5
    self 
        parse: '-0'
        rule: #numberLiteral
!

testNumberLiteral6
    self 
        parse: '-0.1'
        rule: #numberLiteral
!

testNumberLiteral7
    self 
        parse: '-123'
        rule: #numberLiteral
!

testNumberLiteral8
    self 
        parse: '-125'
        rule: #numberLiteral
!

testNumberLiteral9
    self 
        parse: '-123.456'
        rule: #numberLiteral
!

testSpecialLiteral1
    self 
        parse: 'true'
        rule: #trueLiteral
!

testSpecialLiteral2
    self 
        parse: 'false'
        rule: #falseLiteral
!

testSpecialLiteral3
    self 
        parse: 'nil'
        rule: #nilLiteral
!

testStringLiteral1
    self 
        parse: ''''''
        rule: #stringLiteral
!

testStringLiteral2
    self 
        parse: '''ab'''
        rule: #stringLiteral
!

testStringLiteral3
    self 
        parse: '''ab''''cd'''
        rule: #stringLiteral
!

testSymbolLiteral1
    self 
        parse: '#foo'
        rule: #symbolLiteral
!

testSymbolLiteral2
    self 
        parse: '#+'
        rule: #symbolLiteral
!

testSymbolLiteral3
    self 
        parse: '#key:'
        rule: #symbolLiteral
!

testSymbolLiteral4
    self 
        parse: '#key:value:'
        rule: #symbolLiteral
!

testSymbolLiteral5
    self 
        parse: '#''testing-result'''
        rule: #symbolLiteral
!

testSymbolLiteral6
    PPSmalltalkGrammar allowUnderscoreAssignment ifFalse: [
        self 
            parse: '#__gen__binding'
            rule: #symbolLiteral ]
!

testSymbolLiteral7
    self 
        parse: '# fucker'
        rule: #symbolLiteral
!

testSymbolLiteral8
    self 
        parse: '##fucker'
        rule: #symbolLiteral
!

testSymbolLiteral9
    self 
        parse: '## fucker'
        rule: #symbolLiteral
! !

!PPTokenizedSmalltalkGrammarTests methodsFor:'testing-messages'!

testBinaryExpression1
    self 
        parse: '1 + 2'
        rule: #expression
!

testBinaryExpression2
    self 
        parse: '1 + 2 + 3'
        rule: #expression
!

testBinaryExpression3
    self 
        parse: '1 // 2'
        rule: #expression
!

testBinaryExpression4
    self 
        parse: '1 -- 2'
        rule: #expression
!

testBinaryExpression5
    self 
        parse: '1 ==> 2'
        rule: #expression.
!

testBinaryMethod1
    self 
        parse: '+ a'
        rule: #method
!

testBinaryMethod2
    self 
        parse: '+ a | b |'
        rule: #method
!

testBinaryMethod3
    self 
        parse: '+ a b'
        rule: #method
!

testBinaryMethod4
    self 
        parse: '+ a | b | c'
        rule: #method
!

testBinaryMethod5
    self 
        parse: '-- a'
        rule: #method
!

testCascadeExpression1
    self 
        parse: '1 abs; negated'
        rule: #expression
!

testCascadeExpression2
    self 
        parse: '1 abs negated; raisedTo: 12; negated'
        rule: #expression
!

testCascadeExpression3
    self 
        parse: '1 + 2; - 3'
        rule: #expression
!

testIdentifierToken
    self 
        parse: 'foo'
        rule: #identifierToken
!

testIdentifierToken2
    self
        parse: '  foo'
        rule: #identifierToken
!

testKeywordExpression1
    self 
        parse: '1 to: 2'
        rule: #expression
!

testKeywordExpression2
    self 
        parse: '1 to: 2 by: 3'
        rule: #expression
!

testKeywordExpression3
    self 
        parse: '1 to: 2 by: 3 do: 4'
        rule: #expression
!

testKeywordMethod1
    self 
        parse: 'to: a'
        rule: #method
!

testKeywordMethod2
    self 
        parse: 'to: a do: b | c |'
        rule: #method
!

testKeywordMethod3
    self 
        parse: 'to: a do: b by: c d'
        rule: #method
!

testKeywordMethod4
    self 
        parse: 'to: a do: b by: c | d | e'
        rule: #method
!

testUnaryExpression1
    self 
        parse: '1 abs'
        rule: #expression
!

testUnaryExpression2
    self 
        parse: '1 abs negated'
        rule: #expression
!

testUnaryMethod1
    self 
        parse: 'abs'
        rule: #method
!

testUnaryMethod2
    self 
        parse: 'abs | a |'
        rule: #method
!

testUnaryMethod3
    self 
        parse: 'abs a'
        rule: #method
!

testUnaryMethod4
    self 
        parse: 'abs | a | b'
        rule: #method
!

testUnaryMethod5
    self 
        parse: 'abs | a |'
        rule: #method
! !

!PPTokenizedSmalltalkGrammarTests methodsFor:'testing-pragmas'!

testPragma1
    self 
        parse: 'method <foo>'
        rule: #method
!

testPragma10
    self 
        parse: 'method <foo: bar>'
        rule: #method
!

testPragma11
    self 
        parse: 'method <foo: true>'
        rule: #method
!

testPragma12
    self 
        parse: 'method <foo: false>'
        rule: #method
!

testPragma13
    self 
        parse: 'method <foo: nil>'
        rule: #method
!

testPragma14
    self 
        parse: 'method <foo: ()>'
        rule: #method
!

testPragma15
    self 
        parse: 'method <foo: #()>'
        rule: #method
!

testPragma16
    self 
        parse: 'method < + 1 >'
        rule: #method
!

testPragma2
    self 
        parse: 'method <foo> <bar>'
        rule: #method
!

testPragma3
    self 
        parse: 'method | a | <foo>'
        rule: #method
!

testPragma4
    self 
        parse: 'method <foo> | a |'
        rule: #method
!

testPragma5
    self 
        parse: 'method <foo> | a | <bar>'
        rule: #method
!

testPragma6
    self 
        parse: 'method <foo: 1>'
        rule: #method
!

testPragma7
    self 
        parse: 'method <foo: 1.2>'
        rule: #method
!

testPragma8
    self 
        parse: 'method <foo: ''bar''>'
        rule: #method
!

testPragma9
    self 
        parse: 'method <foo: #''bar''>'
        rule: #method
! !