Annotation of kupuMPIWG/tests/test_kupuhelpers.js, revision 1.1.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>