islands/tests/XmlFeedParserTest.st
changeset 387 e2b2ccaa4de6
child 389 009c2e13973c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/islands/tests/XmlFeedParserTest.st	Wed Oct 08 00:33:44 2014 +0100
@@ -0,0 +1,256 @@
+"{ Package: 'stx:goodies/petitparser/islands/tests' }"
+
+PPCompositeParserTest subclass:#XmlFeedParserTest
+	instanceVariableNames:'debugResult'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'PetitIslands-Examples'
+!
+
+XmlFeedParserTest comment:''
+!
+
+!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'.
+	
+! !
+