package test.services.testCase
{
    import flash.events.Event;
    
    import module.statistics.model.entity.Programmer;
    import module.statistics.service.proxy.StatisticsService;
    
    import mx.rpc.AsyncToken;
    import mx.rpc.events.ResultEvent;
    
    import net.digitalprimates.fluint.async.AsyncHandler;
    import net.digitalprimates.fluint.tests.TestCase;

    public class TestStatisticsServiceOperations extends TestCase
    {
        private var service : StatisticsService;
        private var programmer : Programmer;
        private var data : Object;
        
        public function TestStatisticsServiceOperations()
        {
            super();
        }
        
        override protected function setUp() : void
        {
            service = new StatisticsService();
            programmer = new Programmer("John", "Dow", "Software Architect", "photos/0.jpeg");
            data = new Object();
        }
        
        override protected function tearDown() : void
        {
            programmer = null
            data = null;
        }
        
        [Test]
        public function getProgrammerStatisticsOperation() : void 
        {
            var asyncHandler : Function = asyncHandler(handleGetProgrammerStatisticsReady, 1000, data, handleTimeout);
            addEventListener("getProgrammerStatisticsReady", asyncHandler, false, 0, true);
            
            service.getProgrammerStatistics(programmer, getProgrammerStatisticsResultHandler);
        }
        
        private function getProgrammerStatisticsResultHandler(e : ResultEvent, token : AsyncToken = null) : void
        {
            data.resultEvent = e;
            data.token = token;
            dispatchEvent(new Event("getProgrammerStatisticsReady"));
        }
        
        private function handleGetProgrammerStatisticsReady(e : Event, passThroughData : Object) : void 
        {
            var result : Array = ResultEvent(passThroughData.resultEvent).result as Array;
            
            assertNotNull(result);
            assertTrue(result.length == 12);
        }
        
        private function handleTimeout(passThroughData : Object) : void
        {
            fail("Timeout reached before result");
        }
        
    }
}