22using Microsoft . VisualStudio . TestTools . UnitTesting ;
33using Searchlight . Query ;
44using System . Linq ;
5+ using System . Runtime . Serialization ;
56using System . Threading . Tasks ;
67using Searchlight . Exceptions ;
78using Searchlight . Expressions ;
@@ -509,13 +510,23 @@ public enum TestEnumValueCategory
509510 Generic = 2 ,
510511 }
511512
513+ public enum TestEnumAttributeValueCategory
514+ {
515+ [ EnumMember ( Value = "Not Anything" ) ]
516+ None = 0 ,
517+ Special = 1 ,
518+ Generic = 2 ,
519+ }
520+
512521 [ SearchlightModel ( DefaultSort = "Name ascending" ) ]
513522 public class TestClassWithEnumValues
514523 {
515524 [ SearchlightField ( OriginalName = "field_name" ) ]
516525 public string Name { get ; set ; }
517526 [ SearchlightField ( OriginalName = "field_category" ) ]
518527 public TestEnumValueCategory Category { get ; set ; }
528+ [ SearchlightField ( OriginalName = "field_category_attribute" ) ]
529+ public TestEnumAttributeValueCategory AttributeCategory { get ; set ; }
519530 }
520531
521532
@@ -524,11 +535,13 @@ public void TestValidEnumFilters()
524535 {
525536 var source = DataSource . Create ( null , typeof ( TestClassWithEnumValues ) , AttributeMode . Strict ) ;
526537 var columns = source . GetColumnDefinitions ( ) . ToArray ( ) ;
527- Assert . AreEqual ( 2 , columns . Length ) ;
538+ Assert . AreEqual ( 3 , columns . Length ) ;
528539 Assert . AreEqual ( "Name" , columns [ 0 ] . FieldName ) ;
529540 Assert . AreEqual ( typeof ( string ) , columns [ 0 ] . FieldType ) ;
530541 Assert . AreEqual ( "Category" , columns [ 1 ] . FieldName ) ;
531542 Assert . AreEqual ( typeof ( TestEnumValueCategory ) , columns [ 1 ] . FieldType ) ;
543+ Assert . AreEqual ( "AttributeCategory" , columns [ 2 ] . FieldName ) ;
544+ Assert . AreEqual ( typeof ( TestEnumAttributeValueCategory ) , columns [ 2 ] . FieldType ) ;
532545
533546 // Query for a valid category
534547 var syntax1 = source . ParseFilter ( "category = None" ) ;
@@ -537,12 +550,26 @@ public void TestValidEnumFilters()
537550 // Query using the raw integer value, which is generally not advised but we accept it for historical reasons
538551 var syntax2 = source . ParseFilter ( "category = 0" ) ;
539552 Assert . IsNotNull ( syntax2 ) ;
553+
554+ // Query attribute value
555+ var syntax3 = source . ParseFilter ( "attributecategory = 'Not Anything'" ) ;
556+ Assert . IsNotNull ( syntax3 ) ;
557+
558+ // Query non attribute value in mixed enum
559+ var syntax4 = source . ParseFilter ( "attributecategory = Special" ) ;
560+ Assert . IsNotNull ( syntax4 ) ;
540561
541562 // Query for a non-valid category
542563 var ex2 = Assert . ThrowsException < InvalidToken > ( ( ) => source . ParseFilter ( "category = InvalidValue" ) ) ;
543564 Assert . AreEqual ( "InvalidValue" , ex2 . BadToken ) ;
544565 CollectionAssert . AreEqual ( new string [ ] { "None" , "Special" , "Generic" } , ex2 . ExpectedTokens ) ;
545566 Assert . AreEqual ( "The filter statement contained an unexpected token, 'InvalidValue'. Searchlight expects to find one of these next: None, Special, Generic" , ex2 . ErrorMessage ) ;
567+
568+ // Query for a non-valid category in attribute enum
569+ var ex3 = Assert . ThrowsException < InvalidToken > ( ( ) => source . ParseFilter ( "attributecategory = InvalidValue" ) ) ;
570+ Assert . AreEqual ( "InvalidValue" , ex3 . BadToken ) ;
571+ CollectionAssert . AreEqual ( new string [ ] { "Not Anything" , "Special" , "Generic" } , ex3 . ExpectedTokens ) ;
572+ Assert . AreEqual ( "The filter statement contained an unexpected token, 'InvalidValue'. Searchlight expects to find one of these next: Not Anything, Special, Generic" , ex3 . ErrorMessage ) ;
546573 }
547574
548575 [ SearchlightModel ( DefaultSort = nameof ( Name ) ) ]
0 commit comments