islands/tests/XmlFeedParserTest.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Sat, 19 Mar 2016 00:12:47 +0100
changeset 556 51c6afba5c91
parent 454 a9cd5ea7cc36
permissions -rw-r--r--
CI: Use VM provided by Pharo team on both Linux and Windows. Hand-crafter Pharo VM is no longer needed as the Linux slave in SWING build farm has been upgraded so it has compatible GLIBC. This makes CI scripts simpler and more usable for other people.

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

"{ NameSpace: Smalltalk }"

PPCompositeParserTest subclass:#XmlFeedParserTest
	instanceVariableNames:'debugResult'
	classVariableNames:''
	poolDictionaries:''
	category:'PetitIslands-Examples'
!

!XmlFeedParserTest methodsFor:'as yet unclassified'!

debug: aString rule: aSymbol
	| production |
	production := self parserInstanceFor: aSymbol.
	debugResult := production end debug: aString.
	result := debugResult children first result.
	self
		deny: result isPetitFailure
		description: 'Unable to parse ' , aString printString.
	^ result
!

feed01
^'
<shoplist>
<name>ABC Shop</name>
<address>Here and there 123, 123 45 Somewhere</address>
<item>
  <name>socks</name>
  <price>123</price>
  <availability>1</availability>
</item>
</shoplist>
'
!

feed02
^'
<shoplist>
<name>ABC Shop</name>
<address>Here and there 123, 123 45 Somewhere</address>
<item>
  <name>socks</name>
  <price>123</price>
  <availability>1</availability>
</item>


<item>
  <name> shoes </name>
  <price>2345</price>
  <availability>1</availability>
</item>

</shoplist>
'
!

feed03
^'
<shoplist>
<name>ABC Shop</name>
<address>Here and there 123, 123 45 Somewhere</address>
<item>
  <name>socks</name>
  <price>123</price>
  <availability>1</availability>
</item>


<item>
  <name> shoes </name>
  <price>2345</price>
  <!!-- this one is malformed -->
  <availability>1 </
</item>

<item>
  <name> shoes </name>
  <price>3456</price>
  <availability>0</availability>
</item>


</shoplist>
'
!

parse: aString rule: aSymbol to: anObject
	| production |
	production := self parserInstanceFor: aSymbol.
	result := production end parse: aString.
	self
		deny: result isPetitFailure
		description: 'Unable to parse ' , aString printString.
	self assert: result = anObject.
	
	^ result
!

parserClass
	^ XmlFeedParser
!

testItem
	self testItem01.
	self testItem02.
	self testItem03.
	
!

testItem01
	self debug: '
	<item>
		<name>abc</name>
	</item>
	' rule: #item.
	
	self assert: (result at: #name) = 'abc'.
	
!

testItem02
	self debug: '
	<item>
		<name>abc</name>
		<price>123</price>
	</item>
	' rule: #item.
	
	self assert: (result at: #name) = 'abc'.
	self assert: (result at: #price) = '123'.
	
!

testItem03
	self debug: '
	<item>
		<price>123</price>
		<name>abc</name>
	</item>
	' rule: #item.
	
	self assert: (result at: #name) = 'abc'.
	self assert: (result at: #price) = '123'.
	
!

testShoplist
	self testShoplist01.
	self testShoplist02.
	self testShoplist03.
!

testShoplist01
	self debug: '
<shoplist>
	<item>
		<name>abc</name>
	</item>
</shoplist>
	' rule: #shoplist.
	
	self assert: result size = 1.
	
!

testShoplist02
	self debug: '
<shoplist>
	<name>xyz</name>
	<item>
		<name>abc</name>
		<price>123</price>
	</item>
</shoplist>
	' rule: #shoplist.
	
	self assert: result size = 1.
	
!

testShoplist03
	self debug: '
<shoplist>
	<name>xyz</name>
	<item>
		<name>abc</name>
		<price>123</price>
	</item>
	<item>
		<name>cde</name>
		<price>345</price>
	</item>
</shoplist>
	' rule: #shoplist.
	
	self assert: result size = 2.
	
!

testSimpleElement
	self parse: '<a>b</a>' rule: #simpleElement to: #('a' 'b').	
	self parse: '<abc> def </ abc>' rule: #simpleElement to: #('abc' 'def').	
		
	self fail: '<a>b</b>' rule: #simpleElement.
	
!

testStringValue
	self parse: 'abc' rule: #stringValue to: 'abc'.	
	self parse: ' def ' rule: #stringValue to: 'def'.
	
!

testXmlFeed01
	self parse: self feed01.
	
	self assert: result size = 1.
	self assert: (result first at:#name) = 'socks'.
	self assert: (result first at:#price) = '123'.
	self assert: (result first at:#availability) = '1'.
	
!

testXmlFeed02
	self parse: self feed02.
	
	self assert: result size = 2.
	self assert: (result first at:#name) = 'socks'.
	self assert: (result first at:#price) = '123'.
	self assert: (result first at:#availability) = '1'.

	self assert: (result second at:#name) = 'shoes'.
	self assert: (result second at:#price) = '2345'.
	self assert: (result second at:#availability) = '1'.
	
!

testXmlFeed03
	self parse: self feed03.
	
	self assert: result size = 2.
	self assert: (result first at:#name) = 'socks'.
	self assert: (result first at:#price) = '123'.
	self assert: (result first at:#availability) = '1'.

	self assert: (result second at:#name) = 'shoes'.
	self assert: (result second at:#price) = '3456'.
	self assert: (result second at:#availability) = '0'.
	
! !