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

Commit

Permalink
test(support): verify support tests results in all tested browsers (#…
Browse files Browse the repository at this point in the history
  • Loading branch information
mgol committed May 30, 2017
1 parent a779431 commit f63bc3c
Show file tree
Hide file tree
Showing 4 changed files with 122 additions and 25 deletions.
10 changes: 5 additions & 5 deletions test/auto/injectorSpec.js
Original file line number Diff line number Diff line change
Expand Up @@ -283,32 +283,32 @@ describe('injector', function() {


describe('es6', function() {
if (support.ES6Function) {
if (support.shorthandMethods) {
// The functions are generated using `eval` as just having the ES6 syntax can break some browsers.
it('should be possible to annotate functions that are declared using ES6 syntax', function() {
it('should be possible to annotate shorthand methods', function() {
// eslint-disable-next-line no-eval
expect(annotate(eval('({ fn(x) { return; } })').fn)).toEqual(['x']);
});
}


if (support.fatArrow) {
if (support.fatArrows) {
it('should create $inject for arrow functions', function() {
// eslint-disable-next-line no-eval
expect(annotate(eval('(a, b) => a'))).toEqual(['a', 'b']);
});
}


if (support.fatArrow) {
if (support.fatArrows) {
it('should create $inject for arrow functions with no parenthesis', function() {
// eslint-disable-next-line no-eval
expect(annotate(eval('a => a'))).toEqual(['a']);
});
}


if (support.fatArrow) {
if (support.fatArrows) {
it('should take args before first arrow', function() {
// eslint-disable-next-line no-eval
expect(annotate(eval('a => b => b'))).toEqual(['a']);
Expand Down
20 changes: 20 additions & 0 deletions test/helpers/support.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
'use strict';

var supportTests = {
classes: '/^class\\b/.test((class C {}).toString())',
fatArrows: 'a => a',
shorthandMethods: '({ fn(x) { return; } })'
};

var support = {};

for (var prop in supportTests) {
if (supportTests.hasOwnProperty(prop)) {
try {
// eslint-disable-next-line no-eval
support[prop] = !!eval(supportTests[prop]);
} catch (e) {
support[prop] = false;
}
}
}
97 changes: 97 additions & 0 deletions test/helpers/supportSpec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
'use strict';

describe('support test results', function() {
var expected, version, testName;
var userAgent = window.navigator.userAgent;

// Support: iOS 8 only
if (/iPhone OS 10_1\d(?:_\d+)? /.test(userAgent)) {
// iOS 8 official simulators have broken user agent (containing something like `iPhone OS 10_12_5`,
// i.e. the macOS version in place of the iOS version) so they'd fall into an incorrect bucket.
// Fix the user agent there.
// NOTE: Make sure the above check doesn't catch the real iOS 10!
userAgent = userAgent.replace(/iPhone OS 10(?:_\d+)+/, 'iPhone OS 8_1');
}

if (/edge\//i.test(userAgent)) {
expected = {
classes: true,
fatArrows: true,
shorthandMethods: true
};
} else if (/msie|trident/i.test(userAgent)) {
expected = {
classes: false,
fatArrows: false,
shorthandMethods: false
};
} else if (/iphone os [78]_/i.test(userAgent)) {
expected = {
classes: false,
fatArrows: false,
shorthandMethods: false
};
} else if (/iphone os 9_/i.test(userAgent)) {
expected = {
classes: true,
fatArrows: false,
shorthandMethods: true
};
} else if (/iphone os/i.test(userAgent)) {
expected = {
classes: true,
fatArrows: true,
shorthandMethods: true
};
} else if (/android 4\.[0-3]/i.test(userAgent)) {
expected = {
classes: false,
fatArrows: false,
shorthandMethods: false
};
} else if (/chrome/i.test(userAgent)) {
// Catches Chrome on Android as well (i.e. the default
// Android browser on Android >= 4.4).
expected = {
classes: true,
fatArrows: true,
shorthandMethods: true
};
} else if (/firefox/i.test(userAgent)) {
version = parseInt(userAgent.match(/firefox\/(\d+)/i)[1], 10);
expected = {
classes: version >= 55,
fatArrows: true,
shorthandMethods: true
};
} else if (/\b8(?:\.\d+)+ safari/i.test(userAgent)) {
expected = {
classes: false,
fatArrows: false,
shorthandMethods: false
};
} else if (/\b9(?:\.\d+)+ safari/i.test(userAgent)) {
expected = {
classes: true,
fatArrows: false,
shorthandMethods: true
};
} else if (/\b\d+(?:\.\d+)+ safari/i.test(userAgent)) {
expected = {
classes: true,
fatArrows: true,
shorthandMethods: true
};
}

it('should have expected values specified', function() {
expect(expected).not.toBe(null);
expect(typeof expected).toBe('object');
});

for (testName in expected) {
it('should report support.' + testName + ' to be ' + expected[testName], function() {
expect(support[testName]).toBe(expected[testName]);
});
}
});
20 changes: 0 additions & 20 deletions test/helpers/testabilityPatch.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,26 +3,6 @@

if (window.bindJQuery) bindJQuery();

var supportTests = {
classes: '/^class\\b/.test((class C {}).toString())',
fatArrow: 'a => a',
ES6Function: '({ fn(x) { return; } })'
};

var support = {};

for (var prop in supportTests) {
if (supportTests.hasOwnProperty(prop)) {
try {
// eslint-disable-next-line no-eval
support[prop] = !!eval(supportTests[prop]);
} catch (e) {
support[prop] = false;
}
}
}


beforeEach(function() {

// all this stuff is not needed for module tests, where jqlite and publishExternalAPI and jqLite are not global vars
Expand Down

0 comments on commit f63bc3c

Please sign in to comment.