Skip to content

Commit

Permalink
update between operator
Browse files Browse the repository at this point in the history
Between operator can handle operands that can be parse to a number
  • Loading branch information
alexkharuk committed Feb 2, 2023
1 parent 235fa3f commit 0b3cc68
Show file tree
Hide file tree
Showing 4 changed files with 130 additions and 25 deletions.
61 changes: 55 additions & 6 deletions JsonLogic.Tests/LessThanEqualTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,31 @@ public void LessThanEqualNullCastsNullToZero()

JsonAssert.IsTrue(rule.Apply());
}

[Test]
public void LessThanEqualNumberAndStringNumberReturnsTrue()
{
var rule = new LessThanEqualRule(1, "2");

JsonAssert.IsTrue(rule.Apply());
}

[Test]
public void LessThanEqualStringNumberAndNumberReturnsTrue()
{
var rule = new LessThanEqualRule("1", 1);

JsonAssert.IsTrue(rule.Apply());
}

[Test]
public void LessThanEqualTwoStringNumbersReturnsTrue()
{
var rule = new LessThanEqualRule("1", "2");

JsonAssert.IsTrue(rule.Apply());
}

[Test]
public void BetweenValueInRangeReturnsTrue()
{
Expand Down Expand Up @@ -110,26 +135,50 @@ public void BetweenValueOverHighEndReturnsFalse()
}

[Test]
public void BetweenLowEndNotNumberThrowsError()
public void BetweenLowEndNotNumberReturnsFalse()
{
var rule = new LessThanEqualRule(false, 4, 3);

Assert.Throws<JsonLogicException>(() => rule.Apply());
JsonAssert.IsFalse(rule.Apply());
}

[Test]
public void BetweenValueNotNumberThrowsError()
public void BetweenValueNotNumberReturnsFalse()
{
var rule = new LessThanEqualRule(1, false, 3);

Assert.Throws<JsonLogicException>(() => rule.Apply());
JsonAssert.IsFalse(rule.Apply());
}

[Test]
public void BetweenHighEndNotNumberThrowsError()
public void BetweenHighEndNotNumberReturnsFalse()
{
var rule = new LessThanEqualRule(1, 2, false);

Assert.Throws<JsonLogicException>(() => rule.Apply());
JsonAssert.IsFalse(rule.Apply());
}

[Test]
public void BetweenLowEndStringNumberReturnsTrue()
{
var rule = new LessThanEqualRule("1", 1, 3);

JsonAssert.IsTrue(rule.Apply());
}

[Test]
public void BetweenValueStringNumberReturnsTrue()
{
var rule = new LessThanEqualRule(1, "2", 3);

JsonAssert.IsTrue(rule.Apply());
}

[Test]
public void BetweenHighEndStringNumberReturnsTrue()
{
var rule = new LessThanEqualRule(1, 2, "3");

JsonAssert.IsTrue(rule.Apply());
}
}
70 changes: 63 additions & 7 deletions JsonLogic.Tests/LessThanTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ public void LessThanStringThrowsError()
}

[Test]
public void LessThanBooleanThrowsError()
public void LessThanBooleanReturnsTrue()
{
var rule = new LessThanRule(false, 2);

Expand Down Expand Up @@ -69,6 +69,30 @@ public void LessThanNullCastsNullToZero()

JsonAssert.IsTrue(rule.Apply());
}

[Test]
public void LessThanNumberAndStringNumberReturnsTrue()
{
var rule = new LessThanRule(1, "2");

JsonAssert.IsTrue(rule.Apply());
}

[Test]
public void LessThanStringNumberAndNumberReturnsTrue()
{
var rule = new LessThanRule("1", 2);

JsonAssert.IsTrue(rule.Apply());
}

[Test]
public void LessThanTwoStringNumbersReturnsTrue()
{
var rule = new LessThanRule("1", "2");

JsonAssert.IsTrue(rule.Apply());
}

[Test]
public void BetweenValueInRangeReturnsTrue()
Expand Down Expand Up @@ -111,26 +135,58 @@ public void BetweenValueOverHighEndReturnsFalse()
}

