| <!DOCTYPE html> | 
| <html> | 
| <head> | 
|   <link rel='stylesheet' href='qunit/qunit.css' type='text/css'/> | 
|   <script src='../editor/lib/jquery.js'></script> | 
|   <script> | 
|     // Mock for browser.js | 
|     window.svgedit = {}; | 
|     svgedit.browser = {}; | 
|     svgedit.browser.supportsNativeTransformLists = function() { return false;} | 
|   </script> | 
|   <script type='text/javascript' src='../editor/src/svgtransformlist.js'></script> | 
|   <script type='text/javascript' src='qunit/qunit.js'></script> | 
|   <script type='text/javascript'> | 
|   $(function() { | 
|       // log function | 
|       QUnit.log = function(result, message) { | 
|         if (window.console && window.console.log) { | 
|             window.console.log(result +' :: '+ message); | 
|         } | 
|     }; | 
|   | 
|     var svgns = 'http://www.w3.org/2000/svg'; | 
|     var svgroot = document.getElementById('svgroot'); | 
|     var svgcontent, rect, circle; | 
|   | 
|     var NEAR_ZERO = 5e-6; // 0.000005, Firefox fails at higher levels of precision. | 
|     function almostEquals(a, b, msg) { | 
|         msg = msg || (a + ' did not equal ' + b); | 
|         ok(Math.abs(a - b) < NEAR_ZERO, msg); | 
|     } | 
|   | 
|     function checkOutOfBoundsException(obj, fn, arg1) { | 
|         var caughtException = false; | 
|         try { | 
|             obj[fn](arg1); | 
|         } | 
|         catch(e) { | 
|             if (e.code == 1) { | 
|                 caughtException = true; | 
|             } | 
|         } | 
|         ok(caughtException, 'Caugh an INDEX_SIZE_ERR exception'); | 
|     } | 
|   | 
|     function setUp() { | 
|         svgcontent = svgroot.appendChild(document.createElementNS(svgns, 'svg')); | 
|         rect = svgcontent.appendChild(document.createElementNS(svgns, 'rect')); | 
|         rect.id = 'r'; | 
|         circle = svgcontent.appendChild(document.createElementNS(svgns, 'circle')); | 
|         circle.id = 'c'; | 
|     } | 
|   | 
|     function tearDown() { | 
|         svgedit.transformlist.resetListMap(); | 
|         while (svgroot.hasChildNodes()) { | 
|             svgroot.removeChild(svgroot.firstChild); | 
|         } | 
|     } | 
|   | 
|     module('svgedit.svgtransformlist'); | 
|   | 
|     test('Test svgedit.transformlist package', function() { | 
|         expect(2); | 
|   | 
|         ok(svgedit.transformlist); | 
|         ok(svgedit.transformlist.getTransformList); | 
|     }); | 
|   | 
|     test('Test svgedit.transformlist.getTransformList() function', function() { | 
|         expect(4); | 
|         setUp(); | 
|   | 
|         var rxform = svgedit.transformlist.getTransformList(rect); | 
|         var cxform = svgedit.transformlist.getTransformList(circle); | 
|   | 
|         ok(rxform); | 
|         ok(cxform); | 
|         equals(typeof rxform, typeof {}); | 
|         equals(typeof cxform, typeof {}); | 
|   | 
|         tearDown(); | 
|     }); | 
|   | 
|     test('Test SVGTransformList.numberOfItems property', function() { | 
|         expect(2); | 
|         setUp(); | 
|   | 
|         var rxform = svgedit.transformlist.getTransformList(rect); | 
|   | 
|         equals(typeof rxform.numberOfItems, typeof 0); | 
|         equals(rxform.numberOfItems, 0); | 
|   | 
|         tearDown(); | 
|     }); | 
|   | 
|     test('Test SVGTransformList.initialize()', function() { | 
|         expect(6); | 
|         setUp(); | 
|   | 
|         var rxform = svgedit.transformlist.getTransformList(rect); | 
|         var cxform = svgedit.transformlist.getTransformList(circle); | 
|   | 
|         var t = svgcontent.createSVGTransform(); | 
|         ok(t); | 
|         ok(rxform.initialize); | 
|         equals(typeof rxform.initialize, typeof function(){}); | 
|         rxform.initialize(t); | 
|         equals(rxform.numberOfItems, 1); | 
|         equals(cxform.numberOfItems, 0); | 
|   | 
|         // If a transform was already in a transform list, this should | 
|         // remove it from its old list and add it to this list. | 
|         cxform.initialize(t); | 
|         // This also fails in Firefox native. | 
| //        equals(rxform.numberOfItems, 0, 'Did not remove transform from list before initializing another transformlist'); | 
|         equals(cxform.numberOfItems, 1); | 
|   | 
|         tearDown(); | 
|     }); | 
|   | 
|     test('Test SVGTransformList.appendItem() and getItem()', function() { | 
|         expect(12); | 
|         setUp(); | 
|   | 
|         var rxform = svgedit.transformlist.getTransformList(rect); | 
|         var cxform = svgedit.transformlist.getTransformList(circle); | 
|   | 
|         var t1 = svgcontent.createSVGTransform(), | 
|             t2 = svgcontent.createSVGTransform(), | 
|             t3 = svgcontent.createSVGTransform(); | 
|   | 
|         ok(rxform.appendItem); | 
|         ok(rxform.getItem); | 
|         equals(typeof rxform.appendItem, typeof function(){}); | 
|         equals(typeof rxform.getItem, typeof function(){}); | 
|   | 
|         rxform.appendItem(t1); | 
|         rxform.appendItem(t2); | 
|         rxform.appendItem(t3); | 
|   | 
|         equals(rxform.numberOfItems, 3); | 
|         var rxf = rxform.getItem(0); | 
|         equals(rxf, t1); | 
|         equals(rxform.getItem(1), t2); | 
|         equals(rxform.getItem(2), t3); | 
|   | 
|         checkOutOfBoundsException(rxform, 'getItem', -1); | 
|         checkOutOfBoundsException(rxform, 'getItem', 3); | 
|   | 
|         cxform.appendItem(t1); | 
|         // These also fail in Firefox native. | 
| //        equals(rxform.numberOfItems, 2, 'Did not remove a transform from a list before appending it to a new transformlist'); | 
| //        equals(rxform.getItem(0), t2, 'Found the wrong transform in a transformlist'); | 
| //        equals(rxform.getItem(1), t3, 'Found the wrong transform in a transformlist'); | 
|   | 
|         equals(cxform.numberOfItems, 1); | 
|         equals(cxform.getItem(0), t1); | 
|   | 
|         tearDown(); | 
|     }); | 
|   | 
|     test('Test SVGTransformList.removeItem()', function() { | 
|         expect(7); | 
|         setUp(); | 
|   | 
|         var rxform = svgedit.transformlist.getTransformList(rect); | 
|   | 
|         var t1 = svgcontent.createSVGTransform(), | 
|             t2 = svgcontent.createSVGTransform(); | 
|         ok(rxform.removeItem); | 
|         equals(typeof rxform.removeItem, typeof function(){}); | 
|         rxform.appendItem(t1); | 
|         rxform.appendItem(t2); | 
|   | 
|         var removedTransform = rxform.removeItem(0); | 
|         equals(rxform.numberOfItems, 1); | 
|         equals(removedTransform, t1); | 
|         equals(rxform.getItem(0), t2); | 
|   | 
|         checkOutOfBoundsException(rxform, 'removeItem', -1); | 
|         checkOutOfBoundsException(rxform, 'removeItem', 1); | 
|   | 
|         tearDown(); | 
|     }); | 
|   | 
|     test('Test SVGTransformList.replaceItem()', function() { | 
|         expect(8); | 
|         setUp(); | 
|   | 
|         var rxform = svgedit.transformlist.getTransformList(rect); | 
|         var cxform = svgedit.transformlist.getTransformList(circle); | 
|   | 
|         ok(rxform.replaceItem); | 
|         equals(typeof rxform.replaceItem, typeof function(){}); | 
|   | 
|         var t1 = svgcontent.createSVGTransform(), | 
|             t2 = svgcontent.createSVGTransform(), | 
|             t3 = svgcontent.createSVGTransform(); | 
|   | 
|         rxform.appendItem(t1); | 
|         rxform.appendItem(t2); | 
|         cxform.appendItem(t3); | 
|   | 
|         var newItem = rxform.replaceItem(t3, 0); | 
|         equals(rxform.numberOfItems, 2); | 
|         equals(newItem, t3); | 
|         equals(rxform.getItem(0), t3); | 
|         equals(rxform.getItem(1), t2); | 
|         // Fails in Firefox native | 
| //        equals(cxform.numberOfItems, 0); | 
|   | 
|         // test replaceItem within a list | 
|         rxform.appendItem(t1); | 
|         rxform.replaceItem(t1, 0); | 
|         // Fails in Firefox native | 
| //        equals(rxform.numberOfItems, 2); | 
|         equals(rxform.getItem(0), t1); | 
|         equals(rxform.getItem(1), t2); | 
|   | 
|         tearDown(); | 
|     }); | 
|   | 
|     test('Test SVGTransformList.insertItemBefore()', function() { | 
|         expect(10); | 
|         setUp(); | 
|   | 
|         var rxform = svgedit.transformlist.getTransformList(rect); | 
|         var cxform = svgedit.transformlist.getTransformList(circle); | 
|   | 
|         ok(rxform.insertItemBefore); | 
|         equals(typeof rxform.insertItemBefore, typeof function(){}); | 
|   | 
|         var t1 = svgcontent.createSVGTransform(), | 
|             t2 = svgcontent.createSVGTransform(), | 
|             t3 = svgcontent.createSVGTransform(); | 
|   | 
|         rxform.appendItem(t1); | 
|         rxform.appendItem(t2); | 
|         cxform.appendItem(t3); | 
|   | 
|         var newItem = rxform.insertItemBefore(t3, 0); | 
|         equals(rxform.numberOfItems, 3); | 
|         equals(newItem, t3); | 
|         equals(rxform.getItem(0), t3); | 
|         equals(rxform.getItem(1), t1); | 
|         equals(rxform.getItem(2), t2); | 
|         // Fails in Firefox native | 
| //        equals(cxform.numberOfItems, 0); | 
|   | 
|         rxform.insertItemBefore(t2, 1); | 
|         // Fails in Firefox native (they make copies of the transforms) | 
| //        equals(rxform.numberOfItems, 3); | 
|         equals(rxform.getItem(0), t3); | 
|         equals(rxform.getItem(1), t2); | 
|         equals(rxform.getItem(2), t1); | 
|         tearDown(); | 
|     }); | 
|   | 
|     test('Test SVGTransformList.init() for translate(200,100)', function() { | 
|         expect(8); | 
|         setUp(); | 
|         rect.setAttribute('transform', 'translate(200,100)'); | 
|   | 
|         var rxform = svgedit.transformlist.getTransformList(rect); | 
|         equals(1, rxform.numberOfItems); | 
|   | 
|         var translate = rxform.getItem(0); | 
|         equals(translate.type, 2); | 
|   | 
|         var m = translate.matrix; | 
|         equals(m.a, 1); | 
|         equals(m.b, 0); | 
|         equals(m.c, 0); | 
|         equals(m.d, 1); | 
|         equals(m.e, 200); | 
|         equals(m.f, 100); | 
|   | 
|         tearDown(); | 
|     }); | 
|   | 
|     test('Test SVGTransformList.init() for scale(4)', function() { | 
|         expect(8); | 
|         setUp(); | 
|         rect.setAttribute('transform', 'scale(4)'); | 
|   | 
|         var rxform = svgedit.transformlist.getTransformList(rect); | 
|         equals(1, rxform.numberOfItems); | 
|   | 
|         var scale = rxform.getItem(0); | 
|         equals(3, scale.type); | 
|   | 
|         var m = scale.matrix; | 
|         equals(m.a, 4); | 
|         equals(m.b, 0); | 
|         equals(m.c, 0); | 
|         equals(m.d, 4); | 
|         equals(m.e, 0); | 
|         equals(m.f, 0); | 
|   | 
|         tearDown(); | 
|     }); | 
|   | 
|     test('Test SVGTransformList.init() for scale(4,3)', function() { | 
|         expect(8); | 
|         setUp(); | 
|         rect.setAttribute('transform', 'scale(4,3)'); | 
|   | 
|         var rxform = svgedit.transformlist.getTransformList(rect); | 
|         equals(1, rxform.numberOfItems); | 
|   | 
|         var scale = rxform.getItem(0); | 
|         equals(3, scale.type); | 
|   | 
|         var m = scale.matrix; | 
|         equals(m.a, 4); | 
|         equals(m.b, 0); | 
|         equals(m.c, 0); | 
|         equals(m.d, 3); | 
|         equals(m.e, 0); | 
|         equals(m.f, 0); | 
|   | 
|         tearDown(); | 
|     }); | 
|   | 
|     test('Test SVGTransformList.init() for rotate(45)', function() { | 
|         expect(9); | 
|         setUp(); | 
|         rect.setAttribute('transform', 'rotate(45)'); | 
|   | 
|         var rxform = svgedit.transformlist.getTransformList(rect); | 
|         equals(1, rxform.numberOfItems); | 
|   | 
|         var rotate = rxform.getItem(0); | 
|         equals(4, rotate.type); | 
|         equals(45, rotate.angle); | 
|   | 
|         var m = rotate.matrix; | 
|         almostEquals(m.a, 1/Math.sqrt(2)); | 
|         almostEquals(m.b, 1/Math.sqrt(2)); | 
|         almostEquals(m.c, -1/Math.sqrt(2)); | 
|         almostEquals(m.d, 1/Math.sqrt(2)); | 
|         equals(m.e, 0); | 
|         equals(m.f, 0); | 
|   | 
|         tearDown(); | 
|     }); | 
|   | 
|     test('Test SVGTransformList.init() for rotate(45, 100, 200)', function() { | 
|         expect(9); | 
|         setUp(); | 
|         rect.setAttribute('transform', 'rotate(45, 100, 200)'); | 
|   | 
|         var rxform = svgedit.transformlist.getTransformList(rect); | 
|         equals(1, rxform.numberOfItems); | 
|   | 
|         var rotate = rxform.getItem(0); | 
|         equals(4, rotate.type); | 
|         equals(45, rotate.angle); | 
|   | 
|         var m = rotate.matrix; | 
|         almostEquals(m.a, 1/Math.sqrt(2)); | 
|         almostEquals(m.b, 1/Math.sqrt(2)); | 
|         almostEquals(m.c, -1/Math.sqrt(2)); | 
|         almostEquals(m.d, 1/Math.sqrt(2)); | 
|   | 
|         var r = svgcontent.createSVGMatrix(); | 
|         r.a = 1/Math.sqrt(2); r.b = 1/Math.sqrt(2); | 
|         r.c = -1/Math.sqrt(2); r.d = 1/Math.sqrt(2); | 
|   | 
|         var t = svgcontent.createSVGMatrix(); | 
|         t.e = -100; t.f = -200; | 
|   | 
|         var t_ = svgcontent.createSVGMatrix(); | 
|         t_.e = 100; t_.f = 200; | 
|   | 
|         var result = t_.multiply(r).multiply(t); | 
|   | 
|         almostEquals(m.e, result.e); | 
|         almostEquals(m.f, result.f); | 
|   | 
|         tearDown(); | 
|     }); | 
|   | 
|     test('Test SVGTransformList.init() for matrix(1, 2, 3, 4, 5, 6)', function() { | 
|         expect(8); | 
|         setUp(); | 
|         rect.setAttribute('transform', 'matrix(1,2,3,4,5,6)'); | 
|   | 
|         var rxform = svgedit.transformlist.getTransformList(rect); | 
|         equals(1, rxform.numberOfItems); | 
|   | 
|         var mt = rxform.getItem(0); | 
|         equals(1, mt.type); | 
|   | 
|         var m = mt.matrix; | 
|         equals(m.a, 1); | 
|         equals(m.b, 2); | 
|         equals(m.c, 3); | 
|         equals(m.d, 4); | 
|         equals(m.e, 5); | 
|         equals(m.f, 6); | 
|   | 
|         tearDown(); | 
|     }); | 
|   | 
|   }); | 
|   </script> | 
| </head> | 
| <body> | 
|   <h1 id='qunit-header'>Unit Tests for svgtransformlist.js</h1> | 
|   <h2 id='qunit-banner'></h2> | 
|   <h2 id='qunit-userAgent'></h2> | 
|   <ol id='qunit-tests'> | 
|   </ol> | 
|   <div id='svgroot' style='visibility:hidden'></div> | 
| </body> | 
| </html> |