aboutsummaryrefslogtreecommitdiff
path: root/contexts/data/lib/closure-library/closure/goog/dom/textrangeiterator_test.html
blob: 028b77142fd8b0131119ae35ecbe85574fd3f9f3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
<!DOCTYPE html>
<html>
<!--
Copyright 2008 The Closure Library Authors. All Rights Reserved.

Use of this source code is governed by the Apache License, Version 2.0.
See the COPYING file for details.
-->
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>goog.dom.TextRangeIterator Tests</title>
<script src="../base.js"></script>
<script>
  goog.require('goog.dom');
  goog.require('goog.dom.TagName');
  goog.require('goog.dom.TextRangeIterator');
  goog.require('goog.testing.dom');
  goog.require('goog.testing.jsunit');
</script>
</head>
<body>

<!--
  The next line goes past 80 characters to avoid ambiguity with
  newlines as text nodes
-->
<div id="test"><a href="#" id="a1">T<b id="b1">e</b>xt</a><span id="span1"></span><p id="p1">Text</p></div>
<ul id="test2">foo<br>bar</ul>

<script>
  var test = goog.dom.getElement('test');
  var test2 = goog.dom.getElement('test2');

  function testBasic() {
    goog.testing.dom.assertNodesMatch(
        new goog.dom.TextRangeIterator(test, 0, test, 2),
        ['#a1', 'T', '#b1', 'e', '#b1', 'xt', '#a1', '#span1',
          '#span1', '#p1']);
  }

  function testAdjustStart() {
    var iterator = new goog.dom.TextRangeIterator(test, 0, test, 2);
    iterator.setStartNode(goog.dom.getElement('span1'));

    goog.testing.dom.assertNodesMatch(iterator,
        ['#span1', '#span1', '#p1']);
  }

  function testAdjustEnd() {
    var iterator = new goog.dom.TextRangeIterator(test, 0, test, 2);
    iterator.setEndNode(goog.dom.getElement('span1'));

    goog.testing.dom.assertNodesMatch(iterator,
        ['#a1', 'T', '#b1', 'e', '#b1', 'xt', '#a1', '#span1']);
  }

  function testOffsets() {
    var iterator = new goog.dom.TextRangeIterator(test2.firstChild, 1,
        test2.lastChild, 2);

    // foo
    var node = iterator.next();
    assertEquals('Should have start offset at iteration step 1', 1,
        iterator.getStartTextOffset());
    assertEquals('Should not have end offset at iteration step 1',
        node.nodeValue.length, iterator.getEndTextOffset());

    // <br>
    node = iterator.next();
    assertEquals('Should not have start offset at iteration step 2', -1,
        iterator.getStartTextOffset());
    assertEquals('Should not have end offset at iteration step 2', -1,
        iterator.getEndTextOffset());

    // </br>
    node = iterator.next();
    assertEquals('Should not have start offset at iteration step 3', -1,
        iterator.getStartTextOffset());
    assertEquals('Should not have end offset at iteration step 3', -1,
        iterator.getEndTextOffset());

    // bar
    node = iterator.next();
    assertEquals('Should not have start offset at iteration step 4', 0,
        iterator.getStartTextOffset());
    assertEquals('Should have end offset at iteration step 4', 2,
        iterator.getEndTextOffset());
  }

  function testSingleNodeOffsets() {
    var iterator = new goog.dom.TextRangeIterator(test2.firstChild, 1,
        test2.firstChild, 2);

    iterator.next();
    assertEquals('Should have start offset', 1, iterator.getStartTextOffset());
    assertEquals('Should have end offset', 2, iterator.getEndTextOffset());
  }

  function testEndNodeOffsetAtEnd() {
    var iterator = new goog.dom.TextRangeIterator(
        goog.dom.getElement('b1').firstChild, 0, goog.dom.getElement('b1'), 1);
    goog.testing.dom.assertNodesMatch(iterator, ['e', '#b1']);
  }

  function testSkipTagDoesNotSkipEnd() {
    // Iterate over 'Tex'.
    var iterator = new goog.dom.TextRangeIterator(
        test.firstChild.firstChild, 0,
        test.firstChild.lastChild, 1);

    var node = iterator.next();
    assertEquals('T', node.nodeValue);

    node = iterator.next();
    assertEquals(goog.dom.TagName.B, node.tagName);

    iterator.skipTag();

    node = iterator.next();
    assertEquals('xt', node.nodeValue);
  }

  function testSkipTagSkipsEnd() {
    // Iterate over 'Te'.
    var iterator = new goog.dom.TextRangeIterator(
        test.firstChild.firstChild, 0,
        test.getElementsByTagName(goog.dom.TagName.B)[0].firstChild, 1);

    var node = iterator.next();
    assertEquals('T', node.nodeValue);

    node = iterator.next();
    assertEquals(goog.dom.TagName.B, node.tagName);

    var ex = assertThrows('Should stop iteration when skipping B', function() {
      iterator.skipTag();
    });
    assertEquals(goog.iter.StopIteration, ex);
  }
</script>
</body>
</html>