diff options
Diffstat (limited to 'vnfmarket/common/thirdparty/angular-material/angular-material-mocks.js')
-rw-r--r-- | vnfmarket/common/thirdparty/angular-material/angular-material-mocks.js | 186 |
1 files changed, 186 insertions, 0 deletions
diff --git a/vnfmarket/common/thirdparty/angular-material/angular-material-mocks.js b/vnfmarket/common/thirdparty/angular-material/angular-material-mocks.js new file mode 100644 index 00000000..d3d544b7 --- /dev/null +++ b/vnfmarket/common/thirdparty/angular-material/angular-material-mocks.js @@ -0,0 +1,186 @@ +/** + * + * Angular-Material-Mocks + * + * Developers interested in running their own custom unit tests WITH angular-material.js loaded... + * must also include this *mocks* file. Similar to `angular-mocks.js`, `angular-material-mocks.js` + * will override and disable specific Angular Material performance settings: + * + * - Disabled Theme CSS rule generations + * - Forces $mdAria.expectWithText() to be synchronous + * - Mocks $$rAF.throttle() + * - Captures flush exceptions from $$rAF + * + */ +(function(window, angular, undefined) { + +'use strict'; + + // Allow our code to know when they are running inside of a test so they can expose extra services + // that should NOT be exposed to the public but that should be tested. + // + // As an example, see input.js which exposes some animation-related methods. + window._mdMocksIncluded = true; + +/** + * @ngdoc module + * @name ngMaterial-mock + * @packageName angular-material-mocks + * + * @description + * + * The `ngMaterial-mock` module provides support + * + */ +angular.module('ngMaterial-mock', [ + 'ngMock', + 'ngAnimateMock', + 'material.core' + ]) + .config(['$provide', function($provide) { + + $provide.factory('$material', ['$animate', '$timeout', function($animate, $timeout) { + return { + flushOutstandingAnimations: function() { + // this code is placed in a try-catch statement + // since 1.3 and 1.4 handle their animations differently + // and there may be situations where follow-up animations + // are run in one version and not the other + try { $animate.flush(); } catch(e) {} + }, + flushInterimElement: function() { + this.flushOutstandingAnimations(); + $timeout.flush(); + this.flushOutstandingAnimations(); + $timeout.flush(); + this.flushOutstandingAnimations(); + $timeout.flush(); + } + }; + }]); + + /** + * Angular Material dynamically generates Style tags + * based on themes and palletes; for each ng-app. + * + * For testing, we want to disable generation and + * <style> DOM injections. So we clear the huge THEME + * styles while testing... + */ + $provide.constant('$MD_THEME_CSS', '/**/'); + + /** + * Add throttle() and wrap .flush() to catch `no callbacks present` + * errors + */ + $provide.decorator('$$rAF', function throttleInjector($delegate){ + + $delegate.throttle = function(cb) { + return function() { + cb.apply(this, arguments); + }; + }; + + var ngFlush = $delegate.flush; + $delegate.flush = function() { + try { ngFlush(); } + catch(e) { ; } + }; + + return $delegate; + }); + + /** + * Capture $timeout.flush() errors: "No deferred tasks to be flushed" + * errors + */ + $provide.decorator('$timeout', function throttleInjector($delegate){ + + var ngFlush = $delegate.flush; + $delegate.flush = function() { + var args = Array.prototype.slice.call(arguments); + try { ngFlush.apply($delegate, args); } + catch(e) { } + }; + + return $delegate; + }); + + }]); + + /** + * Stylesheet Mocks used by `animateCss.spec.js` + */ + window.createMockStyleSheet = function createMockStyleSheet(doc, wind) { + doc = doc ? doc[0] : window.document; + wind = wind || window; + + var node = doc.createElement('style'); + var head = doc.getElementsByTagName('head')[0]; + head.appendChild(node); + + var ss = doc.styleSheets[doc.styleSheets.length - 1]; + + return { + addRule: function(selector, styles) { + styles = addVendorPrefix(styles); + + try { + ss.insertRule(selector + '{ ' + styles + '}', 0); + } + catch (e) { + try { + ss.addRule(selector, styles); + } + catch (e2) {} + } + }, + + destroy: function() { + head.removeChild(node); + } + }; + + /** + * Decompose styles, attached specific vendor prefixes + * and recompose... + * e.g. + * 'transition:0.5s linear all; font-size:100px;' + * becomes + * '-webkit-transition:0.5s linear all; transition:0.5s linear all; font-size:100px;' + */ + function addVendorPrefix(styles) { + var cache = { }; + + // Decompose into cache registry + styles + .match(/([\-A-Za-z]*)\w\:\w*([A-Za-z0-9\.\-\s]*)/gi) + .forEach(function(style){ + var pair = style.split(":"); + var key = pair[0]; + + switch(key) { + case 'transition': + case 'transform': + case 'animation': + case 'transition-duration': + case 'animation-duration': + cache[key] = cache['-webkit-' + key] = pair[1]; + break; + default: + cache[key] = pair[1]; + } + }); + + // Recompose full style object (as string) + styles = ""; + angular.forEach(cache, function(value, key) { + styles = styles + key + ":" + value + "; "; + }); + + return styles; + } + + }; + +})(window, window.angular); |