1){var t=arguments[1],q=(arguments.length==3)?arguments[2]:{};if(typeof t=="string"){t={src:t}}t=i({bgcolor:"#000000",version:[9,0],expressInstall:"http://static.flowplayer.org/swf/expressinstall.swf",cachebusting:true},t);if(typeof o=="string"){if(o.indexOf(".")!=-1){var s=[];m(n(o),function(){s.push(new b(this,k(t),k(q)))});return new d(s)}else{var r=c(o);return new b(r!==null?r:o,t,q)}}else{if(o){return new b(o,t,q)}}}return null};i(window.$f,{fireEvent:function(){var o=[].slice.call(arguments);var q=$f(o[0]);return q?q._fireEvent(o.slice(1)):null},addPlugin:function(o,p){b.prototype[o]=p;return $f},each:m,extend:i});if(typeof jQuery=="function"){jQuery.fn.flowplayer=function(q,p){if(!arguments.length||typeof arguments[0]=="number"){var o=[];this.each(function(){var r=$f(this);if(r){o.push(r)}});return arguments.length?o[arguments[0]]:new d(o)}return this.each(function(){$f(this,k(q),p?k(p):{})})}}})();(function(){var h=document.all,j="http://www.adobe.com/go/getflashplayer",c=typeof jQuery=="function",e=/(\d+)[^\d]+(\d+)[^\d]*(\d*)/,b={width:"100%",height:"100%",id:"_"+(""+Math.random()).slice(9),allowfullscreen:true,allowscriptaccess:"always",quality:"high",version:[3,0],onFail:null,expressInstall:null,w3c:false,cachebusting:false};if(window.attachEvent){window.attachEvent("onbeforeunload",function(){__flash_unloadHandler=function(){};__flash_savedUnloadHandler=function(){}})}function i(m,l){if(l){for(var f in l){if(l.hasOwnProperty(f)){m[f]=l[f]}}}return m}function a(f,n){var m=[];for(var l in f){if(f.hasOwnProperty(l)){m[l]=n(f[l])}}return m}window.flashembed=function(f,m,l){if(typeof f=="string"){f=document.getElementById(f.replace("#",""))}if(!f){return}if(typeof m=="string"){m={src:m}}return new d(f,i(i({},b),m),l)};var g=i(window.flashembed,{conf:b,getVersion:function(){var m,f;try{f=navigator.plugins["Shockwave Flash"].description.slice(16)}catch(o){try{m=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");f=m&&m.GetVariable("$version")}catch(n){try{m=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");f=m&&m.GetVariable("$version")}catch(l){}}}f=e.exec(f);return f?[f[1],f[3]]:[0,0]},asString:function(l){if(l===null||l===undefined){return null}var f=typeof l;if(f=="object"&&l.push){f="array"}switch(f){case"string":l=l.replace(new RegExp('(["\\\\])',"g"),"\\$1");l=l.replace(/^\s?(\d+\.?\d+)%/,"$1pct");return'"'+l+'"';case"array":return"["+a(l,function(o){return g.asString(o)}).join(",")+"]";case"function":return'"function()"';case"object":var m=[];for(var n in l){if(l.hasOwnProperty(n)){m.push('"'+n+'":'+g.asString(l[n]))}}return"{"+m.join(",")+"}"}return String(l).replace(/\s/g," ").replace(/\'/g,'"')},getHTML:function(o,l){o=i({},o);var n='";return n},isSupported:function(f){return k[0]>f[0]||k[0]==f[0]&&k[1]>=f[1]}});var k=g.getVersion();function d(f,n,m){if(g.isSupported(n.version)){f.innerHTML=g.getHTML(n,m)}else{if(n.expressInstall&&g.isSupported([6,65])){f.innerHTML=g.getHTML(i(n,{src:n.expressInstall}),{MMredirectURL:location.href,MMplayerType:"PlugIn",MMdoctitle:document.title})}else{if(!f.innerHTML.replace(/\s/g,"")){f.innerHTML="Flash version "+n.version+" or greater is required
"+(k[0]>0?"Your version is "+k:"You have no flash plugin installed")+"
"+(f.tagName=="A"?"Click here to download latest version
":"Download latest version from here
");if(f.tagName=="A"){f.onclick=function(){location.href=j}}}if(n.onFail){var l=n.onFail.call(this);if(typeof l=="string"){f.innerHTML=l}}}}if(h){window[n.id]=document.getElementById(n.id)}i(this,{getRoot:function(){return f},getOptions:function(){return n},getConf:function(){return m},getApi:function(){return f.firstChild}})}if(c){jQuery.tools=jQuery.tools||{version:"3.2.4"};jQuery.tools.flashembed={conf:b};jQuery.fn.flashembed=function(l,f){return this.each(function(){$(this).data("flashembed",flashembed(this,l,f))})}}})();
diff --git a/test/integration.html b/test/integration.html
new file mode 100644
index 000000000..4baa6ea99
--- /dev/null
+++ b/test/integration.html
@@ -0,0 +1,42 @@
+
+
+
+ Video.js Test Suite
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/test/test.js b/test/integration/test.js
similarity index 65%
rename from test/test.js
rename to test/integration/test.js
index c4ce4b2b1..ff0b9644c 100644
--- a/test/test.js
+++ b/test/integration/test.js
@@ -43,7 +43,7 @@ function createVideoTag(id){
function playerSetup(){
- _V_.el("player_box").appendChild(createVideoTag())
+ _V_.el("qunit-fixture").appendChild(createVideoTag())
var vid = document.getElementById("vid1");
this.player = _V_(vid);
@@ -137,107 +137,107 @@ test("Paused", 2, function() {
this.player.play();
});
-test("currentTime()", 1, function() {
- stop();
+// test("currentTime()", 1, function() {
+// stop();
- // Try for 3 time updates, sometimes it updates at 0 seconds.
- // var tries = 0;
+// // Try for 3 time updates, sometimes it updates at 0 seconds.
+// // var tries = 0;
- // Can't rely on just time update because it's faked for Flash.
- this.player.one("loadeddata", _V_.proxy(this, function(){
+// // Can't rely on just time update because it's faked for Flash.
+// this.player.one("loadeddata", _V_.proxy(this, function(){
- this.player.addEvent("timeupdate", _V_.proxy(this, function(){
+// this.player.addEvent("timeupdate", _V_.proxy(this, function(){
- if (this.player.currentTime() > 0) {
- ok(true, "Time is greater than 0.");
- start();
- } else {
- // tries++;
- }
+// if (this.player.currentTime() > 0) {
+// ok(true, "Time is greater than 0.");
+// start();
+// } else {
+// // tries++;
+// }
- // if (tries >= 3) {
- // start();
- // }
- }));
+// // if (tries >= 3) {
+// // start();
+// // }
+// }));
- }));
+// }));
- this.player.play();
-});
+// this.player.play();
+// });
-test("currentTime(seconds)", 2, function() {
- stop();
+// test("currentTime(seconds)", 2, function() {
+// stop();
- // var afterPlayback = _V_.proxy(this, function(){
- // this.player.currentTime(this.player.duration() / 2);
- //
- // this.player.addEvent("timeupdate", _V_.proxy(this, function(){
- // ok(this.player.currentTime() > 0, "Time is greater than 0.");
- //
- // this.player.pause();
- //
- // this.player.addEvent("timeupdate", _V_.proxy(this, function(){
- // ok(this.player.currentTime() == 0, "Time is 0.");
- // start();
- // }));
- //
- // this.player.currentTime(0);
- // }));
- // });
+// // var afterPlayback = _V_.proxy(this, function(){
+// // this.player.currentTime(this.player.duration() / 2);
+// //
+// // this.player.addEvent("timeupdate", _V_.proxy(this, function(){
+// // ok(this.player.currentTime() > 0, "Time is greater than 0.");
+// //
+// // this.player.pause();
+// //
+// // this.player.addEvent("timeupdate", _V_.proxy(this, function(){
+// // ok(this.player.currentTime() == 0, "Time is 0.");
+// // start();
+// // }));
+// //
+// // this.player.currentTime(0);
+// // }));
+// // });
- // Wait for Source to be ready.
- this.player.one("loadeddata", _V_.proxy(this, function(){
+// // Wait for Source to be ready.
+// this.player.one("loadeddata", _V_.proxy(this, function(){
- _V_.log("loadeddata", this.player);
- this.player.currentTime(this.player.duration() - 1);
+// _V_.log("loadeddata", this.player);
+// this.player.currentTime(this.player.duration() - 1);
- }));
+// }));
- this.player.one("seeked", _V_.proxy(this, function(){
+// this.player.one("seeked", _V_.proxy(this, function(){
- _V_.log("seeked", this.player.currentTime())
- ok(this.player.currentTime() > 1, "Time is greater than 1.");
+// _V_.log("seeked", this.player.currentTime())
+// ok(this.player.currentTime() > 1, "Time is greater than 1.");
- this.player.one("seeked", _V_.proxy(this, function(){
+// this.player.one("seeked", _V_.proxy(this, function(){
- _V_.log("seeked2", this.player.currentTime())
+// _V_.log("seeked2", this.player.currentTime())
- ok(this.player.currentTime() <= 1, "Time is less than 1.");
- start();
+// ok(this.player.currentTime() <= 1, "Time is less than 1.");
+// start();
- }));
+// }));
- this.player.currentTime(0);
+// this.player.currentTime(0);
- }));
+// }));
- this.player.play();
+// this.player.play();
- // this.player.one("timeupdate", _V_.proxy(this, function(){
- //
- // this.player.currentTime(this.player.duration() / 2);
- //
- // this.player.one("timeupdate", _V_.proxy(this, function(){
- // ok(this.player.currentTime() > 0, "Time is greater than 0.");
- //
- // this.player.pause();
- // this.player.currentTime(0);
- //
- // this.player.one("timeupdate", _V_.proxy(this, function(){
- //
- // ok(this.player.currentTime() == 0, "Time is 0.");
- // start();
- //
- // }));
- //
- // }));
- //
- //
- // }));
+// // this.player.one("timeupdate", _V_.proxy(this, function(){
+// //
+// // this.player.currentTime(this.player.duration() / 2);
+// //
+// // this.player.one("timeupdate", _V_.proxy(this, function(){
+// // ok(this.player.currentTime() > 0, "Time is greater than 0.");
+// //
+// // this.player.pause();
+// // this.player.currentTime(0);
+// //
+// // this.player.one("timeupdate", _V_.proxy(this, function(){
+// //
+// // ok(this.player.currentTime() == 0, "Time is 0.");
+// // start();
+// //
+// // }));
+// //
+// // }));
+// //
+// //
+// // }));
-});
+// });
/* Events
================================================================================ */
diff --git a/test/phantom.js b/test/phantom.js
new file mode 100644
index 000000000..a8d840916
--- /dev/null
+++ b/test/phantom.js
@@ -0,0 +1,63 @@
+// Simple phantom.js integration script
+// Adapted from Modernizr & Bootstrap
+
+function waitFor(testFx, onReady, timeOutMillis) {
+ var maxtimeOutMillis = timeOutMillis ? timeOutMillis : 5001 //< Default Max Timout is 5s
+ , start = new Date().getTime()
+ , condition = false
+ , interval = setInterval(function () {
+ if ((new Date().getTime() - start < maxtimeOutMillis) && !condition) {
+ // If not time-out yet and condition not yet fulfilled
+ condition = (typeof(testFx) === "string" ? eval(testFx) : testFx()) //< defensive code
+ } else {
+ if (!condition) {
+ // If condition still not fulfilled (timeout but condition is 'false')
+ console.log("'waitFor()' timeout")
+ phantom.exit(1)
+ } else {
+ // Condition fulfilled (timeout and/or condition is 'true')
+ typeof(onReady) === "string" ? eval(onReady) : onReady() //< Do what it's supposed to do once the condition is fulfilled
+ clearInterval(interval) //< Stop this interval
+ }
+ }
+ }, 100) //< repeat check every 100ms
+}
+
+
+if (phantom.args.length === 0 || phantom.args.length > 2) {
+ console.log('Usage: phantom.js URL')
+ phantom.exit()
+}
+
+var page = new WebPage()
+
+// Route "console.log()" calls from within the Page context to the main Phantom context (i.e. current "this")
+page.onConsoleMessage = function(msg) {
+ console.log(msg)
+};
+
+page.open(phantom.args[0], function(status){
+ if (status !== "success") {
+ console.log("Unable to access network")
+ phantom.exit()
+ } else {
+ waitFor(function(){
+ return page.evaluate(function(){
+ var el = document.getElementById('qunit-testresult')
+ if (el && el.innerText.match('completed')) {
+ return true
+ }
+ return false
+ })
+ }, function(){
+ var failedNum = page.evaluate(function(){
+ var el = document.getElementById('qunit-testresult')
+ try {
+ return el.getElementsByClassName('failed')[0].innerHTML
+ } catch (e) { }
+ return 10000
+ });
+ phantom.exit((parseInt(failedNum, 10) > 0) ? 1 : 0)
+ })
+ }
+})
\ No newline at end of file
diff --git a/test/server.js b/test/server.js
new file mode 100644
index 000000000..eaa60f55d
--- /dev/null
+++ b/test/server.js
@@ -0,0 +1,14 @@
+/*
+ * Simple connect server for phantom.js
+ * Adapted from Modernizr & Bootstrap
+ */
+
+var connect = require('connect')
+ , http = require('http')
+ , fs = require('fs')
+ , app = connect()
+ .use(connect.static(__dirname + '/../'));
+
+http.createServer(app).listen(3000);
+
+fs.writeFileSync(__dirname + '/pid.txt', process.pid, 'utf-8')
\ No newline at end of file
diff --git a/test/test.html b/test/test.html
deleted file mode 100644
index 08b84500e..000000000
--- a/test/test.html
+++ /dev/null
@@ -1,52 +0,0 @@
-
-
-
-
- QUnit Test Suite
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- test markup
-
-
-
-
diff --git a/test/unit.html b/test/unit.html
new file mode 100644
index 000000000..231ad6f5e
--- /dev/null
+++ b/test/unit.html
@@ -0,0 +1,48 @@
+
+
+
+ Video.js Test Suite
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/test/unit/component.js b/test/unit/component.js
new file mode 100644
index 000000000..25f635b18
--- /dev/null
+++ b/test/unit/component.js
@@ -0,0 +1,67 @@
+module("Component");
+
+test('should create an element', function(){
+ var comp = new _V_.Component({}, {});
+
+ ok(comp.el.nodeName);
+});
+
+test('should init child coponents from options', function(){
+ var comp = new _V_.Component({}, {
+ components: {
+ 'component': true
+ }
+ });
+
+ ok(comp.el.childNodes.length === 1);
+});
+
+test('should show and hide an element', function(){
+ var comp = new _V_.Component({}, {});
+
+ comp.hide();
+ ok(comp.el.style.display === 'none');
+ comp.show();
+ ok(comp.el.style.display === 'block');
+});
+
+test('should add and remove a CSS class', function(){
+ var comp = new _V_.Component({}, {});
+
+ comp.addClass('test-class');
+ ok(comp.el.className.indexOf('test-class') !== -1);
+ comp.removeClass('test-class');
+ ok(comp.el.className.indexOf('test-class') === -1);
+});
+
+test('should add and remove event listeners to element', function(){
+ var comp = new _V_.Component({}, {});
+
+ // No need to make this async because we're triggering events inline.
+ // We're going to trigger the event after removing the listener,
+ // So if we get extra asserts that's a problem.
+ expect(1);
+
+ var testListener = function(){
+ ok(true, 'fired event once');
+ };
+
+ comp.on('test-event', testListener);
+ comp.trigger('test-event');
+ comp.off('test-event', testListener);
+ comp.trigger('test-event');
+});
+
+test('should trigger a listener once using one()', function(){
+ var comp = new _V_.Component({}, {});
+
+ expect(1);
+
+ var testListener = function(){
+ ok(true, 'fired event once');
+ };
+
+ comp.one('test-event', testListener);
+ comp.trigger('test-event');
+ comp.trigger('test-event');
+});
\ No newline at end of file
diff --git a/test/unit/controls.js b/test/unit/controls.js
new file mode 100644
index 000000000..ca2694ed5
--- /dev/null
+++ b/test/unit/controls.js
@@ -0,0 +1 @@
+module("Controls");
\ No newline at end of file
diff --git a/test/unit/core.js b/test/unit/core.js
new file mode 100644
index 000000000..cbe914c0b
--- /dev/null
+++ b/test/unit/core.js
@@ -0,0 +1 @@
+module("Core");
\ No newline at end of file
diff --git a/test/unit/events.js b/test/unit/events.js
new file mode 100644
index 000000000..2bf79e400
--- /dev/null
+++ b/test/unit/events.js
@@ -0,0 +1 @@
+module("Events");
\ No newline at end of file
diff --git a/test/unit/lib.js b/test/unit/lib.js
new file mode 100644
index 000000000..e557dd40e
--- /dev/null
+++ b/test/unit/lib.js
@@ -0,0 +1,69 @@
+module("Lib");
+
+test('should merge two objects', function(){
+ var obj1 = { a:1, b:2 };
+ var obj2 = { b:3, c:4 };
+
+ _V_.merge(obj1, obj2);
+
+ deepEqual(obj1, {a:1,b:3,c:4} );
+});
+
+test('should create an element with attributes', function(){
+ var el = _V_.createElement('div', { className: 'test-class', 'data-test': 'asdf' })
+ ok(el.className === 'test-class');
+ ok(el.getAttribute('data-test') === 'asdf' );
+});
+
+test('should insert an element first', function(){
+ var el1 = document.createElement('div');
+ var el2 = document.createElement('div');
+ var el3 = document.createElement('div');
+
+ _V_.insertFirst(el2, el1);
+ ok(el1.childNodes[0] === el2);
+ _V_.insertFirst(el3, el1);
+ ok(el1.childNodes[0] === el3);
+});
+
+test('should add and remove a CSS class', function(){
+ var el = document.createElement('div');
+
+ _V_.addClass(el, 'test-class')
+ ok(el.className.indexOf('test-class') !== -1);
+ _V_.removeClass(el, 'test-class')
+ ok(el.className.indexOf('test-class') === -1);
+});
+
+test('should format the time', function(){
+ ok(_V_.formatTime(120) === "2:00");
+ ok(_V_.formatTime(18121) === "5:02:01");
+});
+
+test('should uppercase a word', function(){
+ ok(_V_.uc('asdf') === "Asdf");
+});
+
+test('should trim a string', function(){
+ ok(_V_.trim(' asdf ') === "asdf");
+});
+
+test('should round a number', function(){
+ ok(_V_.round(1.01) === 1);
+ ok(_V_.round(1.01, 1) === 1.0);
+ ok(_V_.round(1.01, 2) === 1.01);
+ ok(_V_.round(1.05, 1) === 1.1);
+});
+
+test('should test that an object is empty', function(){
+ ok(_V_.isEmpty({}) === true);
+ ok(_V_.isEmpty({ asdf: 'asdf' }) === false);
+});
+
+test('should create a fake timerange', function(){
+ var tr = _V_.createTimeRange(0, 100);
+
+ ok(tr.start() === 0);
+ ok(tr.end() === 100);
+ ok(tr.length === 1);
+});
\ No newline at end of file
diff --git a/test/unit/phantom-logging.js b/test/unit/phantom-logging.js
new file mode 100644
index 000000000..0f5fd9e4f
--- /dev/null
+++ b/test/unit/phantom-logging.js
@@ -0,0 +1,21 @@
+// Logging setup for phantom integration
+// adapted from Modernizr & Bootstrap
+
+QUnit.begin = function () {
+ console.log("Starting test suite")
+ console.log("================================================\n")
+}
+
+QUnit.moduleDone = function (opts) {
+ if (opts.failed === 0) {
+ console.log("\u2714 All tests passed in '" + opts.name + "' module")
+ } else {
+ console.log("\u2716 " + opts.failed + " tests failed in '" + opts.name + "' module")
+ }
+}
+
+QUnit.done = function (opts) {
+ console.log("\n================================================")
+ console.log("Tests completed in " + opts.runtime + " milliseconds")
+ console.log(opts.passed + " tests of " + opts.total + " passed, " + opts.failed + " failed.")
+}
\ No newline at end of file
diff --git a/test/unit/player.js b/test/unit/player.js
new file mode 100644
index 000000000..b6695aea0
--- /dev/null
+++ b/test/unit/player.js
@@ -0,0 +1,22 @@
+module("Player", {
+ setup: function(){
+ var videoTag = document.createElement('video');
+ videoTag.id = 'example_1';
+ videoTag.className = 'video-js vjs-default-skin';
+
+ var fixture = document.getElementById('qunit-fixture');
+ fixture.appendChild(videoTag);
+
+ this.player = new _V_.Player(videoTag, {});
+ },
+ teardown: function(){
+
+ }
+});
+
+test('should create and embed a new player element', function(){
+ ok(this.player.el.nodeName === 'DIV');
+ ok(this.player.el.parentNode.id === 'qunit-fixture');
+ ok(this.player.el.className.indexOf('video-js vjs-default-skin') !== -1);
+ ok(this.player.el.id === 'example_1');
+});
\ No newline at end of file
diff --git a/test/unit/setup.js b/test/unit/setup.js
new file mode 100644
index 000000000..6c0bc4ed2
--- /dev/null
+++ b/test/unit/setup.js
@@ -0,0 +1 @@
+module("Setup");
\ No newline at end of file
diff --git a/test/unit/tech.js b/test/unit/tech.js
new file mode 100644
index 000000000..0979c9012
--- /dev/null
+++ b/test/unit/tech.js
@@ -0,0 +1 @@
+module("Tech");
\ No newline at end of file
diff --git a/test/unit/tracks.js b/test/unit/tracks.js
new file mode 100644
index 000000000..37a285533
--- /dev/null
+++ b/test/unit/tracks.js
@@ -0,0 +1 @@
+module("Tracks");
\ No newline at end of file
diff --git a/test/qunit/.gitignore b/test/vendor/qunit/.gitignore
similarity index 100%
rename from test/qunit/.gitignore
rename to test/vendor/qunit/.gitignore
diff --git a/test/qunit/README.md b/test/vendor/qunit/README.md
similarity index 100%
rename from test/qunit/README.md
rename to test/vendor/qunit/README.md
diff --git a/test/qunit/addons/canvas/README.md b/test/vendor/qunit/addons/canvas/README.md
similarity index 100%
rename from test/qunit/addons/canvas/README.md
rename to test/vendor/qunit/addons/canvas/README.md
diff --git a/test/qunit/addons/canvas/canvas-test.js b/test/vendor/qunit/addons/canvas/canvas-test.js
similarity index 100%
rename from test/qunit/addons/canvas/canvas-test.js
rename to test/vendor/qunit/addons/canvas/canvas-test.js
diff --git a/test/qunit/addons/canvas/canvas.html b/test/vendor/qunit/addons/canvas/canvas.html
similarity index 100%
rename from test/qunit/addons/canvas/canvas.html
rename to test/vendor/qunit/addons/canvas/canvas.html
diff --git a/test/qunit/addons/canvas/qunit-canvas.js b/test/vendor/qunit/addons/canvas/qunit-canvas.js
similarity index 100%
rename from test/qunit/addons/canvas/qunit-canvas.js
rename to test/vendor/qunit/addons/canvas/qunit-canvas.js
diff --git a/test/qunit/addons/close-enough/README.md b/test/vendor/qunit/addons/close-enough/README.md
similarity index 100%
rename from test/qunit/addons/close-enough/README.md
rename to test/vendor/qunit/addons/close-enough/README.md
diff --git a/test/qunit/addons/close-enough/close-enough-test.js b/test/vendor/qunit/addons/close-enough/close-enough-test.js
similarity index 100%
rename from test/qunit/addons/close-enough/close-enough-test.js
rename to test/vendor/qunit/addons/close-enough/close-enough-test.js
diff --git a/test/qunit/addons/close-enough/close-enough.html b/test/vendor/qunit/addons/close-enough/close-enough.html
similarity index 100%
rename from test/qunit/addons/close-enough/close-enough.html
rename to test/vendor/qunit/addons/close-enough/close-enough.html
diff --git a/test/qunit/addons/close-enough/qunit-close-enough.js b/test/vendor/qunit/addons/close-enough/qunit-close-enough.js
similarity index 100%
rename from test/qunit/addons/close-enough/qunit-close-enough.js
rename to test/vendor/qunit/addons/close-enough/qunit-close-enough.js
diff --git a/test/qunit/addons/composite/README.md b/test/vendor/qunit/addons/composite/README.md
similarity index 100%
rename from test/qunit/addons/composite/README.md
rename to test/vendor/qunit/addons/composite/README.md
diff --git a/test/qunit/addons/composite/composite-demo-test.html b/test/vendor/qunit/addons/composite/composite-demo-test.html
similarity index 100%
rename from test/qunit/addons/composite/composite-demo-test.html
rename to test/vendor/qunit/addons/composite/composite-demo-test.html
diff --git a/test/qunit/addons/composite/composite-test.html b/test/vendor/qunit/addons/composite/composite-test.html
similarity index 100%
rename from test/qunit/addons/composite/composite-test.html
rename to test/vendor/qunit/addons/composite/composite-test.html
diff --git a/test/qunit/addons/composite/composite-test.js b/test/vendor/qunit/addons/composite/composite-test.js
similarity index 100%
rename from test/qunit/addons/composite/composite-test.js
rename to test/vendor/qunit/addons/composite/composite-test.js
diff --git a/test/qunit/addons/composite/dummy-qunit-test.html b/test/vendor/qunit/addons/composite/dummy-qunit-test.html
similarity index 100%
rename from test/qunit/addons/composite/dummy-qunit-test.html
rename to test/vendor/qunit/addons/composite/dummy-qunit-test.html
diff --git a/test/qunit/addons/composite/dummy-same-test.html b/test/vendor/qunit/addons/composite/dummy-same-test.html
similarity index 100%
rename from test/qunit/addons/composite/dummy-same-test.html
rename to test/vendor/qunit/addons/composite/dummy-same-test.html
diff --git a/test/qunit/addons/composite/index.html b/test/vendor/qunit/addons/composite/index.html
similarity index 100%
rename from test/qunit/addons/composite/index.html
rename to test/vendor/qunit/addons/composite/index.html
diff --git a/test/qunit/addons/composite/qunit-composite.css b/test/vendor/qunit/addons/composite/qunit-composite.css
similarity index 100%
rename from test/qunit/addons/composite/qunit-composite.css
rename to test/vendor/qunit/addons/composite/qunit-composite.css
diff --git a/test/qunit/addons/composite/qunit-composite.js b/test/vendor/qunit/addons/composite/qunit-composite.js
similarity index 100%
rename from test/qunit/addons/composite/qunit-composite.js
rename to test/vendor/qunit/addons/composite/qunit-composite.js
diff --git a/test/qunit/addons/step/README.md b/test/vendor/qunit/addons/step/README.md
similarity index 100%
rename from test/qunit/addons/step/README.md
rename to test/vendor/qunit/addons/step/README.md
diff --git a/test/qunit/addons/step/qunit-step.js b/test/vendor/qunit/addons/step/qunit-step.js
similarity index 100%
rename from test/qunit/addons/step/qunit-step.js
rename to test/vendor/qunit/addons/step/qunit-step.js
diff --git a/test/qunit/addons/step/step-test.js b/test/vendor/qunit/addons/step/step-test.js
similarity index 100%
rename from test/qunit/addons/step/step-test.js
rename to test/vendor/qunit/addons/step/step-test.js
diff --git a/test/qunit/addons/step/step.html b/test/vendor/qunit/addons/step/step.html
similarity index 100%
rename from test/qunit/addons/step/step.html
rename to test/vendor/qunit/addons/step/step.html
diff --git a/test/qunit/package.json b/test/vendor/qunit/package.json
similarity index 100%
rename from test/qunit/package.json
rename to test/vendor/qunit/package.json
diff --git a/test/qunit/qunit/qunit.css b/test/vendor/qunit/qunit/qunit.css
similarity index 100%
rename from test/qunit/qunit/qunit.css
rename to test/vendor/qunit/qunit/qunit.css
diff --git a/test/qunit/qunit/qunit.js b/test/vendor/qunit/qunit/qunit.js
similarity index 100%
rename from test/qunit/qunit/qunit.js
rename to test/vendor/qunit/qunit/qunit.js
diff --git a/test/qunit/test/headless.html b/test/vendor/qunit/test/headless.html
similarity index 100%
rename from test/qunit/test/headless.html
rename to test/vendor/qunit/test/headless.html
diff --git a/test/qunit/test/index.html b/test/vendor/qunit/test/index.html
similarity index 100%
rename from test/qunit/test/index.html
rename to test/vendor/qunit/test/index.html
diff --git a/test/qunit/test/logs.html b/test/vendor/qunit/test/logs.html
similarity index 100%
rename from test/qunit/test/logs.html
rename to test/vendor/qunit/test/logs.html
diff --git a/test/qunit/test/logs.js b/test/vendor/qunit/test/logs.js
similarity index 100%
rename from test/qunit/test/logs.js
rename to test/vendor/qunit/test/logs.js
diff --git a/test/qunit/test/same.js b/test/vendor/qunit/test/same.js
similarity index 100%
rename from test/qunit/test/same.js
rename to test/vendor/qunit/test/same.js
diff --git a/test/qunit/test/test.js b/test/vendor/qunit/test/test.js
similarity index 100%
rename from test/qunit/test/test.js
rename to test/vendor/qunit/test/test.js