<NME> runtests.jl
<BEF> using Test
import Documenter
include("TestUtilities.jl"); using Main.TestUtilities

@testset "Documenter" begin
    # Build the example docs
    @info "Building example/make.jl"
    include("examples/make.jl")

    # Test missing docs
    @info "Building missingdocs/make.jl"
    include("missingdocs/make.jl")

    # Error reporting.
    @info "Building errors/make.jl"
    @quietly include("errors/make.jl")

    # Unit tests for module internals.
    include("except.jl")
    include("utilities.jl")
    include("remotes.jl")

    # DocChecks tests
    include("docchecks.jl")

    # NavNode tests.
    include("navnode.jl")

    # DocSystem unit tests.
    include("docsystem.jl")

    # CrossReferences
    include("crossreferences.jl")

    # DocTest unit tests.
    @info "Running tests in doctests/"
    include("doctests/docmeta.jl")
    include("doctests/doctestapi.jl")
    include("doctests/doctests.jl")
    include("doctests/fix/tests.jl")

    # DOM Tests.
    include("dom.jl")

    # MDFlatten tests.
    include("mdflatten.jl")

    # Main build pipeline (Builder and Expanders modules)
    include("pipeline.jl")

    # HTMLWriter
    include("htmlwriter.jl")

    # LaTeXWriter
    include("latexwriter.jl")

    # Deployment configurations
    include("deployconfig.jl")
    include("deploydocs.jl")

    # Mock package docs.
    include("examples/tests.jl")

    # A simple build outside of a Git repository
    @info "Building nongit/tests.jl"
    @quietly include("nongit/tests.jl")

    # A simple build evaluating code outside build directory
    @info "Building workdir/tests.jl"
    @quietly include("workdir/tests.jl")

    # Passing a writer positionally (https://github.com/JuliaDocs/Documenter.jl/issues/1046)
    @test_throws ArgumentError makedocs(sitename="", HTML())

    # Running doctest() on our own manual
    @info "doctest() Documenter's manual"
    @quietly include("manual.jl")
end
end


# Integration tests for module api.

# Error reporting.

<MSG> Add a simple HTML DSL

All nodes are the same type (`Node`) and no symbolic `tag` type
parameter. Each node's children are all also `Node`s and attributes are
a `Vector` rather than a `Dict` with concrete type parameters (`Symbol`
and `String`).

Also has a bit of syntax sugar:

    div[".class#id"](
        ul(map(li, split("foo bar baz"))),
        img[:src => "path/to/file.jpg"]
    )

No tags are exported at all. They can just be defined when needed using

    @tags div ul li

<DFF> @@ -217,6 +217,83 @@ let b   = DocSystem.binding(DocSystem, :getdocs),
 end
 
 
+## DOM Tests.
+
+module DOMTests
+
+using Base.Test
+import Documenter.Utilities.DOM: DOM, @tags
+
+@tags div ul li p
+
+for tag in (:div, :ul, :li, :p)
+    TAG = getfield(current_module(), tag)
+    @test isdefined(tag)
+    @test isa(TAG, DOM.Tag)
+    @test TAG.name === tag
+end
+
+@test div().name === :div
+@test div().text == ""
+@test isempty(div().nodes)
+@test isempty(div().attributes)
+
+@test div("...").name === :div
+@test div("...").text == ""
+@test length(div("...").nodes) === 1
+@test div("...").nodes[1].text == "..."
+@test div("...").nodes[1].name === Symbol("")
+@test isempty(div("...").attributes)
+
+@test div[".class"]("...").name === :div
+@test div[".class"]("...").text == ""
+@test length(div[".class"]("...").nodes) === 1
+@test div[".class"]("...").nodes[1].text == "..."
+@test div[".class"]("...").nodes[1].name === Symbol("")
+@test length(div[".class"]("...").attributes) === 1
+@test div[".class"]("...").attributes[1] == (:class => "class")
+
+let d = div(ul(map(li, [string(n) for n = 1:10])))
+    @test d.name === :div
+    @test d.text == ""
+    @test isempty(d.attributes)
+    @test length(d.nodes) === 1
+    let u = d.nodes[1]
+        @test u.name === :ul
+        @test u.text == ""
+        @test isempty(u.attributes)
+        @test length(u.nodes) === 10
+        for n = 1:10
+            let v = u.nodes[n]
+                @test v.name === :li
+                @test v.text == ""
+                @test isempty(v.attributes)
+                @test length(v.nodes) === 1
+                @test v.nodes[1].name === Symbol("")
+                @test v.nodes[1].text == string(n)
+                @test !isdefined(v.nodes[1], :attributes)
+                @test !isdefined(v.nodes[1], :nodes)
+            end
+        end
+    end
+end
+
+function locally_defined()
+    @tags button
+    @test try
+        x = button
+        true
+    catch err
+        false
+    end
+end
+@test !isdefined(current_module(), :button)
+locally_defined()
+@test !isdefined(current_module(), :button)
+
+end
+
+
 # Integration tests for module api.
 
 # Error reporting.

Add a simple HTML DSL