jQuery = require('jquery'); jasmine.JQuery = function() {}; jasmine.JQuery.browserTagCaseIndependentHtml = function(html) { return jQuery('
').append(html).html(); }; jasmine.JQuery.elementToString = function(element) { return jQuery('').append(element.clone()).html(); }; jasmine.JQuery.matchersClass = {}; (function(namespace) { var data = { spiedEvents: {}, handlers: [] }; namespace.events = { spyOn: function(selector, eventName) { var handler = function(e) { data.spiedEvents[[selector, eventName]] = e; }; jQuery(selector).bind(eventName, handler); data.handlers.push(handler); }, wasTriggered: function(selector, eventName) { return !!(data.spiedEvents[[selector, eventName]]); }, cleanUp: function() { data.spiedEvents = {}; data.handlers = []; } } })(jasmine.JQuery); (function(){ var jQueryMatchers = { toHaveClass: function(className) { return this.actual.hasClass(className); }, toBeVisible: function() { return this.actual.is(':visible'); }, toBeHidden: function() { return this.actual.is(':hidden'); }, toBeSelected: function() { return this.actual.is(':selected'); }, toBeChecked: function() { return this.actual.is(':checked'); }, toBeEmpty: function() { return this.actual.is(':empty'); }, toExist: function() { return this.actual.size() > 0; }, toHaveAttr: function(attributeName, expectedAttributeValue) { return hasProperty(this.actual.attr(attributeName), expectedAttributeValue); }, toHaveId: function(id) { return this.actual.attr('id') == id; }, toHaveHtml: function(html) { return this.actual.html() == jasmine.JQuery.browserTagCaseIndependentHtml(html); }, toHaveText: function(text) { if (text && jQuery.isFunction(text.test)) { return text.test(this.actual.text()); } else { return this.actual.text() == text; } }, toHaveValue: function(value) { return this.actual.val() == value; }, toHaveData: function(key, expectedValue) { return hasProperty(this.actual.data(key), expectedValue); }, toMatchSelector: function(selector) { return this.actual.is(selector); }, toContain: function(selector) { return this.actual.find(selector).size() > 0; }, toBeDisabled: function(selector){ return this.actual.is(':disabled'); }, // tests the existence of a specific event binding toHandle: function(eventName) { var events = this.actual.data("events"); return events && events[eventName].length > 0; }, // tests the existence of a specific event binding + handler toHandleWith: function(eventName, eventHandler) { var stack = this.actual.data("events")[eventName]; var i; for (i = 0; i < stack.length; i++) { if (stack[i].handler == eventHandler) { return true; } } return false; } }; var hasProperty = function(actualValue, expectedValue) { if (expectedValue === undefined) { return actualValue !== undefined; } return actualValue == expectedValue; }; var bindMatcher = function(methodName) { var builtInMatcher = jasmine.Matchers.prototype[methodName]; jasmine.JQuery.matchersClass[methodName] = function() { if (this.actual instanceof jQuery) { var result = jQueryMatchers[methodName].apply(this, arguments); this.actual = jasmine.JQuery.elementToString(this.actual); return result; } if (builtInMatcher) { return builtInMatcher.apply(this, arguments); } return false; }; }; for(var methodName in jQueryMatchers) { bindMatcher(methodName); } })(); beforeEach(function() { this.addMatchers(jasmine.JQuery.matchersClass); this.addMatchers({ toHaveBeenTriggeredOn: function(selector) { this.message = function() { return [ "Expected event " + this.actual + " to have been triggered on" + selector, "Expected event " + this.actual + " not to have been triggered on" + selector ]; }; return jasmine.JQuery.events.wasTriggered(selector, this.actual); } }) }); afterEach(function() { jasmine.JQuery.events.cleanUp(); });