Serialization.tests.js 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360
  1. /**
  2. * @author lxxxvi / https://github.com/lxxxvi
  3. * Developed as part of a project at University of Applied Sciences and Arts Northwestern Switzerland (www.fhnw.ch)
  4. */
  5. QUnit.module( "Serialization" );
  6. QUnit.test( "Test Serialization", function( assert ) {
  7. assert.timeout( 1000 );
  8. // setup
  9. var editor = new Editor();
  10. var done = assert.async();
  11. editor.storage.init( function () {
  12. performTests();
  13. done(); // continue running other tests
  14. } );
  15. var green = 12581843; // bffbd3
  16. var addObject = function () {
  17. // setup
  18. var box = aBox( 'The Box' );
  19. // Test Add
  20. var cmd = new AddObjectCommand( box );
  21. cmd.updatable = false;
  22. editor.execute( cmd );
  23. return "addObject";
  24. };
  25. var addScript = function () {
  26. // setup
  27. var box = aBox( 'The Box' );
  28. // Test Add
  29. var cmd = new AddObjectCommand( box );
  30. editor.execute( cmd );
  31. var cmd = new AddScriptCommand( box, { "name": "test", "source": "console.log(\"hello world\");" } );
  32. cmd.updatable = false;
  33. editor.execute( cmd );
  34. return "addScript";
  35. };
  36. var moveObject = function () {
  37. // create some objects
  38. var anakinsName = 'Anakin Skywalker';
  39. var lukesName = 'Luke Skywalker';
  40. var anakinSkywalker = aSphere( anakinsName );
  41. var lukeSkywalker = aBox( lukesName );
  42. editor.execute( new AddObjectCommand( anakinSkywalker ) );
  43. editor.execute( new AddObjectCommand( lukeSkywalker ) );
  44. // Tell Luke, Anakin is his father
  45. editor.execute( new MoveObjectCommand( lukeSkywalker, anakinSkywalker ) );
  46. return "moveObject";
  47. };
  48. var removeScript = function () {
  49. var box = aBox( 'Box with no script' );
  50. editor.execute( new AddObjectCommand( box ) );
  51. var script = { "name": "test", "source": "console.log(\"hello world\");" } ;
  52. var cmd = new AddScriptCommand( box, script );
  53. cmd.updatable = false;
  54. editor.execute( cmd );
  55. cmd = new RemoveScriptCommand( box, script );
  56. editor.execute( cmd );
  57. return "removeScript";
  58. };
  59. var setColor = function () {
  60. var pointLight = aPointlight( "The light Light" );
  61. editor.execute( new AddObjectCommand( pointLight ) );
  62. var cmd = new SetColorCommand( pointLight, 'color', green );
  63. cmd.updatable = false;
  64. editor.execute( cmd );
  65. return "setColor";
  66. };
  67. var setGeometry = function () {
  68. var box = aBox( 'Guinea Pig' ); // default ( 100, 100, 100, 1, 1, 1 )
  69. var boxGeometry = { geometry: { parameters: { width: 200, height: 201, depth: 202, widthSegments: 2, heightSegments: 3, depthSegments: 4 } } };
  70. editor.execute( new AddObjectCommand( box ) );
  71. var cmd = new SetGeometryCommand( box, getGeometry( "BoxGeometry", boxGeometry ) );
  72. cmd.updatable = false;
  73. editor.execute( cmd );
  74. return "setGeometry";
  75. };
  76. var setGeometryValue = function() {
  77. var box = aBox( 'Geometry Value Box' );
  78. editor.execute( new AddObjectCommand( box ) );
  79. cmd = new SetGeometryValueCommand( box, 'uuid', THREE.Math.generateUUID() );
  80. cmd.updatable = false;
  81. editor.execute( cmd );
  82. return "setGeometryValue";
  83. };
  84. var setMaterial = function () {
  85. var sphere = aSphere( 'The Sun' );
  86. editor.execute( new AddObjectCommand( sphere ) );
  87. var material = new THREE[ 'MeshPhongMaterial' ]();
  88. var cmd = new SetMaterialCommand( sphere, material );
  89. cmd.updatable = false;
  90. editor.execute( cmd );
  91. return "setMaterial";
  92. };
  93. var setMaterialColor = function () {
  94. var box = aBox( 'Box with colored material' );
  95. editor.execute( new AddObjectCommand( box ) );
  96. var cmd = new SetMaterialColorCommand( box, 'color', green );
  97. cmd.updatable = false;
  98. editor.execute( cmd );
  99. return "setMaterialColor";
  100. };
  101. var setMaterialMap = function () {
  102. var sphere = aSphere( 'Sphere with texture' );
  103. editor.execute( new AddObjectCommand( sphere ) );
  104. // dirt.png
  105. var data = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpDMjYxMEI4MzVENDMxMUU1OTdEQUY4QkNGNUVENjg4MyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpDMjYxMEI4NDVENDMxMUU1OTdEQUY4QkNGNUVENjg4MyI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkMyNjEwQjgxNUQ0MzExRTU5N0RBRjhCQ0Y1RUQ2ODgzIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkMyNjEwQjgyNUQ0MzExRTU5N0RBRjhCQ0Y1RUQ2ODgzIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+txizaQAAABVQTFRFh4eHbGxsdFhEWT0puYVclmxKeVU6ppwr+AAAAHtJREFUeNosjgEWBCEIQplFuP+RB5h9lZn2EZxkLzC3D1YSgSlmk7i0ctzDZNBz/VSoX1KwjlFI8WmA2R7JqUa0LJJcd1rLNWRRaMyi+3Y16qMKHhdE48XLsDyHKJ0nSMazY1fxHyriXxV584tmEedcfGNrA/5cmK8AAwCT9ATehDDyzwAAAABJRU5ErkJggg==';
  106. var img = new Image();
  107. img.src = data;
  108. var texture = new THREE.Texture( img, 'map' );
  109. texture.sourceFile = 'dirt.png';
  110. var cmd = new SetMaterialMapCommand( sphere, 'map', texture );
  111. cmd.updatable = false;
  112. editor.execute( cmd );
  113. return "setMaterialMap";
  114. };
  115. var setMaterialValue = function () {
  116. var box = aBox( 'Box with values' );
  117. editor.execute( new AddObjectCommand( box ) );
  118. var cmd = new SetMaterialValueCommand( box, 'name', 'Bravo' );
  119. cmd.updatable = false;
  120. editor.execute( cmd );
  121. return "setMaterialValue";
  122. };
  123. var setPosition = function () {
  124. var sphere = aSphere( 'Sphere with position' );
  125. editor.execute( new AddObjectCommand( sphere ) );
  126. var newPosition = new THREE.Vector3( 101, 202, 303 );
  127. var cmd = new SetPositionCommand( sphere, newPosition );
  128. cmd.updatable = false;
  129. editor.execute( cmd );
  130. return "setPosition";
  131. };
  132. var setRotation = function () {
  133. var box = aBox( 'Box with rotation' );
  134. editor.execute( new AddObjectCommand( box ) );
  135. var newRotation = new THREE.Euler( 0.3, - 1.7, 2 );
  136. var cmd = new SetRotationCommand( box, newRotation );
  137. cmd.updatable = false;
  138. editor.execute ( cmd );
  139. return "setRotation";
  140. };
  141. var setScale = function () {
  142. var sphere = aSphere( 'Sphere with scale' );
  143. editor.execute( new AddObjectCommand( sphere ) );
  144. var newScale = new THREE.Vector3( 1.2, 3.3, 4.6 );
  145. var cmd = new SetScaleCommand( sphere, newScale );
  146. cmd.updatable = false;
  147. editor.execute( cmd );
  148. return "setScale";
  149. };
  150. var setScriptValue = function () {
  151. var box = aBox( 'Box with script' );
  152. editor.execute( new AddObjectCommand( box ) );
  153. var script = { name: "Alert", source: "alert( null );" };
  154. editor.execute( new AddScriptCommand( box, script ) );
  155. var newScript = { name: "Console", source: "console.log( null );" };
  156. var cmd = new SetScriptValueCommand( box, script, 'source', newScript.source, 0 );
  157. cmd.updatable = false;
  158. editor.execute( cmd );
  159. return "setScriptValue";
  160. };
  161. var setUuid = function () {
  162. var sphere = aSphere( 'Sphere with UUID' );
  163. editor.execute( new AddObjectCommand( sphere ) );
  164. var cmd = new SetUuidCommand( sphere, THREE.Math.generateUUID() );
  165. cmd.updatable = false;
  166. editor.execute( cmd );
  167. return "setUuid";
  168. };
  169. var setValue = function () {
  170. var box = aBox( 'Box with value' );
  171. editor.execute( new AddObjectCommand( box ) );
  172. var cmd = new SetValueCommand( box, 'intensity', 2.3 );
  173. cmd.updatable = false;
  174. editor.execute( cmd );
  175. return "setValue";
  176. };
  177. var setups = [
  178. addObject,
  179. addScript,
  180. moveObject,
  181. removeScript,
  182. setColor,
  183. setGeometry,
  184. setGeometryValue,
  185. setMaterial,
  186. setMaterialColor,
  187. setMaterialMap,
  188. setMaterialValue,
  189. setPosition,
  190. setRotation,
  191. setScale,
  192. setScriptValue,
  193. setUuid,
  194. setValue
  195. ];
  196. function performTests() {
  197. // Forward tests
  198. for ( var i = 0; i < setups.length ; i ++ ) {
  199. var name = setups[ i ]();
  200. // Check for correct serialization
  201. editor.history.goToState( 0 );
  202. editor.history.goToState( 1000 );
  203. var history = JSON.stringify( editor.history.toJSON() );
  204. editor.history.clear();
  205. editor.history.fromJSON( JSON.parse( history ) );
  206. editor.history.goToState( 0 );
  207. editor.history.goToState( 1000 );
  208. var history2 = JSON.stringify( editor.history.toJSON() );
  209. assert.ok( history == history2, "OK, forward serializing was successful for " + name );
  210. editor.clear();
  211. }
  212. // Backward tests
  213. for ( var i = 0; i < setups.length ; i ++ ) {
  214. var name = setups[ i ]();
  215. editor.history.goToState( 0 );
  216. var history = JSON.stringify( editor.history.toJSON() );
  217. editor.history.clear();
  218. editor.history.fromJSON( JSON.parse( history ) );
  219. editor.history.goToState( 1000 );
  220. editor.history.goToState( 0 );
  221. var history2 = JSON.stringify( editor.history.toJSON() );
  222. assert.ok( history == history2, "OK, backward serializing was successful for " + name );
  223. editor.clear();
  224. }
  225. }
  226. } );