Skip to content

Commit

Permalink
Added jasmine-jquery and other dependencies
Browse files Browse the repository at this point in the history
  • Loading branch information
chrisjpowers committed Jan 26, 2011
1 parent e7e642f commit f429ead
Show file tree
Hide file tree
Showing 4 changed files with 256 additions and 3 deletions.
30 changes: 30 additions & 0 deletions spec/features.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta content="text/html;charset=UTF-8" http-equiv="Content-Type"/>
<title>Feature Specs</title>

<!-- JASMINE LIBS AND DEPENDENCIES -->
<link rel="stylesheet" href="support/jasmine.css" type="text/css" media="screen"/>
<script src="support/jasmine.js" type="text/javascript"></script>
<script src="support/jasmine-jquery.js" type="text/javascript"></script>
<script src="support/jasmine-html.js" type="text/javascript"></script>
<script src="support/json2.js" type="text/javascript"></script>
<script src="support/jasmine-init.js" type="text/javascript"></script>

<!-- JAVASCRIPT LIBRARIES (jQuery, Dojo) AND PLUGINS -->
<script src="../js/jquery.js" type="text/javascript"></script>

<!-- YOUR JAVASCRIPT FILES -->

<!-- SPEC HELPER FILES -->
<script src="helpers/SpecHelper.js" type="text/javascript"></script>

<!-- SPEC FILES -->

</head>
<body>
<div id="jasmine_content"></div>
</body>
</html>
18 changes: 18 additions & 0 deletions spec/fixtures/form.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<ul id='messages'></ul>
<form action='#' id='message_form' method='POST'>
<div class='field'>
<label for='message_name'>Your Name</label>
<input id='message_name' name='message[name]' type='text' />
</div>
<div class='field'>
<label for='message_body'>Message</label>
<textarea id='message_body' name='message[body]'></textarea>
</div>
<div class='submit'>
<button id='submit_button' type='submit'>Submit</button>
</div>
<p id='challenge'>
Build out features for this chat application using Jasmine
to Test Drive your code!
</p>
</form>
205 changes: 205 additions & 0 deletions spec/support/jasmine-jquery.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,205 @@
var readFixtures = function() {
return jasmine.getFixtures().proxyCallTo_('read', arguments);
};

var loadFixtures = function() {
jasmine.getFixtures().proxyCallTo_('load', arguments);
};

var setFixtures = function(html) {
jasmine.getFixtures().set(html);
};

var sandbox = function(attributes) {
return jasmine.getFixtures().sandbox(attributes);
};

jasmine.getFixtures = function() {
return jasmine.currentFixtures_ = jasmine.currentFixtures_ || new jasmine.Fixtures();
};

jasmine.Fixtures = function() {
this.containerId = 'jasmine-fixtures';
this.fixturesCache_ = {};
this.fixturesPath = 'spec/javascripts/fixtures';
};

jasmine.Fixtures.prototype.set = function(html) {
this.cleanUp();
this.createContainer_(html);
};

jasmine.Fixtures.prototype.load = function() {
this.cleanUp();
this.createContainer_(this.read.apply(this, arguments));
};

jasmine.Fixtures.prototype.read = function() {
var htmlChunks = [];

var fixtureUrls = arguments;
for(var urlCount = fixtureUrls.length, urlIndex = 0; urlIndex < urlCount; urlIndex++) {
htmlChunks.push(this.getFixtureHtml_(fixtureUrls[urlIndex]));
}

return htmlChunks.join('');
};

jasmine.Fixtures.prototype.clearCache = function() {
this.fixturesCache_ = {};
};

jasmine.Fixtures.prototype.cleanUp = function() {
$('#' + this.containerId).remove();
};

jasmine.Fixtures.prototype.sandbox = function(attributes) {
var attributesToSet = attributes || {};
return $('<div id="sandbox" />').attr(attributesToSet);
};

jasmine.Fixtures.prototype.createContainer_ = function(html) {
var container = $('<div id="' + this.containerId + '" />');
container.html(html);
$('body').append(container);
};

jasmine.Fixtures.prototype.getFixtureHtml_ = function(url) {
if (typeof this.fixturesCache_[url] == 'undefined') {
this.loadFixtureIntoCache_(url);
}
return this.fixturesCache_[url];
};

jasmine.Fixtures.prototype.loadFixtureIntoCache_ = function(relativeUrl) {
var self = this;
var url = this.fixturesPath.match('/$') ? this.fixturesPath + relativeUrl : this.fixturesPath + '/' + relativeUrl;
$.ajax({
async: false, // must be synchronous to guarantee that no tests are run before fixture is loaded
cache: false,
dataType: 'html',
url: url,
success: function(data) {
self.fixturesCache_[relativeUrl] = data;
}
});
};

jasmine.Fixtures.prototype.proxyCallTo_ = function(methodName, passedArguments) {
return this[methodName].apply(this, passedArguments);
};


jasmine.JQuery = function() {};

jasmine.JQuery.browserTagCaseIndependentHtml = function(html) {
return $('<div/>').append(html).html();
};

jasmine.JQuery.elementToString = function(element) {
return $('<div />').append(element.clone()).html();
};

jasmine.JQuery.matchersClass = {};


(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) {
return this.actual.text() == text;
},

toHaveValue: function(value) {
return this.actual.val() == value;
},

toHaveData: function(key, expectedValue) {
return hasProperty(this.actual.data(key), expectedValue);
},

toBe: function(selector) {
return this.actual.is(selector);
},

toContain: function(selector) {
return this.actual.find(selector).size() > 0;
}
};

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);
});

afterEach(function() {
jasmine.getFixtures().cleanUp();
});
6 changes: 3 additions & 3 deletions spec/jasmine.html → spec/unit.html
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,17 @@
<html xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta content="text/html;charset=UTF-8" http-equiv="Content-Type"/>
<title>Jasmine Suite</title>
<title>Unit Specs</title>

<!-- JASMINE LIBS AND DEPENDENCIES -->
<link rel="stylesheet" href="support/jasmine.css" type="text/css" media="screen"/>
<script src="support/jasmine.js" type="text/javascript"></script>
<script src="support/jasmine-jquery.js" type="text/javascript"></script>
<script src="support/jasmine-html.js" type="text/javascript"></script>
<script src="support/json2.js" type="text/javascript"></script>
<script src="support/jasmine-init.js" type="text/javascript"></script>

<!-- JAVASCRIPT LIBRARIES (jQuery, Dojo) -->
<!-- JAVASCRIPT LIBRARIES (jQuery, Dojo) AND PLUGINS -->
<script src="../js/jquery.js" type="text/javascript"></script>

<!-- YOUR JAVASCRIPT FILES -->
Expand All @@ -22,7 +23,6 @@

<!-- SPEC FILES -->


</head>
<body>
<div id="jasmine_content"></div>
Expand Down

0 comments on commit f429ead

Please sign in to comment.