@@ -252,10 +252,10 @@ class ParserTests: XCTestCase {
252252 type: . define(
253253 Identifier ( name: " foo " , range: fooRange) ,
254254 Definition ( type: . expression( Expression (
255- type: . range (
256- from : Expression ( type: . number( 1 ) , range: range1) ,
257- to : Expression ( type : . number ( 2 ) , range : range2 ) ,
258- step : nil
255+ type: . infix (
256+ Expression ( type: . number( 1 ) , range: range1) ,
257+ . to ,
258+ Expression ( type : . number ( 2 ) , range : range2 )
259259 ) ,
260260 range: range1. lowerBound ..< range2. upperBound
261261 ) ) )
@@ -277,10 +277,17 @@ class ParserTests: XCTestCase {
277277 type: . define(
278278 Identifier ( name: " foo " , range: fooRange) ,
279279 Definition ( type: . expression( Expression (
280- type: . range(
281- from: Expression ( type: . number( 1 ) , range: range1) ,
282- to: Expression ( type: . number( 5 ) , range: range2) ,
283- step: Expression ( type: . number( 2 ) , range: range3)
280+ type: . infix(
281+ Expression (
282+ type: . infix(
283+ Expression ( type: . number( 1 ) , range: range1) ,
284+ . to,
285+ Expression ( type: . number( 5 ) , range: range2)
286+ ) ,
287+ range: range1. lowerBound ..< range2. upperBound
288+ ) ,
289+ . step,
290+ Expression ( type: . number( 2 ) , range: range3)
284291 ) ,
285292 range: range1. lowerBound ..< range3. upperBound
286293 ) ) )
@@ -303,15 +310,15 @@ class ParserTests: XCTestCase {
303310 }
304311 }
305312
306- func testRangeWithMissingStepValue( ) {
307- let input = " define foo 1 to 5 step "
313+ func testRangeWithMultipleStepValues( ) {
314+ let input = " define range 1 to 5 step 1 step 2 "
315+ let range = input. range ( of: " step " , range: input. range ( of: " step 2 " ) !) !
308316 XCTAssertThrowsError ( try parse ( input) ) { error in
309317 let error = try ? XCTUnwrap ( error as? ParserError )
310- XCTAssertEqual ( error? . message, " Unexpected end of file " )
311- XCTAssertEqual ( error? . hint, " Expected step value. " )
318+ XCTAssertEqual ( error? . message, " Unexpected token 'step' " )
312319 XCTAssertEqual ( error, ParserError ( . unexpectedToken(
313- Token ( type: . eof , range: input . endIndex ..< input . endIndex ) ,
314- expected: " step value "
320+ Token ( type: . identifier ( " step " ) , range: range ) ,
321+ expected: nil
315322 ) ) )
316323 }
317324 }
@@ -354,14 +361,47 @@ class ParserTests: XCTestCase {
354361 let range = range1. lowerBound ..< range2. upperBound
355362 let identifier = Identifier ( name: " foo " , range: range1)
356363 XCTAssertEqual ( try parse ( input) , Program ( source: input, statements: [
357- Statement ( type: . expression( Expression ( type: . range(
358- from: Expression ( type: . identifier( identifier) , range: range1) ,
359- to: Expression ( type: . number( 2 ) , range: range2) ,
360- step: nil
364+ Statement ( type: . expression( Expression ( type: . infix(
365+ Expression ( type: . identifier( identifier) , range: range1) ,
366+ . to,
367+ Expression ( type: . number( 2 ) , range: range2)
368+ ) , range: range) ) , range: range) ,
369+ ] ) )
370+ }
371+
372+ func testStepExpressionStatement( ) {
373+ let input = " foo step 2 "
374+ let range1 = input. range ( of: " foo " ) !
375+ let range2 = input. range ( of: " 2 " ) !
376+ let range = range1. lowerBound ..< range2. upperBound
377+ let identifier = Identifier ( name: " foo " , range: range1)
378+ XCTAssertEqual ( try parse ( input) , Program ( source: input, statements: [
379+ Statement ( type: . expression( Expression ( type: . infix(
380+ Expression ( type: . identifier( identifier) , range: range1) ,
381+ . step,
382+ Expression ( type: . number( 2 ) , range: range2)
361383 ) , range: range) ) , range: range) ,
362384 ] ) )
363385 }
364386
387+ func testNonStepExpressionStatement( ) {
388+ let input = " foo step "
389+ let range1 = input. range ( of: " foo " ) !
390+ let range2 = input. range ( of: " step " ) !
391+ let range = range1. lowerBound ..< range2. upperBound
392+ let identifier1 = Identifier ( name: " foo " , range: range1)
393+ let identifier2 = Identifier ( name: " step " , range: range2)
394+ XCTAssertEqual ( try parse ( input) , Program ( source: input, statements: [
395+ Statement ( type: . expression( Expression (
396+ type: . tuple( [
397+ Expression ( type: . identifier( identifier1) , range: range1) ,
398+ Expression ( type: . identifier( identifier2) , range: range2) ,
399+ ] ) ,
400+ range: range
401+ ) ) , range: range) ,
402+ ] ) )
403+ }
404+
365405 // MARK: For loops
366406
367407 func testForLoopWithIndex( ) {
@@ -376,10 +416,10 @@ class ParserTests: XCTestCase {
376416 type: . forloop(
377417 Identifier ( name: " i " , range: iRange) ,
378418 in: Expression (
379- type: . range (
380- from : Expression ( type: . number( 1 ) , range: range1) ,
381- to : Expression ( type : . number ( 2 ) , range : range2 ) ,
382- step : nil
419+ type: . infix (
420+ Expression ( type: . number( 1 ) , range: range1) ,
421+ . to ,
422+ Expression ( type : . number ( 2 ) , range : range2 )
383423 ) ,
384424 range: range1. lowerBound ..< range2. upperBound
385425 ) ,
@@ -401,10 +441,10 @@ class ParserTests: XCTestCase {
401441 type: . forloop(
402442 nil ,
403443 in: Expression (
404- type: . range (
405- from : Expression ( type: . number( 1 ) , range: range1) ,
406- to : Expression ( type : . number ( 2 ) , range : range2 ) ,
407- step : nil
444+ type: . infix (
445+ Expression ( type: . number( 1 ) , range: range1) ,
446+ . to ,
447+ Expression ( type : . number ( 2 ) , range : range2 )
408448 ) ,
409449 range: range1. lowerBound ..< range2. upperBound
410450 ) ,
0 commit comments