run(function() {
   obj = EmberObject.extend({
     max: computedMax('items')
   }).create({
     items: Ember.A([1,2,3])
   });
 });
 run(function() {
   userFnCalls = 0;
   obj = EmberObject.createWithMixins({
     array: Ember.A([{ v: 1 }, { v: 3}, { v: 2 }, { v: 1 }]),
     mapped: computedMapBy('array', 'v'),
     max: computedMax('mapped'),
     maxDidChange: observer('max', function(){
       userFnCalls++;
     })
   });
 });
 run(function() {
   obj = EmberObject.extend({
     lannisters: computedFilterBy('items', 'lname', 'Lannister'),
     sortedLannisters: computedSort('lannisters', 'lannisterSorting'),
     starks: computedFilterBy('items', 'lname', 'Stark'),
     starkAges: computedMapBy('starks', 'age'),
     oldestStarkAge: computedMax('starkAges')
   }).create({
     lannisterSorting: Ember.A(['fname']),
     items: Ember.A([{
       fname: 'Jaime', lname: 'Lannister', age: 34
     }, {
       fname: 'Cersei', lname: 'Lannister', age: 34
     }, {
       fname: 'Robb', lname: 'Stark', age: 16
     }, {
       fname: 'Bran', lname: 'Stark', age: 8
     }])
   });
 });
    run(function() {
      obj = EmberObject.createWithMixins({
        items: Ember.A([{
          fname: "Jaime", lname: "Lannister", age: 34
        }, {
          fname: "Cersei", lname: "Lannister", age: 34
        }, {
          fname: "Robb", lname: "Stark", age: 16
        }, {
          fname: "Bran", lname: "Stark", age: 8
        }]),

        lannisters: computedFilterBy('items', 'lname', 'Lannister'),
        lannisterSorting: Ember.A(['fname']),
        sortedLannisters: computedSort('lannisters', 'lannisterSorting'),


        starks: computedFilterBy('items', 'lname', 'Stark'),
        starkAges: computedMapBy('starks', 'age'),
        oldestStarkAge: computedMax('starkAges')
      });
    });
 run(function() {
   obj = EmberObject.createWithMixins({
     items: Ember.A([1,2,3]),
     max: computedMax('items')
   });
 });
  set(obj.get('items')[2], 'count', 6);

  deepEqual(obj.get('sortedItems').mapBy('name'), ['A', 'D', 'B', 'C'], 'obj.sortedItems.name should now have changed');
  deepEqual(obj2.get('sortedItems').mapBy('name'), ['A', 'D', 'B', 'C'], 'obj2.sortedItems.name should still mirror sortedItems2');

  obj.set('sortProps', ['thing']);
  obj2.set('sortProps', ['id']);

  deepEqual(obj2.get('sortedItems').mapBy('name'), ['A', 'B', 'C', 'D'], 'we now sort obj2 by id, so we expect a b c d');
  deepEqual(obj.get('sortedItems').mapBy('name'), ['D', 'C', 'B', 'A'], 'we now sort obj by thing');
});

QUnit.module('max', {
  setup() {
    obj = EmberObject.extend({
      max: max('items')
    }).create({
      items: emberA([1, 2, 3])
    });
  },
  teardown() {
    run(obj, 'destroy');
  }
});

QUnit.test('max is readOnly', function() {
  QUnit.throws(function() {
    obj.set('max', 1);
  }, /Cannot set read-only property "max" on object:/);
});