333
schangxiang@126.com
2025-09-19 18966e02fb573c7e2bb0c6426ed792b38b910940
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
144
145
146
147
148
149
150
151
/**
 * Loop through all entries in our user agents object and test everything.
 *
 * @see  src/useragents.js
 * @author hannes.diercks@jimdo.com
 */
 
var g
  , ua
  , p
  , assert = require('assert')
  , browser = require('../src/bowser')
  , allUserAgents = require('../src/useragents').useragents
 
/**
 * Get the length of an object.
 * http://stackoverflow.com/questions/5223/length-of-javascript-object-ie-associative-array
 *
 * @param  {Object} obj
 * @return {Number}
 */
function objLength(obj) {
  var size = 0
    , key
  for (key in obj) {
    if (obj.hasOwnProperty(key)) size++
  }
  return size
}
 
function objKeys(obj) {
  var keys = []
    , key
  for (key in obj) {
    if (obj.hasOwnProperty(key)) {
      keys.push(key)
    }
  }
  keys.sort();
  return keys.join(', ')
}
 
/* Groups */
for (g in allUserAgents) { (function(group, userAgents) {
  describe(group, function() {
 
    /* User Agents */
    for (ua in userAgents) { (function(userAgent, expections) {
      describe('user agent "' + userAgent + '"', function() {
 
        expections.name = group
 
        /* Get the result from bowser. */
        var result = browser._detect(userAgent)
 
        /* At first, check if the result has the correct length. */
        it('should have ' + objLength(expections) + ' properties', function() {
          assert.equal(objKeys(result), objKeys(expections))
        })
 
        /* Properties */
        for (p in expections) { (function(property, value, resultValue) {
 
          /* Now ensure correctness of every property. */
          it('\'s Property "' + property + '" should be ' + value, function() {
            assert.equal(resultValue, value)
          })
 
        })(p, expections[p], result[p])}
 
      })
    })(ua, userAgents[ua])}
 
  })
})(g, allUserAgents[g])}
 
var comparisionsTasks = [
  ['9.0', '10', -1],
  ['11', '10', 1],
  ['1.10.2.1',  '1.8.2.1.90', 1],
  ['1.010.2.1', '1.08.2.1.90', 1],
  ['1.10.2.1', '1.10.2.1', 0],
  ['1.10.2.1', '1.0800.2', -1],
  ['1.0.0-alpha', '1.0.0-alpha.1', -1],
  ['1.0.0-alpha.1', '1.0.0-alpha.beta', -1],
  ['1.0.0-alpha.beta', '1.0.0-beta', -1],
  ['1.0.0-beta', '1.0.0-beta.2', -1],
  ['1.0.0-beta.11', '1.0.0-rc.1', -1],
  ['1.0.0-rc.1', '1.0.0', -1]
];
 
describe('Browser versions comparision', function() {
  for(g in comparisionsTasks) {
    var task = comparisionsTasks[g],
        version = task[0],
        version2 = task[1],
        matching = task[2] === 0 ? ' == ' : (task[2] > 0) ? ' > ' : ' < ';
    it('version ' + version + ' should be' + matching + 'version ' + version2, function(){
      assert.equal(browser.compareVersions([version, version2]), task[2]);
    });
  }
});
 
describe('Unsupported browser check', function() {
 
  before(function() {
    this.ie10_6 = "Mozilla/5.0 (compatible; MSIE 10.6; Windows NT 6.1; Trident/5.0; InfoPath.2; SLCC1; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET CLR 2.0.50727) 3gpp-gba UNTRUSTED/1.0";
  });
 
  it('should be passed by #isUnsupportedBrowser for IE10.6 and for IE10 miminal version specified', function() {
    var unsupported = browser.isUnsupportedBrowser({msie: "10"}, this.ie10_6);
    assert.equal(unsupported, false);
  });
 
  it('should be passed by #isUnsupportedBrowser for IE10.6 and for IE10 miminal version specified in strict mode', function() {
    var unsupported = browser.isUnsupportedBrowser({msie: "10"}, true, this.ie10_6);
    assert.equal(unsupported, false);
  });
 
  it('should NOT be passed by #isUnsupportedBrowser for IE10.6 and for IE10 miminal version specified in strict mode', function() {
    var isUnsupported = browser.isUnsupportedBrowser({msie: "11"}, true, this.ie10_6);
    assert.equal(isUnsupported, true);
  });
 
  it('should NOT be passed by #check for IE10.6 and for IE11 miminal version specified', function() {
    var supported = browser.check({msie: "11"}, this.ie10_6);
    assert.equal(supported, false);
  });
 
  it('should NOT be passed by #check for IE10.6 and for IE11 miminal version specified in strict mode', function() {
    var supported = browser.check({msie: "11"}, true, this.ie10_6);
    assert.equal(supported, false);
  });
 
  it('should throw an error when minVersion map has a number, but not a string', function() {
    assert.throws(() => {
      browser.check({msie: 11}, this.ie10_6);
    }, /Browser version in the minVersion map should be a string/);
  });
 
  it('should be passed by #check for IE10.6 when version was not specified', function() {
    var supported = browser.check({}, this.ie10_6);
    assert.equal(supported, true);
  });
 
  it('should NOT be passed by #check for IE10.6 when version was not specified in strict mode', function() {
    var supported = browser.check({}, true, this.ie10_6);
    assert.equal(supported, false);
  });
 
})