Changeset 19:ab5f65372038 in pyenvjasmine for pyenvjasmine/envjasmine/lib/jasmine-jquery/jasmine-jquery.js
Legend:
- Unmodified
- Added
- Removed
-
pyenvjasmine/envjasmine/lib/jasmine-jquery/jasmine-jquery.js
r0 r19 1 1 var readFixtures = function() { 2 return jasmine.getFixtures().proxyCallTo_('read', arguments) ;3 } ;2 return jasmine.getFixtures().proxyCallTo_('read', arguments) 3 } 4 4 5 5 var preloadFixtures = function() { 6 jasmine.getFixtures().proxyCallTo_('preload', arguments) ;7 } ;6 jasmine.getFixtures().proxyCallTo_('preload', arguments) 7 } 8 8 9 9 var loadFixtures = function() { 10 jasmine.getFixtures().proxyCallTo_('load', arguments); 11 }; 10 jasmine.getFixtures().proxyCallTo_('load', arguments) 11 } 12 13 var appendLoadFixtures = function() { 14 jasmine.getFixtures().proxyCallTo_('appendLoad', arguments) 15 } 12 16 13 17 var setFixtures = function(html) { 14 jasmine.getFixtures().set(html); 15 }; 18 jasmine.getFixtures().proxyCallTo_('set', arguments) 19 } 20 21 var appendSetFixtures = function() { 22 jasmine.getFixtures().proxyCallTo_('appendSet', arguments) 23 } 16 24 17 25 var sandbox = function(attributes) { 18 return jasmine.getFixtures().sandbox(attributes) ;19 } ;26 return jasmine.getFixtures().sandbox(attributes) 27 } 20 28 21 29 var spyOnEvent = function(selector, eventName) { 22 jasmine.JQuery.events.spyOn(selector, eventName); 30 return jasmine.JQuery.events.spyOn(selector, eventName) 31 } 32 33 var preloadStyleFixtures = function() { 34 jasmine.getStyleFixtures().proxyCallTo_('preload', arguments) 35 } 36 37 var loadStyleFixtures = function() { 38 jasmine.getStyleFixtures().proxyCallTo_('load', arguments) 39 } 40 41 var appendLoadStyleFixtures = function() { 42 jasmine.getStyleFixtures().proxyCallTo_('appendLoad', arguments) 43 } 44 45 var setStyleFixtures = function(html) { 46 jasmine.getStyleFixtures().proxyCallTo_('set', arguments) 47 } 48 49 var appendSetStyleFixtures = function(html) { 50 jasmine.getStyleFixtures().proxyCallTo_('appendSet', arguments) 51 } 52 53 var loadJSONFixtures = function() { 54 return jasmine.getJSONFixtures().proxyCallTo_('load', arguments) 55 } 56 57 var getJSONFixture = function(url) { 58 return jasmine.getJSONFixtures().proxyCallTo_('read', arguments)[url] 59 } 60 61 jasmine.spiedEventsKey = function (selector, eventName) { 62 return [$(selector).selector, eventName].toString() 23 63 } 24 64 25 65 jasmine.getFixtures = function() { 26 return jasmine.currentFixtures_ = jasmine.currentFixtures_ || new jasmine.Fixtures(); 27 }; 66 return jasmine.currentFixtures_ = jasmine.currentFixtures_ || new jasmine.Fixtures() 67 } 68 69 jasmine.getStyleFixtures = function() { 70 return jasmine.currentStyleFixtures_ = jasmine.currentStyleFixtures_ || new jasmine.StyleFixtures() 71 } 28 72 29 73 jasmine.Fixtures = function() { 30 this.containerId = 'jasmine-fixtures' ;31 this.fixturesCache_ = {} ;32 this.fixturesPath = 'spec/javascripts/fixtures' ;33 } ;74 this.containerId = 'jasmine-fixtures' 75 this.fixturesCache_ = {} 76 this.fixturesPath = 'spec/javascripts/fixtures' 77 } 34 78 35 79 jasmine.Fixtures.prototype.set = function(html) { 36 this.cleanUp(); 37 this.createContainer_(html); 38 }; 80 this.cleanUp() 81 this.createContainer_(html) 82 } 83 84 jasmine.Fixtures.prototype.appendSet= function(html) { 85 this.addToContainer_(html) 86 } 39 87 40 88 jasmine.Fixtures.prototype.preload = function() { 41 this.read.apply(this, arguments) ;42 } ;89 this.read.apply(this, arguments) 90 } 43 91 44 92 jasmine.Fixtures.prototype.load = function() { 45 this.cleanUp(); 46 this.createContainer_(this.read.apply(this, arguments)); 47 }; 93 this.cleanUp() 94 this.createContainer_(this.read.apply(this, arguments)) 95 } 96 97 jasmine.Fixtures.prototype.appendLoad = function() { 98 this.addToContainer_(this.read.apply(this, arguments)) 99 } 48 100 49 101 jasmine.Fixtures.prototype.read = function() { 50 var htmlChunks = [] ;51 52 var fixtureUrls = arguments ;102 var htmlChunks = [] 103 104 var fixtureUrls = arguments 53 105 for(var urlCount = fixtureUrls.length, urlIndex = 0; urlIndex < urlCount; urlIndex++) { 54 htmlChunks.push(this.getFixtureHtml_(fixtureUrls[urlIndex])) ;55 } 56 57 return htmlChunks.join('') ;58 } ;106 htmlChunks.push(this.getFixtureHtml_(fixtureUrls[urlIndex])) 107 } 108 109 return htmlChunks.join('') 110 } 59 111 60 112 jasmine.Fixtures.prototype.clearCache = function() { 61 this.fixturesCache_ = {} ;62 } ;113 this.fixturesCache_ = {} 114 } 63 115 64 116 jasmine.Fixtures.prototype.cleanUp = function() { 65 jQuery('#' + this.containerId).remove();66 } ;117 $('#' + this.containerId).remove() 118 } 67 119 68 120 jasmine.Fixtures.prototype.sandbox = function(attributes) { 69 var attributesToSet = attributes || {} ;70 return jQuery('<div id="sandbox" />').attr(attributesToSet);71 } ;121 var attributesToSet = attributes || {} 122 return $('<div id="sandbox" />').attr(attributesToSet) 123 } 72 124 73 125 jasmine.Fixtures.prototype.createContainer_ = function(html) { 74 var container ;75 if(html instanceof jQuery) {76 container = jQuery('<div id="' + this.containerId + '" />');77 container.html(html) ;126 var container 127 if(html instanceof $) { 128 container = $('<div id="' + this.containerId + '" />') 129 container.html(html) 78 130 } else { 79 131 container = '<div id="' + this.containerId + '">' + html + '</div>' 80 132 } 81 jQuery('body').append(container); 82 }; 83 84 jasmine.Fixtures.prototype.getFixtureHtml_ = function(url) { 85 if (typeof this.fixturesCache_[url] == 'undefined') { 86 this.loadFixtureIntoCache_(url); 87 } 88 return this.fixturesCache_[url]; 89 }; 133 $(document.body).append(container) 134 } 135 136 jasmine.Fixtures.prototype.addToContainer_ = function(html){ 137 var container = $(document.body).find('#'+this.containerId).append(html) 138 if(!container.length){ 139 this.createContainer_(html) 140 } 141 } 142 143 jasmine.Fixtures.prototype.getFixtureHtml_ = function(url) { 144 if (typeof this.fixturesCache_[url] === 'undefined') { 145 this.loadFixtureIntoCache_(url) 146 } 147 return this.fixturesCache_[url] 148 } 90 149 91 150 jasmine.Fixtures.prototype.loadFixtureIntoCache_ = function(relativeUrl) { 92 var self = this; 93 var url = this.fixturesPath.match('/$') ? this.fixturesPath + relativeUrl : this.fixturesPath + '/' + relativeUrl; 94 jQuery.ajax({ 151 var url = this.makeFixtureUrl_(relativeUrl) 152 var request = $.ajax({ 153 type: "GET", 154 url: url + "?" + new Date().getTime(), 155 async: false 156 }) 157 this.fixturesCache_[relativeUrl] = request.responseText 158 } 159 160 jasmine.Fixtures.prototype.makeFixtureUrl_ = function(relativeUrl){ 161 return this.fixturesPath.match('/$') ? this.fixturesPath + relativeUrl : this.fixturesPath + '/' + relativeUrl 162 } 163 164 jasmine.Fixtures.prototype.proxyCallTo_ = function(methodName, passedArguments) { 165 return this[methodName].apply(this, passedArguments) 166 } 167 168 169 jasmine.StyleFixtures = function() { 170 this.fixturesCache_ = {} 171 this.fixturesNodes_ = [] 172 this.fixturesPath = 'spec/javascripts/fixtures' 173 } 174 175 jasmine.StyleFixtures.prototype.set = function(css) { 176 this.cleanUp() 177 this.createStyle_(css) 178 } 179 180 jasmine.StyleFixtures.prototype.appendSet = function(css) { 181 this.createStyle_(css) 182 } 183 184 jasmine.StyleFixtures.prototype.preload = function() { 185 this.read_.apply(this, arguments) 186 } 187 188 jasmine.StyleFixtures.prototype.load = function() { 189 this.cleanUp() 190 this.createStyle_(this.read_.apply(this, arguments)) 191 } 192 193 jasmine.StyleFixtures.prototype.appendLoad = function() { 194 this.createStyle_(this.read_.apply(this, arguments)) 195 } 196 197 jasmine.StyleFixtures.prototype.cleanUp = function() { 198 while(this.fixturesNodes_.length) { 199 this.fixturesNodes_.pop().remove() 200 } 201 } 202 203 jasmine.StyleFixtures.prototype.createStyle_ = function(html) { 204 var styleText = $('<div></div>').html(html).text(), 205 style = $('<style>' + styleText + '</style>') 206 207 this.fixturesNodes_.push(style) 208 209 $('head').append(style) 210 } 211 212 jasmine.StyleFixtures.prototype.clearCache = jasmine.Fixtures.prototype.clearCache 213 214 jasmine.StyleFixtures.prototype.read_ = jasmine.Fixtures.prototype.read 215 216 jasmine.StyleFixtures.prototype.getFixtureHtml_ = jasmine.Fixtures.prototype.getFixtureHtml_ 217 218 jasmine.StyleFixtures.prototype.loadFixtureIntoCache_ = jasmine.Fixtures.prototype.loadFixtureIntoCache_ 219 220 jasmine.StyleFixtures.prototype.makeFixtureUrl_ = jasmine.Fixtures.prototype.makeFixtureUrl_ 221 222 jasmine.StyleFixtures.prototype.proxyCallTo_ = jasmine.Fixtures.prototype.proxyCallTo_ 223 224 jasmine.getJSONFixtures = function() { 225 return jasmine.currentJSONFixtures_ = jasmine.currentJSONFixtures_ || new jasmine.JSONFixtures() 226 } 227 228 jasmine.JSONFixtures = function() { 229 this.fixturesCache_ = {} 230 this.fixturesPath = 'spec/javascripts/fixtures/json' 231 } 232 233 jasmine.JSONFixtures.prototype.load = function() { 234 this.read.apply(this, arguments) 235 return this.fixturesCache_ 236 } 237 238 jasmine.JSONFixtures.prototype.read = function() { 239 var fixtureUrls = arguments 240 for(var urlCount = fixtureUrls.length, urlIndex = 0; urlIndex < urlCount; urlIndex++) { 241 this.getFixtureData_(fixtureUrls[urlIndex]) 242 } 243 return this.fixturesCache_ 244 } 245 246 jasmine.JSONFixtures.prototype.clearCache = function() { 247 this.fixturesCache_ = {} 248 } 249 250 jasmine.JSONFixtures.prototype.getFixtureData_ = function(url) { 251 this.loadFixtureIntoCache_(url) 252 return this.fixturesCache_[url] 253 } 254 255 jasmine.JSONFixtures.prototype.loadFixtureIntoCache_ = function(relativeUrl) { 256 var self = this 257 var url = this.fixturesPath.match('/$') ? this.fixturesPath + relativeUrl : this.fixturesPath + '/' + relativeUrl 258 $.ajax({ 95 259 async: false, // must be synchronous to guarantee that no tests are run before fixture is loaded 96 260 cache: false, 97 dataType: ' html',261 dataType: 'json', 98 262 url: url, 99 263 success: function(data) { 100 self.fixturesCache_[relativeUrl] = data; 101 }, 102 error: function(jqXHR, status, errorThrown) { 103 throw Error('Fixture could not be loaded: ' + url + ' (status: ' + status + ', message: ' + errorThrown.message + ')'); 104 } 105 }); 106 }; 107 108 jasmine.Fixtures.prototype.proxyCallTo_ = function(methodName, passedArguments) { 109 return this[methodName].apply(this, passedArguments); 110 }; 111 112 113 jasmine.JQuery = function() {}; 264 self.fixturesCache_[relativeUrl] = data 265 }, 266 fail: function(jqXHR, status, errorThrown) { 267 throw Error('JSONFixture could not be loaded: ' + url + ' (status: ' + status + ', message: ' + errorThrown.message + ')') 268 } 269 }) 270 } 271 272 jasmine.JSONFixtures.prototype.proxyCallTo_ = function(methodName, passedArguments) { 273 return this[methodName].apply(this, passedArguments) 274 } 275 276 jasmine.JQuery = function() {} 114 277 115 278 jasmine.JQuery.browserTagCaseIndependentHtml = function(html) { 116 return jQuery('<div/>').append(html).html();117 } ;279 return $('<div/>').append(html).html() 280 } 118 281 119 282 jasmine.JQuery.elementToString = function(element) { 120 return jQuery('<div />').append(element.clone()).html(); 121 }; 122 123 jasmine.JQuery.matchersClass = {}; 124 125 (function(namespace) { 283 var domEl = $(element).get(0) 284 if (domEl == undefined || domEl.cloneNode) 285 return $('<div />').append($(element).clone()).html() 286 else 287 return element.toString() 288 } 289 290 jasmine.JQuery.matchersClass = {} 291 292 !function(namespace) { 126 293 var data = { 127 294 spiedEvents: {}, 128 295 handlers: [] 129 } ;296 } 130 297 131 298 namespace.events = { 132 299 spyOn: function(selector, eventName) { 133 300 var handler = function(e) { 134 data.spiedEvents[[selector, eventName]] = e; 135 }; 136 jQuery(selector).bind(eventName, handler); 137 data.handlers.push(handler); 301 data.spiedEvents[jasmine.spiedEventsKey(selector, eventName)] = e 302 } 303 $(selector).bind(eventName, handler) 304 data.handlers.push(handler) 305 return { 306 selector: selector, 307 eventName: eventName, 308 handler: handler, 309 reset: function(){ 310 delete data.spiedEvents[jasmine.spiedEventsKey(selector, eventName)] 311 } 312 } 138 313 }, 139 314 140 315 wasTriggered: function(selector, eventName) { 141 return !!(data.spiedEvents[[selector, eventName]]); 316 return !!(data.spiedEvents[jasmine.spiedEventsKey(selector, eventName)]) 317 }, 318 319 wasPrevented: function(selector, eventName) { 320 var e; 321 return (e = data.spiedEvents[jasmine.spiedEventsKey(selector, eventName)]) && e.isDefaultPrevented() 142 322 }, 143 323 144 324 cleanUp: function() { 145 data.spiedEvents = {} ;146 data.handlers = [] ;147 } 148 } 149 } )(jasmine.JQuery);150 151 (function(){325 data.spiedEvents = {} 326 data.handlers = [] 327 } 328 } 329 }(jasmine.JQuery) 330 331 !function(){ 152 332 var jQueryMatchers = { 153 333 toHaveClass: function(className) { 154 return this.actual.hasClass(className); 334 return this.actual.hasClass(className) 335 }, 336 337 toHaveCss: function(css){ 338 for (var prop in css){ 339 if (this.actual.css(prop) !== css[prop]) return false 340 } 341 return true 155 342 }, 156 343 157 344 toBeVisible: function() { 158 return this.actual.is(':visible') ;345 return this.actual.is(':visible') 159 346 }, 160 347 161 348 toBeHidden: function() { 162 return this.actual.is(':hidden') ;349 return this.actual.is(':hidden') 163 350 }, 164 351 165 352 toBeSelected: function() { 166 return this.actual.is(':selected') ;353 return this.actual.is(':selected') 167 354 }, 168 355 169 356 toBeChecked: function() { 170 return this.actual.is(':checked') ;357 return this.actual.is(':checked') 171 358 }, 172 359 173 360 toBeEmpty: function() { 174 return this.actual.is(':empty') ;361 return this.actual.is(':empty') 175 362 }, 176 363 177 364 toExist: function() { 178 return this.actual.size() > 0; 365 return $(document).find(this.actual).length 366 }, 367 368 toHaveLength: function(length) { 369 return this.actual.length === length 179 370 }, 180 371 181 372 toHaveAttr: function(attributeName, expectedAttributeValue) { 182 return hasProperty(this.actual.attr(attributeName), expectedAttributeValue); 373 return hasProperty(this.actual.attr(attributeName), expectedAttributeValue) 374 }, 375 376 toHaveProp: function(propertyName, expectedPropertyValue) { 377 return hasProperty(this.actual.prop(propertyName), expectedPropertyValue) 183 378 }, 184 379 185 380 toHaveId: function(id) { 186 return this.actual.attr('id') == id ;381 return this.actual.attr('id') == id 187 382 }, 188 383 189 384 toHaveHtml: function(html) { 190 return this.actual.html() == jasmine.JQuery.browserTagCaseIndependentHtml(html); 385 return this.actual.html() == jasmine.JQuery.browserTagCaseIndependentHtml(html) 386 }, 387 388 toContainHtml: function(html){ 389 var actualHtml = this.actual.html() 390 var expectedHtml = jasmine.JQuery.browserTagCaseIndependentHtml(html) 391 return (actualHtml.indexOf(expectedHtml) >= 0) 191 392 }, 192 393 193 394 toHaveText: function(text) { 194 if (text && jQuery.isFunction(text.test)) { 195 return text.test(this.actual.text()); 395 var trimmedText = $.trim(this.actual.text()) 396 if (text && $.isFunction(text.test)) { 397 return text.test(trimmedText) 196 398 } else { 197 return t his.actual.text() == text;399 return trimmedText == text 198 400 } 199 401 }, 200 402 201 403 toHaveValue: function(value) { 202 return this.actual.val() == value;404 return this.actual.val() === value 203 405 }, 204 406 205 407 toHaveData: function(key, expectedValue) { 206 return hasProperty(this.actual.data(key), expectedValue) ;408 return hasProperty(this.actual.data(key), expectedValue) 207 409 }, 208 410 209 411 toBe: function(selector) { 210 return this.actual.is(selector) ;412 return this.actual.is(selector) 211 413 }, 212 414 213 415 toContain: function(selector) { 214 return this.actual.find(selector). size() > 0;416 return this.actual.find(selector).length 215 417 }, 216 418 217 419 toBeDisabled: function(selector){ 218 return this.actual.is(':disabled'); 219 }, 220 221 // tests the existence of a specific event binding 222 toHandle: function(eventName) { 223 var events = this.actual.data("events"); 224 return events && events[eventName].length > 0; 225 }, 226 420 return this.actual.is(':disabled') 421 }, 422 423 toBeFocused: function(selector) { 424 return this.actual[0] === this.actual[0].ownerDocument.activeElement 425 }, 426 427 toHandle: function(event) { 428 429 var events = $._data(this.actual.get(0), "events") 430 431 if(!events || !event || typeof event !== "string") { 432 return false 433 } 434 435 var namespaces = event.split(".") 436 var eventType = namespaces.shift() 437 var sortedNamespaces = namespaces.slice(0).sort() 438 var namespaceRegExp = new RegExp("(^|\\.)" + sortedNamespaces.join("\\.(?:.*\\.)?") + "(\\.|$)") 439 440 if(events[eventType] && namespaces.length) { 441 for(var i = 0; i < events[eventType].length; i++) { 442 var namespace = events[eventType][i].namespace 443 if(namespaceRegExp.test(namespace)) { 444 return true 445 } 446 } 447 } else { 448 return events[eventType] && events[eventType].length > 0 449 } 450 }, 451 227 452 // tests the existence of a specific event binding + handler 228 453 toHandleWith: function(eventName, eventHandler) { 229 var stack = this.actual.data("events")[eventName]; 230 var i; 231 for (i = 0; i < stack.length; i++) { 232 if (stack[i].handler == eventHandler) { 233 return true; 234 } 235 } 236 return false; 237 } 238 }; 454 var stack = $._data(this.actual.get(0), "events")[eventName] 455 for (var i = 0; i < stack.length; i++) { 456 if (stack[i].handler == eventHandler) return true 457 } 458 return false 459 } 460 } 239 461 240 462 var hasProperty = function(actualValue, expectedValue) { 241 if (expectedValue === undefined) { 242 return actualValue !== undefined; 243 } 244 return actualValue == expectedValue; 245 }; 463 if (expectedValue === undefined) return actualValue !== undefined 464 return actualValue == expectedValue 465 } 246 466 247 467 var bindMatcher = function(methodName) { 248 var builtInMatcher = jasmine.Matchers.prototype[methodName] ;468 var builtInMatcher = jasmine.Matchers.prototype[methodName] 249 469 250 470 jasmine.JQuery.matchersClass[methodName] = function() { 251 if (this.actual instanceof jQuery) { 252 var result = jQueryMatchers[methodName].apply(this, arguments); 253 this.actual = jasmine.JQuery.elementToString(this.actual); 254 return result; 255 } 256 257 if (builtInMatcher) { 258 return builtInMatcher.apply(this, arguments); 259 } 260 261 return false; 262 }; 263 }; 471 if (this.actual 472 && (this.actual instanceof $ 473 || jasmine.isDomNode(this.actual))) { 474 this.actual = $(this.actual) 475 var result = jQueryMatchers[methodName].apply(this, arguments) 476 var element 477 if (this.actual.get && (element = this.actual.get()[0]) && !$.isWindow(element) && element.tagName !== "HTML") 478 this.actual = jasmine.JQuery.elementToString(this.actual) 479 return result 480 } 481 482 if (builtInMatcher) { 483 return builtInMatcher.apply(this, arguments) 484 } 485 486 return false 487 } 488 } 264 489 265 490 for(var methodName in jQueryMatchers) { 266 bindMatcher(methodName) ;267 } 268 } )();491 bindMatcher(methodName) 492 } 493 }() 269 494 270 495 beforeEach(function() { 271 this.addMatchers(jasmine.JQuery.matchersClass) ;496 this.addMatchers(jasmine.JQuery.matchersClass) 272 497 this.addMatchers({ 273 498 toHaveBeenTriggeredOn: function(selector) { 274 499 this.message = function() { 275 500 return [ 276 "Expected event " + this.actual + " to have been triggered on " + selector,277 "Expected event " + this.actual + " not to have been triggered on " + selector278 ] ;279 } ;280 return jasmine.JQuery.events.wasTriggered(selector, this.actual) ;501 "Expected event " + this.actual + " to have been triggered on " + selector, 502 "Expected event " + this.actual + " not to have been triggered on " + selector 503 ] 504 } 505 return jasmine.JQuery.events.wasTriggered(selector, this.actual) 281 506 } 282 507 }) 283 }); 508 this.addMatchers({ 509 toHaveBeenTriggered: function(){ 510 var eventName = this.actual.eventName, 511 selector = this.actual.selector 512 this.message = function() { 513 return [ 514 "Expected event " + eventName + " to have been triggered on " + selector, 515 "Expected event " + eventName + " not to have been triggered on " + selector 516 ] 517 } 518 return jasmine.JQuery.events.wasTriggered(selector, eventName) 519 } 520 }) 521 this.addMatchers({ 522 toHaveBeenPreventedOn: function(selector) { 523 this.message = function() { 524 return [ 525 "Expected event " + this.actual + " to have been prevented on " + selector, 526 "Expected event " + this.actual + " not to have been prevented on " + selector 527 ] 528 } 529 return jasmine.JQuery.events.wasPrevented(selector, this.actual) 530 } 531 }) 532 this.addMatchers({ 533 toHaveBeenPrevented: function() { 534 var eventName = this.actual.eventName, 535 selector = this.actual.selector 536 this.message = function() { 537 return [ 538 "Expected event " + eventName + " to have been prevented on " + selector, 539 "Expected event " + eventName + " not to have been prevented on " + selector 540 ] 541 } 542 return jasmine.JQuery.events.wasPrevented(selector, eventName) 543 } 544 }) 545 }) 284 546 285 547 afterEach(function() { 286 jasmine.getFixtures().cleanUp(); 287 jasmine.JQuery.events.cleanUp(); 288 }); 548 jasmine.getFixtures().cleanUp() 549 jasmine.getStyleFixtures().cleanUp() 550 jasmine.JQuery.events.cleanUp() 551 })
Note:
See TracChangeset
for help on using the changeset viewer.