@@ -257,6 +257,8 @@ public void StructuredTableReferenceHeaders()
257257 Assert . AreEqual ( 1 , references . Count ) ;
258258 Assert . AreEqual ( ReferenceType . Table , references . First ( ) . ReferenceType ) ;
259259 Assert . AreEqual ( "Table1" , references . First ( ) . Name ) ;
260+ CollectionAssert . AreEqual ( new [ ] { "#Headers" } , references . First ( ) . TableSpecifiers ) ;
261+ CollectionAssert . AreEqual ( new string [ ] { } , references . First ( ) . TableColumns ) ;
260262 }
261263
262264 [ TestMethod ]
@@ -267,6 +269,8 @@ public void StructuredTableReferenceThisRow()
267269 Assert . AreEqual ( 1 , references . Count ) ;
268270 Assert . AreEqual ( ReferenceType . Table , references . First ( ) . ReferenceType ) ;
269271 Assert . AreEqual ( "Table1" , references . First ( ) . Name ) ;
272+ CollectionAssert . AreEqual ( new [ ] { "#This Row" } , references . First ( ) . TableSpecifiers ) ;
273+ CollectionAssert . AreEqual ( new [ ] { "b" } , references . First ( ) . TableColumns ) ;
270274 }
271275
272276 [ TestMethod ]
@@ -277,6 +281,8 @@ public void StructuredTableReferenceCurrentRow()
277281 Assert . AreEqual ( 1 , references . Count ) ;
278282 Assert . AreEqual ( ReferenceType . Table , references . First ( ) . ReferenceType ) ;
279283 Assert . AreEqual ( "Table1" , references . First ( ) . Name ) ;
284+ CollectionAssert . AreEqual ( new [ ] { "@" } , references . First ( ) . TableSpecifiers ) ;
285+ CollectionAssert . AreEqual ( new [ ] { "Region" } , references . First ( ) . TableColumns ) ;
280286 }
281287
282288 [ TestMethod ]
@@ -287,6 +293,8 @@ public void StructuredTableReferenceColumns()
287293 Assert . AreEqual ( 1 , references . Count ) ;
288294 Assert . AreEqual ( ReferenceType . Table , references . First ( ) . ReferenceType ) ;
289295 Assert . AreEqual ( "Table1" , references . First ( ) . Name ) ;
296+ CollectionAssert . AreEqual ( new string [ ] { } , references . First ( ) . TableSpecifiers ) ;
297+ CollectionAssert . AreEqual ( new [ ] { "Date" , "Color" } , references . First ( ) . TableColumns ) ;
290298 }
291299
292300 [ TestMethod ]
@@ -297,46 +305,56 @@ public void StructuredTableReferenceRowAndColumn()
297305 Assert . AreEqual ( 1 , references . Count ) ;
298306 Assert . AreEqual ( ReferenceType . Table , references . First ( ) . ReferenceType ) ;
299307 Assert . AreEqual ( "Table1" , references . First ( ) . Name ) ;
308+ CollectionAssert . AreEqual ( new [ ] { "#Totals" } , references . First ( ) . TableSpecifiers ) ;
309+ CollectionAssert . AreEqual ( new [ ] { "Qty" } , references . First ( ) . TableColumns ) ;
300310 }
301311
302312 [ TestMethod ]
303313 public void StructuredTableReferenceWithEscapedCharacterPound ( )
304314 {
305- List < ParserReference > references = new FormulaAnalyzer ( "=SUBTOTAL(109,Table1[column header with '[ ])" ) . ParserReferences ( ) . ToList ( ) ;
315+ List < ParserReference > references = new FormulaAnalyzer ( "=SUBTOTAL(109,Table1['#NumItems ])" ) . ParserReferences ( ) . ToList ( ) ;
306316
307317 Assert . AreEqual ( 1 , references . Count ) ;
308318 Assert . AreEqual ( ReferenceType . Table , references . First ( ) . ReferenceType ) ;
309319 Assert . AreEqual ( "Table1" , references . First ( ) . Name ) ;
320+ CollectionAssert . AreEqual ( new string [ ] { } , references . First ( ) . TableSpecifiers ) ;
321+ CollectionAssert . AreEqual ( new [ ] { "#NumItems" } , references . First ( ) . TableColumns ) ;
310322 }
311323
312324 [ TestMethod ]
313- public void StructuredTableReferenceWithEscapedCharacterBracketOpen ( )
325+ public void StructuredTableReferenceWithEscapedCharacterBracket ( )
314326 {
315- List < ParserReference > references = new FormulaAnalyzer ( "COUNTA(Table1['[Header])" ) . ParserReferences ( ) . ToList ( ) ;
327+ List < ParserReference > references = new FormulaAnalyzer ( "COUNTA(Table1['[Header'] ])" ) . ParserReferences ( ) . ToList ( ) ;
316328
317329 Assert . AreEqual ( 1 , references . Count ) ;
318330 Assert . AreEqual ( ReferenceType . Table , references . First ( ) . ReferenceType ) ;
319331 Assert . AreEqual ( "Table1" , references . First ( ) . Name ) ;
332+ CollectionAssert . AreEqual ( new string [ ] { } , references . First ( ) . TableSpecifiers ) ;
333+ CollectionAssert . AreEqual ( new [ ] { "[Header]" } , references . First ( ) . TableColumns ) ;
320334 }
321335
322336 [ TestMethod ]
323- public void StructuredTableReferenceWithEscapedCharacterBracketClose ( )
337+ public void StructuredTableReferenceWithEscapedCharacterQuote ( )
324338 {
325- List < ParserReference > references = new FormulaAnalyzer ( "COUNTA(Table1[']Header ])" ) . ParserReferences ( ) . ToList ( ) ;
339+ List < ParserReference > references = new FormulaAnalyzer ( "COUNTA(Table1[''Test'' ])" ) . ParserReferences ( ) . ToList ( ) ;
326340
327341 Assert . AreEqual ( 1 , references . Count ) ;
328342 Assert . AreEqual ( ReferenceType . Table , references . First ( ) . ReferenceType ) ;
329343 Assert . AreEqual ( "Table1" , references . First ( ) . Name ) ;
344+ CollectionAssert . AreEqual ( new string [ ] { } , references . First ( ) . TableSpecifiers ) ;
345+ CollectionAssert . AreEqual ( new [ ] { "'Test'" } , references . First ( ) . TableColumns ) ;
330346 }
331347
332348 [ TestMethod ]
333- public void StructuredTableReferenceWithEscapedCharacterQuote ( )
349+ public void StructuredTableReferenceUnqualified ( )
334350 {
335- List < ParserReference > references = new FormulaAnalyzer ( "COUNTA(Table1[''Header ])" ) . ParserReferences ( ) . ToList ( ) ;
351+ List < ParserReference > references = new FormulaAnalyzer ( "=SUBTOTAL(109,[Sales ])" ) . ParserReferences ( ) . ToList ( ) ;
336352
337353 Assert . AreEqual ( 1 , references . Count ) ;
338354 Assert . AreEqual ( ReferenceType . Table , references . First ( ) . ReferenceType ) ;
339- Assert . AreEqual ( "Table1" , references . First ( ) . Name ) ;
355+ Assert . AreEqual ( null , references . First ( ) . Name ) ;
356+ CollectionAssert . AreEqual ( new string [ ] { } , references . First ( ) . TableSpecifiers ) ;
357+ CollectionAssert . AreEqual ( new [ ] { "Sales" } , references . First ( ) . TableColumns ) ;
340358 }
341359
342360 [ TestMethod ]
@@ -347,26 +365,101 @@ public void StructuredTableReferenceUnqualifiedWithSpaceInName()
347365 Assert . AreEqual ( 1 , references . Count ) ;
348366 Assert . AreEqual ( ReferenceType . Table , references . First ( ) . ReferenceType ) ;
349367 Assert . AreEqual ( null , references . First ( ) . Name ) ;
368+ CollectionAssert . AreEqual ( new string [ ] { } , references . First ( ) . TableSpecifiers ) ;
369+ CollectionAssert . AreEqual ( new [ ] { "Sales Amount" } , references . First ( ) . TableColumns ) ;
350370 }
351371
352372 [ TestMethod ]
353- public void StructuredTableReferenceUnqualified ( )
373+ public void StructuredTableReferenceUnqualifiedWithNumbers ( )
354374 {
355- List < ParserReference > references = new FormulaAnalyzer ( "=SUBTOTAL(109,[SalesAmount ])" ) . ParserReferences ( ) . ToList ( ) ;
375+ List < ParserReference > references = new FormulaAnalyzer ( "=SUBTOTAL(109,[2016 ])" ) . ParserReferences ( ) . ToList ( ) ;
356376
357377 Assert . AreEqual ( 1 , references . Count ) ;
358378 Assert . AreEqual ( ReferenceType . Table , references . First ( ) . ReferenceType ) ;
359379 Assert . AreEqual ( null , references . First ( ) . Name ) ;
380+ CollectionAssert . AreEqual ( new string [ ] { } , references . First ( ) . TableSpecifiers ) ;
381+ CollectionAssert . AreEqual ( new [ ] { "2016" } , references . First ( ) . TableColumns ) ;
360382 }
361383
362384 [ TestMethod ]
363- public void StructuredTableReferenceUnqualifiedWithNumbers ( )
385+ public void StructuredTableReferenceSpecifierAndColumns ( )
364386 {
365- List < ParserReference > references = new FormulaAnalyzer ( "=SUBTOTAL(109,[2016]) " ) . ParserReferences ( ) . ToList ( ) ;
387+ List < ParserReference > references = new FormulaAnalyzer ( "=DeptSales[[#All],[Sales Amount]:[Commission Amount]] " ) . ParserReferences ( ) . ToList ( ) ;
366388
367389 Assert . AreEqual ( 1 , references . Count ) ;
368390 Assert . AreEqual ( ReferenceType . Table , references . First ( ) . ReferenceType ) ;
369- Assert . AreEqual ( null , references . First ( ) . Name ) ;
391+ Assert . AreEqual ( "DeptSales" , references . First ( ) . Name ) ;
392+ CollectionAssert . AreEqual ( new [ ] { "#All" } , references . First ( ) . TableSpecifiers ) ;
393+ CollectionAssert . AreEqual ( new [ ] { "Sales Amount" , "Commission Amount" } , references . First ( ) . TableColumns ) ;
394+ }
395+
396+ [ TestMethod ]
397+ public void StructuredTableReferenceSpecifiersAndColumn ( )
398+ {
399+ List < ParserReference > references = new FormulaAnalyzer ( "=DeptSales[[#Headers],[#Data],[% Commission]]" ) . ParserReferences ( ) . ToList ( ) ;
400+
401+ Assert . AreEqual ( 1 , references . Count ) ;
402+ Assert . AreEqual ( ReferenceType . Table , references . First ( ) . ReferenceType ) ;
403+ Assert . AreEqual ( "DeptSales" , references . First ( ) . Name ) ;
404+ CollectionAssert . AreEqual ( new [ ] { "#Headers" , "#Data" } , references . First ( ) . TableSpecifiers ) ;
405+ CollectionAssert . AreEqual ( new [ ] { "% Commission" } , references . First ( ) . TableColumns ) ;
406+ }
407+
408+ [ TestMethod ]
409+ public void StructuredTableReferenceMultipleRows ( )
410+ {
411+ List < ParserReference > references = new FormulaAnalyzer ( "=SUM([@Jan]:[@Feb])" ) . ParserReferences ( ) . ToList ( ) ;
412+
413+ Assert . AreEqual ( 2 , references . Count ) ;
414+
415+ Assert . AreEqual ( ReferenceType . Table , references [ 0 ] . ReferenceType ) ;
416+ Assert . AreEqual ( null , references [ 0 ] . Name ) ;
417+ CollectionAssert . AreEqual ( new [ ] { "@" } , references [ 0 ] . TableSpecifiers ) ;
418+ CollectionAssert . AreEqual ( new [ ] { "Jan" } , references [ 0 ] . TableColumns ) ;
419+
420+ Assert . AreEqual ( ReferenceType . Table , references [ 1 ] . ReferenceType ) ;
421+ Assert . AreEqual ( null , references [ 1 ] . Name ) ;
422+ CollectionAssert . AreEqual ( new [ ] { "@" } , references [ 1 ] . TableSpecifiers ) ;
423+ CollectionAssert . AreEqual ( new [ ] { "Feb" } , references [ 1 ] . TableColumns ) ;
424+ }
425+
426+ [ TestMethod ]
427+ public void StructuredTableReferenceMultipleColumns ( )
428+ {
429+ List < ParserReference > references = new FormulaAnalyzer ( "=XLOOKUP($G7,Sales[[Region]:[Region]],Sales[Mar])" ) . ParserReferences ( ) . ToList ( ) ;
430+
431+ Assert . AreEqual ( 3 , references . Count ) ;
432+
433+ Assert . AreEqual ( ReferenceType . Cell , references [ 0 ] . ReferenceType ) ;
434+ Assert . AreEqual ( "$G7" , references [ 0 ] . MinLocation ) ;
435+
436+ Assert . AreEqual ( ReferenceType . Table , references [ 1 ] . ReferenceType ) ;
437+ Assert . AreEqual ( "Sales" , references [ 1 ] . Name ) ;
438+ CollectionAssert . AreEqual ( new string [ ] { } , references [ 1 ] . TableSpecifiers ) ;
439+ CollectionAssert . AreEqual ( new [ ] { "Region" , "Region" } , references [ 1 ] . TableColumns ) ;
440+
441+ Assert . AreEqual ( ReferenceType . Table , references [ 2 ] . ReferenceType ) ;
442+ Assert . AreEqual ( "Sales" , references [ 2 ] . Name ) ;
443+ CollectionAssert . AreEqual ( new string [ ] { } , references [ 2 ] . TableSpecifiers ) ;
444+ CollectionAssert . AreEqual ( new [ ] { "Mar" } , references [ 2 ] . TableColumns ) ;
445+ }
446+
447+ [ TestMethod ]
448+ public void StructuredTableReferenceMultipleHeaders ( )
449+ {
450+ List < ParserReference > references = new FormulaAnalyzer ( "=COUNTA(Sales_5[[#Headers],[Jan]]:Sales_5[[#Headers],[Mar]])" ) . ParserReferences ( ) . ToList ( ) ;
451+
452+ Assert . AreEqual ( 2 , references . Count ) ;
453+
454+ Assert . AreEqual ( ReferenceType . Table , references [ 0 ] . ReferenceType ) ;
455+ Assert . AreEqual ( "Sales_5" , references [ 0 ] . Name ) ;
456+ CollectionAssert . AreEqual ( new [ ] { "#Headers" } , references [ 0 ] . TableSpecifiers ) ;
457+ CollectionAssert . AreEqual ( new [ ] { "Jan" } , references [ 0 ] . TableColumns ) ;
458+
459+ Assert . AreEqual ( ReferenceType . Table , references [ 1 ] . ReferenceType ) ;
460+ Assert . AreEqual ( "Sales_5" , references [ 1 ] . Name ) ;
461+ CollectionAssert . AreEqual ( new [ ] { "#Headers" } , references [ 1 ] . TableSpecifiers ) ;
462+ CollectionAssert . AreEqual ( new [ ] { "Mar" } , references [ 1 ] . TableColumns ) ;
370463 }
371464
372465 [ TestMethod ]
0 commit comments