parsers/java/PPJavaLexiconTest.st
changeset 435 3bc08fb90133
child 436 e1c44b571db9
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/parsers/java/PPJavaLexiconTest.st	Tue Apr 21 14:57:16 2015 +0100
@@ -0,0 +1,750 @@
+"{ Encoding: utf8 }"
+
+"{ Package: 'stx:goodies/petitparser/parsers/java' }"
+
+"{ NameSpace: Smalltalk }"
+
+PPCompositeParserTest subclass:#PPJavaLexiconTest
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'PetitJava-Tests'
+!
+
+PPJavaLexiconTest comment:''
+!
+
+!PPJavaLexiconTest methodsFor:'accessing'!
+
+parserClass
+	^ PPJavaLexicon
+! !
+
+!PPJavaLexiconTest methodsFor:'testing'!
+
+testIdentifier6
+
+	self
+		fail: 'super'
+		rule: #identifier
+! !
+
+!PPJavaLexiconTest methodsFor:'testing-comments'!
+
+testComment1
+
+	self 
+		parse: '//'
+		rule: #comment
+!
+
+testComment2
+
+	self 
+		parse: '//comment'
+		rule: #comment
+!
+
+testComment3
+
+	self 
+		parse: '// comment'
+		rule: #comment
+!
+
+testComment4
+
+	self 
+		parse: '/* comment */'
+		rule: #comment
+!
+
+testComment5
+
+	self 
+		fail: '/* comment '
+		rule: #comment
+!
+
+testComment6
+
+	self 
+		parse: '/* this comment /* // /** ends here: */'
+		rule: #comment
+!
+
+testComment7
+
+	self 
+		parse: '/**
+     * @param args 
+     * @return void
+     */'
+		rule: #comment
+!
+
+testTraditionalComment1
+
+	self 
+		parse: '/* this comment */'
+		rule: #traditionalComment
+!
+
+testTraditionalComment2
+
+	self 
+		parse: '/* this comment / */'
+		rule: #comment
+! !
+
+!PPJavaLexiconTest methodsFor:'testing-identifiers'!
+
+testIdentifier1
+
+	self
+		parse: 'String'
+		rule: #identifier
+!
+
+testIdentifier2
+
+	self
+		parse: 'i3'
+		rule: #identifier
+!
+
+testIdentifier3
+
+	self
+		parse: 'αρετη'
+		rule: #identifier
+!
+
+testIdentifier4
+
+	self
+		parse: 'MAX_VALUE'
+		rule: #identifier
+!
+
+testIdentifier5
+
+	self
+		parse: 'isLetterOrDigit'
+		rule: #identifier
+! !
+
+!PPJavaLexiconTest methodsFor:'testing-input'!
+
+testInput1
+
+	self parse: 'package testPackage;
+						class Test {
+        				public static void main(String[] args) {
+                			String hello = "Hello", lo = "lo";
+                			System.out.print((hello == "Hello") + " ");
+                			System.out.print((Other.hello == hello) + " ");
+                			System.out.print((other.Other.hello == hello) + " ");
+                			System.out.print((hello == ("Hel"+"lo")) + " ");
+                			System.out.print((hello == ("Hel"+lo)) + " ");
+                			System.out.println(hello == ("Hel"+lo).intern());
+        				}
+						}
+						class Other { static String hello = "Hello"; }'
+	rule: #input
+!
+
+testInput2
+
+	self parse: 'package other;
+						public class Other { static String hello = "Hello"; }'
+	rule: #input
+!
+
+testInput3
+
+	self parse: 'class Value { int val; }	
+						class Test {
+        				public static void main(String[] args) {
+              			int i1 = 3;
+                		int i2 = i1;
+                		i2 = 4;
+                		System.out.print("i1==" + i1);
+                		System.out.println(" but i2==" + i2);
+                		Value v1 = new Value();
+                		v1.val = 5;
+                		Value v2 = v1;
+                		v2.val = 6;
+                		System.out.print("v1.val==" + v1.val);
+                		System.out.println(" and v2.val==" + v2.val);
+        				}
+						}'
+	rule: #input
+! !
+
+!PPJavaLexiconTest methodsFor:'testing-lineTerminators'!
+
+testInputCharacter1
+
+	self
+		parse: '\'
+		rule: #inputCharacter
+!
+
+testInputCharacter2
+
+	self
+		fail: (Character cr asString)
+		rule: #inputCharacter
+!
+
+testInputCharacter3
+
+	self
+		fail: (Character lf asString)
+		rule: #inputCharacter
+!
+
+testLineTerminator1
+
+	self
+		parse: (Character lf asString)
+		rule: #lineTerminator
+!
+
+testLineTerminator2
+
+	self
+		parse: (Character cr asString)
+		rule: #lineTerminator
+!
+
+testLineTerminator3
+
+	self
+		parse: (Character cr asString , Character lf asString)
+		rule: #lineTerminator
+!
+
+testLineTerminator4
+
+	self
+		fail: (Character space asString)
+		rule: #lineTerminator
+!
+
+testLineTerminator5
+
+	self
+		fail: ('a' asString)
+		rule: #lineTerminator
+! !
+
+!PPJavaLexiconTest methodsFor:'testing-literal-float'!
+
+testFloatLiteral1
+	self 
+		parse: '1e1f'
+		rule: #floatingPointLiteral
+!
+
+testFloatLiteral10
+	self 
+		parse: '0.0'
+		rule: #floatingPointLiteral
+!
+
+testFloatLiteral11
+	self 
+		parse: '3.14'
+		rule: #floatingPointLiteral
+!
+
+testFloatLiteral12
+	self 
+		parse: '1e-9d'
+		rule: #floatingPointLiteral
+!
+
+testFloatLiteral13
+	self 
+		parse: '1e137'
+		rule: #floatingPointLiteral
+!
+
+testFloatLiteral2
+	self 
+		parse: '2.f'
+		rule: #floatingPointLiteral
+!
+
+testFloatLiteral3
+	self 
+		parse: '.3f'
+		rule: #floatingPointLiteral
+!
+
+testFloatLiteral4
+	self 
+		parse: '0f'
+		rule: #floatingPointLiteral
+!
+
+testFloatLiteral5
+	self 
+		parse: '3.14f'
+		rule: #floatingPointLiteral
+!
+
+testFloatLiteral6
+	self 
+		parse: '6.022137e+23f'
+		rule: #floatingPointLiteral
+!
+
+testFloatLiteral7
+	self 
+		parse: '1e1'
+		rule: #floatingPointLiteral
+!
+
+testFloatLiteral8
+	self 
+		parse: '2.'
+		rule: #floatingPointLiteral
+!
+
+testFloatLiteral9
+	self 
+		parse: '.3'
+		rule: #floatingPointLiteral
+! !
+
+!PPJavaLexiconTest methodsFor:'testing-literals'!
+
+testBooleanLiteral1
+	self 
+		parse: 'true'
+		rule: #booleanLiteral
+!
+
+testBooleanLiteral2
+	self 
+		parse: 'false'
+		rule: #booleanLiteral
+!
+
+testLiteral1
+
+	self 
+		parse: 'null'
+		rule: #literal
+!
+
+testLiteral10
+
+	self 
+		fail: '0777 L'
+		rule: #literal
+!
+
+testLiteral11
+
+	self 
+		fail: '0777 0'
+		rule: #literal
+!
+
+testLiteral12
+
+	self 
+		fail: '0 x'
+		rule: #literal
+!
+
+testLiteral13
+
+	self 
+		parse: '"This is a Java string"'
+		rule: #literal
+!
+
+testLiteral2
+
+	self 
+		parse: 'false'
+		rule: #literal
+!
+
+testLiteral3
+
+	self 
+		parse: '6.022137e+23f'
+		rule: #literal
+!
+
+testLiteral4
+
+	self 
+		parse: '1e1'
+		rule: #literal
+!
+
+testLiteral5
+
+	self 
+		parse: '0x100000000L'
+		rule: #literal
+!
+
+testLiteral6
+
+	self 
+		parse: '0372'
+		rule: #literal
+!
+
+testLiteral7
+
+	self 
+		parse: '0xDadaCafe'
+		rule: #literal
+!
+
+testLiteral8
+
+	self 
+		parse: '0x00FF00FF'
+		rule: #literal
+!
+
+testLiteral9
+
+	self 
+		parse: '0777L'
+		rule: #literal
+!
+
+testNullLiteral1
+
+	self 
+		parse: 'null'
+		rule: #nullLiteral
+!
+
+testStringLiteral1
+
+	self 
+		parse: '""'
+		rule: #stringLiteral
+!
+
+testStringLiteral10
+
+	self 
+		fail: '"This is a \\
+				two lines Java string"'
+		rule: #stringLiteral
+!
+
+testStringLiteral11
+
+	self 
+		parse: '"null"'
+		rule: #stringLiteral
+!
+
+testStringLiteral2
+
+	self 
+		parse: '"\""'
+		rule: #stringLiteral
+!
+
+testStringLiteral3
+
+	self 
+		parse: '"This is a Java string"'
+		rule: #stringLiteral
+!
+
+testStringLiteral4
+
+	self 
+		fail: '"This is a 
+				two lines Java string"'
+		rule: #stringLiteral
+!
+
+testStringLiteral5
+
+	self 
+		fail: '"This is a \b
+				two lines Java string"'
+		rule: #stringLiteral
+!
+
+testStringLiteral6
+
+	self 
+		fail: '"This is a \t
+				two lines Java string"'
+		rule: #stringLiteral
+!
+
+testStringLiteral7
+
+	self 
+		fail: '"This is a \n
+				two lines Java string"'
+		rule: #stringLiteral
+!
+
+testStringLiteral8
+
+	self 
+		fail: '"This is a \f
+				two lines Java string"'
+		rule: #stringLiteral
+!
+
+testStringLiteral9
+
+	self 
+		fail: '"This is a \r
+				two lines Java string"'
+		rule: #stringLiteral
+! !
+
+!PPJavaLexiconTest methodsFor:'testing-literals-characters'!
+
+testCharacterLiteral1
+	self 
+		parse: '''a'''
+		rule: #characterLiteral
+!
+
+testCharacterLiteral2
+	self 
+		parse: '''%'''
+		rule: #characterLiteral
+!
+
+testCharacterLiteral3
+	self 
+		parse: '''\t'''
+		rule: #characterLiteral
+!
+
+testCharacterLiteral4
+	self 
+		parse: '''\\'''
+		rule: #characterLiteral
+!
+
+testCharacterLiteral5
+	self 
+		parse: '''\'''''
+		rule: #characterLiteral
+!
+
+testCharacterLiteral6
+	"not clear how this must be supported
+	(see http://java.sun.com/docs/books/jls/third_edition/html/lexical.html#3.10.6)"
+	
+	"self 
+		parse: '''\u03a9'''
+		rule: #characterLiteral"
+!
+
+testCharacterLiteral7
+	"not clear how this must be supported
+	(see http://java.sun.com/docs/books/jls/third_edition/html/lexical.html#3.10.6)"
+	"
+	self 
+		parse: '''\uFFFF'''
+		rule: #characterLiteral"
+!
+
+testCharacterLiteral8
+	self 
+		parse: '''\177'''
+		rule: #characterLiteral
+!
+
+testSeparator1
+	self 
+		parse: '{'
+		rule: #separator
+! !
+
+!PPJavaLexiconTest methodsFor:'testing-literals-integer'!
+
+testHexIntegerLiteral1
+	self 
+		parse: '0xC0B0L'
+		rule: #hexIntegerLiteral
+!
+
+testIntegerLiteral1
+	self 
+		parse: '0'
+		rule: #integerLiteral
+!
+
+testIntegerLiteral10
+	self 
+		parse: '1996'
+		rule: #integerLiteral
+!
+
+testIntegerLiteral11
+	self 
+		parse: '0x00FF00FF'
+		rule: #integerLiteral
+!
+
+testIntegerLiteral2
+	self 
+		parse: '0l'
+		rule: #integerLiteral
+!
+
+testIntegerLiteral3
+	self 
+		parse: '0777L'
+		rule: #integerLiteral
+!
+
+testIntegerLiteral4
+	self 
+		parse: '0x100000000L'
+		rule: #integerLiteral
+!
+
+testIntegerLiteral5
+	self 
+		parse: '2147483648L'
+		rule: #integerLiteral
+!
+
+testIntegerLiteral6
+	self 
+		parse: '0xC0B0L'
+		rule: #integerLiteral
+!
+
+testIntegerLiteral7
+	self 
+		parse: '2'
+		rule: #integerLiteral
+!
+
+testIntegerLiteral8
+	self 
+		parse: '0372'
+		rule: #integerLiteral
+!
+
+testIntegerLiteral9
+	self 
+		parse: '0xDadaCafe'
+		rule: #integerLiteral
+!
+
+testOctalIntegerLiteral1
+	self 
+		parse: '0777L'
+		rule: #octalIntegerLiteral
+!
+
+testOperator
+	self 
+		parse: '>'
+		rule: #operator
+! !
+
+!PPJavaLexiconTest methodsFor:'testing-unicode'!
+
+testUnicodeEscape1
+
+	self
+		parse: '\u0000'
+		rule: #unicodeEscape
+!
+
+testUnicodeEscape2
+
+	self
+		fail: '\u000'
+		rule: #unicodeEscape
+!
+
+testUnicodeEscape3
+
+	self
+		fail: '\u00000'
+		rule: #unicodeEscape
+!
+
+testUnicodeInputCharacter1
+
+	self
+		parse: '\u0000'
+		rule: #unicodeInputCharacter
+!
+
+testUnicodeInputCharacter2
+
+	self
+		parse: '\'
+		rule: #unicodeInputCharacter
+!
+
+testUnicodeInputCharacter3
+
+	self
+		parse: 'µ'
+		rule: #unicodeInputCharacter
+!
+
+testUnicodeInputCharacter4
+
+	self
+		fail: '\\'
+		rule: #unicodeInputCharacter
+!
+
+testUnicodeInputCharacter5
+	self
+		parse: '\u2297'
+		rule: #unicodeInputCharacter
+!
+
+testUnicodeInputCharacter6
+	self
+		fail: '\u2H97'
+		rule: #unicodeInputCharacter
+!
+
+testUnicodeInputCharacter7
+"unicode value for \"
+	self
+		parse: '\u005a'
+		rule: #unicodeInputCharacter
+!
+
+testWhiteSpace1
+"Testing whiteSpace parser"
+	self
+		parse: (Character value: 12) asString
+		rule: #whiteSpace
+!
+
+testWhiteSpace2
+"Testing whiteSpace parser"
+	self
+		fail: 'WhiteSpace testing'
+		rule: #whiteSpace
+! !
+