| package groovy.xml.dom |
| |
| import groovy.xml.* |
| import org.codehaus.groovy.sandbox.markup.* |
| import org.codehaus.groovy.tools.xml.* |
| |
| class DOMTest extends GroovyTestCase { |
| def benchmark = false |
| |
| void testDOMParser() { |
| def xml = new StringReader("<html><head><title class='mytitle'>Test</title></head><body><p class='mystyle'>This is a test.</p></body></html>") |
| def doc = DOMBuilder.parse(xml) |
| def html = doc.documentElement |
| if (!benchmark) assertCorrect html |
| } |
| |
| void testDOMBuilder() { |
| def html = DOMBuilder.newInstance(). |
| html { |
| head { |
| title (class:"mytitle", "Test") |
| } |
| body { |
| p (class:"mystyle", "This is a test.") |
| } |
| } |
| if (!benchmark) assertCorrect html |
| } |
| |
| void testStreamingDOMBuilder_FAILS() { if (notYetImplemented()) return |
| |
| def doc = new StreamingDOMBuilder().bind{ |
| html { |
| head { |
| title (class:"mytitle", "Test") |
| } |
| body { |
| p (class:"mystyle", "This is a test.") |
| } |
| } |
| }() |
| if (!benchmark) { assertCorrect doc.documentElement } |
| } |
| |
| private def assertCorrect(html) { |
| use (DOMCategory) { |
| assert html.head.title.collect{ it.text() } == ['Test'] |
| assert html.head.title[0].text() == 'Test' |
| assert html.body.p[0].text() == 'This is a test.' |
| assert html.find { it.tagName == 'body' }.tagName == 'body' |
| assert html.getElementsByTagName('*').findAll{ it.'@class' != '' }.size() == 2 |
| } |
| // should fail outside category |
| shouldFail (MissingPropertyException) { html.head } |
| } |
| |
| static void main(args) { |
| // Relative results: |
| // Test 05 May 2004 14 Oct 2006 |
| // Parser: 1.0 1.0 |
| // Builder: 1.05 2.90 |
| // Streaming: 0.77 0.20 |
| def x = args.size() == 0 ? 1000 : Integer.parseInt(args[0]) |
| def mydomtest = new DOMTest() |
| def standard = 0 |
| mydomtest.benchmark = true |
| [{ mydomtest.testDOMParser() }, |
| { mydomtest.testDOMBuilder() }, |
| { mydomtest.testStreamingDOMBuilder_FAILS() }].eachWithIndex { testMethod, index -> |
| // Run the method once to fill any caches and to load classes |
| testMethod() |
| def start = System.currentTimeMillis() |
| def lastIndex |
| for (i in 1..x) { |
| testMethod() |
| lastIndex = i |
| } |
| def elapsed = System.currentTimeMillis() - start |
| def result = lastIndex * 1000 / elapsed |
| |
| standard = (standard == 0 ? result : standard) |
| def factor = result/standard |
| def relative = 1/factor |
| println "${index}: ${factor}x relative=${relative} (${result} trees/s)" |
| } |
| } |
| } |