<!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>