1<!DOCTYPE html>
2<html>
3<head>
4<title></title>
5<style>
6
7</style>
8<script src="http://closure-library.googlecode.com/svn/trunk/closure/goog/base.js"></script>
9<script src="cr.js"></script>
10<script src="cr/event_target.js"></script>
11<script>
12
13goog.require('goog.testing.jsunit');
14
15</script>
16
17</head>
18<body>
19
20<script>
21
22const EventTarget = cr.EventTarget;
23
24function testDefineProperty() {
25  var obj = new EventTarget;
26  cr.defineProperty(obj, 'test');
27
28  obj.test = 1;
29  assertEquals(1, obj.test);
30  assertEquals(1, obj.test_);
31}
32
33function testDefinePropertyOnClass() {
34  function C() {}
35  C.prototype = {
36    __proto__: EventTarget.prototype
37  };
38
39  cr.defineProperty(C, 'test');
40
41  var obj = new C;
42  assertUndefined(obj.test);
43
44  obj.test = 1;
45  assertEquals(1, obj.test);
46  assertEquals(1, obj.test_);
47}
48
49function testDefinePropertyWithSetter() {
50  var obj = new EventTarget;
51
52  var hit = false;
53  function onTestSet(value, oldValue) {
54    assertEquals(obj, this);
55    assertEquals(2, this.test);
56    assertUndefined(oldValue);
57    assertEquals(2, value);
58    hit = true;
59  }
60  cr.defineProperty(obj, 'test', cr.PropertyKind.JS, onTestSet); 
61  obj.test = 2;
62  assertTrue(hit);
63}
64
65function testDefinePropertyEvent() {
66  var obj = new EventTarget;
67  cr.defineProperty(obj, 'test');
68  obj.test = 1;
69
70  var count = 0;
71  function f(e) {
72    assertEquals('testChange', e.type);
73    assertEquals('test', e.propertyName);
74    assertEquals(1, e.oldValue);
75    assertEquals(2, e.newValue);
76    count++;
77  }
78
79  obj.addEventListener('testChange', f);
80  obj.test = 2;
81  assertEquals(2, obj.test);
82  assertEquals('Should have called the property change listener', 1, count);
83
84  obj.test = 2;
85  assertEquals(1, count);
86}
87
88function testDefinePropertyEventWithDefault() {
89  var obj = new EventTarget;
90  cr.defineProperty(obj, 'test', cr.PropertyKind.JS);
91
92  var count = 0;
93  function f(e) {
94    assertEquals('testChange', e.type);
95    assertEquals('test', e.propertyName);
96    assertUndefined(e.oldValue);
97    assertEquals(2, e.newValue);
98    count++;
99  }
100
101  obj.addEventListener('testChange', f);
102
103  obj.test = undefined;
104  assertEquals('Should not have called the property change listener', 0, count);
105
106  obj.test = 2;
107  assertEquals(2, obj.test);
108  assertEquals('Should have called the property change listener', 1, count);
109
110  obj.test = 2;
111  assertEquals(1, count);
112}
113
114function testDefinePropertyAttr() {
115  var obj = document.createElement('div');
116  cr.defineProperty(obj, 'test', cr.PropertyKind.ATTR);
117
118  obj.test = 'a';
119  assertEquals('a', obj.test);
120  assertEquals('a', obj.getAttribute('test'));
121}
122
123function testDefinePropertyAttrOnClass() {
124  var obj = document.createElement('button');
125  cr.defineProperty(HTMLButtonElement, 'test', cr.PropertyKind.ATTR);
126
127  assertEquals(null, obj.test);
128
129  obj.test = 'a';
130  assertEquals('a', obj.test);
131  assertEquals('a', obj.getAttribute('test'));
132}
133
134function testDefinePropertyAttrWithSetter() {
135  var obj = document.createElement('div');
136
137  var hit = false;
138  function onTestSet(value, oldValue) {
139    assertEquals(obj, this);
140    assertEquals(null, oldValue);
141    assertEquals('b', value);
142    assertEquals('b', this.test);
143    hit = true;
144  }
145  cr.defineProperty(obj, 'test', cr.PropertyKind.ATTR, onTestSet);
146  obj.test = 'b';
147  assertTrue(hit);
148}
149
150function testDefinePropertyAttrEvent() {
151  var obj = document.createElement('div');
152  cr.defineProperty(obj, 'test', cr.PropertyKind.ATTR);
153
154  var count = 0;
155  function f(e) {
156    assertEquals('testChange', e.type);
157    assertEquals('test', e.propertyName);
158    assertEquals(null, e.oldValue);
159    assertEquals('b', e.newValue);
160    count++;
161  }
162
163  obj.addEventListener('testChange', f);
164
165  obj.test = null;
166  assertEquals('Should not have called the property change listener', 0, count);
167
168  obj.test = 'b';
169  assertEquals('b', obj.test);
170  assertEquals('Should have called the property change listener', 1, count);
171
172  obj.test = 'b';
173  assertEquals(1, count);
174}
175
176function testDefinePropertyBoolAttr() {
177  var obj = document.createElement('div');
178  cr.defineProperty(obj, 'test', cr.PropertyKind.BOOL_ATTR);
179
180  assertFalse(obj.test);
181  assertFalse(obj.hasAttribute('test'));
182
183  obj.test = true;
184  assertTrue(obj.test);
185  assertTrue(obj.hasAttribute('test'));
186
187  obj.test = false;
188  assertFalse(obj.test);
189  assertFalse(obj.hasAttribute('test'));
190}
191
192function testDefinePropertyBoolAttrEvent() {
193  var obj = document.createElement('div');
194  cr.defineProperty(obj, 'test', cr.PropertyKind.BOOL_ATTR);
195
196  var count = 0;
197  function f(e) {
198    assertEquals('testChange', e.type);
199    assertEquals('test', e.propertyName);
200    assertEquals(false, e.oldValue);
201    assertEquals(true, e.newValue);
202    count++;
203  }
204
205  obj.addEventListener('testChange', f);
206  obj.test = true;
207  assertTrue(obj.test);
208  assertEquals('Should have called the property change listener', 1, count);
209
210  obj.test = true;
211  assertEquals(1, count);
212}
213
214function testDefinePropertyBoolAttrEvent() {
215  var obj = document.createElement('div');
216  var hit = false;
217  function onTestSet(value, oldValue) {
218    assertEquals(obj, this);
219    assertTrue(this.test);
220    assertFalse(oldValue);
221    assertTrue(value);
222    hit = true;
223  }
224  cr.defineProperty(obj, 'test', cr.PropertyKind.BOOL_ATTR, onTestSet);
225  obj.test = true;
226  assertTrue(hit);
227}
228
229function testAddSingletonGetter() {
230  function Foo() {};
231  cr.addSingletonGetter(Foo);
232
233  assertNotNull('Should add get instance function', Foo.getInstance);
234
235  var x = Foo.getInstance();
236  assertNotNull('Should successfully create an object', x);
237
238  var y = Foo.getInstance();
239  assertEquals('Should return the same object', x, y);
240
241  delete Foo.instance_;
242
243  var z = Foo.getInstance();
244  assertNotNull('Should work after clearing for testing', z);
245
246  assertNotEquals('Should return a different object after clearing for testing',
247      x, z);
248}
249
250function testWithDoc() {
251  var d = {};
252
253  assertEquals(document, cr.doc);
254
255  cr.withDoc(d, function() {
256    assertEquals(d, cr.doc);
257  });
258
259  assertEquals(document, cr.doc);
260}
261
262function testDefineWithGetter() {
263  var v = 0;
264  cr.define('foo', function() {
265    return {
266      get v() {
267        return v;
268      }
269    }
270  });
271
272  assertEquals(0, foo.v);
273
274  v = 1;
275  assertEquals(1, foo.v);
276}
277
278</script>
279
280</body>
281</html>
282