sproutcore 1.10.3.1 → 1.11.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (380) hide show
  1. checksums.yaml +8 -8
  2. data/CHANGELOG +4 -8
  3. data/VERSION.yml +2 -2
  4. data/lib/frameworks/sproutcore/Buildfile +5 -4
  5. data/lib/frameworks/sproutcore/CHANGELOG.md +274 -40
  6. data/lib/frameworks/sproutcore/CONTRIBUTORS.md +133 -0
  7. data/lib/frameworks/sproutcore/README.md +31 -144
  8. data/lib/frameworks/sproutcore/apps/showcase/controllers/source_tree_controller.js +9 -4
  9. data/lib/frameworks/sproutcore/apps/showcase/resources/stylesheet.css +5 -0
  10. data/lib/frameworks/sproutcore/apps/showcase/system/views_item_content.js +1 -1
  11. data/lib/frameworks/sproutcore/apps/showcase/views/split_views.js +15 -2
  12. data/lib/frameworks/sproutcore/apps/showcase/views/stacked_views.js +1 -1
  13. data/lib/frameworks/sproutcore/apps/tests/english.lproj/main_page.js +11 -1
  14. data/lib/frameworks/sproutcore/frameworks/ajax/mixins/websocket_delegate.js +90 -0
  15. data/lib/frameworks/sproutcore/frameworks/ajax/system/request.js +81 -5
  16. data/lib/frameworks/sproutcore/frameworks/ajax/system/response.js +23 -4
  17. data/lib/frameworks/sproutcore/frameworks/ajax/system/websocket.js +475 -0
  18. data/lib/frameworks/sproutcore/frameworks/ajax/tests/system/request.js +149 -26
  19. data/lib/frameworks/sproutcore/frameworks/ajax/tests/system/websocket.js +197 -0
  20. data/lib/frameworks/sproutcore/frameworks/ajax/tests/system/xhr_response_test.js +65 -0
  21. data/lib/frameworks/sproutcore/frameworks/bootstrap/system/loader.js +4 -0
  22. data/lib/frameworks/sproutcore/frameworks/core_foundation/child_view_layouts/horizontal_stack_layout.js +232 -52
  23. data/lib/frameworks/sproutcore/frameworks/core_foundation/child_view_layouts/vertical_stack_layout.js +235 -49
  24. data/lib/frameworks/sproutcore/frameworks/core_foundation/controllers/array.js +23 -13
  25. data/lib/frameworks/sproutcore/frameworks/core_foundation/controllers/object.js +3 -1
  26. data/lib/frameworks/sproutcore/frameworks/core_foundation/core.js +81 -1
  27. data/lib/frameworks/sproutcore/frameworks/core_foundation/english.lproj/ordinal.js +17 -0
  28. data/lib/frameworks/sproutcore/frameworks/core_foundation/ext/string.js +7 -0
  29. data/lib/frameworks/sproutcore/frameworks/{desktop/tests/views/disclosure/methods.js → core_foundation/french.lproj/ordinal.js} +7 -4
  30. data/lib/frameworks/sproutcore/frameworks/core_foundation/panes/layout.js +2 -6
  31. data/lib/frameworks/sproutcore/frameworks/core_foundation/panes/main.js +1 -1
  32. data/lib/frameworks/sproutcore/frameworks/core_foundation/panes/pane.js +104 -69
  33. data/lib/frameworks/sproutcore/frameworks/core_foundation/panes/pane_statechart.js +6 -1
  34. data/lib/frameworks/sproutcore/frameworks/core_foundation/protocols/child_view_layout_protocol.js +59 -0
  35. data/lib/frameworks/sproutcore/frameworks/core_foundation/protocols/view_transition_protocol.js +18 -1
  36. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/application.js +192 -0
  37. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/bezier_curves.js +52 -0
  38. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/color.js +384 -64
  39. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/core_query.js +6 -14
  40. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/device.js +21 -35
  41. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/event.js +72 -36
  42. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/locale.js +90 -34
  43. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/platform.js +55 -7
  44. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/render_context.js +20 -15
  45. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/req_anim_frame.js +9 -10
  46. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/root_responder.js +763 -542
  47. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/selection_set.js +4 -3
  48. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/sparse_array.js +1 -7
  49. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/string.js +14 -0
  50. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/touch.js +538 -0
  51. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/utils/rect.js +56 -1
  52. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/controllers/array/array_case.js +99 -4
  53. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/controllers/object/single_case.js +25 -19
  54. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/core_tests.js +75 -0
  55. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/ext/number_test.js +81 -0
  56. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/mixins/action_support.js +4 -4
  57. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/mixins/responder_context.js +4 -4
  58. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/mixins/string.js +19 -1
  59. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/system/color.js +36 -20
  60. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/system/root_responder/design_modes_test.js +83 -0
  61. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/system/root_responder/makeMainPane.js +7 -3
  62. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/system/root_responder/mouse_events.js +338 -0
  63. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/system/root_responder/root_responder.js +14 -89
  64. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/system/root_responder/touch.js +106 -0
  65. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/system/sparse_array.js +2 -2
  66. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/system/touch.js +136 -0
  67. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/system/utils/rect.js +42 -1
  68. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/pane/append_remove.js +11 -0
  69. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/pane/child_view.js +5 -5
  70. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/pane/design_mode_test.js +457 -0
  71. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/pane/sendEvent.js +36 -10
  72. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/background_color.js +44 -0
  73. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/border_frame_test.js +51 -24
  74. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/childViewLayout_test.js +176 -1
  75. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/clippingFrame.js +46 -16
  76. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/convertFrames.js +69 -15
  77. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/didAppendToDocument.js +2 -2
  78. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/layout.js +7 -1
  79. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/layoutDidChange.js +30 -10
  80. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/layoutStyle.js +376 -71
  81. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/static_layout.js +0 -10
  82. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/viewDidResize.js +117 -34
  83. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/view_states_test.js +52 -2
  84. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view.js +656 -42
  85. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/animation.js +159 -38
  86. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/cursor.js +0 -7
  87. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/design_mode.js +206 -0
  88. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/enabled.js +0 -28
  89. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/keyboard.js +21 -6
  90. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/layout.js +372 -450
  91. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/layout_style.js +28 -13
  92. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/manipulation.js +22 -51
  93. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/statechart.js +59 -30
  94. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/theming.js +0 -29
  95. data/lib/frameworks/sproutcore/frameworks/datastore/mixins/relationship_support.js +22 -10
  96. data/lib/frameworks/sproutcore/frameworks/datastore/models/children_attribute.js +42 -36
  97. data/lib/frameworks/sproutcore/frameworks/datastore/models/many_attribute.js +54 -3
  98. data/lib/frameworks/sproutcore/frameworks/datastore/models/record.js +178 -59
  99. data/lib/frameworks/sproutcore/frameworks/datastore/models/record_attribute.js +2 -2
  100. data/lib/frameworks/sproutcore/frameworks/datastore/system/child_array.js +206 -132
  101. data/lib/frameworks/sproutcore/frameworks/datastore/system/many_array.js +214 -118
  102. data/lib/frameworks/sproutcore/frameworks/datastore/system/nested_store.js +96 -13
  103. data/lib/frameworks/sproutcore/frameworks/datastore/system/query.js +14 -4
  104. data/lib/frameworks/sproutcore/frameworks/datastore/system/record_array.js +82 -42
  105. data/lib/frameworks/sproutcore/frameworks/datastore/system/store.js +272 -177
  106. data/lib/frameworks/sproutcore/frameworks/datastore/tests/integration/store_interaction_test.js +54 -0
  107. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/datetime_recordattribute.js +24 -16
  108. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/many_attribute.js +6 -3
  109. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/nested_records/data_store.js +267 -35
  110. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/nested_records/nested_record.js +57 -46
  111. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/nested_records/nested_record_array.js +150 -53
  112. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/nested_records/nested_record_array_complex.js +57 -17
  113. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/nested_records/nested_record_complex.js +13 -9
  114. data/lib/frameworks/sproutcore/frameworks/{experimental/frameworks/polymorphism → datastore}/tests/models/polymorphism/many.js +2 -2
  115. data/lib/frameworks/sproutcore/frameworks/{experimental/frameworks/polymorphism → datastore}/tests/models/polymorphism/simple.js +0 -0
  116. data/lib/frameworks/sproutcore/frameworks/{experimental/frameworks/polymorphism → datastore}/tests/models/polymorphism/single.js +12 -2
  117. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/record/writeAttribute.js +20 -15
  118. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/record_attribute.js +9 -2
  119. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/many_array/core_methods.js +80 -14
  120. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/autonomous_dataSourceCallbacks.js +280 -0
  121. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/autonomous_pushChanges.js +232 -0
  122. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/chain.js +31 -5
  123. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/query/parse.js +16 -2
  124. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/store/core_methods.js +60 -40
  125. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/store/materializeRecord.js +78 -0
  126. data/lib/frameworks/sproutcore/frameworks/datetime/frameworks/core/system/datetime.js +13 -1
  127. data/lib/frameworks/sproutcore/frameworks/datetime/frameworks/core/tests/system/datetime.js +20 -0
  128. data/lib/frameworks/sproutcore/frameworks/datetime/frameworks/localized/{resources → english.lproj}/strings.js +0 -0
  129. data/lib/frameworks/sproutcore/frameworks/datetime/frameworks/localized/french.lproj/strings.js +45 -0
  130. data/lib/frameworks/sproutcore/frameworks/designer/designers/object_designer.js +7 -3
  131. data/lib/frameworks/sproutcore/frameworks/desktop/mixins/collection_row_delegate.js +125 -44
  132. data/lib/frameworks/sproutcore/frameworks/desktop/panes/alert.js +139 -48
  133. data/lib/frameworks/sproutcore/frameworks/desktop/panes/draggable.js +202 -0
  134. data/lib/frameworks/sproutcore/frameworks/desktop/panes/menu.js +59 -56
  135. data/lib/frameworks/sproutcore/frameworks/desktop/panes/palette.js +13 -49
  136. data/lib/frameworks/sproutcore/frameworks/desktop/panes/picker.js +466 -305
  137. data/lib/frameworks/sproutcore/frameworks/desktop/protocols/drag_source.js +49 -12
  138. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/slider.js +79 -21
  139. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/split.js +12 -2
  140. data/lib/frameworks/sproutcore/frameworks/desktop/resources/menu_item_view.css +8 -0
  141. data/lib/frameworks/sproutcore/frameworks/desktop/resources/overlay-scroller.css +187 -0
  142. data/lib/frameworks/sproutcore/frameworks/desktop/system/drag.js +94 -30
  143. data/lib/frameworks/sproutcore/frameworks/desktop/tests/panes/alert/ui.js +163 -3
  144. data/lib/frameworks/sproutcore/frameworks/desktop/tests/panes/menu/methods.js +97 -78
  145. data/lib/frameworks/sproutcore/frameworks/desktop/tests/panes/menu/ui.js +61 -1
  146. data/lib/frameworks/sproutcore/frameworks/desktop/tests/panes/panel/methods.js +7 -3
  147. data/lib/frameworks/sproutcore/frameworks/desktop/tests/panes/panel/ui.js +47 -22
  148. data/lib/frameworks/sproutcore/frameworks/desktop/tests/panes/picker/methods.js +66 -9
  149. data/lib/frameworks/sproutcore/frameworks/desktop/tests/panes/picker/ui.js +21 -11
  150. data/lib/frameworks/sproutcore/frameworks/desktop/tests/panes/sheet/ui.js +12 -18
  151. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/button/methods.js +17 -14
  152. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/button/ui.js +2 -1
  153. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/checkbox/methods.js +9 -6
  154. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/collection/collection_fast_path.js +54 -21
  155. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/collection/content.js +52 -20
  156. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/collection/itemViewForContentIndex.js +94 -4
  157. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/collection/keyboard.js +177 -0
  158. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/collection/layerIdFor.js +13 -1
  159. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/collection/length.js +9 -9
  160. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/collection/mouse.js +18 -0
  161. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/date_field/methods.js +104 -0
  162. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/disclosure/ui.js +48 -49
  163. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/grid/drag_and_drop.js +22 -18
  164. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/grid/methods.js +17 -5
  165. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/link_view_test.js +136 -0
  166. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/list/contentIndexesInRect.js +77 -0
  167. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/list/drag_and_drop.js +53 -16
  168. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/list/layoutForContentIndex.js +41 -0
  169. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/list/rowDelegate.js +25 -25
  170. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/list/rowOffsetForContentIndex.js +102 -27
  171. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/list/{rowHeightForContentIndex.js → rowSizeForContentIndex.js} +7 -6
  172. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/list/ui_outline.js +2 -0
  173. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/list/ui_row_heights.js +70 -75
  174. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/list/ui_simple.js +29 -30
  175. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/list_item.js +57 -0
  176. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/menu_scroll_view/menu_scroll_view_test.js +206 -0
  177. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/progress/ui.js +15 -0
  178. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/radio/methods.js +15 -7
  179. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/scroll/integration.js +16 -11
  180. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/scroll/methods.js +164 -12
  181. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/scroll/scale.js +387 -0
  182. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/scroll/touch.js +549 -0
  183. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/scroll/ui.js +214 -45
  184. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/scroller.js +5 -5
  185. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/segmented/methods.js +73 -22
  186. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/segmented/ui.js +88 -3
  187. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/select/methods.js +8 -0
  188. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/slider/methods.js +16 -1
  189. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/slider/ui.js +54 -0
  190. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/split/dividers.js +21 -2
  191. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/static_content.js +31 -25
  192. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/tab/methods.js +109 -29
  193. data/lib/frameworks/sproutcore/frameworks/desktop/views/button.js +10 -1
  194. data/lib/frameworks/sproutcore/frameworks/desktop/views/checkbox.js +3 -0
  195. data/lib/frameworks/sproutcore/frameworks/desktop/views/collection.js +779 -603
  196. data/lib/frameworks/sproutcore/frameworks/desktop/views/date_field.js +106 -7
  197. data/lib/frameworks/sproutcore/frameworks/desktop/views/link_view.js +406 -0
  198. data/lib/frameworks/sproutcore/frameworks/desktop/views/list.js +437 -245
  199. data/lib/frameworks/sproutcore/frameworks/desktop/views/list_item.js +13 -0
  200. data/lib/frameworks/sproutcore/frameworks/desktop/views/menu_item.js +124 -62
  201. data/lib/frameworks/sproutcore/frameworks/desktop/views/menu_scroll.js +176 -597
  202. data/lib/frameworks/sproutcore/frameworks/desktop/views/menu_scroller_view.js +206 -0
  203. data/lib/frameworks/sproutcore/frameworks/desktop/views/popup_button.js +3 -0
  204. data/lib/frameworks/sproutcore/frameworks/desktop/views/progress.js +5 -4
  205. data/lib/frameworks/sproutcore/frameworks/desktop/views/radio.js +3 -0
  206. data/lib/frameworks/sproutcore/frameworks/desktop/views/scene.js +56 -158
  207. data/lib/frameworks/sproutcore/frameworks/desktop/views/scroll_view.js +2560 -0
  208. data/lib/frameworks/sproutcore/frameworks/desktop/views/scroller.js +458 -242
  209. data/lib/frameworks/sproutcore/frameworks/desktop/views/segmented.js +117 -54
  210. data/lib/frameworks/sproutcore/frameworks/desktop/views/select.js +18 -12
  211. data/lib/frameworks/sproutcore/frameworks/desktop/views/slider.js +162 -34
  212. data/lib/frameworks/sproutcore/frameworks/desktop/views/split.js +30 -15
  213. data/lib/frameworks/sproutcore/frameworks/desktop/views/split_divider.js +33 -7
  214. data/lib/frameworks/sproutcore/frameworks/desktop/views/static_content.js +22 -2
  215. data/lib/frameworks/sproutcore/frameworks/desktop/views/tab.js +47 -22
  216. data/lib/frameworks/sproutcore/frameworks/experimental/Buildfile +0 -6
  217. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/forms/views/form.js +2 -1
  218. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/forms/views/form_row.js +21 -21
  219. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/select_view/ext/menu.js +14 -3
  220. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/select_view/mixins/select_view_menu.js +24 -10
  221. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/select_view/tests/ext/menu_resizing.js +1 -1
  222. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/select_view/tests/mixins/select_view_menu/bindings.js +7 -4
  223. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/select_view/tests/mixins/select_view_menu/check_selected.js +7 -9
  224. data/lib/frameworks/sproutcore/frameworks/{desktop/tests/panes/select_button/methods.js → experimental/frameworks/select_view/tests/views/select/method.js} +54 -76
  225. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/select_view/tests/views/select/selected_item.js +35 -0
  226. data/lib/frameworks/sproutcore/frameworks/{desktop/tests/panes/select_button → experimental/frameworks/select_view/tests/views/select}/ui.js +107 -36
  227. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/select_view/views/select.js +225 -66
  228. data/lib/frameworks/sproutcore/frameworks/foundation/controllers/tree.js +39 -38
  229. data/lib/frameworks/sproutcore/frameworks/foundation/core.js +5 -18
  230. data/lib/frameworks/sproutcore/frameworks/foundation/debug/control_test_pane.js +12 -0
  231. data/lib/frameworks/sproutcore/frameworks/foundation/english.lproj/inflections.js +84 -0
  232. data/lib/frameworks/sproutcore/frameworks/foundation/french.lproj/inflections.js +41 -0
  233. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/auto_mixin.js +1 -0
  234. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/auto_resize.js +7 -0
  235. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/content_display.js +3 -4
  236. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/flowed_layout.js +6 -2
  237. data/lib/frameworks/sproutcore/frameworks/foundation/private/tree_item_observer.js +408 -239
  238. data/lib/frameworks/sproutcore/frameworks/foundation/render_delegates/canvas_image.js +1 -1
  239. data/lib/frameworks/sproutcore/frameworks/foundation/resources/text_field.css +2 -1
  240. data/lib/frameworks/sproutcore/frameworks/foundation/spanish.lproj/inflections.js +38 -0
  241. data/lib/frameworks/sproutcore/frameworks/foundation/system/benchmark.js +104 -76
  242. data/lib/frameworks/sproutcore/frameworks/foundation/system/string.js +20 -94
  243. data/lib/frameworks/sproutcore/frameworks/foundation/system/text_selection.js +33 -22
  244. data/lib/frameworks/sproutcore/frameworks/foundation/system/undo_manager.js +475 -0
  245. data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/auto_resize_test.js +163 -1
  246. data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/flowed_layout/tests.js +41 -0
  247. data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/staticLayout.js +2 -5
  248. data/lib/frameworks/sproutcore/frameworks/foundation/tests/private/tree_item_observer/methods.js +268 -0
  249. data/lib/frameworks/sproutcore/frameworks/foundation/tests/system/undo_manager.js +231 -0
  250. data/lib/frameworks/sproutcore/frameworks/foundation/tests/views/container/ui.js +16 -0
  251. data/lib/frameworks/sproutcore/frameworks/foundation/tests/views/image/ui.js +27 -0
  252. data/lib/frameworks/sproutcore/frameworks/foundation/tests/views/text_field/methods.js +24 -0
  253. data/lib/frameworks/sproutcore/frameworks/foundation/tests/views/text_field/ui.js +135 -6
  254. data/lib/frameworks/sproutcore/frameworks/foundation/transitions/fade_transition.js +6 -0
  255. data/lib/frameworks/sproutcore/frameworks/foundation/transitions/pop_transition.js +7 -0
  256. data/lib/frameworks/sproutcore/frameworks/foundation/transitions/scale_transition.js +6 -0
  257. data/lib/frameworks/sproutcore/frameworks/foundation/transitions/slide_transition.js +4 -0
  258. data/lib/frameworks/sproutcore/frameworks/foundation/transitions/swap_dissolve_transition.js +3 -1
  259. data/lib/frameworks/sproutcore/frameworks/foundation/validators/credit_card.js +21 -21
  260. data/lib/frameworks/sproutcore/frameworks/foundation/views/container.js +65 -15
  261. data/lib/frameworks/sproutcore/frameworks/foundation/views/image.js +4 -1
  262. data/lib/frameworks/sproutcore/frameworks/foundation/views/label.js +1 -1
  263. data/lib/frameworks/sproutcore/frameworks/foundation/views/text_field.js +193 -213
  264. data/lib/frameworks/sproutcore/frameworks/jquery/{jquery-1.8.3-patched.js → jquery-1.11.1.js} +7507 -6684
  265. data/lib/frameworks/sproutcore/frameworks/routing/system/routes.js +28 -11
  266. data/lib/frameworks/sproutcore/frameworks/routing/tests/system/routes.js +26 -0
  267. data/lib/frameworks/sproutcore/frameworks/runtime/core.js +54 -25
  268. data/lib/frameworks/sproutcore/frameworks/runtime/ext/array.js +0 -6
  269. data/lib/frameworks/sproutcore/frameworks/runtime/ext/number.js +36 -0
  270. data/lib/frameworks/sproutcore/frameworks/runtime/ext/window.js +25 -0
  271. data/lib/frameworks/sproutcore/frameworks/runtime/mixins/array.js +3 -3
  272. data/lib/frameworks/sproutcore/frameworks/runtime/mixins/enumerable.js +1 -1
  273. data/lib/frameworks/sproutcore/frameworks/runtime/mixins/observable.js +156 -66
  274. data/lib/frameworks/sproutcore/frameworks/runtime/private/observer_set.js +2 -2
  275. data/lib/frameworks/sproutcore/frameworks/runtime/system/binding.js +150 -65
  276. data/lib/frameworks/sproutcore/frameworks/runtime/system/index_set.js +57 -11
  277. data/lib/frameworks/sproutcore/frameworks/runtime/system/object.js +68 -49
  278. data/lib/frameworks/sproutcore/frameworks/runtime/system/run_loop.js +14 -6
  279. data/lib/frameworks/sproutcore/frameworks/runtime/system/string.js +23 -23
  280. data/lib/frameworks/sproutcore/frameworks/runtime/tests/ext/number_test.js +44 -0
  281. data/lib/frameworks/sproutcore/frameworks/runtime/tests/mixins/array.js +0 -10
  282. data/lib/frameworks/sproutcore/frameworks/runtime/tests/mixins/enumerable/enumerable.js +340 -285
  283. data/lib/frameworks/sproutcore/frameworks/runtime/tests/system/binding.js +104 -3
  284. data/lib/frameworks/sproutcore/frameworks/runtime/tests/system/observer_set.js +14 -1
  285. data/lib/frameworks/sproutcore/frameworks/runtime/tests/system/string.js +15 -2
  286. data/lib/frameworks/sproutcore/frameworks/statechart/system/state.js +21 -18
  287. data/lib/frameworks/sproutcore/frameworks/statechart/system/statechart.js +52 -19
  288. data/lib/frameworks/sproutcore/frameworks/statechart/tests/event_handling/responder/pane.js +27 -24
  289. data/lib/frameworks/sproutcore/frameworks/template_view/controls/button.js +30 -0
  290. data/lib/frameworks/sproutcore/frameworks/template_view/ext/handlebars/bind.js +1 -1
  291. data/lib/frameworks/sproutcore/frameworks/template_view/ext/handlebars/collection.js +2 -0
  292. data/lib/frameworks/sproutcore/frameworks/template_view/ext/handlebars/view.js +1 -0
  293. data/lib/frameworks/sproutcore/frameworks/template_view/tests/mixins/template_helpers/checkbox_support.js +2 -2
  294. data/lib/frameworks/sproutcore/frameworks/template_view/tests/views/template/handlebars.js +4 -2
  295. data/lib/frameworks/sproutcore/frameworks/template_view/views/bindable_span.js +1 -1
  296. data/lib/frameworks/sproutcore/frameworks/template_view/views/template_collection.js +16 -14
  297. data/lib/frameworks/sproutcore/frameworks/testing/core.js +5 -3
  298. data/lib/frameworks/sproutcore/frameworks/testing/system/plan.js +13 -0
  299. data/lib/frameworks/sproutcore/lib/index.rhtml +2 -2
  300. data/lib/frameworks/sproutcore/phantomjs/test_runner.js +28 -7
  301. data/lib/frameworks/sproutcore/scripts/run_sc_server_master.sh +1 -1
  302. data/lib/frameworks/sproutcore/themes/ace/resources/_variables.css +2 -0
  303. data/lib/frameworks/sproutcore/themes/ace/resources/disclosure/ace/disclosure.css +1 -0
  304. data/lib/frameworks/sproutcore/themes/ace/resources/picker/popover/popover.css +3 -4
  305. data/lib/frameworks/sproutcore/themes/ace/resources/scroller/horizontal/horizontal.css +15 -15
  306. data/lib/frameworks/sproutcore/themes/ace/resources/scroller/horizontal/horizontal_overlay.css +74 -0
  307. data/lib/frameworks/sproutcore/themes/ace/resources/scroller/vertical/vertical.css +11 -13
  308. data/lib/frameworks/sproutcore/themes/ace/resources/scroller/vertical/vertical_overlay.css +74 -0
  309. data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/jumbo/knob-active.png +0 -0
  310. data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/jumbo/knob-active@2x.png +0 -0
  311. data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/jumbo/knob.png +0 -0
  312. data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/jumbo/knob@2x.png +0 -0
  313. data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/{22px → jumbo}/slider.css +9 -4
  314. data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/jumbo/track.png +0 -0
  315. data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/jumbo/track@2x.png +0 -0
  316. data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/regular/knob-active.png +0 -0
  317. data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/regular/knob-active@2x.png +0 -0
  318. data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/regular/knob.png +0 -0
  319. data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/regular/knob@2x.png +0 -0
  320. data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/regular/slider.css +32 -0
  321. data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/regular/track.png +0 -0
  322. data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/regular/track@2x.png +0 -0
  323. data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/slider.css +13 -0
  324. data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/small/knob-active.png +0 -0
  325. data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/small/knob-active@2x.png +0 -0
  326. data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/small/knob.png +0 -0
  327. data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/small/knob@2x.png +0 -0
  328. data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/small/slider.css +32 -0
  329. data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/small/track.png +0 -0
  330. data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/small/track@2x.png +0 -0
  331. data/lib/frameworks/sproutcore/themes/ace/resources/split/split.css +2 -3
  332. data/lib/sproutcore/builders/chance_file.rb +3 -3
  333. data/lib/sproutcore/helpers/minifier.rb +1 -0
  334. data/vendor/chance/lib/chance/instance.rb +34 -34
  335. data/vendor/chance/lib/chance/instance/spriting.rb +21 -16
  336. metadata +81 -58
  337. data/lib/frameworks/sproutcore/frameworks/core_foundation/panes/visibility.js +0 -17
  338. data/lib/frameworks/sproutcore/frameworks/desktop/mixins/collection_fast_path.js +0 -710
  339. data/lib/frameworks/sproutcore/frameworks/desktop/mixins/scrollable.js +0 -267
  340. data/lib/frameworks/sproutcore/frameworks/desktop/resources/touch-scroller.css +0 -196
  341. data/lib/frameworks/sproutcore/frameworks/desktop/system/undo_manager.js +0 -224
  342. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/select_field/methods.js +0 -163
  343. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/select_field/ui.js +0 -177
  344. data/lib/frameworks/sproutcore/frameworks/desktop/views/scroll.js +0 -2053
  345. data/lib/frameworks/sproutcore/frameworks/desktop/views/select_button.js +0 -1024
  346. data/lib/frameworks/sproutcore/frameworks/desktop/views/select_field.js +0 -404
  347. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/menu/render_delegates/menu_scroller.js +0 -28
  348. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/menu/tests/menu/scroll.js +0 -235
  349. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/menu/views/menu/scroll.js +0 -363
  350. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/menu/views/menu/scroller.js +0 -250
  351. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/polymorphism/README.md +0 -47
  352. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/polymorphism/models/record.js +0 -134
  353. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/render_delegates/desktop_scroller.js +0 -92
  354. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/render_delegates/native_scroll.js +0 -25
  355. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/render_delegates/scroll.js +0 -33
  356. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/render_delegates/touch_scroller.js +0 -76
  357. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/tests/scroll/integration.js +0 -25
  358. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/tests/scroll/methods.js +0 -143
  359. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/tests/scroll/ui.js +0 -256
  360. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/views/core_scroll.js +0 -1164
  361. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/views/core_scroller.js +0 -332
  362. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/views/desktop/scroll.js +0 -236
  363. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/views/desktop/scroller.js +0 -347
  364. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/views/scroll.js +0 -15
  365. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/views/scroller.js +0 -10
  366. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/views/touch/scroll.js +0 -804
  367. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/views/touch/scroller.js +0 -133
  368. data/lib/frameworks/sproutcore/frameworks/foundation/tasks/preload_bundle.js +0 -41
  369. data/lib/frameworks/sproutcore/themes/ace/resources/scroller/horizontal/horizontal_touch.css +0 -91
  370. data/lib/frameworks/sproutcore/themes/ace/resources/scroller/vertical/vertical_touch.css +0 -92
  371. data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/14px/knob.png +0 -0
  372. data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/14px/knob_active.png +0 -0
  373. data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/14px/slider.css +0 -27
  374. data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/16px/knob.png +0 -0
  375. data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/16px/knob_active.png +0 -0
  376. data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/16px/slider.css +0 -27
  377. data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/22px/knob.png +0 -0
  378. data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/22px/knob_active.png +0 -0
  379. data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/22px/track.png +0 -0
  380. data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/track.png +0 -0
