• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// Copyright (c) 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5'use strict';
6
7base.require('ui');
8
9base.unittest.testSuite('ui', function() {
10  var TestElement = ui.define('div');
11  TestElement.prototype = {
12    __proto__: HTMLDivElement.prototype,
13
14    decorate: function() {
15      if (!this.decorateCallCount)
16        this.decorateCallCount = 0;
17      this.decorateCallCount++;
18    }
19  };
20
21  var Base = ui.define('div');
22  Base.prototype = {
23    __proto__: HTMLDivElement.prototype,
24    decorate: function() {
25      this.decoratedAsBase = true;
26    },
27    set baseProperty(v) {
28      this.basePropertySet = v;
29    }
30  };
31
32  test('decorateOnceViaNew', function() {
33    var testElement = new TestElement();
34    assertEquals(1, testElement.decorateCallCount);
35  });
36
37  test('decorateOnceDirectly', function() {
38    var testElement = document.createElement('div');
39    ui.decorate(testElement, TestElement);
40    assertEquals(1, testElement.decorateCallCount);
41  });
42
43  test('toString', function() {
44    assertEquals('div', Base.toString());
45
46    var Sub = ui.define('Sub', Base);
47    assertEquals('div::sub', Sub.toString());
48
49    var SubSub = ui.define('Marine', Sub);
50    assertEquals('div::sub::marine', SubSub.toString());
51  });
52
53  test('basicDefines', function() {
54    var baseInstance = new Base();
55    assertTrue(baseInstance instanceof Base);
56    assertTrue(baseInstance.decoratedAsBase);
57
58    baseInstance.basePropertySet = 7;
59    assertEquals(7, baseInstance.basePropertySet);
60  });
61
62  test('subclassing', function() {
63    var Sub = ui.define('Sub', Base);
64    Sub.prototype = {
65      __proto__: Base.prototype,
66      decorate: function() {
67        this.decoratedAsSub = true;
68      }
69    };
70
71    var subInstance = new Sub();
72    assertTrue(subInstance instanceof Sub);
73    assertTrue(subInstance.decoratedAsSub);
74
75    assertTrue(subInstance instanceof Base);
76    assertFalse(subInstance.decoratedAsBase);
77
78    subInstance.baseProperty = true;
79    assertTrue(subInstance.basePropertySet);
80  });
81
82  var NoArgs = ui.define('div');
83  NoArgs.prototype = {
84    __proto__: HTMLDivElement.prototype,
85    decorate: function() {
86      this.noArgsDecorated_ = true;
87    },
88    get noArgsDecorated() {
89      return this.noArgsDecorated_;
90    }
91  };
92
93  var Args = ui.define('args', NoArgs);
94  Args.prototype = {
95    __proto__: NoArgs.prototype,
96    decorate: function(first) {
97      this.first_ = first;
98      this.argsDecorated_ = true;
99    },
100    get first() {
101      return this.first_;
102    },
103    get argsDecorated() {
104      return this.argsDecorated_;
105    }
106  };
107
108  var ArgsChild = ui.define('child', Args);
109  ArgsChild.prototype = {
110    __proto__: Args.prototype,
111    decorate: function(_, second) {
112      this.second_ = second;
113      this.argsChildDecorated_ = true;
114    },
115    get second() {
116      return this.second_;
117    },
118    get decorated() {
119      return this.decorated_;
120    },
121    get argsChildDecorated() {
122      return this.argsChildDecorated_ = true;
123    }
124  };
125
126  var ArgsDecoratingChild = ui.define('child', Args);
127  ArgsDecoratingChild.prototype = {
128    __proto__: Args.prototype,
129    decorate: function(first, second) {
130      Args.prototype.decorate.call(this, first);
131      this.second_ = second;
132      this.argsDecoratingChildDecorated_ = true;
133    },
134    get second() {
135      return this.second_;
136    },
137    get decorated() {
138      return this.decorated_;
139    },
140    get argsDecoratingChildDecorated() {
141      return this.argsChildDecorated_ = true;
142    }
143  };
144
145  test('decorate_noArguments', function() {
146    var noArgs;
147    assertDoesNotThrow(function() {
148      noArgs = new NoArgs();
149    });
150    assertTrue(noArgs.noArgsDecorated);
151  });
152
153  test('decorate_arguments', function() {
154    var args = new Args('this is first');
155    assertEquals('this is first', args.first);
156    assertTrue(args.argsDecorated);
157    assertFalse(args.noArgsDecorated);
158  });
159
160  test('decorate_subclassArguments', function() {
161    var argsChild = new ArgsChild('this is first', 'and second');
162    assertUndefined(argsChild.first);
163    assertEquals('and second', argsChild.second);
164
165    assertTrue(argsChild.argsChildDecorated);
166    assertFalse(argsChild.argsDecorated);
167    assertFalse(argsChild.noArgsDecorated);
168  });
169
170  test('decorate_subClassCallsParentDecorate', function() {
171    var argsDecoratingChild = new ArgsDecoratingChild(
172        'this is first', 'and second');
173    assertEquals('this is first', argsDecoratingChild.first);
174    assertEquals('and second', argsDecoratingChild.second);
175    assertTrue(argsDecoratingChild.argsDecoratingChildDecorated);
176    assertTrue(argsDecoratingChild.argsDecorated);
177    assertFalse(argsDecoratingChild.noArgsDecorated);
178  });
179});
180