ember-source 2.6.2 → 2.7.0.beta.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -6,7 +6,7 @@
6
6
  * Portions Copyright 2008-2011 Apple Inc. All rights reserved.
7
7
  * @license Licensed under MIT license
8
8
  * See https://raw.github.com/emberjs/ember.js/master/LICENSE
9
- * @version 2.6.2
9
+ * @version 2.7.0-beta.1
10
10
  */
11
11
 
12
12
  var enifed, requireModule, require, Ember;
@@ -82,10 +82,9 @@ var mainContext = this;
82
82
 
83
83
  var deps = mod.deps;
84
84
  var callback = mod.callback;
85
- var length = deps.length;
86
- var reified = new Array(length);
85
+ var reified = new Array(deps.length);
87
86
 
88
- for (var i = 0; i < length; i++) {
87
+ for (var i = 0; i < deps.length; i++) {
89
88
  if (deps[i] === 'exports') {
90
89
  reified[i] = exports;
91
90
  } else if (deps[i] === 'require') {
@@ -113,7 +112,7 @@ var mainContext = this;
113
112
  }
114
113
  })();
115
114
 
116
- enifed('ember-debug/deprecate', ['exports', 'ember-metal/core', 'ember-metal/error', 'ember-metal/logger', 'ember-debug/handlers'], function (exports, _emberMetalCore, _emberMetalError, _emberMetalLogger, _emberDebugHandlers) {
115
+ enifed('ember-debug/deprecate', ['exports', 'ember-metal/error', 'ember-console', 'ember-environment', 'ember-debug/handlers'], function (exports, _emberMetalError, _emberConsole, _emberEnvironment, _emberDebugHandlers) {
117
116
  /*global __fail__*/
118
117
 
119
118
  'use strict';
@@ -143,7 +142,7 @@ enifed('ember-debug/deprecate', ['exports', 'ember-metal/core', 'ember-metal/err
143
142
  registerHandler(function logDeprecationToConsole(message, options) {
144
143
  var updatedMessage = formatMessage(message, options);
145
144
 
146
- _emberMetalLogger.default.warn('DEPRECATION: ' + updatedMessage);
145
+ _emberConsole.default.warn('DEPRECATION: ' + updatedMessage);
147
146
  });
148
147
 
149
148
  var captureErrorForStack = undefined;
@@ -163,7 +162,7 @@ enifed('ember-debug/deprecate', ['exports', 'ember-metal/core', 'ember-metal/err
163
162
  }
164
163
 
165
164
  registerHandler(function logDeprecationStackTrace(message, options, next) {
166
- if (_emberMetalCore.default.LOG_STACKTRACE_ON_DEPRECATION) {
165
+ if (_emberEnvironment.ENV.LOG_STACKTRACE_ON_DEPRECATION) {
167
166
  var stackStr = '';
168
167
  var error = captureErrorForStack();
169
168
  var stack = undefined;
@@ -183,14 +182,14 @@ enifed('ember-debug/deprecate', ['exports', 'ember-metal/core', 'ember-metal/err
183
182
 
184
183
  var updatedMessage = formatMessage(message, options);
185
184
 
186
- _emberMetalLogger.default.warn('DEPRECATION: ' + updatedMessage + stackStr);
185
+ _emberConsole.default.warn('DEPRECATION: ' + updatedMessage + stackStr);
187
186
  } else {
188
187
  next.apply(undefined, arguments);
189
188
  }
190
189
  });
191
190
 
192
191
  registerHandler(function raiseOnDeprecation(message, options, next) {
193
- if (_emberMetalCore.default.ENV.RAISE_ON_DEPRECATION) {
192
+ if (_emberEnvironment.ENV.RAISE_ON_DEPRECATION) {
194
193
  var updatedMessage = formatMessage(message);
195
194
 
196
195
  throw new _emberMetalError.default(updatedMessage);
@@ -292,7 +291,7 @@ enifed("ember-debug/handlers", ["exports"], function (exports) {
292
291
  }
293
292
  }
294
293
  });
295
- enifed('ember-debug/index', ['exports', 'ember-metal/core', 'ember-metal/debug', 'ember-metal/features', 'ember-metal/error', 'ember-metal/logger', 'ember-metal/environment', 'ember-debug/deprecate', 'ember-debug/warn'], function (exports, _emberMetalCore, _emberMetalDebug, _emberMetalFeatures, _emberMetalError, _emberMetalLogger, _emberMetalEnvironment, _emberDebugDeprecate, _emberDebugWarn) {
294
+ enifed('ember-debug/index', ['exports', 'ember-metal/core', 'ember-environment', 'ember-metal/testing', 'ember-metal/debug', 'ember-metal/features', 'ember-metal/error', 'ember-console', 'ember-debug/deprecate', 'ember-debug/warn'], function (exports, _emberMetalCore, _emberEnvironment, _emberMetalTesting, _emberMetalDebug, _emberMetalFeatures, _emberMetalError, _emberConsole, _emberDebugDeprecate, _emberDebugWarn) {
296
295
  'use strict';
297
296
 
298
297
  exports._warnIfUsingStrippedFeatureFlags = _warnIfUsingStrippedFeatureFlags;
@@ -349,7 +348,7 @@ enifed('ember-debug/index', ['exports', 'ember-metal/core', 'ember-metal/debug',
349
348
  @public
350
349
  */
351
350
  _emberMetalDebug.setDebugFunction('debug', function debug(message) {
352
- _emberMetalLogger.default.debug('DEBUG: ' + message);
351
+ _emberConsole.default.debug('DEBUG: ' + message);
353
352
  });
354
353
 
355
354
  /**
@@ -362,7 +361,7 @@ enifed('ember-debug/index', ['exports', 'ember-metal/core', 'ember-metal/debug',
362
361
  @private
363
362
  */
364
363
  _emberMetalDebug.setDebugFunction('info', function info() {
365
- _emberMetalLogger.default.info.apply(undefined, arguments);
364
+ _emberConsole.default.info.apply(undefined, arguments);
366
365
  });
367
366
 
368
367
  /**
@@ -467,7 +466,7 @@ enifed('ember-debug/index', ['exports', 'ember-metal/core', 'ember-metal/debug',
467
466
 
468
467
  function _warnIfUsingStrippedFeatureFlags(FEATURES, knownFeatures, featuresWereStripped) {
469
468
  if (featuresWereStripped) {
470
- _emberMetalDebug.warn('Ember.ENV.ENABLE_OPTIONAL_FEATURES is only available in canary builds.', !_emberMetalCore.default.ENV.ENABLE_OPTIONAL_FEATURES, { id: 'ember-debug.feature-flag-with-features-stripped' });
469
+ _emberMetalDebug.warn('Ember.ENV.ENABLE_OPTIONAL_FEATURES is only available in canary builds.', !_emberEnvironment.ENV.ENABLE_OPTIONAL_FEATURES, { id: 'ember-debug.feature-flag-with-features-stripped' });
471
470
 
472
471
  var keys = Object.keys(FEATURES || {});
473
472
  for (var i = 0; i < keys.length; i++) {
@@ -481,17 +480,17 @@ enifed('ember-debug/index', ['exports', 'ember-metal/core', 'ember-metal/debug',
481
480
  }
482
481
  }
483
482
 
484
- if (!_emberMetalCore.default.testing) {
483
+ if (!_emberMetalTesting.isTesting()) {
485
484
  // Complain if they're using FEATURE flags in builds other than canary
486
485
  _emberMetalFeatures.FEATURES['features-stripped-test'] = true;
487
486
  var featuresWereStripped = true;
488
487
 
489
488
  delete _emberMetalFeatures.FEATURES['features-stripped-test'];
490
- _warnIfUsingStrippedFeatureFlags(_emberMetalCore.default.ENV.FEATURES, _emberMetalFeatures.KNOWN_FEATURES, featuresWereStripped);
489
+ _warnIfUsingStrippedFeatureFlags(_emberEnvironment.ENV.FEATURES, _emberMetalFeatures.DEFAULT_FEATURES, featuresWereStripped);
491
490
 
492
491
  // Inform the developer about the Ember Inspector if not installed.
493
- var isFirefox = _emberMetalEnvironment.default.isFirefox;
494
- var isChrome = _emberMetalEnvironment.default.isChrome;
492
+ var isFirefox = _emberEnvironment.environment.isFirefox;
493
+ var isChrome = _emberEnvironment.environment.isChrome;
495
494
 
496
495
  if (typeof window !== 'undefined' && (isFirefox || isChrome) && window.addEventListener) {
497
496
  window.addEventListener('load', function () {
@@ -595,7 +594,8 @@ enifed('ember-debug/index', ['exports', 'ember-metal/core', 'ember-metal/debug',
595
594
  _emberMetalDebug.warn('Please use `ember.debug.js` instead of `ember.js` for development and debugging.');
596
595
  }
597
596
  });
598
- enifed('ember-debug/warn', ['exports', 'ember-metal/logger', 'ember-metal/debug', 'ember-debug/handlers'], function (exports, _emberMetalLogger, _emberMetalDebug, _emberDebugHandlers) {
597
+ // reexports
598
+ enifed('ember-debug/warn', ['exports', 'ember-console', 'ember-metal/debug', 'ember-debug/handlers'], function (exports, _emberConsole, _emberMetalDebug, _emberDebugHandlers) {
599
599
  'use strict';
600
600
 
601
601
  var _slice = Array.prototype.slice;
@@ -607,9 +607,9 @@ enifed('ember-debug/warn', ['exports', 'ember-metal/logger', 'ember-metal/debug'
607
607
  }
608
608
 
609
609
  registerHandler(function logWarning(message, options) {
610
- _emberMetalLogger.default.warn('WARNING: ' + message);
611
- if ('trace' in _emberMetalLogger.default) {
612
- _emberMetalLogger.default.trace();
610
+ _emberConsole.default.warn('WARNING: ' + message);
611
+ if ('trace' in _emberConsole.default) {
612
+ _emberConsole.default.trace();
613
613
  }
614
614
  });
615
615
 
@@ -743,70 +743,49 @@ enifed('ember-testing/adapters/qunit', ['exports', 'ember-testing/adapters/adapt
743
743
  }
744
744
  });
745
745
  });
746
- enifed('ember-testing/helpers', ['exports', 'ember-metal/property_get', 'ember-metal/error', 'ember-metal/run_loop', 'ember-views/system/jquery', 'ember-testing/test', 'ember-runtime/ext/rsvp', 'ember-metal/features'], function (exports, _emberMetalProperty_get, _emberMetalError, _emberMetalRun_loop, _emberViewsSystemJquery, _emberTestingTest, _emberRuntimeExtRsvp, _emberMetalFeatures) {
746
+ enifed('ember-testing/events', ['exports', 'ember-views/system/jquery', 'ember-metal/run_loop'], function (exports, _emberViewsSystemJquery, _emberMetalRun_loop) {
747
747
  'use strict';
748
748
 
749
- /**
750
- @module ember
751
- @submodule ember-testing
752
- */
749
+ exports.focus = focus;
750
+ exports.fireEvent = fireEvent;
753
751
 
754
- var helper = _emberTestingTest.default.registerHelper;
755
- var asyncHelper = _emberTestingTest.default.registerAsyncHelper;
756
-
757
- var keyboardEventTypes, mouseEventTypes, buildKeyboardEvent, buildMouseEvent, buildBasicEvent, fireEvent, focus;
758
-
759
- var defaultEventOptions = { canBubble: true, cancelable: true };
760
- keyboardEventTypes = ['keydown', 'keypress', 'keyup'];
761
- mouseEventTypes = ['click', 'mousedown', 'mouseup', 'dblclick', 'mouseenter', 'mouseleave', 'mousemove', 'mouseout', 'mouseover'];
762
-
763
- buildKeyboardEvent = function buildKeyboardEvent(type) {
764
- var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
752
+ var DEFAULT_EVENT_OPTIONS = { canBubble: true, cancelable: true };
753
+ var KEYBOARD_EVENT_TYPES = ['keydown', 'keypress', 'keyup'];
754
+ var MOUSE_EVENT_TYPES = ['click', 'mousedown', 'mouseup', 'dblclick', 'mouseenter', 'mouseleave', 'mousemove', 'mouseout', 'mouseover'];
765
755
 
766
- var event = undefined;
767
- try {
768
- event = document.createEvent('KeyEvents');
769
- var eventOpts = _emberViewsSystemJquery.default.extend({}, defaultEventOptions, options);
770
- event.initKeyEvent(type, eventOpts.canBubble, eventOpts.cancelable, window, eventOpts.ctrlKey, eventOpts.altKey, eventOpts.shiftKey, eventOpts.metaKey, eventOpts.keyCode, eventOpts.charCode);
771
- } catch (e) {
772
- event = buildBasicEvent(type, options);
756
+ function focus(el) {
757
+ if (!el) {
758
+ return;
773
759
  }
774
- return event;
775
- };
776
-
777
- buildMouseEvent = function buildMouseEvent(type) {
778
- var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
760
+ var $el = _emberViewsSystemJquery.default(el);
761
+ if ($el.is(':input, [contenteditable=true]')) {
762
+ var type = $el.prop('type');
763
+ if (type !== 'checkbox' && type !== 'radio' && type !== 'hidden') {
764
+ _emberMetalRun_loop.default(null, function () {
765
+ // Firefox does not trigger the `focusin` event if the window
766
+ // does not have focus. If the document doesn't have focus just
767
+ // use trigger('focusin') instead.
779
768
 
780
- var event = undefined;
781
- try {
782
- event = document.createEvent('MouseEvents');
783
- var eventOpts = _emberViewsSystemJquery.default.extend({}, defaultEventOptions, options);
784
- event.initMouseEvent(type, eventOpts.canBubble, eventOpts.cancelable, window, eventOpts.detail, eventOpts.screenX, eventOpts.screenY, eventOpts.clientX, eventOpts.clientY, eventOpts.ctrlKey, eventOpts.altKey, eventOpts.shiftKey, eventOpts.metaKey, eventOpts.button, eventOpts.relatedTarget);
785
- } catch (e) {
786
- event = buildBasicEvent(type, options);
769
+ if (!document.hasFocus || document.hasFocus()) {
770
+ el.focus();
771
+ } else {
772
+ $el.trigger('focusin');
773
+ }
774
+ });
775
+ }
787
776
  }
788
- return event;
789
- };
790
-
791
- buildBasicEvent = function buildBasicEvent(type) {
792
- var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
793
-
794
- var event = document.createEvent('Events');
795
- event.initEvent(type, true, true);
796
- _emberViewsSystemJquery.default.extend(event, options);
797
- return event;
798
- };
777
+ }
799
778
 
800
- fireEvent = function fireEvent(element, type) {
779
+ function fireEvent(element, type) {
801
780
  var options = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2];
802
781
 
803
782
  if (!element) {
804
783
  return;
805
784
  }
806
785
  var event = undefined;
807
- if (keyboardEventTypes.indexOf(type) > -1) {
786
+ if (KEYBOARD_EVENT_TYPES.indexOf(type) > -1) {
808
787
  event = buildKeyboardEvent(type, options);
809
- } else if (mouseEventTypes.indexOf(type) > -1) {
788
+ } else if (MOUSE_EVENT_TYPES.indexOf(type) > -1) {
810
789
  var rect = element.getBoundingClientRect();
811
790
  var x = rect.left + 1;
812
791
  var y = rect.top + 1;
@@ -821,144 +800,317 @@ enifed('ember-testing/helpers', ['exports', 'ember-metal/property_get', 'ember-m
821
800
  event = buildBasicEvent(type, options);
822
801
  }
823
802
  element.dispatchEvent(event);
824
- };
825
-
826
- focus = function focus(el) {
827
- if (!el) {
828
- return;
829
- }
830
- var $el = _emberViewsSystemJquery.default(el);
831
- if ($el.is(':input, [contenteditable=true]')) {
832
- var type = $el.prop('type');
833
- if (type !== 'checkbox' && type !== 'radio' && type !== 'hidden') {
834
- _emberMetalRun_loop.default(null, function () {
835
- // Firefox does not trigger the `focusin` event if the window
836
- // does not have focus. If the document doesn't have focus just
837
- // use trigger('focusin') instead.
838
-
839
- if (!document.hasFocus || document.hasFocus()) {
840
- el.focus();
841
- } else {
842
- $el.trigger('focusin');
843
- }
844
- });
845
- }
846
- }
847
- };
803
+ }
848
804
 
849
- function currentRouteName(app) {
850
- var routingService = app.__container__.lookup('service:-routing');
805
+ function buildBasicEvent(type) {
806
+ var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
851
807
 
852
- return _emberMetalProperty_get.get(routingService, 'currentRouteName');
808
+ var event = document.createEvent('Events');
809
+ event.initEvent(type, true, true);
810
+ _emberViewsSystemJquery.default.extend(event, options);
811
+ return event;
853
812
  }
854
813
 
855
- function currentPath(app) {
856
- var routingService = app.__container__.lookup('service:-routing');
814
+ function buildMouseEvent(type) {
815
+ var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
857
816
 
858
- return _emberMetalProperty_get.get(routingService, 'currentPath');
817
+ var event = undefined;
818
+ try {
819
+ event = document.createEvent('MouseEvents');
820
+ var eventOpts = _emberViewsSystemJquery.default.extend({}, DEFAULT_EVENT_OPTIONS, options);
821
+ event.initMouseEvent(type, eventOpts.canBubble, eventOpts.cancelable, window, eventOpts.detail, eventOpts.screenX, eventOpts.screenY, eventOpts.clientX, eventOpts.clientY, eventOpts.ctrlKey, eventOpts.altKey, eventOpts.shiftKey, eventOpts.metaKey, eventOpts.button, eventOpts.relatedTarget);
822
+ } catch (e) {
823
+ event = buildBasicEvent(type, options);
824
+ }
825
+ return event;
859
826
  }
860
827
 
861
- function currentURL(app) {
862
- var router = app.__container__.lookup('router:main');
828
+ function buildKeyboardEvent(type) {
829
+ var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
863
830
 
864
- return _emberMetalProperty_get.get(router, 'location').getURL();
831
+ var event = undefined;
832
+ try {
833
+ event = document.createEvent('KeyEvents');
834
+ var eventOpts = _emberViewsSystemJquery.default.extend({}, DEFAULT_EVENT_OPTIONS, options);
835
+ event.initKeyEvent(type, eventOpts.canBubble, eventOpts.cancelable, window, eventOpts.ctrlKey, eventOpts.altKey, eventOpts.shiftKey, eventOpts.metaKey, eventOpts.keyCode, eventOpts.charCode);
836
+ } catch (e) {
837
+ event = buildBasicEvent(type, options);
838
+ }
839
+ return event;
865
840
  }
841
+ });
842
+ enifed('ember-testing/ext/application', ['exports', 'ember-application/system/application', 'ember-testing/setup_for_testing', 'ember-testing/test/helpers', 'ember-testing/test/promise', 'ember-testing/test/run', 'ember-testing/test/on_inject_helpers', 'ember-testing/test/adapter'], function (exports, _emberApplicationSystemApplication, _emberTestingSetup_for_testing, _emberTestingTestHelpers, _emberTestingTestPromise, _emberTestingTestRun, _emberTestingTestOn_inject_helpers, _emberTestingTestAdapter) {
843
+ 'use strict';
866
844
 
867
- function pauseTest() {
868
- _emberTestingTest.default.adapter.asyncStart();
869
- return new _emberRuntimeExtRsvp.default.Promise(function () {}, 'TestAdapter paused promise');
870
- }
845
+ _emberApplicationSystemApplication.default.reopen({
846
+ /**
847
+ This property contains the testing helpers for the current application. These
848
+ are created once you call `injectTestHelpers` on your `Ember.Application`
849
+ instance. The included helpers are also available on the `window` object by
850
+ default, but can be used from this object on the individual application also.
851
+ @property testHelpers
852
+ @type {Object}
853
+ @default {}
854
+ @public
855
+ */
856
+ testHelpers: {},
871
857
 
872
- function visit(app, url) {
873
- var router = app.__container__.lookup('router:main');
874
- var shouldHandleURL = false;
858
+ /**
859
+ This property will contain the original methods that were registered
860
+ on the `helperContainer` before `injectTestHelpers` is called.
861
+ When `removeTestHelpers` is called, these methods are restored to the
862
+ `helperContainer`.
863
+ @property originalMethods
864
+ @type {Object}
865
+ @default {}
866
+ @private
867
+ @since 1.3.0
868
+ */
869
+ originalMethods: {},
875
870
 
876
- app.boot().then(function () {
877
- router.location.setURL(url);
871
+ /**
872
+ This property indicates whether or not this application is currently in
873
+ testing mode. This is set when `setupForTesting` is called on the current
874
+ application.
875
+ @property testing
876
+ @type {Boolean}
877
+ @default false
878
+ @since 1.3.0
879
+ @public
880
+ */
881
+ testing: false,
878
882
 
879
- if (shouldHandleURL) {
880
- _emberMetalRun_loop.default(app.__deprecatedInstance__, 'handleURL', url);
881
- }
882
- });
883
+ /**
884
+ This hook defers the readiness of the application, so that you can start
885
+ the app when your tests are ready to run. It also sets the router's
886
+ location to 'none', so that the window's location will not be modified
887
+ (preventing both accidental leaking of state between tests and interference
888
+ with your testing framework).
889
+ Example:
890
+ ```
891
+ App.setupForTesting();
892
+ ```
893
+ @method setupForTesting
894
+ @public
895
+ */
896
+ setupForTesting: function () {
897
+ _emberTestingSetup_for_testing.default();
883
898
 
884
- if (app._readinessDeferrals > 0) {
885
- router['initialURL'] = url;
886
- _emberMetalRun_loop.default(app, 'advanceReadiness');
887
- delete router['initialURL'];
888
- } else {
889
- shouldHandleURL = true;
890
- }
899
+ this.testing = true;
891
900
 
892
- return app.testHelpers.wait();
893
- }
901
+ this.Router.reopen({
902
+ location: 'none'
903
+ });
904
+ },
894
905
 
895
- function click(app, selector, context) {
896
- var $el = app.testHelpers.findWithAssert(selector, context);
897
- var el = $el[0];
906
+ /**
907
+ This will be used as the container to inject the test helpers into. By
908
+ default the helpers are injected into `window`.
909
+ @property helperContainer
910
+ @type {Object} The object to be used for test helpers.
911
+ @default window
912
+ @since 1.2.0
913
+ @private
914
+ */
915
+ helperContainer: null,
898
916
 
899
- _emberMetalRun_loop.default(null, fireEvent, el, 'mousedown');
917
+ /**
918
+ This injects the test helpers into the `helperContainer` object. If an object is provided
919
+ it will be used as the helperContainer. If `helperContainer` is not set it will default
920
+ to `window`. If a function of the same name has already been defined it will be cached
921
+ (so that it can be reset if the helper is removed with `unregisterHelper` or
922
+ `removeTestHelpers`).
923
+ Any callbacks registered with `onInjectHelpers` will be called once the
924
+ helpers have been injected.
925
+ Example:
926
+ ```
927
+ App.injectTestHelpers();
928
+ ```
929
+ @method injectTestHelpers
930
+ @public
931
+ */
932
+ injectTestHelpers: function (helperContainer) {
933
+ if (helperContainer) {
934
+ this.helperContainer = helperContainer;
935
+ } else {
936
+ this.helperContainer = window;
937
+ }
900
938
 
901
- focus(el);
939
+ this.reopen({
940
+ willDestroy: function () {
941
+ this._super.apply(this, arguments);
942
+ this.removeTestHelpers();
943
+ }
944
+ });
902
945
 
903
- _emberMetalRun_loop.default(null, fireEvent, el, 'mouseup');
904
- _emberMetalRun_loop.default(null, fireEvent, el, 'click');
946
+ this.testHelpers = {};
947
+ for (var name in _emberTestingTestHelpers.helpers) {
948
+ this.originalMethods[name] = this.helperContainer[name];
949
+ this.testHelpers[name] = this.helperContainer[name] = helper(this, name);
950
+ protoWrap(_emberTestingTestPromise.default.prototype, name, helper(this, name), _emberTestingTestHelpers.helpers[name].meta.wait);
951
+ }
905
952
 
906
- return app.testHelpers.wait();
907
- }
953
+ _emberTestingTestOn_inject_helpers.invokeInjectHelpersCallbacks(this);
954
+ },
908
955
 
909
- function triggerEvent(app, selector, contextOrType, typeOrOptions, possibleOptions) {
910
- var arity = arguments.length;
911
- var context, type, options;
956
+ /**
957
+ This removes all helpers that have been registered, and resets and functions
958
+ that were overridden by the helpers.
959
+ Example:
960
+ ```javascript
961
+ App.removeTestHelpers();
962
+ ```
963
+ @public
964
+ @method removeTestHelpers
965
+ */
966
+ removeTestHelpers: function () {
967
+ if (!this.helperContainer) {
968
+ return;
969
+ }
912
970
 
913
- if (arity === 3) {
914
- // context and options are optional, so this is
915
- // app, selector, type
916
- context = null;
917
- type = contextOrType;
918
- options = {};
919
- } else if (arity === 4) {
920
- // context and options are optional, so this is
921
- if (typeof typeOrOptions === 'object') {
922
- // either
923
- // app, selector, type, options
924
- context = null;
925
- type = contextOrType;
926
- options = typeOrOptions;
971
+ for (var name in _emberTestingTestHelpers.helpers) {
972
+ this.helperContainer[name] = this.originalMethods[name];
973
+ delete _emberTestingTestPromise.default.prototype[name];
974
+ delete this.testHelpers[name];
975
+ delete this.originalMethods[name];
976
+ }
977
+ }
978
+ });
979
+
980
+ // This method is no longer needed
981
+ // But still here for backwards compatibility
982
+ // of helper chaining
983
+ function protoWrap(proto, name, callback, isAsync) {
984
+ proto[name] = function () {
985
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
986
+ args[_key] = arguments[_key];
987
+ }
988
+
989
+ if (isAsync) {
990
+ return callback.apply(this, args);
927
991
  } else {
928
- // or
929
- // app, selector, context, type
930
- context = contextOrType;
931
- type = typeOrOptions;
932
- options = {};
992
+ return this.then(function () {
993
+ return callback.apply(this, args);
994
+ });
995
+ }
996
+ };
997
+ }
998
+
999
+ function helper(app, name) {
1000
+ var fn = _emberTestingTestHelpers.helpers[name].method;
1001
+ var meta = _emberTestingTestHelpers.helpers[name].meta;
1002
+ if (!meta.wait) {
1003
+ return function () {
1004
+ for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
1005
+ args[_key2] = arguments[_key2];
1006
+ }
1007
+
1008
+ return fn.apply(app, [app].concat(args));
1009
+ };
1010
+ }
1011
+
1012
+ return function () {
1013
+ for (var _len3 = arguments.length, args = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
1014
+ args[_key3] = arguments[_key3];
933
1015
  }
1016
+
1017
+ var lastPromise = _emberTestingTestRun.default(function () {
1018
+ return _emberTestingTestPromise.resolve(_emberTestingTestPromise.getLastPromise());
1019
+ });
1020
+
1021
+ // wait for last helper's promise to resolve and then
1022
+ // execute. To be safe, we need to tell the adapter we're going
1023
+ // asynchronous here, because fn may not be invoked before we
1024
+ // return.
1025
+ _emberTestingTestAdapter.asyncStart();
1026
+ return lastPromise.then(function () {
1027
+ return fn.apply(app, [app].concat(args));
1028
+ }).finally(_emberTestingTestAdapter.asyncEnd);
1029
+ };
1030
+ }
1031
+ });
1032
+ enifed('ember-testing/ext/rsvp', ['exports', 'ember-runtime/ext/rsvp', 'ember-metal/run_loop', 'ember-metal/testing', 'ember-testing/test/adapter'], function (exports, _emberRuntimeExtRsvp, _emberMetalRun_loop, _emberMetalTesting, _emberTestingTestAdapter) {
1033
+ 'use strict';
1034
+
1035
+ _emberRuntimeExtRsvp.default.configure('async', function (callback, promise) {
1036
+ // if schedule will cause autorun, we need to inform adapter
1037
+ if (_emberMetalTesting.isTesting() && !_emberMetalRun_loop.default.backburner.currentInstance) {
1038
+ _emberTestingTestAdapter.asyncStart();
1039
+ _emberMetalRun_loop.default.backburner.schedule('actions', function () {
1040
+ _emberTestingTestAdapter.asyncEnd();
1041
+ callback(promise);
1042
+ });
934
1043
  } else {
935
- context = contextOrType;
936
- type = typeOrOptions;
937
- options = possibleOptions;
1044
+ _emberMetalRun_loop.default.backburner.schedule('actions', function () {
1045
+ return callback(promise);
1046
+ });
938
1047
  }
1048
+ });
1049
+
1050
+ exports.default = _emberRuntimeExtRsvp.default;
1051
+ });
1052
+ enifed("ember-testing/helpers/and_then", ["exports"], function (exports) {
1053
+ "use strict";
1054
+
1055
+ exports.default = andThen;
1056
+
1057
+ function andThen(app, callback) {
1058
+ return app.testHelpers.wait(callback(app));
1059
+ }
1060
+ });
1061
+ enifed('ember-testing/helpers/click', ['exports', 'ember-metal/run_loop', 'ember-testing/events'], function (exports, _emberMetalRun_loop, _emberTestingEvents) {
1062
+ 'use strict';
1063
+
1064
+ exports.default = click;
939
1065
 
1066
+ function click(app, selector, context) {
940
1067
  var $el = app.testHelpers.findWithAssert(selector, context);
941
1068
  var el = $el[0];
942
1069
 
943
- _emberMetalRun_loop.default(null, fireEvent, el, type, options);
1070
+ _emberMetalRun_loop.default(null, _emberTestingEvents.fireEvent, el, 'mousedown');
1071
+
1072
+ _emberTestingEvents.focus(el);
1073
+
1074
+ _emberMetalRun_loop.default(null, _emberTestingEvents.fireEvent, el, 'mouseup');
1075
+ _emberMetalRun_loop.default(null, _emberTestingEvents.fireEvent, el, 'click');
944
1076
 
945
1077
  return app.testHelpers.wait();
946
1078
  }
1079
+ });
1080
+ enifed('ember-testing/helpers/current_path', ['exports', 'ember-metal/property_get'], function (exports, _emberMetalProperty_get) {
1081
+ 'use strict';
947
1082
 
948
- function keyEvent(app, selector, contextOrType, typeOrKeyCode, keyCode) {
949
- var context, type;
1083
+ exports.default = currentPath;
950
1084
 
951
- if (typeof keyCode === 'undefined') {
952
- context = null;
953
- keyCode = typeOrKeyCode;
954
- type = contextOrType;
955
- } else {
956
- context = contextOrType;
957
- type = typeOrKeyCode;
958
- }
1085
+ function currentPath(app) {
1086
+ var routingService = app.__container__.lookup('service:-routing');
1087
+ return _emberMetalProperty_get.get(routingService, 'currentPath');
1088
+ }
1089
+ });
1090
+ enifed('ember-testing/helpers/current_route_name', ['exports', 'ember-metal/property_get'], function (exports, _emberMetalProperty_get) {
1091
+ 'use strict';
959
1092
 
960
- return app.testHelpers.triggerEvent(selector, context, type, { keyCode: keyCode, which: keyCode });
1093
+ exports.default = currentRouteName;
1094
+
1095
+ function currentRouteName(app) {
1096
+ var routingService = app.__container__.lookup('service:-routing');
1097
+ return _emberMetalProperty_get.get(routingService, 'currentRouteName');
1098
+ }
1099
+ });
1100
+ enifed('ember-testing/helpers/current_url', ['exports', 'ember-metal/property_get'], function (exports, _emberMetalProperty_get) {
1101
+ 'use strict';
1102
+
1103
+ exports.default = currentURL;
1104
+
1105
+ function currentURL(app) {
1106
+ var router = app.__container__.lookup('router:main');
1107
+ return _emberMetalProperty_get.get(router, 'location').getURL();
961
1108
  }
1109
+ });
1110
+ enifed('ember-testing/helpers/fill_in', ['exports', 'ember-metal/run_loop', 'ember-testing/events'], function (exports, _emberMetalRun_loop, _emberTestingEvents) {
1111
+ 'use strict';
1112
+
1113
+ exports.default = fillIn;
962
1114
 
963
1115
  function fillIn(app, selector, contextOrText, text) {
964
1116
  var $el, el, context;
@@ -969,34 +1121,146 @@ enifed('ember-testing/helpers', ['exports', 'ember-metal/property_get', 'ember-m
969
1121
  }
970
1122
  $el = app.testHelpers.findWithAssert(selector, context);
971
1123
  el = $el[0];
972
- focus(el);
1124
+ _emberTestingEvents.focus(el);
973
1125
  _emberMetalRun_loop.default(function () {
974
1126
  $el.val(text);
975
- fireEvent(el, 'input');
976
- fireEvent(el, 'change');
1127
+ _emberTestingEvents.fireEvent(el, 'input');
1128
+ _emberTestingEvents.fireEvent(el, 'change');
977
1129
  });
978
1130
  return app.testHelpers.wait();
979
1131
  }
1132
+ });
1133
+ enifed('ember-testing/helpers/find', ['exports', 'ember-metal/property_get'], function (exports, _emberMetalProperty_get) {
1134
+ 'use strict';
1135
+
1136
+ exports.default = find;
1137
+
1138
+ function find(app, selector, context) {
1139
+ var $el = undefined;
1140
+ context = context || _emberMetalProperty_get.get(app, 'rootElement');
1141
+ $el = app.$(selector, context);
1142
+ return $el;
1143
+ }
1144
+ });
1145
+ enifed('ember-testing/helpers/find_with_assert', ['exports'], function (exports) {
1146
+ 'use strict';
1147
+
1148
+ exports.default = findWithAssert;
980
1149
 
981
1150
  function findWithAssert(app, selector, context) {
982
1151
  var $el = app.testHelpers.find(selector, context);
983
1152
  if ($el.length === 0) {
984
- throw new _emberMetalError.default('Element ' + selector + ' not found.');
1153
+ throw new Error('Element ' + selector + ' not found.');
985
1154
  }
986
1155
  return $el;
987
1156
  }
1157
+ });
1158
+ enifed('ember-testing/helpers/key_event', ['exports'], function (exports) {
1159
+ 'use strict';
988
1160
 
989
- function find(app, selector, context) {
990
- var $el;
991
- context = context || _emberMetalProperty_get.get(app, 'rootElement');
992
- $el = app.$(selector, context);
1161
+ exports.default = keyEvent;
993
1162
 
994
- return $el;
1163
+ function keyEvent(app, selector, contextOrType, typeOrKeyCode, keyCode) {
1164
+ var context, type;
1165
+
1166
+ if (typeof keyCode === 'undefined') {
1167
+ context = null;
1168
+ keyCode = typeOrKeyCode;
1169
+ type = contextOrType;
1170
+ } else {
1171
+ context = contextOrType;
1172
+ type = typeOrKeyCode;
1173
+ }
1174
+
1175
+ return app.testHelpers.triggerEvent(selector, context, type, { keyCode: keyCode, which: keyCode });
995
1176
  }
1177
+ });
1178
+ enifed('ember-testing/helpers/pause_test', ['exports', 'ember-runtime/ext/rsvp', 'ember-testing/test'], function (exports, _emberRuntimeExtRsvp, _emberTestingTest) {
1179
+ 'use strict';
996
1180
 
997
- function andThen(app, callback) {
998
- return app.testHelpers.wait(callback(app));
1181
+ exports.default = pauseTest;
1182
+
1183
+ function pauseTest() {
1184
+ _emberTestingTest.default.adapter.asyncStart();
1185
+ return new _emberRuntimeExtRsvp.default.Promise(function () {}, 'TestAdapter paused promise');
1186
+ }
1187
+ });
1188
+ enifed('ember-testing/helpers/trigger_event', ['exports', 'ember-metal/run_loop', 'ember-testing/events'], function (exports, _emberMetalRun_loop, _emberTestingEvents) {
1189
+ 'use strict';
1190
+
1191
+ exports.default = triggerEvent;
1192
+
1193
+ function triggerEvent(app, selector, contextOrType, typeOrOptions, possibleOptions) {
1194
+ var arity = arguments.length;
1195
+ var context, type, options;
1196
+
1197
+ if (arity === 3) {
1198
+ // context and options are optional, so this is
1199
+ // app, selector, type
1200
+ context = null;
1201
+ type = contextOrType;
1202
+ options = {};
1203
+ } else if (arity === 4) {
1204
+ // context and options are optional, so this is
1205
+ if (typeof typeOrOptions === 'object') {
1206
+ // either
1207
+ // app, selector, type, options
1208
+ context = null;
1209
+ type = contextOrType;
1210
+ options = typeOrOptions;
1211
+ } else {
1212
+ // or
1213
+ // app, selector, context, type
1214
+ context = contextOrType;
1215
+ type = typeOrOptions;
1216
+ options = {};
1217
+ }
1218
+ } else {
1219
+ context = contextOrType;
1220
+ type = typeOrOptions;
1221
+ options = possibleOptions;
1222
+ }
1223
+
1224
+ var $el = app.testHelpers.findWithAssert(selector, context);
1225
+ var el = $el[0];
1226
+
1227
+ _emberMetalRun_loop.default(null, _emberTestingEvents.fireEvent, el, type, options);
1228
+
1229
+ return app.testHelpers.wait();
1230
+ }
1231
+ });
1232
+ enifed('ember-testing/helpers/visit', ['exports', 'ember-metal/run_loop'], function (exports, _emberMetalRun_loop) {
1233
+ 'use strict';
1234
+
1235
+ exports.default = visit;
1236
+
1237
+ function visit(app, url) {
1238
+ var router = app.__container__.lookup('router:main');
1239
+ var shouldHandleURL = false;
1240
+
1241
+ app.boot().then(function () {
1242
+ router.location.setURL(url);
1243
+
1244
+ if (shouldHandleURL) {
1245
+ _emberMetalRun_loop.default(app.__deprecatedInstance__, 'handleURL', url);
1246
+ }
1247
+ });
1248
+
1249
+ if (app._readinessDeferrals > 0) {
1250
+ router['initialURL'] = url;
1251
+ _emberMetalRun_loop.default(app, 'advanceReadiness');
1252
+ delete router['initialURL'];
1253
+ } else {
1254
+ shouldHandleURL = true;
1255
+ }
1256
+
1257
+ return app.testHelpers.wait();
999
1258
  }
1259
+ });
1260
+ enifed('ember-testing/helpers/wait', ['exports', 'ember-testing/test/waiters', 'ember-runtime/ext/rsvp', 'ember-metal/run_loop', 'ember-testing/test/pending_requests'], function (exports, _emberTestingTestWaiters, _emberRuntimeExtRsvp, _emberMetalRun_loop, _emberTestingTestPending_requests) {
1261
+ 'use strict';
1262
+
1263
+ exports.default = wait;
1000
1264
 
1001
1265
  function wait(app, value) {
1002
1266
  return new _emberRuntimeExtRsvp.default.Promise(function (resolve) {
@@ -1011,7 +1275,7 @@ enifed('ember-testing/helpers', ['exports', 'ember-metal/property_get', 'ember-m
1011
1275
  }
1012
1276
 
1013
1277
  // 2. If there are pending Ajax requests, keep polling
1014
- if (_emberTestingTest.default.pendingAjaxRequests) {
1278
+ if (_emberTestingTestPending_requests.pendingRequests()) {
1015
1279
  return;
1016
1280
  }
1017
1281
 
@@ -1019,13 +1283,11 @@ enifed('ember-testing/helpers', ['exports', 'ember-metal/property_get', 'ember-m
1019
1283
  if (_emberMetalRun_loop.default.hasScheduledTimers() || _emberMetalRun_loop.default.currentRunLoop) {
1020
1284
  return;
1021
1285
  }
1022
- if (_emberTestingTest.default.waiters && _emberTestingTest.default.waiters.any(function (waiter) {
1023
- var context = waiter[0];
1024
- var callback = waiter[1];
1025
- return !callback.call(context);
1026
- })) {
1286
+
1287
+ if (_emberTestingTestWaiters.checkWaiters()) {
1027
1288
  return;
1028
1289
  }
1290
+
1029
1291
  // Stop polling
1030
1292
  clearInterval(watcher);
1031
1293
 
@@ -1034,6 +1296,14 @@ enifed('ember-testing/helpers', ['exports', 'ember-metal/property_get', 'ember-m
1034
1296
  }, 10);
1035
1297
  });
1036
1298
  }
1299
+ });
1300
+ enifed('ember-testing/helpers', ['exports', 'ember-testing/test/helpers', 'ember-testing/helpers/and_then', 'ember-testing/helpers/click', 'ember-testing/helpers/current_path', 'ember-testing/helpers/current_route_name', 'ember-testing/helpers/current_url', 'ember-testing/helpers/fill_in', 'ember-testing/helpers/find', 'ember-testing/helpers/find_with_assert', 'ember-testing/helpers/key_event', 'ember-testing/helpers/pause_test', 'ember-testing/helpers/trigger_event', 'ember-testing/helpers/visit', 'ember-testing/helpers/wait'], function (exports, _emberTestingTestHelpers, _emberTestingHelpersAnd_then, _emberTestingHelpersClick, _emberTestingHelpersCurrent_path, _emberTestingHelpersCurrent_route_name, _emberTestingHelpersCurrent_url, _emberTestingHelpersFill_in, _emberTestingHelpersFind, _emberTestingHelpersFind_with_assert, _emberTestingHelpersKey_event, _emberTestingHelpersPause_test, _emberTestingHelpersTrigger_event, _emberTestingHelpersVisit, _emberTestingHelpersWait) {
1301
+ 'use strict';
1302
+
1303
+ /**
1304
+ @module ember
1305
+ @submodule ember-testing
1306
+ */
1037
1307
 
1038
1308
  /**
1039
1309
  Loads a route, sets up any controllers, and renders any templates associated
@@ -1053,7 +1323,7 @@ enifed('ember-testing/helpers', ['exports', 'ember-metal/property_get', 'ember-m
1053
1323
  @return {RSVP.Promise}
1054
1324
  @public
1055
1325
  */
1056
- asyncHelper('visit', visit);
1326
+ _emberTestingTestHelpers.registerAsyncHelper('visit', _emberTestingHelpersVisit.default);
1057
1327
 
1058
1328
  /**
1059
1329
  Clicks an element and triggers any actions triggered by the element's `click`
@@ -1072,7 +1342,7 @@ enifed('ember-testing/helpers', ['exports', 'ember-metal/property_get', 'ember-m
1072
1342
  @return {RSVP.Promise}
1073
1343
  @public
1074
1344
  */
1075
- asyncHelper('click', click);
1345
+ _emberTestingTestHelpers.registerAsyncHelper('click', _emberTestingHelpersClick.default);
1076
1346
 
1077
1347
  /**
1078
1348
  Simulates a key event, e.g. `keypress`, `keydown`, `keyup` with the desired keyCode
@@ -1093,7 +1363,7 @@ enifed('ember-testing/helpers', ['exports', 'ember-metal/property_get', 'ember-m
1093
1363
  @since 1.5.0
1094
1364
  @public
1095
1365
  */
1096
- asyncHelper('keyEvent', keyEvent);
1366
+ _emberTestingTestHelpers.registerAsyncHelper('keyEvent', _emberTestingHelpersKey_event.default);
1097
1367
 
1098
1368
  /**
1099
1369
  Fills in an input element with some text.
@@ -1113,7 +1383,7 @@ enifed('ember-testing/helpers', ['exports', 'ember-metal/property_get', 'ember-m
1113
1383
  @return {RSVP.Promise}
1114
1384
  @public
1115
1385
  */
1116
- asyncHelper('fillIn', fillIn);
1386
+ _emberTestingTestHelpers.registerAsyncHelper('fillIn', _emberTestingHelpersFill_in.default);
1117
1387
 
1118
1388
  /**
1119
1389
  Finds an element in the context of the app's container element. A simple alias
@@ -1130,7 +1400,7 @@ enifed('ember-testing/helpers', ['exports', 'ember-metal/property_get', 'ember-m
1130
1400
  @return {Object} jQuery object representing the results of the query
1131
1401
  @public
1132
1402
  */
1133
- helper('find', find);
1403
+ _emberTestingTestHelpers.registerHelper('find', _emberTestingHelpersFind.default);
1134
1404
 
1135
1405
  /**
1136
1406
  Like `find`, but throws an error if the element selector returns no results.
@@ -1148,7 +1418,7 @@ enifed('ember-testing/helpers', ['exports', 'ember-metal/property_get', 'ember-m
1148
1418
  @throws {Error} throws error if jQuery object returned has a length of 0
1149
1419
  @public
1150
1420
  */
1151
- helper('findWithAssert', findWithAssert);
1421
+ _emberTestingTestHelpers.registerHelper('findWithAssert', _emberTestingHelpersFind_with_assert.default);
1152
1422
 
1153
1423
  /**
1154
1424
  Causes the run loop to process any pending events. This is used to ensure that
@@ -1174,8 +1444,8 @@ enifed('ember-testing/helpers', ['exports', 'ember-metal/property_get', 'ember-m
1174
1444
  @return {RSVP.Promise}
1175
1445
  @public
1176
1446
  */
1177
- asyncHelper('wait', wait);
1178
- asyncHelper('andThen', andThen);
1447
+ _emberTestingTestHelpers.registerAsyncHelper('wait', _emberTestingHelpersWait.default);
1448
+ _emberTestingTestHelpers.registerAsyncHelper('andThen', _emberTestingHelpersAnd_then.default);
1179
1449
 
1180
1450
  /**
1181
1451
  Returns the currently active route name.
@@ -1195,7 +1465,7 @@ enifed('ember-testing/helpers', ['exports', 'ember-metal/property_get', 'ember-m
1195
1465
  @since 1.5.0
1196
1466
  @public
1197
1467
  */
1198
- helper('currentRouteName', currentRouteName);
1468
+ _emberTestingTestHelpers.registerHelper('currentRouteName', _emberTestingHelpersCurrent_route_name.default);
1199
1469
 
1200
1470
  /**
1201
1471
  Returns the current path.
@@ -1215,7 +1485,7 @@ enifed('ember-testing/helpers', ['exports', 'ember-metal/property_get', 'ember-m
1215
1485
  @since 1.5.0
1216
1486
  @public
1217
1487
  */
1218
- helper('currentPath', currentPath);
1488
+ _emberTestingTestHelpers.registerHelper('currentPath', _emberTestingHelpersCurrent_path.default);
1219
1489
 
1220
1490
  /**
1221
1491
  Returns the current URL.
@@ -1235,7 +1505,7 @@ enifed('ember-testing/helpers', ['exports', 'ember-metal/property_get', 'ember-m
1235
1505
  @since 1.5.0
1236
1506
  @public
1237
1507
  */
1238
- helper('currentURL', currentURL);
1508
+ _emberTestingTestHelpers.registerHelper('currentURL', _emberTestingHelpersCurrent_url.default);
1239
1509
 
1240
1510
  /**
1241
1511
  Pauses the current test - this is useful for debugging while testing or for test-driving.
@@ -1255,7 +1525,7 @@ enifed('ember-testing/helpers', ['exports', 'ember-metal/property_get', 'ember-m
1255
1525
  @return {Object} A promise that will never resolve
1256
1526
  @public
1257
1527
  */
1258
- helper('pauseTest', pauseTest);
1528
+ _emberTestingTestHelpers.registerHelper('pauseTest', _emberTestingHelpersPause_test.default);
1259
1529
 
1260
1530
  /**
1261
1531
  Triggers the given DOM event on the element identified by the provided selector.
@@ -1282,16 +1552,12 @@ enifed('ember-testing/helpers', ['exports', 'ember-metal/property_get', 'ember-m
1282
1552
  @since 1.5.0
1283
1553
  @public
1284
1554
  */
1285
- asyncHelper('triggerEvent', triggerEvent);
1555
+ _emberTestingTestHelpers.registerAsyncHelper('triggerEvent', _emberTestingHelpersTrigger_event.default);
1286
1556
  });
1287
-
1288
- // Firefox does not trigger the `focusin` event if the window
1289
- // does not have focus. If the document doesn't have focus just
1290
- // use trigger('focusin') instead.
1291
- enifed('ember-testing/index', ['exports', 'ember-metal/core', 'ember-testing/initializers', 'ember-testing/support', 'ember-testing/setup_for_testing', 'ember-testing/test', 'ember-testing/adapters/adapter', 'ember-testing/adapters/qunit', 'ember-testing/helpers'], function (exports, _emberMetalCore, _emberTestingInitializers, _emberTestingSupport, _emberTestingSetup_for_testing, _emberTestingTest, _emberTestingAdaptersAdapter, _emberTestingAdaptersQunit, _emberTestingHelpers) {
1557
+ enifed('ember-testing/index', ['exports', 'ember-metal/core', 'ember-testing/test', 'ember-testing/adapters/adapter', 'ember-testing/setup_for_testing', 'require', 'ember-testing/support', 'ember-testing/ext/application', 'ember-testing/ext/rsvp', 'ember-testing/helpers', 'ember-testing/initializers'], function (exports, _emberMetalCore, _emberTestingTest, _emberTestingAdaptersAdapter, _emberTestingSetup_for_testing, _require, _emberTestingSupport, _emberTestingExtApplication, _emberTestingExtRsvp, _emberTestingHelpers, _emberTestingInitializers) {
1292
1558
  'use strict';
1293
1559
 
1294
- // adds helpers to helpers object in Test
1560
+ // to setup initializer
1295
1561
 
1296
1562
  /**
1297
1563
  @module ember
@@ -1300,11 +1566,16 @@ enifed('ember-testing/index', ['exports', 'ember-metal/core', 'ember-testing/ini
1300
1566
 
1301
1567
  _emberMetalCore.default.Test = _emberTestingTest.default;
1302
1568
  _emberMetalCore.default.Test.Adapter = _emberTestingAdaptersAdapter.default;
1303
- _emberMetalCore.default.Test.QUnitAdapter = _emberTestingAdaptersQunit.default;
1304
1569
  _emberMetalCore.default.setupForTesting = _emberTestingSetup_for_testing.default;
1570
+ Object.defineProperty(_emberTestingTest.default, 'QUnitAdapter', {
1571
+ get: function () {
1572
+ return _require.default('ember-testing/adapters/qunit').default;
1573
+ }
1574
+ });
1305
1575
  });
1306
- // to setup initializer
1576
+ // reexports
1307
1577
  // to handle various edge cases
1578
+ // adds helpers to helpers object in Test
1308
1579
  enifed('ember-testing/initializers', ['exports', 'ember-runtime/system/lazy_load'], function (exports, _emberRuntimeSystemLazy_load) {
1309
1580
  'use strict';
1310
1581
 
@@ -1324,27 +1595,11 @@ enifed('ember-testing/initializers', ['exports', 'ember-runtime/system/lazy_load
1324
1595
  }
1325
1596
  });
1326
1597
  });
1327
- enifed('ember-testing/setup_for_testing', ['exports', 'ember-metal/core', 'ember-testing/adapters/qunit', 'ember-views/system/jquery'], function (exports, _emberMetalCore, _emberTestingAdaptersQunit, _emberViewsSystemJquery) {
1598
+ enifed('ember-testing/setup_for_testing', ['exports', 'ember-metal/testing', 'ember-views/system/jquery', 'ember-testing/test/adapter', 'ember-testing/test/pending_requests', 'require'], function (exports, _emberMetalTesting, _emberViewsSystemJquery, _emberTestingTestAdapter, _emberTestingTestPending_requests, _require) {
1328
1599
  'use strict';
1329
1600
 
1330
1601
  exports.default = setupForTesting;
1331
1602
 
1332
- var Test, requests;
1333
-
1334
- function incrementAjaxPendingRequests(_, xhr) {
1335
- requests.push(xhr);
1336
- Test.pendingAjaxRequests = requests.length;
1337
- }
1338
-
1339
- function decrementAjaxPendingRequests(_, xhr) {
1340
- for (var i = 0; i < requests.length; i++) {
1341
- if (xhr === requests[i]) {
1342
- requests.splice(i, 1);
1343
- }
1344
- }
1345
- Test.pendingAjaxRequests = requests.length;
1346
- }
1347
-
1348
1603
  /**
1349
1604
  Sets Ember up for testing. This is useful to perform
1350
1605
  basic setup steps in order to unit test.
@@ -1359,29 +1614,25 @@ enifed('ember-testing/setup_for_testing', ['exports', 'ember-metal/core', 'ember
1359
1614
  */
1360
1615
 
1361
1616
  function setupForTesting() {
1362
- if (!Test) {
1363
- Test = requireModule('ember-testing/test')['default'];
1364
- }
1365
-
1366
- _emberMetalCore.default.testing = true;
1617
+ _emberMetalTesting.setTesting(true);
1367
1618
 
1619
+ var adapter = _emberTestingTestAdapter.getAdapter();
1368
1620
  // if adapter is not manually set default to QUnit
1369
- if (!Test.adapter) {
1370
- Test.adapter = _emberTestingAdaptersQunit.default.create();
1621
+ if (!adapter) {
1622
+ var QUnitAdapter = _require.default('ember-testing/adapters/qunit').default;
1623
+ _emberTestingTestAdapter.setAdapter(new QUnitAdapter());
1371
1624
  }
1372
1625
 
1373
- requests = [];
1374
- Test.pendingAjaxRequests = requests.length;
1626
+ _emberViewsSystemJquery.default(document).off('ajaxSend', _emberTestingTestPending_requests.incrementPendingRequests);
1627
+ _emberViewsSystemJquery.default(document).off('ajaxComplete', _emberTestingTestPending_requests.decrementPendingRequests);
1628
+
1629
+ _emberTestingTestPending_requests.clearPendingRequests();
1375
1630
 
1376
- _emberViewsSystemJquery.default(document).off('ajaxSend', incrementAjaxPendingRequests);
1377
- _emberViewsSystemJquery.default(document).off('ajaxComplete', decrementAjaxPendingRequests);
1378
- _emberViewsSystemJquery.default(document).on('ajaxSend', incrementAjaxPendingRequests);
1379
- _emberViewsSystemJquery.default(document).on('ajaxComplete', decrementAjaxPendingRequests);
1631
+ _emberViewsSystemJquery.default(document).on('ajaxSend', _emberTestingTestPending_requests.incrementPendingRequests);
1632
+ _emberViewsSystemJquery.default(document).on('ajaxComplete', _emberTestingTestPending_requests.decrementPendingRequests);
1380
1633
  }
1381
1634
  });
1382
-
1383
- // import Test from "ember-testing/test"; // ES6TODO: fix when cycles are supported
1384
- enifed('ember-testing/support', ['exports', 'ember-metal/debug', 'ember-views/system/jquery', 'ember-metal/environment'], function (exports, _emberMetalDebug, _emberViewsSystemJquery, _emberMetalEnvironment) {
1635
+ enifed('ember-testing/support', ['exports', 'ember-metal/debug', 'ember-views/system/jquery', 'ember-environment'], function (exports, _emberMetalDebug, _emberViewsSystemJquery, _emberEnvironment) {
1385
1636
  'use strict';
1386
1637
 
1387
1638
  /**
@@ -1403,7 +1654,7 @@ enifed('ember-testing/support', ['exports', 'ember-metal/debug', 'ember-views/sy
1403
1654
  $('<input type="checkbox">').css({ position: 'absolute', left: '-1000px', top: '-1000px' }).appendTo('body').on('click', handler).trigger('click').remove();
1404
1655
  }
1405
1656
 
1406
- if (_emberMetalEnvironment.default.hasDOM) {
1657
+ if (_emberEnvironment.environment.hasDOM) {
1407
1658
  $(function () {
1408
1659
  /*
1409
1660
  Determine whether a checkbox checked using jQuery's "click" method will have
@@ -1433,463 +1684,324 @@ enifed('ember-testing/support', ['exports', 'ember-metal/debug', 'ember-views/sy
1433
1684
  });
1434
1685
  }
1435
1686
  });
1436
- enifed('ember-testing/test', ['exports', 'ember-metal/run_loop', 'ember-runtime/ext/rsvp', 'ember-testing/setup_for_testing', 'ember-application/system/application', 'ember-runtime/system/native_array'], function (exports, _emberMetalRun_loop, _emberRuntimeExtRsvp, _emberTestingSetup_for_testing, _emberApplicationSystemApplication, _emberRuntimeSystemNative_array) {
1687
+ enifed('ember-testing/test/adapter', ['exports', 'ember-console', 'ember-metal/error_handler'], function (exports, _emberConsole, _emberMetalError_handler) {
1437
1688
  'use strict';
1438
1689
 
1439
- /**
1440
- @module ember
1441
- @submodule ember-testing
1442
- */
1443
- var helpers = {};
1444
- var injectHelpersCallbacks = [];
1690
+ exports.getAdapter = getAdapter;
1691
+ exports.setAdapter = setAdapter;
1692
+ exports.asyncStart = asyncStart;
1693
+ exports.asyncEnd = asyncEnd;
1445
1694
 
1446
- /**
1447
- This is a container for an assortment of testing related functionality:
1695
+ var adapter = undefined;
1696
+
1697
+ function getAdapter() {
1698
+ return adapter;
1699
+ }
1700
+
1701
+ function setAdapter(value) {
1702
+ adapter = value;
1703
+ if (value) {
1704
+ _emberMetalError_handler.setDispatchOverride(adapterDispatch);
1705
+ } else {
1706
+ _emberMetalError_handler.setDispatchOverride(null);
1707
+ }
1708
+ }
1709
+
1710
+ function asyncStart() {
1711
+ if (adapter) {
1712
+ adapter.asyncStart();
1713
+ }
1714
+ }
1715
+
1716
+ function asyncEnd() {
1717
+ if (adapter) {
1718
+ adapter.asyncEnd();
1719
+ }
1720
+ }
1721
+
1722
+ function adapterDispatch(error) {
1723
+ adapter.exception(error);
1724
+ _emberConsole.default.error(error.stack);
1725
+ }
1726
+ });
1727
+ enifed('ember-testing/test/helpers', ['exports', 'ember-testing/test/promise'], function (exports, _emberTestingTestPromise) {
1728
+ 'use strict';
1729
+
1730
+ exports.registerHelper = registerHelper;
1731
+ exports.registerAsyncHelper = registerAsyncHelper;
1732
+ exports.unregisterHelper = unregisterHelper;
1733
+ var helpers = {};
1734
+
1735
+ exports.helpers = helpers;
1736
+ /**
1737
+ `registerHelper` is used to register a test helper that will be injected
1738
+ when `App.injectTestHelpers` is called.
1448
1739
 
1449
- * Choose your default test adapter (for your framework of choice).
1450
- * Register/Unregister additional test helpers.
1451
- * Setup callbacks to be fired when the test helpers are injected into
1452
- your application.
1740
+ The helper method will always be called with the current Application as
1741
+ the first parameter.
1742
+
1743
+ For example:
1744
+
1745
+ ```javascript
1746
+ Ember.Test.registerHelper('boot', function(app) {
1747
+ Ember.run(app, app.advanceReadiness);
1748
+ });
1749
+ ```
1750
+
1751
+ This helper can later be called without arguments because it will be
1752
+ called with `app` as the first parameter.
1753
+
1754
+ ```javascript
1755
+ App = Ember.Application.create();
1756
+ App.injectTestHelpers();
1757
+ boot();
1758
+ ```
1453
1759
 
1454
- @class Test
1455
- @namespace Ember
1456
1760
  @public
1761
+ @for Ember.Test
1762
+ @method registerHelper
1763
+ @param {String} name The name of the helper method to add.
1764
+ @param {Function} helperMethod
1765
+ @param options {Object}
1457
1766
  */
1458
- var Test = {
1459
- /**
1460
- Hash containing all known test helpers.
1461
- @property _helpers
1462
- @private
1463
- @since 1.7.0
1464
- */
1465
- _helpers: helpers,
1466
1767
 
1467
- /**
1468
- `registerHelper` is used to register a test helper that will be injected
1469
- when `App.injectTestHelpers` is called.
1470
- The helper method will always be called with the current Application as
1471
- the first parameter.
1472
- For example:
1473
- ```javascript
1474
- Ember.Test.registerHelper('boot', function(app) {
1475
- Ember.run(app, app.advanceReadiness);
1476
- });
1477
- ```
1478
- This helper can later be called without arguments because it will be
1479
- called with `app` as the first parameter.
1480
- ```javascript
1481
- App = Ember.Application.create();
1482
- App.injectTestHelpers();
1483
- boot();
1484
- ```
1485
- @public
1486
- @method registerHelper
1487
- @param {String} name The name of the helper method to add.
1488
- @param {Function} helperMethod
1489
- @param options {Object}
1490
- */
1491
- registerHelper: function (name, helperMethod) {
1492
- helpers[name] = {
1493
- method: helperMethod,
1494
- meta: { wait: false }
1495
- };
1496
- },
1768
+ function registerHelper(name, helperMethod) {
1769
+ helpers[name] = {
1770
+ method: helperMethod,
1771
+ meta: { wait: false }
1772
+ };
1773
+ }
1497
1774
 
1498
- /**
1499
- `registerAsyncHelper` is used to register an async test helper that will be injected
1500
- when `App.injectTestHelpers` is called.
1501
- The helper method will always be called with the current Application as
1502
- the first parameter.
1503
- For example:
1504
- ```javascript
1505
- Ember.Test.registerAsyncHelper('boot', function(app) {
1506
- Ember.run(app, app.advanceReadiness);
1507
- });
1508
- ```
1509
- The advantage of an async helper is that it will not run
1510
- until the last async helper has completed. All async helpers
1511
- after it will wait for it complete before running.
1512
- For example:
1513
- ```javascript
1514
- Ember.Test.registerAsyncHelper('deletePost', function(app, postId) {
1515
- click('.delete-' + postId);
1516
- });
1517
- // ... in your test
1518
- visit('/post/2');
1519
- deletePost(2);
1520
- visit('/post/3');
1521
- deletePost(3);
1522
- ```
1523
- @public
1524
- @method registerAsyncHelper
1525
- @param {String} name The name of the helper method to add.
1526
- @param {Function} helperMethod
1527
- @since 1.2.0
1528
- */
1529
- registerAsyncHelper: function (name, helperMethod) {
1530
- helpers[name] = {
1531
- method: helperMethod,
1532
- meta: { wait: true }
1533
- };
1534
- },
1775
+ /**
1776
+ `registerAsyncHelper` is used to register an async test helper that will be injected
1777
+ when `App.injectTestHelpers` is called.
1778
+
1779
+ The helper method will always be called with the current Application as
1780
+ the first parameter.
1781
+
1782
+ For example:
1783
+
1784
+ ```javascript
1785
+ Ember.Test.registerAsyncHelper('boot', function(app) {
1786
+ Ember.run(app, app.advanceReadiness);
1787
+ });
1788
+ ```
1789
+
1790
+ The advantage of an async helper is that it will not run
1791
+ until the last async helper has completed. All async helpers
1792
+ after it will wait for it complete before running.
1793
+
1794
+
1795
+ For example:
1796
+
1797
+ ```javascript
1798
+ Ember.Test.registerAsyncHelper('deletePost', function(app, postId) {
1799
+ click('.delete-' + postId);
1800
+ });
1801
+
1802
+ // ... in your test
1803
+ visit('/post/2');
1804
+ deletePost(2);
1805
+ visit('/post/3');
1806
+ deletePost(3);
1807
+ ```
1808
+
1809
+ @public
1810
+ @for Ember.Test
1811
+ @method registerAsyncHelper
1812
+ @param {String} name The name of the helper method to add.
1813
+ @param {Function} helperMethod
1814
+ @since 1.2.0
1815
+ */
1535
1816
 
1536
- /**
1537
- Remove a previously added helper method.
1538
- Example:
1539
- ```javascript
1540
- Ember.Test.unregisterHelper('wait');
1541
- ```
1542
- @public
1543
- @method unregisterHelper
1544
- @param {String} name The helper to remove.
1545
- */
1546
- unregisterHelper: function (name) {
1547
- delete helpers[name];
1548
- delete Test.Promise.prototype[name];
1549
- },
1817
+ function registerAsyncHelper(name, helperMethod) {
1818
+ helpers[name] = {
1819
+ method: helperMethod,
1820
+ meta: { wait: true }
1821
+ };
1822
+ }
1550
1823
 
1551
- /**
1552
- Used to register callbacks to be fired whenever `App.injectTestHelpers`
1553
- is called.
1554
- The callback will receive the current application as an argument.
1555
- Example:
1556
- ```javascript
1557
- Ember.Test.onInjectHelpers(function() {
1558
- Ember.$(document).ajaxSend(function() {
1559
- Test.pendingAjaxRequests++;
1560
- });
1561
- Ember.$(document).ajaxComplete(function() {
1562
- Test.pendingAjaxRequests--;
1563
- });
1564
- });
1565
- ```
1566
- @public
1567
- @method onInjectHelpers
1568
- @param {Function} callback The function to be called.
1569
- */
1570
- onInjectHelpers: function (callback) {
1571
- injectHelpersCallbacks.push(callback);
1572
- },
1824
+ /**
1825
+ Remove a previously added helper method.
1826
+
1827
+ Example:
1828
+
1829
+ ```javascript
1830
+ Ember.Test.unregisterHelper('wait');
1831
+ ```
1832
+
1833
+ @public
1834
+ @method unregisterHelper
1835
+ @param {String} name The helper to remove.
1836
+ */
1573
1837
 
1574
- /**
1575
- This returns a thenable tailored for testing. It catches failed
1576
- `onSuccess` callbacks and invokes the `Ember.Test.adapter.exception`
1577
- callback in the last chained then.
1578
- This method should be returned by async helpers such as `wait`.
1579
- @public
1580
- @method promise
1581
- @param {Function} resolver The function used to resolve the promise.
1582
- @param {String} label An optional string for identifying the promise.
1583
- */
1584
- promise: function (resolver, label) {
1585
- var fullLabel = 'Ember.Test.promise: ' + (label || '<Unknown Promise>');
1586
- return new Test.Promise(resolver, fullLabel);
1587
- },
1838
+ function unregisterHelper(name) {
1839
+ delete helpers[name];
1840
+ delete _emberTestingTestPromise.default.prototype[name];
1841
+ }
1842
+ });
1843
+ enifed("ember-testing/test/on_inject_helpers", ["exports"], function (exports) {
1844
+ "use strict";
1588
1845
 
1589
- /**
1590
- Used to allow ember-testing to communicate with a specific testing
1591
- framework.
1592
- You can manually set it before calling `App.setupForTesting()`.
1593
- Example:
1594
- ```javascript
1595
- Ember.Test.adapter = MyCustomAdapter.create()
1596
- ```
1597
- If you do not set it, ember-testing will default to `Ember.Test.QUnitAdapter`.
1598
- @public
1599
- @property adapter
1600
- @type {Class} The adapter to be used.
1601
- @default Ember.Test.QUnitAdapter
1602
- */
1603
- adapter: null,
1846
+ exports.onInjectHelpers = onInjectHelpers;
1847
+ exports.invokeInjectHelpersCallbacks = invokeInjectHelpersCallbacks;
1848
+ var callbacks = [];
1604
1849
 
1605
- /**
1606
- Replacement for `Ember.RSVP.resolve`
1607
- The only difference is this uses
1608
- an instance of `Ember.Test.Promise`
1609
- @public
1610
- @method resolve
1611
- @param {Mixed} The value to resolve
1612
- @since 1.2.0
1613
- */
1614
- resolve: function (val) {
1615
- return Test.promise(function (resolve) {
1616
- return resolve(val);
1850
+ exports.callbacks = callbacks;
1851
+ /**
1852
+ Used to register callbacks to be fired whenever `App.injectTestHelpers`
1853
+ is called.
1854
+
1855
+ The callback will receive the current application as an argument.
1856
+
1857
+ Example:
1858
+
1859
+ ```javascript
1860
+ Ember.Test.onInjectHelpers(function() {
1861
+ Ember.$(document).ajaxSend(function() {
1862
+ Test.pendingRequests++;
1617
1863
  });
1618
- },
1619
-
1620
- /**
1621
- This allows ember-testing to play nicely with other asynchronous
1622
- events, such as an application that is waiting for a CSS3
1623
- transition or an IndexDB transaction.
1624
- For example:
1625
- ```javascript
1626
- Ember.Test.registerWaiter(function() {
1627
- return myPendingTransactions() == 0;
1628
- });
1629
- ```
1630
- The `context` argument allows you to optionally specify the `this`
1631
- with which your callback will be invoked.
1632
- For example:
1633
- ```javascript
1634
- Ember.Test.registerWaiter(MyDB, MyDB.hasPendingTransactions);
1635
- ```
1636
- @public
1637
- @method registerWaiter
1638
- @param {Object} context (optional)
1639
- @param {Function} callback
1640
- @since 1.2.0
1641
- */
1642
- registerWaiter: function (context, callback) {
1643
- if (arguments.length === 1) {
1644
- callback = context;
1645
- context = null;
1646
- }
1647
- if (!this.waiters) {
1648
- this.waiters = _emberRuntimeSystemNative_array.A();
1649
- }
1650
- this.waiters.push([context, callback]);
1651
- },
1652
- /**
1653
- `unregisterWaiter` is used to unregister a callback that was
1654
- registered with `registerWaiter`.
1655
- @public
1656
- @method unregisterWaiter
1657
- @param {Object} context (optional)
1658
- @param {Function} callback
1659
- @since 1.2.0
1660
- */
1661
- unregisterWaiter: function (context, callback) {
1662
- if (!this.waiters) {
1663
- return;
1664
- }
1665
- if (arguments.length === 1) {
1666
- callback = context;
1667
- context = null;
1668
- }
1669
- this.waiters = _emberRuntimeSystemNative_array.A(this.waiters.filter(function (elt) {
1670
- return !(elt[0] === context && elt[1] === callback);
1671
- }));
1672
- }
1673
- };
1674
-
1675
- function helper(app, name) {
1676
- var fn = helpers[name].method;
1677
- var meta = helpers[name].meta;
1864
+
1865
+ Ember.$(document).ajaxComplete(function() {
1866
+ Test.pendingRequests--;
1867
+ });
1868
+ });
1869
+ ```
1870
+
1871
+ @public
1872
+ @for Ember.Test
1873
+ @method onInjectHelpers
1874
+ @param {Function} callback The function to be called.
1875
+ */
1678
1876
 
1679
- return function () {
1680
- for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
1681
- args[_key] = arguments[_key];
1682
- }
1877
+ function onInjectHelpers(callback) {
1878
+ callbacks.push(callback);
1879
+ }
1683
1880
 
1684
- var lastPromise;
1881
+ function invokeInjectHelpersCallbacks(app) {
1882
+ for (var i = 0; i < callbacks.length; i++) {
1883
+ callbacks[i](app);
1884
+ }
1885
+ }
1886
+ });
1887
+ enifed("ember-testing/test/pending_requests", ["exports"], function (exports) {
1888
+ "use strict";
1685
1889
 
1686
- args.unshift(app);
1890
+ exports.pendingRequests = pendingRequests;
1891
+ exports.clearPendingRequests = clearPendingRequests;
1892
+ exports.incrementPendingRequests = incrementPendingRequests;
1893
+ exports.decrementPendingRequests = decrementPendingRequests;
1894
+ var requests = [];
1687
1895
 
1688
- // some helpers are not async and
1689
- // need to return a value immediately.
1690
- // example: `find`
1691
- if (!meta.wait) {
1692
- return fn.apply(app, args);
1693
- }
1896
+ function pendingRequests() {
1897
+ return requests.length;
1898
+ }
1694
1899
 
1695
- lastPromise = run(function () {
1696
- return Test.resolve(Test.lastPromise);
1697
- });
1900
+ function clearPendingRequests() {
1901
+ requests.length = 0;
1902
+ }
1698
1903
 
1699
- // wait for last helper's promise to resolve and then
1700
- // execute. To be safe, we need to tell the adapter we're going
1701
- // asynchronous here, because fn may not be invoked before we
1702
- // return.
1703
- Test.adapter.asyncStart();
1704
- return lastPromise.then(function () {
1705
- return fn.apply(app, args);
1706
- }).finally(function () {
1707
- Test.adapter.asyncEnd();
1708
- });
1709
- };
1904
+ function incrementPendingRequests(_, xhr) {
1905
+ requests.push(xhr);
1710
1906
  }
1711
1907
 
1712
- function run(fn) {
1713
- if (!_emberMetalRun_loop.default.currentRunLoop) {
1714
- return _emberMetalRun_loop.default(fn);
1715
- } else {
1716
- return fn();
1908
+ function decrementPendingRequests(_, xhr) {
1909
+ for (var i = 0; i < requests.length; i++) {
1910
+ if (xhr === requests[i]) {
1911
+ requests.splice(i, 1);
1912
+ break;
1913
+ }
1717
1914
  }
1718
1915
  }
1916
+ });
1917
+ enifed('ember-testing/test/promise', ['exports', 'ember-runtime/ext/rsvp', 'ember-testing/test/run'], function (exports, _emberRuntimeExtRsvp, _emberTestingTestRun) {
1918
+ 'use strict';
1719
1919
 
1720
- _emberApplicationSystemApplication.default.reopen({
1721
- /**
1722
- This property contains the testing helpers for the current application. These
1723
- are created once you call `injectTestHelpers` on your `Ember.Application`
1724
- instance. The included helpers are also available on the `window` object by
1725
- default, but can be used from this object on the individual application also.
1726
- @property testHelpers
1727
- @type {Object}
1728
- @default {}
1729
- @public
1730
- */
1731
- testHelpers: {},
1920
+ exports.promise = promise;
1921
+ exports.resolve = resolve;
1922
+ exports.getLastPromise = getLastPromise;
1732
1923
 
1733
- /**
1734
- This property will contain the original methods that were registered
1735
- on the `helperContainer` before `injectTestHelpers` is called.
1736
- When `removeTestHelpers` is called, these methods are restored to the
1737
- `helperContainer`.
1738
- @property originalMethods
1739
- @type {Object}
1740
- @default {}
1741
- @private
1742
- @since 1.3.0
1743
- */
1744
- originalMethods: {},
1924
+ function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; }
1745
1925
 
1746
- /**
1747
- This property indicates whether or not this application is currently in
1748
- testing mode. This is set when `setupForTesting` is called on the current
1749
- application.
1750
- @property testing
1751
- @type {Boolean}
1752
- @default false
1753
- @since 1.3.0
1754
- @public
1755
- */
1756
- testing: false,
1926
+ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
1757
1927
 
1758
- /**
1759
- This hook defers the readiness of the application, so that you can start
1760
- the app when your tests are ready to run. It also sets the router's
1761
- location to 'none', so that the window's location will not be modified
1762
- (preventing both accidental leaking of state between tests and interference
1763
- with your testing framework).
1764
- Example:
1765
- ```
1766
- App.setupForTesting();
1767
- ```
1768
- @method setupForTesting
1769
- @public
1770
- */
1771
- setupForTesting: function () {
1772
- _emberTestingSetup_for_testing.default();
1928
+ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass); }
1773
1929
 
1774
- this.testing = true;
1930
+ var lastPromise = undefined;
1775
1931
 
1776
- this.Router.reopen({
1777
- location: 'none'
1778
- });
1779
- },
1932
+ var TestPromise = (function (_RSVP$Promise) {
1933
+ _inherits(TestPromise, _RSVP$Promise);
1780
1934
 
1781
- /**
1782
- This will be used as the container to inject the test helpers into. By
1783
- default the helpers are injected into `window`.
1784
- @property helperContainer
1785
- @type {Object} The object to be used for test helpers.
1786
- @default window
1787
- @since 1.2.0
1788
- @private
1789
- */
1790
- helperContainer: null,
1935
+ function TestPromise() {
1936
+ _classCallCheck(this, TestPromise);
1937
+
1938
+ _RSVP$Promise.apply(this, arguments);
1939
+ lastPromise = this;
1940
+ }
1791
1941
 
1792
1942
  /**
1793
- This injects the test helpers into the `helperContainer` object. If an object is provided
1794
- it will be used as the helperContainer. If `helperContainer` is not set it will default
1795
- to `window`. If a function of the same name has already been defined it will be cached
1796
- (so that it can be reset if the helper is removed with `unregisterHelper` or
1797
- `removeTestHelpers`).
1798
- Any callbacks registered with `onInjectHelpers` will be called once the
1799
- helpers have been injected.
1800
- Example:
1801
- ```
1802
- App.injectTestHelpers();
1803
- ```
1804
- @method injectTestHelpers
1943
+ This returns a thenable tailored for testing. It catches failed
1944
+ `onSuccess` callbacks and invokes the `Ember.Test.adapter.exception`
1945
+ callback in the last chained then.
1946
+
1947
+ This method should be returned by async helpers such as `wait`.
1948
+
1805
1949
  @public
1950
+ @for Ember.Test
1951
+ @method promise
1952
+ @param {Function} resolver The function used to resolve the promise.
1953
+ @param {String} label An optional string for identifying the promise.
1806
1954
  */
1807
- injectTestHelpers: function (helperContainer) {
1808
- if (helperContainer) {
1809
- this.helperContainer = helperContainer;
1810
- } else {
1811
- this.helperContainer = window;
1812
- }
1813
1955
 
1814
- this.reopen({
1815
- willDestroy: function () {
1816
- this._super.apply(this, arguments);
1817
- this.removeTestHelpers();
1818
- }
1956
+ TestPromise.resolve = function resolve(val) {
1957
+ return new TestPromise(function (resolve) {
1958
+ return resolve(val);
1819
1959
  });
1960
+ };
1820
1961
 
1821
- this.testHelpers = {};
1822
- for (var name in helpers) {
1823
- this.originalMethods[name] = this.helperContainer[name];
1824
- this.testHelpers[name] = this.helperContainer[name] = helper(this, name);
1825
- protoWrap(Test.Promise.prototype, name, helper(this, name), helpers[name].meta.wait);
1826
- }
1962
+ TestPromise.prototype.then = function then(onFulfillment) {
1963
+ var _RSVP$Promise$prototype$then;
1827
1964
 
1828
- for (var i = 0, l = injectHelpersCallbacks.length; i < l; i++) {
1829
- injectHelpersCallbacks[i](this);
1965
+ for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
1966
+ args[_key - 1] = arguments[_key];
1830
1967
  }
1831
- },
1832
1968
 
1833
- /**
1834
- This removes all helpers that have been registered, and resets and functions
1835
- that were overridden by the helpers.
1836
- Example:
1837
- ```javascript
1838
- App.removeTestHelpers();
1839
- ```
1840
- @public
1841
- @method removeTestHelpers
1842
- */
1843
- removeTestHelpers: function () {
1844
- if (!this.helperContainer) {
1845
- return;
1846
- }
1969
+ return (_RSVP$Promise$prototype$then = _RSVP$Promise.prototype.then).call.apply(_RSVP$Promise$prototype$then, [this, function (result) {
1970
+ return isolate(onFulfillment, result);
1971
+ }].concat(args));
1972
+ };
1847
1973
 
1848
- for (var name in helpers) {
1849
- this.helperContainer[name] = this.originalMethods[name];
1850
- delete Test.Promise.prototype[name];
1851
- delete this.testHelpers[name];
1852
- delete this.originalMethods[name];
1853
- }
1854
- }
1855
- });
1974
+ return TestPromise;
1975
+ })(_emberRuntimeExtRsvp.default.Promise);
1856
1976
 
1857
- // This method is no longer needed
1858
- // But still here for backwards compatibility
1859
- // of helper chaining
1860
- function protoWrap(proto, name, callback, isAsync) {
1861
- proto[name] = function () {
1862
- for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
1863
- args[_key2] = arguments[_key2];
1864
- }
1977
+ exports.default = TestPromise;
1865
1978
 
1866
- if (isAsync) {
1867
- return callback.apply(this, args);
1868
- } else {
1869
- return this.then(function () {
1870
- return callback.apply(this, args);
1871
- });
1872
- }
1873
- };
1979
+ function promise(resolver, label) {
1980
+ var fullLabel = 'Ember.Test.promise: ' + (label || '<Unknown Promise>');
1981
+ return new TestPromise(resolver, fullLabel);
1874
1982
  }
1875
1983
 
1876
- Test.Promise = function () {
1877
- _emberRuntimeExtRsvp.default.Promise.apply(this, arguments);
1878
- Test.lastPromise = this;
1879
- };
1984
+ /**
1985
+ Replacement for `Ember.RSVP.resolve`
1986
+ The only difference is this uses
1987
+ an instance of `Ember.Test.Promise`
1988
+
1989
+ @public
1990
+ @for Ember.Test
1991
+ @method resolve
1992
+ @param {Mixed} The value to resolve
1993
+ @since 1.2.0
1994
+ */
1880
1995
 
1881
- Test.Promise.prototype = Object.create(_emberRuntimeExtRsvp.default.Promise.prototype);
1882
- Test.Promise.prototype.constructor = Test.Promise;
1883
- Test.Promise.resolve = Test.resolve;
1884
-
1885
- // Patch `then` to isolate async methods
1886
- // specifically `Ember.Test.lastPromise`
1887
- var originalThen = _emberRuntimeExtRsvp.default.Promise.prototype.then;
1888
- Test.Promise.prototype.then = function (onSuccess, onFailure) {
1889
- return originalThen.call(this, function (val) {
1890
- return isolate(onSuccess, val);
1891
- }, onFailure);
1892
- };
1996
+ function resolve(result) {
1997
+ return new TestPromise(function (resolve) {
1998
+ return resolve(result);
1999
+ });
2000
+ }
2001
+
2002
+ function getLastPromise() {
2003
+ return lastPromise;
2004
+ }
1893
2005
 
1894
2006
  // This method isolates nested async methods
1895
2007
  // so that they don't conflict with other last promises.
@@ -1897,30 +2009,206 @@ enifed('ember-testing/test', ['exports', 'ember-metal/run_loop', 'ember-runtime/
1897
2009
  // 1. Set `Ember.Test.lastPromise` to null
1898
2010
  // 2. Invoke method
1899
2011
  // 3. Return the last promise created during method
1900
- function isolate(fn, val) {
1901
- var value, lastPromise;
1902
-
2012
+ function isolate(onFulfillment, result) {
1903
2013
  // Reset lastPromise for nested helpers
1904
- Test.lastPromise = null;
2014
+ lastPromise = null;
1905
2015
 
1906
- value = fn(val);
2016
+ var value = onFulfillment(result);
1907
2017
 
1908
- lastPromise = Test.lastPromise;
1909
- Test.lastPromise = null;
2018
+ var promise = lastPromise;
2019
+ lastPromise = null;
1910
2020
 
1911
2021
  // If the method returned a promise
1912
2022
  // return that promise. If not,
1913
2023
  // return the last async helper's promise
1914
- if (value && value instanceof Test.Promise || !lastPromise) {
2024
+ if (value && value instanceof TestPromise || !promise) {
1915
2025
  return value;
1916
2026
  } else {
1917
- return run(function () {
1918
- return Test.resolve(lastPromise).then(function () {
2027
+ return _emberTestingTestRun.default(function () {
2028
+ return resolve(promise).then(function () {
1919
2029
  return value;
1920
2030
  });
1921
2031
  });
1922
2032
  }
1923
2033
  }
2034
+ });
2035
+ enifed('ember-testing/test/run', ['exports', 'ember-metal/run_loop'], function (exports, _emberMetalRun_loop) {
2036
+ 'use strict';
2037
+
2038
+ exports.default = run;
2039
+
2040
+ function run(fn) {
2041
+ if (!_emberMetalRun_loop.default.currentRunLoop) {
2042
+ return _emberMetalRun_loop.default(fn);
2043
+ } else {
2044
+ return fn();
2045
+ }
2046
+ }
2047
+ });
2048
+ enifed("ember-testing/test/waiters", ["exports"], function (exports) {
2049
+ "use strict";
2050
+
2051
+ exports.registerWaiter = registerWaiter;
2052
+ exports.unregisterWaiter = unregisterWaiter;
2053
+ exports.checkWaiters = checkWaiters;
2054
+ var contexts = [];
2055
+ var callbacks = [];
2056
+
2057
+ /**
2058
+ This allows ember-testing to play nicely with other asynchronous
2059
+ events, such as an application that is waiting for a CSS3
2060
+ transition or an IndexDB transaction.
2061
+
2062
+ For example:
2063
+
2064
+ ```javascript
2065
+ Ember.Test.registerWaiter(function() {
2066
+ return myPendingTransactions() == 0;
2067
+ });
2068
+ ```
2069
+ The `context` argument allows you to optionally specify the `this`
2070
+ with which your callback will be invoked.
2071
+
2072
+ For example:
2073
+
2074
+ ```javascript
2075
+ Ember.Test.registerWaiter(MyDB, MyDB.hasPendingTransactions);
2076
+ ```
2077
+
2078
+ @public
2079
+ @for Ember.Test
2080
+ @method registerWaiter
2081
+ @param {Object} context (optional)
2082
+ @param {Function} callback
2083
+ @since 1.2.0
2084
+ */
2085
+
2086
+ function registerWaiter(context, callback) {
2087
+ if (arguments.length === 1) {
2088
+ callback = context;
2089
+ context = null;
2090
+ }
2091
+ if (indexOf(context, callback) > -1) {
2092
+ return;
2093
+ }
2094
+ contexts.push(context);
2095
+ callbacks.push(callback);
2096
+ }
2097
+
2098
+ /**
2099
+ `unregisterWaiter` is used to unregister a callback that was
2100
+ registered with `registerWaiter`.
2101
+
2102
+ @public
2103
+ @for Ember.Test
2104
+ @method unregisterWaiter
2105
+ @param {Object} context (optional)
2106
+ @param {Function} callback
2107
+ @since 1.2.0
2108
+ */
2109
+
2110
+ function unregisterWaiter(context, callback) {
2111
+ if (!callbacks.length) {
2112
+ return;
2113
+ }
2114
+ if (arguments.length === 1) {
2115
+ callback = context;
2116
+ context = null;
2117
+ }
2118
+ var i = indexOf(context, callback);
2119
+ if (i === -1) {
2120
+ return;
2121
+ }
2122
+ contexts.splice(i, 1);
2123
+ callbacks.splice(i, 1);
2124
+ }
2125
+
2126
+ function checkWaiters() {
2127
+ if (!callbacks.length) {
2128
+ return false;
2129
+ }
2130
+ for (var i = 0; i < callbacks.length; i++) {
2131
+ var context = contexts[i];
2132
+ var callback = callbacks[i];
2133
+ if (!callback.call(context)) {
2134
+ return true;
2135
+ }
2136
+ }
2137
+ return false;
2138
+ }
2139
+
2140
+ function indexOf(context, callback) {
2141
+ for (var i = 0; i < callbacks.length; i++) {
2142
+ if (callbacks[i] === callback && contexts[i] === context) {
2143
+ return i;
2144
+ }
2145
+ }
2146
+ return -1;
2147
+ }
2148
+ });
2149
+ enifed('ember-testing/test', ['exports', 'ember-testing/test/helpers', 'ember-testing/test/on_inject_helpers', 'ember-testing/test/promise', 'ember-testing/test/waiters', 'ember-testing/test/adapter'], function (exports, _emberTestingTestHelpers, _emberTestingTestOn_inject_helpers, _emberTestingTestPromise, _emberTestingTestWaiters, _emberTestingTestAdapter) {
2150
+ /**
2151
+ @module ember
2152
+ @submodule ember-testing
2153
+ */
2154
+ 'use strict';
2155
+
2156
+ /**
2157
+ This is a container for an assortment of testing related functionality:
2158
+
2159
+ * Choose your default test adapter (for your framework of choice).
2160
+ * Register/Unregister additional test helpers.
2161
+ * Setup callbacks to be fired when the test helpers are injected into
2162
+ your application.
2163
+
2164
+ @class Test
2165
+ @namespace Ember
2166
+ @public
2167
+ */
2168
+ var Test = {
2169
+ /**
2170
+ Hash containing all known test helpers.
2171
+ @property _helpers
2172
+ @private
2173
+ @since 1.7.0
2174
+ */
2175
+ _helpers: _emberTestingTestHelpers.helpers,
2176
+
2177
+ registerHelper: _emberTestingTestHelpers.registerHelper,
2178
+ registerAsyncHelper: _emberTestingTestHelpers.registerAsyncHelper,
2179
+ unregisterHelper: _emberTestingTestHelpers.unregisterHelper,
2180
+ onInjectHelpers: _emberTestingTestOn_inject_helpers.onInjectHelpers,
2181
+ Promise: _emberTestingTestPromise.default,
2182
+ promise: _emberTestingTestPromise.promise,
2183
+ resolve: _emberTestingTestPromise.resolve,
2184
+ registerWaiter: _emberTestingTestWaiters.registerWaiter,
2185
+ unregisterWaiter: _emberTestingTestWaiters.unregisterWaiter
2186
+ };
2187
+
2188
+ /**
2189
+ Used to allow ember-testing to communicate with a specific testing
2190
+ framework.
2191
+
2192
+ You can manually set it before calling `App.setupForTesting()`.
2193
+
2194
+ Example:
2195
+
2196
+ ```javascript
2197
+ Ember.Test.adapter = MyCustomAdapter.create()
2198
+ ```
2199
+
2200
+ If you do not set it, ember-testing will default to `Ember.Test.QUnitAdapter`.
2201
+
2202
+ @public
2203
+ @for Ember.Test
2204
+ @property adapter
2205
+ @type {Class} The adapter to be used.
2206
+ @default Ember.Test.QUnitAdapter
2207
+ */
2208
+ Object.defineProperty(Test, 'adapter', {
2209
+ get: _emberTestingTestAdapter.getAdapter,
2210
+ set: _emberTestingTestAdapter.setAdapter
2211
+ });
1924
2212
 
1925
2213
  exports.default = Test;
1926
2214
  });