sproutcore 0.9.1 → 0.9.2
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +233 -0
- data/Manifest.txt +67 -34
- data/bin/sc-build +12 -1
- data/bin/sc-gen +1 -1
- data/bin/sproutcore +14 -0
- data/clients/sc_docs/controllers/docs.js +38 -8
- data/clients/sc_docs/english.lproj/body.css +80 -127
- data/clients/sc_docs/english.lproj/body.rhtml +43 -23
- data/clients/sc_docs/english.lproj/no_docs.rhtml +2 -1
- data/clients/sc_docs/english.lproj/tabs.rhtml +16 -0
- data/clients/sc_docs/main.js +14 -9
- data/clients/sc_docs/models/doc.js +1 -1
- data/clients/sc_docs/tests/controllers/docs.rhtml +1 -2
- data/clients/sc_docs/tests/models/doc.rhtml +1 -2
- data/clients/sc_docs/tests/views/doc_frame.rhtml +1 -2
- data/clients/sc_docs/tests/views/doc_label_view.rhtml +1 -2
- data/clients/sc_docs/views/doc_frame.js +1 -1
- data/clients/sc_test_runner/controllers/runner.js +31 -8
- data/clients/sc_test_runner/english.lproj/body.css +62 -122
- data/clients/sc_test_runner/english.lproj/body.rhtml +62 -26
- data/clients/sc_test_runner/main.js +1 -6
- data/clients/sc_test_runner/models/test.js +14 -1
- data/clients/sc_test_runner/views/runner_frame.js +4 -2
- data/clients/view_builder/builders/builder.js +339 -0
- data/clients/view_builder/builders/button.js +81 -0
- data/clients/view_builder/controllers/document.js +21 -0
- data/clients/view_builder/core.js +19 -0
- data/clients/view_builder/english.lproj/body.css +77 -0
- data/clients/view_builder/english.lproj/body.rhtml +41 -0
- data/clients/{sc_docs → view_builder}/english.lproj/controls.css +0 -0
- data/clients/view_builder/english.lproj/strings.js +14 -0
- data/clients/view_builder/main.js +38 -0
- data/clients/view_builder/tests/controllers/document.rhtml +20 -0
- data/clients/view_builder/tests/views/builder.rhtml +20 -0
- data/clients/view_builder/views/builder.js +23 -0
- data/frameworks/prototype/prototype.js +1 -1
- data/frameworks/sproutcore/Core.js +32 -7
- data/frameworks/sproutcore/README +1 -1
- data/frameworks/sproutcore/animation/animation.js +411 -0
- data/frameworks/sproutcore/controllers/array.js +17 -9
- data/frameworks/sproutcore/controllers/collection.js +9 -110
- data/frameworks/sproutcore/controllers/controller.js +1 -1
- data/frameworks/sproutcore/controllers/object.js +2 -1
- data/frameworks/sproutcore/drag/drag.js +267 -56
- data/frameworks/sproutcore/drag/drag_data_source.js +24 -16
- data/frameworks/sproutcore/drag/drag_source.js +53 -42
- data/frameworks/sproutcore/drag/drop_target.js +2 -2
- data/frameworks/sproutcore/english.lproj/buttons.css +337 -236
- data/frameworks/sproutcore/english.lproj/core.css +115 -0
- data/frameworks/sproutcore/english.lproj/icons.css +227 -0
- data/{clients/sc_docs → frameworks/sproutcore}/english.lproj/images/indicator.gif +0 -0
- data/frameworks/sproutcore/english.lproj/images/sc-theme-sprite.png +0 -0
- data/frameworks/sproutcore/english.lproj/images/sc-theme-ysprite.png +0 -0
- data/frameworks/sproutcore/english.lproj/images/shared-icons.png +0 -0
- data/frameworks/sproutcore/english.lproj/menu.css +1 -1
- data/frameworks/sproutcore/english.lproj/strings.js +1 -1
- data/frameworks/sproutcore/english.lproj/theme.css +405 -31
- data/frameworks/sproutcore/foundation/application.js +15 -11
- data/frameworks/sproutcore/foundation/benchmark.js +1 -1
- data/frameworks/sproutcore/foundation/binding.js +2 -2
- data/frameworks/sproutcore/foundation/date.js +1 -1
- data/frameworks/sproutcore/foundation/error.js +1 -1
- data/frameworks/sproutcore/foundation/input_manager.js +32 -21
- data/frameworks/sproutcore/foundation/mock.js +1 -1
- data/frameworks/sproutcore/foundation/node_descriptor.js +9 -6
- data/frameworks/sproutcore/foundation/object.js +249 -177
- data/frameworks/sproutcore/foundation/page.js +5 -2
- data/frameworks/sproutcore/foundation/path_module.js +11 -10
- data/frameworks/sproutcore/foundation/responder.js +5 -2
- data/frameworks/sproutcore/foundation/routes.js +17 -13
- data/frameworks/sproutcore/foundation/run_loop.js +249 -11
- data/frameworks/sproutcore/foundation/server.js +1 -1
- data/frameworks/sproutcore/foundation/set.js +3 -3
- data/frameworks/sproutcore/foundation/string.js +5 -3
- data/frameworks/sproutcore/foundation/timer.js +371 -0
- data/frameworks/sproutcore/foundation/undo_manager.js +1 -1
- data/frameworks/sproutcore/foundation/unittest.js +3 -3
- data/frameworks/sproutcore/foundation/utils.js +161 -2
- data/frameworks/sproutcore/globals/panels.js +1 -1
- data/frameworks/sproutcore/globals/popups.js +4 -3
- data/frameworks/sproutcore/globals/window.js +44 -4
- data/frameworks/sproutcore/lib/button_views.rb +328 -0
- data/frameworks/sproutcore/lib/collection_view.rb +80 -0
- data/frameworks/sproutcore/lib/core_views.rb +281 -0
- data/frameworks/sproutcore/lib/form_views.rb +253 -0
- data/frameworks/sproutcore/lib/index.rhtml +2 -0
- data/frameworks/sproutcore/lib/menu_views.rb +88 -0
- data/frameworks/sproutcore/{foundation → mixins}/array.js +60 -29
- data/frameworks/sproutcore/mixins/control.js +265 -0
- data/frameworks/sproutcore/mixins/delegate_support.js +66 -0
- data/frameworks/sproutcore/{foundation → mixins}/observable.js +176 -6
- data/frameworks/sproutcore/mixins/scrollable.js +245 -0
- data/frameworks/sproutcore/mixins/selection_support.js +148 -0
- data/frameworks/sproutcore/mixins/validatable.js +152 -0
- data/frameworks/sproutcore/models/collection.js +5 -5
- data/frameworks/sproutcore/models/record.js +1 -1
- data/frameworks/sproutcore/models/store.js +1 -1
- data/frameworks/sproutcore/panes/dialog.js +1 -1
- data/frameworks/sproutcore/panes/manager.js +1 -1
- data/frameworks/sproutcore/panes/menu.js +1 -1
- data/frameworks/sproutcore/panes/overlay.js +2 -2
- data/frameworks/sproutcore/panes/panel.js +1 -1
- data/frameworks/sproutcore/panes/picker.js +1 -1
- data/frameworks/sproutcore/tests/controllers/array.rhtml +44 -4
- data/frameworks/sproutcore/tests/foundation/timer/invalidate.rhtml +33 -0
- data/frameworks/sproutcore/tests/foundation/timer/invokeLater.rhtml +145 -0
- data/frameworks/sproutcore/tests/foundation/timer/isPaused.rhtml +70 -0
- data/frameworks/sproutcore/tests/foundation/timer/schedule.rhtml +145 -0
- data/frameworks/sproutcore/tests/views/{scroll.rhtml → checkbox.rhtml} +3 -3
- data/frameworks/sproutcore/tests/views/{collection.rhtml → collection/base.rhtml} +33 -32
- data/frameworks/sproutcore/tests/views/collection/incremental_rendering.rhtml +260 -0
- data/frameworks/sproutcore/tests/views/image_cell.rhtml +19 -0
- data/frameworks/sproutcore/tests/views/label_item.rhtml +2 -4
- data/frameworks/sproutcore/tests/views/list.rhtml +2 -3
- data/frameworks/sproutcore/tests/views/list_item.rhtml +20 -0
- data/frameworks/sproutcore/tests/views/slider.rhtml +20 -0
- data/frameworks/sproutcore/tests/views/text_cell.rhtml +19 -0
- data/frameworks/sproutcore/tests/views/view/clippingFrame.rhtml +395 -0
- data/frameworks/sproutcore/tests/views/view/frame.rhtml +353 -0
- data/frameworks/sproutcore/tests/views/view/innerFrame.rhtml +347 -0
- data/frameworks/sproutcore/tests/views/view/isVisibleInWindow.rhtml +148 -0
- data/frameworks/sproutcore/tests/views/view/scrollFrame.rhtml +468 -0
- data/frameworks/sproutcore/validators/credit_card.js +33 -13
- data/frameworks/sproutcore/validators/date.js +26 -6
- data/frameworks/sproutcore/validators/email.js +21 -3
- data/frameworks/sproutcore/validators/not_empty.js +11 -1
- data/frameworks/sproutcore/validators/number.js +18 -4
- data/frameworks/sproutcore/validators/password.js +12 -1
- data/frameworks/sproutcore/validators/validator.js +204 -194
- data/frameworks/sproutcore/views/{button.js → button/button.js} +96 -94
- data/frameworks/sproutcore/views/button/checkbox.js +29 -0
- data/frameworks/sproutcore/views/button/disclosure.js +42 -0
- data/frameworks/sproutcore/views/button/radio.js +29 -0
- data/frameworks/sproutcore/views/{collection.js → collection/collection.js} +1373 -1024
- data/frameworks/sproutcore/views/collection/grid.js +124 -46
- data/frameworks/sproutcore/views/collection/image_cell.js +17 -46
- data/frameworks/sproutcore/views/collection/list.js +45 -35
- data/frameworks/sproutcore/views/collection/source_list.js +386 -0
- data/frameworks/sproutcore/views/collection/table.js +118 -0
- data/frameworks/sproutcore/views/container.js +7 -2
- data/frameworks/sproutcore/views/error_explanation.js +23 -10
- data/frameworks/sproutcore/views/{checkbox_field.js → field/checkbox_field.js} +16 -6
- data/frameworks/sproutcore/views/field/field.js +219 -0
- data/frameworks/sproutcore/views/{radio_field.js → field/radio_field.js} +27 -12
- data/frameworks/sproutcore/views/{select_field.js → field/select_field.js} +116 -90
- data/frameworks/sproutcore/views/{text_field.js → field/text_field.js} +57 -8
- data/frameworks/sproutcore/views/{textarea_field.js → field/textarea_field.js} +13 -3
- data/frameworks/sproutcore/views/filter_button.js +2 -2
- data/frameworks/sproutcore/views/form.js +3 -3
- data/frameworks/sproutcore/views/image.js +128 -21
- data/frameworks/sproutcore/views/inline_text_editor.js +1 -1
- data/frameworks/sproutcore/views/label.js +149 -92
- data/frameworks/sproutcore/views/list_item.js +225 -0
- data/frameworks/sproutcore/views/menu_item.js +10 -4
- data/frameworks/sproutcore/views/pagination.js +11 -4
- data/frameworks/sproutcore/views/popup_button.js +25 -21
- data/frameworks/sproutcore/views/popup_menu.js +10 -4
- data/frameworks/sproutcore/views/progress.js +29 -16
- data/frameworks/sproutcore/views/radio_group.js +1 -1
- data/frameworks/sproutcore/views/scroll.js +60 -20
- data/frameworks/sproutcore/views/segmented.js +1 -1
- data/frameworks/sproutcore/views/slider.js +132 -0
- data/frameworks/sproutcore/views/source_list_group.js +130 -0
- data/frameworks/sproutcore/views/spinner.js +1 -1
- data/frameworks/sproutcore/views/split.js +292 -0
- data/frameworks/sproutcore/views/split_divider.js +109 -0
- data/frameworks/sproutcore/views/tab.js +1 -1
- data/frameworks/sproutcore/views/toolbar.js +1 -1
- data/frameworks/sproutcore/views/view.js +1272 -591
- data/generators/client/templates/english.lproj/body.css +1 -1
- data/generators/controller/controller_generator.rb +1 -1
- data/generators/controller/templates/test.rhtml +2 -1
- data/generators/model/templates/test.rhtml +1 -1
- data/generators/test/templates/test.rhtml +1 -1
- data/generators/view/templates/test.rhtml +1 -1
- data/jsdoc/templates/sproutcore/class.tmpl +241 -338
- data/jsdoc/templates/sproutcore/default.css +105 -155
- data/jsdoc/templates/sproutcore/index.tmpl +43 -8
- data/jsdoc/templates/sproutcore/publish.js +9 -4
- data/lib/sproutcore/build_tools/html_builder.rb +29 -13
- data/lib/sproutcore/build_tools/resource_builder.rb +1 -1
- data/lib/sproutcore/bundle.rb +86 -25
- data/lib/sproutcore/jsdoc.rb +2 -0
- data/lib/sproutcore/version.rb +1 -1
- data/lib/sproutcore/view_helpers.rb +36 -3
- data/tasks/deployment.rake +1 -1
- metadata +69 -36
- data/clients/sc_docs/english.lproj/icons/small/next.png +0 -0
- data/clients/sc_docs/english.lproj/icons/small/reset.png +0 -0
- data/clients/sc_docs/english.lproj/images/gradients.png +0 -0
- data/clients/sc_docs/english.lproj/images/toolbar.png +0 -0
- data/clients/sc_docs/english.lproj/warning.rhtml +0 -6
- data/clients/sc_test_runner/english.lproj/warning.rhtml +0 -6
- data/frameworks/sproutcore/english.lproj/buttons.png +0 -0
- data/frameworks/sproutcore/english.lproj/collections.css +0 -82
- data/frameworks/sproutcore/english.lproj/images/buttons-sprite.png +0 -0
- data/frameworks/sproutcore/views/collection/collection_item.js +0 -36
- data/frameworks/sproutcore/views/collection/text_cell.js +0 -128
- data/frameworks/sproutcore/views/field.js +0 -214
- data/frameworks/sproutcore/views/workspace.js +0 -170
- data/generators/client/templates/english.lproj/controls.css +0 -0
- data/generators/framework/templates/english.lproj/body.css +0 -0
- data/generators/framework/templates/english.lproj/body.rhtml +0 -3
- data/generators/framework/templates/english.lproj/controls.css +0 -0
- data/lib/sproutcore/view_helpers/button_views.rb +0 -302
- data/lib/sproutcore/view_helpers/core_views.rb +0 -292
- data/lib/sproutcore/view_helpers/form_views.rb +0 -258
- data/lib/sproutcore/view_helpers/menu_views.rb +0 -94
@@ -0,0 +1,33 @@
|
|
1
|
+
<% content_for('final') do %>
|
2
|
+
|
3
|
+
<script>
|
4
|
+
|
5
|
+
Test.context("Timer.invalidate", {
|
6
|
+
|
7
|
+
"invalidate immediately should never execute": function() {
|
8
|
+
|
9
|
+
var fired = NO ;
|
10
|
+
|
11
|
+
SC.runLoop.beginRunLoop() ;
|
12
|
+
var start = SC.runLoop.get('startTime') ;
|
13
|
+
var t = SC.Timer.schedule({
|
14
|
+
target: this,
|
15
|
+
action: function() { fired = YES ; },
|
16
|
+
interval: 100
|
17
|
+
});
|
18
|
+
t.invalidate() ;
|
19
|
+
SC.runLoop.endRunLoop() ;
|
20
|
+
|
21
|
+
var checks = 10 ;
|
22
|
+
wait(1500, function() {
|
23
|
+
assertEqual(NO, fired) ;
|
24
|
+
}) ;
|
25
|
+
}
|
26
|
+
|
27
|
+
// using invalidate on a repeating timer is tested in schedule().
|
28
|
+
|
29
|
+
});
|
30
|
+
|
31
|
+
</script>
|
32
|
+
|
33
|
+
<% end %>
|
@@ -0,0 +1,145 @@
|
|
1
|
+
<% content_for('final') do %>
|
2
|
+
|
3
|
+
<script>
|
4
|
+
|
5
|
+
Test.context("SC.Object.invokeLater", {
|
6
|
+
|
7
|
+
"should invoke method string after specified time": function() {
|
8
|
+
var fired = NO ;
|
9
|
+
var o = SC.Object.create({
|
10
|
+
func: function() { fired = YES; }
|
11
|
+
}) ;
|
12
|
+
o.invokeLater('func', 200) ;
|
13
|
+
|
14
|
+
var tries = 20;
|
15
|
+
var f= function() {
|
16
|
+
if (!fired && --tries >= 0) wait(100, f) ;
|
17
|
+
assertEqual(YES, fired, 'did not fire') ;
|
18
|
+
} ;
|
19
|
+
wait(300, f) ;
|
20
|
+
},
|
21
|
+
|
22
|
+
"should invoke method instance after specified time": function() {
|
23
|
+
var fired = NO ;
|
24
|
+
var o = SC.Object.create({
|
25
|
+
func: function() { fired = YES; }
|
26
|
+
}) ;
|
27
|
+
o.invokeLater(o.func, 200) ;
|
28
|
+
|
29
|
+
var tries = 20;
|
30
|
+
var f= function() {
|
31
|
+
if (!fired && --tries >= 0) wait(100, f) ;
|
32
|
+
assertEqual(YES, fired, 'did not fire') ;
|
33
|
+
} ;
|
34
|
+
wait(300, f) ;
|
35
|
+
},
|
36
|
+
|
37
|
+
"should invoke method string immediately if no time passed": function() {
|
38
|
+
var fired = NO ;
|
39
|
+
var o = SC.Object.create({
|
40
|
+
func: function() { fired = YES; }
|
41
|
+
}) ;
|
42
|
+
o.invokeLater('func') ;
|
43
|
+
|
44
|
+
var tries = 20;
|
45
|
+
var f= function() {
|
46
|
+
if (!fired && --tries >= 0) wait(100, f) ;
|
47
|
+
assertEqual(YES, fired, 'did not fire') ;
|
48
|
+
} ;
|
49
|
+
wait(300, f) ;
|
50
|
+
},
|
51
|
+
|
52
|
+
"should automatically bind with arguments if passed": function() {
|
53
|
+
var fired = NO ;
|
54
|
+
var g1 = null, g2 = null ;
|
55
|
+
|
56
|
+
var o = SC.Object.create({
|
57
|
+
func: function(arg1, arg2) {
|
58
|
+
g1 = arg1; g2 = arg2; fired = YES;
|
59
|
+
}
|
60
|
+
}) ;
|
61
|
+
o.invokeLater('func', 200, 'ARG1', 'ARG2') ;
|
62
|
+
|
63
|
+
var tries = 20;
|
64
|
+
var f= function() {
|
65
|
+
if (!fired && --tries >= 0) wait(100, f) ;
|
66
|
+
assertEqual(YES, fired, 'did not fire') ;
|
67
|
+
assertEqual('ARG1', g1, 'arg1');
|
68
|
+
assertEqual('ARG2', g2, 'arg2');
|
69
|
+
} ;
|
70
|
+
wait(300, f) ;
|
71
|
+
}
|
72
|
+
|
73
|
+
});
|
74
|
+
|
75
|
+
Test.context("Prototype.invokeLater", {
|
76
|
+
|
77
|
+
"should invoke function with target after specified time": function() {
|
78
|
+
var fired = NO ;
|
79
|
+
var target = null;
|
80
|
+
var o = SC.Object.create() ;
|
81
|
+
var func = function() { fired = YES; target = this; } ;
|
82
|
+
func.invokeLater(o, 200) ;
|
83
|
+
|
84
|
+
var tries = 20;
|
85
|
+
var f= function() {
|
86
|
+
if (!fired && --tries >= 0) wait(100, f) ;
|
87
|
+
assertEqual(YES, fired, 'did not fire') ;
|
88
|
+
assertEqual(o, target, 'target') ;
|
89
|
+
} ;
|
90
|
+
wait(300, f) ;
|
91
|
+
},
|
92
|
+
|
93
|
+
"should invoke object with no target after specified time": function() {
|
94
|
+
var fired = NO ;
|
95
|
+
var func = function() { fired = YES; } ;
|
96
|
+
func.invokeLater(null, 200) ;
|
97
|
+
|
98
|
+
var tries = 20;
|
99
|
+
var f= function() {
|
100
|
+
if (!fired && --tries >= 0) wait(100, f) ;
|
101
|
+
assertEqual(YES, fired, 'did not fire') ;
|
102
|
+
} ;
|
103
|
+
wait(300, f) ;
|
104
|
+
},
|
105
|
+
|
106
|
+
"should invoke function immediately if no time passed": function() {
|
107
|
+
var fired = NO ;
|
108
|
+
var o = SC.Object.create() ;
|
109
|
+
var func = function() { fired = YES; } ;
|
110
|
+
func.invokeLater(o) ;
|
111
|
+
|
112
|
+
var tries = 20;
|
113
|
+
var f= function() {
|
114
|
+
if (!fired && --tries >= 0) wait(100, f) ;
|
115
|
+
assertEqual(YES, fired, 'did not fire') ;
|
116
|
+
} ;
|
117
|
+
wait(300, f) ;
|
118
|
+
},
|
119
|
+
|
120
|
+
"should automatically bind with arguments if passed": function() {
|
121
|
+
var fired = NO ;
|
122
|
+
var g1 = null, g2 = null ;
|
123
|
+
|
124
|
+
var o = SC.Object.create() ;
|
125
|
+
var func = function(arg1, arg2) {
|
126
|
+
g1 = arg1; g2 = arg2; fired = YES;
|
127
|
+
} ;
|
128
|
+
func.invokeLater(o, 200, 'ARG1', 'ARG2') ;
|
129
|
+
|
130
|
+
var tries = 20;
|
131
|
+
var f= function() {
|
132
|
+
if (!fired && --tries >= 0) wait(100, f) ;
|
133
|
+
assertEqual(YES, fired, 'did not fire') ;
|
134
|
+
assertEqual('ARG1', g1, 'arg1');
|
135
|
+
assertEqual('ARG2', g2, 'arg2');
|
136
|
+
} ;
|
137
|
+
wait(300, f) ;
|
138
|
+
}
|
139
|
+
|
140
|
+
|
141
|
+
});
|
142
|
+
|
143
|
+
</script>
|
144
|
+
|
145
|
+
<% end %>
|
@@ -0,0 +1,70 @@
|
|
1
|
+
<% content_for('final') do %>
|
2
|
+
|
3
|
+
<script>
|
4
|
+
|
5
|
+
Test.context("Timer.isPaused", {
|
6
|
+
|
7
|
+
"setting isPaused should stop firing": function() {
|
8
|
+
|
9
|
+
var firedCount = 0 ;
|
10
|
+
|
11
|
+
SC.runLoop.beginRunLoop() ;
|
12
|
+
var start = SC.runLoop.get('startTime') ;
|
13
|
+
var t = SC.Timer.schedule({
|
14
|
+
target: this,
|
15
|
+
action: function() { firedCount++ ; },
|
16
|
+
interval: 100,
|
17
|
+
repeats: YES
|
18
|
+
});
|
19
|
+
SC.runLoop.endRunLoop() ;
|
20
|
+
|
21
|
+
// wait for timer to fire twice, then pause it.
|
22
|
+
var tries1 = 10 ;
|
23
|
+
var f1 = function() {
|
24
|
+
if(firedCount<2) {
|
25
|
+
if (--tries1 >= 0) {
|
26
|
+
wait(100, f1) ;
|
27
|
+
} else assertEqual(NO, YES, 'Timer never fired 2 times - f1') ;
|
28
|
+
} else {
|
29
|
+
assertEqual(NO, t.get('isPaused'), 'should start with isPaused = NO');
|
30
|
+
t.set('isPaused', YES) ;
|
31
|
+
firedCount = 0 ; // Reset count here.
|
32
|
+
wait(300, f2) ;
|
33
|
+
}
|
34
|
+
};
|
35
|
+
|
36
|
+
// once timer paused, make sure it did not fire again.
|
37
|
+
var f2 = function() {
|
38
|
+
assertEqual(0, firedCount, 'timer kept firing!') ;
|
39
|
+
assertEqual(YES, t.get('isPaused'), 'timer is not paused') ;
|
40
|
+
t.set('isPaused', NO) ;
|
41
|
+
|
42
|
+
wait(300, f3) ;
|
43
|
+
} ;
|
44
|
+
|
45
|
+
// once timer has verified paused, unpause and make sure it fires again.
|
46
|
+
var tries2 = 10 ;
|
47
|
+
var f3 = function() {
|
48
|
+
if (firedCount <= 2) {
|
49
|
+
if (--tries1 >= 0) {
|
50
|
+
wait(100, f3) ;
|
51
|
+
} else assertEqual(NO, YES, "Timer did not resume") ;
|
52
|
+
|
53
|
+
// timer fired, clean up.
|
54
|
+
} else {
|
55
|
+
t.invalidate() ;
|
56
|
+
assertEqual(NO, t.get('isPaused'), 'timer did not unpause') ;
|
57
|
+
}
|
58
|
+
};
|
59
|
+
|
60
|
+
wait(300, f1) ;
|
61
|
+
|
62
|
+
}
|
63
|
+
|
64
|
+
// using invalidate on a repeating timer is tested in schedule().
|
65
|
+
|
66
|
+
});
|
67
|
+
|
68
|
+
</script>
|
69
|
+
|
70
|
+
<% end %>
|
@@ -0,0 +1,145 @@
|
|
1
|
+
<% content_for('final') do %>
|
2
|
+
|
3
|
+
<script>
|
4
|
+
|
5
|
+
Test.context("Timer.schedule single timer", {
|
6
|
+
|
7
|
+
"single timer should execute once and invalidate": function() {
|
8
|
+
var fired = [] ;
|
9
|
+
|
10
|
+
SC.runLoop.beginRunLoop() ;
|
11
|
+
var start = SC.runLoop.get('startTime') ;
|
12
|
+
var t = SC.Timer.schedule({
|
13
|
+
target: this,
|
14
|
+
action: function() { fired.push(Date.now()); },
|
15
|
+
interval: 100,
|
16
|
+
repeats: NO
|
17
|
+
});
|
18
|
+
SC.runLoop.endRunLoop() ;
|
19
|
+
|
20
|
+
var checks = 10 ;
|
21
|
+
var f = function() {
|
22
|
+
|
23
|
+
if (fired.length == 0 && --checks > 0) {
|
24
|
+
wait(100, f); return ;
|
25
|
+
}
|
26
|
+
|
27
|
+
// should only fire once
|
28
|
+
assertEqual(1, fired.length, 'fired count') ;
|
29
|
+
|
30
|
+
// timer should no longer be valid
|
31
|
+
assertEqual(NO, t.get('isValid'), 'isValid');
|
32
|
+
|
33
|
+
} ;
|
34
|
+
|
35
|
+
wait(300, f);
|
36
|
+
},
|
37
|
+
|
38
|
+
"repeating timer with no limit should repeat until terminated": function() {
|
39
|
+
var fired = [] ;
|
40
|
+
|
41
|
+
// schedule repeating timer
|
42
|
+
SC.runLoop.beginRunLoop() ;
|
43
|
+
var start = SC.runLoop.get('startTime') ;
|
44
|
+
var runs = 4 ;
|
45
|
+
|
46
|
+
var t = SC.Timer.schedule({
|
47
|
+
target: this,
|
48
|
+
action: function() {
|
49
|
+
fired.push(Date.now());
|
50
|
+
if (--runs <= 0) t.invalidate();
|
51
|
+
},
|
52
|
+
interval: 100,
|
53
|
+
repeats: YES
|
54
|
+
});
|
55
|
+
SC.runLoop.endRunLoop() ;
|
56
|
+
|
57
|
+
// We can't gaurantee when timeouts will execute in the browser so we
|
58
|
+
// have to be a little flexible about testing repeated loops like this.
|
59
|
+
var checks = 10 ;
|
60
|
+
var f = function() {
|
61
|
+
|
62
|
+
if (--checks < 0) assertEqual(YES, NO, 'Check Count Exceeded') ;
|
63
|
+
if (runs > 0) {
|
64
|
+
wait(100, f) ; // wait until timer fires 4 times.
|
65
|
+
} else {
|
66
|
+
var diffs = fired.map(function(x) { return x - start; });
|
67
|
+
assertEqual(4, fired.length, 'fired count: %@'.fmt(diffs.join(', '))) ;
|
68
|
+
assertEqual(NO, t.get('isValid'), 'isValid') ;
|
69
|
+
}
|
70
|
+
};
|
71
|
+
wait(600, f);
|
72
|
+
|
73
|
+
},
|
74
|
+
|
75
|
+
"repeating timer should terminate after expiration": function() {
|
76
|
+
var fired = [] ;
|
77
|
+
|
78
|
+
// schedule repeating timer
|
79
|
+
SC.runLoop.beginRunLoop() ;
|
80
|
+
var start = SC.runLoop.get('startTime') ;
|
81
|
+
var runs = 4 ;
|
82
|
+
|
83
|
+
var t = SC.Timer.schedule({
|
84
|
+
target: this,
|
85
|
+
action: function() {
|
86
|
+
fired.push(Date.now());
|
87
|
+
},
|
88
|
+
interval: 100,
|
89
|
+
repeats: YES,
|
90
|
+
until: start + 500
|
91
|
+
});
|
92
|
+
SC.runLoop.endRunLoop() ;
|
93
|
+
|
94
|
+
// We can't gaurantee when timeouts will execute in the browser so we
|
95
|
+
// have to be a little flexible about testing repeated loops like this.
|
96
|
+
var checks = 10 ;
|
97
|
+
var f = function() {
|
98
|
+
if (--checks < 0) assertEqual(YES, NO, 'Timer never invalidated :') ;
|
99
|
+
if ((checks > 0) && t.get('isValid')) {
|
100
|
+
wait(100, f);
|
101
|
+
} else {
|
102
|
+
var diffs = fired.map(function(x) { return x - start; });
|
103
|
+
assertEqual(NO, t.get('isValid'), 'Timer did not terminate: %@'.fmt(diffs.join(', '))) ;
|
104
|
+
}
|
105
|
+
};
|
106
|
+
wait(600, f);
|
107
|
+
},
|
108
|
+
|
109
|
+
"scheduling multiple timers at the same time should cause them to fire at same time": function() {
|
110
|
+
|
111
|
+
var f1 = 0; var f2 = 0;
|
112
|
+
SC.runLoop.beginRunLoop() ;
|
113
|
+
var start = SC.runLoop.get('startTime') ;
|
114
|
+
|
115
|
+
var t1 = SC.Timer.schedule({
|
116
|
+
target: this,
|
117
|
+
action: function() { f1 = SC.runLoop.get('startTime'); },
|
118
|
+
interval: 100
|
119
|
+
});
|
120
|
+
|
121
|
+
var t2 = SC.Timer.schedule({
|
122
|
+
target: this,
|
123
|
+
action: function() { f2 = SC.runLoop.get('startTime'); },
|
124
|
+
interval: 100
|
125
|
+
});
|
126
|
+
|
127
|
+
// be lenient on execution time since we can't control the browser.
|
128
|
+
var tries = 10 ;
|
129
|
+
var f = function() {
|
130
|
+
if ((f1 == 0 || f2 == 0) && --tries >= 0) {
|
131
|
+
wait(100, f) ; return ;
|
132
|
+
}
|
133
|
+
|
134
|
+
assertEqual(f1, f2, 'execution time f1 == f2');
|
135
|
+
assertEqual(NO, t1.get('isValid'), 't1.isValid') ;
|
136
|
+
assertEqual(NO, t2.get('isValid'), 't2.isValid') ;
|
137
|
+
} ;
|
138
|
+
wait(200, f) ;
|
139
|
+
}
|
140
|
+
|
141
|
+
});
|
142
|
+
|
143
|
+
</script>
|
144
|
+
|
145
|
+
<% end %>
|
@@ -1,12 +1,12 @@
|
|
1
1
|
<% # ========================================================================
|
2
|
-
#
|
2
|
+
# SC.CheckboxView Unit Test
|
3
3
|
# ========================================================================
|
4
4
|
%>
|
5
5
|
<% content_for('final') do %>
|
6
6
|
|
7
7
|
<script>
|
8
8
|
|
9
|
-
Test.context("
|
9
|
+
Test.context("SC.CheckboxView",{
|
10
10
|
|
11
11
|
"TODO: Add your own tests here": function() {
|
12
12
|
true.shouldEqual(true) ;
|
@@ -14,7 +14,7 @@ Test.context("Sproutcore.ScrollView",{
|
|
14
14
|
|
15
15
|
}) ;
|
16
16
|
|
17
|
-
appMain = main
|
17
|
+
if (window.main && (appMain = main)) main = null ;
|
18
18
|
|
19
19
|
</script>
|
20
20
|
|
@@ -3,38 +3,53 @@
|
|
3
3
|
|
4
4
|
Test.context("A SC.CollectionView with it's content set to a SC.CollectionController", {
|
5
5
|
|
6
|
-
"Should contain the same number of item views
|
6
|
+
"Should contain the same number of visible item views": function()
|
7
7
|
{
|
8
|
-
testCollectionView.get('itemViews').length.shouldEqual(
|
8
|
+
testCollectionView.get('itemViews').length.shouldEqual(2);
|
9
9
|
},
|
10
|
+
|
10
11
|
"Should update it's item views as it's controller is updated": function()
|
11
12
|
{
|
12
|
-
|
13
|
-
|
14
|
-
|
13
|
+
var valueOfFirstItemView = function() {
|
14
|
+
var itemView = testCollectionView.get('itemViews').first() ;
|
15
|
+
return (itemView) ? itemView.get('content').get('guid') : null ;
|
16
|
+
} ;
|
17
|
+
|
18
|
+
valueOfFirstItemView().shouldEqual('1001') ;
|
19
|
+
|
20
|
+
SC.Store.addRecord( SC.Record.create({ guid: '0999', name: 'item zero' }) );
|
21
|
+
|
22
|
+
valueOfFirstItemView().shouldEqual('0999') ;
|
15
23
|
},
|
24
|
+
|
16
25
|
"Should scroll to the selected item": function()
|
17
26
|
{
|
18
|
-
testCollection.get('records').length.shouldEqual(6);
|
19
27
|
testCollectionView.get('rootElement').scrollTop.shouldEqual(0);
|
20
|
-
testCollectionView.
|
21
|
-
|
28
|
+
testCollectionView.scrollToContent( testCollection.get('records').last() );
|
29
|
+
scrollView.get('rootElement').scrollTop.shouldEqual(30);
|
22
30
|
},
|
31
|
+
|
23
32
|
"Should not scroll to the selected item if it's already fully visible": function()
|
24
33
|
{
|
25
|
-
|
26
|
-
testCollectionView.get('
|
27
|
-
|
28
|
-
testCollectionView.get('rootElement').scrollTop.shouldEqual(0);
|
34
|
+
scrollView.get('rootElement').scrollTop.shouldEqual(0);
|
35
|
+
testCollectionView.scrollToContent( testCollection.get('records')[1] );
|
36
|
+
scrollView.get('rootElement').scrollTop.shouldEqual(0);
|
29
37
|
},
|
38
|
+
|
30
39
|
setup: function()
|
31
40
|
{
|
41
|
+
// add a scroll view wrapper.
|
42
|
+
scrollView = SC.ScrollView.create() ;
|
43
|
+
scrollView.set('frame', { x: 10, y: 10, width: 100, height: 30 });
|
44
|
+
SC.window.appendChild(scrollView);
|
45
|
+
|
32
46
|
// create the view...
|
33
|
-
testCollectionView = SC.
|
47
|
+
testCollectionView = SC.ListView.extend({
|
48
|
+
contentValueKey: 'name',
|
34
49
|
contentBinding: 'testController.arrangedObjects',
|
35
50
|
selectionBinding: 'testController.selection'
|
36
51
|
}).create();
|
37
|
-
|
52
|
+
scrollView.set('content', testCollectionView) ;
|
38
53
|
|
39
54
|
// create some item data...
|
40
55
|
[
|
@@ -54,36 +69,25 @@ Test.context("A SC.CollectionView with it's content set to a SC.CollectionContro
|
|
54
69
|
testController = SC.CollectionController.create();
|
55
70
|
testController.set('content', testCollection);
|
56
71
|
|
57
|
-
|
58
|
-
// make the view scrollable.
|
59
|
-
var element = Element.extend(testCollectionView.get('rootElement'));
|
60
|
-
element.setStyle({ overflow: 'auto', width: '100px', height: '30px' });
|
61
|
-
// set the item heights to force the collection to scroll
|
62
|
-
element.childElements().each(function(child)
|
63
|
-
{
|
64
|
-
child.setStyle({ height: '10px' });
|
65
|
-
});
|
66
72
|
},
|
67
73
|
teardown: function()
|
68
74
|
{
|
69
75
|
// tell SC.Store to dump all the records...
|
70
76
|
// otherwise, since SC.Store is shared across all tests (yuk!) we'll get shared fixtues
|
71
77
|
testCollection.get('records').each(function(r){ SC.Store.removeRecord(r); });
|
72
|
-
|
78
|
+
|
73
79
|
// remove the view from SC.window... again, no shared fixtures...
|
74
80
|
testCollectionView.removeFromParent();
|
75
|
-
|
81
|
+
scrollView.removeFromParent() ;
|
82
|
+
|
76
83
|
delete testCollectionView;
|
77
84
|
delete testCollection;
|
78
85
|
delete testController;
|
86
|
+
delete scrollView ;
|
79
87
|
}
|
80
88
|
|
81
89
|
});
|
82
90
|
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
91
|
Test.context("A SC.CollectionView with it's content set to a SC.ArrayController",
|
88
92
|
{
|
89
93
|
"Should contain the same number of item views as it's controller has records": function()
|
@@ -130,8 +134,5 @@ Test.context("A SC.CollectionView with it's content set to a SC.ArrayController"
|
|
130
134
|
}
|
131
135
|
});
|
132
136
|
|
133
|
-
|
134
|
-
|
135
|
-
|
136
137
|
</script>
|
137
138
|
<% end %>
|