@@ -587,6 +587,72 @@ public void UserObjectAttributeValueConversion_NonTextComparisons_Test(string sd
587
587
Assert . AreEqual ( expectedReturnValue , evaluationDetails . Value ) ;
588
588
}
589
589
590
+ [ DataTestMethod ]
591
+ [ DataRow ( "numberToStringConversion" , 0.12345 , "1" ) ]
592
+ [ DataRow ( "numberToStringConversion" , "decimal:0.12345" , "1" ) ]
593
+ [ DataRow ( "numberToStringConversionInt" , ( sbyte ) 125 , "4" ) ]
594
+ [ DataRow ( "numberToStringConversionInt" , ( byte ) 125 , "4" ) ]
595
+ [ DataRow ( "numberToStringConversionInt" , ( short ) 125 , "4" ) ]
596
+ [ DataRow ( "numberToStringConversionInt" , ( ushort ) 125 , "4" ) ]
597
+ [ DataRow ( "numberToStringConversionInt" , 125 , "4" ) ]
598
+ [ DataRow ( "numberToStringConversionInt" , 125u , "4" ) ]
599
+ [ DataRow ( "numberToStringConversionInt" , 125L , "4" ) ]
600
+ [ DataRow ( "numberToStringConversionInt" , 125ul , "4" ) ]
601
+ [ DataRow ( "numberToStringConversionPositiveExp" , - 1.23456789e+96 , "2" ) ]
602
+ [ DataRow ( "numberToStringConversionNegativeExp" , - 12345.6789e-100 , "4" ) ]
603
+ [ DataRow ( "numberToStringConversionNaN" , double . NaN , "3" ) ]
604
+ [ DataRow ( "numberToStringConversionPositiveInf" , double . PositiveInfinity , "4" ) ]
605
+ [ DataRow ( "numberToStringConversionNegativeInf" , double . NegativeInfinity , "3" ) ]
606
+ [ DataRow ( "dateToStringConversion" , "datetime:2023-03-31T23:59:59.9990000Z" , "3" ) ]
607
+ [ DataRow ( "dateToStringConversion" , "datetimeoffset:2023-03-31T23:59:59.9990000Z" , "3" ) ]
608
+ [ DataRow ( "dateToStringConversion" , 1680307199.999 , "3" ) ]
609
+ [ DataRow ( "dateToStringConversion" , "decimal:1680307199.999" , "3" ) ]
610
+ [ DataRow ( "dateToStringConversionNaN" , double . NaN , "3" ) ]
611
+ [ DataRow ( "dateToStringConversionPositiveInf" , double . PositiveInfinity , "1" ) ]
612
+ [ DataRow ( "dateToStringConversionNegativeInf" , double . NegativeInfinity , "5" ) ]
613
+ [ DataRow ( "stringArrayToStringConversion" , new [ ] { "read" , "Write" , " eXecute " } , "4" ) ]
614
+ [ DataRow ( "stringArrayToStringConversionEmpty" , new string [ 0 ] , "5" ) ]
615
+ [ DataRow ( "stringArrayToStringConversionSpecialChars" , new [ ] { "+<>%\" '\\ /\t \r \n " } , "3" ) ]
616
+ [ DataRow ( "stringArrayToStringConversionUnicode" , new [ ] { "äöüÄÖÜçéèñışğ⢙✓😀" } , "2" ) ]
617
+ public void ComparisonAttributeConversionToCanonicalStringRepresentation_Test ( string key , object customAttributeValue , string expectedReturnValue )
618
+ {
619
+ var config = new ConfigLocation . LocalFile ( "data" , "comparison_attribute_conversion.json" ) . FetchConfig ( ) ;
620
+
621
+ var logger = new Mock < IConfigCatLogger > ( ) . Object . AsWrapper ( ) ;
622
+ var evaluator = new RolloutEvaluator ( logger ) ;
623
+
624
+ if ( customAttributeValue is string s )
625
+ {
626
+ const string decimalPrefix = "decimal:" , dateTimePrefix = "datetime:" , dateTimeOffsetPrefix = "datetimeoffset:" ;
627
+ if ( s . StartsWith ( decimalPrefix , StringComparison . Ordinal ) )
628
+ {
629
+ customAttributeValue = decimal . Parse ( s . Substring ( decimalPrefix . Length ) ) ;
630
+ }
631
+ else if ( s . StartsWith ( dateTimePrefix , StringComparison . Ordinal ) )
632
+ {
633
+ var dateTimeStyle = s . EndsWith ( "Z" , StringComparison . Ordinal ) ? DateTimeStyles . AdjustToUniversal : DateTimeStyles . None ;
634
+ customAttributeValue = DateTime . ParseExact ( s . Substring ( dateTimePrefix . Length ) , "o" , CultureInfo . InvariantCulture , dateTimeStyle ) ;
635
+ }
636
+ else if ( s . StartsWith ( dateTimeOffsetPrefix , StringComparison . Ordinal ) )
637
+ {
638
+ customAttributeValue = DateTimeOffset . ParseExact ( s . Substring ( dateTimeOffsetPrefix . Length ) , "o" , CultureInfo . InvariantCulture ) ;
639
+ }
640
+ }
641
+
642
+ var user = new User ( "12345" )
643
+ {
644
+ Custom =
645
+ {
646
+ [ "Custom1" ] = customAttributeValue
647
+ }
648
+ } ;
649
+
650
+ const string defaultValue = "default" ;
651
+ var actualReturnValue = evaluator . Evaluate ( config ! . Settings , key , defaultValue , user , remoteConfig : null , logger ) . Value ;
652
+
653
+ Assert . AreEqual ( expectedReturnValue , actualReturnValue ) ;
654
+ }
655
+
590
656
[ DataTestMethod ]
591
657
[ DataRow ( "isoneof" , "no trim" ) ]
592
658
[ DataRow ( "isnotoneof" , "no trim" ) ]
0 commit comments