package test.customLayoutList.testCase
{
    import component.list.CustomLayoutList;
    
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.events.TimerEvent;
    import flash.geom.Rectangle;
    import flash.utils.Timer;
    
    import mx.core.UIComponent;
    import mx.events.FlexEvent;
    
    import net.digitalprimates.fluint.sequence.SequenceEventDispatcher;
    import net.digitalprimates.fluint.sequence.SequenceRunner;
    import net.digitalprimates.fluint.sequence.SequenceSetter;
    import net.digitalprimates.fluint.sequence.SequenceWaiter;
    
    import test.base.CustomTestCase;
    import test.customLayoutList.view.CustomLayoutListView;

    public class TestLayoutChange extends CustomTestCase
    {
        private var testView : CustomLayoutListView;
        private var timer : Timer;
        
        public function TestLayoutChange()
        {
            super();
        }
        
        override protected function setUp() : void
        {
            timer = new Timer(CustomLayoutList.TWEEN_DURATION_SECONDS * 2000);
            
            testView = new CustomLayoutListView();
            testView.filterCheckboxVisible = true;
            testView.addEventListener(FlexEvent.CREATION_COMPLETE, waitingHandler(pendUntilComplete), false, 0, true);
            addChild(testView);
        }
        
        override protected function tearDown() : void
        {
            removeChild(testView);
            testView = null;
            timer.stop();
        }
        
        [Test(description="Asserts that the list is updating its layout when filterring the data provider.")]
        public function updateLayoutOnFilterChange() : void 
        {
            var sequenceRunner : SequenceRunner = new SequenceRunner(this);
            sequenceRunner.addStep(new SequenceWaiter(timer, TimerEvent.TIMER, timer.delay));
            
            sequenceRunner.addStep(new SequenceEventDispatcher(testView.filterCheckbox, new MouseEvent(MouseEvent.CLICK)));
            sequenceRunner.addStep(new SequenceWaiter(timer, TimerEvent.TIMER, timer.delay));
            
            sequenceRunner.addStep(new SequenceEventDispatcher(testView.filterCheckbox, new MouseEvent(MouseEvent.CLICK)));
            sequenceRunner.addStep(new SequenceWaiter(timer, TimerEvent.TIMER, timer.delay));
            
            sequenceRunner.addAssertHandler(assertAllItemsArePresent, null);
            
            sequenceRunner.run();
            timer.start()
        }
        
        private function assertAllItemsArePresent(e : Event, passThroughData : Object) : void 
        {
            assertTrue(testView.list.removedItems.length == 0);
        }
        
        [Test(description="Asserts that the layout updates when we reassign the layout-property")]
        public function updataLayoutOnLayoutChange() : void
        {
            var sequenceRunner : SequenceRunner = new SequenceRunner(this);
            sequenceRunner.addStep(new SequenceWaiter(timer, TimerEvent.TIMER, timer.delay));
            
            sequenceRunner.addStep(new SequenceSetter(testView.list, {layout:testView.verticalLayout}));
            sequenceRunner.addStep(new SequenceWaiter(timer, TimerEvent.TIMER, timer.delay));
            sequenceRunner.addAssertHandler(assertLayoutIsApplied, null);
            
            sequenceRunner.addStep(new SequenceSetter(testView.list, {layout:testView.fluidLayout}));
            sequenceRunner.addStep(new SequenceWaiter(timer, TimerEvent.TIMER, timer.delay));
            sequenceRunner.addAssertHandler(assertLayoutIsApplied, null);
            
            sequenceRunner.run();
            timer.start()
        }
        
        private function assertLayoutIsApplied(e : Event, passThroughData : Object) : void 
        {
            var dimensions : Array = testView.list.layout.updateLayout(testView.list, testView.list.listItems, testView.list.removedItems);
            
            for (var i : int = 0; i < dimensions.length; i++)
            {
                var dimension : Rectangle = Rectangle(dimensions[i]);
                var item : UIComponent = UIComponent(testView.list.listItems.getItemAt(i));
                
                assertEquals(dimension.x, item.x);
                assertEquals(dimension.y, item.y);
                assertEquals(dimension.width, item.width);
                assertEquals(dimension.height, item.height);
            }
        }
        
    }
}