compiler/tests/extras/PPTokenizedSmalltalkParserTests.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Fri, 24 Jul 2015 15:06:54 +0100
changeset 502 1e45d3c96ec5
permissions -rw-r--r--
Updated to PetitCompiler-JanVrany.135, PetitCompiler-Tests-JanKurs.93, PetitCompiler-Extras-Tests-JanVrany.16, PetitCompiler-Benchmarks-JanKurs.12 Name: PetitCompiler-JanVrany.135 Author: JanVrany Time: 22-07-2015, 06:53:29.127 PM UUID: 890178b5-275d-46af-a2ad-1738998f07cb Ancestors: PetitCompiler-JanVrany.134 Name: PetitCompiler-Tests-JanKurs.93 Author: JanKurs Time: 20-07-2015, 11:30:10.283 PM UUID: 6473e671-ad70-42ca-b6c3-654b78edc531 Ancestors: PetitCompiler-Tests-JanKurs.92 Name: PetitCompiler-Extras-Tests-JanVrany.16 Author: JanVrany Time: 22-07-2015, 05:18:22.387 PM UUID: 8f6f9129-dbba-49b1-9402-038470742f98 Ancestors: PetitCompiler-Extras-Tests-JanKurs.15 Name: PetitCompiler-Benchmarks-JanKurs.12 Author: JanKurs Time: 06-07-2015, 02:10:06.901 PM UUID: cb24f1ac-46a4-494d-9780-64576f0f0dba Ancestors: PetitCompiler-Benchmarks-JanKurs.11, PetitCompiler-Benchmarks-JanVrany.e29bd90f388e.20150619081300

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

"{ NameSpace: Smalltalk }"

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

!PPTokenizedSmalltalkParserTests class methodsFor:'accessing'!

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

!PPTokenizedSmalltalkParserTests methodsFor:'accessing'!

context
    ^ PPCContext new
!

parserClass
    ^ Smalltalk at: #PPTokenizedSmalltalkParser
!

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

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

!PPTokenizedSmalltalkParserTests 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
!

testMethod4
    self 
        parse: 'foo: bar
    foo:= bar'
        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 ]
! !

!PPTokenizedSmalltalkParserTests 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
! !

!PPTokenizedSmalltalkParserTests 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
! !

!PPTokenizedSmalltalkParserTests 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
! !

!PPTokenizedSmalltalkParserTests 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
! !