FLEX-35037
Added unit tests donated by Justin Mclean. Currently some are failing.
diff --git a/frameworks/projects/framework/tests/mx/collections/AddRemoveNumbers.as b/frameworks/projects/framework/tests/mx/collections/AddRemoveNumbers.as
new file mode 100644
index 0000000..28354f2
--- /dev/null
+++ b/frameworks/projects/framework/tests/mx/collections/AddRemoveNumbers.as
@@ -0,0 +1,158 @@
+package mx.collections {
+	import mx.collections.ArrayCollection;
+	
+	import org.flexunit.asserts.*;
+
+	public class AddRemoveNumbers
+	{	
+		protected var _sut:ArrayCollection;
+		
+		[Before]
+		public function setUp():void
+		{
+			_sut = new ArrayCollection();
+		}
+		
+		[After]
+		public function tearDown():void
+		{
+			_sut = null;
+		}
+		
+		[Test]
+		public function empty():void
+		{
+			//then
+			assertEquals(_sut.length, 0);
+		}
+		
+		[Test]
+		public function addNumbers():void
+		{
+			_sut.addItem(1);
+			assertEquals("Length is not one", _sut.length, 1);
+			assertEquals("First element not correct", _sut[0], 1);
+			_sut.addItem(2);
+			assertEquals("Length is not two", _sut.length, 2);
+			assertEquals("Second element not correct", _sut[1], 2);
+		}
+		
+		[Test]
+		public function addDuplicate():void
+		{
+			addNumbers();
+			_sut.addItem(1);
+			assertEquals("Length is not three", _sut.length, 3);
+			assertEquals("First element not correct", _sut[0], 1);
+			assertEquals("Second element not correct", _sut[1], 2);
+			assertEquals("Second element not correct", _sut[2], 1);
+		}
+		
+		[Test]
+		public function removeDuplicate():void
+		{
+			addNumbers();
+			_sut.addItem(1);
+			_sut.removeItemAt(0);
+			assertEquals("Length is not two", _sut.length, 2);
+			assertEquals("First element not correct", _sut[0], 2);
+			assertEquals("Second element not correct", _sut[1], 1);
+		}
+		
+		[Test]
+		public function removeAllNumbers():void
+		{
+			addNumbers();
+			_sut.removeAll();
+			assertEquals("Length is not zero", _sut.length, 0);
+		}
+		
+		[Test]
+		public function removeFirstNumbers():void
+		{
+			addNumbers();
+			_sut.removeItemAt(0);
+			assertEquals("First element not correct", _sut[0], 2);
+			assertEquals("Length is not one", _sut.length, 1);
+			_sut.removeItemAt(0);
+			assertEquals("Length is not zero", _sut.length, 0);
+		}
+		
+		[Test]
+		public function removeLastNumbers():void
+		{
+			addNumbers();
+			_sut.removeItemAt(1);
+			assertEquals("First element not correct", _sut[0], 1);
+			assertEquals("Length is not one", _sut.length, 1);
+			_sut.removeItemAt(0);
+			assertEquals("Length is not zero", _sut.length, 0);
+		}
+		
+		[Test]
+		public function removeItemByIndex():void
+		{
+			addNumbers();
+			_sut.removeItemAt(_sut.getItemIndex(1));
+			assertEquals("First element not correct", _sut[0], 2);
+			assertEquals("Length is not one", _sut.length, 1);
+			_sut.removeItemAt(_sut.getItemIndex(2));
+			assertEquals("Length is not zero", _sut.length, 0);
+		}
+		
+		[Test]
+		public function outOfRange():void
+		{
+			addNumbers();
+			try {
+				_sut.removeItemAt(-1);
+			}
+			catch (error:Error)
+			{
+				assertTrue("Error not range error", error is RangeError);
+			}
+			assertEquals("Length is not two", _sut.length, 2);
+			try {
+				_sut.removeItemAt(10);
+			}
+			catch (error:Error)
+			{
+				assertTrue("Error not range error", error is RangeError);
+			}
+			assertEquals("Length is not two", _sut.length, 2);
+		}
+		
+		[Test]
+		public function swapItemsTwoThenOne():void
+		{
+			addNumbers();
+			
+			var item1:Number = _sut.getItemAt(0) as Number;
+			var item2:Number = _sut.getItemAt(1) as Number;
+			
+			_sut.setItemAt(item2,0);
+			_sut.setItemAt(item1,1);
+			
+			assertEquals("Length is not two", _sut.length, 2);
+			assertEquals("First element not correct", _sut[0], 2);
+			assertEquals("Second element not correct", _sut[1], 1);
+		}
+		
+		[Test]
+		public function swapItemsOneThenTwo():void
+		{
+			addNumbers();
+
+			var item1:Number = _sut.getItemAt(0) as Number;
+			var item2:Number = _sut.getItemAt(1) as Number;
+			
+			_sut.setItemAt(item1,1);
+			_sut.setItemAt(item2,0);
+			
+			assertEquals("Length is not two", _sut.length, 2);
+			assertEquals("First element not correct", _sut[0], 2);
+			assertEquals("Second element not correct", _sut[1], 1);
+		}
+		
+	}
+}
\ No newline at end of file
diff --git a/frameworks/projects/framework/tests/mx/collections/AddRemoveObjects.as b/frameworks/projects/framework/tests/mx/collections/AddRemoveObjects.as
new file mode 100644
index 0000000..845b97a
--- /dev/null
+++ b/frameworks/projects/framework/tests/mx/collections/AddRemoveObjects.as
@@ -0,0 +1,203 @@
+package mx.collections {
+	import mx.collections.ArrayCollection;
+	
+	import org.flexunit.asserts.*;
+
+	public class AddRemoveObjects
+	{	
+		protected var ac:ArrayCollection;
+		
+		protected var players:Array=[
+			{team:"TeamOne",jerseyNumber:80,lastName:"PlayerA",firstName:"Aa"},
+			{team:"TeamTwo",jerseyNumber:7, lastName:"PlayerB",firstName:"Bb"},
+			{team:"TeamOne",jerseyNumber:12, lastName:"PlayerC",firstName:"Cc"},
+			{team:"TeamOne",jerseyNumber:21,lastName:"PlayerD",firstName:"Dd"},
+			{team:"TeamThree",jerseyNumber:34, lastName:"PlayerE",firstName:"Ee"},
+			{team:"TeamOne",jerseyNumber:12, lastName:"PlayerF",firstName:"Ff"},
+			{team:"TeamTwo",jerseyNumber:7, lastName:"PlayerG",firstName:"Gg"},
+		];
+		
+		[Before]
+		public function setUp():void
+		{
+			ac = new ArrayCollection();
+		}
+		
+		[After]
+		public function tearDown():void
+		{
+			ac = null;
+		}
+		
+		[Test]
+		public function empty():void
+		{
+			assertEquals(ac.length, 0);
+		}
+		
+		[Test]
+		public function addObjects():void
+		{
+			ac = new ArrayCollection(players);
+			assertEquals("Length is not seven", ac.length, 7);
+			assertEquals("First element not correct", ac[0], players[0]);
+			assertEquals("Second element not correct", ac[1], players[1]);
+			assertEquals("Third element not correct", ac[2], players[2]);
+			assertEquals("Fouth element not correct", ac[3], players[3]);
+			assertEquals("Fifth element not correct", ac[4], players[4]);
+			assertEquals("Sixth element not correct", ac[5], players[5]);
+			assertEquals("Seventh element not correct", ac[6], players[6]);
+		}
+		
+		[Test]
+		public function addDuplicate():void
+		{
+			addObjects();
+			ac.addItem(players[0]);
+			assertEquals("Length is not eight", ac.length, 8);
+			assertEquals("First element not correct", ac[0], players[0]);
+			assertEquals("Second element not correct", ac[1], players[1]);
+			assertEquals("Third element not correct", ac[2], players[2]);
+			assertEquals("Fouth element not correct", ac[3], players[3]);
+			assertEquals("Fifth element not correct", ac[4], players[4]);
+			assertEquals("Sixth element not correct", ac[5], players[5]);
+			assertEquals("Seventh element not correct", ac[6], players[6]);
+			assertEquals("Eighth element not correct", ac[7], players[0]);
+		}
+		
+		[Test]
+		public function removeDuplicate():void
+		{
+			addObjects();
+			ac.addItem(players[0]);
+			ac.removeItemAt(0);
+			assertEquals("Length is not seven", ac.length, 7);
+			assertEquals("First element not correct", ac[0], players[1]);
+			assertEquals("Second element not correct", ac[1], players[2]);
+			assertEquals("Third element not correct", ac[2], players[3]);
+			assertEquals("Fouth element not correct", ac[3], players[4]);
+			assertEquals("Fifth element not correct", ac[4], players[5]);
+			assertEquals("Sixth element not correct", ac[5], players[6]);
+			assertEquals("Seventh element not correct", ac[6], players[0]);
+		}
+		
+		[Test]
+		public function removeAllObjects():void
+		{
+			addObjects();
+			ac.removeAll();
+			assertEquals("Length is not zero", ac.length, 0);		
+		}
+		
+		[Test]
+		public function removeFirstObjects():void
+		{
+			addObjects();
+			ac.removeItemAt(0);
+			assertEquals("First element not correct", ac[0], players[1]);
+			assertEquals("Length is not six", ac.length, 6);
+			ac.removeItemAt(0);
+			assertEquals("Length is not five", ac.length, 5);
+			ac.removeItemAt(0);
+			assertEquals("Length is not four", ac.length, 4);
+			ac.removeItemAt(0);
+			assertEquals("Length is not three", ac.length, 3);
+			ac.removeItemAt(0);
+			assertEquals("Length is not two", ac.length, 2);
+			ac.removeItemAt(0);
+			assertEquals("Length is not one", ac.length, 1);
+			ac.removeItemAt(0);
+			assertEquals("Length is not zero", ac.length, 0);
+		}
+		
+		[Test]
+		public function removeLastNumbers():void
+		{
+			addObjects();
+			ac.removeItemAt(6);
+			assertEquals("First element not correct", ac[0], players[0]);
+			assertEquals("Length is not six", ac.length, 6);
+			ac.removeItemAt(0);
+			assertEquals("Length is not five", ac.length, 5);
+			ac.removeItemAt(0);
+			assertEquals("Length is not four", ac.length, 4);
+			ac.removeItemAt(0);
+			assertEquals("Length is not three", ac.length, 3);
+			ac.removeItemAt(0);
+			assertEquals("Length is not two", ac.length, 2);
+			ac.removeItemAt(0);
+			assertEquals("Length is not one", ac.length, 1);
+			ac.removeItemAt(0);
+			assertEquals("Length is not zero", ac.length, 0);
+		}
+		
+		[Test]
+		public function removeItemByIndex():void
+		{
+			addObjects();
+			ac.removeItemAt(ac.getItemIndex(players[0]));
+			assertEquals("First element not correct", ac[0], players[1]);
+			assertEquals("Length is not six", ac.length, 6);
+			ac.removeItemAt(ac.getItemIndex(players[2]));
+			assertEquals("First element not correct", ac[0], players[1]);
+			assertEquals("Second element not correct", ac[1], players[3]);
+			assertEquals("Length is not four", ac.length, 4);
+		}
+		
+		[Test]
+		public function outOfRange():void
+		{
+			addObjects();
+			try {
+				ac.removeItemAt(-1);
+			}
+			catch (error:Error)
+			{
+				assertTrue("Error not range error", error is RangeError);
+			}
+			assertEquals("Length is not seven", ac.length, 7);
+			try {
+				ac.removeItemAt(10);
+			}
+			catch (error:Error)
+			{
+				assertTrue("Error not range error", error is RangeError);
+			}
+			assertEquals("Length is not seven", ac.length, 7);
+		}
+		
+		[Test]
+		public function swapItemsTwoThenOne():void
+		{
+			addObjects();
+			
+			var item1:Object = ac.getItemAt(0);
+			var item2:Object = ac.getItemAt(1);
+			
+			ac.setItemAt(item2,0);
+			ac.setItemAt(item1,1);
+			
+			assertEquals("Length is not seven", ac.length, 7);
+			assertEquals("First element not correct", ac[0], players[1]);
+			assertEquals("Second element not correct", ac[1], players[0]);
+		}
+		
+		[Test]
+		public function swapItemsOneThenTwo():void
+		{
+			addObjects();
+
+			var item1:Object = ac.getItemAt(0);
+			var item2:Object = ac.getItemAt(1);
+			
+			ac.setItemAt(item1,1);
+			ac.setItemAt(item2,0);
+			
+			assertEquals("Length is not seven", ac.length, 7);
+			assertEquals("First element not correct", ac[0], players[1]);
+			assertEquals("Second element not correct", ac[1], players[0]);
+
+		}
+		
+	}
+}
\ No newline at end of file
diff --git a/frameworks/projects/framework/tests/mx/collections/AddRemoveStrings.as b/frameworks/projects/framework/tests/mx/collections/AddRemoveStrings.as
new file mode 100644
index 0000000..cc9145f
--- /dev/null
+++ b/frameworks/projects/framework/tests/mx/collections/AddRemoveStrings.as
@@ -0,0 +1,167 @@
+package mx.collections {
+	import mx.collections.ArrayCollection;
+	
+	import org.flexunit.asserts.*;
+
+	public class AddRemoveStrings
+	{	
+		protected var ac:ArrayCollection;
+		
+		[Before]
+		public function setUp():void
+		{
+			ac = new ArrayCollection();
+		}
+		
+		[After]
+		public function tearDown():void
+		{
+			ac = null;
+		}
+		
+		[Test]
+		public function empty():void
+		{
+			assertEquals(ac.length, 0);
+		}
+		
+		[Test]
+		public function addStrings():void
+		{
+			ac.addItem("A");
+			assertEquals("Length is not one", ac.length, 1);
+			assertEquals("First element not correct", ac[0], "A");
+			ac.addItem("B");
+			assertEquals("Length is not two", ac.length, 2);
+			assertEquals("Second element not correct", ac[1], "B");
+			ac.addItem("D");
+			assertEquals("Length is not three", ac.length, 3);
+			assertEquals("Second element not correct", ac[2], "D");
+			ac.addItem("C");
+			assertEquals("Length is not four", ac.length, 4);
+			assertEquals("Second element not correct", ac[3], "C");
+		}
+		
+		[Test]
+		public function addDuplicate():void
+		{
+			addStrings();
+			ac.addItem("B");
+			assertEquals("Length is not five", ac.length, 5);
+			assertEquals("First element not correct", ac[0], "A");
+			assertEquals("Second element not correct", ac[1], "B");
+			assertEquals("Second element not correct", ac[2], "D");
+			assertEquals("Second element not correct", ac[3], "C");
+			assertEquals("Second element not correct", ac[4], "B");
+		}
+		
+		[Test]
+		public function removeDuplicate():void
+		{
+			addStrings();
+			ac.addItem("B");
+			ac.removeItemAt(1);
+			assertEquals("Length is not four", ac.length, 4);
+			assertEquals("First element not correct", ac[0], "A");
+			assertEquals("Second element not correct", ac[1], "D");
+			assertEquals("Second element not correct", ac[2], "C");
+			assertEquals("Second element not correct", ac[3], "B");
+		}
+		
+		[Test]
+		public function removeAllStrings():void
+		{
+			addStrings();
+			ac.removeAll();
+			assertEquals("Length is not zero", ac.length, 0);		
+		}
+		
+		[Test]
+		public function removeFirstStrings():void
+		{
+			addStrings();
+			ac.removeItemAt(0);
+			assertEquals("First element not correct", ac[0], "B");
+			assertEquals("Length is not three", ac.length, 3);
+			ac.removeItemAt(0);
+			assertEquals("Length is not two", ac.length, 2);
+		}
+		
+		[Test]
+		public function removeLastStrings():void
+		{
+			addStrings();
+			ac.removeItemAt(1);
+			assertEquals("First element not correct", ac[0], "A");
+			assertEquals("Length is not three", ac.length, 3);
+			ac.removeItemAt(0);
+			assertEquals("Length is not two", ac.length, 2);
+		}
+		
+		[Test]
+		public function removeItemByIndex():void
+		{
+			addStrings();
+			ac.removeItemAt(ac.getItemIndex("B"));
+			assertEquals("First element not correct", ac[0], "A");
+			assertEquals("Length is not three", ac.length, 3);
+			ac.removeItemAt(ac.getItemIndex("D"));
+			assertEquals("Length is not two", ac.length, 2);
+		}
+		
+		[Test]
+		public function outOfRange():void
+		{
+			addStrings();
+			try {
+				ac.removeItemAt(-1);
+			}
+			catch (error:Error)
+			{
+				assertTrue("Error not range error", error is RangeError);
+			}
+			assertEquals("Length is not four", ac.length, 4);
+			try {
+				ac.removeItemAt(10);
+			}
+			catch (error:Error)
+			{
+				assertTrue("Error not range error", error is RangeError);
+			}
+			assertEquals("Length is not two", ac.length, 4);
+		}
+		
+		[Test]
+		public function swapItemsTwoThenOne():void
+		{
+			addStrings();
+			
+			var item1:String = ac.getItemAt(0) as String;
+			var item2:String = ac.getItemAt(1) as String;
+			
+			ac.setItemAt(item2, 0);
+			ac.setItemAt(item1, 1);
+			
+			assertEquals("Length is not four", ac.length, 4);
+			assertEquals("First element not correct", ac[0], "B");
+			assertEquals("Second element not correct", ac[1], "A");
+		}
+		
+		[Test]
+		public function swapItemsOneThenTwo():void
+		{
+			addStrings();
+
+			var item1:String = ac.getItemAt(0) as String;
+			var item2:String = ac.getItemAt(1) as String;
+			
+			ac.setItemAt(item1, 1);
+			ac.setItemAt(item2, 0);
+			
+			assertEquals("Length is not two", ac.length, 2);
+			assertEquals("First element not correct", ac[0], "B");
+			assertEquals("Second element not correct", ac[1], "A");
+		}
+		
+	}
+}
\ No newline at end of file
diff --git a/frameworks/projects/framework/tests/mx/collections/FilerAndSortNumbers.as b/frameworks/projects/framework/tests/mx/collections/FilerAndSortNumbers.as
new file mode 100644
index 0000000..1741321
--- /dev/null
+++ b/frameworks/projects/framework/tests/mx/collections/FilerAndSortNumbers.as
@@ -0,0 +1,100 @@
+package mx.collections {
+	import mx.collections.ArrayCollection;
+	import mx.collections.Sort;
+	import mx.collections.SortField;
+
+	public class FilerAndSortNumbers
+	{		
+		import org.flexunit.asserts.*;
+		
+		protected var ac:ArrayCollection;
+		
+		[Before]
+		public function setUp():void
+		{
+			ac = new ArrayCollection();
+		}
+		
+		[After]
+		public function tearDown():void
+		{
+			ac = null;
+		}
+		
+		
+		protected function addNumbers():void
+		{
+			ac.addItem(6);
+			ac.addItem(2);
+			ac.addItem(3);
+			ac.addItem(1);
+			ac.addItem(5);
+			ac.addItem(4);
+		}
+		
+		protected function even(object:Object):Boolean
+		{
+			return Number(object) % 2 == 0;
+		}
+		
+		protected function odd(object:Object):Boolean
+		{
+			return Number(object) % 2 == 1;
+		}
+		
+		[Test]
+		public function filterAndSortCombinations():void
+		{
+			addNumbers();
+			ac.filterFunction = even;
+			ac.sort = new Sort();
+			ac.refresh();
+			
+			assertEquals("Length is not three", ac.length, 3);
+			assertEquals("First element not correct", ac[0], 2);
+			assertEquals("Second element not correct", ac[1], 4);
+			assertEquals("Third element not correct", ac[2], 6);
+			
+			ac.filterFunction = odd;
+			ac.refresh();
+			
+			assertEquals("Length is not three", ac.length, 3);
+			assertEquals("First element not correct", ac[0], 1);
+			assertEquals("Second element not correct", ac[1], 3);
+			assertEquals("Third element not correct", ac[2], 5);
+			
+			ac.sort = new Sort();			
+			ac.sort.fields = [new SortField(null, false, true, true)];
+			ac.refresh();
+			
+			assertEquals("Length is not three", ac.length, 3);
+			assertEquals("First element not correct", ac[0], 5);
+			assertEquals("Second element not correct", ac[1], 3);
+			assertEquals("Third element not correct", ac[2], 1);
+			
+			ac.filterFunction = null;
+			ac.refresh();
+			
+			assertEquals("Length is not six", ac.length, 6);
+			assertEquals("First element not correct", ac[0], 6);
+			assertEquals("Second element not correct", ac[1], 5);
+			assertEquals("Third element not correct", ac[2], 4);
+			assertEquals("Fourth element not correct", ac[3], 3);
+			assertEquals("Fith element not correct", ac[4], 2);
+			assertEquals("Six element not correct", ac[5], 1);
+			
+			ac.sort = null;
+			ac.refresh();
+			
+			assertEquals("Length is not six", ac.length, 6);
+			assertEquals("First element not correct", ac[0], 6);
+			assertEquals("Second element not correct", ac[1], 2);
+			assertEquals("Third element not correct", ac[2], 3);
+			assertEquals("Fourth element not correct", ac[3], 1);
+			assertEquals("Fith element not correct", ac[4], 5);
+			assertEquals("Six element not correct", ac[5], 4);
+		}	
+		
+		
+	}
+}
\ No newline at end of file
diff --git a/frameworks/projects/framework/tests/mx/collections/FilerAndSortStrings.as b/frameworks/projects/framework/tests/mx/collections/FilerAndSortStrings.as
new file mode 100644
index 0000000..0d0142a
--- /dev/null
+++ b/frameworks/projects/framework/tests/mx/collections/FilerAndSortStrings.as
@@ -0,0 +1,100 @@
+package mx.collections {
+	import mx.collections.ArrayCollection;
+	import mx.collections.Sort;
+	import mx.collections.SortField;
+
+	public class FilerAndSortStrings
+	{		
+		import org.flexunit.asserts.*;
+		
+		protected var ac:ArrayCollection;
+		
+		[Before]
+		public function setUp():void
+		{
+			ac = new ArrayCollection();
+		}
+		
+		[After]
+		public function tearDown():void
+		{
+			ac = null;
+		}
+		
+		
+		protected function addNumbers():void
+		{
+			ac.addItem(6);
+			ac.addItem(2);
+			ac.addItem(3);
+			ac.addItem(1);
+			ac.addItem(5);
+			ac.addItem(4);
+		}
+		
+		protected function even(object:Object):Boolean
+		{
+			return Number(object) % 2 == 0;
+		}
+		
+		protected function odd(object:Object):Boolean
+		{
+			return Number(object) % 2 == 1;
+		}
+		
+		[Test]
+		public function filterAndSortCombinations():void
+		{
+			addNumbers();
+			ac.filterFunction = even;
+			ac.sort = new Sort();
+			ac.refresh();
+			
+			assertEquals("Length is not three", ac.length, 3);
+			assertEquals("First element not correct", ac[0], 2);
+			assertEquals("Second element not correct", ac[1], 4);
+			assertEquals("Third element not correct", ac[2], 6);
+			
+			ac.filterFunction = odd;
+			ac.refresh();
+			
+			assertEquals("Length is not three", ac.length, 3);
+			assertEquals("First element not correct", ac[0], 1);
+			assertEquals("Second element not correct", ac[1], 3);
+			assertEquals("Third element not correct", ac[2], 5);
+			
+			ac.sort = new Sort();			
+			ac.sort.fields = [new SortField(null, false, true, true)];
+			ac.refresh();
+			
+			assertEquals("Length is not three", ac.length, 3);
+			assertEquals("First element not correct", ac[0], 5);
+			assertEquals("Second element not correct", ac[1], 3);
+			assertEquals("Third element not correct", ac[2], 1);
+			
+			ac.filterFunction = null;
+			ac.refresh();
+			
+			assertEquals("Length is not six", ac.length, 6);
+			assertEquals("First element not correct", ac[0], 6);
+			assertEquals("Second element not correct", ac[1], 5);
+			assertEquals("Third element not correct", ac[2], 4);
+			assertEquals("Fourth element not correct", ac[3], 3);
+			assertEquals("Fith element not correct", ac[4], 2);
+			assertEquals("Six element not correct", ac[5], 1);
+			
+			ac.sort = null;
+			ac.refresh();
+			
+			assertEquals("Length is not six", ac.length, 6);
+			assertEquals("First element not correct", ac[0], 6);
+			assertEquals("Second element not correct", ac[1], 2);
+			assertEquals("Third element not correct", ac[2], 3);
+			assertEquals("Fourth element not correct", ac[3], 1);
+			assertEquals("Fith element not correct", ac[4], 5);
+			assertEquals("Six element not correct", ac[5], 4);
+		}	
+		
+		
+	}
+}
\ No newline at end of file
diff --git a/frameworks/projects/framework/tests/mx/collections/FilterNumbers.as b/frameworks/projects/framework/tests/mx/collections/FilterNumbers.as
new file mode 100644
index 0000000..34e03f2
--- /dev/null
+++ b/frameworks/projects/framework/tests/mx/collections/FilterNumbers.as
@@ -0,0 +1,298 @@
+package mx.collections {
+	import mx.collections.ArrayCollection;
+	import mx.collections.Sort;
+	import mx.collections.SortField;
+	
+	public class FilterNumbers
+	{	
+		import org.flexunit.asserts.*;
+		
+		protected var ac:ArrayCollection;
+		
+		[Before]
+		public function setUp():void
+		{
+			ac = new ArrayCollection();
+		}
+		
+		[After]
+		public function tearDown():void
+		{
+			ac = null;
+		}
+		
+		protected function addNumbers():void
+		{
+			ac.addItem(1);
+			ac.addItem(2);
+		}
+		
+		protected function allIn(object:Object):Boolean
+		{
+			return true;
+		}
+		
+		protected function allOut(object:Object):Boolean
+		{
+			return false;
+		}
+		
+		protected function isOne(object:Object):Boolean
+		{
+			return object == 1;
+		}
+		
+		[Test]
+		public function nullFilter():void
+		{
+			addNumbers();
+			ac.filterFunction = null;
+			ac.refresh();
+			
+			assertEquals("Length is not two", ac.length, 2);
+			assertEquals("First element not correct", ac[0], 1);
+			assertEquals("Second element not correct", ac[1], 2);
+		}	
+		
+		[Test]
+		public function trueFilter():void
+		{
+			addNumbers();
+			ac.filterFunction = allIn; 
+			ac.refresh();
+			
+			assertEquals("Length is not two", ac.length, 2);
+			assertEquals("First element not correct", ac[0], 1);
+			assertEquals("Second element not correct", ac[1], 2);
+		}
+		
+		[Test]
+		public function falseFilter():void
+		{
+			addNumbers();
+			ac.filterFunction = allOut; 
+			ac.refresh();
+			
+			assertEquals("Length is not two", ac.length, 0);
+		}
+		
+		
+		[Test]
+		public function filterNoRefresh():void
+		{
+			addNumbers();
+			ac.filterFunction = allOut;
+			
+			// Filter should not take effect
+			assertEquals("Length is not two", ac.length, 2);
+			assertEquals("First element not correct", ac[0], 1);
+			assertEquals("Second element not correct", ac[1], 2);
+		}
+		
+		[Test]
+		public function nullFilterNoRefresh():void
+		{
+			addNumbers();
+			ac.filterFunction = null;
+			
+			// Filter should not take effect
+			assertEquals("Length is not two", ac.length, 2);
+			assertEquals("First element not correct", ac[0], 1);
+			assertEquals("Second element not correct", ac[1], 2);
+		}
+		
+		[Test]
+		public function filterDoubleRefresh():void
+		{
+			addNumbers();
+			ac.filterFunction = allOut;
+			ac.refresh();
+			
+			assertEquals("Length is not zero", ac.length, 0);
+			
+			ac.filterFunction = null;
+			ac.refresh();
+			
+			// Filter should not take effect
+			assertEquals("Length is not two", ac.length, 2);
+			assertEquals("First element not correct", ac[0], 1);
+			assertEquals("Second element not correct", ac[1], 2);
+		}
+		
+		// RTEs in Apache Flex 4.9.1
+		[Test]
+		public function filterAddAfterNullNoRefresh():void
+		{
+			addNumbers();
+			
+			ac.filterFunction = allOut;
+			ac.refresh();
+			
+			assertEquals("Length is not zero", ac.length, 0);
+			
+			ac.filterFunction = null;
+			addNumbers();
+			
+			// Filter should be in effect and first 2 items sorted
+			// item added after are not filtered until refresh called
+			assertEquals("Length is not two", ac.length, 2);
+			assertEquals("First element not correct", ac[0], 1);
+			assertEquals("Second element not correct", ac[1], 2);
+			
+			ac.refresh();
+			assertEquals("Length is not four", ac.length, 4);
+			assertEquals("First element not correct", ac[0], 1);
+			assertEquals("Second element not correct", ac[1], 2);
+			assertEquals("First element not correct", ac[2], 1);
+			assertEquals("Second element not correct", ac[3], 2);
+		}
+		
+		[Test]
+		public function filterRemoveAfterNullNoRefresh():void
+		{
+			addNumbers();
+			
+			ac.filterFunction = allOut;
+			ac.refresh();
+			ac.filterFunction = null;
+			
+			assertEquals("Length is not zero", ac.length, 0);
+			
+			try {
+				ac.removeItemAt(0);
+			}
+			catch (error:Error)
+			{
+				assertTrue("Error not range error", error is RangeError);
+			}
+			
+			assertEquals("Length is not zero", ac.length, 0);
+			
+			ac.refresh();
+			assertEquals("Length is not two", ac.length, 2);
+		}
+		
+		[Test]
+		public function filterIncludingDuplicates():void
+		{
+			addNumbers();
+			addNumbers();
+			
+			ac.filterFunction = isOne;
+			ac.refresh();
+			
+			assertEquals("Length is not two", ac.length, 2);
+			
+			assertEquals("First element not correct", ac[0], 1);
+			assertEquals("Second element not correct", ac[1], 1);	
+		}
+		
+		// Fails in Apache Flex 4.9.1
+		[Test]
+		public function swapItemsTwoThenOne():void
+		{
+			addNumbers();
+			ac.filterFunction = allIn; 
+			ac.refresh();
+			
+			var item1:Number = ac.getItemAt(0) as Number;
+			var item2:Number = ac.getItemAt(1) as Number;
+			
+			ac.setItemAt(item2,0);
+			ac.setItemAt(item1,1);
+			
+			assertEquals("Length is not two", ac.length, 2);
+			assertEquals("First element not correct", ac[0], 2);
+			assertEquals("Second element not correct", ac[1], 1);
+		}
+		
+		[Test]
+		public function swapItemsOneThenTwo():void
+		{
+			addNumbers();
+			ac.filterFunction = allIn; 
+			ac.refresh();
+			
+			var item1:Number = ac.getItemAt(0) as Number;
+			var item2:Number = ac.getItemAt(1) as Number;
+			
+			ac.setItemAt(item1,1);
+			ac.setItemAt(item2,0);
+			
+			assertEquals("Length is not two", ac.length, 2);
+			assertEquals("First element not correct", ac[0], 2);
+			assertEquals("Second element not correct", ac[1], 1);
+		}
+		
+		[Test]
+		public function removeAllAfterFiltered():void
+		{
+			addNumbers();
+			ac.filterFunction = allOut; 
+			ac.refresh();
+			
+			assertEquals("Length is not two", ac.length, 0);
+			
+			ac.removeAll();
+			
+			assertEquals("Length is not two", ac.length, 0);
+			
+			ac.filterFunction = null; 
+			ac.refresh();
+			
+			assertEquals("Length is not two", ac.length, 2);
+			assertEquals("First element not correct", ac[0], 1);
+			assertEquals("Second element not correct", ac[1], 2);
+		}
+		
+		[Test]
+		public function removeFilteredItem():void
+		{
+			addNumbers();
+			ac.filterFunction = isOne; 
+			ac.refresh();
+			
+			assertEquals("Length is not one", ac.length, 1);
+			
+			ac.removeItemAt(ac.getItemIndex(1));
+			
+			assertEquals("Length is not zero", ac.length, 0);
+			
+			ac.filterFunction = null; 
+			ac.refresh();
+			
+			assertEquals("Length is not two", ac.length, 1);
+			assertEquals("First element not correct", ac[0], 2);
+		}
+		
+		[Test]
+		public function removeNonFilteredItem():void
+		{
+			addNumbers();
+			ac.filterFunction = isOne; 
+			ac.refresh();
+			
+			assertEquals("Length is not one", ac.length, 1);
+			
+			try {
+				// not removed as filter hids it - perhaps it should be removed?
+				ac.removeItemAt(ac.getItemIndex(2));	
+			}
+			catch (error:Error)
+			{
+				assertTrue("Error not range error", error is RangeError);
+			}
+			
+			assertEquals("Length is not one", ac.length, 1);
+			
+			ac.filterFunction = null; 
+			ac.refresh();
+			
+			assertEquals("Length is not two", ac.length, 2);
+			assertEquals("First element not correct", ac[0], 1);
+			assertEquals("First element not correct", ac[1], 2);
+		}
+		
+		
+	}
+}
\ No newline at end of file
diff --git a/frameworks/projects/framework/tests/mx/collections/FilterStrings.as b/frameworks/projects/framework/tests/mx/collections/FilterStrings.as
new file mode 100644
index 0000000..a3be478
--- /dev/null
+++ b/frameworks/projects/framework/tests/mx/collections/FilterStrings.as
@@ -0,0 +1,324 @@
+package mx.collections {
+	import mx.collections.ArrayCollection;
+	import mx.collections.Sort;
+	import mx.collections.SortField;
+	
+	public class FilterStrings
+	{	
+		import org.flexunit.asserts.*;
+		
+		protected var ac:ArrayCollection;
+		
+		[Before]
+		public function setUp():void
+		{
+			ac = new ArrayCollection();
+		}
+		
+		[After]
+		public function tearDown():void
+		{
+			ac = null;
+		}
+		
+		protected function addStrings():void
+		{
+			ac.addItem("A");
+			ac.addItem("B");
+			ac.addItem("D");
+			ac.addItem("C");
+		}
+		
+		protected function allIn(object:Object):Boolean
+		{
+			return true;
+		}
+		
+		protected function allOut(object:Object):Boolean
+		{
+			return false;
+		}
+		
+		protected function isA(object:Object):Boolean
+		{
+			return object == "A";
+		}
+		
+		[Test]
+		public function nullFilter():void
+		{
+			addStrings();
+			ac.filterFunction = null;
+			ac.refresh();
+			
+			assertEquals("Length is not four", ac.length, 4);
+			assertEquals("First element not correct", ac[0], "A");
+			assertEquals("Second element not correct", ac[1], "B");
+			assertEquals("Third element not correct", ac[2], "D");
+			assertEquals("Four element not correct", ac[3], "C");
+		}	
+		
+		[Test]
+		public function trueFilter():void
+		{
+			addStrings();
+			ac.filterFunction = allIn; 
+			ac.refresh();
+			
+			assertEquals("Length is not four", ac.length, 4);
+			assertEquals("First element not correct", ac[0], "A");
+			assertEquals("Second element not correct", ac[1], "B");
+			assertEquals("Third element not correct", ac[2], "D");
+			assertEquals("Four element not correct", ac[3], "C");
+		}
+		
+		[Test]
+		public function falseFilter():void
+		{
+			addStrings();
+			ac.filterFunction = allOut; 
+			ac.refresh();
+			
+			assertEquals("Length is not zero", ac.length, 0);
+		}
+		
+		
+		[Test]
+		public function filterNoRefresh():void
+		{
+			addStrings();
+			ac.filterFunction = allOut;
+			
+			// Filter should not take effect
+			assertEquals("Length is not four", ac.length, 4);
+			assertEquals("First element not correct", ac[0], "A");
+			assertEquals("Second element not correct", ac[1], "B");
+			assertEquals("Third element not correct", ac[2], "D");
+			assertEquals("Four element not correct", ac[3], "C");
+		}
+		
+		[Test]
+		public function nullFilterNoRefresh():void
+		{
+			addStrings();
+			ac.filterFunction = null;
+			
+			// Filter should not take effect
+			assertEquals("Length is not four", ac.length, 4);
+			assertEquals("First element not correct", ac[0], "A");
+			assertEquals("Second element not correct", ac[1], "B");
+			assertEquals("Third element not correct", ac[2], "D");
+			assertEquals("Four element not correct", ac[3], "C");
+		}
+		
+		[Test]
+		public function filterDoubleRefresh():void
+		{
+			addStrings();
+			ac.filterFunction = allOut;
+			ac.refresh();
+			
+			assertEquals("Length is not zero", ac.length, 0);
+			
+			ac.filterFunction = null;
+			ac.refresh();
+			
+			// Filter should not take effect
+			assertEquals("Length is not four", ac.length, 4);
+			assertEquals("First element not correct", ac[0], "A");
+			assertEquals("Second element not correct", ac[1], "B");
+			assertEquals("Third element not correct", ac[2], "D");
+			assertEquals("Four element not correct", ac[3], "C");
+		}
+		
+		// RTEs in Apache Flex 4.9.1
+		[Test]
+		public function filterAddAfterNullNoRefresh():void
+		{
+			addStrings();
+			
+			ac.filterFunction = allOut;
+			ac.refresh();
+			
+			assertEquals("Length is not zero", ac.length, 0);
+			
+			ac.filterFunction = null;
+			addStrings();
+			
+			// Filter should be in effect and first 2 items sorted
+			// item added after are not filtered until refresh called
+			assertEquals("Length is not four", ac.length, 4);
+			assertEquals("First element not correct", ac[0], "A");
+			assertEquals("Second element not correct", ac[1], "B");
+			assertEquals("Third element not correct", ac[2], "D");
+			assertEquals("Four element not correct", ac[3], "C");
+			
+			ac.refresh();
+			assertEquals("Length is not eight", ac.length, 8);
+			assertEquals("First element not correct", ac[0], "A");
+			assertEquals("Second element not correct", ac[1], "B");
+			assertEquals("Third element not correct", ac[2], "D");
+			assertEquals("Four element not correct", ac[3], "C");
+			assertEquals("First element not correct", ac[4], "A");
+			assertEquals("Second element not correct", ac[5], "B");
+			assertEquals("Third element not correct", ac[6], "D");
+			assertEquals("Four element not correct", ac[7], "C");
+		}
+		
+		[Test]
+		public function filterRemoveAfterNullNoRefresh():void
+		{
+			addStrings();
+			
+			ac.filterFunction = allOut;
+			ac.refresh();
+			ac.filterFunction = null;
+			
+			assertEquals("Length is not zero", ac.length, 0);
+			
+			try {
+				ac.removeItemAt(0);
+			}
+			catch (error:Error)
+			{
+				assertTrue("Error not range error", error is RangeError);
+			}
+			
+			assertEquals("Length is not zero", ac.length, 0);
+			
+			ac.refresh();
+			assertEquals("Length is not four", ac.length, 4);
+		}
+		
+		[Test]
+		public function filterIncludingDuplicates():void
+		{
+			addStrings();
+			addStrings();
+			
+			ac.filterFunction = isA;
+			ac.refresh();
+			
+			assertEquals("Length is not two", ac.length, 2);
+			
+			assertEquals("First element not correct", ac[0], "A");
+			assertEquals("Second element not correct", ac[1], "A");	
+		}
+		
+		// Fails in Apache Flex 4.9.1
+		[Test]
+		public function swapItemsTwoThenOne():void
+		{
+			addStrings();
+			ac.filterFunction = allIn; 
+			ac.refresh();
+			
+			var item1:String = ac.getItemAt(0) as String;
+			var item2:String = ac.getItemAt(1) as String;
+			
+			ac.setItemAt(item2,0);
+			ac.setItemAt(item1,1);
+			
+			assertEquals("Length is not four", ac.length, 4);
+			assertEquals("First element not correct", ac[0], "B");
+			assertEquals("Second element not correct", ac[1], "A");
+			assertEquals("Third element not correct", ac[2], "D");
+			assertEquals("Four element not correct", ac[3], "C");
+		}
+		
+		[Test]
+		public function swapItemsOneThenTwo():void
+		{
+			addStrings();
+			ac.filterFunction = allIn; 
+			ac.refresh();
+			
+			var item1:String = ac.getItemAt(0) as String;
+			var item2:String = ac.getItemAt(1) as String;
+			
+			ac.setItemAt(item1,1);
+			ac.setItemAt(item2,0);
+			
+			assertEquals("Length is not four", ac.length, 4);
+			assertEquals("First element not correct", ac[0], "B");
+			assertEquals("Second element not correct", ac[1], "A");
+			assertEquals("Third element not correct", ac[2], "D");
+			assertEquals("Four element not correct", ac[3], "C");
+		}
+		
+		[Test]
+		public function removeAllAfterFiltered():void
+		{
+			addStrings();
+			ac.filterFunction = allOut; 
+			ac.refresh();
+			
+			assertEquals("Length is not two", ac.length, 0);
+			
+			ac.removeAll();
+			
+			assertEquals("Length is not two", ac.length, 0);
+			
+			ac.filterFunction = null; 
+			ac.refresh();
+			
+			assertEquals("Length is not four", ac.length, 4);
+			assertEquals("First element not correct", ac[0], "A");
+			assertEquals("Second element not correct", ac[1], "B");
+			assertEquals("Third element not correct", ac[2], "D");
+			assertEquals("Four element not correct", ac[3], "C");
+		}
+		
+		[Test]
+		public function removeFilteredItem():void
+		{
+			addStrings();
+			ac.filterFunction = isA; 
+			ac.refresh();
+			
+			assertEquals("Length is not one", ac.length, 1);
+			
+			ac.removeItemAt(ac.getItemIndex("A"));
+			
+			assertEquals("Length is not zero", ac.length, 0);
+			
+			ac.filterFunction = null; 
+			ac.refresh();
+			
+			assertEquals("Length is not three", ac.length, 3);
+			assertEquals("First element not correct", ac[0], "B");
+		}
+		
+		[Test]
+		public function removeNonFilteredItem():void
+		{
+			addStrings();
+			ac.filterFunction = isA; 
+			ac.refresh();
+			
+			assertEquals("Length is not one", ac.length, 1);
+			
+			try {
+				// not removed as filter hids it - perhaps it should be removed?
+				ac.removeItemAt(ac.getItemIndex("B"));	
+			}
+			catch (error:Error)
+			{
+				assertTrue("Error not range error", error is RangeError);
+			}
+			
+			assertEquals("Length is not one", ac.length, 1);
+			
+			ac.filterFunction = null; 
+			ac.refresh();
+			
+			assertEquals("Length is not four", ac.length, 4);
+			assertEquals("First element not correct", ac[0], "A");
+			assertEquals("Second element not correct", ac[1], "B");
+			assertEquals("Third element not correct", ac[2], "D");
+			assertEquals("Four element not correct", ac[3], "C");
+		}
+		
+		
+	}
+}
\ No newline at end of file
diff --git a/frameworks/projects/framework/tests/mx/collections/SortNumbers.as b/frameworks/projects/framework/tests/mx/collections/SortNumbers.as
new file mode 100644
index 0000000..ccaf6aa
--- /dev/null
+++ b/frameworks/projects/framework/tests/mx/collections/SortNumbers.as
@@ -0,0 +1,198 @@
+package mx.collections {
+	import mx.collections.ArrayCollection;
+	import mx.collections.Sort;
+	import mx.collections.SortField;
+
+	public class SortNumbers
+	{	
+		import org.flexunit.asserts.*;
+		
+		protected var ac:ArrayCollection;
+		
+		[Before]
+		public function setUp():void
+		{
+			ac = new ArrayCollection();
+		}
+		
+		[After]
+		public function tearDown():void
+		{
+			ac = null;
+		}
+		
+		protected function addNumbers():void
+		{
+			ac.addItem(1);
+			ac.addItem(2);
+		}
+		
+		[Test]
+		public function nullSort():void
+		{
+			addNumbers();
+			ac.sort = null;
+			ac.refresh();
+			
+			assertEquals("Length is not two", ac.length, 2);
+			assertEquals("First element not correct", ac[0], 1);
+			assertEquals("Second element not correct", ac[1], 2);
+		}	
+		
+		[Test]
+		public function emptySort():void
+		{
+			addNumbers();
+			ac.sort = new Sort();
+			ac.refresh();
+			
+			assertEquals("Length is not two", ac.length, 2);
+			assertEquals("First element not correct", ac[0], 1);
+			assertEquals("Second element not correct", ac[1], 2);
+		}
+		
+		[Test]
+		public function reverseSort():void
+		{
+			var sort:Sort = new Sort();			
+			sort.fields = [new SortField(null, false, true, true)];
+			addNumbers();
+			ac.sort = sort;
+			ac.refresh();
+			
+			assertEquals("Length is not two", ac.length, 2);
+			assertEquals("First element not correct", ac[0], 2);
+			assertEquals("Second element not correct", ac[1], 1);
+		}
+		
+		[Test]
+		public function sortNoRefresh():void
+		{
+			var sort:Sort = new Sort();			
+			sort.fields = [new SortField(null, false, true, true)];
+			addNumbers();
+			ac.sort = sort;
+			
+			// Short should not take effect
+			assertEquals("Length is not two", ac.length, 2);
+			assertEquals("First element not correct", ac[0], 1);
+			assertEquals("Second element not correct", ac[1], 2);
+		}
+		
+		[Test]
+		public function nullSortNoRefresh():void
+		{
+			var sort:Sort = new Sort();			
+			sort.fields = [new SortField(null, false, true, true)];
+			addNumbers();
+			ac.sort = sort;
+			ac.refresh();
+			ac.sort = null;
+			
+			// Sort should be in effect
+			assertEquals("Length is not two", ac.length, 2);
+			assertEquals("First element not correct", ac[0], 2);
+			assertEquals("Second element not correct", ac[1], 1);
+			
+			ac.refresh();
+			
+			// and back to original
+			assertEquals("Length is not two", ac.length, 2);
+			assertEquals("First element not correct", ac[0], 1);
+			assertEquals("Second element not correct", ac[1], 2);
+		}
+		
+		[Test]
+		public function sortDoubleRefresh():void
+		{
+			var sort:Sort = new Sort();			
+			sort.fields = [new SortField(null, false, true, true)];
+			addNumbers();
+			ac.sort = sort;
+			ac.refresh();
+			ac.sort = null;
+			ac.refresh();
+			
+			// Sort should not be in effect
+			assertEquals("Length is not two", ac.length, 2);
+			assertEquals("First element not correct", ac[0], 1);
+			assertEquals("Second element not correct", ac[1], 2);
+		}
+		
+		// RTEs in APache flex 4.9.1
+		[Test]
+		public function sortAddAfterNullNoRefresh():void
+		{
+			addNumbers();
+			
+			var sort:Sort = new Sort();			
+			sort.fields = [new SortField(null, false, true, true)];
+			ac.sort = sort;
+			ac.refresh();
+			ac.sort = null;
+			addNumbers();
+			
+			// Sort should be in effect and first 2 items sorted
+			// item added after are not sorted
+			assertEquals("Length is not four", ac.length, 4);
+			assertEquals("First element not correct", ac[0], 2);
+			assertEquals("Second element not correct", ac[1], 1);
+			assertEquals("Third element not correct", ac[2], 1);
+			assertEquals("Fourth element not correct", ac[3], 2);
+			
+			ac.refresh();
+			
+			// and back to being unsorted
+			assertEquals("Length is not four", ac.length, 4);
+			assertEquals("First element not correct", ac[0], 1);
+			assertEquals("Second element not correct", ac[1], 2);
+			assertEquals("Third element not correct", ac[2], 1);
+			assertEquals("Fourth element not correct", ac[3], 2);
+		}
+		
+		// RTEs in Apache Flex 4.9.1
+		[Test]
+		public function sortRemoveAfterNullNoRefresh():void
+		{
+			addNumbers();
+			
+			var sort:Sort = new Sort();			
+			sort.fields = [new SortField(null, false, true, true)];
+			ac.sort = sort;
+			ac.refresh();
+			ac.sort = null;
+			
+			assertEquals("Length is not two", ac.length, 2);
+			
+			ac.removeItemAt(0); // still sorted so 2 is removed leaving 1
+			assertEquals("Length is not one", ac.length, 1);
+			assertEquals("First element not correct", ac[0], 1);
+			
+			ac.refresh();
+			
+			// still the same
+			assertEquals("Length is not one", ac.length, 1);
+			assertEquals("First element not correct", ac[0], 1);
+		}
+		
+		[Test]
+		public function sortIncludingDuplicates():void
+		{
+			addNumbers();
+			addNumbers();
+			
+			var sort:Sort = new Sort();			
+			sort.fields = [new SortField(null, false, true, true)];
+			ac.sort = sort;
+			ac.refresh();
+			
+			assertEquals("Length is not four", ac.length, 4);
+			
+			assertEquals("First element not correct", ac[0], 2);
+			assertEquals("Second element not correct", ac[1], 2);
+			assertEquals("Third element not correct", ac[2], 1);
+			assertEquals("Fourth element not correct", ac[3], 1);		
+		}
+		
+	}
+}
\ No newline at end of file
diff --git a/frameworks/projects/framework/tests/mx/collections/SortStrings.as b/frameworks/projects/framework/tests/mx/collections/SortStrings.as
new file mode 100644
index 0000000..f942286
--- /dev/null
+++ b/frameworks/projects/framework/tests/mx/collections/SortStrings.as
@@ -0,0 +1,240 @@
+package mx.collections {
+	import mx.collections.ArrayCollection;
+	import mx.collections.Sort;
+	import mx.collections.SortField;
+
+	public class SortStrings
+	{	
+		import org.flexunit.asserts.*;
+		
+		protected var ac:ArrayCollection;
+		
+		[Before]
+		public function setUp():void
+		{
+			ac = new ArrayCollection();
+		}
+		
+		[After]
+		public function tearDown():void
+		{
+			ac = null;
+		}
+		
+		protected function addStrings():void
+		{
+			ac.addItem("A");
+			ac.addItem("B");
+			ac.addItem("D");
+			ac.addItem("C");
+		}
+		
+		[Test]
+		public function nullSort():void
+		{
+			addStrings();
+			ac.sort = null;
+			ac.refresh();
+			
+			assertEquals("Length is not four", ac.length, 4);
+			assertEquals("First element not correct", ac[0], "A");
+			assertEquals("Second element not correct", ac[1], "B");
+			assertEquals("First element not correct", ac[2], "D");
+			assertEquals("Second element not correct", ac[3], "C");
+		}	
+		
+		[Test]
+		public function emptySort():void
+		{
+			addStrings();
+			ac.sort = new Sort();
+			ac.refresh();
+			
+			assertEquals("Length is not four", ac.length, 4);
+			assertEquals("First element not correct", ac[0], "A");
+			assertEquals("Second element not correct", ac[1], "B");
+			assertEquals("First element not correct", ac[2], "C");
+			assertEquals("Second element not correct", ac[3], "D");
+		}
+		
+		[Test]
+		public function reverseSort():void
+		{
+			var sort:Sort = new Sort();			
+			sort.fields = [new SortField(null, false, true)];
+			addStrings();
+			ac.sort = sort;
+			ac.refresh();
+			
+			assertEquals("Length is not four", ac.length, 4);
+			assertEquals("First element not correct", ac[0], "D");
+			assertEquals("Second element not correct", ac[1], "C");
+			assertEquals("First element not correct", ac[2], "B");
+			assertEquals("Second element not correct", ac[3], "A");
+		}
+		
+		[Test]
+		public function forwardSort():void
+		{
+			var sort:Sort = new Sort();			
+			sort.fields = [new SortField()];
+			addStrings();
+			ac.sort = sort;
+			ac.refresh();
+			
+			assertEquals("Length is not four", ac.length, 4);
+			assertEquals("First element not correct", ac[0], "A");
+			assertEquals("Second element not correct", ac[1], "B");
+			assertEquals("First element not correct", ac[2], "C");
+			assertEquals("Second element not correct", ac[3], "D");
+		}
+		
+		[Test]
+		public function sortNoRefresh():void
+		{
+			var sort:Sort = new Sort();			
+			sort.fields = [new SortField()];
+			addStrings();
+			ac.sort = sort;
+			
+			// Short should not take effect
+			assertEquals("Length is not four", ac.length, 4);
+			assertEquals("First element not correct", ac[0], "A");
+			assertEquals("Second element not correct", ac[1], "B");
+			assertEquals("First element not correct", ac[2], "D");
+			assertEquals("Second element not correct", ac[3], "C");
+		}
+		
+		[Test]
+		public function nullSortNoRefresh():void
+		{
+			var sort:Sort = new Sort();			
+			sort.fields = [new SortField()];
+			addStrings();
+			ac.sort = sort;
+			ac.refresh();
+			ac.sort = null;
+			
+			// Sort should be in effect
+			assertEquals("Length is not four", ac.length, 4);
+			assertEquals("First element not correct", ac[0], "A");
+			assertEquals("Second element not correct", ac[1], "B");
+			assertEquals("First element not correct", ac[2], "C");
+			assertEquals("Second element not correct", ac[3], "D");
+			
+			ac.refresh();
+			
+			// and back to original
+			assertEquals("Length is not four", ac.length, 4);
+			assertEquals("First element not correct", ac[0], "A");
+			assertEquals("Second element not correct", ac[1], "B");
+			assertEquals("First element not correct", ac[2], "D");
+			assertEquals("Second element not correct", ac[3], "C");
+		}
+		
+		[Test]
+		public function sortDoubleRefresh():void
+		{
+			var sort:Sort = new Sort();			
+			sort.fields = [new SortField()];
+			addStrings();
+			ac.sort = sort;
+			ac.refresh();
+			ac.sort = null;
+			ac.refresh();
+			
+			// Sort should not be in effect
+			assertEquals("Length is not four", ac.length, 4);
+			assertEquals("First element not correct", ac[0], "A");
+			assertEquals("Second element not correct", ac[1], "B");
+			assertEquals("First element not correct", ac[2], "D");
+			assertEquals("Second element not correct", ac[3], "C");
+		}
+		
+		// RTEs in APache flex 4.9.1
+		[Test]
+		public function sortAddAfterNullNoRefresh():void
+		{
+			addStrings();
+			
+			var sort:Sort = new Sort();			
+			sort.fields = [new SortField()];
+			ac.sort = sort;
+			ac.refresh();
+			ac.sort = null;
+			addStrings();
+			
+			// Sort should be in effect and first 4 items sorted
+			// item added after are not sorted
+			assertEquals("Length is not eight", ac.length, 8);
+			assertEquals("First element not correct", ac[0], "A");
+			assertEquals("Second element not correct", ac[1], "B");
+			assertEquals("First element not correct", ac[2], "C");
+			assertEquals("Second element not correct", ac[3], "D");
+			assertEquals("First element not correct", ac[4], "A");
+			assertEquals("Second element not correct", ac[5], "B");
+			assertEquals("First element not correct", ac[6], "D");
+			assertEquals("Second element not correct", ac[7], "C");
+			
+			ac.refresh();
+			
+			// and back to being unsorted
+			assertEquals("Length is not eight", ac.length, 8);
+			assertEquals("First element not correct", ac[0], "A");
+			assertEquals("Second element not correct", ac[1], "B");
+			assertEquals("First element not correct", ac[2], "D");
+			assertEquals("Second element not correct", ac[3], "C");
+			assertEquals("First element not correct", ac[4], "A");
+			assertEquals("Second element not correct", ac[5], "B");
+			assertEquals("First element not correct", ac[6], "D");
+			assertEquals("Second element not correct", ac[7], "C");
+		}
+		
+		// RTEs in Apache Flex 4.9.1
+		[Test]
+		public function sortRemoveAfterNullNoRefresh():void
+		{
+			addStrings();
+			
+			var sort:Sort = new Sort();			
+			sort.fields = [new SortField(null, false, true, true)];
+			ac.sort = sort;
+			ac.refresh();
+			ac.sort = null;
+			
+			assertEquals("Length is not four", ac.length, 4);
+			
+			ac.removeItemAt(0); // still sorted so 2 is removed leaving 1
+			assertEquals("Length is not three", ac.length, 3);
+			assertEquals("First element not correct", ac[0], "B");
+			
+			ac.refresh();
+			
+			assertEquals("Length is not four", ac.length, 3);
+			assertEquals("First element not correct", ac[0], "A");
+		}
+		
+		[Test]
+		public function sortIncludingDuplicates():void
+		{
+			addStrings();
+			addStrings();
+			
+			var sort:Sort = new Sort();			
+			sort.fields = [new SortField()];
+			ac.sort = sort;
+			ac.refresh();
+			
+			assertEquals("Length is not eight", ac.length, 8);
+			assertEquals("First element not correct", ac[0], "A");
+			assertEquals("Second element not correct", ac[1], "A");
+			assertEquals("First element not correct", ac[2], "B");
+			assertEquals("Second element not correct", ac[3], "B");	
+			assertEquals("First element not correct", ac[4], "C");
+			assertEquals("Second element not correct", ac[5], "C");
+			assertEquals("First element not correct", ac[6], "D");
+			assertEquals("Second element not correct", ac[7], "D");	
+		}
+		
+	}
+}
\ No newline at end of file