properties.html 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  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 properties.
  34. ready( function() {
  35. vwf.initialize(
  36. /* models */ [ "vwf/model/javascript", "vwf/model/object" ],
  37. /* views */ [ ]
  38. );
  39. // Property inheritance and copy-on-write behavior directly to the kernel
  40. asyncTest( "Property inheritance kernel", function() {
  41. createFixtureDerivedBase( function( derivedID, baseID, cleanup ) {
  42. equal( vwf.getProperty( derivedID, "derived" ), "derived", "derived property in derived" );
  43. equal( vwf.getProperty( derivedID, "base" ), "base", "base property inherited by derived" );
  44. equal( vwf.getProperty( baseID, "derived" ), undefined, "derived property not visible in base" );
  45. equal( vwf.getProperty( baseID, "base" ), "base", "base property in base" );
  46. equal( vwf.setProperty( derivedID, "derived", "derived updated" ), "derived updated", "update derived property in derived" );
  47. equal( vwf.setProperty( derivedID, "base", "base updated" ), "base updated", "update base property in derived" );
  48. equal( vwf.getProperty( derivedID, "derived" ), "derived updated", "derived property updated in derived" );
  49. equal( vwf.getProperty( derivedID, "base" ), "base updated", "base property updated in derived" );
  50. equal( vwf.getProperty( baseID, "derived" ), undefined, "derived property unchanged in base" );
  51. equal( vwf.getProperty( baseID, "base" ), "base", "base property unchanged in base" );
  52. cleanup();
  53. start();
  54. } );
  55. } );
  56. // Property inheritance and copy-on-write behavior through JavaScript direct properties
  57. asyncTest( "Property inheritance JavaScript direct", function() {
  58. createFixtureDerivedBase( function( derivedID, baseID, cleanup ) {
  59. equal( vwf.execute( derivedID, "this.derived" ), "derived", "derived property in derived" );
  60. equal( vwf.execute( derivedID, "this.base" ), "base", "base property inherited by derived" );
  61. equal( vwf.execute( baseID, "this.derived" ), undefined, "derived property not visible in base" );
  62. equal( vwf.execute( baseID, "this.base" ), "base", "base property in base" );
  63. equal( vwf.execute( derivedID, "this.derived = 'derived updated'" ), "derived updated", "update derived property in derived" );
  64. equal( vwf.execute( derivedID, "this.base = 'base updated'" ), "base updated", "update base property in derived" );
  65. equal( vwf.execute( derivedID, "this.derived" ), "derived updated", "derived property updated in derived" );
  66. equal( vwf.execute( derivedID, "this.base" ), "base updated", "base property updated in derived" );
  67. equal( vwf.execute( baseID, "this.derived" ), undefined, "derived property unchanged in base" );
  68. equal( vwf.execute( baseID, "this.base" ), "base", "base property unchanged in base" );
  69. cleanup();
  70. start();
  71. } );
  72. } );
  73. // Property inheritance and copy-on-write behavior through JavaScript collection properties
  74. asyncTest( "Property inheritance JavaScript collection", function() {
  75. createFixtureDerivedBase( function( derivedID, baseID, cleanup ) {
  76. equal( vwf.execute( derivedID, "this.properties.derived" ), "derived", "derived property in derived" );
  77. equal( vwf.execute( derivedID, "this.properties.base" ), "base", "base property inherited by derived" );
  78. equal( vwf.execute( baseID, "this.properties.derived" ), undefined, "derived property not visible in base" );
  79. equal( vwf.execute( baseID, "this.properties.base" ), "base", "base property in base" );
  80. equal( vwf.execute( derivedID, "this.properties.derived = 'derived updated'" ), "derived updated", "update derived property in derived" );
  81. equal( vwf.execute( derivedID, "this.properties.base = 'base updated'" ), "base updated", "update base property in derived" );
  82. equal( vwf.execute( derivedID, "this.properties.derived" ), "derived updated", "derived property updated in derived" );
  83. equal( vwf.execute( derivedID, "this.properties.base" ), "base updated", "base property updated in derived" );
  84. equal( vwf.execute( baseID, "this.properties.derived" ), undefined, "derived property unchanged in base" );
  85. equal( vwf.execute( baseID, "this.properties.base" ), "base", "base property unchanged in base" );
  86. cleanup();
  87. start();
  88. } );
  89. } );
  90. // Equivalence between direct and collection properties
  91. asyncTest( "Direct and collection properties", function() {
  92. createFixtureDerivedBase( function( derivedID, baseID, cleanup ) {
  93. vwf.execute( derivedID, "this.properties.derived = { derived: 1 }" );
  94. strictEqual( vwf.execute( derivedID, "this.derived" ), vwf.execute( derivedID, "this.properties.derived" ), "derived property in collection appears on node" );
  95. vwf.execute( derivedID, "this.derived = { derived: 2 }" );
  96. strictEqual( vwf.execute( derivedID, "this.properties.derived" ), vwf.execute( derivedID, "this.derived" ), "derived property on node appears in collection" );
  97. vwf.execute( baseID, "this.properties.base = { base: 1 }" );
  98. strictEqual( vwf.execute( baseID, "this.base" ), vwf.execute( baseID, "this.properties.base" ), "base property in collection appears on node" );
  99. vwf.execute( baseID, "this.base = { base: 2 }" );
  100. strictEqual( vwf.execute( baseID, "this.properties.base" ), vwf.execute( baseID, "this.base" ), "base property on node appears in collection" );
  101. strictEqual( vwf.execute( derivedID, "this.base" ), vwf.execute( baseID, "this.base" ), "derived inherits base property on node" );
  102. strictEqual( vwf.execute( derivedID, "this.properties.base" ), vwf.execute( baseID, "this.properties.base" ), "derived inherits base property on collection" );
  103. vwf.execute( derivedID, "this.properties.base = { base: 3 }" );
  104. equal( vwf.execute( derivedID, "this.properties.base.base" ), 3, "base property updated in derived" );
  105. strictEqual( vwf.execute( derivedID, "this.base" ), vwf.execute( derivedID, "this.properties.base" ), "updated property in derived collection still appears on node" );
  106. notStrictEqual( vwf.execute( derivedID, "this.base" ), vwf.execute( baseID, "this.base" ), "updated property on derived node no longer inherits base property on node" );
  107. notStrictEqual( vwf.execute( derivedID, "this.properties.base" ), vwf.execute( baseID, "this.properties.base" ), "updated property on derived collection no longer inherits base property on collection" );
  108. cleanup();
  109. start();
  110. } );
  111. } );
  112. // == Helper functions =====================================================================
  113. // Create a node with two levels of inheritance and properties to manipulate.
  114. function createFixtureDerivedBase( callback ) {
  115. vwf.createNode( {
  116. extends:
  117. "http://vwf.example.com/node.vwf",
  118. properties: {
  119. base: "base",
  120. },
  121. }, function( baseID ) {
  122. vwf.createNode( {
  123. extends:
  124. baseID,
  125. properties: {
  126. derived: "derived",
  127. },
  128. }, function( derivedID ) {
  129. callback( derivedID, baseID, function() {
  130. vwf.deleteNode( derivedID );
  131. vwf.deleteNode( baseID );
  132. } );
  133. } );
  134. } );
  135. }
  136. } );
  137. } );
  138. </script>
  139. <link rel="stylesheet" type="text/css" href="qunit.css" />
  140. </head>
  141. <body>
  142. <h1 id="qunit-header">Virtual World Framework</h1>
  143. <h2 id="qunit-banner"></h2>
  144. <div id="qunit-testrunner-toolbar"></div>
  145. <h2 id="qunit-userAgent"></h2>
  146. <ol id="qunit-tests"></ol>
  147. <div id="qunit-fixture">test markup, will be hidden</div>
  148. </body>
  149. </html>