Annotation of kupuMPIWG/tests/test_kupuhelpers.js, revision 1.1

1.1     ! dwinter     1: /*****************************************************************************
        !             2:  *
        !             3:  * Copyright (c) 2003-2005 Kupu Contributors. All rights reserved.
        !             4:  *
        !             5:  * This software is distributed under the terms of the Kupu
        !             6:  * License. See LICENSE.txt for license text. For a list of Kupu
        !             7:  * Contributors see CREDITS.txt.
        !             8:  *
        !             9:  *****************************************************************************/
        !            10: 
        !            11: // $Id: test_kupuhelpers.js 9982 2005-03-21 09:53:57Z yuppie $
        !            12: 
        !            13: function SelectionTestCase() {
        !            14: 
        !            15:     this.assertEquals = function(var1, var2, message) {
        !            16:         /* assert whether 2 vars have the same value */
        !            17:         // XXX: this should be removed again when issue 188 is resolved
        !            18:         // toSource() of Mozilla objects returns always the same
        !            19:         if (!message)  {
        !            20:             message = '';
        !            21:         } else {
        !            22:             message = "'" + message + "' ";
        !            23:         }
        !            24:         if (var1 != var2) {
        !            25:             throw('Assertion '+message+'failed: ' + var1 + ' != ' + var2);
        !            26:         };
        !            27:     };
        !            28: 
        !            29:     var visibleEmptyElements = new Array('IMG', 'BR', 'HR');
        !            30:     var blockElements = new Array('P', 'DIV');
        !            31: 
        !            32:     this.setUp = function() {
        !            33:         var iframe = document.getElementById('iframe');
        !            34:         this.doc = iframe.contentWindow.document;
        !            35:         this.body = this.doc.getElementsByTagName('body')[0];
        !            36:         this.kupudoc = new KupuDocument(iframe);
        !            37:         this.selection = this.kupudoc.getSelection();
        !            38:         this.kupudoc.getWindow().focus();
        !            39:     };
        !            40: 
        !            41:     this._MozillaPosition = function(element, offset, lastnode) {
        !            42:         // this does not skip invisible whitespace
        !            43:         var node = element.firstChild;
        !            44:         for (var i=0; i < element.childNodes.length; i++) {
        !            45:             if (node.nodeType == node.TEXT_NODE) {
        !            46:                 var endcounts = !node.nextSibling &&
        !            47:                          blockElements.contains(element.tagName.toUpperCase());
        !            48:                 if ((offset < node.length) ||
        !            49:                     ((offset == node.length) && (!lastnode || endcounts))) {
        !            50:                     return [node, offset];
        !            51:                 };
        !            52:                 if (endcounts) {
        !            53:                     offset -= 1;
        !            54:                 };
        !            55:                 offset -= node.length;
        !            56:             } else if (node.nodeType == node.ELEMENT_NODE) {
        !            57:                 if (visibleEmptyElements.contains(node.tagName.toUpperCase())) {
        !            58:                     if (offset > 0 && !node.nextSibling) {
        !            59:                         offset -= 1;
        !            60:                         i += 1;
        !            61:                     };
        !            62:                     if (offset == 0) {
        !            63:                         return [element, i];
        !            64:                     };
        !            65:                     offset -= 1;
        !            66:                 } else {
        !            67:                     position = this._MozillaPosition(node, offset, lastnode);
        !            68:                     if (position[0]) {
        !            69:                         return position;
        !            70:                     };
        !            71:                     offset = position[1];
        !            72:                 };
        !            73:             };
        !            74:             node = node.nextSibling;
        !            75:         };
        !            76:         return [node, offset];
        !            77:     };
        !            78: 
        !            79:     this._setSelection = function(startOffset, startNextNode, endOffset,
        !            80:                                      endNextNode, verificationString) {
        !            81:         var element = this.body;
        !            82:         var innerSelection = this.selection.selection;
        !            83:         if (_SARISSA_IS_IE) {
        !            84:             var range = innerSelection.createRange();
        !            85:             var endrange = innerSelection.createRange();
        !            86:             range.moveToElementText(element);
        !            87:             range.moveStart('character', startOffset);
        !            88:             endrange.moveToElementText(element);
        !            89:             endrange.moveStart('character', endOffset);
        !            90:             range.setEndPoint('EndToStart', endrange);
        !            91:             range.select();
        !            92:         } else {
        !            93:             var position = this._MozillaPosition(element, startOffset,
        !            94:                                                  startNextNode);
        !            95:             innerSelection.collapse(position[0], position[1]);
        !            96:             if (startOffset != endOffset) {
        !            97:                 var position = this._MozillaPosition(element, endOffset,
        !            98:                                                      endNextNode);
        !            99:                 innerSelection.extend(position[0], position[1]);
        !           100:             };
        !           101:         };
        !           102:         this.assertEquals('"'+this.selection.toString().replace(/\r|\n/g, '')+'"',
        !           103:                           '"'+verificationString+'"');
        !           104:     };
        !           105: 
        !           106:     this._cleanHtml = function(s) {
        !           107:         s = s.toLowerCase().replace(/[\r\n]/g, "");
        !           108:         s = s.replace(/\>[ ]+\</g, "><");
        !           109:         return s;
        !           110:     };
        !           111: 
        !           112:     this.tearDown = function() {
        !           113:         this.body.innerHTML = '';
        !           114:     };
        !           115: };
        !           116: 
        !           117: SelectionTestCase.prototype = new TestCase;
        !           118: 
        !           119: function KupuHelpersTestCase() {
        !           120:     this.name = 'KupuHelpersTestCase';
        !           121: 
        !           122:     this.setUp = function() {
        !           123:         var iframe = document.getElementById('iframe');
        !           124:         this.doc = iframe.contentWindow.document;
        !           125:         this.body = this.doc.getElementsByTagName('body')[0];
        !           126:         this._testdiv = document.getElementById('testdiv');
        !           127:     };
        !           128:         
        !           129:     this.testSelectSelectItem = function() {
        !           130:         var select = this.doc.createElement('select');
        !           131:         this.body.appendChild(select);
        !           132:         var option = this.doc.createElement('option');
        !           133:         option.value = 'foo';
        !           134:         select.appendChild(option);
        !           135:         var option2 = this.doc.createElement('option');
        !           136:         option2.value = 'bar';
        !           137:         select.appendChild(option2);
        !           138: 
        !           139:         this.assertEquals(select.selectedIndex, 0);
        !           140:         var ret = selectSelectItem(select, 'bar');
        !           141:         this.assertEquals(select.selectedIndex, 1);
        !           142:         var ret = selectSelectItem(select, 'baz');
        !           143:         this.assertEquals(select.selectedIndex, 0);
        !           144:     };
        !           145: 
        !           146:     this.testArrayContains = function() {
        !           147:         var array = new Array(1, 2, 3);
        !           148:         this.assert(array.contains(1));
        !           149:         this.assert(array.contains(2));
        !           150:         this.assertFalse(array.contains(4));
        !           151:         this.assert(array.contains('1'));
        !           152:         this.assertFalse(array.contains('1', 1));
        !           153:     };
        !           154: 
        !           155:     this.testStringStrip = function() {
        !           156:         // an empty string
        !           157:         var str = "";
        !           158:         this.assertEquals(str.strip(), str);
        !           159:         // a string only containg whitespace
        !           160:         str = " \n  \t ";
        !           161:         this.assertEquals(str.strip(), "");
        !           162:         // a string not containg any whitespaces
        !           163:         str = "foo"
        !           164:         this.assertEquals(str.strip(), str);
        !           165:         // a word wrapped around whitespace
        !           166:         str = "\n  foo \t  ";
        !           167:         // a single character wrapped in whitespace
        !           168:         str = "\n\t a \t\n";
        !           169:         this.assertEquals(str.strip(), "a");
        !           170:         // a string containing whitespace in the middle
        !           171:         str = "foo bar baz";
        !           172:         this.assertEquals(str.strip(), str);
        !           173:         // a string containing spaces around it and in it
        !           174:         str = " \t  foo bar\n baz  ";
        !           175:         this.assertEquals(str.strip(), "foo bar\n baz");
        !           176:         str = "  tu quoque Brute filie mee  ";
        !           177:         this.assertEquals(str.strip(), "tu quoque Brute filie mee");
        !           178:     };
        !           179: 
        !           180:     this.testLoadDictFromXML = function() {
        !           181:         var dict = loadDictFromXML(document, 'xmlisland');
        !           182:         this.assertEquals(dict['foo'], 'bar');
        !           183:         this.assertEquals(dict['sna'], 'fu');
        !           184:         for (var attr in dict) {
        !           185:             this.assert(attr == 'foo' || attr == 'sna' || 
        !           186:                             attr == 'some_int' || attr == 'nested' ||
        !           187:                             attr == 'list');
        !           188:         };
        !           189:         this.assertEquals(dict['some_int'], 1);
        !           190:         this.assertEquals(dict['nested']['foo'], 'bar');
        !           191:         this.assertEquals(dict['list'][0], 0);
        !           192:         this.assertEquals(dict['list'].length, 2);
        !           193:     };
        !           194: 
        !           195:     this.testGetFromSelector = function() {
        !           196:         data = '<div><span id="xspan" class="xyzzy"></span></div>';
        !           197:         this._testdiv.innerHTML = data;
        !           198:         node = getFromSelector("xspan");
        !           199:         this.assertEquals(node && node.id, "xspan");
        !           200:         node = getFromSelector("#testdiv span.xyzzy");
        !           201:         this.assertEquals(node && node.id, "xspan");
        !           202:         data = '<div><button class="xyzzy"></button><span id="xspan" class="foo xyzzy bar"></span></div>';
        !           203:         this._testdiv.innerHTML = data;
        !           204:         node = getFromSelector("#testdiv span.xyzzy");
        !           205:         this.assertEquals(node && node.id, "xspan");
        !           206:     };
        !           207: 
        !           208:     this.tearDown = function() {
        !           209:         this.body.innerHTML = '';
        !           210:         this._testdiv.innerHTML = '';
        !           211:     };
        !           212: };
        !           213: 
        !           214: KupuHelpersTestCase.prototype = new TestCase;
        !           215: 
        !           216: function KupuSelectionTestCase() {
        !           217: 
        !           218:     this.testReplaceWithNode = function() {
        !           219:         this.body.innerHTML = '<p>foo bar baz</p>';
        !           220:         // select                    |bar|
        !           221:         this._setSelection(4, null, 7, null, 'bar');
        !           222:         node = this.doc.createElement('img');
        !           223:         this.selection.replaceWithNode(node, true);
        !           224:         this.assertEquals(this.body.innerHTML.toLowerCase(), '<p>foo <img> baz</p>');
        !           225:     };
        !           226: 
        !           227:     this.testReplaceWithNodeTwice = function() {
        !           228:         this.body.innerHTML = '<p>foo bar baz</p>';
        !           229:         // select                    |bar|
        !           230:         this._setSelection(4, null, 7, null, 'bar');
        !           231:         node = this.doc.createElement('img');
        !           232:         this.selection.replaceWithNode(node, true);
        !           233:         this.selection.replaceWithNode(node, true);
        !           234:         this.assertEquals(this.body.innerHTML.toLowerCase(), '<p>foo <img> baz</p>');
        !           235:     };
        !           236: 
        !           237:     this.testParentElementMissing = function() {
        !           238:         this.body.innerHTML = '<p>foo <b>bar</b><img><img> baz</p>';
        !           239:         // remove selection
        !           240:         var selection = this.selection.selection;
        !           241:         _SARISSA_IS_IE ? selection.empty() : selection.removeAllRanges();
        !           242:         node = this.doc.getElementsByTagName('p')[0];
        !           243:         this.assertEquals(this.selection.parentElement(), node);
        !           244:     };
        !           245: 
        !           246:     this.testParentElementBold = function() {
        !           247:         this.body.innerHTML = '<p>foo <b>bar</b><img/><img/> baz</p>';
        !           248:         // select                       |bar|
        !           249:         this._setSelection(4, true, 7, false, 'bar');
        !           250:         node = this.doc.getElementsByTagName('b')[0];
        !           251:         this.assertEquals(this.selection.parentElement(), node);
        !           252:     };
        !           253: 
        !           254:     this.testParentElementImg = function() {
        !           255:         this.body.innerHTML = '<p>foo <b>bar</b><img/><img/> baz</p>';
        !           256:         // select                              |<img/>|
        !           257:         this._setSelection(7, true, 8, false, '');
        !           258:         node = this.doc.getElementsByTagName('img')[0];
        !           259:         this.assertEquals(this.selection.parentElement(), node);
        !           260:     };
        !           261: 
        !           262:     this.testParentElementImgSpecial = function() {
        !           263:         this.body.innerHTML = '<p>foo <a><img/></a></p>';
        !           264:         // select                       |<img/>|
        !           265:         this._setSelection(4, true, 5, null, '');
        !           266:         node = this.doc.getElementsByTagName('img')[0];
        !           267:         foo = this.selection.parentElement();
        !           268:         this.assertEquals(this.selection.parentElement(), node);
        !           269:     };
        !           270: 
        !           271:     this.testParentElementMixed = function() {
        !           272:         this.body.innerHTML = '<p>foo <b>bar</b><img><img> baz</p>';
        !           273:         // select                        |ar</b><img><img> b|
        !           274:         this._setSelection(5, null, 11, null, 'ar b');
        !           275:         node = this.doc.getElementsByTagName('p')[0];
        !           276:         this.assertEquals(this.selection.parentElement(), node);
        !           277:     };
        !           278: 
        !           279:     this.testParentElement_r9516 = function() {
        !           280:         this.body.innerHTML = '<p>foo <b>bar</b><img/></p><p>baz</p>';
        !           281:         // select                              |<img/></p><p>baz|
        !           282:         this._setSelection(7, true, 12, false, 'baz');
        !           283:         node = this.doc.getElementsByTagName('body')[0];
        !           284:         this.assertEquals(this.selection.parentElement(), node);
        !           285:     };
        !           286: 
        !           287:     this.testGetContentLength = function() {
        !           288:         this.body.innerHTML = '<p>foo bar baz</p>';
        !           289:         // select                    |bar|
        !           290:         this._setSelection(4, null, 7, null, 'bar');
        !           291:         this.assertEquals(this.selection.getContentLength(), 3);
        !           292:     };
        !           293: 
        !           294:     this.testToString = function() {
        !           295:         this.body.innerHTML = '<p>foo <b>bar</b> baz</p>';
        !           296:         var selection = this.kupudoc.getSelection();
        !           297:         selection.selectNodeContents(this.body);
        !           298:         this.assertEquals(selection.toString(), 'foo bar baz');
        !           299:         selection.selectNodeContents(this.body.firstChild.childNodes[1]);
        !           300:         this.assertEquals(selection.toString(), 'bar');
        !           301:     };
        !           302: };
        !           303: 
        !           304: KupuSelectionTestCase.prototype = new SelectionTestCase;

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>