Browse Source

Merge pull request #182 from honestegg/array-sort

fix array sort method
Sébastien Ros 10 years ago
parent
commit
8d3cc7b87e
2 changed files with 28 additions and 2 deletions
  1. 18 0
      Jint.Tests/Runtime/EngineTests.cs
  2. 10 2
      Jint/Native/Array/ArrayPrototype.cs

+ 18 - 0
Jint.Tests/Runtime/EngineTests.cs

@@ -1193,6 +1193,24 @@ namespace Jint.Tests.Runtime
                 .GetCompletionValue().ToObject();
                 .GetCompletionValue().ToObject();
 
 
             Assert.Equal(value, result);
             Assert.Equal(value, result);
+        }
+
+
+
+        [Fact]
+        public void ShouldSortArrayWhenCompareFunctionReturnsFloatingPointNumber()
+        {
+            RunTest(@"
+                var nums = [1, 1.1, 1.2, 2, 2, 2.1, 2.2];
+                nums.sort(function(a,b){return b-a;});
+                assert(nums[0] === 2.2);
+                assert(nums[1] === 2.1);
+                assert(nums[2] === 2);
+                assert(nums[3] === 2);
+                assert(nums[4] === 1.2);
+                assert(nums[5] === 1.1);
+                assert(nums[6] === 1);
+            ");
         }
         }
     }
     }
 }
 }

+ 10 - 2
Jint/Native/Array/ArrayPrototype.cs

@@ -518,8 +518,16 @@ namespace Jint.Native.Array
 
 
                     if (compareFn != null)
                     if (compareFn != null)
                     {
                     {
-                        var s = (int) TypeConverter.ToUint32(compareFn.Call(Undefined.Instance, new[] {x, y}));
-                        return s;
+                        var s = TypeConverter.ToNumber(compareFn.Call(Undefined.Instance, new[] {x, y}));
+                        if (s < 0)
+                        {
+                            return -1;
+                        }
+                        if (s > 0)
+                        {
+                            return 1;
+                        }
+                        return 0;
                     }
                     }
 
 
                     var xString = TypeConverter.ToString(x);
                     var xString = TypeConverter.ToString(x);