/tests/tests/com/probertson/data/SQLRunnerCloseTest.as

https://github.com/rusin/air-sqlite · ActionScript · 424 lines · 304 code · 105 blank · 15 comment · 5 complexity · 9ab81fba27be1875289309c553071cb3 MD5 · raw file

  1. package tests.com.probertson.data
  2. {
  3. import com.probertson.data.QueuedStatement;
  4. import com.probertson.data.SQLRunner;
  5. import events.CloseResultEvent;
  6. import flash.data.SQLResult;
  7. import flash.errors.SQLError;
  8. import flash.events.EventDispatcher;
  9. import flash.filesystem.File;
  10. import flexunit.framework.Assert;
  11. import org.flexunit.async.Async;
  12. import org.hamcrest.mxml.collection.InArray;
  13. import utils.CreateDatabase;
  14. public class SQLRunnerCloseTest extends EventDispatcher
  15. {
  16. // Reference declaration for class to test
  17. private var _sqlRunner:SQLRunner;
  18. // ------- Instance vars -------
  19. private var _dbFile:File;
  20. private var _numExecutions:int = 0;
  21. private var _numExecutionsHalfway:int = 0;
  22. private var _executionCompleteCount:int = 0;
  23. // ------- Setup/cleanup -------
  24. [Before]
  25. public function setUp():void
  26. {
  27. _dbFile = File.createTempDirectory().resolvePath("test.db");
  28. var createDB:CreateDatabase = new CreateDatabase(_dbFile);
  29. createDB.createDatabase();
  30. _numExecutions = 0;
  31. _numExecutionsHalfway = 0;
  32. _executionCompleteCount = 0;
  33. }
  34. [After]
  35. public function tearDown():void
  36. {
  37. _sqlRunner = null;
  38. var tempDir:File = _dbFile.parent;
  39. tempDir.deleteDirectory(true);
  40. }
  41. [BeforeClass]
  42. public static function setUpBeforeClass():void
  43. {
  44. }
  45. [AfterClass]
  46. public static function tearDownAfterClass():void
  47. {
  48. }
  49. // ------- Tests -------
  50. // ----- Test basic closing -----
  51. [Test(async, timeout="500")]
  52. public function testClose():void
  53. {
  54. addEventListener(CloseResultEvent.CLOSE, Async.asyncHandler(this, testClose_result2, 500));
  55. _sqlRunner = new SQLRunner(_dbFile);
  56. _sqlRunner.close(testClose_result);
  57. }
  58. // --- handlers ---
  59. private function testClose_result():void
  60. {
  61. dispatchEvent(new CloseResultEvent(CloseResultEvent.CLOSE));
  62. }
  63. private function testClose_result2(event:CloseResultEvent, passThroughData:Object):void
  64. {
  65. Assert.assertTrue(true);
  66. }
  67. // ----- Test that statements execute before closing -----
  68. [Test(async, timeout="500")]
  69. public function testCloseAfterExecute():void
  70. {
  71. addEventListener(CloseResultEvent.CLOSE, Async.asyncHandler(this, testCloseAfterExecute_result2, 500));
  72. _sqlRunner = new SQLRunner(_dbFile);
  73. _sqlRunner.execute(LOAD_ROWS_LIMIT_SQL, null, testCloseAfterExecute_execute_result);
  74. _numExecutions++;
  75. _sqlRunner.close(testCloseAfterExecute_result);
  76. }
  77. // --- handlers ---
  78. private function testCloseAfterExecute_execute_result(result:SQLResult):void
  79. {
  80. _executionCompleteCount++;
  81. }
  82. private function testCloseAfterExecute_result():void
  83. {
  84. dispatchEvent(new CloseResultEvent(CloseResultEvent.CLOSE));
  85. }
  86. private function testCloseAfterExecute_result2(event:CloseResultEvent, passThroughData:Object):void
  87. {
  88. Assert.assertEquals(_numExecutions, _executionCompleteCount);
  89. }
  90. [Test(async, timeout="500")]
  91. public function testCloseAfterMultipleExecute():void
  92. {
  93. addEventListener(CloseResultEvent.CLOSE, Async.asyncHandler(this, testCloseAfterMultipleExecute_result2, 500));
  94. _sqlRunner = new SQLRunner(_dbFile);
  95. _sqlRunner.execute(LOAD_ROWS_LIMIT_SQL, null, testCloseAfterMultipleExecute_execute_result);
  96. _numExecutions++;
  97. _sqlRunner.execute(LOAD_ROWS_LIMIT_OFFSET_SQL, null, testCloseAfterMultipleExecute_execute_result);
  98. _numExecutions++;
  99. _sqlRunner.execute(LOAD_ROWS_LIMIT_SQL, null, testCloseAfterMultipleExecute_execute_result);
  100. _numExecutions++;
  101. _sqlRunner.execute(LOAD_ROWS_LIMIT_OFFSET_SQL, null, testCloseAfterMultipleExecute_execute_result);
  102. _numExecutions++;
  103. _sqlRunner.execute(LOAD_ROWS_LIMIT_SQL, null, testCloseAfterMultipleExecute_execute_result);
  104. _numExecutions++;
  105. _sqlRunner.execute(LOAD_ROWS_LIMIT_OFFSET_SQL, null, testCloseAfterMultipleExecute_execute_result);
  106. _numExecutions++;
  107. _sqlRunner.execute(LOAD_ROWS_LIMIT_SQL, null, testCloseAfterMultipleExecute_execute_result);
  108. _numExecutions++;
  109. _sqlRunner.execute(LOAD_ROWS_LIMIT_OFFSET_SQL, null, testCloseAfterMultipleExecute_execute_result);
  110. _numExecutions++;
  111. _sqlRunner.close(testCloseAfterMultipleExecute_result);
  112. }
  113. // --- handlers ---
  114. private function testCloseAfterMultipleExecute_execute_result(result:SQLResult):void
  115. {
  116. _executionCompleteCount++;
  117. }
  118. private function testCloseAfterMultipleExecute_result():void
  119. {
  120. dispatchEvent(new CloseResultEvent(CloseResultEvent.CLOSE));
  121. }
  122. private function testCloseAfterMultipleExecute_result2(event:CloseResultEvent, passThroughData:Object):void
  123. {
  124. Assert.assertEquals(_numExecutions, _executionCompleteCount);
  125. }
  126. // ----- Test that executeModify() statements execute before closing -----
  127. [Test(async, timeout="500")]
  128. public function testCloseAfterExecuteModify():void
  129. {
  130. addEventListener(CloseResultEvent.CLOSE, Async.asyncHandler(this, testCloseAfterExecuteModify_result2, 500));
  131. _sqlRunner = new SQLRunner(_dbFile);
  132. var stmt1:QueuedStatement = new QueuedStatement(ADD_ROW_SQL, {colString:"Hello", colInt:7});
  133. var stmt2:QueuedStatement = new QueuedStatement(ADD_ROW_SQL, {colString:"World", colInt:17});
  134. _sqlRunner.executeModify(Vector.<QueuedStatement>([stmt1, stmt2]), testCloseAfterExecuteModify_executeModify_result, testCloseAfterExecuteModify_executeModify_error);
  135. _numExecutions++;
  136. var stmt3:QueuedStatement = new QueuedStatement(ADD_ROW_SQL, {colString:"Hola", colInt:15});
  137. _sqlRunner.executeModify(Vector.<QueuedStatement>([stmt3]), testCloseAfterExecuteModify_executeModify_result, testCloseAfterExecuteModify_executeModify_error);
  138. _numExecutions++;
  139. var stmt4:QueuedStatement = new QueuedStatement(ADD_ROW_SQL, {colString:"Mundo", colInt:99});
  140. _sqlRunner.executeModify(Vector.<QueuedStatement>([stmt4]), testCloseAfterExecuteModify_executeModify_result, testCloseAfterExecuteModify_executeModify_error);
  141. _numExecutions++;
  142. _sqlRunner.close(testCloseAfterExecuteModify_result);
  143. }
  144. // --- handlers ---
  145. private function testCloseAfterExecuteModify_executeModify_result(results:Vector.<SQLResult>):void
  146. {
  147. _executionCompleteCount++;
  148. }
  149. private function testCloseAfterExecuteModify_executeModify_error(error:SQLError):void
  150. {
  151. Assert.fail(error.message);
  152. }
  153. private function testCloseAfterExecuteModify_result():void
  154. {
  155. dispatchEvent(new CloseResultEvent(CloseResultEvent.CLOSE));
  156. }
  157. private function testCloseAfterExecuteModify_result2(event:CloseResultEvent, passThroughData:Object):void
  158. {
  159. Assert.assertEquals(_numExecutions, _executionCompleteCount);
  160. }
  161. [Test(async, timeout="500")]
  162. public function testCloseAfterMixedExecute():void
  163. {
  164. addEventListener(CloseResultEvent.CLOSE, Async.asyncHandler(this, testCloseAfterMixedExecute_result2, 500));
  165. _sqlRunner = new SQLRunner(_dbFile);
  166. var stmt1:QueuedStatement = new QueuedStatement(ADD_ROW_SQL, {colString:"Hello", colInt:7});
  167. var stmt2:QueuedStatement = new QueuedStatement(ADD_ROW_SQL, {colString:"World", colInt:17});
  168. _sqlRunner.executeModify(Vector.<QueuedStatement>([stmt1, stmt2]), testCloseAfterMixedExecute_executeModify_result, testCloseAfterMixedExecute_executeModify_error);
  169. _numExecutions++;
  170. _sqlRunner.execute(LOAD_ROWS_LIMIT_SQL, null, testCloseAfterMixedExecute_execute_result);
  171. _numExecutions++;
  172. _sqlRunner.execute(LOAD_ROWS_LIMIT_OFFSET_SQL, null, testCloseAfterMixedExecute_execute_result);
  173. _numExecutions++;
  174. _sqlRunner.execute(LOAD_ROWS_LIMIT_SQL, null, testCloseAfterMixedExecute_execute_result);
  175. _numExecutions++;
  176. _sqlRunner.execute(LOAD_ROWS_LIMIT_OFFSET_SQL, null, testCloseAfterMixedExecute_execute_result);
  177. _numExecutions++;
  178. var stmt3:QueuedStatement = new QueuedStatement(ADD_ROW_SQL, {colString:"Hola", colInt:15});
  179. _sqlRunner.executeModify(Vector.<QueuedStatement>([stmt3]), testCloseAfterMixedExecute_executeModify_result, testCloseAfterMixedExecute_executeModify_error);
  180. _numExecutions++;
  181. _sqlRunner.execute(LOAD_ROWS_LIMIT_SQL, null, testCloseAfterMixedExecute_execute_result);
  182. _numExecutions++;
  183. _sqlRunner.execute(LOAD_ROWS_LIMIT_OFFSET_SQL, null, testCloseAfterMixedExecute_execute_result);
  184. _numExecutions++;
  185. var stmt4:QueuedStatement = new QueuedStatement(ADD_ROW_SQL, {colString:"Mundo", colInt:99});
  186. _sqlRunner.executeModify(Vector.<QueuedStatement>([stmt4]), testCloseAfterMixedExecute_executeModify_result, testCloseAfterMixedExecute_executeModify_error);
  187. _numExecutions++;
  188. _sqlRunner.execute(LOAD_ROWS_LIMIT_SQL, null, testCloseAfterMixedExecute_execute_result);
  189. _numExecutions++;
  190. _sqlRunner.execute(LOAD_ROWS_LIMIT_OFFSET_SQL, null, testCloseAfterMixedExecute_execute_result);
  191. _numExecutions++;
  192. _sqlRunner.close(testCloseAfterMixedExecute_result);
  193. }
  194. // --- handlers ---
  195. private function testCloseAfterMixedExecute_execute_result(result:SQLResult):void
  196. {
  197. _executionCompleteCount++;
  198. }
  199. private function testCloseAfterMixedExecute_executeModify_result(results:Vector.<SQLResult>):void
  200. {
  201. _executionCompleteCount++;
  202. }
  203. private function testCloseAfterMixedExecute_executeModify_error(error:SQLError):void
  204. {
  205. Assert.fail(error.message);
  206. }
  207. private function testCloseAfterMixedExecute_result():void
  208. {
  209. dispatchEvent(new CloseResultEvent(CloseResultEvent.CLOSE));
  210. }
  211. private function testCloseAfterMixedExecute_result2(event:CloseResultEvent, passThroughData:Object):void
  212. {
  213. Assert.assertEquals(_numExecutions, _executionCompleteCount);
  214. }
  215. // ----- Test executing, closing, then re-opening and closing again -----
  216. [Test(async, timeout="5000")]
  217. public function testCloseOpenClose():void
  218. {
  219. addEventListener(CloseResultEvent.CLOSE, Async.asyncHandler(this, testCloseOpenClose_result2, 5000));
  220. _sqlRunner = new SQLRunner(_dbFile);
  221. var stmt1:QueuedStatement = new QueuedStatement(ADD_ROW_SQL, {colString:"Hello", colInt:7});
  222. var stmt2:QueuedStatement = new QueuedStatement(ADD_ROW_SQL, {colString:"World", colInt:17});
  223. _sqlRunner.executeModify(Vector.<QueuedStatement>([stmt1, stmt2]), testCloseOpenClose_stmt1_result, testCloseOpenClose_executeModify_error);
  224. _numExecutions++;
  225. _numExecutionsHalfway++;
  226. }
  227. private function testCloseOpenClose_stmt1_result(results:Vector.<SQLResult>):void
  228. {
  229. _executionCompleteCount++;
  230. _sqlRunner.execute(LOAD_ROWS_LIMIT_SQL, null, testCloseOpenClose_execute1_result);
  231. _numExecutions++;
  232. _numExecutionsHalfway++;
  233. }
  234. private function testCloseOpenClose_execute1_result(result:SQLResult):void
  235. {
  236. _executionCompleteCount++;
  237. _sqlRunner.execute(LOAD_ROWS_LIMIT_OFFSET_SQL, null, testCloseOpenClose_execute2_result);
  238. _numExecutions++;
  239. _numExecutionsHalfway++;
  240. }
  241. private function testCloseOpenClose_execute2_result(result:SQLResult):void
  242. {
  243. _executionCompleteCount++;
  244. var stmt3:QueuedStatement = new QueuedStatement(ADD_ROW_SQL, {colString:"Hola", colInt:15});
  245. _sqlRunner.executeModify(Vector.<QueuedStatement>([stmt3]), testCloseOpenClose_stmt3_result, testCloseOpenClose_executeModify_error);
  246. _numExecutions++;
  247. _numExecutionsHalfway++;
  248. }
  249. private function testCloseOpenClose_stmt3_result(results:Vector.<SQLResult>):void
  250. {
  251. _executionCompleteCount++;
  252. _sqlRunner.close(testCloseOpenClose_close1_result);
  253. }
  254. private function testCloseOpenClose_close1_result():void
  255. {
  256. Assert.assertEquals(_numExecutionsHalfway, _executionCompleteCount);
  257. _sqlRunner = new SQLRunner(_dbFile);
  258. _execution3Complete = 0;
  259. _sqlRunner.execute(LOAD_ROWS_LIMIT_SQL, null, testCloseOpenClose_execute3_result);
  260. _numExecutions++;
  261. _sqlRunner.execute(LOAD_ROWS_LIMIT_OFFSET_SQL, null, testCloseOpenClose_execute3_result);
  262. _numExecutions++;
  263. _sqlRunner.execute(LOAD_ROWS_LIMIT_SQL, null, testCloseOpenClose_execute3_result);
  264. _numExecutions++;
  265. _sqlRunner.execute(LOAD_ROWS_LIMIT_OFFSET_SQL, null, testCloseOpenClose_execute3_result);
  266. _numExecutions++;
  267. _stmt4Complete = false;
  268. var stmt4:QueuedStatement = new QueuedStatement(ADD_ROW_SQL, {colString:"Mundo", colInt:99});
  269. _sqlRunner.executeModify(Vector.<QueuedStatement>([stmt4]), testCloseOpenClose_stmt4_result, testCloseOpenClose_executeModify_error);
  270. _numExecutions++;
  271. }
  272. private var _execution3Complete:int = 0;
  273. private function testCloseOpenClose_execute3_result(result:SQLResult):void
  274. {
  275. _executionCompleteCount++;
  276. _execution3Complete++;
  277. if (_execution3Complete == 4)
  278. _checkReadyToClose();
  279. }
  280. private var _stmt4Complete:Boolean = false;
  281. private function testCloseOpenClose_stmt4_result(results:Vector.<SQLResult>):void
  282. {
  283. _executionCompleteCount++;
  284. _stmt4Complete = true;
  285. _checkReadyToClose();
  286. }
  287. private function _checkReadyToClose():void
  288. {
  289. if (_execution3Complete == 4 && _stmt4Complete)
  290. _sqlRunner.close(testCloseOpenClose_result);
  291. }
  292. // --- handlers ---
  293. private function testCloseOpenClose_executeModify_error(error:SQLError):void
  294. {
  295. Assert.fail(error.message);
  296. }
  297. private function testCloseOpenClose_result():void
  298. {
  299. dispatchEvent(new CloseResultEvent(CloseResultEvent.CLOSE));
  300. }
  301. private function testCloseOpenClose_result2(event:CloseResultEvent, passThroughData:Object):void
  302. {
  303. Assert.assertEquals(_numExecutions, _executionCompleteCount);
  304. }
  305. // ------- SQL statements -------
  306. [Embed(source="sql/LoadRowsLimit.sql", mimeType="application/octet-stream")]
  307. private static const LoadRowsLimitStatementText:Class;
  308. private static const LOAD_ROWS_LIMIT_SQL:String = new LoadRowsLimitStatementText();
  309. [Embed(source="sql/LoadRowsLimitOffset.sql", mimeType="application/octet-stream")]
  310. private static const LoadRowsLimitOffsetStatementText:Class;
  311. private static const LOAD_ROWS_LIMIT_OFFSET_SQL:String = new LoadRowsLimitOffsetStatementText();
  312. [Embed(source="sql/LoadRowsParameterizedLimitOffset.sql", mimeType="application/octet-stream")]
  313. private static const LoadRowsParameterizedLimitOffsetStatementText:Class;
  314. private static const LOAD_ROWS_PARAMETERIZED_LIMIT_OFFSET_SQL:String = new LoadRowsParameterizedLimitOffsetStatementText();
  315. [Embed(source="sql/AddRow.sql", mimeType="application/octet-stream")]
  316. private static const AddRowStatementText:Class;
  317. private static const ADD_ROW_SQL:String = new AddRowStatementText();
  318. }
  319. }