diff options
| author | Misko Hevery | 2010-09-26 19:43:39 +0200 | 
|---|---|---|
| committer | Misko Hevery | 2010-09-26 19:43:39 +0200 | 
| commit | 9171a2b2b50d0a8217c98e0017a7d2a0a1a37380 (patch) | |
| tree | 99061623acebc77907e3948c2ffeb8bcca1a7fc8 | |
| parent | 27868f17ded5e668aad17739cecd228dc3c87219 (diff) | |
| download | angular.js-9171a2b2b50d0a8217c98e0017a7d2a0a1a37380.tar.bz2 | |
Added support for functions to $orderBy method
http://github.com/angular/angular.js/issues#issue/23
| -rw-r--r-- | src/apis.js | 48 | ||||
| -rw-r--r-- | test/ApiSpecs.js | 205 | ||||
| -rw-r--r-- | test/ApiTest.js | 183 | 
3 files changed, 231 insertions, 205 deletions
diff --git a/src/apis.js b/src/apis.js index 764c35ea..70d9dc8b 100644 --- a/src/apis.js +++ b/src/apis.js @@ -132,6 +132,31 @@ var angularArray = {      return count;    },    'orderBy':function(array, expression, descend) { +    expression = isArray(expression) ? expression: [expression]; +    expression = map(expression, function($){ +      var descending = false, get = $ || identity; +      if (isString($)) { +        if (($.charAt(0) == '+' || $.charAt(0) == '-')) { +          descending = $.charAt(0) == '-'; +          $ = $.substring(1); +        } +        get = expressionCompile($).fnSelf; +      } +      return reverse(function(a,b){ +        return compare(get(a),get(b)); +      }, descending); +    }); +    var arrayCopy = []; +    for ( var i = 0; i < array.length; i++) { arrayCopy.push(array[i]); } +    return arrayCopy.sort(reverse(comparator, descend)); + +    function comparator(o1, o2){ +      for ( var i = 0; i < expression.length; i++) { +        var comp = expression[i](o1, o2); +        if (comp !== 0) return comp; +      } +      return 0; +    }      function reverse(comp, descending) {        return toBoolean(descending) ?            function(a,b){return comp(b,a);} : comp; @@ -148,28 +173,7 @@ var angularArray = {          return t1 < t2 ? -1 : 1;        }      } -    expression = isArray(expression) ? expression: [expression]; -    expression = map(expression, function($){ -      var descending = false; -      if (typeof $ == "string" && ($.charAt(0) == '+' || $.charAt(0) == '-')) { -        descending = $.charAt(0) == '-'; -        $ = $.substring(1); -      } -      var get = $ ? expressionCompile($).fnSelf : identity; -      return reverse(function(a,b){ -        return compare(get(a),get(b)); -      }, descending); -    }); -    var comparator = function(o1, o2){ -      for ( var i = 0; i < expression.length; i++) { -        var comp = expression[i](o1, o2); -        if (comp !== 0) return comp; -      } -      return 0; -    }; -    var arrayCopy = []; -    for ( var i = 0; i < array.length; i++) { arrayCopy.push(array[i]); } -    return arrayCopy.sort(reverse(comparator, descend)); +    }  }; diff --git a/test/ApiSpecs.js b/test/ApiSpecs.js new file mode 100644 index 00000000..5548d795 --- /dev/null +++ b/test/ApiSpecs.js @@ -0,0 +1,205 @@ +describe('api', function(){ + +  it('ShouldReturnTypeOf', function(){ +    assertEquals("undefined", angular.Object.typeOf(undefined)); +    assertEquals("null", angular.Object.typeOf(null)); +    assertEquals("object", angular.Collection.typeOf({})); +    assertEquals("array", angular.Array.typeOf([])); +    assertEquals("string", angular.Object.typeOf("")); +    assertEquals("date", angular.Object.typeOf(new Date())); +    assertEquals("element", angular.Object.typeOf(document.body)); +    assertEquals($function, angular.Object.typeOf(function(){})); +  }); + +  it('ShouldReturnSize', function(){ +    assertEquals(0, angular.Collection.size({})); +    assertEquals(1, angular.Collection.size({a:"b"})); +    assertEquals(0, angular.Object.size({})); +    assertEquals(1, angular.Array.size([0])); +  }); + +  it('should sum', function(){ +    assertEquals(3, angular.Array.sum([{a:"1"}, {a:"2"}], 'a')); +  }); + +  it('SumContainingNaN', function(){ +    assertEquals(1, angular.Array.sum([{a:1}, {a:Number.NaN}], 'a')); +    assertEquals(1, angular.Array.sum([{a:1}, {a:Number.NaN}], function($){return $.a;})); +  }); + +  it('Index', function(){ +    assertEquals(angular.Array.indexOf(['a'], 'a'), 0); +    assertEquals(angular.Array.indexOf(['a', 'b'], 'a'), 0); +    assertEquals(angular.Array.indexOf(['b', 'a'], 'a'), 1); +    assertEquals(angular.Array.indexOf(['b', 'b'],'x'), -1); +  }); + +  it('Remove', function(){ +    var items = ['a', 'b', 'c']; +    assertEquals(angular.Array.remove(items, 'q'), 'q'); +    assertEquals(items.length, 3); + +    assertEquals(angular.Array.remove(items, 'b'), 'b'); +    assertEquals(items.length, 2); + +    assertEquals(angular.Array.remove(items, 'a'), 'a'); +    assertEquals(items.length, 1); + +    assertEquals(angular.Array.remove(items, 'c'), 'c'); +    assertEquals(items.length, 0); + +    assertEquals(angular.Array.remove(items, 'q'), 'q'); +    assertEquals(items.length, 0); +  }); + +  describe('filter', function(){ + +    it('Filter', function() { +      var items = ["MIsKO", {name:"shyam"}, ["adam"], 1234]; +      assertEquals(4, angular.Array.filter(items, "").length); +      assertEquals(4, angular.Array.filter(items, undefined).length); + +      assertEquals(1, angular.Array.filter(items, 'iSk').length); +      assertEquals("MIsKO", angular.Array.filter(items, 'isk')[0]); + +      assertEquals(1, angular.Array.filter(items, 'yam').length); +      assertEquals(items[1], angular.Array.filter(items, 'yam')[0]); + +      assertEquals(1, angular.Array.filter(items, 'da').length); +      assertEquals(items[2], angular.Array.filter(items, 'da')[0]); + +      assertEquals(1, angular.Array.filter(items, '34').length); +      assertEquals(1234, angular.Array.filter(items, '34')[0]); + +      assertEquals(0, angular.Array.filter(items, "I don't exist").length); +    }); + +    it('ShouldNotFilterOnSystemData', function() { +      assertEquals("", "".charAt(0)); // assumption +      var items = [{$name:"misko"}]; +      assertEquals(0, angular.Array.filter(items, "misko").length); +    }); + +    it('FilterOnSpecificProperty', function(){ +      var items = [{ignore:"a", name:"a"}, {ignore:"a", name:"abc"}]; +      assertEquals(2, angular.Array.filter(items, {}).length); + +      assertEquals(2, angular.Array.filter(items, {name:'a'}).length); + +      assertEquals(1, angular.Array.filter(items, {name:'b'}).length); +      assertEquals("abc", angular.Array.filter(items, {name:'b'})[0].name); +    }); + +    it('FilterOnFunction', function(){ +      var items = [{name:"a"}, {name:"abc", done:true}]; +      assertEquals(1, angular.Array.filter(items, function(i){return i.done;}).length); +    }); + +    it('FilterIsAndFunction', function(){ +      var items = [{first:"misko", last:"hevery"}, +                   {first:"adam", last:"abrons"}]; + +      assertEquals(2, angular.Array.filter(items, {first:'', last:''}).length); +      assertEquals(1, angular.Array.filter(items, {first:'', last:'hevery'}).length); +      assertEquals(0, angular.Array.filter(items, {first:'adam', last:'hevery'}).length); +      assertEquals(1, angular.Array.filter(items, {first:'misko', last:'hevery'}).length); +      assertEquals(items[0], angular.Array.filter(items, {first:'misko', last:'hevery'})[0]); +    }); + +    it('FilterNot', function(){ +      var items = ["misko", "adam"]; + +      assertEquals(1, angular.Array.filter(items, '!isk').length); +      assertEquals(items[1], angular.Array.filter(items, '!isk')[0]); +    }); +  }); + + +  it('Add', function(){ +    var add = angular.Array.add; +    assertJsonEquals([{}, "a"], add(add([]),"a")); +  }); + +  it('Count', function(){ +    var array = [{name:'a'},{name:'b'},{name:''}]; +    var obj = {}; + +    assertEquals(3, angular.Array.count(array)); +    assertEquals(2, angular.Array.count(array, 'name')); +    assertEquals(1, angular.Array.count(array, 'name=="a"')); +  }); + +  describe('orderBy', function(){ +    var orderBy = angular.Array.orderBy; + +    it('ShouldSortArray', function(){ +      assertEquals([2,15], angular.Array.orderBy([15,2])); +      assertEquals(["a","B", "c"], angular.Array.orderBy(["c","B", "a"])); +      assertEquals([15,"2"], angular.Array.orderBy([15,"2"])); +      assertEquals(["15","2"], angular.Array.orderBy(["15","2"])); +      assertJsonEquals([{a:2},{a:15}], angular.Array.orderBy([{a:15},{a:2}], 'a')); +      assertJsonEquals([{a:2},{a:15}], angular.Array.orderBy([{a:15},{a:2}], 'a', "F")); +    }); + +    it('ShouldSortArrayInReverse', function(){ +      assertJsonEquals([{a:15},{a:2}], angular.Array.orderBy([{a:15},{a:2}], 'a', true)); +      assertJsonEquals([{a:15},{a:2}], angular.Array.orderBy([{a:15},{a:2}], 'a', "T")); +      assertJsonEquals([{a:15},{a:2}], angular.Array.orderBy([{a:15},{a:2}], 'a', "reverse")); +    }); + +    it('ShouldSortArrayByPredicate', function(){ +      assertJsonEquals([{a:2, b:1},{a:15, b:1}], +          angular.Array.orderBy([{a:15, b:1},{a:2, b:1}], ['a', 'b'])); +      assertJsonEquals([{a:2, b:1},{a:15, b:1}], +          angular.Array.orderBy([{a:15, b:1},{a:2, b:1}], ['b', 'a'])); +      assertJsonEquals([{a:15, b:1},{a:2, b:1}], +          angular.Array.orderBy([{a:15, b:1},{a:2, b:1}], ['+b', '-a'])); +    }); + +    it('should use function', function(){ +      expect( +        orderBy( +          [{a:15, b:1},{a:2, b:1}],  +          function(value){ return value.a; } +        ) +      ).toEqual([{a:2, b:1},{a:15, b:1}]); + +    }); + +  }); + +  it('QuoteString', function(){ +    assertEquals(angular.String.quote('a'), '"a"'); +    assertEquals(angular.String.quote('\\'), '"\\\\"'); +    assertEquals(angular.String.quote("'a'"), '"\'a\'"'); +    assertEquals(angular.String.quote('"a"'), '"\\"a\\""'); +    assertEquals(angular.String.quote('\n\f\r\t'), '"\\n\\f\\r\\t"'); +  }); + +  it('QuoteStringBug', function(){ +    assertEquals('"7\\\\\\\"7"', angular.String.quote("7\\\"7")); +  }); + +  it('QuoteUnicode', function(){ +    assertEquals('"abc\\u00a0def"', angular.String.quoteUnicode('abc\u00A0def')); +  }); + +  it('DateToUTC', function(){ +    var date = new Date("Sep 10 2003 13:02:03 GMT"); +    assertEquals("date", angular.Object.typeOf(date)); +    assertEquals("2003-09-10T13:02:03Z", angular.Date.toString(date)); +  }); + +  it('StringFromUTC', function(){ +    var date = angular.String.toDate("2003-09-10T13:02:03Z"); +    assertEquals("date", angular.Object.typeOf(date)); +    assertEquals("2003-09-10T13:02:03Z", angular.Date.toString(date)); +    assertEquals("str", angular.String.toDate("str")); +  }); + +  it('ObjectShouldHaveExtend', function(){ +    assertEquals({a:1, b:2}, angular.Object.extend({a:1}, {b:2})); +  }); + +}); + diff --git a/test/ApiTest.js b/test/ApiTest.js deleted file mode 100644 index 189e9ad6..00000000 --- a/test/ApiTest.js +++ /dev/null @@ -1,183 +0,0 @@ -ApiTest = TestCase("ApiTest"); - -ApiTest.prototype.testItShouldReturnTypeOf = function (){ -  assertEquals("undefined", angular.Object.typeOf(undefined)); -  assertEquals("null", angular.Object.typeOf(null)); -  assertEquals("object", angular.Collection.typeOf({})); -  assertEquals("array", angular.Array.typeOf([])); -  assertEquals("string", angular.Object.typeOf("")); -  assertEquals("date", angular.Object.typeOf(new Date())); -  assertEquals("element", angular.Object.typeOf(document.body)); -  assertEquals($function, angular.Object.typeOf(function(){})); -}; - -ApiTest.prototype.testItShouldReturnSize = function(){ -  assertEquals(0, angular.Collection.size({})); -  assertEquals(1, angular.Collection.size({a:"b"})); -  assertEquals(0, angular.Object.size({})); -  assertEquals(1, angular.Array.size([0])); -}; - -ApiTest.prototype.testSum = function(){ -  assertEquals(3, angular.Array.sum([{a:"1"}, {a:"2"}], 'a')); -}; - -ApiTest.prototype.testSumContainingNaN = function(){ -  assertEquals(1, angular.Array.sum([{a:1}, {a:Number.NaN}], 'a')); -  assertEquals(1, angular.Array.sum([{a:1}, {a:Number.NaN}], function($){return $.a;})); -}; - -ApiTest.prototype.testIndex = function(){ -  assertEquals(angular.Array.indexOf(['a'], 'a'), 0); -  assertEquals(angular.Array.indexOf(['a', 'b'], 'a'), 0); -  assertEquals(angular.Array.indexOf(['b', 'a'], 'a'), 1); -  assertEquals(angular.Array.indexOf(['b', 'b'],'x'), -1); -}; - -ApiTest.prototype.testRemove = function(){ -  var items = ['a', 'b', 'c']; -  assertEquals(angular.Array.remove(items, 'q'), 'q'); -  assertEquals(items.length, 3); - -  assertEquals(angular.Array.remove(items, 'b'), 'b'); -  assertEquals(items.length, 2); - -  assertEquals(angular.Array.remove(items, 'a'), 'a'); -  assertEquals(items.length, 1); - -  assertEquals(angular.Array.remove(items, 'c'), 'c'); -  assertEquals(items.length, 0); - -  assertEquals(angular.Array.remove(items, 'q'), 'q'); -  assertEquals(items.length, 0); -}; - -ApiTest.prototype.testFilter = function() { -  var items = ["MIsKO", {name:"shyam"}, ["adam"], 1234]; -  assertEquals(4, angular.Array.filter(items, "").length); -  assertEquals(4, angular.Array.filter(items, undefined).length); - -  assertEquals(1, angular.Array.filter(items, 'iSk').length); -  assertEquals("MIsKO", angular.Array.filter(items, 'isk')[0]); - -  assertEquals(1, angular.Array.filter(items, 'yam').length); -  assertEquals(items[1], angular.Array.filter(items, 'yam')[0]); - -  assertEquals(1, angular.Array.filter(items, 'da').length); -  assertEquals(items[2], angular.Array.filter(items, 'da')[0]); - -  assertEquals(1, angular.Array.filter(items, '34').length); -  assertEquals(1234, angular.Array.filter(items, '34')[0]); - -  assertEquals(0, angular.Array.filter(items, "I don't exist").length); -}; - -ApiTest.prototype.testShouldNotFilterOnSystemData = function() { -  assertEquals("", "".charAt(0)); // assumption -  var items = [{$name:"misko"}]; -  assertEquals(0, angular.Array.filter(items, "misko").length); -}; - -ApiTest.prototype.testFilterOnSpecificProperty = function() { -  var items = [{ignore:"a", name:"a"}, {ignore:"a", name:"abc"}]; -  assertEquals(2, angular.Array.filter(items, {}).length); - -  assertEquals(2, angular.Array.filter(items, {name:'a'}).length); - -  assertEquals(1, angular.Array.filter(items, {name:'b'}).length); -  assertEquals("abc", angular.Array.filter(items, {name:'b'})[0].name); -}; - -ApiTest.prototype.testFilterOnFunction = function() { -  var items = [{name:"a"}, {name:"abc", done:true}]; -  assertEquals(1, angular.Array.filter(items, function(i){return i.done;}).length); -}; - -ApiTest.prototype.testFilterIsAndFunction = function() { -  var items = [{first:"misko", last:"hevery"}, -               {first:"adam", last:"abrons"}]; - -  assertEquals(2, angular.Array.filter(items, {first:'', last:''}).length); -  assertEquals(1, angular.Array.filter(items, {first:'', last:'hevery'}).length); -  assertEquals(0, angular.Array.filter(items, {first:'adam', last:'hevery'}).length); -  assertEquals(1, angular.Array.filter(items, {first:'misko', last:'hevery'}).length); -  assertEquals(items[0], angular.Array.filter(items, {first:'misko', last:'hevery'})[0]); -}; - -ApiTest.prototype.testFilterNot = function() { -  var items = ["misko", "adam"]; - -  assertEquals(1, angular.Array.filter(items, '!isk').length); -  assertEquals(items[1], angular.Array.filter(items, '!isk')[0]); -}; - -ApiTest.prototype.testAdd = function() { -  var add = angular.Array.add; -  assertJsonEquals([{}, "a"], add(add([]),"a")); -}; - -ApiTest.prototype.testCount = function() { -  var array = [{name:'a'},{name:'b'},{name:''}]; -  var obj = {}; - -  assertEquals(3, angular.Array.count(array)); -  assertEquals(2, angular.Array.count(array, 'name')); -  assertEquals(1, angular.Array.count(array, 'name=="a"')); -}; - -ApiTest.prototype.testItShouldSortArray = function() { -  assertEquals([2,15], angular.Array.orderBy([15,2])); -  assertEquals(["a","B", "c"], angular.Array.orderBy(["c","B", "a"])); -  assertEquals([15,"2"], angular.Array.orderBy([15,"2"])); -  assertEquals(["15","2"], angular.Array.orderBy(["15","2"])); -  assertJsonEquals([{a:2},{a:15}], angular.Array.orderBy([{a:15},{a:2}], 'a')); -  assertJsonEquals([{a:2},{a:15}], angular.Array.orderBy([{a:15},{a:2}], 'a', "F")); -}; - -ApiTest.prototype.testItShouldSortArrayInReverse = function() { -  assertJsonEquals([{a:15},{a:2}], angular.Array.orderBy([{a:15},{a:2}], 'a', true)); -  assertJsonEquals([{a:15},{a:2}], angular.Array.orderBy([{a:15},{a:2}], 'a', "T")); -  assertJsonEquals([{a:15},{a:2}], angular.Array.orderBy([{a:15},{a:2}], 'a', "reverse")); -}; - -ApiTest.prototype.testItShouldSortArrayByPredicate = function() { -  assertJsonEquals([{a:2, b:1},{a:15, b:1}], -    angular.Array.orderBy([{a:15, b:1},{a:2, b:1}], ['a', 'b'])); -  assertJsonEquals([{a:2, b:1},{a:15, b:1}], -    angular.Array.orderBy([{a:15, b:1},{a:2, b:1}], ['b', 'a'])); -  assertJsonEquals([{a:15, b:1},{a:2, b:1}], -    angular.Array.orderBy([{a:15, b:1},{a:2, b:1}], ['+b', '-a'])); -}; - -ApiTest.prototype.testQuoteString = function(){ -  assertEquals(angular.String.quote('a'), '"a"'); -  assertEquals(angular.String.quote('\\'), '"\\\\"'); -  assertEquals(angular.String.quote("'a'"), '"\'a\'"'); -  assertEquals(angular.String.quote('"a"'), '"\\"a\\""'); -  assertEquals(angular.String.quote('\n\f\r\t'), '"\\n\\f\\r\\t"'); -}; - -ApiTest.prototype.testQuoteStringBug = function(){ -  assertEquals('"7\\\\\\\"7"', angular.String.quote("7\\\"7")); -}; - -ApiTest.prototype.testQuoteUnicode = function(){ -  assertEquals('"abc\\u00a0def"', angular.String.quoteUnicode('abc\u00A0def')); -}; - -ApiTest.prototype.testDateToUTC = function(){ -  var date = new Date("Sep 10 2003 13:02:03 GMT"); -  assertEquals("date", angular.Object.typeOf(date)); -  assertEquals("2003-09-10T13:02:03Z", angular.Date.toString(date)); -}; - -ApiTest.prototype.testStringFromUTC = function(){ -  var date = angular.String.toDate("2003-09-10T13:02:03Z"); -  assertEquals("date", angular.Object.typeOf(date)); -  assertEquals("2003-09-10T13:02:03Z", angular.Date.toString(date)); -  assertEquals("str", angular.String.toDate("str")); -}; - -ApiTest.prototype.testObjectShouldHaveExtend = function(){ -  assertEquals({a:1, b:2}, angular.Object.extend({a:1}, {b:2})); -};  | 