@@ -50,21 +50,11 @@ var DummyArray = SC.Object.extend(SC.Array, {
50
50
  this.set('length', this.content.length) ;
51
51
  this.endPropertyChanges();
52
52
 
53
- // Both arrayContentDidChange and enumerableContentDidChange will invoke
54
- // "this.notifyPropertyChange('[]')". To prevent multiple notifications
55
- // these calls are made as grouped property changes.
56
- this.beginPropertyChanges();
57
-
58
- // Call the general-purpose enumerableContentDidChange
59
- // Enumerable method.
60
- this.enumerableContentDidChange(idx, amt, len - amt) ;
61
-
62
53
  // SC.Array implementations must call arrayContentDidChange
63
54
  // after making mutations. This allows observers to perform
64
55
  // operations based on the mutation. For instance, a listener
65
56
  // might want to reflect additions onto itself.
66
57
  this.arrayContentDidChange(idx, amt, len);
67
- this.endPropertyChanges();
68
58
  },
69
59
 
70
60
  // SC.Arrays must implement objectAt, which returns an object
@@ -4,48 +4,64 @@
4
4
  // Portions ©2008-2011 Apple Inc. All rights reserved.
5
5
  // License: Licensed under MIT license (see license.js)
6
6
  // ==========================================================================
7
+ /*global module, test, ok, isObj, equals, expects */
7
8
 
8
- /*globals module test ok isObj equals expects */
9
9
 
10
- var enumerables ; // global variables
11
-
12
- var DummyEnumerable = SC.Object.extend( SC.Enumerable, {
10
+ var enumerables; // global variables
11
+ var DummyEnumerable = SC.Object.extend(SC.Enumerable, {
13
12
 
14
13
  content: [],
15
14
 
16
- length: function() { return this.content.length; }.property(),
15
+ length: function () { return this.content.length; }.property(),
17
16
 
18
- objectAt: function(idx) { return this.content[idx]; },
17
+ objectAt: function (idx) { return this.content[idx]; },
19
18
 
20
- nextObject: function(idx) { return this.content[idx]; },
19
+ nextObject: function (idx) { return this.content[idx]; },
21
20
 
22
21
  // add support for reduced properties.
23
- unknownProperty: function(key, value) {
24
- var ret = this.reducedProperty(key, value) ;
22
+ unknownProperty: function (key, value) {
23
+ var ret = this.reducedProperty(key, value);
25
24
  if (ret === undefined) {
26
- if (value !== undefined) this[key] = value ;
27
- ret = value ;
25
+ if (value !== undefined) this[key] = value;
26
+ ret = value;
28
27
  }
29
- return ret ;
28
+ return ret;
29
+ },
30
+
31
+ replace: function (start, removed, added) {
32
+ var ret = this.content.replace(start, removed, added),
33
+ addedLength = added ? added.length : 0;
34
+
35
+ this.enumerableContentDidChange(start, addedLength, addedLength - removed);
36
+ return ret;
37
+ },
38
+
39
+ unshiftObject: function (object) {
40
+ this.replace(0, 0, [object]);
41
+ return object;
30
42
  },
31
43
 
32
- shiftObject: function() {
33
- var ret = this.content.shift();
34
- this.enumerableContentDidChange(0, 1);
44
+ shiftObject: function () {
45
+ var ret = this.replace(0, 1);
35
46
  return ret;
36
47
  },
37
48
 
38
- pushObject: function(object) {
39
- this.content.push(object) ;
40
- this.enumerableContentDidChange(this.content.length - 2, 1);
49
+ pushObject: function (object) {
50
+ this.replace(this.content.length - 1, 0, [object]);
51
+ return object;
52
+ },
53
+
54
+ popObject: function () {
55
+ var ret = this.replace(this.content.length - 1, 1);
56
+ return ret;
41
57
  }
42
58
 
43
59
  });
44
60
 
45
- var runFunc = function(a,b) { return ['DONE', a, b]; } ;
46
- var invokeWhileOK = function() { return "OK"; } ;
47
- var invokeWhileNotOK = function() { return "FAIL"; };
48
- var reduceTestFunc = function(prev, item, idx, e, pname) { return pname||'TEST'; } ;
61
+ var runFunc = function (a, b) { return ['DONE', a, b]; };
62
+ var invokeWhileOK = function () { return "OK"; };
63
+ var invokeWhileNotOK = function () { return "FAIL"; };
64
+ var reduceTestFunc = function (prev, item, idx, e, pname) { return pname || 'TEST'; };
49
65
 
50
66
  var CommonArray = [
51
67
  {
@@ -99,429 +115,468 @@ var CommonArray = [
99
115
 
100
116
  module("Real Array & DummyEnumerable", {
101
117
 
102
- setup: function() {
103
- enumerables = [SC.$A(CommonArray), DummyEnumerable.create({ content: SC.clone(CommonArray) })] ;
118
+ setup: function () {
119
+ enumerables = [SC.$A(CommonArray), DummyEnumerable.create({ content: SC.clone(CommonArray) })];
104
120
  },
105
121
 
106
- teardown: function() {
107
- delete enumerables;
108
- delete Array.prototype["@max(balance)"] ; // remove cached value
109
- delete Array.prototype["@min(balance)"] ;
122
+ teardown: function () {
123
+ enumerables = null;
124
+ delete Array.prototype["@max(balance)"]; // remove cached value
125
+ delete Array.prototype["@min(balance)"];
110
126
  }
111
127
 
112
128
  });
113
129
 
114
- test("should get enumerator that iterates through objects", function() {
115
- var src, ary2 = enumerables ;
130
+ test("should get enumerator that iterates through objects", function () {
131
+ var src, ary2 = enumerables;
116
132
  for (var idx2=0, len2=ary2.length; idx2<len2; idx2++) {
117
- src = ary2[idx2] ;
118
- var e = src.enumerator() ;
133
+ src = ary2[idx2];
134
+ var e = src.enumerator();
119
135
  ok(e !== null, 'enumerator must not be null');
120
136
 
121
137
  var idx = 0;
122
- var cur ;
138
+ var cur;
123
139
  while(cur = e.nextObject()) {
124
- equals(src.objectAt(idx), cur, "object at index %@".fmt(idx)) ;
140
+ equals(src.objectAt(idx), cur, "object at index %@".fmt(idx));
125
141
  idx++;
126
142
  }
127
143
 
128
- equals(src.get('length'), idx) ;
144
+ equals(src.get('length'), idx);
129
145
  }
130
146
  });
131
147
 
132
- test("should return firstObject for item with content", function() {
133
- var src, ary2 = enumerables ;
148
+ test("should return firstObject for item with content", function () {
149
+ var src, ary2 = enumerables;
134
150
  for (var idx2=0, len2=ary2.length; idx2<len2; idx2++) {
135
- src = ary2[idx2] ;
151
+ src = ary2[idx2];
136
152
  equals(src.firstObject(), CommonArray[0], 'firstObject should return first object');
137
153
  }
138
154
 
139
155
  equals([].firstObject(), undefined, 'firstObject() on empty enumerable should return undefined');
140
156
  });
141
157
 
142
- test("should run forEach() to go through objects", function() {
143
- var src, ary2 = enumerables ;
158
+ test("should run forEach() to go through objects", function () {
159
+ var src, ary2 = enumerables;
144
160
  for (var idx2=0, len2=ary2.length; idx2<len2; idx2++) {
145
- src = ary2[idx2] ;
161
+ src = ary2[idx2];
146
162
  var idx = 0;
147
163
 
148
164
  // save for testing later
149
- var items = [] ;
150
- var indexes = [] ;
151
- var arrays = [] ;
152
- var targets = [] ;
165
+ var items = [];
166
+ var indexes = [];
167
+ var arrays = [];
168
+ var targets = [];
153
169
 
154
- src.forEach(function(item, index, array) {
170
+ src.forEach(function (item, index, array) {
155
171
  items.push(item);
156
172
  indexes.push(index);
157
173
  arrays.push(array);
158
174
  targets.push(this);
159
175
  }, this);
160
176
 
161
- var len = src.get('length') ;
177
+ var len = src.get('length');
162
178
  for(idx=0;idx<len;idx++) {
163
- equals(items[idx], src.objectAt(idx)) ;
164
- equals(indexes[idx], idx) ;
165
- equals(arrays[idx], src) ;
179
+ equals(items[idx], src.objectAt(idx));
180
+ equals(indexes[idx], idx);
181
+ equals(arrays[idx], src);
166
182
 
167
183
  // use this method because equals() is taking too much time to log out
168
184
  // results. probably an issue with jsDump
169
- ok(targets[idx] === this, 'target should always be this') ;
185
+ ok(targets[idx] === this, 'target should always be this');
170
186
  }
171
187
  }
172
188
  });
173
189
 
174
- test("should map to values while passing proper params", function() {
175
- var src, ary2 = enumerables ;
190
+ test("should map to values while passing proper params", function () {
191
+ var src, ary2 = enumerables;
176
192
  for (var idx2=0, len2=ary2.length; idx2<len2; idx2++) {
177
- src = ary2[idx2] ;
193
+ src = ary2[idx2];
178
194
  var idx = 0;
179
195
 
180
196
  // save for testing later
181
- var items = [] ;
182
- var indexes = [] ;
183
- var arrays = [] ;
184
- var targets = [] ;
197
+ var items = [];
198
+ var indexes = [];
199
+ var arrays = [];
200
+ var targets = [];
185
201
 
186
- var mapped = src.map(function(item, index, array) {
202
+ var mapped = src.map(function (item, index, array) {
187
203
  items.push(item);
188
204
  indexes.push(index);
189
205
  arrays.push(array);
190
206
  targets.push(this);
191
207
 
192
- return index ;
208
+ return index;
193
209
  }, this);
194
210
 
195
- var len = src.get('length') ;
211
+ var len = src.get('length');
196
212
  for(idx=0;idx<len;idx++) {
197
- equals(src.objectAt(idx), items[idx], "items") ;
198
- equals(idx, indexes[idx], "indexes") ;
199
- equals(src, arrays[idx], 'arrays') ;
200
- equals(SC.guidFor(this), SC.guidFor(targets[idx]), "this") ;
213
+ equals(src.objectAt(idx), items[idx], "items");
214
+ equals(idx, indexes[idx], "indexes");
215
+ equals(src, arrays[idx], 'arrays');
216
+ equals(SC.guidFor(this), SC.guidFor(targets[idx]), "this");
201
217
 
202
- equals(idx, mapped[idx], "mapped") ;
218
+ equals(idx, mapped[idx], "mapped");
203
219
  }
204
220
  }
205
221
  });
206
222
 
207
- test("should filter to items that return for callback", function() {
208
- var src, ary2 = enumerables ;
223
+ test("should filter to items that return for callback", function () {
224
+ var src, ary2 = enumerables;
209
225
  for (var idx2=0, len2=ary2.length; idx2<len2; idx2++) {
210
- src = ary2[idx2] ;
226
+ src = ary2[idx2];
211
227
  var idx = 0;
212
228
 
213
229
  // save for testing later
214
- var items = [] ;
215
- var indexes = [] ;
216
- var arrays = [] ;
217
- var targets = [] ;
230
+ var items = [];
231
+ var indexes = [];
232
+ var arrays = [];
233
+ var targets = [];
218
234
 
219
- var filtered = src.filter(function(item, index, array) {
235
+ var filtered = src.filter(function (item, index, array) {
220
236
  items.push(item);
221
237
  indexes.push(index);
222
238
  arrays.push(array);
223
239
  targets.push(this);
224
240
 
225
- return item.gender === "female" ;
241
+ return item.gender === "female";
226
242
  }, this);
227
243
 
228
- var len = src.get('length') ;
244
+ var len = src.get('length');
229
245
  for(idx=0;idx<len;idx++) {
230
- equals(src.objectAt(idx), items[idx], "items") ;
231
- equals(idx, indexes[idx], "indexes") ;
232
- equals(src, arrays[idx], 'arrays') ;
233
- equals(SC.guidFor(this), SC.guidFor(targets[idx]), "this") ;
246
+ equals(src.objectAt(idx), items[idx], "items");
247
+ equals(idx, indexes[idx], "indexes");
248
+ equals(src, arrays[idx], 'arrays');
249
+ equals(SC.guidFor(this), SC.guidFor(targets[idx]), "this");
234
250
  }
235
251
 
236
- equals(filtered.length, 1) ;
237
- equals(filtered[0].first, "Jenna") ;
252
+ equals(filtered.length, 1);
253
+ equals(filtered[0].first, "Jenna");
238
254
  }
239
255
  });
240
256
 
241
- test("should return true if function for every() returns true", function() {
242
- var src, ary2 = enumerables ;
257
+ test("should return true if function for every() returns true", function () {
258
+ var src, ary2 = enumerables;
243
259
  for (var idx2=0, len2=ary2.length; idx2<len2; idx2++) {
244
- src = ary2[idx2] ;
245
- var idx = 0 ;
260
+ src = ary2[idx2];
261
+ var idx = 0;
246
262
 
247
263
  // save for testing later
248
- var items = [] ;
249
- var indexes = [] ;
250
- var arrays = [] ;
251
- var targets = [] ;
252
-
253
- var result = src.every(function(item, index, array) {
254
- items.push(item) ;
255
- indexes.push(index) ;
256
- arrays.push(array) ;
257
- targets.push(this) ;
258
-
259
- return true ;
264
+ var items = [];
265
+ var indexes = [];
266
+ var arrays = [];
267
+ var targets = [];
268
+
269
+ var result = src.every(function (item, index, array) {
270
+ items.push(item);
271
+ indexes.push(index);
272
+ arrays.push(array);
273
+ targets.push(this);
274
+
275
+ return true;
260
276
  }, this);
261
277
 
262
- var len = src.get('length') ;
278
+ var len = src.get('length');
263
279
  for(idx=0;idx<len;idx++) {
264
- equals(src.objectAt(idx), items[idx], "items") ;
265
- equals(idx, indexes[idx], "indexes") ;
266
- equals(src, arrays[idx], 'arrays') ;
267
- equals(SC.guidFor(this), SC.guidFor(targets[idx]), "this") ;
280
+ equals(src.objectAt(idx), items[idx], "items");
281
+ equals(idx, indexes[idx], "indexes");
282
+ equals(src, arrays[idx], 'arrays');
283
+ equals(SC.guidFor(this), SC.guidFor(targets[idx]), "this");
268
284
  }
269
285
 
270
- equals(result, YES) ;
286
+ equals(result, YES);
271
287
  }
272
288
  });
273
289
 
274
- test("should return false if one function for every() returns false", function() {
275
- var src, ary2 = enumerables ;
290
+ test("should return false if one function for every() returns false", function () {
291
+ var src, ary2 = enumerables;
276
292
  for (var idx2=0, len2=ary2.length; idx2<len2; idx2++) {
277
- src = ary2[idx2] ;
278
- var result = src.every(function(item, index, array) {
279
- return item.gender === "male" ;
293
+ src = ary2[idx2];
294
+ var result = src.every(function (item, index, array) {
295
+ return item.gender === "male";
280
296
  }, this);
281
- equals(result, NO) ;
297
+ equals(result, NO);
282
298
  }
283
299
  });
284
300
 
285
- test("should return false if all functions for some() returns false", function() {
286
- var src, ary2 = enumerables ;
301
+ test("should return false if all functions for some() returns false", function () {
302
+ var src, ary2 = enumerables;
287
303
  for (var idx2=0, len2=ary2.length; idx2<len2; idx2++) {
288
- src = ary2[idx2] ;
289
- var idx = 0 ;
304
+ src = ary2[idx2];
305
+ var idx = 0;
290
306
 
291
307
  // save for testing later
292
- var items = [] ;
293
- var indexes = [] ;
294
- var arrays = [] ;
295
- var targets = [] ;
296
-
297
- var result = src.some(function(item, index, array) {
298
- items.push(item) ;
299
- indexes.push(index) ;
300
- arrays.push(array) ;
301
- targets.push(this) ;
302
-
303
- return false ;
308
+ var items = [];
309
+ var indexes = [];
310
+ var arrays = [];
311
+ var targets = [];
312
+
313
+ var result = src.some(function (item, index, array) {
314
+ items.push(item);
315
+ indexes.push(index);
316
+ arrays.push(array);
317
+ targets.push(this);
318
+
319
+ return false;
304
320
  }, this);
305
321
 
306
- var len = src.get('length') ;
322
+ var len = src.get('length');
307
323
  for(idx=0;idx<len;idx++) {
308
- equals(src.objectAt(idx), items[idx], "items") ;
309
- equals(idx, indexes[idx], "indexes") ;
310
- equals(src, arrays[idx], 'arrays') ;
311
- equals(SC.guidFor(this), SC.guidFor(targets[idx]), "this") ;
324
+ equals(src.objectAt(idx), items[idx], "items");
325
+ equals(idx, indexes[idx], "indexes");
326
+ equals(src, arrays[idx], 'arrays');
327
+ equals(SC.guidFor(this), SC.guidFor(targets[idx]), "this");
312
328
  }
313
329
 
314
- equals(result, NO) ;
330
+ equals(result, NO);
315
331
  }
316
332
  });
317
333
 
318
- test("should return true if one function for some() returns true", function() {
319
- var src, ary2 = enumerables ;
334
+ test("should return true if one function for some() returns true", function () {
335
+ var src, ary2 = enumerables;
320
336
  for (var idx2=0, len2=ary2.length; idx2<len2; idx2++) {
321
- src = ary2[idx2] ;
322
- var result = src.some(function(item, index, array) {
323
- return item.gender !== "male" ;
337
+ src = ary2[idx2];
338
+ var result = src.some(function (item, index, array) {
339
+ return item.gender !== "male";
324
340
  }, this);
325
- equals(result, YES) ;
341
+ equals(result, YES);
326
342
  }
327
343
  });
328
344
 
329
- test("should mapProperty for all items", function() {
330
- var src, ary2 = enumerables ;
345
+ test("should mapProperty for all items", function () {
346
+ var src, ary2 = enumerables;
331
347
  for (var idx2=0, len2=ary2.length; idx2<len2; idx2++) {
332
- src = ary2[idx2] ;
333
- var mapped = src.mapProperty("first") ;
334
- var idx ;
335
- var len = src.get('length') ;
348
+ src = ary2[idx2];
349
+ var mapped = src.mapProperty("first");
350
+ var idx;
351
+ var len = src.get('length');
336
352
  for(idx=0;idx<len;idx++) {
337
- equals(mapped[idx], src.objectAt(idx).first) ;
353
+ equals(mapped[idx], src.objectAt(idx).first);
338
354
  }
339
355
  }
340
356
  });
341
357
 
342
- test("should filterProperty with match", function() {
343
- var src, ary2 = enumerables ;
358
+ test("should filterProperty with match", function () {
359
+ var src, ary2 = enumerables;
344
360
  for (var idx2=0, len2=ary2.length; idx2<len2; idx2++) {
345
- src = ary2[idx2] ;
346
- var filtered = src.filterProperty("gender", "female") ;
347
- equals(filtered.length, 1) ;
348
- equals(filtered[0].first, "Jenna") ;
361
+ src = ary2[idx2];
362
+ var filtered = src.filterProperty("gender", "female");
363
+ equals(filtered.length, 1);
364
+ equals(filtered[0].first, "Jenna");
349
365
  }
350
366
  });
351
367
 
352
- test("should filterProperty with default bool", function() {
353
- var src, ary2 = enumerables ;
368
+ test("should filterProperty with default bool", function () {
369
+ var src, ary2 = enumerables;
354
370
  for (var idx2=0, len2=ary2.length; idx2<len2; idx2++) {
355
- src = ary2[idx2] ;
356
- var filtered = src.filterProperty("californian") ;
357
- equals(filtered.length, 1) ;
358
- equals(filtered[0].first, "Jenna") ;
371
+ src = ary2[idx2];
372
+ var filtered = src.filterProperty("californian");
373
+ equals(filtered.length, 1);
374
+ equals(filtered[0].first, "Jenna");
359
375
  }
360
376
  });
361
377
 
362
- test("should groupBy a given property", function() {
363
- var src, ary2 = enumerables ;
378
+ test("should groupBy a given property", function () {
379
+ var src, ary2 = enumerables;
364
380
  for (var idx2=0, len2=ary2.length; idx2<len2; idx2++) {
365
- src = ary2[idx2] ;
366
- var filtered = src.groupBy("gender") ;
367
- equals(filtered.length, 2) ;
368
- equals(filtered[1][0].first, "Jenna") ;
381
+ src = ary2[idx2];
382
+ var filtered = src.groupBy("gender");
383
+ equals(filtered.length, 2);
384
+ equals(filtered[1][0].first, "Jenna");
369
385
  }
370
386
  });
371
387
 
372
388
 
373
- test("everyProperty should return true if all properties macth", function() {
374
- var src, ary2 = enumerables ;
389
+ test("everyProperty should return true if all properties macth", function () {
390
+ var src, ary2 = enumerables;
375
391
  for (var idx2=0, len2=ary2.length; idx2<len2; idx2++) {
376
- src = ary2[idx2] ;
377
- var ret = src.everyProperty('visited', 'Prague') ;
378
- equals(YES, ret, "visited") ;
392
+ src = ary2[idx2];
393
+ var ret = src.everyProperty('visited', 'Prague');
394
+ equals(YES, ret, "visited");
379
395
  }
380
396
  });
381
397
 
382
- test("everyProperty should return true if all properties true", function() {
383
- var src, ary2 = enumerables ;
398
+ test("everyProperty should return true if all properties true", function () {
399
+ var src, ary2 = enumerables;
384
400
  for (var idx2=0, len2=ary2.length; idx2<len2; idx2++) {
385
- src = ary2[idx2] ;
386
- var ret = src.everyProperty('ready') ;
387
- equals(YES, ret, "ready") ;
401
+ src = ary2[idx2];
402
+ var ret = src.everyProperty('ready');
403
+ equals(YES, ret, "ready");
388
404
  }
389
405
  });
390
406
 
391
- test("everyProperty should return false if any properties false", function() {
392
- var src, ary2 = enumerables ;
407
+ test("everyProperty should return false if any properties false", function () {
408
+ var src, ary2 = enumerables;
393
409
  for (var idx2=0, len2=ary2.length; idx2<len2; idx2++) {
394
- src = ary2[idx2] ;
395
- var ret = src.everyProperty('gender', 'male') ;
396
- equals(NO, ret, "ready") ;
410
+ src = ary2[idx2];
411
+ var ret = src.everyProperty('gender', 'male');
412
+ equals(NO, ret, "ready");
397
413
  }
398
414
  });
399
415
 
400
- test("someProperty should return false if all properties not match", function() {
401
- var src, ary2 = enumerables ;
416
+ test("someProperty should return false if all properties not match", function () {
417
+ var src, ary2 = enumerables;
402
418
  for (var idx2=0, len2=ary2.length; idx2<len2; idx2++) {
403
- src = ary2[idx2] ;
404
- var ret = src.someProperty('visited', 'Timbuktu') ;
405
- equals(NO, ret, "visited") ;
419
+ src = ary2[idx2];
420
+ var ret = src.someProperty('visited', 'Timbuktu');
421
+ equals(NO, ret, "visited");
406
422
  }
407
423
  });
408
424
 
409
- test("someProperty should return false if all properties false", function() {
410
- var src, ary2 = enumerables ;
425
+ test("someProperty should return false if all properties false", function () {
426
+ var src, ary2 = enumerables;
411
427
  for (var idx2=0, len2=ary2.length; idx2<len2; idx2++) {
412
- src = ary2[idx2] ;
413
- var ret = src.someProperty('doneTravelling') ;
414
- equals(NO, ret, "doneTravelling") ;
428
+ src = ary2[idx2];
429
+ var ret = src.someProperty('doneTravelling');
430
+ equals(NO, ret, "doneTravelling");
415
431
  }
416
432
  });
417
433
 
418
- test("someProperty should return true if any properties true", function() {
419
- var src, ary2 = enumerables ;
434
+ test("someProperty should return true if any properties true", function () {
435
+ var src, ary2 = enumerables;
420
436
  for (var idx2=0, len2=ary2.length; idx2<len2; idx2++) {
421
- src = ary2[idx2] ;
422
- var ret = src.someProperty('first', 'Charles') ;
423
- equals(YES, ret, "first") ;
437
+ src = ary2[idx2];
438
+ var ret = src.someProperty('first', 'Charles');
439
+ equals(YES, ret, "first");
424
440
  }
425
441
  });
426
442
 
427
- test("invokeWhile should call method on member objects until return does not match", function() {
428
- var src, ary2 = enumerables ;
443
+ test("invokeWhile should call method on member objects until return does not match", function () {
444
+ var src, ary2 = enumerables;
429
445
  for (var idx2=0, len2=ary2.length; idx2<len2; idx2++) {
430
- src = ary2[idx2] ;
431
- var ret = src.invokeWhile("OK", "invokeWhileTest", "item2") ;
446
+ src = ary2[idx2];
447
+ var ret = src.invokeWhile("OK", "invokeWhileTest", "item2");
432
448
  equals("FAIL", ret, "return value");
433
449
  }
434
450
  });
435
451
 
436
- test("get @min(balance) should return the minimum balance", function() {
437
- var src, ary2 = enumerables ;
452
+ test("get @min(balance) should return the minimum balance", function () {
453
+ var src, ary2 = enumerables;
438
454
  for (var idx2=0, len2=ary2.length; idx2<len2; idx2++) {
439
- src = ary2[idx2] ;
440
- equals(1, src.get('@min(balance)')) ;
455
+ src = ary2[idx2];
456
+ equals(1, src.get('@min(balance)'));
441
457
  }
442
458
  });
443
459
 
444
- test("get @max(balance) should return the maximum balance", function() {
445
- var src, ary2 = enumerables ;
460
+ test("get @max(balance) should return the maximum balance", function () {
461
+ var src, ary2 = enumerables;
446
462
  for (var idx2=0, len2=ary2.length; idx2<len2; idx2++) {
447
- src = ary2[idx2] ;
448
- equals(4, src.get('@max(balance)')) ;
463
+ src = ary2[idx2];
464
+ equals(4, src.get('@max(balance)'));
449
465
  }
450
466
  });
451
467
 
452
- test("get @minObject(balance) should return the record with min balance", function() {
453
- var src, ary2 = enumerables ;
468
+ test("get @minObject(balance) should return the record with min balance", function () {
469
+ var src, ary2 = enumerables;
454
470
  for (var idx2=0, len2=ary2.length; idx2<len2; idx2++) {
455
- src = ary2[idx2] ;
456
- equals(src.objectAt(0), src.get('@minObject(balance)')) ;
471
+ src = ary2[idx2];
472
+ equals(src.objectAt(0), src.get('@minObject(balance)'));
457
473
  }
458
474
  });
459
475
 
460
- test("get @maxObject(balance) should return the record with the max balance", function() {
461
- var src, ary2 = enumerables ;
476
+ test("get @maxObject(balance) should return the record with the max balance", function () {
477
+ var src, ary2 = enumerables;
462
478
  for (var idx2=0, len2=ary2.length; idx2<len2; idx2++) {
463
- src = ary2[idx2] ;
464
- equals(src.objectAt(3), src.get('@maxObject(balance)')) ;
479
+ src = ary2[idx2];
480
+ equals(src.objectAt(3), src.get('@maxObject(balance)'));
465
481
  }
466
482
  });
467
483
 
468
- test("get @sum(balance) should return the sum of the balances.", function() {
469
- var src, ary2 = enumerables ;
484
+ test("get @sum(balance) should return the sum of the balances.", function () {
485
+ var src, ary2 = enumerables;
470
486
  for (var idx2=0, len2=ary2.length; idx2<len2; idx2++) {
471
- src = ary2[idx2] ;
472
- equals(1+2+3+4, src.get("@sum(balance)")) ;
487
+ src = ary2[idx2];
488
+ equals(1+2+3+4, src.get("@sum(balance)"));
473
489
  }
474
490
  });
475
491
 
476
- test("get @average(balance) should return the average of balances", function() {
477
- var src, ary2 = enumerables ;
492
+ test("get @average(balance) should return the average of balances", function () {
493
+ var src, ary2 = enumerables;
478
494
  for (var idx2=0, len2=ary2.length; idx2<len2; idx2++) {
479
- src = ary2[idx2] ;
480
- equals((1+2+3+4)/4, src.get("@average(balance)")) ;
495
+ src = ary2[idx2];
496
+ equals((1+2+3+4)/4, src.get("@average(balance)"));
481
497
  }
482
498
  });
483
499
 
484
- test("should invoke custom reducer", function() {
485
- var src, ary2 = enumerables ;
500
+ test("should invoke custom reducer", function () {
501
+ var src, ary2 = enumerables;
486
502
  for (var idx2=0, len2=ary2.length; idx2<len2; idx2++) {
487
- src = ary2[idx2] ;
503
+ src = ary2[idx2];
488
504
  // install reducer method
489
- src.reduceTest = reduceTestFunc ;
490
- equals("TEST", src.get("@test")) ;
491
- equals("prop", src.get("@test(prop)")) ;
505
+ src.reduceTest = reduceTestFunc;
506
+ equals("TEST", src.get("@test"));
507
+ equals("prop", src.get("@test(prop)"));
492
508
  }
493
509
  });
494
510
 
495
- test("should trigger observer on property when lastObject changes", function() {
496
- var src, ary2 = enumerables;
497
- for (var idx2=0, len2=ary2.length; idx2<len2; idx2++) {
498
- src = ary2[idx2];
511
+ test("Should trigger observer on lastObject property when it changes", function () {
499
512
 
500
- var callCount = 0;
501
- src.addObserver("lastObject", function() {
513
+ // Perform tests on each sample enumerable in enumerables.
514
+ for (var i = 0, len = enumerables.length; i < len; i++) {
515
+ var enumerable = enumerables[i],
516
+ enumerableLength = enumerable.get('length'),
517
+ callCount = 0,
518
+ testObject = {
519
+ first: "John",
520
+ };
521
+
522
+ // Observe the enumerable for updates to `lastObject`.
523
+ enumerable.addObserver("lastObject", function () {
502
524
  callCount++;
503
525
  });
504
526
 
505
- src.pushObject({
506
- first: "John",
507
- gender: "male",
508
- californian: NO,
509
- ready: YES,
510
- visited: "Paris",
511
- balance: 5
512
- });
527
+ // Inserting an item in the middle doesn't change lastObject.
528
+ enumerable.replace(1, 0, [testObject]);
529
+ equals(callCount, 0, "The lastObject observer should have fired this many times (replace on enumerable %@)".fmt(i + 1));
513
530
 
514
- equals(callCount, 1, "callCount");
531
+ // Removing an item in the middle doesn't change lastObject.
532
+ enumerable.replace(1, 1);
533
+ equals(callCount, 0, "The lastObject observer should have fired this many times (replace on enumerable %@)".fmt(i + 1));
534
+
535
+ // Shifting an item to the front doesn't change lastObject.
536
+ enumerable.shiftObject(testObject);
537
+ equals(callCount, 0, "The lastObject observer should have fired this many times (shiftObject on enumerable %@)".fmt(i + 1));
538
+
539
+ // Unshifting an item from the front doesn't change lastObject.
540
+ enumerable.unshiftObject(testObject);
541
+ equals(callCount, 0, "The lastObject observer should have fired this many times (unshiftObject on enumerable %@)".fmt(i + 1));
542
+
543
+ // Appending an item to the end changes the lastObject.
544
+ enumerable.pushObject(testObject);
545
+ equals(callCount, 1, "The lastObject observer should have fired this many times (pushObject on enumerable %@)".fmt(i + 1));
546
+
547
+ // Popping an item from the end changes the lastObject.
548
+ enumerable.popObject();
549
+ equals(callCount, 2, "The lastObject observer should have fired this many times (popObject on enumerable %@)".fmt(i + 1));
550
+
551
+ // Replacing only the last item changes the lastObject.
552
+ enumerable.replace(enumerable.get('length') - 1, 1, [testObject]);
553
+ equals(callCount, 3, "The lastObject observer should have fired this many times (replace on enumerable %@)".fmt(i + 1));
554
+
555
+ // Replacing the last two items with one greater number changes the lastObject.
556
+ enumerable.replace(enumerable.get('length') - 2, 2, [testObject, testObject, testObject]);
557
+ equals(callCount, 4, "The lastObject observer should have fired this many times (replace on enumerable %@)".fmt(i + 1));
558
+
559
+ // Replacing the last two items with same number changes the lastObject.
560
+ enumerable.replace(enumerable.get('length') - 2, 2, [testObject, testObject]);
561
+ equals(callCount, 5, "The lastObject observer should have fired this many times (replace on enumerable %@)".fmt(i + 1));
562
+
563
+ // Replacing the last two items with one fewer number changes the lastObject.
564
+ enumerable.replace(enumerable.get('length') - 2, 2, [testObject]);
565
+ equals(callCount, 6, "The lastObject observer should have fired this many times (replace on enumerable %@)".fmt(i + 1));
566
+
567
+ // Replacing the last two items with two fewer number changes the lastObject.
568
+ enumerable.replace(enumerable.get('length') - 2, 2);
569
+ equals(callCount, 7, "The lastObject observer should have fired this many times (replace on enumerable %@)".fmt(i + 1));
515
570
  }
516
571
  });
517
572
 
518
- test("should trigger observer on property when firstObject changes", function() {
573
+ test("should trigger observer on property when firstObject changes", function () {
519
574
  var src, ary2 = enumerables;
520
575
  for (var idx2=0, len2=ary2.length; idx2<len2; idx2++) {
521
- src = ary2[idx2] ;
576
+ src = ary2[idx2];
522
577
 
523
578
  var callCount = 0;
524
- src.addObserver("firstObject", function() {
579
+ src.addObserver("firstObject", function () {
525
580
  callCount++;
526
581
  });
527
582
 
@@ -531,20 +586,20 @@ test("should trigger observer on property when firstObject changes", function()
531
586
  }
532
587
  });
533
588
 
534
- test("should trigger observer of reduced prop when array changes once property retrieved once", function() {
535
- var src, ary2 = enumerables ;
589
+ test("should trigger observer of reduced prop when array changes once property retrieved once", function () {
590
+ var src, ary2 = enumerables;
536
591
  for (var idx2=0, len2=ary2.length; idx2<len2; idx2++) {
537
- src = ary2[idx2] ;
592
+ src = ary2[idx2];
538
593
  // get the property...this will install the reducer property...
539
- src.get("@max(balance)") ;
594
+ src.get("@max(balance)");
540
595
 
541
596
  // install observer
542
- var observedValue = null ;
543
- src.addObserver("@max(balance)", function() {
597
+ var observedValue = null;
598
+ src.addObserver("@max(balance)", function () {
544
599
  observedValue = src.get("@max(balance)");
545
- }) ;
600
+ });
546
601
 
547
- //src.addProbe('[]') ;
602
+ //src.addProbe('[]');
548
603
  //src.addProbe('@max(balance)');
549
604
 
550
605
  // add record to array
@@ -555,26 +610,26 @@ test("should trigger observer of reduced prop when array changes once property r
555
610
  ready: YES,
556
611
  visited: "Paris",
557
612
  balance: 5
558
- }) ;
613
+ });
559
614
 
560
- //SC.NotificationQueue.flush() ; // force observers to trigger
615
+ //SC.NotificationQueue.flush(); // force observers to trigger
561
616
 
562
617
  // observed value should now be set because the reduced property observer
563
618
  // was triggered when we changed the array contents.
564
- equals(5, observedValue, "observedValue") ;
619
+ equals(5, observedValue, "observedValue");
565
620
  }
566
621
  });
567
622
 
568
623
 
569
- test("should trigger observer of reduced prop when array changes - even if you never retrieved the property before", function() {
570
- var src, ary2 = enumerables ;
624
+ test("should trigger observer of reduced prop when array changes - even if you never retrieved the property before", function () {
625
+ var src, ary2 = enumerables;
571
626
  for (var idx2=0, len2=ary2.length; idx2<len2; idx2++) {
572
- src = ary2[idx2] ;
627
+ src = ary2[idx2];
573
628
  // install observer
574
- var observedValue = null ;
575
- src.addObserver("@max(balance)", function() {
629
+ var observedValue = null;
630
+ src.addObserver("@max(balance)", function () {
576
631
  observedValue = src.get("@max(balance)");
577
- }) ;
632
+ });
578
633
 
579
634
  // add record to array
580
635
  src.pushObject({
@@ -584,35 +639,35 @@ test("should trigger observer of reduced prop when array changes - even if you n
584
639
  ready: YES,
585
640
  visited: "Paris",
586
641
  balance: 5
587
- }) ;
642
+ });
588
643
 
589
- //SC.NotificationQueue.flush() ; // force observers to trigger
644
+ //SC.NotificationQueue.flush(); // force observers to trigger
590
645
 
591
646
  // observed value should now be set because the reduced property observer
592
647
  // was triggered when we changed the array contents.
593
- equals(5, observedValue, "observedValue") ;
648
+ equals(5, observedValue, "observedValue");
594
649
  }
595
650
  });
596
651
 
597
- test("should find the first element matching the criteria", function() {
598
- var people = enumerables[1] ;
599
- var jenna = people.find(function(person) { return person.gender == 'female'; });
652
+ test("should find the first element matching the criteria", function () {
653
+ var people = enumerables[1];
654
+ var jenna = people.find(function (person) { return person.gender == 'female'; });
600
655
  equals(jenna.first, 'Jenna');
601
656
  });
602
657
 
603
- var source ; // global variables
658
+ var source; // global variables
604
659
 
605
660
  module("Real Array", {
606
661
 
607
- setup: function() {
662
+ setup: function () {
608
663
  source = SC.$A(CommonArray);
609
664
  },
610
665
 
611
- teardown: function() {
612
- delete source ;
666
+ teardown: function () {
667
+ delete source;
613
668
 
614
- delete Array.prototype["@max(balance)"] ; // remove cached value
615
- delete Array.prototype["@min(balance)"] ;
669
+ delete Array.prototype["@max(balance)"]; // remove cached value
670
+ delete Array.prototype["@min(balance)"];
616
671
  }
617
672
 
618
673
  });
@@ -631,23 +686,23 @@ module("Real Array", {
631
686
  keys so that now they will be registered on the Array before any
632
687
  property change notifications are sent.
633
688
  */
634
- test("should notify observers even if reduced property is cached on prototype", function() {
689
+ test("should notify observers even if reduced property is cached on prototype", function () {
635
690
  // make sure reduced property is cached
636
- source.get("@max(balance)") ;
691
+ source.get("@max(balance)");
637
692
 
638
693
  // now make a clone and observe
639
- source = SC.$A(CommonArray) ;
694
+ source = SC.$A(CommonArray);
640
695
 
641
696
  // get the property...this will install the reducer property...
642
- source.get("@max(balance)") ;
697
+ source.get("@max(balance)");
643
698
 
644
699
  // install observer
645
- var observedValue = null ;
646
- source.addObserver("@max(balance)", function() {
700
+ var observedValue = null;
701
+ source.addObserver("@max(balance)", function () {
647
702
  observedValue = source.get("@max(balance)");
648
- }) ;
703
+ });
649
704
 
650
- //source.addProbe('[]') ;
705
+ //source.addProbe('[]');
651
706
  //source.addProbe('@max(balance)');
652
707
 
653
708
  // add record to array
@@ -658,11 +713,11 @@ test("should notify observers even if reduced property is cached on prototype",
658
713
  ready: YES,
659
714
  visited: "Paris",
660
715
  balance: 5
661
- }) ;
716
+ });
662
717
 
663
- //SC.NotificationQueue.flush() ; // force observers to trigger
718
+ //SC.NotificationQueue.flush(); // force observers to trigger
664
719
 
665
720
  // observed value should now be set because the reduced property observer
666
721
  // was triggered when we changed the array contents.
667
- equals(5, observedValue, "observedValue") ;
722
+ equals(5, observedValue, "observedValue");
668
723
  });