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