diff options
| -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})); -}; |
