169 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			169 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| "use strict";
 | |
| 
 | |
| if (typeof window === "undefined") {
 | |
|     window = {};
 | |
| }
 | |
| 
 | |
| var logMethods = [
 | |
|     "trace",
 | |
|     "debug",
 | |
|     "info",
 | |
|     "warn",
 | |
|     "error"
 | |
| ];
 | |
| 
 | |
| define(function () {
 | |
|     function getStorageKey(loggerName) {
 | |
|         var key = "loglevel";
 | |
|         if (loggerName) {
 | |
|             key += ":" + loggerName;
 | |
|         }
 | |
|         return key;
 | |
|     }
 | |
| 
 | |
|     var self = {};
 | |
| 
 | |
|     // Jasmine matcher to check the log level of a log object
 | |
|     self.toBeAtLevel = function toBeAtLevel(level) {
 | |
|         var log = this.actual;
 | |
|         var expectedWorkingCalls = log.levels.SILENT - log.levels[level.toUpperCase()];
 | |
|         var realLogMethod = window.console.log;
 | |
|         var priorCalls = realLogMethod.calls.length;
 | |
| 
 | |
|         for (var ii = 0; ii < logMethods.length; ii++) {
 | |
|             var methodName = logMethods[ii];
 | |
|             log[methodName](methodName);
 | |
|         }
 | |
| 
 | |
|         expect(realLogMethod.calls.length - priorCalls).toEqual(expectedWorkingCalls);
 | |
|         return true;
 | |
|     };
 | |
| 
 | |
|     self.isCookieStorageAvailable = function isCookieStorageAvailable() {
 | |
|         if (window && window.document && window.document.cookie) {
 | |
|             // We need to check not just that the cookie objects are available, but that they work, because
 | |
|             // if we run from file:// URLs they appear present but are non-functional
 | |
|             window.document.cookie = "test=hi;";
 | |
| 
 | |
|             var result = window.document.cookie.indexOf('test=hi') !== -1;
 | |
|             window.document.cookie = "test=; expires=Thu, 01 Jan 1970 00:00:01 GMT;";
 | |
| 
 | |
|             return result;
 | |
|         } else {
 | |
|             return false;
 | |
|         }
 | |
|     };
 | |
| 
 | |
|     self.isLocalStorageAvailable = function isLocalStorageAvailable() {
 | |
|         try {
 | |
|             return !!window.localStorage;
 | |
|         } catch (e){
 | |
|             return false;
 | |
|         }
 | |
|     };
 | |
| 
 | |
|     self.isAnyLevelStoragePossible = function isAnyLevelStoragePossible() {
 | |
|         return self.isCookieStorageAvailable() || self.isLocalStorageAvailable();
 | |
|     };
 | |
| 
 | |
|     self.toBeTheLevelStoredByCookie = function toBeTheLevelStoredByCookie(name) {
 | |
|         var level = this.actual.toUpperCase();
 | |
|         var storageKey = encodeURIComponent(getStorageKey(name));
 | |
| 
 | |
|         if (window.document.cookie.indexOf(storageKey + "=" + level) !== -1) {
 | |
|             return true;
 | |
|         } else {
 | |
|             return false;
 | |
|         }
 | |
|     };
 | |
| 
 | |
|     self.toBeTheLevelStoredByLocalStorage = function toBeTheLevelStoredByLocalStorage(name) {
 | |
|         var level = this.actual.toUpperCase();
 | |
| 
 | |
|         if (window.localStorage[getStorageKey(name)] === level) {
 | |
|             return true;
 | |
|         }
 | |
| 
 | |
|         return false;
 | |
|     };
 | |
| 
 | |
|     // Jasmine matcher to check whether a given string was saved by loglevel
 | |
|     self.toBeTheStoredLevel = function toBeTheStoredLevel(name) {
 | |
|         return self.toBeTheLevelStoredByLocalStorage.call(this, name) ||
 | |
|                self.toBeTheLevelStoredByCookie.call(this, name);
 | |
|     };
 | |
| 
 | |
|     self.setCookieStoredLevel = function setCookieStoredLevel(level, name) {
 | |
|         window.document.cookie =
 | |
|             encodeURIComponent(getStorageKey(name)) + "=" +
 | |
|             level.toUpperCase() + ";";
 | |
|     };
 | |
| 
 | |
|     self.setLocalStorageStoredLevel = function setLocalStorageStoredLevel(level, name) {
 | |
|         window.localStorage[getStorageKey(name)] = level.toUpperCase();
 | |
|     };
 | |
| 
 | |
|     self.setStoredLevel = function setStoredLevel(level, name) {
 | |
|         if (self.isCookieStorageAvailable()) {
 | |
|             self.setCookieStoredLevel(level, name);
 | |
|         }
 | |
|         if (self.isLocalStorageAvailable()) {
 | |
|             self.setLocalStorageStoredLevel(level, name);
 | |
|         }
 | |
|     };
 | |
| 
 | |
|     self.clearStoredLevels = function clearStoredLevels() {
 | |
|         if (self.isLocalStorageAvailable()) {
 | |
|             window.localStorage.clear();
 | |
|         }
 | |
|         if (self.isCookieStorageAvailable()) {
 | |
|             var storedKeys = window.document.cookie.match(/(?:^|;\s)(loglevel(\:\w+)?)(?=\=)/g);
 | |
|             if (storedKeys) {
 | |
|                 for (var i = 0; i < storedKeys.length; i++) {
 | |
|                     window.document.cookie = storedKeys[i] + "=; expires=Thu, 01 Jan 1970 00:00:01 GMT;";
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
|     };
 | |
| 
 | |
|     self.describeIf = function describeIf(condition, name, test) {
 | |
|         if (condition) {
 | |
|             jasmine.getEnv().describe(name, test);
 | |
|         }
 | |
|     };
 | |
| 
 | |
|     self.itIf = function itIf(condition, name, test) {
 | |
|         if (condition) {
 | |
|             jasmine.getEnv().it(name, test);
 | |
|         }
 | |
|     };
 | |
| 
 | |
|     // Forcibly reloads loglevel, and asynchronously hands the resulting log back to the given callback
 | |
|     // via Jasmine async magic
 | |
|     self.withFreshLog = function withFreshLog(toRun) {
 | |
|         require.undef("lib/loglevel");
 | |
| 
 | |
|         var freshLog;
 | |
| 
 | |
|         waitsFor(function() {
 | |
|             require(['lib/loglevel'], function(log) {
 | |
|                 freshLog = log;
 | |
|             });
 | |
|             return typeof freshLog !== "undefined";
 | |
|         });
 | |
| 
 | |
|         runs(function() {
 | |
|             toRun(freshLog);
 | |
|         });
 | |
|     };
 | |
| 
 | |
|     // Wraps Jasmine's it(name, test) call to reload the loglevel dependency for the given test
 | |
|     self.itWithFreshLog = function itWithFreshLog(name, test) {
 | |
|         jasmine.getEnv().it(name, function() {
 | |
|             self.withFreshLog(test);
 | |
|         });
 | |
|     };
 | |
| 
 | |
|     return self;
 | |
| });
 |