Skip to content
This repository has been archived by the owner on Apr 12, 2024. It is now read-only.

feat (ng-pluralize): add alternative mapping using attributes #2454

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 10 additions & 3 deletions src/ng/directive/ngPluralize.js
Original file line number Diff line number Diff line change
Expand Up @@ -174,13 +174,20 @@ var ngPluralizeDirective = ['$locale', '$interpolate', function($locale, $interp
restrict: 'EA',
link: function(scope, element, attr) {
var numberExp = attr.count,
whenExp = element.attr(attr.$attr.when), // this is because we have {{}} in attrs
whenExp = attr.$attr.when && element.attr(attr.$attr.when), // we have {{}} in attrs
offset = attr.offset || 0,
whens = scope.$eval(whenExp),
whens = scope.$eval(whenExp) || {},
whensExpFns = {},
startSymbol = $interpolate.startSymbol(),
endSymbol = $interpolate.endSymbol();
endSymbol = $interpolate.endSymbol(),
isWhen = /^when(Minus)?(.+)$/;

forEach(attr, function(expression, attributeName) {
if (isWhen.test(attributeName)) {
whens[lowercase(attributeName.replace('when', '').replace('Minus', '-'))] =
element.attr(attr.$attr[attributeName]);
}
});
forEach(whens, function(expression, key) {
whensExpFns[key] =
$interpolate(expression.replace(BRACE, startSymbol + numberExp + '-' +
Expand Down
63 changes: 60 additions & 3 deletions test/ng/directive/ngPluralizeSpec.js
Original file line number Diff line number Diff line change
@@ -1,100 +1,133 @@
'use strict';

describe('ngPluralize', function() {
var element;
var element,
elementAlt;


afterEach(function(){
dealoc(element);
dealoc(elementAlt);
});


describe('deal with pluralized strings without offset', function() {
beforeEach(inject(function($rootScope, $compile) {
element = $compile(
'<ng:pluralize count="email"' +
"when=\"{'0': 'You have no new email'," +
"when=\"{'-1': 'You have negative email. Whohoo!'," +
"'0': 'You have no new email'," +
"'one': 'You have one new email'," +
"'other': 'You have {} new emails'}\">" +
'</ng:pluralize>')($rootScope);
elementAlt = $compile(
'<ng:pluralize count="email" ' +
"when-minus-1='You have negative email. Whohoo!' " +
"when-0='You have no new email' " +
"when-one='You have one new email' " +
"when-other='You have {} new emails'>" +
'</ng:pluralize>')($rootScope);
}));


it('should show single/plural strings', inject(function($rootScope) {
$rootScope.email = 0;
$rootScope.$digest();
expect(element.text()).toBe('You have no new email');
expect(elementAlt.text()).toBe('You have no new email');

$rootScope.email = '0';
$rootScope.$digest();
expect(element.text()).toBe('You have no new email');
expect(elementAlt.text()).toBe('You have no new email');

$rootScope.email = 1;
$rootScope.$digest();
expect(element.text()).toBe('You have one new email');
expect(elementAlt.text()).toBe('You have one new email');

$rootScope.email = 0.01;
$rootScope.$digest();
expect(element.text()).toBe('You have 0.01 new emails');
expect(elementAlt.text()).toBe('You have 0.01 new emails');

$rootScope.email = '0.1';
$rootScope.$digest();
expect(element.text()).toBe('You have 0.1 new emails');
expect(elementAlt.text()).toBe('You have 0.1 new emails');

$rootScope.email = 2;
$rootScope.$digest();
expect(element.text()).toBe('You have 2 new emails');
expect(elementAlt.text()).toBe('You have 2 new emails');

$rootScope.email = -0.1;
$rootScope.$digest();
expect(element.text()).toBe('You have -0.1 new emails');
expect(elementAlt.text()).toBe('You have -0.1 new emails');

$rootScope.email = '-0.01';
$rootScope.$digest();
expect(element.text()).toBe('You have -0.01 new emails');
expect(elementAlt.text()).toBe('You have -0.01 new emails');

$rootScope.email = -2;
$rootScope.$digest();
expect(element.text()).toBe('You have -2 new emails');
expect(elementAlt.text()).toBe('You have -2 new emails');

$rootScope.email = -1;
$rootScope.$digest();
expect(element.text()).toBe('You have negative email. Whohoo!');
expect(elementAlt.text()).toBe('You have negative email. Whohoo!');
}));


it('should show single/plural strings with mal-formed inputs', inject(function($rootScope) {
$rootScope.email = '';
$rootScope.$digest();
expect(element.text()).toBe('');
expect(elementAlt.text()).toBe('');

$rootScope.email = null;
$rootScope.$digest();
expect(element.text()).toBe('');
expect(elementAlt.text()).toBe('');

$rootScope.email = undefined;
$rootScope.$digest();
expect(element.text()).toBe('');
expect(elementAlt.text()).toBe('');

$rootScope.email = 'a3';
$rootScope.$digest();
expect(element.text()).toBe('');
expect(elementAlt.text()).toBe('');

$rootScope.email = '011';
$rootScope.$digest();
expect(element.text()).toBe('You have 11 new emails');
expect(elementAlt.text()).toBe('You have 11 new emails');

$rootScope.email = '-011';
$rootScope.$digest();
expect(element.text()).toBe('You have -11 new emails');
expect(elementAlt.text()).toBe('You have -11 new emails');

$rootScope.email = '1fff';
$rootScope.$digest();
expect(element.text()).toBe('You have one new email');
expect(elementAlt.text()).toBe('You have one new email');

$rootScope.email = '0aa22';
$rootScope.$digest();
expect(element.text()).toBe('You have no new email');
expect(elementAlt.text()).toBe('You have no new email');

$rootScope.email = '000001';
$rootScope.$digest();
expect(element.text()).toBe('You have one new email');
expect(elementAlt.text()).toBe('You have one new email');
}));
});

Expand All @@ -117,35 +150,48 @@ describe('ngPluralize', function() {
describe('deal with pluralized strings with offset', function() {
it('should show single/plural strings with offset', inject(function($rootScope, $compile) {
element = $compile(
"<ng:pluralize count=\"viewCount\" offset=2 " +
"<ng:pluralize count='viewCount' offset='2' " +
"when=\"{'0': 'Nobody is viewing.'," +
"'1': '{{p1}} is viewing.'," +
"'2': '{{p1}} and {{p2}} are viewing.'," +
"'one': '{{p1}}, {{p2}} and one other person are viewing.'," +
"'other': '{{p1}}, {{p2}} and {} other people are viewing.'}\">" +
"</ng:pluralize>")($rootScope);
elementAlt = $compile(
"<ng:pluralize count='viewCount' offset='2' " +
"when-0='Nobody is viewing.'" +
"when-1='{{p1}} is viewing.'" +
"when-2='{{p1}} and {{p2}} are viewing.'" +
"when-one='{{p1}}, {{p2}} and one other person are viewing.'" +
"when-other='{{p1}}, {{p2}} and {} other people are viewing.'>" +
"</ng:pluralize>")($rootScope);
$rootScope.p1 = 'Igor';
$rootScope.p2 = 'Misko';

$rootScope.viewCount = 0;
$rootScope.$digest();
expect(element.text()).toBe('Nobody is viewing.');
expect(elementAlt.text()).toBe('Nobody is viewing.');

$rootScope.viewCount = 1;
$rootScope.$digest();
expect(element.text()).toBe('Igor is viewing.');
expect(elementAlt.text()).toBe('Igor is viewing.');

$rootScope.viewCount = 2;
$rootScope.$digest();
expect(element.text()).toBe('Igor and Misko are viewing.');
expect(elementAlt.text()).toBe('Igor and Misko are viewing.');

$rootScope.viewCount = 3;
$rootScope.$digest();
expect(element.text()).toBe('Igor, Misko and one other person are viewing.');
expect(elementAlt.text()).toBe('Igor, Misko and one other person are viewing.');

$rootScope.viewCount = 4;
$rootScope.$digest();
expect(element.text()).toBe('Igor, Misko and 2 other people are viewing.');
expect(elementAlt.text()).toBe('Igor, Misko and 2 other people are viewing.');
}));
});

Expand All @@ -165,23 +211,34 @@ describe('ngPluralize', function() {
"'one': '[[p1%% and one other person are viewing.'," +
"'other': '[[p1%% and {} other people are viewing.'}\">" +
"</ng:pluralize>")($rootScope);
elementAlt = $compile(
"<ng:pluralize count='viewCount' offset='1'" +
"when-0='Nobody is viewing.'" +
"when-1='[[p1%% is viewing.'" +
"when-one='[[p1%% and one other person are viewing.'" +
"when-other='[[p1%% and {} other people are viewing.'>" +
"</ng:pluralize>")($rootScope);
$rootScope.p1 = 'Igor';

$rootScope.viewCount = 0;
$rootScope.$digest();
expect(element.text()).toBe('Nobody is viewing.');
expect(elementAlt.text()).toBe('Nobody is viewing.');

$rootScope.viewCount = 1;
$rootScope.$digest();
expect(element.text()).toBe('Igor is viewing.');
expect(elementAlt.text()).toBe('Igor is viewing.');

$rootScope.viewCount = 2;
$rootScope.$digest();
expect(element.text()).toBe('Igor and one other person are viewing.');
expect(elementAlt.text()).toBe('Igor and one other person are viewing.');

$rootScope.viewCount = 3;
$rootScope.$digest();
expect(element.text()).toBe('Igor and 2 other people are viewing.');
expect(elementAlt.text()).toBe('Igor and 2 other people are viewing.');
});
})
});
Expand Down