mediawiki-extensions-Visual.../modules/ve/test/index.html
Timo Tijhof c8ed44fb07 Refactor ve.getHash: Stabilize cross-browser differences; + unit tests
* Replaces c8b4a28936

* Use Object() casting to detect objects instead of .constructor
  (or instanceof). Both .constructor and instanceof compare by reference
  the type "Object" which means if the object comes from another window
  (where there is a different "Object" and "Object.prototype") it will
  drop out of the system and go freewack.

  Theory: If a variable casted to an object returns true when strictly compared
  to the original, the input must be an object.

  Which is true. It doesn't change the inheritance, it doesn't make it inherit
  from this window's Object if the object is from another window's object. All it
  does is cast to an object if not an object already.
  So e.g. "Object(5) !== 5" because 5 is a primitive value as opposed to an instance
  of Number.
  And contrary to "typeof", it doesn't return true for "null".

* .constructor also has the problem that it only works this way if the
  input is a plain object. e.g. a simple construtor function that creates
  an object also get in the wrong side of the if/else case since it is
  an instance of Object, but not directly (rather indirectly via another
  constructor).

* Added unit tests for basic getHash usage, as well as regression tests
  against the above two mentioned problems (these tests fail before this commit).

* While at it, also improved other utilities a bit.
 - Use hasOwnProperty instead of casting to boolean
   when checking for presence of native support.
   Thanks to Douglas Crockford for that tip.
 - Fix documentation for ve.getHash: Parameter is not named "obj".
 - Add Object-check to ve.getObjectKeys per ES5 Object.keys spec (to match native behavior)
 - Add Object-check to ve.getObjectValues to match ve.getObjectKeys
 - Improved performance of ve.getObjectKeys shim. Tried several potential optimizations
   and compared with jsperf. Using a "static" reference to hasOwn improves performance
   (by not having to look it up 4 scopes up and 3 property levels deep).
   Also using [.length] instead of .push() shared off a few ms.
 - Added unit tests for ve.getObjectValues

Change-Id: If24d09405321f201c67f7df75d332bb1171c8a36
2012-08-27 00:14:02 +02:00

