File size: 6,004 Bytes
befd7da |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 |
var parser = require("../index.js");
var assert = require("assert");
var should = require("should");
var assertResult = function(expected, actual){
actual.code.should.eql(expected.code);
if(actual.script || expected.script){
actual.script.should.eql(expected.script)
}
if(actual.region || expected.region){
actual.region.should.eql(expected.region)
}
actual.quality.should.eql(expected.quality);
}
describe('accept-language#parse()', function(){
it('should correctly parse the language with quality', function(){
var result = parser.parse('en-GB;q=0.8');
assertResult({ code: 'en', region: 'GB', quality: 0.8}, result[0]);
});
it('should correctly parse the language without quality (default 1)', function(){
var result = parser.parse('en-GB');
assertResult({ code: 'en', region: 'GB', quality: 1.0}, result[0]);
});
it('should correctly parse the language without region', function(){
var result = parser.parse('en;q=0.8');
assertResult({ code: 'en', quality: 0.8}, result[0]);
});
// This needs to be changed to preserve the full code.
it('should ignore extra characters in the region code', function(){
var result = parser.parse('az-AZ');
assertResult({ code: 'az', region: 'AZ', quality: 1.0}, result[0]);
});
it('should correctly parse a multi-language set', function(){
var result = parser.parse('fr-CA,fr;q=0.8');
assertResult({ code: 'fr', region: 'CA', quality: 1.0}, result[0]);
assertResult({ code: 'fr', quality: 0.8}, result[1]);
});
it('should correctly parse a wildcard', function(){
var result = parser.parse('fr-CA,*;q=0.8');
assertResult({ code: 'fr', region: 'CA', quality: 1.0}, result[0]);
assertResult({ code: '*', quality: 0.8}, result[1]);
});
it('should correctly parse a region with numbers', function(){
var result = parser.parse('fr-150');
assertResult({ code: 'fr', region: '150', quality: 1.0}, result[0]);
});
it('should correctly parse complex set', function(){
var result = parser.parse('fr-CA,fr;q=0.8,en-US;q=0.6,en;q=0.4,*;q=0.1');
assertResult({ code: 'fr', region: 'CA', quality: 1.0}, result[0]);
assertResult({ code: 'fr', quality: 0.8}, result[1]);
assertResult({ code: 'en', region: 'US', quality: 0.6}, result[2]);
assertResult({ code: 'en', quality: 0.4}, result[3]);
assertResult({ code: '*', quality: 0.1}, result[4]);
});
it('should cope with random whitespace', function(){
var result = parser.parse('fr-CA, fr;q=0.8, en-US;q=0.6,en;q=0.4, *;q=0.1');
assertResult({ code: 'fr', region: 'CA', quality: 1.0}, result[0]);
assertResult({ code: 'fr', quality: 0.8}, result[1]);
assertResult({ code: 'en', region: 'US', quality: 0.6}, result[2]);
assertResult({ code: 'en', quality: 0.4}, result[3]);
assertResult({ code: '*', quality: 0.1}, result[4]);
});
it('should sort based on quality value', function(){
var result = parser.parse('fr-CA,fr;q=0.2,en-US;q=0.6,en;q=0.4,*;q=0.5');
assertResult({ code: 'fr', region: 'CA', quality: 1.0}, result[0]);
assertResult({ code: 'en', region: 'US', quality: 0.6}, result[1]);
assertResult({ code: '*', quality: 0.5}, result[2]);
assertResult({ code: 'en', quality: 0.4}, result[3]);
assertResult({ code: 'fr', quality: 0.2}, result[4]);
});
it('should correctly identify script', function(){
var result = parser.parse('zh-Hant-cn');
assertResult({ code: 'zh', script: 'Hant', region: 'cn', quality: 1.0}, result[0]);
});
it('should cope with script and a quality value', function(){
var result = parser.parse('zh-Hant-cn;q=1, zh-cn;q=0.6, zh;q=0.4');
assertResult({ code: 'zh', script: 'Hant', region: 'cn', quality: 1.0}, result[0]);
assertResult({ code: 'zh', region: 'cn', quality: 0.6}, result[1]);
assertResult({ code: 'zh', quality: 0.4}, result[2]);
});
});
describe('accept-language#pick()', function(){
it('should pick a specific regional language', function(){
var result = parser.pick(['en-US', 'fr-CA'], 'fr-CA,fr;q=0.2,en-US;q=0.6,en;q=0.4,*;q=0.5');
assert.equal(result, 'fr-CA');
});
it('should pick a specific script (if specified)', function(){
var result = parser.pick(['zh-Hant-cn', 'zh-cn'], 'zh-Hant-cn,zh-cn;q=0.6,zh;q=0.4');
assert.equal(result, 'zh-Hant-cn');
});
it('should pick proper language regardless of casing', function(){
var result = parser.pick(['eN-Us', 'Fr-cA'], 'fR-Ca,fr;q=0.2,en-US;q=0.6,en;q=0.4,*;q=0.5');
assert.equal(result.toLowerCase(), 'fr-ca');
});
it('should pick a specific language', function(){
var result = parser.pick(['en', 'fr-CA'], 'ja-JP,ja;1=0.5,en;q=0.2');
assert.equal(result, 'en');
});
it('should pick a language when culture is not specified', function() {
var result = parser.pick(['en-us', 'it-IT'], 'pl-PL,en');
assert.equal(result, 'en-us');
});
it('should return null if no matches are found', function(){
var result = parser.pick(['ko-KR'], 'fr-CA,fr;q=0.8,en-US;q=0.6,en;q=0.4,*;q=0.1');
assert.equal(result, null);
});
it('should return null if support no languages', function(){
var result = parser.pick([], 'fr-CA,fr;q=0.8,en-US;q=0.6,en;q=0.4,*;q=0.1');
assert.equal(result, null);
});
it('should return null if invalid support', function(){
var result = parser.pick(undefined, 'fr-CA,fr;q=0.8,en-US;q=0.6,en;q=0.4,*;q=0.1');
assert.equal(result, null);
});
it('should return null if invalid accept-language', function(){
var result = parser.pick(['en']);
assert.equal(result, null);
});
});
|