analyzer/tests/PPRewriterTest.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Sun, 05 Oct 2014 00:29:07 +0100
changeset 382 1825151d6455
parent 209 27b919ed87da
child 402 1d7503124bc8
permissions -rw-r--r--
Added target `mcz` to export .mcz package out of Smalltalk/X package.

"{ Package: 'stx:goodies/petitparser/analyzer/tests' }"

PPAbstractParserTest subclass:#PPRewriterTest
	instanceVariableNames:'rewriter'
	classVariableNames:''
	poolDictionaries:''
	category:'PetitAnalyzer-Tests'
!


!PPRewriterTest methodsFor:'running'!

setUp
	rewriter := PPRewriter new
! !

!PPRewriterTest methodsFor:'testing'!

testDuplicationRemoval
	| duplicate before between after result |
	duplicate := PPPattern any.
	before := PPListPattern any.
	between := PPListPattern any.
	after := PPListPattern any.
	rewriter
		replace: before / duplicate / between / duplicate / after
		with: before / duplicate / between / after.
	
	result := rewriter execute: $a asParser / $a asParser.
	self assert: rewriter hasChanged.
	self assert: result children size = 1.
	self assert: result children first literal = $a.
	
	result := rewriter execute: $b asParser / $a asParser / $a asParser.
	self assert: rewriter hasChanged.
	self assert: result children size = 2.
	self assert: result children first literal = $b.
	self assert: result children last literal = $a.
	
	result := rewriter execute: $a asParser / $b asParser / $a asParser.
	self assert: rewriter hasChanged.
	self assert: result children size = 2.
	self assert: result children first literal = $a.
	self assert: result children last literal = $b.
	
	result := rewriter execute: $a asParser / $a asParser / $b asParser.
	self assert: rewriter hasChanged.
	self assert: result children size = 2.
	self assert: result children first literal = $a.
	self assert: result children last literal = $b	
!

testPatternRemoval
	| pattern result |
	pattern := PPPattern class: PPLiteralObjectParser.
	rewriter
		replace: pattern / pattern
		with: pattern.
	
	result := rewriter execute: $a asParser / $a asParser.
	self assert: rewriter hasChanged.
	self assert: result class = PPLiteralObjectParser.
	self assert: result literal = $a.
	
	result := rewriter execute: $a asParser / $a asParser / $a asParser.
	self deny: rewriter hasChanged.
	self assert: result class = PPChoiceParser.
	self assert: result children size = 3
!

testPatternReplacement
	| pattern result |
	pattern := PPPattern class: PPLiteralObjectParser.
	rewriter
		replace: pattern
		with: pattern , pattern.
	
	result := rewriter execute: $a asParser.
	self assert: rewriter hasChanged.
	self assert: result class = PPSequenceParser.
	self assert: result children first literal = $a.
	self assert: result children last literal = $a.
	
	result := rewriter execute: #any asParser.
	self deny: rewriter hasChanged.
	self assert: result class = PPPredicateObjectParser
!

testReplaceLiteral
	| result |
	rewriter
		replace: $a asParser 
		with: $b asParser.
	
	result := rewriter execute: $a asParser.
	self assert: rewriter hasChanged.
	self assert: result literal = $b.
	
	result := rewriter execute: $c asParser.
	self deny: rewriter hasChanged.
	self assert: result literal = $c.
	
	result := rewriter execute: $a asParser , $b asParser , $c asParser.
	self assert: rewriter hasChanged.
	self assert: result children size = 3.
	self assert: result children first literal = $b.
	self assert: result children last literal = $c
!

testSwapTwoPattern
	| first second result |
	first := PPPattern any.
	second := PPPattern any.
	rewriter
		replace: first , second
		with: second , first.
	
	result := rewriter execute: $a asParser , $b asParser.
	self assert: rewriter hasChanged.
	self assert: result children first literal = $b.
	self assert: result children last literal = $a.
	
	result := rewriter execute: $a asParser / $b asParser.
	self deny: rewriter hasChanged.
	self assert: result children first literal = $a.
	self assert: result children last literal = $b
!

testWrapLiteral
	| result |
	rewriter
		replace: $a asParser
		withValueFrom: [ :parser | parser token ].
	
	result := rewriter execute: $a asParser.
	self assert: rewriter hasChanged.
	self assert: result class = PPTokenParser.
	self assert: result children first literal = $a.
	
	result := rewriter execute: $c asParser.
	self deny: rewriter hasChanged.
	self assert: result literal = $c.
	
	result := rewriter execute: $a asParser , $b asParser.
	self assert: rewriter hasChanged.
	self assert: result children first class = PPTokenParser.
	self assert: result children first children first literal = $a.
	self assert: result children last class = PPLiteralObjectParser.
	self assert: result children last literal = $b
! !

!PPRewriterTest class methodsFor:'documentation'!

version
    ^ '$Header: /cvs/stx/stx/goodies/petitparser/analyzer/tests/PPRewriterTest.st,v 1.1 2014-03-04 15:43:01 cg Exp $'
!

version_CVS
    ^ '$Header: /cvs/stx/stx/goodies/petitparser/analyzer/tests/PPRewriterTest.st,v 1.1 2014-03-04 15:43:01 cg Exp $'
!

version_HG

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