125 lines
5.7 KiB
HTML

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>VisualEditor Tests</title>
<!-- Load test framework -->
<link rel="stylesheet" href="../../qunit/qunit.css">
<script src="../../qunit/qunit.js"></script>
<!-- Load application depenencies -->
<script src="../../jquery/jquery.js"></script>
<script src="../../jquery/jquery.json.js"></script>
<!-- Load application -->
<!-- ext.visualEditor.base -->
<script src="../ve.js"></script>
<script src="../ve.EventEmitter.js"></script>
<script src="../init/ve.init.js"></script>
<script src="../init/ve.init.Platform.js"></script>
<script src="../ve.debug.js"></script>
<!-- ext.visualEditor.core -->
<script src="../ve.Factory.js"></script>
<script src="../ve.Position.js"></script>
<script src="../ve.Range.js"></script>
<script src="../ve.Node.js"></script>
<script src="../ve.BranchNode.js"></script>
<script src="../ve.LeafNode.js"></script>
<script src="../ve.Surface.js"></script>
<script src="../ve.Document.js"></script>
<script src="../dm/ve.dm.js"></script>
<script src="../dm/ve.dm.NodeFactory.js"></script>
<script src="../dm/ve.dm.AnnotationFactory.js"></script>
<script src="../dm/ve.dm.Node.js"></script>
<script src="../dm/ve.dm.BranchNode.js"></script>
<script src="../dm/ve.dm.LeafNode.js"></script>
<script src="../dm/ve.dm.Annotation.js"></script>
<script src="../dm/ve.dm.Document.js"></script>
<script src="../dm/ve.dm.DocumentSynchronizer.js"></script>
<script src="../dm/ve.dm.Transaction.js"></script>
<script src="../dm/ve.dm.TransactionProcessor.js"></script>
<script src="../dm/ve.dm.Surface.js"></script>
<script src="../dm/ve.dm.SurfaceFragment.js"></script>
<script src="../dm/ve.dm.Converter.js"></script>
<script src="../dm/annotations/ve.dm.LinkAnnotation.js"></script>
<script src="../dm/annotations/ve.dm.TextStyleAnnotation.js"></script>
<script src="../dm/nodes/ve.dm.AlienInlineNode.js"></script>
<script src="../dm/nodes/ve.dm.AlienBlockNode.js"></script>
<script src="../dm/nodes/ve.dm.BreakNode.js"></script>
<script src="../dm/nodes/ve.dm.DefinitionListNode.js"></script>
<script src="../dm/nodes/ve.dm.DefinitionListItemNode.js"></script>
<script src="../dm/nodes/ve.dm.DocumentNode.js"></script>
<script src="../dm/nodes/ve.dm.HeadingNode.js"></script>
<script src="../dm/nodes/ve.dm.ImageNode.js"></script>
<script src="../dm/nodes/ve.dm.ListItemNode.js"></script>
<script src="../dm/nodes/ve.dm.ListNode.js"></script>
<script src="../dm/nodes/ve.dm.ParagraphNode.js"></script>
<script src="../dm/nodes/ve.dm.PreformattedNode.js"></script>
<script src="../dm/nodes/ve.dm.TableCellNode.js"></script>
<script src="../dm/nodes/ve.dm.TableNode.js"></script>
<script src="../dm/nodes/ve.dm.TableRowNode.js"></script>
<script src="../dm/nodes/ve.dm.TableSectionNode.js"></script>
<script src="../dm/nodes/ve.dm.TextNode.js"></script>
<script src="../ce/ve.ce.js"></script>
<script src="../ce/ve.ce.NodeFactory.js"></script>
<script src="../ce/ve.ce.Document.js"></script>
<script src="../ce/ve.ce.Node.js"></script>
<script src="../ce/ve.ce.BranchNode.js"></script>
<script src="../ce/ve.ce.LeafNode.js"></script>
<script src="../ce/nodes/ve.ce.AlienInlineNode.js"></script>
<script src="../ce/nodes/ve.ce.AlienBlockNode.js"></script>
<script src="../ce/nodes/ve.ce.BreakNode.js"></script>
<script src="../ce/nodes/ve.ce.DefinitionListNode.js"></script>
<script src="../ce/nodes/ve.ce.DefinitionListItemNode.js"></script>
<script src="../ce/nodes/ve.ce.DocumentNode.js"></script>
<script src="../ce/nodes/ve.ce.HeadingNode.js"></script>
<script src="../ce/nodes/ve.ce.ImageNode.js"></script>
<script src="../ce/nodes/ve.ce.ListItemNode.js"></script>
<script src="../ce/nodes/ve.ce.ListNode.js"></script>
<script src="../ce/nodes/ve.ce.ParagraphNode.js"></script>
<script src="../ce/nodes/ve.ce.PreformattedNode.js"></script>
<script src="../ce/nodes/ve.ce.TableCellNode.js"></script>
<script src="../ce/nodes/ve.ce.TableNode.js"></script>
<script src="../ce/nodes/ve.ce.TableSectionNode.js"></script>
<script src="../ce/nodes/ve.ce.TableRowNode.js"></script>
<script src="../ce/nodes/ve.ce.TextNode.js"></script>
<!-- Load plugins for test framework -->
<script src="ve.qunit.js"></script>
<!-- Load test suites -->
<script src="ve.test.js"></script>
<script src="ve.example.js"></script>
<script src="ve.Document.test.js"></script>
<script src="ve.Node.test.js"></script>
<script src="ve.BranchNode.test.js"></script>
<script src="ve.LeafNode.test.js"></script>
<script src="ve.Factory.test.js"></script>
<script src="dm/ve.dm.example.js"></script>
<script src="dm/ve.dm.NodeFactory.test.js"></script>
<script src="dm/ve.dm.Node.test.js"></script>
<script src="dm/ve.dm.Converter.test.js"></script>
<script src="dm/ve.dm.BranchNode.test.js"></script>
<script src="dm/ve.dm.LeafNode.test.js"></script>
<script src="dm/nodes/ve.dm.TextNode.test.js"></script>
<script src="dm/ve.dm.Document.test.js"></script>
<script src="dm/ve.dm.DocumentSynchronizer.test.js"></script>
<script src="dm/ve.dm.Transaction.test.js"></script>
<script src="dm/ve.dm.TransactionProcessor.test.js"></script>
<script src="dm/ve.dm.Surface.test.js"></script>
<script src="dm/ve.dm.SurfaceFragment.test.js"></script>
<script src="ce/ve.ce.test.js"></script>
<script src="ce/ve.ce.Document.test.js"></script>
<script src="ce/ve.ce.NodeFactory.test.js"></script>
<script src="ce/ve.ce.Node.test.js"></script>
<script src="ce/ve.ce.BranchNode.test.js"></script>
<script src="ce/ve.ce.LeafNode.test.js"></script>
<script src="ce/nodes/ve.ce.TextNode.test.js"></script>
</head>
<body>
<div id="qunit"></div>
<div id="qunit-fixture">test markup</div>
</body>
</html>