-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathbuilder_elements_test.go
More file actions
194 lines (187 loc) · 11 KB
/
Copy pathbuilder_elements_test.go
File metadata and controls
194 lines (187 loc) · 11 KB
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
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
package element
import (
"regexp"
"strings"
"testing"
)
func TestHtmlElements(t *testing.T) {
tests := []struct {
name string
function func(b *Builder) Element
want string
}{
{name: "Html", function: func(b *Builder) Element { return b.Html() }, want: "<!DOCTYPE html.*></html>"},
{name: "Head", function: func(b *Builder) Element { return b.Head() }, want: "<head.*></head>"},
{name: "Title", function: func(b *Builder) Element { return b.Title() }, want: "<title.*></title>"},
{name: "Meta", function: func(b *Builder) Element { return b.Meta() }, want: "<meta.*>"},
{name: "Style", function: func(b *Builder) Element { return b.Style() }, want: "<style.*></style>"},
{name: "Link", function: func(b *Builder) Element { return b.Link() }, want: "<link.*>"},
{name: "A", function: func(b *Builder) Element { return b.A() }, want: "<a.*></a>"},
{name: "B", function: func(b *Builder) Element { return b.B() }, want: "<b.*></b>"},
{name: "I", function: func(b *Builder) Element { return b.I() }, want: "<i.*></i>"},
{name: "U", function: func(b *Builder) Element { return b.U() }, want: "<u.*></u>"},
{name: "Form", function: func(b *Builder) Element { return b.Form() }, want: "<form.*></form>"},
{name: "Input", function: func(b *Builder) Element { return b.Input() }, want: "<input.*>"},
{name: "Select", function: func(b *Builder) Element { return b.Select() }, want: "<select.*></select>"},
{name: "Option", function: func(b *Builder) Element { return b.Option() }, want: "<option.*></option>"},
{name: "Dd", function: func(b *Builder) Element { return b.Dd() }, want: "<dd.*></dd>"},
{name: "Dt", function: func(b *Builder) Element { return b.Dt() }, want: "<dt.*></dt>"},
{name: "Div", function: func(b *Builder) Element { return b.Div() }, want: "<div.*></div>"},
{name: "Body", function: func(b *Builder) Element { return b.Body() }, want: "<body.*></body>"},
{name: "P", function: func(b *Builder) Element { return b.P() }, want: "<p.*></p>"},
{name: "Span", function: func(b *Builder) Element { return b.Span() }, want: "<span.*></span>"},
{name: "Table", function: func(b *Builder) Element { return b.Table() }, want: "<table.*></table>"},
{name: "THead", function: func(b *Builder) Element { return b.THead() }, want: "<thead.*></thead>"},
{name: "TBody", function: func(b *Builder) Element { return b.TBody() }, want: "<tbody.*></tbody>"},
{name: "Tr", function: func(b *Builder) Element { return b.Tr() }, want: "<tr.*></tr>"},
{name: "Th", function: func(b *Builder) Element { return b.Th() }, want: "<th.*></th>"},
{name: "Td", function: func(b *Builder) Element { return b.Td() }, want: "<td.*></td>"},
{name: "Section", function: func(b *Builder) Element { return b.Section() }, want: "<section.*></section>"},
{name: "H1", function: func(b *Builder) Element { return b.H1() }, want: "<h1.*></h1>"},
{name: "H2", function: func(b *Builder) Element { return b.H2() }, want: "<h2.*></h2>"},
{name: "H3", function: func(b *Builder) Element { return b.H3() }, want: "<h3.*></h3>"},
{name: "H4", function: func(b *Builder) Element { return b.H4() }, want: "<h4.*></h4>"},
{name: "H5", function: func(b *Builder) Element { return b.H5() }, want: "<h5.*></h5>"},
{name: "H6", function: func(b *Builder) Element { return b.H6() }, want: "<h6.*></h6>"},
{name: "Hr", function: func(b *Builder) Element { return b.Hr() }, want: "<hr.*>"},
{name: "Ol", function: func(b *Builder) Element { return b.Ol() }, want: "<ol.*></ol>"},
{name: "Ul", function: func(b *Builder) Element { return b.Ul() }, want: "<ul.*></ul>"},
{name: "Li", function: func(b *Builder) Element { return b.Li() }, want: "<li.*></li>"},
{name: "Img", function: func(b *Builder) Element { return b.Img() }, want: "<img.*>"},
{name: "Article", function: func(b *Builder) Element { return b.Article() }, want: "<article.*></article>"},
{name: "Aside", function: func(b *Builder) Element { return b.Aside() }, want: "<aside.*></aside>"},
{name: "Audio", function: func(b *Builder) Element { return b.Audio() }, want: "<audio.*></audio>"},
{name: "BlockQuote", function: func(b *Builder) Element { return b.BlockQuote() }, want: "<blockquote.*></blockquote>"},
{name: "Button", function: func(b *Builder) Element { return b.Button() }, want: "<button.*></button>"},
{name: "Canvas", function: func(b *Builder) Element { return b.Canvas() }, want: "<canvas.*></canvas>"},
{name: "Code", function: func(b *Builder) Element { return b.Code() }, want: "<code.*></code>"},
{name: "DataList", function: func(b *Builder) Element { return b.DataList() }, want: "<datalist.*></datalist>"},
{name: "Details", function: func(b *Builder) Element { return b.Details() }, want: "<details.*></details>"},
{name: "Dialog", function: func(b *Builder) Element { return b.Dialog() }, want: "<dialog.*></dialog>"},
{name: "Em", function: func(b *Builder) Element { return b.Em() }, want: "<em.*></em>"},
{name: "Fieldset", function: func(b *Builder) Element { return b.Fieldset() }, want: "<fieldset.*></fieldset>"},
{name: "FigCaption", function: func(b *Builder) Element { return b.FigCaption() }, want: "<figcaption.*></figcaption>"},
{name: "Figure", function: func(b *Builder) Element { return b.Figure() }, want: "<figure.*></figure>"},
{name: "Footer", function: func(b *Builder) Element { return b.Footer() }, want: "<footer.*></footer>"},
{name: "Header", function: func(b *Builder) Element { return b.Header() }, want: "<header.*></header>"},
{name: "Iframe", function: func(b *Builder) Element { return b.IFrame() }, want: "<iframe.*></iframe>"},
{name: "Label", function: func(b *Builder) Element { return b.Label() }, want: "<label.*></label>"},
{name: "Legend", function: func(b *Builder) Element { return b.Legend() }, want: "<legend.*></legend>"},
{name: "Main", function: func(b *Builder) Element { return b.Main() }, want: "<main.*></main>"},
{name: "Nav", function: func(b *Builder) Element { return b.Nav() }, want: "<nav.*></nav>"},
{name: "Noscript", function: func(b *Builder) Element { return b.Noscript() }, want: "<noscript.*></noscript>"},
{name: "Object", function: func(b *Builder) Element { return b.Object() }, want: "<object.*></object>"},
{name: "Pre", function: func(b *Builder) Element { return b.Pre() }, want: "<pre.*></pre>"},
{name: "Progress", function: func(b *Builder) Element { return b.Progress() }, want: "<progress.*></progress>"},
{name: "Script", function: func(b *Builder) Element { return b.Script() }, want: "<script.*></script>"},
{name: "Strong", function: func(b *Builder) Element { return b.Strong() }, want: "<strong.*></strong>"},
{name: "Summary", function: func(b *Builder) Element { return b.Summary() }, want: "<summary.*></summary>"},
{name: "Svg", function: func(b *Builder) Element { return b.Svg() }, want: "<svg.*></svg>"},
{name: "TextArea", function: func(b *Builder) Element { return b.TextArea() }, want: "<textarea.*></textarea>"},
{name: "Time", function: func(b *Builder) Element { return b.Time() }, want: "<time.*></time>"},
{name: "Video", function: func(b *Builder) Element { return b.Video() }, want: "<video.*></video>"},
{name: "Picture", function: func(b *Builder) Element { return b.Picture() }, want: "<picture.*></picture>"},
{name: "Source", function: func(b *Builder) Element { return b.Source() }, want: "<source.*>"},
{name: "Track", function: func(b *Builder) Element { return b.Track() }, want: "<track.*>"},
{name: "Attr", function: func(b *Builder) Element { return b.Attr() }, want: "<attr.*></attr>"},
{name: "Caption", function: func(b *Builder) Element { return b.Caption() }, want: "<caption.*></caption>"},
{name: "Fieldset", function: func(b *Builder) Element { return b.Fieldset() }, want: "<fieldset.*></fieldset>"},
{name: "Legend", function: func(b *Builder) Element { return b.Legend() }, want: "<legend.*></legend>"},
{name: "Progress", function: func(b *Builder) Element { return b.Progress() }, want: "<progress.*></progress>"},
{name: "Q", function: func(b *Builder) Element { return b.Q() }, want: "<q.*></q>"},
{name: "Ruby", function: func(b *Builder) Element { return b.Ruby() }, want: "<ruby.*></ruby>"},
{name: "Rt", function: func(b *Builder) Element { return b.Rt() }, want: "<rt.*></rt>"},
{name: "Small", function: func(b *Builder) Element { return b.Small() }, want: "<small.*></small>"},
{name: "Sub", function: func(b *Builder) Element { return b.Sub() }, want: "<sub.*></sub>"},
{name: "Sup", function: func(b *Builder) Element { return b.Sup() }, want: "<sup.*></sup>"},
{name: "TFoot", function: func(b *Builder) Element { return b.TFoot() }, want: "<tfoot.*></tfoot>"},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
b := NewBuilder()
tt.function(b).R()
got := b.String()
if !regexp.MustCompile(tt.want).MatchString(got) {
t.Errorf("%s() = %v, want %v", tt.name, got, tt.want)
}
})
}
}
func TestHtmlElementsWithAttributes(t *testing.T) {
tests := []struct {
name string
function func(b *Builder) Element
attributes []string
want string
}{
{name: "Div with class", function: func(b *Builder) Element { return b.Div("class", "container") },
attributes: []string{"class", "container"}, want: `<div.*class="container".*></div>`},
{name: "A with href", function: func(b *Builder) Element { return b.A("href", "https://example.com") },
attributes: []string{"href", "https://example.com"}, want: `<a.*href="https://example.com".*></a>`},
{name: "Img with src", function: func(b *Builder) Element { return b.Img("src", "image.jpg", "alt", "An image") },
attributes: []string{"src", "image.jpg", "alt", "An image"}, want: `<img.*src="image.jpg".*>`},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
b := NewBuilder()
tt.function(b).R()
got := b.String()
if !regexp.MustCompile(tt.want).MatchString(got) {
t.Errorf("%s(%s) = %v, want %v", tt.name, strings.Join(tt.attributes, ", "), got, tt.want)
}
})
}
}
func TestHtmlElementsWithContent(t *testing.T) {
tests := []struct {
name string
setup func(b *Builder)
want string
}{
{
name: "P with text",
setup: func(b *Builder) {
b.P().R(b.Text("Hello"))
},
want: "<p.*>Hello</p>",
},
{
name: "Div with nested elements",
setup: func(b *Builder) {
b.Div("class", "container").R(
b.H1().R(b.Text("Title")),
b.P().R(b.Text("Paragraph")),
)
},
want: `<div.*class="container".*><h1.*>Title</h1><p.*>Paragraph</p></div>`,
},
{
name: "Table structure",
setup: func(b *Builder) {
b.Table().R(
b.THead().R(
b.Tr().R(
b.Th().R(b.Text("Header")),
),
),
b.TBody().R(
b.Tr().R(
b.Td().R(b.Text("Cell")),
),
),
)
},
want: "<table.*><thead.*><tr.*><th.*>Header</th></tr></thead><tbody.*><tr.*><td.*>Cell</td></tr></tbody></table>",
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
b := NewBuilder()
tt.setup(b)
got := b.String()
if !regexp.MustCompile(tt.want).MatchString(got) {
t.Errorf("%s = %v, want %v", tt.name, got, tt.want)
}
})
}
}