-Fixed JValue.CompareTo with number and string values
This commit is contained in:
@@ -858,5 +858,117 @@ namespace Newtonsoft.Json.Tests.Linq
|
|||||||
ValueA
|
ValueA
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void CompareTo_MismatchedTypes()
|
||||||
|
{
|
||||||
|
JValue v1 = new JValue(1);
|
||||||
|
JValue v2 = new JValue("2");
|
||||||
|
|
||||||
|
Assert.AreEqual(-1, v1.CompareTo(v2));
|
||||||
|
Assert.AreEqual(-1, ((IComparable)v1).CompareTo(v2));
|
||||||
|
Assert.AreEqual(1, v2.CompareTo(v1));
|
||||||
|
Assert.AreEqual(1, ((IComparable)v2).CompareTo(v1));
|
||||||
|
|
||||||
|
v1 = new JValue(1.5);
|
||||||
|
v2 = new JValue("2");
|
||||||
|
|
||||||
|
Assert.AreEqual(-1, v1.CompareTo(v2));
|
||||||
|
Assert.AreEqual(-1, ((IComparable)v1).CompareTo(v2));
|
||||||
|
Assert.AreEqual(1, v2.CompareTo(v1));
|
||||||
|
Assert.AreEqual(1, ((IComparable)v2).CompareTo(v1));
|
||||||
|
|
||||||
|
v1 = new JValue(1.5m);
|
||||||
|
v2 = new JValue("2");
|
||||||
|
|
||||||
|
Assert.AreEqual(-1, v1.CompareTo(v2));
|
||||||
|
Assert.AreEqual(-1, ((IComparable)v1).CompareTo(v2));
|
||||||
|
Assert.AreEqual(1, v2.CompareTo(v1));
|
||||||
|
Assert.AreEqual(1, ((IComparable)v2).CompareTo(v1));
|
||||||
|
|
||||||
|
v1 = new JValue(1.5m);
|
||||||
|
v2 = new JValue(2);
|
||||||
|
|
||||||
|
Assert.AreEqual(-1, v1.CompareTo(v2));
|
||||||
|
Assert.AreEqual(-1, ((IComparable)v1).CompareTo(v2));
|
||||||
|
Assert.AreEqual(1, v2.CompareTo(v1));
|
||||||
|
Assert.AreEqual(1, ((IComparable)v2).CompareTo(v1));
|
||||||
|
|
||||||
|
v1 = new JValue(1.5m);
|
||||||
|
v2 = new JValue(2.1);
|
||||||
|
|
||||||
|
Assert.AreEqual(-1, v1.CompareTo(v2));
|
||||||
|
Assert.AreEqual(-1, ((IComparable)v1).CompareTo(v2));
|
||||||
|
Assert.AreEqual(1, v2.CompareTo(v1));
|
||||||
|
Assert.AreEqual(1, ((IComparable)v2).CompareTo(v1));
|
||||||
|
|
||||||
|
v1 = new JValue(2);
|
||||||
|
v2 = new JValue("2");
|
||||||
|
|
||||||
|
Assert.AreEqual(0, v1.CompareTo(v2));
|
||||||
|
Assert.AreEqual(0, ((IComparable)v1).CompareTo(v2));
|
||||||
|
Assert.AreEqual(0, v2.CompareTo(v1));
|
||||||
|
Assert.AreEqual(0, ((IComparable)v2).CompareTo(v1));
|
||||||
|
|
||||||
|
v1 = new JValue(2);
|
||||||
|
v2 = new JValue(2m);
|
||||||
|
|
||||||
|
Assert.AreEqual(0, v1.CompareTo(v2));
|
||||||
|
Assert.AreEqual(0, ((IComparable)v1).CompareTo(v2));
|
||||||
|
Assert.AreEqual(0, v2.CompareTo(v1));
|
||||||
|
Assert.AreEqual(0, ((IComparable)v2).CompareTo(v1));
|
||||||
|
|
||||||
|
v1 = new JValue(2f);
|
||||||
|
v2 = new JValue(2m);
|
||||||
|
|
||||||
|
Assert.AreEqual(0, v1.CompareTo(v2));
|
||||||
|
Assert.AreEqual(0, ((IComparable)v1).CompareTo(v2));
|
||||||
|
Assert.AreEqual(0, v2.CompareTo(v1));
|
||||||
|
Assert.AreEqual(0, ((IComparable)v2).CompareTo(v1));
|
||||||
|
|
||||||
|
v1 = new JValue(2);
|
||||||
|
v2 = new JValue("10");
|
||||||
|
|
||||||
|
Assert.AreEqual(-1, v1.CompareTo(v2));
|
||||||
|
Assert.AreEqual(-1, ((IComparable)v1).CompareTo(v2));
|
||||||
|
Assert.AreEqual(1, v2.CompareTo(v1));
|
||||||
|
Assert.AreEqual(1, ((IComparable)v2).CompareTo(v1));
|
||||||
|
|
||||||
|
v1 = new JValue(2);
|
||||||
|
v2 = new JValue((object)null);
|
||||||
|
|
||||||
|
Assert.AreEqual(1, v1.CompareTo(v2));
|
||||||
|
Assert.AreEqual(1, ((IComparable)v1).CompareTo(v2));
|
||||||
|
Assert.AreEqual(-1, v2.CompareTo(v1));
|
||||||
|
Assert.AreEqual(-1, ((IComparable)v2).CompareTo(v1));
|
||||||
|
|
||||||
|
v1 = new JValue("2");
|
||||||
|
v2 = new JValue((object)null);
|
||||||
|
|
||||||
|
Assert.AreEqual(1, v1.CompareTo(v2));
|
||||||
|
Assert.AreEqual(1, ((IComparable)v1).CompareTo(v2));
|
||||||
|
Assert.AreEqual(-1, v2.CompareTo(v1));
|
||||||
|
Assert.AreEqual(-1, ((IComparable)v2).CompareTo(v1));
|
||||||
|
|
||||||
|
v1 = new JValue((object)null);
|
||||||
|
v2 = new JValue("2");
|
||||||
|
|
||||||
|
Assert.AreEqual(-1, v1.CompareTo(v2));
|
||||||
|
Assert.AreEqual(-1, ((IComparable)v1).CompareTo(v2));
|
||||||
|
Assert.AreEqual(1, v2.CompareTo(v1));
|
||||||
|
Assert.AreEqual(1, ((IComparable)v2).CompareTo(v1));
|
||||||
|
|
||||||
|
v1 = new JValue("2");
|
||||||
|
v2 = null;
|
||||||
|
|
||||||
|
Assert.AreEqual(1, v1.CompareTo(v2));
|
||||||
|
Assert.AreEqual(1, ((IComparable)v1).CompareTo(v2));
|
||||||
|
|
||||||
|
v1 = new JValue((object)null);
|
||||||
|
v2 = null;
|
||||||
|
|
||||||
|
Assert.AreEqual(1, v1.CompareTo(v2));
|
||||||
|
Assert.AreEqual(1, ((IComparable)v1).CompareTo(v2));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -51,6 +51,52 @@ namespace Newtonsoft.Json.Tests.Linq.JsonPath
|
|||||||
[TestFixture]
|
[TestFixture]
|
||||||
public class JPathExecuteTests : TestFixtureBase
|
public class JPathExecuteTests : TestFixtureBase
|
||||||
{
|
{
|
||||||
|
[Test]
|
||||||
|
public void GreaterThanWithIntegerParameterAndStringValue()
|
||||||
|
{
|
||||||
|
string json = @"{
|
||||||
|
""persons"": [
|
||||||
|
{
|
||||||
|
""name"" : ""John"",
|
||||||
|
""age"": ""26""
|
||||||
|
},
|
||||||
|
{
|
||||||
|
""name"" : ""Jane"",
|
||||||
|
""age"": ""2""
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}";
|
||||||
|
|
||||||
|
JObject models = JObject.Parse(json);
|
||||||
|
|
||||||
|
var results = models.SelectTokens("$.persons[?(@.age > 3)]").ToList();
|
||||||
|
|
||||||
|
Assert.AreEqual(1, results.Count);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void GreaterThanWithStringParameterAndIntegerValue()
|
||||||
|
{
|
||||||
|
string json = @"{
|
||||||
|
""persons"": [
|
||||||
|
{
|
||||||
|
""name"" : ""John"",
|
||||||
|
""age"": 26
|
||||||
|
},
|
||||||
|
{
|
||||||
|
""name"" : ""Jane"",
|
||||||
|
""age"": 2
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}";
|
||||||
|
|
||||||
|
JObject models = JObject.Parse(json);
|
||||||
|
|
||||||
|
var results = models.SelectTokens("$.persons[?(@.age > '3')]").ToList();
|
||||||
|
|
||||||
|
Assert.AreEqual(1, results.Count);
|
||||||
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public void RecursiveWildcard()
|
public void RecursiveWildcard()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -175,6 +175,7 @@ namespace Newtonsoft.Json.Tests.Linq.JsonPath
|
|||||||
Assert.IsTrue(e1.IsMatch(null, new JArray(2, 3, 4, 5)));
|
Assert.IsTrue(e1.IsMatch(null, new JArray(2, 3, 4, 5)));
|
||||||
Assert.IsFalse(e1.IsMatch(null, new JArray(3, 4, 5)));
|
Assert.IsFalse(e1.IsMatch(null, new JArray(3, 4, 5)));
|
||||||
Assert.IsFalse(e1.IsMatch(null, new JArray(4, 5)));
|
Assert.IsFalse(e1.IsMatch(null, new JArray(4, 5)));
|
||||||
|
Assert.IsFalse(e1.IsMatch(null, new JArray("11", 5)));
|
||||||
|
|
||||||
BooleanQueryExpression e2 = new BooleanQueryExpression
|
BooleanQueryExpression e2 = new BooleanQueryExpression
|
||||||
{
|
{
|
||||||
@@ -190,6 +191,47 @@ namespace Newtonsoft.Json.Tests.Linq.JsonPath
|
|||||||
Assert.IsTrue(e2.IsMatch(null, new JArray(2, 3, 4, 5)));
|
Assert.IsTrue(e2.IsMatch(null, new JArray(2, 3, 4, 5)));
|
||||||
Assert.IsTrue(e2.IsMatch(null, new JArray(3, 4, 5)));
|
Assert.IsTrue(e2.IsMatch(null, new JArray(3, 4, 5)));
|
||||||
Assert.IsFalse(e2.IsMatch(null, new JArray(4, 5)));
|
Assert.IsFalse(e2.IsMatch(null, new JArray(4, 5)));
|
||||||
|
Assert.IsFalse(e1.IsMatch(null, new JArray("11", 5)));
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void BooleanExpressionTest_GreaterThanOperator()
|
||||||
|
{
|
||||||
|
BooleanQueryExpression e1 = new BooleanQueryExpression
|
||||||
|
{
|
||||||
|
Operator = QueryOperator.GreaterThan,
|
||||||
|
Right = new JValue(3),
|
||||||
|
Left = new List<PathFilter>
|
||||||
|
{
|
||||||
|
new ArrayIndexFilter()
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Assert.IsTrue(e1.IsMatch(null, new JArray("2", "26")));
|
||||||
|
Assert.IsTrue(e1.IsMatch(null, new JArray(2, 26)));
|
||||||
|
Assert.IsFalse(e1.IsMatch(null, new JArray(2, 3)));
|
||||||
|
Assert.IsFalse(e1.IsMatch(null, new JArray("2", "3")));
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void BooleanExpressionTest_GreaterThanOrEqualsOperator()
|
||||||
|
{
|
||||||
|
BooleanQueryExpression e1 = new BooleanQueryExpression
|
||||||
|
{
|
||||||
|
Operator = QueryOperator.GreaterThanOrEquals,
|
||||||
|
Right = new JValue(3),
|
||||||
|
Left = new List<PathFilter>
|
||||||
|
{
|
||||||
|
new ArrayIndexFilter()
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Assert.IsTrue(e1.IsMatch(null, new JArray("2", "26")));
|
||||||
|
Assert.IsTrue(e1.IsMatch(null, new JArray(2, 26)));
|
||||||
|
Assert.IsTrue(e1.IsMatch(null, new JArray(2, 3)));
|
||||||
|
Assert.IsTrue(e1.IsMatch(null, new JArray("2", "3")));
|
||||||
|
Assert.IsFalse(e1.IsMatch(null, new JArray(2, 1)));
|
||||||
|
Assert.IsFalse(e1.IsMatch(null, new JArray("2", "1")));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1043,9 +1043,22 @@ namespace Newtonsoft.Json.Linq
|
|||||||
}
|
}
|
||||||
|
|
||||||
JValue value = obj as JValue;
|
JValue value = obj as JValue;
|
||||||
object otherValue = value != null ? value.Value : obj;
|
JTokenType comparisonType;
|
||||||
|
object otherValue;
|
||||||
|
if (value != null)
|
||||||
|
{
|
||||||
|
otherValue = value.Value;
|
||||||
|
comparisonType = (_valueType == JTokenType.String && _valueType != value._valueType)
|
||||||
|
? value._valueType
|
||||||
|
: _valueType;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
otherValue = obj;
|
||||||
|
comparisonType = _valueType;
|
||||||
|
}
|
||||||
|
|
||||||
return Compare(_valueType, _value, otherValue);
|
return Compare(comparisonType, _value, otherValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -1073,7 +1086,11 @@ namespace Newtonsoft.Json.Linq
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return Compare(_valueType, _value, obj._value);
|
JTokenType comparisonType = (_valueType == JTokenType.String && _valueType != obj._valueType)
|
||||||
|
? obj._valueType
|
||||||
|
: _valueType;
|
||||||
|
|
||||||
|
return Compare(comparisonType, _value, obj._value);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if HAVE_ICONVERTIBLE
|
#if HAVE_ICONVERTIBLE
|
||||||
|
|||||||
Reference in New Issue
Block a user