behaviors.html 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title>Virtual World Framework</title>
  5. <script type="text/javascript" src="qunit.js"></script>
  6. <script type="text/javascript" src="../lib/async.js"></script>
  7. <script type="text/javascript" src="../lib/crypto.js"></script>
  8. <script type="text/javascript" src="../lib/md5.js"></script>
  9. <script type="text/javascript" src="../lib/alea.js"></script>
  10. <script type="text/javascript" src="../lib/mash.js"></script>
  11. <script type="text/javascript" src="../lib/vwf.js"></script>
  12. <script type="text/javascript" src="../lib/require.js"></script>
  13. <script type="text/javascript">
  14. require( {
  15. baseUrl: "../lib",
  16. paths: {
  17. jquery: "jquery-1.10.2.min",
  18. },
  19. }, [
  20. "domReady",
  21. "utility.js",
  22. "jquery",
  23. "vwf/configuration",
  24. "vwf/kernel/model",
  25. "vwf/model/javascript",
  26. "vwf/model/object",
  27. "vwf/model/stage/log",
  28. "vwf/kernel/view",
  29. "vwf/kernel/utility",
  30. "vwf/utility",
  31. "logger",
  32. ], function( ready, testUtility ) {
  33. // Test behavior inheritance.
  34. ready( function() {
  35. vwf.initialize(
  36. /* models */ [ "vwf/model/javascript", "vwf/model/object" ],
  37. /* views */ [ ]
  38. );
  39. asyncTest( "No behaviors", function() { // Base
  40. createFixture( function( doubleDerivedOtherBehaviorDerivedBaseBehaviorID,
  41. derivedID, derivedBaseBehaviorID, derivedBaseBehaviorOtherBehaviorID, derivedDerivedBehaviorID,
  42. baseID, derivedBehaviorID, baseBehaviorID, otherBehaviorID, cleanup ) {
  43. equal( vwf.execute( baseID, "this.base" ), "base", "base property visible on base" );
  44. equal( vwf.execute( baseID, "this.baseAccessor" ), "BASE", "base property visible on base through accessor" );
  45. cleanup();
  46. start();
  47. } );
  48. } );
  49. asyncTest( "Inheritance with no behaviors", function() { // Derived extends Base
  50. createFixture( function( doubleDerivedOtherBehaviorDerivedBaseBehaviorID,
  51. derivedID, derivedBaseBehaviorID, derivedBaseBehaviorOtherBehaviorID, derivedDerivedBehaviorID,
  52. baseID, derivedBehaviorID, baseBehaviorID, otherBehaviorID, cleanup ) {
  53. equal( vwf.execute( derivedID, "this.derived" ), "derived", "derived property visible on derived" );
  54. equal( vwf.execute( derivedID, "this.base" ), "base", "base property visible on derived" );
  55. equal( vwf.execute( derivedID, "this.derivedAccessor" ), "DERIVED", "derived property visible on derived through accessor" );
  56. equal( vwf.execute( derivedID, "this.baseAccessor" ), "BASE", "base property visible on derived through accessor" );
  57. cleanup();
  58. start();
  59. } );
  60. } );
  61. asyncTest( "Inheritance through behavior", function() { // DerivedBaseBehavior implements BaseBehavior extends Base
  62. createFixture( function( doubleDerivedOtherBehaviorDerivedBaseBehaviorID,
  63. derivedID, derivedBaseBehaviorID, derivedBaseBehaviorOtherBehaviorID, derivedDerivedBehaviorID,
  64. baseID, derivedBehaviorID, baseBehaviorID, otherBehaviorID, cleanup ) {
  65. equal( vwf.execute( derivedBaseBehaviorID, "this.derivedBaseBehavior" ), "derivedBaseBehavior", "derived property visible on derived with base behavior" );
  66. equal( vwf.execute( derivedBaseBehaviorID, "this.baseBehavior" ), "baseBehavior", "base behavior property visible on derived with base behavior" );
  67. equal( vwf.execute( derivedBaseBehaviorID, "this.base" ), "base", "base property visible on derived with base behavior" );
  68. equal( vwf.execute( derivedBaseBehaviorID, "this.derivedBaseBehaviorAccessor" ), "DERIVEDBASEBEHAVIOR", "derived property visible on derived with base behavior through accessor" );
  69. equal( vwf.execute( derivedBaseBehaviorID, "this.baseBehaviorAccessor" ), "BASEBEHAVIOR", "base behavior property visible on derived with base behavior through accessor" );
  70. equal( vwf.execute( derivedBaseBehaviorID, "this.baseAccessor" ), "BASE", "base property visible on derived with base behavior through accessor" );
  71. vwf.setProperty( derivedBaseBehaviorID, "derivedBaseBehavior", "UpDaTeD" );
  72. vwf.setProperty( derivedBaseBehaviorID, "baseBehavior", "UpDaTeD" );
  73. vwf.setProperty( derivedBaseBehaviorID, "base", "UpDaTeD" );
  74. equal( vwf.execute( derivedBaseBehaviorID, "this.derivedBaseBehavior" ), "UpDaTeD", "derived property after initialization on derived with base behavior" );
  75. equal( vwf.execute( derivedBaseBehaviorID, "this.baseBehavior" ), "UpDaTeD", "base behavior property after initialization on derived with base behavior" );
  76. equal( vwf.execute( derivedBaseBehaviorID, "this.base" ), "UpDaTeD", "base property after initialization on derived with base behavior" );
  77. equal( vwf.execute( derivedBaseBehaviorID, "this.derivedBaseBehaviorAccessor" ), "UPDATED", "derived property after initialization on derived with base behavior through accessor" );
  78. equal( vwf.execute( derivedBaseBehaviorID, "this.baseBehaviorAccessor" ), "UPDATED", "base behavior property after initialization on derived with base behavior through accessor" );
  79. equal( vwf.execute( derivedBaseBehaviorID, "this.baseAccessor" ), "UPDATED", "base property after initialization on derived with base behavior through accessor" );
  80. cleanup();
  81. start();
  82. } );
  83. } );
  84. asyncTest( "Inheritance through two behaviors", function() { // DerivedBaseBehaviorOtherBehavior implements BaseBehavior, OtherBehavior extends Base
  85. createFixture( function( doubleDerivedOtherBehaviorDerivedBaseBehaviorID,
  86. derivedID, derivedBaseBehaviorID, derivedBaseBehaviorOtherBehaviorID, derivedDerivedBehaviorID,
  87. baseID, derivedBehaviorID, baseBehaviorID, otherBehaviorID, cleanup ) {
  88. equal( vwf.execute( derivedBaseBehaviorOtherBehaviorID, "this.derivedBaseBehaviorOtherBehavior" ), "derivedBaseBehaviorOtherBehavior", "derived property visible on derived with base and other behaviors" );
  89. equal( vwf.execute( derivedBaseBehaviorOtherBehaviorID, "this.baseBehavior" ), "baseBehavior", "base behavior property visible on derived with base and other behaviors" );
  90. equal( vwf.execute( derivedBaseBehaviorOtherBehaviorID, "this.otherBehavior" ), "otherBehavior", "other behavior property visible on derived with base and other behaviors" );
  91. equal( vwf.execute( derivedBaseBehaviorOtherBehaviorID, "this.base" ), "base", "base property visible on derived with base and other behaviors" );
  92. equal( vwf.execute( derivedBaseBehaviorOtherBehaviorID, "this.derivedBaseBehaviorOtherBehaviorAccessor" ), "DERIVEDBASEBEHAVIOROTHERBEHAVIOR", "derived property visible on derived with base and other behaviors through accessor" );
  93. equal( vwf.execute( derivedBaseBehaviorOtherBehaviorID, "this.baseBehaviorAccessor" ), "BASEBEHAVIOR", "base behavior property visible on derived with base and other behaviors through accessor" );
  94. equal( vwf.execute( derivedBaseBehaviorOtherBehaviorID, "this.otherBehaviorAccessor" ), "OTHERBEHAVIOR", "other behavior property visible on derived with base and other behaviors through accessor" );
  95. equal( vwf.execute( derivedBaseBehaviorOtherBehaviorID, "this.baseAccessor" ), "BASE", "base property visible on derived with base and other behaviors through accessor" );
  96. vwf.setProperty( derivedBaseBehaviorOtherBehaviorID, "derivedBaseBehaviorOtherBehavior", "UpDaTeD" );
  97. vwf.setProperty( derivedBaseBehaviorOtherBehaviorID, "baseBehavior", "UpDaTeD" );
  98. vwf.setProperty( derivedBaseBehaviorOtherBehaviorID, "otherBehavior", "UpDaTeD" );
  99. vwf.setProperty( derivedBaseBehaviorOtherBehaviorID, "base", "UpDaTeD" );
  100. equal( vwf.execute( derivedBaseBehaviorOtherBehaviorID, "this.derivedBaseBehaviorOtherBehavior" ), "UpDaTeD", "derived property after initialization on derived with base and other behaviors" );
  101. equal( vwf.execute( derivedBaseBehaviorOtherBehaviorID, "this.baseBehavior" ), "UpDaTeD", "base behavior property after initialization on derived with base and other behaviors" );
  102. equal( vwf.execute( derivedBaseBehaviorOtherBehaviorID, "this.otherBehavior" ), "UpDaTeD", "other behavior property after initialization on derived with base and other behaviors" );
  103. equal( vwf.execute( derivedBaseBehaviorOtherBehaviorID, "this.base" ), "UpDaTeD", "base property after initialization on derived with base and other behaviors" );
  104. equal( vwf.execute( derivedBaseBehaviorOtherBehaviorID, "this.derivedBaseBehaviorOtherBehaviorAccessor" ), "UPDATED", "derived property after initialization on derived with base and other behaviors through accessor" );
  105. equal( vwf.execute( derivedBaseBehaviorOtherBehaviorID, "this.baseBehaviorAccessor" ), "UPDATED", "base behavior property after initialization on derived with base and other behaviors through accessor" );
  106. equal( vwf.execute( derivedBaseBehaviorOtherBehaviorID, "this.otherBehaviorAccessor" ), "UPDATED", "other behavior property after initialization on derived with base and other behaviors through accessor" );
  107. equal( vwf.execute( derivedBaseBehaviorOtherBehaviorID, "this.baseAccessor" ), "UPDATED", "base property after initialization on derived with base and other behaviors through accessor" );
  108. cleanup();
  109. start();
  110. } );
  111. } );
  112. asyncTest( "Inheritance through behavior with own inheritance", function() { // DerivedDerivedBehavior implements DerivedBehavior extends Base; DerivedBehavior extends BaseBehavior
  113. createFixture( function( doubleDerivedOtherBehaviorDerivedBaseBehaviorID,
  114. derivedID, derivedBaseBehaviorID, derivedBaseBehaviorOtherBehaviorID, derivedDerivedBehaviorID,
  115. baseID, derivedBehaviorID, baseBehaviorID, otherBehaviorID, cleanup ) {
  116. equal( vwf.execute( derivedDerivedBehaviorID, "this.derivedDerivedBehavior" ), "derivedDerivedBehavior", "derived property visible on derived with derived behavior" );
  117. equal( vwf.execute( derivedDerivedBehaviorID, "this.derivedBehavior" ), "derivedBehavior", "derived behavior property visible on derived with derived behavior" );
  118. equal( vwf.execute( derivedDerivedBehaviorID, "'baseBehavior' in this" ), false, "base behavior property not visible on derived with derived behavior (JavaScript binding)" );
  119. equal( vwf.getProperty( derivedDerivedBehaviorID, "baseBehavior" ), undefined, "base behavior property not visible on derived with derived behavior (kernel delegation)" );
  120. equal( vwf.execute( derivedDerivedBehaviorID, "this.base" ), "base", "base property visible on derived with derived behavior" );
  121. equal( vwf.execute( derivedDerivedBehaviorID, "this.derivedDerivedBehaviorAccessor" ), "DERIVEDDERIVEDBEHAVIOR", "derived property visible on derived with derived behavior through accessor" );
  122. equal( vwf.execute( derivedDerivedBehaviorID, "this.derivedBehaviorAccessor" ), "DERIVEDBEHAVIOR", "derived behavior property visible on derived with derived behavior through accessor" );
  123. equal( vwf.execute( derivedDerivedBehaviorID, "'baseBehaviorAccessor' in this" ), false, "base behavior property not visible on derived with derived behavior through accessor (JavaScript binding)" );
  124. // equal( vwf.getProperty( derivedDerivedBehaviorID, "baseBehaviorAccessor" ), undefined, "base behavior property not visible on derived with derived behavior through accessor (kernel delegation)" ); // TODO: would need to handle ignorePrototype in vwf.model.javascript.gettingProperty() to prevent accessor inheritance in behaviors
  125. equal( vwf.execute( derivedDerivedBehaviorID, "this.baseAccessor" ), "BASE", "base property visible on derived with derived behavior through accessor" );
  126. vwf.setProperty( derivedDerivedBehaviorID, "derivedDerivedBehavior", "UpDaTeD" );
  127. vwf.setProperty( derivedDerivedBehaviorID, "derivedBehavior", "UpDaTeD" );
  128. vwf.setProperty( derivedDerivedBehaviorID, "baseBehavior", "CrEaTeD" );
  129. vwf.setProperty( derivedDerivedBehaviorID, "base", "UpDaTeD" );
  130. equal( vwf.execute( derivedDerivedBehaviorID, "this.derivedDerivedBehavior" ), "UpDaTeD", "derived property after initialization on derived with derived behavior" );
  131. equal( vwf.execute( derivedDerivedBehaviorID, "this.derivedBehavior" ), "UpDaTeD", "derived behavior property after initialization on derived with derived behavior" );
  132. equal( vwf.execute( derivedDerivedBehaviorID, "'baseBehavior' in this" ), true, "base behavior property created on derived with derived behavior (JavaScript binding)" ); // TODO: kernel doesn't prevent this yet
  133. equal( vwf.getProperty( derivedDerivedBehaviorID, "baseBehavior" ), "CrEaTeD", "base behavior property created on derived with derived behavior (kernel delegation)" ); // TODO: kernel doesn't prevent this yet
  134. equal( vwf.execute( derivedDerivedBehaviorID, "this.base" ), "UpDaTeD", "base property after initialization on derived with derived behavior" );
  135. equal( vwf.execute( derivedDerivedBehaviorID, "this.derivedDerivedBehaviorAccessor" ), "UPDATED", "derived property after initialization on derived with derived behavior through accessor" );
  136. equal( vwf.execute( derivedDerivedBehaviorID, "this.derivedBehaviorAccessor" ), "UPDATED", "derived behavior property after initialization on derived with derived behavior through accessor" );
  137. equal( vwf.execute( derivedDerivedBehaviorID, "'baseBehaviorAccessor' in this" ), false, "base behavior property not initialized on derived with derived behavior through accessor (JavaScript binding)" );
  138. // equal( vwf.getProperty( derivedDerivedBehaviorID, "baseBehaviorAccessor" ), undefined, "base behavior property not initialized on derived with derived behavior through accessor (kernel delegation)" ); // TODO: would need to handle ignorePrototype in vwf.model.javascript.gettingProperty() to prevent accessor inheritance in behaviors
  139. equal( vwf.execute( derivedDerivedBehaviorID, "this.baseAccessor" ), "UPDATED", "base property after initialization on derived with derived behavior through accessor" );
  140. cleanup();
  141. start();
  142. } );
  143. } );
  144. asyncTest( "Multiple behavior inheritance order", function() { // DerivedBaseBehaviorOtherBehavior implements BaseBehavior, OtherBehavior extends Base
  145. createFixture( function( doubleDerivedOtherBehaviorDerivedBaseBehaviorID,
  146. derivedID, derivedBaseBehaviorID, derivedBaseBehaviorOtherBehaviorID, derivedDerivedBehaviorID,
  147. baseID, derivedBehaviorID, baseBehaviorID, otherBehaviorID, cleanup ) {
  148. vwf.createProperty( derivedBaseBehaviorOtherBehaviorID, "a", "derivedBaseBehaviorOtherBehavior" );
  149. vwf.createProperty( baseBehaviorID, "a", "baseBehavior" );
  150. vwf.createProperty( baseBehaviorID, "b", "baseBehavior" );
  151. vwf.createProperty( otherBehaviorID, "a", "otherBehavior" );
  152. vwf.createProperty( otherBehaviorID, "b", "otherBehavior" );
  153. vwf.createProperty( otherBehaviorID, "c", "otherBehavior" );
  154. vwf.createProperty( baseID, "a", "base" );
  155. vwf.createProperty( baseID, "b", "base" );
  156. vwf.createProperty( baseID, "c", "base" );
  157. vwf.createProperty( baseID, "d", "base" );
  158. equal( vwf.execute( derivedBaseBehaviorOtherBehaviorID, "this.a" ), "derivedBaseBehaviorOtherBehavior", "derived property visible above behaviors and prototype" );
  159. equal( vwf.execute( derivedBaseBehaviorOtherBehaviorID, "this.b" ), "baseBehavior", "second behavior property visible above first behavior and prototype" );
  160. equal( vwf.execute( derivedBaseBehaviorOtherBehaviorID, "this.c" ), "otherBehavior", "first behavior property visible above prototype" );
  161. equal( vwf.execute( derivedBaseBehaviorOtherBehaviorID, "this.d" ), "base", "prototype property visible" );
  162. cleanup();
  163. start();
  164. } );
  165. } );
  166. asyncTest( "Inheritance queries", function() {
  167. createFixture( function( doubleDerivedOtherBehaviorDerivedBaseBehaviorID,
  168. derivedID, derivedBaseBehaviorID, derivedBaseBehaviorOtherBehaviorID, derivedDerivedBehaviorID,
  169. baseID, derivedBehaviorID, baseBehaviorID, otherBehaviorID, cleanup ) {
  170. var protoNodeURI = require( "vwf/kernel/utility" ).protoNodeURI;
  171. // Base node.
  172. equal( vwf.prototype( baseID ), protoNodeURI, "base prototype" );
  173. deepEqual( vwf.behaviors( baseID ), [], "base behaviors" );
  174. deepEqual( vwf.prototypes( baseID ), [ protoNodeURI ], "base prototypes" );
  175. deepEqual( vwf.prototypes( baseID, true ), [ protoNodeURI ], "base prototypes with behaviors" );
  176. // Derived node without behaviors.
  177. equal( vwf.prototype( derivedID ), baseID, "derived prototype" );
  178. deepEqual( vwf.behaviors( derivedID ), [], "derived behaviors" );
  179. deepEqual( vwf.prototypes( derivedID ), [ baseID, protoNodeURI ], "derived prototypes" );
  180. deepEqual( vwf.prototypes( derivedID, true ), [ baseID, protoNodeURI ], "derived prototypes with behaviors" );
  181. // Derived node with two behaviors. A node's behaviors should be inserted before its
  182. // prototype, and the behaviors should be in descending order of inheritance.
  183. equal( vwf.prototype( derivedBaseBehaviorOtherBehaviorID ),
  184. baseID, "derived-with-behaviors prototype" );
  185. deepEqual( vwf.behaviors( derivedBaseBehaviorOtherBehaviorID ),
  186. [ otherBehaviorID, baseBehaviorID ], "derived-with-behaviors behaviors" );
  187. deepEqual( vwf.prototypes( derivedBaseBehaviorOtherBehaviorID ),
  188. [ baseID, protoNodeURI ], "derived-with-behaviors prototypes" );
  189. deepEqual( vwf.prototypes( derivedBaseBehaviorOtherBehaviorID, true ),
  190. [ baseBehaviorID, otherBehaviorID, baseID, protoNodeURI ], "derived-with-behaviors prototypes with behaviors" );
  191. // Node with a behavior derived from a derived node with a behavior. Each node's
  192. // behaviors should be inserted before their prototypes.
  193. equal( vwf.prototype( doubleDerivedOtherBehaviorDerivedBaseBehaviorID ),
  194. derivedBaseBehaviorID, "double-derived prototype" );
  195. deepEqual( vwf.behaviors( doubleDerivedOtherBehaviorDerivedBaseBehaviorID ),
  196. [ otherBehaviorID ], "double-derived behaviors" );
  197. deepEqual( vwf.prototypes( doubleDerivedOtherBehaviorDerivedBaseBehaviorID ),
  198. [ derivedBaseBehaviorID, baseID, protoNodeURI ], "double-derived prototypes" );
  199. deepEqual( vwf.prototypes( doubleDerivedOtherBehaviorDerivedBaseBehaviorID, true ),
  200. [ otherBehaviorID, derivedBaseBehaviorID, baseBehaviorID, baseID, protoNodeURI ],
  201. "double-derived prototypes with behaviors" );
  202. cleanup();
  203. start();
  204. } );
  205. } );
  206. asyncTest( "Behavior as single URI", function() {
  207. var uri = testUtility.dataURIFromDescriptor( { properties: { property: "uri" } } );
  208. vwf.createChild( 0, testUtility.uniqueName( "node" ), {
  209. implements: uri
  210. }, undefined, function( nodeID ) {
  211. var behaviorIDs = vwf.behaviors( nodeID );
  212. equal( behaviorIDs.length, 1, "one behavior created from lone specifier" );
  213. equal( vwf.getProperty( behaviorIDs[0], "property" ), "uri", "specifier recognized as URI behavior" );
  214. vwf.deleteNode( nodeID );
  215. vwf.deleteNode( behaviorIDs[0] );
  216. start();
  217. } );
  218. } );
  219. asyncTest( "Behavior as single descriptor", function() {
  220. var descriptor = { properties: { property: "descriptor" } };
  221. vwf.createChild( 0, testUtility.uniqueName( "node" ), {
  222. implements: descriptor
  223. }, undefined, function( nodeID ) {
  224. var behaviorIDs = vwf.behaviors( nodeID );
  225. equal( behaviorIDs.length, 1, "one behavior created from lone specifier" );
  226. equal( vwf.getProperty( behaviorIDs[0], "property" ), "descriptor", "specifier recognized as descriptor behavior" );
  227. vwf.deleteNode( nodeID );
  228. vwf.deleteNode( behaviorIDs[0] );
  229. start();
  230. } );
  231. } );
  232. asyncTest( "Multiple behaviors as array of URI and descriptor", function() {
  233. var uri = testUtility.dataURIFromDescriptor( { properties: { property: "uri" } } );
  234. var descriptor = { properties: { property: "descriptor" } };
  235. vwf.createChild( 0, testUtility.uniqueName( "node" ), {
  236. implements: [ uri, descriptor ]
  237. }, undefined, function( nodeID ) {
  238. var behaviorIDs = vwf.behaviors( nodeID );
  239. equal( behaviorIDs.length, 2, "multiple behaviors created from array of specifiers" );
  240. equal( vwf.getProperty( behaviorIDs[0], "property" ), "uri", "first specifier recognized as URI behavior" );
  241. equal( vwf.getProperty( behaviorIDs[1], "property" ), "descriptor", "second specifier recognized as descriptor behavior" );
  242. vwf.deleteNode( nodeID );
  243. vwf.deleteNode( behaviorIDs[0] );
  244. vwf.deleteNode( behaviorIDs[1] );
  245. start();
  246. } );
  247. } );
  248. // == Helper functions =====================================================================
  249. // Create nodes in this arrangement:
  250. //
  251. // DoubleDerivedOtherBehaviorDerivedBaseBehavior implements OtherBehavior extends DerivedBaseBehavior
  252. // (=> implements BaseBehavior extends Base)
  253. //
  254. // DerivedBaseBehavior implements BaseBehavior extends Base
  255. // DerivedBaseBehaviorOtherBehavior implements BaseBehavior, OtherBehavior extends Base
  256. // DerivedDerivedBehavior implements DerivedBehavior extends Base
  257. //
  258. // Derived extends Base
  259. // Base
  260. //
  261. // DerivedBehavior extends BaseBehavior
  262. // BaseBehavior
  263. //
  264. // OtherBehavior
  265. function createFixture( callback ) {
  266. createNode( "otherBehavior", undefined, undefined, function( otherBehaviorID ) {
  267. createNode( "baseBehavior", undefined, undefined, function( baseBehaviorID ) {
  268. createNode( "derivedBehavior", undefined, baseBehaviorID, function( derivedBehaviorID ) {
  269. createNode( "base", undefined, undefined, function( baseID ) {
  270. createNode( "derived", undefined, baseID, function( derivedID ) {
  271. createNode( "derivedBaseBehavior", [ baseBehaviorID ], baseID, function( derivedBaseBehaviorID ) {
  272. createNode( "derivedBaseBehaviorOtherBehavior", [ otherBehaviorID, baseBehaviorID ], baseID, function( derivedBaseBehaviorOtherBehaviorID ) {
  273. createNode( "derivedDerivedBehavior", [ derivedBehaviorID ], baseID, function( derivedDerivedBehaviorID ) {
  274. createNode( "doubleDerivedOtherBehaviorDerivedBaseBehavior", [ otherBehaviorID ], derivedBaseBehaviorID, function( doubleDerivedOtherBehaviorDerivedBaseBehaviorID ) {
  275. var nodes = [ doubleDerivedOtherBehaviorDerivedBaseBehaviorID,
  276. derivedID, derivedBaseBehaviorID, derivedBaseBehaviorOtherBehaviorID, derivedDerivedBehaviorID,
  277. baseID, derivedBehaviorID, baseBehaviorID, otherBehaviorID ];
  278. callback.apply( undefined, nodes.concat( function() {
  279. nodes.forEach( function( nodeID ) { vwf.deleteNode( nodeID ) } );
  280. } ) );
  281. } );
  282. } );
  283. } );
  284. } );
  285. } );
  286. } );
  287. } );
  288. } );
  289. } );
  290. }
  291. // Create a node with the given prototype and behaviors and a property of the given name
  292. // having that same name as its value. A second property wraps the first property using
  293. // accessor methods that convert to upper case on get and to lower case on set.
  294. function createNode( which, behaviors, prototype, callback /* nodeID */ ) {
  295. var descriptor = {
  296. properties: {}
  297. };
  298. descriptor.extends = prototype;
  299. descriptor.implements = behaviors;
  300. descriptor.properties[which] = which;
  301. descriptor.properties[which+"Accessor"] = {
  302. get: "return this." + which + ".toUpperCase()",
  303. set: "this." + which + " = value.toLowerCase()",
  304. };
  305. vwf.createNode( descriptor, callback );
  306. }
  307. } );
  308. } );
  309. </script>
  310. <link rel="stylesheet" type="text/css" href="qunit.css" />
  311. </head>
  312. <body>
  313. <h1 id="qunit-header">Virtual World Framework</h1>
  314. <h2 id="qunit-banner"></h2>
  315. <div id="qunit-testrunner-toolbar"></div>
  316. <h2 id="qunit-userAgent"></h2>
  317. <ol id="qunit-tests"></ol>
  318. <div id="qunit-fixture">test markup, will be hidden</div>
  319. </body>
  320. </html>