Skip to content

Commit df38127

Browse files
authored
Fix In and NotIn operators (#149)
Operators.In and Operators.NotIn with not working properly when trying to match the rule setting the condition value as null
1 parent d85f397 commit df38127

3 files changed

Lines changed: 32 additions & 21 deletions

File tree

src/Rules.Framework/Builder/RulesEngineOptionsValidator.cs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,35 +17,35 @@ public static void Validate(RulesEngineOptions rulesEngineOptions)
1717
ValidateDataTypeDefault(
1818
rulesEngineOptions.DataTypeDefaults,
1919
DataTypes.Boolean,
20-
value => value != null && bool.TryParse(value.ToString(), out bool boolRes));
20+
value => value != null && bool.TryParse(value.ToString(), out bool _));
2121
ValidateDataTypeDefault(
2222
rulesEngineOptions.DataTypeDefaults,
2323
DataTypes.Decimal,
24-
value => value != null && decimal.TryParse(value.ToString(), NumberStyles.None, CultureInfo.InvariantCulture, out decimal decimalRes));
24+
value => value != null && decimal.TryParse(value.ToString(), NumberStyles.None, CultureInfo.InvariantCulture, out decimal _));
2525
ValidateDataTypeDefault(
2626
rulesEngineOptions.DataTypeDefaults,
2727
DataTypes.Integer,
28-
value => value != null && int.TryParse(value.ToString(), NumberStyles.None, CultureInfo.InvariantCulture, out int intRes));
28+
value => value != null && int.TryParse(value.ToString(), NumberStyles.None, CultureInfo.InvariantCulture, out int _));
2929
ValidateDataTypeDefault(
3030
rulesEngineOptions.DataTypeDefaults,
3131
DataTypes.String,
3232
value => value is string);
3333
ValidateDataTypeDefault(
3434
rulesEngineOptions.DataTypeDefaults,
3535
DataTypes.ArrayBoolean,
36-
value => value is IEnumerable<bool>);
36+
value => value is bool);
3737
ValidateDataTypeDefault(
3838
rulesEngineOptions.DataTypeDefaults,
3939
DataTypes.ArrayDecimal,
40-
value => value is IEnumerable<decimal>);
40+
value => value is decimal);
4141
ValidateDataTypeDefault(
4242
rulesEngineOptions.DataTypeDefaults,
4343
DataTypes.ArrayInteger,
44-
value => value is IEnumerable<int>);
44+
value => value is int);
4545
ValidateDataTypeDefault(
4646
rulesEngineOptions.DataTypeDefaults,
4747
DataTypes.ArrayString,
48-
value => value is IEnumerable<string>);
48+
value => value is string);
4949

5050
}
5151

src/Rules.Framework/RulesEngineOptions.cs

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ namespace Rules.Framework
22
{
33
using System;
44
using System.Collections.Generic;
5-
using System.Linq;
65
using Rules.Framework.Core;
76

87
/// <summary>
@@ -21,7 +20,7 @@ private RulesEngineOptions()
2120
public IDictionary<DataTypes, object> DataTypeDefaults { get; }
2221

2322
/// <summary>
24-
/// Gets or sets wether rules' conditions is enabled or not.
23+
/// Gets or sets whether rules' conditions is enabled or not.
2524
/// </summary>
2625
public bool EnableCompilation { get; set; }
2726

@@ -57,7 +56,7 @@ public PriorityCriterias PriotityCriteria
5756
/// </summary>
5857
/// <remarks>
5958
/// <para>MissingConditionBehavior = UseDataTypeDefault</para>
60-
/// <para>PriotityCriteria = TopmostRuleWins</para>
59+
/// <para>PriorityCriteria = TopmostRuleWins</para>
6160
/// <para>DataTypes.Boolean default = default(bool)</para>
6261
/// <para>DataTypes.Decimal default = default(decimal)</para>
6362
/// <para>DataTypes.Integer default = default(int)</para>
@@ -66,21 +65,23 @@ public PriorityCriterias PriotityCriteria
6665
/// <returns></returns>
6766
public static RulesEngineOptions NewWithDefaults()
6867
{
69-
RulesEngineOptions rulesEngineOptions = new RulesEngineOptions
68+
RulesEngineOptions rulesEngineOptions = new()
7069
{
7170
MissingConditionBehavior = MissingConditionBehaviors.UseDataTypeDefault,
72-
PriorityCriteria = PriorityCriterias.TopmostRuleWins
71+
PriorityCriteria = PriorityCriterias.TopmostRuleWins,
72+
DataTypeDefaults =
73+
{
74+
[DataTypes.Boolean] = default(bool),
75+
[DataTypes.Decimal] = default(decimal),
76+
[DataTypes.Integer] = default(int),
77+
[DataTypes.String] = string.Empty,
78+
[DataTypes.ArrayBoolean] = default(bool),
79+
[DataTypes.ArrayDecimal] = default(decimal),
80+
[DataTypes.ArrayInteger] = default(int),
81+
[DataTypes.ArrayString] = string.Empty,
82+
},
7383
};
7484

75-
rulesEngineOptions.DataTypeDefaults[DataTypes.Boolean] = default(bool);
76-
rulesEngineOptions.DataTypeDefaults[DataTypes.Decimal] = default(decimal);
77-
rulesEngineOptions.DataTypeDefaults[DataTypes.Integer] = default(int);
78-
rulesEngineOptions.DataTypeDefaults[DataTypes.String] = string.Empty;
79-
80-
rulesEngineOptions.DataTypeDefaults[DataTypes.ArrayBoolean] = Enumerable.Empty<bool>();
81-
rulesEngineOptions.DataTypeDefaults[DataTypes.ArrayDecimal] = Enumerable.Empty<decimal>();
82-
rulesEngineOptions.DataTypeDefaults[DataTypes.ArrayInteger] = Enumerable.Empty<int>();
83-
rulesEngineOptions.DataTypeDefaults[DataTypes.ArrayString] = Enumerable.Empty<string>();
8485

8586
return rulesEngineOptions;
8687
}

tests/Rules.Framework.Providers.InMemory.IntegrationTests/Scenarios/Scenario5/BestServerTests.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,16 @@ public class BestServerTests
3535
new Condition<BestServerConditions>(BestServerConditions.Brand,"AMD")
3636
},
3737
"Best Server Default"
38+
},
39+
new object[]
40+
{
41+
new[]
42+
{
43+
new Condition<BestServerConditions>(BestServerConditions.Price,100),
44+
new Condition<BestServerConditions>(BestServerConditions.Memory,12),
45+
new Condition<BestServerConditions>(BestServerConditions.StoragePartionable,true),
46+
},
47+
"Best Server Default"
3848
}
3949
};
4050

0 commit comments

Comments
 (0)