2424
2525use PackageFactory \ComponentEngine \Language \AST \Node \IntegerLiteral \IntegerFormat ;
2626use PackageFactory \ComponentEngine \Language \AST \Node \IntegerLiteral \IntegerLiteralNode ;
27+ use PackageFactory \ComponentEngine \Language \Parser \IntegerLiteral \IntegerLiteralCouldNotBeParsed ;
2728use PackageFactory \ComponentEngine \Language \Parser \IntegerLiteral \IntegerLiteralParser ;
28- use PackageFactory \ComponentEngine \Parser \Source \Range ;
29- use PackageFactory \ComponentEngine \Parser \Source \ Position ;
30- use PackageFactory \ComponentEngine \Parser \Source \ Source ;
31- use PackageFactory \ComponentEngine \Parser \Tokenizer \Tokenizer ;
32- use PHPUnit \ Framework \ TestCase ;
29+ use PackageFactory \ComponentEngine \Parser \Source \Path ;
30+ use PackageFactory \ComponentEngine \Parser \Tokenizer \ Token ;
31+ use PackageFactory \ComponentEngine \Parser \Tokenizer \ TokenType ;
32+ use PackageFactory \ComponentEngine \Parser \Tokenizer \TokenTypes ;
33+ use PackageFactory \ ComponentEngine \ Test \ Unit \ Language \ Parser \ ParserTestCase ;
3334
34- final class IntegerLiteralParserTest extends TestCase
35+ final class IntegerLiteralParserTest extends ParserTestCase
3536{
3637 /**
3738 * @test
3839 */
3940 public function binaryInteger (): void
4041 {
4142 $ integerLiteralParser = new IntegerLiteralParser ();
42- $ tokens = Tokenizer:: fromSource (Source:: fromString ( '0b1010110101 ' ))-> getIterator ( );
43+ $ tokens = $ this -> createTokenIterator ( '0b1010110101 ' );
4344
4445 $ expectedIntegerLiteralNode = new IntegerLiteralNode (
45- rangeInSource: Range::from (
46- new Position (0 , 0 ),
47- new Position (0 , 11 )
48- ),
46+ rangeInSource: $ this ->range ([0 , 0 ], [0 , 11 ]),
4947 format: IntegerFormat::BINARY ,
5048 value: '0b1010110101 '
5149 );
@@ -62,13 +60,10 @@ public function binaryInteger(): void
6260 public function octalInteger (): void
6361 {
6462 $ integerLiteralParser = new IntegerLiteralParser ();
65- $ tokens = Tokenizer:: fromSource (Source:: fromString ( '0o755 ' ))-> getIterator ( );
63+ $ tokens = $ this -> createTokenIterator ( '0o755 ' );
6664
6765 $ expectedIntegerLiteralNode = new IntegerLiteralNode (
68- rangeInSource: Range::from (
69- new Position (0 , 0 ),
70- new Position (0 , 4 )
71- ),
66+ rangeInSource: $ this ->range ([0 , 0 ], [0 , 4 ]),
7267 format: IntegerFormat::OCTAL ,
7368 value: '0o755 '
7469 );
@@ -85,13 +80,10 @@ public function octalInteger(): void
8580 public function decimalInteger (): void
8681 {
8782 $ integerLiteralParser = new IntegerLiteralParser ();
88- $ tokens = Tokenizer:: fromSource (Source:: fromString ( '1234567890 ' ))-> getIterator ( );
83+ $ tokens = $ this -> createTokenIterator ( '1234567890 ' );
8984
9085 $ expectedIntegerLiteralNode = new IntegerLiteralNode (
91- rangeInSource: Range::from (
92- new Position (0 , 0 ),
93- new Position (0 , 9 )
94- ),
86+ rangeInSource: $ this ->range ([0 , 0 ], [0 , 9 ]),
9587 format: IntegerFormat::DECIMAL ,
9688 value: '1234567890 '
9789 );
@@ -108,13 +100,10 @@ public function decimalInteger(): void
108100 public function hexadecimalInteger (): void
109101 {
110102 $ integerLiteralParser = new IntegerLiteralParser ();
111- $ tokens = Tokenizer:: fromSource (Source:: fromString ( '0x123456789ABCDEF ' ))-> getIterator ( );
103+ $ tokens = $ this -> createTokenIterator ( '0x123456789ABCDEF ' );
112104
113105 $ expectedIntegerLiteralNode = new IntegerLiteralNode (
114- rangeInSource: Range::from (
115- new Position (0 , 0 ),
116- new Position (0 , 16 )
117- ),
106+ rangeInSource: $ this ->range ([0 , 0 ], [0 , 16 ]),
118107 format: IntegerFormat::HEXADECIMAL ,
119108 value: '0x123456789ABCDEF '
120109 );
@@ -124,4 +113,49 @@ public function hexadecimalInteger(): void
124113 $ integerLiteralParser ->parse ($ tokens )
125114 );
126115 }
116+
117+ /**
118+ * @test
119+ */
120+ public function throwsIfTokenStreamsEndsUnexpectedly (): void
121+ {
122+ $ this ->assertThrowsParserException (
123+ function () {
124+ $ integerLiteralParser = new IntegerLiteralParser ();
125+ $ tokens = $ this ->createTokenIterator ('' );
126+
127+ $ integerLiteralParser ->parse ($ tokens );
128+ },
129+ IntegerLiteralCouldNotBeParsed::becauseOfUnexpectedEndOfFile ()
130+ );
131+ }
132+
133+ /**
134+ * @test
135+ */
136+ public function throwsIfUnexpectedTokenIsEncountered (): void
137+ {
138+ $ this ->assertThrowsParserException (
139+ function () {
140+ $ integerLiteralParser = new IntegerLiteralParser ();
141+ $ tokens = $ this ->createTokenIterator ('foo1234 ' );
142+
143+ $ integerLiteralParser ->parse ($ tokens );
144+ },
145+ IntegerLiteralCouldNotBeParsed::becauseOfUnexpectedToken (
146+ expectedTokenTypes: TokenTypes::from (
147+ TokenType::NUMBER_BINARY ,
148+ TokenType::NUMBER_OCTAL ,
149+ TokenType::NUMBER_DECIMAL ,
150+ TokenType::NUMBER_HEXADECIMAL
151+ ),
152+ actualToken: new Token (
153+ type: TokenType::STRING ,
154+ value: 'foo1234 ' ,
155+ boundaries: $ this ->range ([0 , 0 ], [0 , 6 ]),
156+ sourcePath: Path::createMemory ()
157+ )
158+ )
159+ );
160+ }
127161}
0 commit comments