diff --git a/IPython/html/tests/casperjs/test_cases/widgets.js b/IPython/html/tests/casperjs/test_cases/widgets.js
new file mode 100644
index 000000000..db20dd46d
--- /dev/null
+++ b/IPython/html/tests/casperjs/test_cases/widgets.js
@@ -0,0 +1,97 @@
+//
+// Test the widget framework.
+//
+casper.notebook_test(function () {
+ //this.test.begin("widget tests (notebook)", 2, function(test) {
+
+
+ // Utility function that allows us to easily execute a cell of python code
+ // and wait for the results.
+ var that = this;
+ var run_python_code = function(code){
+ var index = that.evaluate(function (code) {
+ var index = IPython.notebook.ncells();
+ var cell = IPython.notebook.insert_cell_at_index('code', index);
+ cell.set_text(code);
+ cell.execute();
+ return index;
+ }, code);
+
+ that.wait_for_output(index);
+ return index;
+ };
+
+ // Test widget dependencies ////////////////////////////////////////////////
+ run_python_code('from IPython.html import widgets\n' +
+ 'from IPython.display import display, clear_output\n' +
+ 'widgets.init_widget_js()');
+ this.wait(500); // Wait for require.js async callbacks to load dependencies.
+
+ this.then(function () {
+
+ // Check if the WidgetManager class is defined.
+ this.test.assert(this.evaluate(function() {
+ return IPython.WidgetManager != undefined;
+ }), 'WidgetManager class is defined');
+
+ // Check if the widget manager has been instanciated.
+ this.test.assert(this.evaluate(function() {
+ return IPython.notebook.widget_manager != undefined;
+ }), 'Notebook widget manager instanciated');
+ });
+
+
+ // Check widget mapping ////////////////////////////////////////////////////
+ var cell_index = run_python_code('names = [name for name in dir(widgets)' +
+ ' if name.endswith("Widget") and name!= "Widget"]\n' +
+ 'for name in names:\n' +
+ ' print(name)\n');
+
+ this.then(function () {
+ // Get the widget names that are registered with the widget manager. Assume
+ // a 1 to 1 mapping of model and widgets names (model names just have 'model'
+ // suffixed).
+ var javascript_names = this.evaluate(function () {
+ names = [];
+ for (var name in IPython.notebook.widget_manager.widget_model_types) {
+ names.push(name.replace('Model',''));
+ }
+ return names;
+ });
+
+ // Get the widget names registered in python.
+ var python_names = this.get_output_cell(cell_index).text.split('\n');
+
+ // Make sure the two lists have the same items.
+ for (var i in javascript_names) {
+ var javascript_name = javascript_names[i];
+ var found = false;
+ for (var j in python_names) {
+ var python_name = python_names[j];
+ if (python_name==javascript_name) {
+ found = true;
+ break;
+ }
+ }
+ this.test.assert(found, javascript_name + ' exists in python');
+ }
+ for (var i in python_names) {
+ var python_name = python_names[i];
+ if (python_name.length > 0) {
+ var found = false;
+ for (var j in javascript_names) {
+ var javascript_name = javascript_names[j];
+ if (python_name==javascript_name) {
+ found = true;
+ break;
+ }
+ }
+ this.test.assert(found, python_name + ' exists in javascript');
+ }
+ }
+ });
+
+
+ //}); // end of test.begin
+});
+