| <!DOCTYPE html> |
| <html> |
| <head> |
| <title></title> |
| <style> |
| |
| </style> |
| <script src="http://closure-library.googlecode.com/svn/trunk/closure/goog/base.js"></script> |
| <script src="cr.js"></script> |
| <script src="cr/event_target.js"></script> |
| <script> |
| |
| goog.require('goog.testing.jsunit'); |
| |
| </script> |
| |
| </head> |
| <body> |
| |
| <script> |
| |
| const EventTarget = cr.EventTarget; |
| |
| function testDefineProperty() { |
| var obj = new EventTarget; |
| cr.defineProperty(obj, 'test'); |
| |
| obj.test = 1; |
| assertEquals(1, obj.test); |
| assertEquals(1, obj.test_); |
| } |
| |
| function testDefinePropertyOnClass() { |
| function C() {} |
| C.prototype = { |
| __proto__: EventTarget.prototype |
| }; |
| |
| cr.defineProperty(C, 'test'); |
| |
| var obj = new C; |
| assertUndefined(obj.test); |
| |
| obj.test = 1; |
| assertEquals(1, obj.test); |
| assertEquals(1, obj.test_); |
| } |
| |
| function testDefinePropertyWithSetter() { |
| var obj = new EventTarget; |
| |
| var hit = false; |
| function onTestSet(value, oldValue) { |
| assertEquals(obj, this); |
| assertEquals(2, this.test); |
| assertUndefined(oldValue); |
| assertEquals(2, value); |
| hit = true; |
| } |
| cr.defineProperty(obj, 'test', cr.PropertyKind.JS, onTestSet); |
| obj.test = 2; |
| assertTrue(hit); |
| } |
| |
| function testDefinePropertyEvent() { |
| var obj = new EventTarget; |
| cr.defineProperty(obj, 'test'); |
| obj.test = 1; |
| |
| var count = 0; |
| function f(e) { |
| assertEquals('testChange', e.type); |
| assertEquals('test', e.propertyName); |
| assertEquals(1, e.oldValue); |
| assertEquals(2, e.newValue); |
| count++; |
| } |
| |
| obj.addEventListener('testChange', f); |
| obj.test = 2; |
| assertEquals(2, obj.test); |
| assertEquals('Should have called the property change listener', 1, count); |
| |
| obj.test = 2; |
| assertEquals(1, count); |
| } |
| |
| function testDefinePropertyEventWithDefault() { |
| var obj = new EventTarget; |
| cr.defineProperty(obj, 'test', cr.PropertyKind.JS); |
| |
| var count = 0; |
| function f(e) { |
| assertEquals('testChange', e.type); |
| assertEquals('test', e.propertyName); |
| assertUndefined(e.oldValue); |
| assertEquals(2, e.newValue); |
| count++; |
| } |
| |
| obj.addEventListener('testChange', f); |
| |
| obj.test = undefined; |
| assertEquals('Should not have called the property change listener', 0, count); |
| |
| obj.test = 2; |
| assertEquals(2, obj.test); |
| assertEquals('Should have called the property change listener', 1, count); |
| |
| obj.test = 2; |
| assertEquals(1, count); |
| } |
| |
| function testDefinePropertyAttr() { |
| var obj = document.createElement('div'); |
| cr.defineProperty(obj, 'test', cr.PropertyKind.ATTR); |
| |
| obj.test = 'a'; |
| assertEquals('a', obj.test); |
| assertEquals('a', obj.getAttribute('test')); |
| |
| obj.test = undefined; |
| assertEquals(undefined, obj.test); |
| assertFalse(obj.hasAttribute('test')); |
| } |
| |
| function testDefinePropertyAttrOnClass() { |
| var obj = document.createElement('button'); |
| cr.defineProperty(HTMLButtonElement, 'test', cr.PropertyKind.ATTR); |
| |
| assertEquals(null, obj.test); |
| |
| obj.test = 'a'; |
| assertEquals('a', obj.test); |
| assertEquals('a', obj.getAttribute('test')); |
| |
| obj.test = undefined; |
| assertEquals(undefined, obj.test); |
| assertFalse(obj.hasAttribute('test')); |
| } |
| |
| function testDefinePropertyAttrWithSetter() { |
| var obj = document.createElement('div'); |
| |
| var hit = false; |
| function onTestSet(value, oldValue) { |
| assertEquals(obj, this); |
| assertEquals(null, oldValue); |
| assertEquals('b', value); |
| assertEquals('b', this.test); |
| hit = true; |
| } |
| cr.defineProperty(obj, 'test', cr.PropertyKind.ATTR, onTestSet); |
| obj.test = 'b'; |
| assertTrue(hit); |
| } |
| |
| function testDefinePropertyAttrEvent() { |
| var obj = document.createElement('div'); |
| cr.defineProperty(obj, 'test', cr.PropertyKind.ATTR); |
| |
| var count = 0; |
| function f(e) { |
| assertEquals('testChange', e.type); |
| assertEquals('test', e.propertyName); |
| assertEquals(null, e.oldValue); |
| assertEquals('b', e.newValue); |
| count++; |
| } |
| |
| obj.addEventListener('testChange', f); |
| |
| obj.test = null; |
| assertEquals('Should not have called the property change listener', 0, count); |
| |
| obj.test = 'b'; |
| assertEquals('b', obj.test); |
| assertEquals('Should have called the property change listener', 1, count); |
| |
| obj.test = 'b'; |
| assertEquals(1, count); |
| } |
| |
| function testDefinePropertyBoolAttr() { |
| var obj = document.createElement('div'); |
| cr.defineProperty(obj, 'test', cr.PropertyKind.BOOL_ATTR); |
| |
| assertFalse(obj.test); |
| assertFalse(obj.hasAttribute('test')); |
| |
| obj.test = true; |
| assertTrue(obj.test); |
| assertTrue(obj.hasAttribute('test')); |
| |
| obj.test = false; |
| assertFalse(obj.test); |
| assertFalse(obj.hasAttribute('test')); |
| } |
| |
| function testDefinePropertyBoolAttrEvent() { |
| var obj = document.createElement('div'); |
| cr.defineProperty(obj, 'test', cr.PropertyKind.BOOL_ATTR); |
| |
| var count = 0; |
| function f(e) { |
| assertEquals('testChange', e.type); |
| assertEquals('test', e.propertyName); |
| assertEquals(false, e.oldValue); |
| assertEquals(true, e.newValue); |
| count++; |
| } |
| |
| obj.addEventListener('testChange', f); |
| obj.test = true; |
| assertTrue(obj.test); |
| assertEquals('Should have called the property change listener', 1, count); |
| |
| obj.test = true; |
| assertEquals(1, count); |
| } |
| |
| function testDefinePropertyBoolAttrEvent() { |
| var obj = document.createElement('div'); |
| var hit = false; |
| function onTestSet(value, oldValue) { |
| assertEquals(obj, this); |
| assertTrue(this.test); |
| assertFalse(oldValue); |
| assertTrue(value); |
| hit = true; |
| } |
| cr.defineProperty(obj, 'test', cr.PropertyKind.BOOL_ATTR, onTestSet); |
| obj.test = true; |
| assertTrue(hit); |
| } |
| |
| function testAddSingletonGetter() { |
| function Foo() {}; |
| cr.addSingletonGetter(Foo); |
| |
| assertNotNull('Should add get instance function', Foo.getInstance); |
| |
| var x = Foo.getInstance(); |
| assertNotNull('Should successfully create an object', x); |
| |
| var y = Foo.getInstance(); |
| assertEquals('Should return the same object', x, y); |
| |
| delete Foo.instance_; |
| |
| var z = Foo.getInstance(); |
| assertNotNull('Should work after clearing for testing', z); |
| |
| assertNotEquals('Should return a different object after clearing for testing', |
| x, z); |
| } |
| |
| function testWithDoc() { |
| var d = {}; |
| |
| assertEquals(document, cr.doc); |
| |
| cr.withDoc(d, function() { |
| assertEquals(d, cr.doc); |
| }); |
| |
| assertEquals(document, cr.doc); |
| } |
| |
| function testDefineWithGetter() { |
| var v = 0; |
| cr.define('foo', function() { |
| return { |
| get v() { |
| return v; |
| } |
| } |
| }); |
| |
| assertEquals(0, foo.v); |
| |
| v = 1; |
| assertEquals(1, foo.v); |
| } |
| |
| </script> |
| |
| </body> |
| </html> |