PageRenderTime 50ms CodeModel.GetById 17ms RepoModel.GetById 1ms app.codeStats 0ms

/src/test/flex/melomel/core/BridgeTest.as

http://github.com/benbjohnson/melomel
ActionScript | 217 lines | 147 code | 33 blank | 37 comment | 0 complexity | 4bf2582e50a2a70d43598f158efdb0b2 MD5 | raw file
  1. package melomel.core
  2. {
  3. import melomel.commands.parsers.*;
  4. import melomel.net.MockXMLSocket;
  5. import org.flexunit.Assert;
  6. import org.flexunit.async.Async;
  7. import flash.events.DataEvent;
  8. import flash.events.Event;
  9. import flash.events.EventDispatcher;
  10. import flash.events.ProgressEvent;
  11. import flash.events.ServerSocketConnectEvent;
  12. import flash.net.Socket;
  13. import flash.net.ServerSocket;
  14. import flash.utils.setTimeout;
  15. public class BridgeTest
  16. {
  17. //---------------------------------------------------------------------
  18. //
  19. // Setup
  20. //
  21. //---------------------------------------------------------------------
  22. private var bridge:Bridge;
  23. private var socket:MockXMLSocket;
  24. [Before]
  25. public function setUp():void
  26. {
  27. bridge = new MockBridge();
  28. }
  29. [After(async)]
  30. public function tearDown():void
  31. {
  32. bridge = null;
  33. socket = null;
  34. }
  35. //---------------------------------------------------------------------
  36. //
  37. // Methods
  38. //
  39. //---------------------------------------------------------------------
  40. //-----------------------------
  41. // Connection
  42. //-----------------------------
  43. [Test(async)]
  44. public function connect():void
  45. {
  46. bridge.connect();
  47. socket = (bridge as MockBridge).getSocket() as MockXMLSocket;
  48. Async.proceedOnEvent(this, socket, Event.CONNECT);
  49. }
  50. [Test(async)]
  51. public function disconnect():void
  52. {
  53. bridge.connect();
  54. socket = (bridge as MockBridge).getSocket() as MockXMLSocket;
  55. Async.proceedOnEvent(this, socket, Event.CLOSE);
  56. bridge.disconnect();
  57. }
  58. //-----------------------------
  59. // Parser Management
  60. //-----------------------------
  61. [Test]
  62. public function parserCanBeRetrievedByAction():void
  63. {
  64. var parser:GetPropertyCommandParser = new GetPropertyCommandParser(bridge.objectProxyManager);
  65. bridge.setParser("get", parser);
  66. Assert.assertEquals(parser, bridge.getParser("get"));
  67. }
  68. [Test]
  69. public function defaultActionsAreSetup():void
  70. {
  71. Assert.assertTrue(bridge.getParser("get-class") is GetClassCommandParser);
  72. Assert.assertTrue(bridge.getParser("get") is GetPropertyCommandParser);
  73. Assert.assertTrue(bridge.getParser("set") is SetPropertyCommandParser);
  74. Assert.assertTrue(bridge.getParser("invoke") is InvokeMethodCommandParser);
  75. Assert.assertTrue(bridge.getParser("create") is CreateObjectCommandParser);
  76. Assert.assertTrue(bridge.getParser("invoke-function") is InvokeFunctionCommandParser);
  77. }
  78. //---------------------------------------------------------------------
  79. //
  80. // Integration Tests
  81. //
  82. //---------------------------------------------------------------------
  83. [Test(async)]
  84. public function getClass():void
  85. {
  86. // Create proxy for class
  87. var proxy:ObjectProxy = bridge.objectProxyManager.addItem(BridgeTest);
  88. // Connect and wait on send event
  89. bridge.connect();
  90. socket = (bridge as MockBridge).getSocket() as MockXMLSocket;
  91. Async.proceedOnEvent(this, socket, "send");
  92. // Check send for correct data and send data to bridge
  93. socket.addEventListener("send", function(event:DataEvent):void{
  94. Assert.assertEquals('<return value="' + proxy.id + '" dataType="object"/>', event.data);
  95. }, false, 100);
  96. socket.receive('<get-class name="melomel.core.BridgeTest"/>');
  97. }
  98. [Test(async)]
  99. public function getProperty():void
  100. {
  101. // Create proxy for object
  102. var object:Object = {foo:"bar"};
  103. var proxy:ObjectProxy = bridge.objectProxyManager.addItem(object);
  104. // Connect and wait on send event
  105. bridge.connect();
  106. socket = (bridge as MockBridge).getSocket() as MockXMLSocket;
  107. Async.proceedOnEvent(this, socket, "send");
  108. // Check send for correct data and send data to bridge
  109. socket.addEventListener("send", function(event:DataEvent):void{
  110. Assert.assertEquals('<return value="bar" dataType="string"/>', event.data);
  111. }, false, 100);
  112. socket.receive('<get object="' + proxy.id + '" property="foo"/>');
  113. }
  114. [Test(async)]
  115. public function setProperty():void
  116. {
  117. // Create proxy for object
  118. var object:Object = {foo:"bar"};
  119. var proxy:ObjectProxy = bridge.objectProxyManager.addItem(object);
  120. // Connect and wait on send event
  121. bridge.connect();
  122. socket = (bridge as MockBridge).getSocket() as MockXMLSocket;
  123. Async.proceedOnEvent(this, socket, "send");
  124. // Check send for correct data and send data to bridge
  125. socket.addEventListener("send", function(event:DataEvent):void{
  126. Assert.assertEquals('<return value="baz" dataType="string"/>', event.data);
  127. }, false, 100);
  128. socket.receive('<set object="' + proxy.id + '" property="foo"><arg value="baz" dataType="string"/></set>');
  129. }
  130. [Test(async)]
  131. public function invokeMethod():void
  132. {
  133. // Create proxy for object
  134. var object:Object = {testFunc:function(name:String):String{return "Hello " + name}};
  135. var proxy:ObjectProxy = bridge.objectProxyManager.addItem(object);
  136. // Connect and wait on send event
  137. bridge.connect();
  138. socket = (bridge as MockBridge).getSocket() as MockXMLSocket;
  139. Async.proceedOnEvent(this, socket, "send");
  140. // Check send for correct data and send data to bridge
  141. socket.addEventListener("send", function(event:DataEvent):void{
  142. Assert.assertEquals('<return value="Hello World" dataType="string"/>', event.data);
  143. }, false, 100);
  144. socket.receive('<invoke object="' + proxy.id + '" method="testFunc"><args><arg value="World" dataType="string"/></args></invoke>');
  145. }
  146. [Test(async)]
  147. public function createObject():void
  148. {
  149. // Connect and wait on send event
  150. bridge.connect();
  151. socket = (bridge as MockBridge).getSocket() as MockXMLSocket;
  152. Async.proceedOnEvent(this, socket, "send");
  153. // Check send for correct data and send data to bridge
  154. socket.addEventListener("send", function(event:DataEvent):void{
  155. var response:XML = new XML(event.data);
  156. var object:Object = bridge.objectProxyManager.getItemById(parseInt(response.@value));
  157. Assert.assertEquals("return", response.localName().toString());
  158. Assert.assertEquals("object", response.@dataType);
  159. Assert.assertTrue(object is BridgeTest);
  160. }, false, 100);
  161. socket.receive('<create class="melomel.core.BridgeTest"/>');
  162. }
  163. [Test(async)]
  164. public function shouldReceiveError():void
  165. {
  166. // Connect and wait on send event
  167. bridge.connect();
  168. socket = (bridge as MockBridge).getSocket() as MockXMLSocket;
  169. Async.proceedOnEvent(this, socket, "send");
  170. // Check send for correct data and send data to bridge
  171. socket.addEventListener("send", function(event:DataEvent):void{
  172. var response:XML = new XML(event.data);
  173. var object:Object = bridge.objectProxyManager.getItemById(parseInt(response.@proxyId));
  174. Assert.assertEquals("error", response.localName().toString());
  175. Assert.assertEquals("0", response.@errorId);
  176. Assert.assertEquals("Cannot find class: no.such.class", response.@message);
  177. Assert.assertEquals("Error", response.@name);
  178. Assert.assertTrue(response['stack-trace'].toString().length > 0);
  179. Assert.assertTrue(object is Error);
  180. }, false, 100);
  181. socket.receive('<create class="no.such.class"/>');
  182. }
  183. }
  184. }