v / vlib / net / html / dom_test.v
96 lines · 85 sloc · 3.32 KB · 44efc9caeec07ee6fce44fa5b05aadac0308973c
Raw
1module html
2
3import strings
4
5fn generate_temp_html() string {
6 mut temp_html := strings.new_builder(200)
7 temp_html.write_string('<!doctype html><html><head><title>Giant String</title></head><body>')
8 for counter := 0; counter < 4; counter++ {
9 temp_html.write_string("<div id='name_${counter}' ")
10 temp_html.write_string("class='several-${counter}'>Look at ${counter}</div>")
11 }
12 temp_html.write_string('</body></html>')
13 return temp_html.str()
14}
15
16fn test_search_by_tag_type() {
17 dom := parse(generate_temp_html())
18 assert dom.get_tags(name: 'div').len == 4
19 assert dom.get_tags(name: 'head').len == 1
20 assert dom.get_tags(name: 'body').len == 1
21}
22
23fn test_search_by_attribute_value() {
24 mut dom := parse(generate_temp_html())
25 // println(temp_html)
26 print('Amount ')
27 println(dom.get_tags_by_attribute_value('id', 'name_0'))
28 assert dom.get_tags_by_attribute_value('id', 'name_0').len == 1
29}
30
31fn test_access_parent() {
32 mut dom := parse(generate_temp_html())
33 div_tags := dom.get_tags(name: 'div')
34 parent := div_tags[0].parent
35 assert unsafe { parent != 0 }
36 for div_tag in div_tags {
37 assert div_tag.parent == parent
38 }
39}
40
41fn test_search_by_attributes() {
42 dom := parse(generate_temp_html())
43 assert dom.get_tags_by_attribute('id').len == 4
44}
45
46fn test_tags_used() {
47 dom := parse(generate_temp_html())
48 assert dom.get_tags().len == 9
49}
50
51fn test_access_tag_fields() {
52 dom := parse(generate_temp_html())
53 id_tags := dom.get_tags_by_attribute('id')
54 assert id_tags[0].name == 'div'
55 assert id_tags[1].attributes['class'] == 'several-1'
56}
57
58fn generate_temp_html_with_classes() string {
59 mut temp_html := strings.new_builder(400)
60 temp_html.write_string('<!doctype html><html><head><title>Giant String</title></head><body>')
61 temp_html.write_string("<div class='single'>Single</div>")
62 for counter := 0; counter < 4; counter++ {
63 temp_html.write_string("<div id='name_${counter}' ")
64 temp_html.write_string("class='common'>Common No. ${counter}</div>")
65 }
66 temp_html.write_string("<div class='complex-0 complex-1 complex-2'>Complex</div>")
67 temp_html.write_string("<div class='complex-0 complex-2'>Partial</div>")
68 temp_html.write_string('</body></html>')
69 return temp_html.str()
70}
71
72fn test_search_by_class() {
73 dom := parse(generate_temp_html_with_classes())
74 single_class_tags := dom.get_tags_by_class_name('single')
75 common_class_tags := dom.get_tags_by_class_name('common')
76 complex_class_tags := dom.get_tags_by_class_name('complex-0', 'complex-1', 'complex-2')
77 partial_class_tags := dom.get_tags_by_class_name('complex-0', 'complex-2')
78 shuffled_class_tags := dom.get_tags_by_class_name('complex-2', 'complex-0', 'complex-1')
79 assert single_class_tags.len == 1
80 assert common_class_tags.len == 4
81 assert complex_class_tags.len == 1
82 assert complex_class_tags[0].attributes['class'] == 'complex-0 complex-1 complex-2'
83 assert partial_class_tags.len == 2
84 assert shuffled_class_tags.len == 1
85 assert shuffled_class_tags[0].attributes['class'] == 'complex-0 complex-1 complex-2'
86}
87
88fn test_unmatched_close_tag_is_ignored() {
89 content := '<!doctype html><html><body><div><a href="#">x</a></a></div><article class="news-post">hello</article></body></html>'
90 mut dom := parse(content)
91 by_attr := dom.get_tags_by_attribute_value('class', 'news-post')
92 by_class := dom.get_tags_by_class_name('news-post')
93 assert by_attr.len == 1
94 assert by_class.len == 1
95 assert by_class[0].name == 'article'
96}
97