sproutcore 1.5.0.pre.4 → 1.5.0.pre.4.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (174) hide show
  1. data/CHANGELOG +6 -0
  2. data/VERSION.yml +1 -1
  3. data/lib/Buildfile +1 -1
  4. data/lib/buildtasks/build.rake +14 -6
  5. data/lib/buildtasks/manifest.rake +171 -72
  6. data/lib/frameworks/sproutcore/Buildfile +3 -5
  7. data/lib/frameworks/sproutcore/CHANGELOG.md +9 -0
  8. data/lib/frameworks/sproutcore/apps/test_controls/resources/main_page.js +2 -1
  9. data/lib/frameworks/sproutcore/apps/test_controls/resources/progress_page.js +7 -17
  10. data/lib/frameworks/sproutcore/frameworks/bootstrap/system/browser.js +7 -1
  11. data/lib/frameworks/sproutcore/frameworks/bootstrap/system/loader.js +14 -1
  12. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/browser.js +0 -2
  13. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/event.js +1 -1
  14. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/root_responder.js +14 -3
  15. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/template/collection.js +1 -1
  16. data/lib/frameworks/sproutcore/frameworks/datastore/models/record.js +2 -2
  17. data/lib/frameworks/sproutcore/frameworks/datastore/models/record_attribute.js +6 -0
  18. data/lib/frameworks/sproutcore/frameworks/datastore/system/store.js +1 -1
  19. data/lib/frameworks/sproutcore/frameworks/desktop/mixins/scrollable.js +1 -1
  20. data/lib/frameworks/sproutcore/frameworks/desktop/panes/alert.js +49 -4
  21. data/lib/frameworks/sproutcore/frameworks/desktop/panes/menu.js +8 -0
  22. data/lib/frameworks/sproutcore/frameworks/desktop/panes/panel.js +46 -1
  23. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/button.js +32 -5
  24. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/checkbox.js +32 -6
  25. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/disclosure.js +31 -3
  26. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/progress.js +15 -3
  27. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/radio.js +28 -7
  28. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/segmented.js +1 -1
  29. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/slider.js +20 -1
  30. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/well.js +2 -4
  31. data/lib/frameworks/sproutcore/frameworks/desktop/tests/panes/alert/ui.js +40 -34
  32. data/lib/frameworks/sproutcore/frameworks/desktop/tests/panes/menu/ui.js +35 -0
  33. data/lib/frameworks/sproutcore/frameworks/desktop/tests/panes/panel/ui.js +43 -0
  34. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/button/ui.js +47 -0
  35. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/checkbox/methods.js +6 -16
  36. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/checkbox/ui.js +21 -0
  37. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/disclosure/ui.js +41 -1
  38. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/progress/ui.js +128 -0
  39. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/radio/ui.js +93 -3
  40. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/scroll/ui.js +13 -1
  41. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/scroller.js +28 -0
  42. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/segmented/methods.js +47 -0
  43. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/segmented/ui.js +51 -0
  44. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/toolbar/method.js +33 -0
  45. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/toolbar/ui.js +29 -0
  46. data/lib/frameworks/sproutcore/frameworks/desktop/views/checkbox.js +28 -0
  47. data/lib/frameworks/sproutcore/frameworks/desktop/views/disclosure.js +9 -1
  48. data/lib/frameworks/sproutcore/frameworks/desktop/views/list_item.js +148 -134
  49. data/lib/frameworks/sproutcore/frameworks/desktop/views/menu_item.js +18 -0
  50. data/lib/frameworks/sproutcore/frameworks/desktop/views/menu_scroll.js +30 -3
  51. data/lib/frameworks/sproutcore/frameworks/desktop/views/progress.js +9 -0
  52. data/lib/frameworks/sproutcore/frameworks/desktop/views/radio.js +52 -4
  53. data/lib/frameworks/sproutcore/frameworks/desktop/views/scroll.js +2 -1
  54. data/lib/frameworks/sproutcore/frameworks/desktop/views/scroller.js +36 -3
  55. data/lib/frameworks/sproutcore/frameworks/desktop/views/segmented.js +1 -1
  56. data/lib/frameworks/sproutcore/frameworks/desktop/views/slider.js +9 -1
  57. data/lib/frameworks/sproutcore/frameworks/desktop/views/split.js +15 -4
  58. data/lib/frameworks/sproutcore/frameworks/desktop/views/split_divider.js +1 -6
  59. data/lib/frameworks/sproutcore/frameworks/desktop/views/tab.js +4 -2
  60. data/lib/frameworks/sproutcore/frameworks/desktop/views/toolbar.js +7 -0
  61. data/lib/frameworks/sproutcore/frameworks/desktop/views/well.js +1 -2
  62. data/lib/frameworks/sproutcore/frameworks/forms/views/form.js +3 -1
  63. data/lib/frameworks/sproutcore/frameworks/foundation/english.lproj/bootstrap.rhtml +1 -1
  64. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/auto_resize.js +0 -9
  65. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/editable.js +1 -1
  66. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/flowed_layout.js +2 -0
  67. data/lib/frameworks/sproutcore/frameworks/foundation/render_delegates/canvas_image.js +1 -1
  68. data/lib/frameworks/sproutcore/frameworks/foundation/render_delegates/label.js +25 -1
  69. data/lib/frameworks/sproutcore/frameworks/foundation/system/chance.js +64 -0
  70. data/lib/frameworks/sproutcore/frameworks/foundation/system/module.js +34 -27
  71. data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/editable/ui.js +42 -0
  72. data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/inline_text_field/ui.js +62 -0
  73. data/lib/frameworks/sproutcore/frameworks/foundation/tests/views/image/ui.js +0 -8
  74. data/lib/frameworks/sproutcore/frameworks/foundation/tests/views/label/ui.js +12 -0
  75. data/lib/frameworks/sproutcore/frameworks/foundation/tests/views/text_field/ui.js +48 -1
  76. data/lib/frameworks/sproutcore/frameworks/foundation/views/field.js +19 -0
  77. data/lib/frameworks/sproutcore/frameworks/foundation/views/image.js +2 -0
  78. data/lib/frameworks/sproutcore/frameworks/foundation/views/label.js +11 -5
  79. data/lib/frameworks/sproutcore/frameworks/foundation/views/text_field.js +152 -74
  80. data/lib/frameworks/sproutcore/frameworks/runtime/private/observer_queue.js +12 -9
  81. data/lib/frameworks/sproutcore/frameworks/runtime/system/logger.js +1476 -176
  82. data/lib/frameworks/sproutcore/frameworks/runtime/system/run_loop.js +0 -2
  83. data/lib/frameworks/sproutcore/frameworks/runtime/tests/system/logger.js +227 -32
  84. data/lib/frameworks/sproutcore/frameworks/statechart/system/state.js +11 -11
  85. data/lib/frameworks/sproutcore/frameworks/statechart/system/statechart.js +1 -1
  86. data/lib/frameworks/sproutcore/frameworks/testing/system/runner.js +10 -0
  87. data/lib/frameworks/sproutcore/lib/index.rhtml +30 -8
  88. data/lib/frameworks/sproutcore/themes/ace/resources/segmented/18px/segmented.css +4 -4
  89. data/lib/frameworks/sproutcore/themes/ace/resources/segmented/24px/segmented.css +4 -4
  90. data/lib/frameworks/sproutcore/themes/ace/resources/segmented/30px/segmented.css +4 -4
  91. data/lib/frameworks/sproutcore/themes/ace/resources/segmented/44px/segmented.css +4 -4
  92. data/lib/frameworks/sproutcore/themes/ace/resources/segmented/segmented.css +4 -0
  93. data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/slider.css +5 -1
  94. data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/slider.js +11 -3
  95. data/lib/frameworks/sproutcore/themes/ace/resources/well/well.css +7 -8
  96. data/lib/frameworks/sproutcore/themes/ace/resources/well/well.js +2 -4
  97. data/lib/gen/app/templates/apps/@target_name@/Buildfile +14 -0
  98. data/lib/gen/app/templates/apps/@target_name@/theme.js +27 -0
  99. data/lib/gen/html_app/templates/apps/@target_name@/resources/stylesheets/@target_name@.css +4 -0
  100. data/lib/gen/project/templates/@filename@/Buildfile +7 -2
  101. data/lib/gen/theme/templates/themes/@target_name@/Buildfile +3 -0
  102. data/lib/gen/theme/templates/themes/@target_name@/theme.js +23 -0
  103. data/lib/sproutcore/builders.rb +2 -0
  104. data/lib/sproutcore/builders/chance.rb +64 -0
  105. data/lib/sproutcore/builders/chance_file.rb +59 -0
  106. data/lib/sproutcore/builders/combine.rb +0 -45
  107. data/lib/sproutcore/builders/html.rb +1 -1
  108. data/lib/sproutcore/builders/minify.rb +5 -17
  109. data/lib/sproutcore/builders/module.rb +2 -2
  110. data/lib/sproutcore/builders/string_wrapper.rb +13 -15
  111. data/lib/sproutcore/helpers.rb +1 -1
  112. data/lib/sproutcore/helpers/minifier.rb +56 -0
  113. data/lib/sproutcore/helpers/static_helper.rb +86 -40
  114. data/lib/sproutcore/models/generator.rb +16 -0
  115. data/lib/sproutcore/models/manifest_entry.rb +8 -1
  116. data/lib/sproutcore/models/target.rb +101 -33
  117. data/lib/sproutcore/tools.rb +0 -7
  118. data/lib/sproutcore/tools/build.rb +2 -37
  119. data/spec/buildtasks/manifest/prepare_build_tasks/chance_spec.rb +100 -0
  120. data/spec/buildtasks/manifest/prepare_build_tasks/combine_spec.rb +86 -9
  121. data/spec/buildtasks/manifest/prepare_build_tasks/css_spec.rb +1 -1
  122. data/spec/buildtasks/manifest/prepare_build_tasks/minify_spec.rb +1 -1
  123. data/spec/buildtasks/manifest/prepare_build_tasks/module_info_spec.rb +96 -0
  124. data/spec/buildtasks/manifest/prepare_build_tasks/module_spec.rb +83 -0
  125. data/spec/buildtasks/manifest/prepare_build_tasks/packed_spec.rb +37 -4
  126. data/spec/buildtasks/manifest/spec_helper.rb +4 -0
  127. data/spec/fixtures/builder_tests/Buildfile +11 -9
  128. data/spec/fixtures/builder_tests/apps/chance_test/Buildfile +14 -0
  129. data/spec/fixtures/builder_tests/apps/chance_test/core.js +27 -0
  130. data/spec/fixtures/builder_tests/apps/chance_test/main.js +30 -0
  131. data/spec/fixtures/builder_tests/apps/chance_test/resources/demo.css +6 -0
  132. data/spec/fixtures/builder_tests/apps/chance_test/resources/last_file.css +7 -0
  133. data/spec/fixtures/builder_tests/apps/chance_test/resources/loading.rhtml +9 -0
  134. data/spec/fixtures/builder_tests/apps/chance_test/resources/main_page.js +24 -0
  135. data/spec/fixtures/builder_tests/apps/chance_test/resources/z_first_file.css +6 -0
  136. data/spec/fixtures/builder_tests/apps/chance_test/theme.js +27 -0
  137. data/spec/fixtures/builder_tests/apps/module_test/module.js +1 -0
  138. data/spec/fixtures/builder_tests/apps/module_test/modules/deferred_module/english.lproj/req_style_2.css +0 -0
  139. data/spec/fixtures/builder_tests/apps/module_test/modules/deferred_module/english.lproj/test.rhtml +1 -0
  140. data/spec/fixtures/builder_tests/apps/module_test/modules/deferred_module/javascript.js +1 -0
  141. data/spec/fixtures/builder_tests/apps/module_test/modules/deferred_module/lib/alt_layout.rhtml +0 -0
  142. data/spec/fixtures/builder_tests/apps/module_test/modules/deferred_module/req_js_2.js +0 -0
  143. data/spec/fixtures/builder_tests/apps/module_test/modules/dynamic_req_target_1/dynamic_req_js_1.js +0 -0
  144. data/spec/fixtures/builder_tests/apps/module_test/modules/dynamic_req_target_1/english.lproj/dynamic_req_style_1.css +0 -0
  145. data/spec/fixtures/builder_tests/apps/module_test/modules/inlined_module/README +0 -0
  146. data/spec/fixtures/builder_tests/apps/module_test/modules/required_target/english.lproj/req_style_1.css +0 -0
  147. data/spec/fixtures/builder_tests/apps/module_test/modules/required_target/english.lproj/strings.js +4 -0
  148. data/spec/fixtures/builder_tests/apps/module_test/modules/required_target/english.lproj/test.rhtml +1 -0
  149. data/spec/fixtures/builder_tests/apps/module_test/modules/required_target/req_js_1.js +0 -0
  150. data/spec/fixtures/helper_tests/apps/minifier_test/core.js +8 -0
  151. data/spec/fixtures/real_world/Buildfile +11 -1
  152. data/spec/fixtures/real_world/apps/account/modules/preferences/README +0 -0
  153. data/spec/fixtures/real_world/apps/calendar/modules/preferences/README +0 -0
  154. data/spec/fixtures/real_world/apps/contacts/modules/preferences/README +0 -0
  155. data/spec/fixtures/real_world/apps/contacts/modules/printing/README +0 -0
  156. data/spec/fixtures/real_world/apps/mail/modules/preferences/README +0 -0
  157. data/spec/fixtures/real_world/apps/mail/modules/printing/README +0 -0
  158. data/spec/fixtures/real_world/apps/photos/modules/email/README +0 -0
  159. data/spec/fixtures/real_world/apps/photos/modules/preferences/README +0 -0
  160. data/spec/lib/builders/chance_file_spec.rb +63 -0
  161. data/spec/lib/builders/chance_spec.rb +81 -0
  162. data/spec/lib/builders/module_spec.rb +133 -0
  163. data/spec/lib/helpers/minifier.rb +31 -0
  164. data/spec/lib/models/project/find_targets_for_spec.rb +1 -1
  165. data/vendor/chance/lib/chance/imagers/data_url.rb +68 -17
  166. data/vendor/chance/lib/chance/instance.rb +55 -30
  167. data/vendor/chance/lib/chance/parser.rb +1 -1
  168. data/vendor/chance/lib/chance/slicing.rb +39 -3
  169. metadata +52 -7
  170. data/lib/frameworks/sproutcore/frameworks/foundation/system/logger.js +0 -163
  171. data/lib/frameworks/sproutcore/frameworks/foundation/tests/system/logger.js +0 -44
  172. data/spec/buildtasks/manifest/prepare_build_tasks/bundle_spec.rb +0 -254
  173. data/spec/fixtures/builder_tests/apps/bundle_test/bundle.js +0 -1
  174. data/spec/lib/builders/bundle_spec.rb +0 -295
