| // Copyright 2007 The Closure Library Authors. All Rights Reserved. |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS-IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| goog.provide('goog.dom.pattern.matcherTest'); |
| goog.setTestOnly('goog.dom.pattern.matcherTest'); |
| |
| goog.require('goog.dom'); |
| goog.require('goog.dom.pattern.EndTag'); |
| goog.require('goog.dom.pattern.FullTag'); |
| goog.require('goog.dom.pattern.Matcher'); |
| goog.require('goog.dom.pattern.Repeat'); |
| goog.require('goog.dom.pattern.Sequence'); |
| goog.require('goog.dom.pattern.StartTag'); |
| goog.require('goog.dom.pattern.callback.Counter'); |
| goog.require('goog.dom.pattern.callback.Test'); |
| goog.require('goog.iter.StopIteration'); |
| goog.require('goog.testing.jsunit'); |
| |
| function testMatcherAndStartTag() { |
| var pattern = new goog.dom.pattern.StartTag('P'); |
| |
| var counter = new goog.dom.pattern.callback.Counter(); |
| var matcher = new goog.dom.pattern.Matcher(); |
| matcher.addPattern(pattern, counter.getCallback()); |
| matcher.match(document.body); |
| |
| assertEquals('StartTag(p) should match 5 times in body', 5, |
| counter.count); |
| } |
| |
| function testMatcherAndStartTagTwice() { |
| var pattern = new goog.dom.pattern.StartTag('P'); |
| |
| var counter = new goog.dom.pattern.callback.Counter(); |
| var matcher = new goog.dom.pattern.Matcher(); |
| matcher.addPattern(pattern, counter.getCallback()); |
| matcher.match(document.body); |
| |
| assertEquals('StartTag(p) should match 5 times in body', 5, |
| counter.count); |
| |
| // Make sure no state got mangled. |
| counter.reset(); |
| matcher.match(document.body); |
| |
| assertEquals('StartTag(p) should match 5 times in body again', 5, |
| counter.count); |
| } |
| |
| function testMatcherAndStartTagAttributes() { |
| var pattern = new goog.dom.pattern.StartTag('SPAN', {id: /./}); |
| |
| var counter = new goog.dom.pattern.callback.Counter(); |
| var matcher = new goog.dom.pattern.Matcher(); |
| matcher.addPattern(pattern, counter.getCallback()); |
| matcher.match(document.body); |
| |
| assertEquals('StartTag(span,id) should match 2 times in body', 2, |
| counter.count); |
| } |
| |
| function testMatcherWithTwoPatterns() { |
| var pattern1 = new goog.dom.pattern.StartTag('SPAN'); |
| var pattern2 = new goog.dom.pattern.StartTag('P'); |
| |
| var counter = new goog.dom.pattern.callback.Counter(); |
| |
| var matcher = new goog.dom.pattern.Matcher(); |
| matcher.addPattern(pattern1, counter.getCallback()); |
| matcher.addPattern(pattern2, counter.getCallback()); |
| |
| matcher.match(document.body); |
| |
| assertEquals('StartTag(span|p) should match 8 times in body', 8, |
| counter.count); |
| } |
| |
| function testMatcherWithQuit() { |
| var pattern1 = new goog.dom.pattern.StartTag('SPAN'); |
| var pattern2 = new goog.dom.pattern.StartTag('P'); |
| |
| var count = 0; |
| var callback = function(node, position) { |
| if (node.nodeName == 'SPAN') { |
| throw goog.iter.StopIteration; |
| return true; |
| } |
| count++; |
| }; |
| |
| var matcher = new goog.dom.pattern.Matcher(); |
| matcher.addPattern(pattern1, callback); |
| matcher.addPattern(pattern2, callback); |
| |
| matcher.match(document.body); |
| |
| assertEquals('Stopped span|p should match 1 time in body', 1, count); |
| } |
| |
| function testMatcherWithReplace() { |
| var pattern1 = new goog.dom.pattern.StartTag('B'); |
| var pattern2 = new goog.dom.pattern.StartTag('I'); |
| |
| var count = 0; |
| var callback = function(node, position) { |
| count++; |
| if (node.nodeName == 'B') { |
| var i = goog.dom.createDom('I'); |
| node.parentNode.insertBefore(i, node); |
| goog.dom.removeNode(node); |
| |
| position.setPosition(i); |
| |
| return true; |
| } |
| }; |
| |
| var matcher = new goog.dom.pattern.Matcher(); |
| matcher.addPattern(pattern1, callback); |
| matcher.addPattern(pattern2, callback); |
| |
| matcher.match(goog.dom.getElement('div1')); |
| |
| assertEquals('i|b->i should match 5 times in div1', 5, count); |
| } |
| |
| function testMatcherAndFullTag() { |
| var pattern = new goog.dom.pattern.FullTag('P'); |
| |
| var test = new goog.dom.pattern.callback.Test(); |
| |
| var matcher = new goog.dom.pattern.Matcher(); |
| matcher.addPattern(pattern, test.getCallback()); |
| |
| matcher.match(goog.dom.getElement('p1')); |
| |
| assert('FullTag(p) should match on p1', test.matched); |
| |
| test.reset(); |
| matcher.match(goog.dom.getElement('div1')); |
| |
| assert('FullTag(p) should not match on div1', !test.matched); |
| } |
| |
| function testMatcherAndSequence() { |
| var pattern = new goog.dom.pattern.Sequence([ |
| new goog.dom.pattern.StartTag('P'), |
| new goog.dom.pattern.StartTag('SPAN'), |
| new goog.dom.pattern.EndTag('SPAN'), |
| new goog.dom.pattern.EndTag('P') |
| ], true); |
| |
| var counter = new goog.dom.pattern.callback.Counter(); |
| var matcher = new goog.dom.pattern.Matcher(); |
| matcher.addPattern(pattern, counter.getCallback()); |
| matcher.match(document.body); |
| |
| assertEquals('Sequence should match 1 times in body', 1, counter.count); |
| } |
| |
| function testMatcherAndRepeatFullTag() { |
| var pattern = new goog.dom.pattern.Repeat( |
| new goog.dom.pattern.FullTag('P'), 1); |
| |
| var count = 0; |
| var tcount = 0; |
| var matcher = new goog.dom.pattern.Matcher(); |
| matcher.addPattern(pattern, function() { |
| count++; |
| tcount += pattern.count; |
| }); |
| matcher.match(document.body); |
| |
| assertEquals('Repeated p should match 2 times in body', 2, count); |
| assertEquals('Repeated p should match 5 total times in body', 5, tcount); |
| } |