Index: remoting/webapp/unittests/base_unittest.js |
diff --git a/remoting/webapp/unittests/base_unittest.js b/remoting/webapp/unittests/base_unittest.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..62a6456320206786d0aeabde3b3ed9e5f7cd9040 |
--- /dev/null |
+++ b/remoting/webapp/unittests/base_unittest.js |
@@ -0,0 +1,156 @@ |
+// Copyright 2014 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+(function() { |
+ |
+'use strict'; |
+ |
+module('base'); |
+ |
+test('mix(dest, src) should copy properties from |src| to |dest|', |
+ function() { |
+ var src = { a: 'a', b: 'b'}; |
+ var dest = { c: 'c'}; |
+ |
+ base.mix(dest, src); |
+ deepEqual(dest, {a: 'a', b: 'b', c: 'c'}); |
+}); |
+ |
+test('mix(dest, src) should assert if properties are overwritten', |
+ function() { |
+ var src = { a: 'a', b: 'b'}; |
+ var dest = { a: 'a'}; |
+ |
+ sinon.spy(base.debug, 'assert'); |
+ |
+ try { |
+ base.mix(dest, src); |
+ } catch (e) { |
+ } finally { |
+ sinon.assert.called(base.debug.assert); |
+ base.debug.assert.restore(); |
+ } |
+}); |
+ |
+test('values(obj) should return an array containing the values of |obj|', |
+ function() { |
+ var output = base.values({ a: 'a', b: 'b'}); |
+ |
+ notEqual(output.indexOf('a'), -1, '"a" should be in the output'); |
+ notEqual(output.indexOf('b'), -1, '"b" should be in the output'); |
+}); |
+ |
+test('dispose(obj) should invoke the dispose method on |obj|', |
+ function() { |
+ var obj = { |
+ dispose: sinon.spy() |
+ }; |
+ base.dispose(obj); |
+ sinon.assert.called(obj.dispose); |
+}); |
+ |
+test('dispose(obj) should not crash if |obj| is null', |
+ function() { |
+ expect(0); |
+ base.dispose(null); |
+}); |
+ |
+QUnit.asyncTest('Promise.sleep(delay) should fulfill the promise after |delay|', |
+ function() { |
+ base.Promise.sleep(100).then(function(){ |
+ ok(true); |
+ QUnit.start(); |
+ }); |
+ this.clock.tick(101); |
Jamie
2014/07/18 02:16:04
I think this should also assert somehow that the p
|
+}); |
+ |
+var source = null; |
Jamie
2014/07/18 02:16:04
I think two blank lines between modules would aid
|
+var listener = null; |
+ |
+module('base.EventSource', { |
+ setup: function() { |
+ source = new base.EventSource(); |
+ source.defineEvents(['foo', 'bar']); |
+ listener = sinon.spy(); |
+ source.addEventListener('foo', listener); |
+ }, |
+ teardown: function() { |
+ source = null; |
+ listener = null; |
+ } |
+}); |
+ |
+test('raiseEvent() should invoke the listener', function() { |
+ source.raiseEvent('foo'); |
+ sinon.assert.called(listener); |
+}); |
+ |
+test('raiseEvent() should invoke the listener with the correct event data', |
+ function() { |
+ var data = { |
+ field: 'foo' |
+ }; |
+ source.raiseEvent('foo', data); |
+ sinon.assert.calledWith(listener, data); |
+}); |
+ |
+test( |
+ 'raiseEvent() should not invoke listeners that are added during raiseEvent', |
+ function() { |
+ source.addEventListener('foo', function() { |
+ source.addEventListener('foo', function() { |
+ ok(false); |
+ }); |
+ ok(true); |
+ }); |
+ source.raiseEvent('foo'); |
+}); |
+ |
+test('raiseEvent() should not invoke listeners of a different event', |
+ function() { |
+ source.raiseEvent('bar'); |
+ sinon.assert.notCalled(listener); |
+}); |
+ |
+test('raiseEvent() should assert when undeclared events are raised', |
+ function() { |
+ sinon.spy(base.debug, 'assert'); |
+ try { |
+ source.raiseEvent('undefined'); |
+ } catch (e) { |
+ } finally { |
+ sinon.assert.called(base.debug.assert); |
+ base.debug.assert.restore(); |
+ } |
+}); |
+ |
+test( |
+ 'removeEventListener() should not invoke the listener in subsequent ' + |
+ 'calls to |raiseEvent|', |
+ function() { |
+ source.raiseEvent('foo'); |
+ sinon.assert.calledOnce(listener); |
+ |
+ source.removeEventListener('foo', listener); |
+ source.raiseEvent('foo'); |
+ sinon.assert.calledOnce(listener); |
+}); |
+ |
+test('removeEventListener() should work even if the listener ' + |
+ 'is removed during |raiseEvent|', |
+ function() { |
+ var sink = {}; |
+ sink.listener = sinon.spy(function() { |
+ source.removeEventListener('foo', sink.listener); |
+ }); |
+ |
+ source.addEventListener('foo', sink.listener); |
+ source.raiseEvent('foo'); |
+ sinon.assert.calledOnce(sink.listener); |
+ |
+ source.raiseEvent('foo'); |
+ sinon.assert.calledOnce(sink.listener); |
+}); |
+ |
+})(); |