@@ -306,5 +306,3 @@ SC.run = function(callback, target, forceNested) {
306
306
  if(forceNested || !alreadyRunning) SC.RunLoop.end();
307
307
  }
308
308
  };
309
-
310
- SC.RunLoop.currentRunLoop = SC.RunLoop.create();
@@ -9,57 +9,252 @@
9
9
  // ie. setting the actual console.log = null means setting up
10
10
  // and tearing down no longer work properly.
11
11
 
12
- module("SC.Logger");
13
-
14
- test("addReporter", function() {
15
- var reporter = {
16
- log: function() { SC.Logger.set('hasBeenCalled', YES); }
12
+ function testConsole() {
13
+ return {
14
+ log: function() { return true; },
15
+ alert: function() { return true; },
16
+ debug: function() { return true; },
17
+ dir: function() { return true; },
18
+ dirxml: function() { return true; },
19
+ error: function() { return true; },
20
+ group: function() { return true; },
21
+ groupEnd: function() { return true; },
22
+ info: function() { return true; },
23
+ profile: function() { return true; },
24
+ profileEnd: function() { return true; },
25
+ time: function() { return true; },
26
+ timeEnd: function() { return true; },
27
+ trace: function() { return true; },
28
+ warn: function() { return true; }
17
29
  };
30
+ }
31
+
32
+ module("SC.Logger", {
33
+ setup: function() {
34
+ SC.Logger.set('reporter', testConsole());
35
+
36
+ SC.Logger.debugEnabled = true;
37
+ SC.Logger.format = true;
38
+ SC.Logger.fallBackOnLog = true;
39
+ SC.Logger.fallBackOnAlert = false;
40
+ },
41
+ teardown: function() {
42
+ }
43
+ });
44
+
45
+
46
+ // We'll use these a lot.
47
+ var debugMessage = "Test debug message",
48
+ infoMessage = "Test informational message",
49
+ warnMessage = "Test warning message",
50
+ errorMessage = "Test error message",
51
+ debugGroupTitle = "Test debug group title",
52
+ infoGroupTitle = "Test informational group title",
53
+ warnGroupTitle = "Test warning group title",
54
+ errorGroupTitle = "Test error group title";
55
+
56
+ var outputAll = function() {
57
+ // Outputs a log message for each possible level.
58
+ SC.Logger.debugGroup(debugGroupTitle);
59
+ SC.Logger.debug(debugMessage);
60
+ SC.Logger.debugGroupEnd();
61
+
62
+ SC.Logger.infoGroup(debugGroupTitle);
63
+ SC.Logger.info(infoMessage);
64
+ SC.Logger.infoGroupEnd();
65
+
66
+ SC.Logger.warnGroup(debugGroupTitle);
67
+ SC.Logger.warn(warnMessage);
68
+ SC.Logger.warnGroupEnd();
69
+
70
+ SC.Logger.errorGroup(debugGroupTitle);
71
+ SC.Logger.error(errorMessage);
72
+ SC.Logger.errorGroupEnd();
73
+ };
74
+
75
+
76
+
77
+ test("exists", function() {
78
+ equals(SC.Logger.get('exists'), true, "Reporter does exist check");
79
+
80
+ SC.Logger.set('reporter', null);
81
+ equals(SC.Logger.get('exists'), false, "Reporter does not exist check");
82
+ });
83
+
84
+ test("profile", function() {
85
+ equals(SC.Logger.profile(), true, "profile() function is defined");
18
86
 
19
- SC.Logger.set('hasBeenCalled', NO);
20
- SC.Logger.addReporter(reporter);
21
- SC.Logger.log();
87
+ SC.Logger.get('reporter').profile = null;
88
+ equals(SC.Logger.profile(), false, "profile() function is null");
89
+ });
90
+
91
+ test("profileEnd", function() {
92
+ equals(SC.Logger.profileEnd(), true, "profileEnd() function is defined");
22
93
 
23
- ok(SC.Logger.get('reporters').indexOf(reporter) > -1, "Reporter was added to reporters array");
24
- ok(SC.Logger.get('hasBeenCalled'), "Function as called when invoked on SC.Logger");
25
- delete SC.Logger.hasBeenCalled;
94
+ SC.Logger.get('reporter').profileEnd = null;
95
+ equals(SC.Logger.profileEnd(), false, "profileEnd() function is null");
26
96
  });
27
97
 
28
- test("clearReporters", function() {
29
- var reporter = {
30
- log: function() { SC.Logger.set('hasBeenCalled', YES); }
31
- };
98
+ test("time", function() {
99
+ equals(SC.Logger.time('mytime'), true, "time() function is defined");
32
100
 
33
- SC.Logger.set('hasBeenCalled', NO);
34
- SC.Logger.addReporter(reporter);
101
+ SC.Logger.get('reporter').time = null;
102
+ equals(SC.Logger.time('mytime'), false, "time() function is null");
103
+ });
104
+
105
+ test("timeEnd", function() {
106
+ equals(SC.Logger.timeEnd('mytime'), true, "timeEnd() function is defined");
35
107
 
36
- ok(SC.Logger.get('reporters').indexOf(reporter) > -1, "precond - Reporter was added to reporters array");
108
+ SC.Logger.get('reporter').timeEnd = null;
109
+ equals(SC.Logger.timeEnd('mytime'), false, "timeEnd() function is null");
110
+ });
111
+
112
+ test("trace", function() {
113
+ equals(SC.Logger.trace(), true, "trace() function is defined");
37
114
 
38
- SC.Logger.clearReporters(YES);
115
+ SC.Logger.get('reporter').trace = null;
116
+ equals(SC.Logger.trace(), false, "trace() function is null");
117
+ });
118
+
119
+ test("_argumentsToString", function() {
120
+ equals(SC.Logger._argumentsToString.apply(SC.Logger, ["test", "test2"]), "test" + SC.LOGGER_LOG_DELIMITER + "test2", "Formatting using default delimiter");
39
121
 
40
- ok(SC.Logger.get('reporters').indexOf(reporter) === -1, "Reporter was removed from reporters array");
122
+ SC.LOGGER_LOG_DELIMITER = "|";
123
+ equals(SC.Logger._argumentsToString.apply(SC.Logger, ["test", "test2"]), "test|test2", "Formatting using custom delimiter");
124
+ });
125
+
126
+
127
+ // ..........................................................
128
+ // LOG LEVELS
129
+ //
130
+ // Since we can't really test whether or not things are output to the console,
131
+ // we'll do all of our log level testing based on the log recording mechanism.
132
+ //
133
+ // In case anybody else has recorded a log message, all of these tests will
134
+ // start out by clearing the recorded log messages array.
135
+
136
+ test("Ensure that log levels function properly: none", function() {
137
+ SC.Logger.set('recordedLogMessages', null);
138
+
139
+ SC.Logger.set('logRecordingLevel', SC.LOGGER_LEVEL_NONE);
140
+ outputAll();
141
+
142
+ // If it was null before, it should be still be null, since no messages
143
+ // should have been logged.
144
+ equals(SC.Logger.get('recordedLogMessages'), null, "recordedLogMessages remains null");
145
+
146
+ // If it was an empty array before, it should still be an empty array.
147
+ SC.Logger.set('recordedLogMessages', []);
148
+ outputAll();
149
+ equals(SC.Logger.getPath('recordedLogMessages.length'), 0, "recordedLogMessages remains an empty array");
41
150
  });
42
151
 
43
- test("log", function() {
44
- equals(SC.Logger.log("test"), SC.Logger, "Function is defined and returns SC.Logger");
152
+ test("Ensure that log levels function properly: debug", function() {
153
+ SC.Logger.set('recordedLogMessages', null);
154
+
155
+ SC.Logger.set('logRecordingLevel', SC.LOGGER_LEVEL_DEBUG);
156
+ outputAll();
157
+
158
+ // All four messages (plus group begin / end directives) should have been
159
+ // logged.
160
+ equals(SC.Logger.getPath('recordedLogMessages.length'), 12, "recordedLogMessages should have all twelve entries");
161
+
162
+ equals(SC.Logger.getPath('recordedLogMessages.1').message, debugMessage, "recordedLogMessages[1] should be the debug message");
163
+ equals(SC.Logger.getPath('recordedLogMessages.4').message, infoMessage, "recordedLogMessages[4] should be the info message");
164
+ equals(SC.Logger.getPath('recordedLogMessages.7').message, warnMessage, "recordedLogMessages[7] should be the warn message");
165
+ equals(SC.Logger.getPath('recordedLogMessages.10').message, errorMessage, "recordedLogMessages[10] should be the error message");
45
166
  });
46
167
 
47
- test("debug", function() {
48
- ok(SC.Logger.debug("Debug"), SC.Logger, "Function is defined and returns SC.Logger");
168
+ test("Ensure that log levels function properly: info", function() {
169
+ SC.Logger.set('recordedLogMessages', null);
170
+
171
+ SC.Logger.set('logRecordingLevel', SC.LOGGER_LEVEL_INFO);
172
+ outputAll();
173
+
174
+ // Three messages (plus group begin / end directives) should have been
175
+ // logged.
176
+ equals(SC.Logger.getPath('recordedLogMessages.length'), 9, "recordedLogMessages should have nine entries");
177
+
178
+ equals(SC.Logger.getPath('recordedLogMessages.1').message, infoMessage, "recordedLogMessages[1] should be the info message");
179
+ equals(SC.Logger.getPath('recordedLogMessages.4').message, warnMessage, "recordedLogMessages[4] should be the warn message");
180
+ equals(SC.Logger.getPath('recordedLogMessages.7').message, errorMessage, "recordedLogMessages[7] should be the error message");
49
181
  });
50
182
 
51
- test("dir", function() {
52
- equals(SC.Logger.dir({test:"string"}), SC.Logger, "Function is defined and returns SC.Logger");
183
+ test("Ensure that log levels function properly: warn", function() {
184
+ SC.Logger.set('recordedLogMessages', null);
185
+
186
+ SC.Logger.set('logRecordingLevel', SC.LOGGER_LEVEL_WARN);
187
+ outputAll();
188
+
189
+ // Two messages (plus group begin / end directives) should have been logged.
190
+ equals(SC.Logger.getPath('recordedLogMessages.length'), 6, "recordedLogMessages should have 6 entries");
191
+
192
+ equals(SC.Logger.getPath('recordedLogMessages.1').message, warnMessage, "recordedLogMessages[1] should be the warn message");
193
+ equals(SC.Logger.getPath('recordedLogMessages.4').message, errorMessage, "recordedLogMessages[4] should be the error message");
53
194
  });
54
195
 
55
- test("error", function() {
56
- equals(SC.Logger.error("Error"), SC.Logger, "Function is defined and returns SC.Logger");
196
+ test("Ensure that log levels function properly: error", function() {
197
+ SC.Logger.set('recordedLogMessages', null);
198
+
199
+ SC.Logger.set('logRecordingLevel', SC.LOGGER_LEVEL_ERROR);
200
+ outputAll();
201
+
202
+ // Only the error message (plus group begin / end directives) should have
203
+ // been logged.
204
+ equals(SC.Logger.getPath('recordedLogMessages.length'), 3, "recordedLogMessages should have three entries");
205
+
206
+ // That message should be equal to the error message.
207
+ equals(SC.Logger.getPath('recordedLogMessages.1').message, errorMessage, "recordedLogMessages[1] should be the error message");
57
208
  });
58
209
 
59
- test("info", function() {
60
- equals(SC.Logger.info("Info"), SC.Logger, "Function is defined and returns SC.Logger");
210
+
211
+ test("Ensure that log messages via the “will format” methods actually format", function() {
212
+ SC.Logger.set('recordedLogMessages', null);
213
+ SC.Logger.set('logRecordingLevel', SC.LOGGER_LEVEL_DEBUG);
214
+
215
+ var format = "This message should be formatted: %@:%@",
216
+ expected = format.fmt(null, 1);
217
+
218
+ SC.Logger.debug(format, null, 1);
219
+ SC.Logger.info(format, null, 1);
220
+ SC.Logger.warn(format, null, 1);
221
+ SC.Logger.error(format, null, 1);
222
+
223
+ equals(SC.Logger.getPath('recordedLogMessages.0').message, expected, "debug() should call String.fmt");
224
+ equals(SC.Logger.getPath('recordedLogMessages.1').message, expected, "info() should call String.fmt");
225
+ equals(SC.Logger.getPath('recordedLogMessages.2').message, expected, "warn() should call String.fmt");
226
+ equals(SC.Logger.getPath('recordedLogMessages.3').message, expected, "error() should call String.fmt");
61
227
  });
62
228
 
63
- test("warn", function() {
64
- equals(SC.Logger.warn("Warn"), SC.Logger, "Function is defined and returns SC.Logger");
229
+ test("Ensure that log messages via the “will not format” methods don’t format, but are still recorded", function() {
230
+ SC.Logger.set('recordedLogMessages', null);
231
+ SC.Logger.set('logRecordingLevel', SC.LOGGER_LEVEL_DEBUG);
232
+
233
+ var message = "This message should not be formatted: %@:%@";
234
+ SC.Logger.debugWithoutFmt(message, null, 1);
235
+ SC.Logger.infoWithoutFmt(message, null, 1);
236
+ SC.Logger.warnWithoutFmt(message, null, 1);
237
+ SC.Logger.errorWithoutFmt(message, null, 1);
238
+
239
+ // They should still be recorded and identified as a message.
240
+ equals(SC.Logger.getPath('recordedLogMessages.0').message, true, "debugWithoutFmt() should still record");
241
+ equals(SC.Logger.getPath('recordedLogMessages.1').message, true, "infoWithoutFmt() should still record");
242
+ equals(SC.Logger.getPath('recordedLogMessages.2').message, true, "warnWithoutFmt() should still record");
243
+ equals(SC.Logger.getPath('recordedLogMessages.3').message, true, "errorWithoutFmt() should still record");
244
+
245
+ equals(SC.Logger.getPath('recordedLogMessages.0').originalArguments[0], message, "debugWithoutFmt() should not call String.fmt");
246
+ equals(SC.Logger.getPath('recordedLogMessages.0').originalArguments[1], null, "debugWithoutFmt() should record all the arguments (1)");
247
+ equals(SC.Logger.getPath('recordedLogMessages.0').originalArguments[2], 1, "debugWithoutFmt() should record all the arguments (2)");
248
+
249
+ equals(SC.Logger.getPath('recordedLogMessages.1').originalArguments[0], message, "infoWithoutFmt() should not call String.fmt");
250
+ equals(SC.Logger.getPath('recordedLogMessages.1').originalArguments[1], null, "infoWithoutFmt() should record all the arguments (1)");
251
+ equals(SC.Logger.getPath('recordedLogMessages.2').originalArguments[2], 1, "infoWithoutFmt() should record all the arguments (2)");
252
+
253
+ equals(SC.Logger.getPath('recordedLogMessages.2').originalArguments[0], message, "warnWithoutFmt() should not call String.fmt");
254
+ equals(SC.Logger.getPath('recordedLogMessages.2').originalArguments[1], null, "warnWithoutFmt() should record all the arguments (1)");
255
+ equals(SC.Logger.getPath('recordedLogMessages.2').originalArguments[2], 1, "warnWithoutFmt() should record all the arguments (2)");
256
+
257
+ equals(SC.Logger.getPath('recordedLogMessages.3').originalArguments[0], message, "errorWithoutFmt() should not call String.fmt");
258
+ equals(SC.Logger.getPath('recordedLogMessages.3').originalArguments[1], null, "errorWithoutFmt() should record all the arguments (1)");
259
+ equals(SC.Logger.getPath('recordedLogMessages.3').originalArguments[2], 1, "errorWithoutFmt() should record all the arguments (2)");
65
260
  });
@@ -142,7 +142,7 @@ SC.State = SC.Object.extend({
142
142
  }
143
143
 
144
144
  if (!SC.none(initialSubstate) && !matchedInitialSubstate) {
145
- SC.Logger.error('Unable to set initial substate %@ since it did not match any of state\'s %@ substates'.fmt(initialSubstate, this));
145
+ SC.Logger.error("Unable to set initial substate %@ since it did not match any of state\'s %@ substates", initialSubstate, this);
146
146
  }
147
147
 
148
148
  this.set('substates', substates);
@@ -150,18 +150,18 @@ SC.State = SC.Object.extend({
150
150
 
151
151
  if (substates.length === 0) {
152
152
  if (!SC.none(initialSubstate)) {
153
- SC.Logger.warn('Unable to make %@ an initial substate since state %@ has no substates'.fmt(initialSubstate, this));
153
+ SC.Logger.warn("Unable to make %@ an initial substate since state %@ has no substates", initialSubstate, this);
154
154
  }
155
155
  }
156
156
  else if (substates.length > 0) {
157
157
  if (SC.none(initialSubstate) && !substatesAreConcurrent) {
158
158
  state = substates[0];
159
159
  this.set('initialSubstate', state);
160
- SC.Logger.warn('state %@ has no initial substate defined. Will default to using %@ as initial substate'.fmt(this, state));
160
+ SC.Logger.warn("state %@ has no initial substate defined. Will default to using %@ as initial substate", this, state);
161
161
  }
162
162
  else if (!SC.none(initialSubstate) && substatesAreConcurrent) {
163
163
  this.set('initialSubstate', null);
164
- SC.Logger.warn('Can not use %@ as initial substate since substates are all concurrent for state %@'.fmt(initialSubstate, this));
164
+ SC.Logger.warn("Cannot use %@ as initial substate since substates are all concurrent for state %@", initialSubstate, this);
165
165
  }
166
166
  }
167
167
 
@@ -212,7 +212,7 @@ SC.State = SC.Object.extend({
212
212
  continue;
213
213
  }
214
214
 
215
- SC.Logger.error("Invalid event %@ for event handler %@ in state %@".fmt(event, name, this));
215
+ SC.Logger.error("Invalid event %@ for event handler %@ in state %@", event, name, this);
216
216
  }
217
217
  },
218
218
 
@@ -275,7 +275,7 @@ SC.State = SC.Object.extend({
275
275
  }
276
276
 
277
277
  if (parent !== state && state !== this) {
278
- SC.Logger.error('Can not generate relative path from %@ since it not a parent state of %@'.fmt(state, this));
278
+ SC.Logger.error("Cannot generate relative path from %@ since it not a parent state of %@", state, this);
279
279
  return null;
280
280
  }
281
281
 
@@ -306,7 +306,7 @@ SC.State = SC.Object.extend({
306
306
  }
307
307
 
308
308
  if (valueType !== SC.T_STRING) {
309
- SC.Logger.error("Can not find matching subtype. value must be an object or string: %@".fmt(value));
309
+ SC.Logger.error("Cannot find matching subtype. value must be an object or string: %@", value);
310
310
  return null;
311
311
  }
312
312
 
@@ -332,8 +332,8 @@ SC.State = SC.Object.extend({
332
332
  if (matches[1] === "") {
333
333
  if (paths.__ki_paths__.length === 1) return paths[paths.__ki_paths__[0]];
334
334
  if (paths.__ki_paths__.length > 1) {
335
- var msg = 'Can not find substate matching %@ in state %@. Ambiguous with the following: %@';
336
- SC.Logger.error(msg.fmt(value, this, paths.__ki_paths__));
335
+ var msg = 'Cannot find substate matching %@ in state %@. Ambiguous with the following: %@';
336
+ SC.Logger.error(msg, value, this, paths.__ki_paths__);
337
337
  }
338
338
  }
339
339
 
@@ -458,7 +458,7 @@ SC.State = SC.Object.extend({
458
458
  if (this.get('isCurrentState')) {
459
459
  statechart.gotoState(this);
460
460
  } else {
461
- SC.Logger.error('Can not re-enter state %@ since it is not a current state in the statechart'.fmt(this));
461
+ SC.Logger.error("Cannot re-enter state %@ since it is not a current state in the statechart", this);
462
462
  }
463
463
  },
464
464
 
@@ -515,7 +515,7 @@ SC.State = SC.Object.extend({
515
515
  // First check if the name of the event is the same as a registered event handler. If so,
516
516
  // then do not handle the event.
517
517
  if (this._registeredEventHandlers[event]) {
518
- SC.Logger.warn("state %@ can not handle event %@ since it is a registered event handler".fmt(this, event));
518
+ SC.Logger.warn("state %@ can not handle event %@ since it is a registered event handler", this, event);
519
519
  return NO;
520
520
  }
521
521
 
@@ -948,4 +948,4 @@ SC.Async.mixin({
948
948
  return SC.Async.create({ func: func, arg1: arg1, arg2: arg2 });
949
949
  }
950
950
 
951
- });
951
+ });
@@ -130,6 +130,16 @@ CoreTest.Runner = {
130
130
  result.html(str);
131
131
 
132
132
  if (this.errors) CoreTest.errors=this.errors.join('');
133
+
134
+
135
+ // Unload the SproutCore event system so that the user can select the text
136
+ // of the various events. (It is handy when looking at failed tests.)
137
+ if (SC && SC.Event && SC.Event.unload) {
138
+ try {
139
+ SC.Event.unload();
140
+ }
141
+ catch (e) {}
142
+ }
133
143
  },
134
144
 
135
145
  planDidRecord: function(plan, module, test, assertions, timings) {
@@ -35,14 +35,36 @@
35
35
  -%>
36
36
  <%= bootstrap %>
37
37
 
38
- <% #
39
- # This line should appear in your head area to include the stylesheets
40
- # generated by your client. If you need to include your own
41
- # stylesheets, you don't need to change it here. Instead use the
42
- # required option in your config.
43
- -%>
44
- <%= stylesheets_for_client %>
45
- <%= @content_for_page_styles %>
38
+ <% #
39
+ # This line should appear in your head area to include the stylesheets
40
+ # generated by your client. If you need to include your own
41
+ # stylesheets, you don't need to change it here. Instead use the
42
+ # required option in your config.
43
+ -%>
44
+
45
+ <script>
46
+ (function() {
47
+ var styles = [];
48
+ if (window.devicePixelRatio == 2 || window.location.search.indexOf("2x") > -1) {
49
+ styles = <%= stylesheet_urls_for_client(nil, { :x2 => true }).to_json %>;
50
+ } else {
51
+ styles = <%= stylesheet_urls_for_client.to_json %>;
52
+ }
53
+
54
+ var head = document.getElementsByTagName("head")[0];
55
+ var len = styles.length, idx;
56
+ for (idx = 0; idx < len; idx++) {
57
+ var css = document.createElement('link');
58
+ css.rel = 'stylesheet';
59
+ css.type = 'text/css';
60
+ css.href = styles[idx];
61
+ css.media = 'screen'
62
+ head.appendChild(css);
63
+ }
64
+ })();
65
+ </script>
66
+
67
+ <%= @content_for_page_styles %>
46
68
  <script>
47
69
  SC.benchmarkPreloadEvents['headEnd'] = new Date().getTime();
48
70
  </script>
@@ -43,7 +43,7 @@ $theme.sc-segment-view {
43
43
  &.active {
44
44
  .left { @include slice("segmented_active.png", $left: 100, $width: 8); }
45
45
  .right { @include slice("segmented_active.png", $left: 92, $width: 8); }
46
- .middle { @include slice("segmented_active.png", $left: 8, $width: 1); }
46
+ .middle { @include slice("segmented_active.png", $left: 8, $width: 1, $repeat: repeat-x); }
47
47
  }
48
48
 
49
49
  &.active.sc-first-segment {
@@ -59,7 +59,7 @@ $theme.sc-segment-view {
59
59
  &.sel {
60
60
  .left { @include slice("segmented_selected.png", $left: 100, $width: 8); }
61
61
  .right { @include slice("segmented_selected.png", $left: 92, $width: 8); }
62
- .middle { @include slice("segmented_selected.png", $left: 8, $width: 1); }
62
+ .middle { @include slice("segmented_selected.png", $left: 8, $width: 1, $repeat: repeat-x); }
63
63
  }
64
64
 
65
65
  &.sel.sc-first-segment {
@@ -75,7 +75,7 @@ $theme.sc-segment-view {
75
75
  &.sel.active {
76
76
  .left { @include slice("segmented_selected_active.png", $left: 100, $width: 8); }
77
77
  .right { @include slice("segmented_selected_active.png", $left: 92, $width: 8); }
78
- .middle { @include slice("segmented_selected_active.png", $left: 8, $width: 1); }
78
+ .middle { @include slice("segmented_selected_active.png", $left: 8, $width: 1, $repeat: repeat-x); }
79
79
  }
80
80
 
81
81
  &.sel.active.sc-first-segment {
@@ -88,4 +88,4 @@ $theme.sc-segment-view {
88
88
 
89
89
  }
90
90
 
91
- }
91
+ }