[Test]
public void BetweenLowEndNotNumberThrowsError()
public void BetweenLowEndNotNumberReturnsFalse()
{
var rule = new LessThanRule(false, 4, 3);

Assert.Throws<JsonLogicException>(() => rule.Apply());
JsonAssert.IsFalse(rule.Apply());
}

[Test]
public void BetweenValueNotNumberThrowsError()
public void BetweenValueNotNumberReturnsFalse()
{
var rule = new LessThanRule(1, false, 3);

Assert.Throws<JsonLogicException>(() => rule.Apply());
JsonAssert.IsFalse(rule.Apply());
}

[Test]
public void BetweenHighEndNotNumberThrowsError()
public void BetweenHighEndNotNumberReturnsFalse()
{
var rule = new LessThanRule(1, 2, false);

Assert.Throws<JsonLogicException>(() => rule.Apply());
JsonAssert.IsFalse(rule.Apply());
}

[Test]
public void BetweenStringNumbersInRangeReturnsTrue()
{
var rule = new LessThanRule("1", "2", "3");

JsonAssert.IsTrue(rule.Apply());
}

[Test]
public void BetweenLowEndStringNumberReturnsTrue()
{
var rule = new LessThanRule("1", 2, 3);

JsonAssert.IsTrue(rule.Apply());
}

[Test]
public void BetweenValueStringNumberReturnsTrue()
{
var rule = new LessThanRule(1, "2", 3);

JsonAssert.IsTrue(rule.Apply());
}

[Test]
public void BetweenHighEndStringNumberReturnsTrue()
{
var rule = new LessThanRule(1, 2, "3");

JsonAssert.IsTrue(rule.Apply());
}
}
12 changes: 6 additions & 6 deletions JsonLogic/Rules/LessThanEqualRule.cs
Original file line number Diff line number Diff line change
Expand Up @@ -75,17 +75,17 @@ protected internal LessThanEqualRule(Rule a, Rule b, Rule c)
return numberA <= numberB;
}

var low = (A.Apply(data, contextData) as JsonValue)?.GetNumber();
var low = A.Apply(data, contextData).Numberify();
if (low == null)
throw new JsonLogicException("Lower bound must be a number.");
throw new JsonLogicException("Lower bound must parse to a number.");

var value = (B.Apply(data, contextData) as JsonValue)?.GetNumber();
var value = B.Apply(data, contextData).Numberify();
if (value == null)
throw new JsonLogicException("Value must be a number.");
throw new JsonLogicException("Value must parse to a number.");

var high = (C.Apply(data, contextData) as JsonValue)?.GetNumber();
var high = C.Apply(data, contextData).Numberify();
if (high == null)
throw new JsonLogicException("Upper bound must be a number.");
throw new JsonLogicException("Upper bound must parse to a number.");

return low <= value && value <= high;
}
Expand Down
12 changes: 6 additions & 6 deletions JsonLogic/Rules/LessThanRule.cs
Original file line number Diff line number Diff line change
Expand Up @@ -76,17 +76,17 @@ protected internal LessThanRule(Rule a, Rule b, Rule c)
return numberA < numberB;
}

var low = (A.Apply(data, contextData) as JsonValue)?.GetNumber();
var low = A.Apply(data, contextData).Numberify();
if (low == null)
throw new JsonLogicException("Lower bound must be a number.");
throw new JsonLogicException("Lower bound must parse to a number.");

var value = (B.Apply(data, contextData) as JsonValue)?.GetNumber();
var value = B.Apply(data, contextData).Numberify();
if (value == null)
throw new JsonLogicException("Value must be a number.");
throw new JsonLogicException("Value must parse to a number.");

var high = (C.Apply(data, contextData) as JsonValue)?.GetNumber();
var high = C.Apply(data, contextData).Numberify();
if (high == null)
throw new JsonLogicException("Upper bound must be a number.");
throw new JsonLogicException("Upper bound must parse to a number.");

return low < value && value < high;
}
Expand Down

0 comments on commit 0b3cc68

Please sign in to comment.